const proofSessions = new Map(); let proofMcpId = 1; async function proofProbe(sessionId, send) { const servers = proofSessions.get(sessionId); const bridge = servers.find(s => s.name === 't3-code'); const env = Object.fromEntries((bridge?.env ?? []).map(e => [e.name,e.value])); const server = servers.find(s => s.type === 'http') ?? {url: process.env.T3_ACP_MCP_ENDPOINT ?? env.T3_ACP_MCP_ENDPOINT, headers:[{name:'Authorization',value:process.env.T3_ACP_MCP_AUTHORIZATION ?? env.T3_ACP_MCP_AUTHORIZATION}]}; if (!server.url) throw new Error('No HTTP MCP server provided to proof agent'); const headers = Object.fromEntries(server.headers.map(h => [h.name, h.value])); Object.assign(headers, {'Content-Type':'application/json', Accept:'application/json, text/event-stream'}); const rpc = async (method, params) => { const response = await fetch(server.url, {method:'POST', headers, body:JSON.stringify({jsonrpc:'2.0', id:proofMcpId++, method, params})}); if (response.headers.get('mcp-session-id')) headers['mcp-session-id'] = response.headers.get('mcp-session-id'); const text = await response.text(); const payload = text.startsWith('event:') || text.startsWith('data:') ? JSON.parse(text.split('\n').find(l=>l.startsWith('data:')).slice(5)) : JSON.parse(text); if(payload.error) throw new Error(JSON.stringify(payload.error)); return payload.result; }; await rpc('initialize', {protocolVersion:'2025-06-18', capabilities:{}, clientInfo:{name:'selector-proof-agent',version:'1'}}); headers['mcp-protocol-version']='2025-06-18'; const call = (name,args) => rpc('tools/call',{name,arguments:args}); await call('preview_status',{}); const opened = await call('preview_open',{url:PROOF_URL,open:false}); const getData = result => result.structuredContent ?? JSON.parse(result.content.find(c=>c.type==='text').text); const openedData = getData(opened); const tabId = openedData.tabId; if (!tabId) throw new Error('No preview tab: '+JSON.stringify(opened)); await call('preview_resize',{tabId,mode:'freeform',width:2200,height:1000}); await call('preview_wait_for',{tabId,selector:"button[aria-label='Toggle main sidebar']",timeoutMs:30000}); const count = await call('preview_evaluate',{tabId,expression:`document.querySelectorAll("button[aria-label='Toggle main sidebar']").length`}); const selector = "button[aria-label='Toggle main sidebar']"; const toolCallId = 'selector-proof-'+sessionId; send({method:'session/update',params:{sessionId,update:{sessionUpdate:'tool_call',toolCallId,title:'preview_act — click ambiguous CSS selector',kind:'other',status:'in_progress',rawInput:{action:'click',selector}}}}); const result = await call('preview_act',{tabId,action:'click',selector,timeoutMs:3000}); const responseText = result.content.filter(c=>c.type==='text').map(c=>c.text).join('\n'); send({method:'session/update',params:{sessionId,update:{sessionUpdate:'tool_call_update',toolCallId,status:'failed',rawOutput:result,content:[{type:'content',content:{type:'text',text:responseText}}]}}}); const report = '## Actual preview_act response\n\nSelector: `'+selector+'`\n\n'+responseText+'\n\nProbe complete.'; send({method:'session/update',params:{sessionId,update:{sessionUpdate:'agent_message_chunk',content:{type:'text',text:report}}}}); await call('t3_preview_close',{tabId}); return {stopReason:'end_turn'}; }