I believe cibcAccount.js deals well with this standard format and transactions like these:
(as in it takes all the text into description properly)

Jul 5 E-TRANSFER 100757429734
PAYFARE INC 26
10.00 -94.59
Jul 13 E-TRANSFER 100771014171
PAYFARE INC 17
15.00 -79.59
Jul 16 VISA DEBIT RETAIL PURCHASE
UBER TRIP S2LTC 819500386661
7.84 -87.43
Jul 18 VISA DEBIT RETAIL PURCHASE
GOOGLE *Minder 819934008719
5.49 -92.92
Jul 27 E-TRANSFER 100796279161
Shivdev Kahlon
140.00 47.08
Jul 30 VISA DEBIT RETAIL PURCHASE
UBER TRIP 7F25D 820822226253
21.11 25.97
VISA DEBIT RETAIL PURCHASE
UBER TRIP HIK4K 821008379707
6.50 19.47

but unfortunately there is also a version of data that looks like this:
May3 E-TRANSFER104981475090 1,015.00 15,896.53
Richard
4506*******##g33
May6 E-TRANSFER104983544485 2,000.00 13,896.53
Mark
4506*********833
May 10 E-TRANSFER104989890992 725.00 13,171.53
Richard
4506******##*833
DEPOSIT 3,103.41 16,274.94
DEPOSIT 3,485.41 19,760.35
May 13 E-TRANSFER1049906451 10 2,000.00 17,760.35
Mark
4506*********833
PURCHASE000072003492 411.96 17,348.39
FBM CANADA GSD
4506*********833

for example, description should be like
E-TRANSFER104890965607 Mark A506*********
and amount (debit) 1000 , balance 6,398.57  and so on

here is the file, please fix this one thing and make it deal also with the second format:
function processData() {
  const input = document.getElementById('inputText').value.trim();
  const yearInput = document.getElementById('yearInput').value.trim();
  const lines = input.split('\n').map(line => line.trim()).filter(Boolean);
  const outputDiv = document.getElementById('output');
  outputDiv.innerHTML = '';

  const headers = ['Date', 'Description', 'Debit', 'Credit', 'Balance'];
  const table = document.createElement('table');

  // --- Copy Buttons Row ---
  const copyRow = document.createElement('tr');
  headers.forEach((_, index) => {
    const th = document.createElement('th');
    const div = document.createElement('div');
    div.className = 'copy-col';
    const btn = document.createElement('button');
    btn.textContent = 'Copy';
    btn.className = 'copy-btn';
    btn.onclick = () => window.bankUtils.copyColumn(index);
    div.appendChild(btn);
    th.appendChild(div);
    copyRow.appendChild(th);
  });
  table.appendChild(copyRow);

  // --- Header Row ---
  const headerRow = document.createElement('tr');
  headers.forEach(header => {
    const th = document.createElement('th');
    th.textContent = header;
    headerRow.appendChild(th);
  });
  table.appendChild(headerRow);

  let currentDate = '';
  const transactions = [];

  let tempLines = [];
  const validMonths = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'];

  lines.forEach((line) => {
    const dateMatch = line.match(/^([A-Za-z]{3})\s+\d{1,2}/);
    const amountMatch = line.match(/-?\d{1,3}(?:,\d{3})*\.\d{2}/g);
    const isValidDateLine = dateMatch && validMonths.includes(dateMatch[1].toLowerCase());

    if (isValidDateLine) {
      if (tempLines.length > 0) {
        transactions.push({ date: currentDate, lines: [...tempLines] });
        tempLines = [];
      }
      currentDate = dateMatch[0];
      if (yearInput) currentDate += ` ${yearInput}`;
      const restOfLine = line.replace(dateMatch[0], '').trim();
      if (restOfLine) tempLines.push(restOfLine);
    } else {
      tempLines.push(line);
    }

    if (amountMatch && amountMatch.length === 2) {
      transactions.push({ date: currentDate, lines: [...tempLines] });
      tempLines = [];
    }
  });
  if (tempLines.length > 0) {
    transactions.push({ date: currentDate, lines: [...tempLines] });
  }

  const rows = [];
  let previousBalance = null;

  transactions.forEach(entry => {
    const { date, lines } = entry;
    const fullText = lines.join(' ').trim();
    const allAmounts = [...fullText.matchAll(/-?\d{1,3}(?:,\d{3})*\.\d{2}/g)].map(m => parseFloat(m[0].replace(/,/g, '')));
    if (allAmounts.length < 1) return;

    const amount = allAmounts[0];
    const balance = allAmounts.length > 1 ? allAmounts[1] : null;
    const descText = fullText.replace(/-?\d{1,3}(?:,\d{3})*\.\d{2}/g, '').trim();

    let debit = '', credit = '';

    if (balance !== null && previousBalance !== null) {
      const delta = balance - previousBalance;
      if (Math.abs(delta - amount) < 0.01) {
        credit = amount.toFixed(2);
      } else if (Math.abs(delta + amount) < 0.01) {
        debit = amount.toFixed(2);
      } else {
        // Fallback to direction
        if (delta < 0) debit = amount.toFixed(2);
        else credit = amount.toFixed(2);
      }
    } else if (window.bankUtils?.keywords) {
      const isCredit = window.bankUtils.keywords.credit.some(kw =>
        descText.toLowerCase().includes(kw.toLowerCase())
      );
      if (isCredit) credit = amount.toFixed(2);
      else debit = amount.toFixed(2);
    } else {
      debit = amount.toFixed(2); // Ultimate fallback
    }

    previousBalance = balance !== null ? balance : previousBalance;

    const row = [date, descText, debit, credit, balance !== null ? balance.toFixed(2) : ''];
    rows.push(row);

    const tr = document.createElement('tr');
    row.forEach(cell => {
      const td = document.createElement('td');
      td.textContent = cell;
      tr.appendChild(td);
    });
    table.appendChild(tr);
  });

  outputDiv.appendChild(table);
  table.dataset.rows = JSON.stringify(rows);
}

window.processData = processData;

it needs to deal with all types of data, 1 line, 2 line, 3 line... so on and collect transactions properly