diff --git a/extension/package-lock.json b/extension/package-lock.json index 89f305a..0b126fd 100644 --- a/extension/package-lock.json +++ b/extension/package-lock.json @@ -1,12 +1,12 @@ { "name": "gravity-bridge", - "version": "0.5.34", + "version": "0.5.57", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gravity-bridge", - "version": "0.5.34", + "version": "0.5.57", "dependencies": { "cheerio": "^1.2.0", "ws": "^8.19.0" diff --git a/extension/package.json b/extension/package.json index 580a676..3f8914b 100644 --- a/extension/package.json +++ b/extension/package.json @@ -2,7 +2,7 @@ "name": "gravity-bridge", "displayName": "Gravity Bridge", "description": "Discord-based unified approval system for Antigravity AI interactions.", - "version": "0.5.56", + "version": "0.5.57", "publisher": "variet", "engines": { "vscode": "^1.100.0" diff --git a/extension/src/observer-script.ts b/extension/src/observer-script.ts index cc545e3..deeab86 100644 --- a/extension/src/observer-script.ts +++ b/extension/src/observer-script.ts @@ -504,6 +504,48 @@ export function generateApprovalObserverScript(_port: number): string { childrenMd += convertNodeToMarkdown(node.childNodes[i]); } + // TABLE: Discord doesn't support markdown tables, so convert to fixed-width code block + if (tag === 'table') { + var rows = node.querySelectorAll('tr'); + if (!rows || rows.length === 0) return childrenMd; + var grid = []; + var colWidths = []; + for (var ri = 0; ri < rows.length; ri++) { + var cells = rows[ri].querySelectorAll('th, td'); + var row = []; + for (var ci = 0; ci < cells.length; ci++) { + var cellText = (cells[ci].textContent || '').trim(); + row.push(cellText); + if (!colWidths[ci] || cellText.length > colWidths[ci]) colWidths[ci] = cellText.length; + } + grid.push(row); + } + // Build fixed-width text + var tbl = ''; + for (var ri2 = 0; ri2 < grid.length; ri2++) { + var line = ''; + for (var ci2 = 0; ci2 < colWidths.length; ci2++) { + var cell = grid[ri2][ci2] || ''; + var pad = colWidths[ci2] - cell.length; + var padding = ''; + for (var pi = 0; pi < pad; pi++) padding += ' '; + line += (ci2 > 0 ? ' | ' : '') + cell + padding; + } + tbl += line + '\\n'; + // Add separator after header row (first row) + if (ri2 === 0) { + var sep = ''; + for (var si2 = 0; si2 < colWidths.length; si2++) { + var dashes = ''; + for (var di = 0; di < colWidths[si2]; di++) dashes += '-'; + sep += (si2 > 0 ? '-+-' : '') + dashes; + } + tbl += sep + '\\n'; + } + } + return '\\n' + String.fromCharCode(96,96,96) + '\\n' + tbl + String.fromCharCode(96,96,96) + '\\n'; + } + switch (tag) { case 'h1': return '\\n# ' + childrenMd.trim() + '\\n'; case 'h2': return '\\n## ' + childrenMd.trim() + '\\n'; @@ -536,6 +578,13 @@ export function generateApprovalObserverScript(_port: number): string { case 'ul': case 'ol': return '\\n' + childrenMd + '\\n'; case 'blockquote': return '\\n> ' + childrenMd.trim().split('\\n').join('\\n> ') + '\\n'; + // Table sub-elements: already handled by the table case above via querySelectorAll + case 'thead': + case 'tbody': + case 'tfoot': + case 'tr': + case 'th': + case 'td': return ''; default: return childrenMd; } }