@clueprint/mcp 1.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,163 @@
1
+ import * as p from '@clack/prompts';
2
+ import pc from 'picocolors';
3
+ import { existsSync, readFileSync } from 'fs';
4
+ import { join, dirname } from 'path';
5
+ import { homedir } from 'os';
6
+ import { fileURLToPath } from 'url';
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ export async function status() {
9
+ p.intro(pc.bgCyan(pc.black(' clueprint status ')));
10
+ const checks = [];
11
+ const projectRoot = findProjectRoot();
12
+ // Check 1: Project found
13
+ if (!projectRoot) {
14
+ p.log.error('Clueprint project not found');
15
+ p.log.message(pc.dim('Run this command from within the clueprint directory'));
16
+ p.outro(pc.red('Status check failed'));
17
+ return;
18
+ }
19
+ checks.push({
20
+ name: 'Project',
21
+ status: 'ok',
22
+ message: `Found at ${projectRoot}`,
23
+ });
24
+ // Check 2: Dependencies installed
25
+ const nodeModulesExists = existsSync(join(projectRoot, 'node_modules'));
26
+ const extensionNodeModules = existsSync(join(projectRoot, 'packages/chrome-extension/node_modules'));
27
+ if (nodeModulesExists && extensionNodeModules) {
28
+ checks.push({
29
+ name: 'Dependencies',
30
+ status: 'ok',
31
+ message: 'Installed',
32
+ });
33
+ }
34
+ else {
35
+ checks.push({
36
+ name: 'Dependencies',
37
+ status: 'error',
38
+ message: 'Not installed',
39
+ hint: 'Run: pnpm install',
40
+ });
41
+ }
42
+ // Check 3: Extension built
43
+ const extensionDist = join(projectRoot, 'packages/chrome-extension/dist');
44
+ const manifestExists = existsSync(join(extensionDist, 'manifest.json'));
45
+ if (existsSync(extensionDist) && manifestExists) {
46
+ checks.push({
47
+ name: 'Chrome Extension',
48
+ status: 'ok',
49
+ message: 'Built',
50
+ });
51
+ }
52
+ else {
53
+ checks.push({
54
+ name: 'Chrome Extension',
55
+ status: 'error',
56
+ message: 'Not built',
57
+ hint: 'Run: pnpm run build:extension',
58
+ });
59
+ }
60
+ // Check 4: MCP server built
61
+ const mcpDist = join(projectRoot, 'packages/mcp-server/dist');
62
+ const mcpIndexExists = existsSync(join(mcpDist, 'index.js'));
63
+ if (existsSync(mcpDist) && mcpIndexExists) {
64
+ checks.push({
65
+ name: 'MCP Server',
66
+ status: 'ok',
67
+ message: 'Built',
68
+ });
69
+ }
70
+ else {
71
+ checks.push({
72
+ name: 'MCP Server',
73
+ status: 'error',
74
+ message: 'Not built',
75
+ hint: 'Run: pnpm run build:server',
76
+ });
77
+ }
78
+ // Check 5: Claude Code MCP configuration
79
+ // User-scope config lives in ~/.claude.json (NOT ~/.claude/mcp.json)
80
+ const claudeConfigPath = join(homedir(), '.claude.json');
81
+ let mcpConfigured = false;
82
+ if (existsSync(claudeConfigPath)) {
83
+ try {
84
+ const config = JSON.parse(readFileSync(claudeConfigPath, 'utf-8'));
85
+ const mcpServers = config.mcpServers || {};
86
+ if (mcpServers['clueprint']) {
87
+ mcpConfigured = true;
88
+ checks.push({
89
+ name: 'Claude Code MCP',
90
+ status: 'ok',
91
+ message: `Configured (user scope)`,
92
+ });
93
+ }
94
+ }
95
+ catch {
96
+ // Parse error, check below
97
+ }
98
+ }
99
+ if (!mcpConfigured) {
100
+ checks.push({
101
+ name: 'Claude Code MCP',
102
+ status: 'warning',
103
+ message: 'Not configured',
104
+ hint: 'Run: npx @clueprint/mcp setup',
105
+ });
106
+ }
107
+ // Print checks
108
+ console.log();
109
+ for (const check of checks) {
110
+ const icon = check.status === 'ok'
111
+ ? pc.green('')
112
+ : check.status === 'warning'
113
+ ? pc.yellow('')
114
+ : pc.red('');
115
+ const name = pc.bold(check.name.padEnd(18));
116
+ const message = check.status === 'ok'
117
+ ? pc.green(check.message)
118
+ : check.status === 'warning'
119
+ ? pc.yellow(check.message)
120
+ : pc.red(check.message);
121
+ console.log(` ${icon} ${name} ${message}`);
122
+ if (check.hint) {
123
+ console.log(` ${pc.dim(check.hint)}`);
124
+ }
125
+ }
126
+ console.log();
127
+ // Summary
128
+ const errors = checks.filter(c => c.status === 'error').length;
129
+ const warnings = checks.filter(c => c.status === 'warning').length;
130
+ if (errors === 0 && warnings === 0) {
131
+ p.outro(pc.green('All systems go!'));
132
+ }
133
+ else if (errors > 0) {
134
+ p.outro(pc.red(`${errors} issue${errors > 1 ? 's' : ''} found. Run: clueprint setup`));
135
+ }
136
+ else {
137
+ p.outro(pc.yellow(`${warnings} warning${warnings > 1 ? 's' : ''}`));
138
+ }
139
+ }
140
+ function findProjectRoot() {
141
+ let dir = process.cwd();
142
+ while (dir !== '/') {
143
+ const packageJson = join(dir, 'package.json');
144
+ if (existsSync(packageJson)) {
145
+ try {
146
+ const pkg = JSON.parse(readFileSync(packageJson, 'utf-8'));
147
+ if (pkg.name === 'clueprint' || existsSync(join(dir, 'packages/chrome-extension'))) {
148
+ return dir;
149
+ }
150
+ }
151
+ catch {
152
+ // Continue searching
153
+ }
154
+ }
155
+ dir = dirname(dir);
156
+ }
157
+ const globalRoot = join(__dirname, '../../../../..');
158
+ if (existsSync(join(globalRoot, 'packages/chrome-extension'))) {
159
+ return globalRoot;
160
+ }
161
+ return null;
162
+ }
163
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
package/cli/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/cli/index.js ADDED
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from 'child_process';
3
+ import { existsSync } from 'fs';
4
+ import { join, dirname } from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ // MCP server mode: no CLI args + non-TTY stdin means Claude Code is spawning us.
8
+ // Run the MCP server directly with stdio passthrough. No output, no banners.
9
+ if (process.argv.length === 2 && !process.stdin.isTTY) {
10
+ const serverPath = findServerPath();
11
+ if (!serverPath) {
12
+ process.stderr.write('[clueprint] MCP server not found\n');
13
+ process.exit(1);
14
+ }
15
+ const server = spawn('node', [serverPath], {
16
+ stdio: 'inherit',
17
+ env: process.env,
18
+ });
19
+ server.on('error', (err) => {
20
+ process.stderr.write(`[clueprint] Failed to start: ${err.message}\n`);
21
+ process.exit(1);
22
+ });
23
+ server.on('close', (code) => process.exit(code ?? 0));
24
+ }
25
+ else {
26
+ // CLI mode: import commander and handle commands
27
+ const { Command } = await import('commander');
28
+ const gradient = (await import('gradient-string')).default;
29
+ const pc = (await import('picocolors')).default;
30
+ const { setup } = await import('./commands/setup.js');
31
+ const { status } = await import('./commands/status.js');
32
+ const BANNER = `
33
+ _ _ _
34
+ ___ | | _ _ ___ _ __ (_) _ __ | |_
35
+ / __|| | | | | | / _ \\ | '_ \\ | || '_ \\ | __|
36
+ | (__ | | | |_| | | __/ | |_) || || | | || |_
37
+ \\___||_| \\__,_| \\___| | .__/ |_||_| |_| \\__|
38
+ |_|
39
+ `;
40
+ function printBanner() {
41
+ const clueprintGradient = gradient(['#7c3aed', '#06b6d4']);
42
+ console.log(clueprintGradient.multiline(BANNER));
43
+ console.log(pc.dim(' Browser visibility for AI assistants\n'));
44
+ }
45
+ const program = new Command();
46
+ program
47
+ .name('clueprint')
48
+ .description('Browser visibility for AI assistants')
49
+ .version('0.1.0');
50
+ program
51
+ .command('setup')
52
+ .description('Set up Clueprint (build extension, configure MCP)')
53
+ .option('--skip-build', 'Skip building the extension')
54
+ .option('--skip-mcp', 'Skip MCP configuration')
55
+ .action(async (options) => {
56
+ await setup(options);
57
+ });
58
+ program
59
+ .command('status')
60
+ .description('Check Clueprint installation status')
61
+ .action(async () => {
62
+ await status();
63
+ });
64
+ program
65
+ .command('start')
66
+ .description('Start the MCP server')
67
+ .option('-p, --port <port>', 'Port to run the server on', '7007')
68
+ .action(async (options) => {
69
+ const { startServer } = await import('./commands/start.js');
70
+ await startServer(options);
71
+ });
72
+ // Default command (no args) shows help with banner
73
+ if (process.argv.length === 2) {
74
+ printBanner();
75
+ program.help();
76
+ }
77
+ program.parse();
78
+ }
79
+ function findServerPath() {
80
+ // 1. Published package: cli/index.js → ../server/index.cjs
81
+ const publishedPath = join(__dirname, '..', 'server', 'index.cjs');
82
+ if (existsSync(publishedPath)) {
83
+ return publishedPath;
84
+ }
85
+ // 2. Local dev: packages/cli/dist/index.js → ../../mcp-server/dist/index.js
86
+ const devPath = join(__dirname, '..', '..', 'mcp-server', 'dist', 'index.js');
87
+ if (existsSync(devPath)) {
88
+ return devPath;
89
+ }
90
+ // 3. Installed at ~/.clueprint/server/index.cjs
91
+ const homePath = join(process.env.HOME || '', '.clueprint', 'server', 'index.cjs');
92
+ if (existsSync(homePath)) {
93
+ return homePath;
94
+ }
95
+ return null;
96
+ }
97
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var b={inspectShortcut:"Alt+Click",freeSelectShortcut:"Ctrl+Shift+Drag",captureConsole:!0,captureNetwork:!0,capturePerformance:!0,maxConsoleEntries:50,maxNetworkEntries:50,cssDetailLevel:1,screenshotQuality:.7,screenshotMaxWidth:800,serverPort:7007};var n={isActive:!1,isRecording:!1,isBuffering:!1,currentSelection:null,currentRecording:null,snapshots:new Map,consoleBuffer:[],networkBuffer:[],mcpConnected:!1},l=null,c=[],g=[],h=null,D=3e4,p=null;var C=3e3,R="ws-keepalive",E={...b};function A(){console.log("[AI DevTools] Background service worker started"),F(),chrome.storage.local.get("isBuffering").then(({isBuffering:e})=>{e&&N()}),S(),chrome.runtime.onMessage.addListener(G),chrome.commands.onCommand.addListener(L),chrome.tabs.onUpdated.addListener(M),chrome.action.onClicked.addListener(B),chrome.alarms.create(R,{periodInMinutes:.5}),chrome.alarms.onAlarm.addListener(e=>{e.name===R&&(!p||p.readyState===WebSocket.CLOSED||p.readyState===WebSocket.CLOSING)&&S()})}async function F(){try{let e=await chrome.storage.sync.get("settings");e.settings&&(E={...b,...e.settings})}catch(e){console.warn("[AI DevTools] Failed to load settings:",e)}}function S(){if(!(p?.readyState===WebSocket.OPEN||p?.readyState===WebSocket.CONNECTING))try{p=new WebSocket(`ws://localhost:${E.serverPort}`),p.onopen=()=>{console.log("[AI DevTools] Connected to MCP server"),n.mcpConnected=!0,T()},p.onclose=()=>{console.log("[AI DevTools] Disconnected from MCP server"),n.mcpConnected=!1,p=null,T(),setTimeout(S,C)},p.onerror=e=>{console.warn("[AI DevTools] WebSocket error:",e)},p.onmessage=e=>{P(JSON.parse(e.data))}}catch(e){console.warn("[AI DevTools] Failed to connect to MCP server:",e),setTimeout(S,C)}}function d(e){p?.readyState===WebSocket.OPEN&&p.send(JSON.stringify(e))}function P(e){switch(e.type){case"GET_SELECTION":d({type:"SELECTION_RESPONSE",id:e.id,payload:n.currentSelection});break;case"GET_DIAGNOSTICS":V().then(s=>{d({type:"DIAGNOSTICS_RESPONSE",id:e.id,payload:s})});break;case"START_RECORDING":k(),d({type:"RECORDING_STARTED",id:e.id});break;case"STOP_RECORDING":let t=v();d({type:"RECORDING_RESPONSE",id:e.id,payload:t});break;case"GET_RECORDING":d({type:"RECORDING_RESPONSE",id:e.id,payload:n.currentRecording});break;case"SNAPSHOT_DOM":q(e.payload).then(s=>{d({type:"SNAPSHOT_RESPONSE",id:e.id,payload:s})});break;case"DIFF_SNAPSHOTS":let o=H(e.payload);d({type:"DIFF_RESPONSE",id:e.id,payload:o});break;case"GET_RECENT_ACTIVITY":d({type:"RECENT_ACTIVITY_RESPONSE",id:e.id,payload:I()});break;case"PING":d({type:"PONG",id:e.id});break}}function G(e,t,o){switch(e.type){case"ELEMENT_SELECTED":n.currentSelection=e.payload,d({type:"ELEMENT_SELECTED",payload:n.currentSelection}),n.isRecording&&l&&c.push({time:Date.now()-l,type:"element_select",data:{selector:e.payload.element.selector}}),m("element_select",{selector:e.payload.element.selector}),o({success:!0});break;case"REGION_SELECTED":n.currentSelection=e.payload,d({type:"REGION_SELECTED",payload:n.currentSelection}),o({success:!0});break;case"GET_BROWSER_CONTEXT":o({errors:n.consoleBuffer.filter(a=>a.type==="error"),networkFailures:n.networkBuffer.filter(a=>a.status&&a.status>=400)});break;case"CONSOLE_EVENT":let s=e.payload;for(n.consoleBuffer.push(s);n.consoleBuffer.length>E.maxConsoleEntries;)n.consoleBuffer.shift();n.isRecording&&l&&c.push({time:Date.now()-l,type:`console_${s.type}`,data:{message:s.message,source:s.source}}),m(`console_${s.type}`,{message:s.message,source:s.source}),o({success:!0});break;case"NETWORK_EVENT":let r=e.payload;for(n.networkBuffer.push(r);n.networkBuffer.length>E.maxNetworkEntries;)n.networkBuffer.shift();if(n.isRecording&&l){let a=r.status&&r.status>=400?"network_error":"network_response";c.push({time:Date.now()-l,type:a,data:{url:r.url,method:r.method,status:r.status,statusText:r.statusText}})}m(r.status&&r.status>=400?"network_error":"network_response",{url:r.url,method:r.method,status:r.status,statusText:r.statusText}),o({success:!0});break;case"INTERACTION_EVENT":if(n.isRecording&&l){let a=e.payload;c.push({time:Date.now()-l,type:a.type,data:a.data})}{let a=e.payload;m(a.type,a.data)}o({success:!0});break;case"CAPTURE_SCREENSHOT":return $(t.tab?.id).then(a=>{o({dataUrl:a})}),!0;case"GET_STATUS":o({isActive:n.isActive,isRecording:n.isRecording,isBuffering:n.isBuffering,hasSelection:n.currentSelection!==null,mcpConnected:n.mcpConnected});break;case"START_RECORDING":k(),o({success:!0});break;case"STOP_RECORDING":let u=v();d({type:"RECORDING_STOPPED",payload:u}),o({success:!0,recording:u});break;case"CONTENT_READY":n.isActive=!0,o({success:!0});break;case"TOGGLE_BUFFER":n.isBuffering?W():N(),o({success:!0,isBuffering:n.isBuffering});break;case"SEND_BUFFER":let i=I();i&&(n.currentRecording=i,d({type:"BUFFER_RECORDING",payload:i})),o({success:!0,recording:i});break;default:o({error:"Unknown message type"})}return!0}async function L(e){let[t]=await chrome.tabs.query({active:!0,currentWindow:!0});if(t?.id)switch(e){case"toggle-inspect":chrome.tabs.sendMessage(t.id,{type:"TOGGLE_INSPECT"}).catch(()=>{});break;case"toggle-region":chrome.tabs.sendMessage(t.id,{type:"TOGGLE_REGION"}).catch(()=>{});break}}async function B(e){if(e.id)try{await chrome.tabs.sendMessage(e.id,{type:"TOGGLE_INSPECT"})}catch(t){console.warn("[AI DevTools] Failed to toggle inspect mode:",t)}}function M(e,t,o){t.status==="loading"&&(n.currentSelection=null,n.isRecording&&l&&c.push({time:Date.now()-l,type:t.url?"navigation":"refresh",data:{url:t.url}}),m(t.url?"navigation":"refresh",{url:t.url}))}async function $(e){try{return await chrome.tabs.captureVisibleTab(void 0,{format:"jpeg",quality:Math.round(E.screenshotQuality*100)})}catch(t){return console.warn("[AI DevTools] Screenshot capture failed:",t),null}}async function k(){n.isRecording=!0,l=Date.now(),c=[],n.currentRecording=null;try{let[e]=await chrome.tabs.query({active:!0,currentWindow:!0});e&&c.push({time:0,type:"navigation",data:{url:e.url,title:e.title,event:"recording_start"}})}catch{}_({type:"RECORDING_STARTED"})}function v(){if(!n.isRecording||!l)return null;let e=Date.now()-l,t={totalEvents:c.length,clicks:c.filter(r=>r.type==="click").length,inputs:c.filter(r=>r.type==="input").length,scrolls:c.filter(r=>r.type==="scroll").length,navigations:c.filter(r=>r.type==="navigation"||r.type==="refresh").length,networkRequests:c.filter(r=>r.type==="network_request"||r.type==="network_response").length,networkErrors:c.filter(r=>r.type==="network_error").length,consoleErrors:c.filter(r=>r.type==="console_error").length,layoutShifts:c.filter(r=>r.type==="layout_shift").length},o=O(c,e),s={mode:"flow",duration:e,startTime:l,events:c,finalSelection:n.currentSelection||void 0,summary:t,diagnosis:o};return n.isRecording=!1,n.currentRecording=s,l=null,c=[],_({type:"RECORDING_STOPPED"}),s}function N(){n.isBuffering=!0,g=[],h=setInterval(w,5e3),chrome.storage.local.set({isBuffering:!0}),T()}function W(){n.isBuffering=!1,g=[],h&&(clearInterval(h),h=null),chrome.storage.local.set({isBuffering:!1}),T()}function w(){let e=Date.now()-D,t=g.findIndex(o=>o.time>=e);t>0?g=g.slice(t):t===-1&&g.length>0&&(g=[])}function m(e,t){n.isBuffering&&(g.push({time:Date.now(),type:e,data:t}),g.length>5e3&&w())}function I(){if(w(),g.length===0)return null;let e=g[0].time,o=g[g.length-1].time-e,s=g.map(i=>({...i,time:i.time-e})),r={totalEvents:s.length,clicks:s.filter(i=>i.type==="click").length,inputs:s.filter(i=>i.type==="input").length,scrolls:s.filter(i=>i.type==="scroll").length,navigations:s.filter(i=>i.type==="navigation"||i.type==="refresh").length,networkRequests:s.filter(i=>i.type==="network_request"||i.type==="network_response").length,networkErrors:s.filter(i=>i.type==="network_error").length,consoleErrors:s.filter(i=>i.type==="console_error").length,layoutShifts:s.filter(i=>i.type==="layout_shift").length},u=O(s,o);return{mode:"flow",duration:o,startTime:e,events:s,summary:r,diagnosis:u}}function O(e,t){let o=e.filter(a=>a.type==="console_error"||a.type==="network_error"),s=e.filter(a=>a.type==="click"),r="No obvious issues detected",u;for(let a of s){let f=o.filter(y=>y.time>a.time&&y.time<a.time+1e3);if(f.length>0){r=`Error occurred after clicking ${a.data.selector||"element"}`,u=f[0].data.message;break}}let i=e.slice(0,10).map(a=>{let f=(a.time/1e3).toFixed(1),y=U(a.type),x=z(a);return`${f}s ${y} ${x}`}).join(`
2
+ `);return{suspectedIssue:r,timeline:i,rootCause:u}}function U(e){return{refresh:"\u{1F504}",navigation:"\u{1F504}",click:"\u{1F5B1}\uFE0F",input:"\u2328\uFE0F",scroll:"\u{1F4DC}",network_request:"\u{1F4E4}",network_response:"\u2705",network_error:"\u274C",console_log:"\u{1F4DD}",console_warn:"\u26A0\uFE0F",console_error:"\u274C",dom_mutation:"\u{1F500}",layout_shift:"\u{1F4D0}",element_select:"\u{1F446}",form_submit:"\u{1F4CB}",keypress:"\u2328\uFE0F",mouse_move:"\u{1F50D}"}[e]||"\u2022"}function z(e){let t=e.data;switch(e.type){case"click":let o=t.text?`"${t.text.slice(0,40)}"`:t.selector||"element";return`CLICK ${t.role||""} ${o} at (${t.x}, ${t.y})`;case"scroll":let s=t.nearSection?` near "${t.nearSection.slice(0,30)}"`:"";return`SCROLL ${t.direction||""} to ${t.scrollPercent||0}%${s}`;case"input":return`INPUT ${t.inputType||"text"} "${t.label||t.selector||""}" (${t.valueLength||0} chars)`;case"form_submit":return`SUBMIT ${t.method} form \u2192 ${t.action||"same page"} (${t.fieldCount} fields)`;case"keypress":return`KEY ${t.combo||t.key} on ${t.target||"page"}`;case"mouse_move":return`HOVER ${t.role||""} ${t.target||""} at (${t.x}, ${t.y})`;case"navigation":return t.event==="recording_start"?`START on "${t.title||"page"}" (${t.url})`:`NAVIGATE \u2192 ${t.url||"unknown"}`;case"refresh":return"REFRESH page";case"network_response":let r=t.url?.split("?")[0]?.split("/").slice(-2).join("/")||t.url;return`${t.method} /${r} \u2192 ${t.status}`;case"network_error":let u=t.url?.split("?")[0]?.split("/").slice(-2).join("/")||t.url;return`${t.method} /${u} \u2192 ${t.status} FAILED: "${t.statusText}"`;case"console_error":return`ERROR: "${t.message?.slice(0,80)}"`;case"console_warn":return`WARN: "${t.message?.slice(0,60)}"`;default:return e.type.toUpperCase()}}async function V(){try{let[e]=await chrome.tabs.query({active:!0,currentWindow:!0});return e?.id?await chrome.tabs.sendMessage(e.id,{type:"GET_DIAGNOSTICS"}):null}catch(e){return console.warn("[AI DevTools] Failed to get diagnostics:",e),null}}async function q(e){try{let[t]=await chrome.tabs.query({active:!0,currentWindow:!0});if(!t?.id)return null;let o=await chrome.tabs.sendMessage(t.id,{type:"SNAPSHOT_DOM",payload:e});if(o){let s=o;return n.snapshots.set(s.id,s),s}return null}catch(t){return console.warn("[AI DevTools] Failed to snapshot DOM:",t),null}}function H(e){let t=n.snapshots.get(e.before),o=n.snapshots.get(e.after);if(!t||!o)return{error:"Snapshot not found"};let s=[];for(let[r,u]of t.elements){let i=o.elements.get(r);if(!i)s.push({selector:r,type:"removed"});else{let a=j(u.classes,i.classes),f=u.size.width!==i.size.width||u.size.height!==i.size.height;(a.added.length||a.removed.length||f)&&s.push({selector:r,type:"changed",changes:{classes:a.added.length||a.removed.length?a:void 0,size:f?{before:u.size,after:i.size}:void 0}})}}for(let[r]of o.elements)t.elements.has(r)||s.push({selector:r,type:"added"});return{before:e.before,after:e.after,changes:s}}function j(e,t){let o=new Set(e),s=new Set(t);return{added:t.filter(r=>!o.has(r)),removed:e.filter(r=>!s.has(r))}}async function _(e){let t=await chrome.tabs.query({});for(let o of t)o.id&&chrome.tabs.sendMessage(o.id,e).catch(()=>{})}function T(){let e={type:"STATUS_UPDATE",isActive:n.isActive,isRecording:n.isRecording,isBuffering:n.isBuffering,mcpConnected:n.mcpConnected};_(e),chrome.runtime.sendMessage(e).catch(()=>{})}A();