/** * Approval Observer Script — injected into AG's renderer process. * * This is a self-contained JavaScript string template that runs in the * browser context (no Node.js APIs). It scans the DOM for approval buttons, * reports them to the HTTP bridge, and handles trigger clicks. * * Extracted from extension.ts for maintainability. */ export function generateApprovalObserverScript(_port: number): string { // Port is hardcoded as fallback, but renderer also reads ag-bridge-ports.json for multi-bridge return ` // ── Gravity Bridge v3: Approval Observer (deep DOM traversal — iframes, webviews, shadow DOMs) ── (function(){ 'use strict'; var BASE='',_obs=false,_sent={},_ready=false; var _scanScheduled=false,_lastScanTs=0; var THROTTLE_MS=100; var CLEANUP_MS=300000; var _domDumped=false; function log(m){console.log('[GB Observer] '+m);} log('v3 Script loaded — deep DOM traversal enabled'); // ── Deep DOM Traversal: find buttons across ALL boundaries ── // Searches: main document → iframes (contentDocument) → webview elements → shadow DOMs function deepFindButtons(patterns){ var results=[]; // 1. Prioritize Agent panel var panel=findPanel(); if(panel){ collectButtons(panel,results,patterns,'panel'); if(results.length>0) return results; } // 2. Prioritize VS Code Toasts & Dialogs var toasts=document.querySelectorAll('.notifications-toasts, .monaco-dialog-box'); for(var t=0;t0) return results; // 3. Main document fallback collectButtons(document,results,patterns,'main'); // 4. Iframe traversal (try contentDocument — works if same-origin or webSecurity off) var iframes=document.querySelectorAll('iframe'); for(var i=0;i tag — has executeJavaScript) var webviews=document.querySelectorAll('webview'); for(var w=0;wshadow'); } }catch(e){} } // ── Deep DOM Inspector (recursive, POSTs results to bridge) ── function runDeepInspect(){ var result={timestamp:new Date().toISOString(),windowURL:window.location.href,windowOrigin:window.location.origin,windowProtocol:window.location.protocol,framesCount:window.frames.length,nodes:[]}; log('DEEP-INSPECT: starting recursive DOM analysis...'); function inspectDoc(doc,depth,label){ var node={label:label,depth:depth,accessible:true,url:'',buttons:[],roleBtns:[],iframes:[],webviews:[],shadowDOMs:0,totalElements:0}; if(!doc){node.accessible=false;node.error='null document';result.nodes.push(node);return;} try{node.url=(doc.URL||doc.documentURI||'unknown').substring(0,200);}catch(e){node.url='blocked';} try{node.title=(doc.title||'').substring(0,100);}catch(e){} try{node.readyState=doc.readyState;}catch(e){} // CSP try{ var csp=doc.querySelectorAll('meta[http-equiv="Content-Security-Policy"]'); if(csp.length>0){node.csp=[];for(var c=0;c