+7
-53
@@ -10,30 +10,13 @@ import type { CDPTarget, CDPVersion, NavigateResult, ScreenshotResult, EvaluateResult, CometState } from "./types.js"; | ||
| private isReconnecting; | ||
| private lastSuccessfulOperation; | ||
| get isConnected(): boolean; | ||
| get currentState(): CometState; | ||
| /** | ||
| * Check if the connection is still alive | ||
| * Auto-reconnect wrapper for operations with exponential backoff | ||
| */ | ||
| private isConnectionAlive; | ||
| /** | ||
| * Auto-reconnect wrapper for operations with improved error handling | ||
| */ | ||
| private withAutoReconnect; | ||
| /** | ||
| * Reconnect to the last connected tab with improved retry logic | ||
| * Reconnect to the last connected tab | ||
| */ | ||
| reconnect(): Promise<string>; | ||
| /** | ||
| * Find and connect to the Perplexity sidecar tab (agent view) | ||
| */ | ||
| connectToSidecar(): Promise<string>; | ||
| /** | ||
| * Find and connect to the main Perplexity tab | ||
| */ | ||
| connectToMain(): Promise<string>; | ||
| /** | ||
| * Get the tab where the agent is currently browsing | ||
| */ | ||
| getAgentBrowsingTab(): Promise<CDPTarget | null>; | ||
| /** | ||
| * List tabs with categorization | ||
@@ -49,3 +32,3 @@ */ | ||
| /** | ||
| * Check if Comet process is running (regardless of debug port) | ||
| * Check if Comet process is running | ||
| */ | ||
@@ -59,3 +42,2 @@ private isCometProcessRunning; | ||
| * Start Comet browser with remote debugging enabled | ||
| * Automatically restarts Comet if it's running without debug port | ||
| */ | ||
@@ -72,3 +54,3 @@ startComet(port?: number): Promise<string>; | ||
| /** | ||
| * Connect to a specific tab or the first available page | ||
| * Connect to a specific tab | ||
| */ | ||
@@ -87,3 +69,3 @@ connect(targetId?: string): Promise<string>; | ||
| */ | ||
| screenshot(format?: "png" | "jpeg", quality?: number): Promise<ScreenshotResult>; | ||
| screenshot(format?: "png" | "jpeg"): Promise<ScreenshotResult>; | ||
| /** | ||
@@ -98,30 +80,6 @@ * Execute JavaScript in the page context | ||
| /** | ||
| * Get page HTML content | ||
| */ | ||
| getPageContent(): Promise<string>; | ||
| /** | ||
| * Get page text content | ||
| */ | ||
| getPageText(): Promise<string>; | ||
| /** | ||
| * Click on an element | ||
| */ | ||
| click(selector: string): Promise<boolean>; | ||
| /** | ||
| * Type text into an element | ||
| */ | ||
| type(selector: string, text: string): Promise<boolean>; | ||
| /** | ||
| * Press a key | ||
| */ | ||
| pressKey(key: string, selector?: string): Promise<void>; | ||
| pressKey(key: string): Promise<void>; | ||
| /** | ||
| * Wait for an element to appear | ||
| */ | ||
| waitForSelector(selector: string, timeout?: number): Promise<boolean>; | ||
| /** | ||
| * Wait for page to be idle (no pending network requests) | ||
| */ | ||
| waitForNetworkIdle(timeout?: number): Promise<void>; | ||
| /** | ||
| * Create a new tab | ||
@@ -133,7 +91,3 @@ */ | ||
| */ | ||
| closeTab(targetId: string): Promise<void>; | ||
| /** | ||
| * Close Comet browser | ||
| */ | ||
| closeComet(): Promise<void>; | ||
| closeTab(targetId: string): Promise<boolean>; | ||
| private ensureConnected; | ||
@@ -140,0 +94,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cdp-client.d.ts","sourceRoot":"","sources":["../src/cdp-client.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"cdp-client.d.ts","sourceRoot":"","sources":["../src/cdp-client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,UAAU,EACX,MAAM,YAAY,CAAC;AAKpB,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,KAAK,CAGX;IACF,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,oBAAoB,CAAa;IACzC,OAAO,CAAC,cAAc,CAAkB;IAExC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,YAAY,IAAI,UAAU,CAE7B;IAED;;OAEG;YACW,iBAAiB;IAsC/B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAyClC;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC;QACnC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;QACvB,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;QAC1B,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC;QAChC,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;QAC1B,MAAM,EAAE,SAAS,EAAE,CAAC;KACrB,CAAC;IA4BF;;OAEG;YACW,qBAAqB;IAOnC;;OAEG;YACW,SAAS;IAOvB;;OAEG;IACG,UAAU,CAAC,IAAI,GAAE,MAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IA0D9D;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;IAMvC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAMzC;;OAEG;IACG,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA2CjD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,GAAE,OAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAQjF;;OAEG;IACG,UAAU,CAAC,MAAM,GAAE,KAAK,GAAG,MAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAK3E;;OAEG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAS3D;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAW/D;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1C;;OAEG;IACG,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAS9C;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBlD,OAAO,CAAC,eAAe;CAKxB;AAED,eAAO,MAAM,WAAW,gBAAuB,CAAC"} |
+57
-290
@@ -17,3 +17,2 @@ // CDP Client wrapper for Comet browser control | ||
| isReconnecting = false; | ||
| lastSuccessfulOperation = Date.now(); | ||
| get isConnected() { | ||
@@ -26,20 +25,5 @@ return this.state.connected && this.client !== null; | ||
| /** | ||
| * Check if the connection is still alive | ||
| * Auto-reconnect wrapper for operations with exponential backoff | ||
| */ | ||
| async isConnectionAlive() { | ||
| if (!this.client) | ||
| return false; | ||
| try { | ||
| await this.client.Runtime.evaluate({ expression: '1' }); | ||
| return true; | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| } | ||
| /** | ||
| * Auto-reconnect wrapper for operations with improved error handling | ||
| */ | ||
| async withAutoReconnect(operation) { | ||
| // If already reconnecting, wait for it to complete | ||
| if (this.isReconnecting) { | ||
@@ -50,4 +34,3 @@ await new Promise(resolve => setTimeout(resolve, 1000)); | ||
| const result = await operation(); | ||
| this.lastSuccessfulOperation = Date.now(); | ||
| this.reconnectAttempts = 0; // Reset on success | ||
| this.reconnectAttempts = 0; | ||
| return result; | ||
@@ -57,20 +40,11 @@ } | ||
| const errorMessage = error instanceof Error ? error.message : String(error); | ||
| // Connection-related errors that warrant reconnection | ||
| const connectionErrors = [ | ||
| 'WebSocket', | ||
| 'CLOSED', | ||
| 'not open', | ||
| 'disconnected', | ||
| 'ECONNREFUSED', | ||
| 'ECONNRESET', | ||
| 'Protocol error', | ||
| 'Target closed', | ||
| 'Session closed' | ||
| 'WebSocket', 'CLOSED', 'not open', 'disconnected', | ||
| 'ECONNREFUSED', 'ECONNRESET', 'Protocol error', 'Target closed', 'Session closed' | ||
| ]; | ||
| const isConnectionError = connectionErrors.some(e => errorMessage.includes(e)); | ||
| if (isConnectionError && this.reconnectAttempts < this.maxReconnectAttempts) { | ||
| if (connectionErrors.some(e => errorMessage.includes(e)) && | ||
| this.reconnectAttempts < this.maxReconnectAttempts) { | ||
| this.reconnectAttempts++; | ||
| this.isReconnecting = true; | ||
| try { | ||
| // Wait a bit before reconnecting (exponential backoff) | ||
| const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts - 1), 5000); | ||
@@ -80,3 +54,2 @@ await new Promise(resolve => setTimeout(resolve, delay)); | ||
| this.isReconnecting = false; | ||
| // Retry the operation | ||
| return await operation(); | ||
@@ -93,6 +66,5 @@ } | ||
| /** | ||
| * Reconnect to the last connected tab with improved retry logic | ||
| * Reconnect to the last connected tab | ||
| */ | ||
| async reconnect() { | ||
| // Cleanup old connection | ||
| if (this.client) { | ||
@@ -102,9 +74,7 @@ try { | ||
| } | ||
| catch { | ||
| // Ignore close errors | ||
| } | ||
| catch { /* ignore */ } | ||
| } | ||
| this.state.connected = false; | ||
| this.client = null; | ||
| // Verify Comet is still running | ||
| // Verify Comet is running | ||
| try { | ||
@@ -114,3 +84,2 @@ await this.getVersion(); | ||
| catch { | ||
| // Comet might have crashed, try to restart | ||
| try { | ||
@@ -121,24 +90,19 @@ await this.startComet(this.state.port); | ||
| catch { | ||
| throw new Error('Cannot connect to Comet. Please ensure Comet is running with --remote-debugging-port=9222'); | ||
| throw new Error('Cannot connect to Comet. Ensure Comet is running with --remote-debugging-port=9222'); | ||
| } | ||
| } | ||
| // Try to reconnect to the last target | ||
| // Try to reconnect to last target | ||
| if (this.lastTargetId) { | ||
| try { | ||
| const targets = await this.listTargets(); | ||
| const lastTarget = targets.find(t => t.id === this.lastTargetId); | ||
| if (lastTarget) { | ||
| if (targets.find(t => t.id === this.lastTargetId)) { | ||
| return await this.connect(this.lastTargetId); | ||
| } | ||
| } | ||
| catch { | ||
| // Target might be gone, find a new one | ||
| } | ||
| catch { /* target gone */ } | ||
| } | ||
| // Find the best target to connect to (prioritize main Perplexity tab) | ||
| // Find best target | ||
| const targets = await this.listTargets(); | ||
| const perplexityTab = targets.find(t => t.type === 'page' && t.url.includes('perplexity.ai') && !t.url.includes('sidecar')); | ||
| const sidecarTab = targets.find(t => t.type === 'page' && t.url.includes('sidecar')); | ||
| const anyPage = targets.find(t => t.type === 'page' && t.url !== 'about:blank'); | ||
| const target = perplexityTab || sidecarTab || anyPage; | ||
| const target = targets.find(t => t.type === 'page' && t.url.includes('perplexity.ai')) || | ||
| targets.find(t => t.type === 'page' && t.url !== 'about:blank'); | ||
| if (target) { | ||
@@ -150,40 +114,2 @@ return await this.connect(target.id); | ||
| /** | ||
| * Find and connect to the Perplexity sidecar tab (agent view) | ||
| */ | ||
| async connectToSidecar() { | ||
| const targets = await this.listTargets(); | ||
| const sidecarTab = targets.find(t => t.type === 'page' && t.url.includes('sidecar')); | ||
| if (sidecarTab) { | ||
| return await this.connect(sidecarTab.id); | ||
| } | ||
| throw new Error('No sidecar tab found. Agent mode may not be active.'); | ||
| } | ||
| /** | ||
| * Find and connect to the main Perplexity tab | ||
| */ | ||
| async connectToMain() { | ||
| const targets = await this.listTargets(); | ||
| const mainTab = targets.find(t => t.type === 'page' && | ||
| t.url.includes('perplexity.ai') && | ||
| !t.url.includes('sidecar') && | ||
| !t.url.includes('chrome-extension')); | ||
| if (mainTab) { | ||
| return await this.connect(mainTab.id); | ||
| } | ||
| throw new Error('No main Perplexity tab found.'); | ||
| } | ||
| /** | ||
| * Get the tab where the agent is currently browsing | ||
| */ | ||
| async getAgentBrowsingTab() { | ||
| const targets = await this.listTargets(); | ||
| // The agent overlay contains info about which tab it's controlling | ||
| const agentTab = targets.find(t => t.type === 'page' && | ||
| !t.url.includes('perplexity.ai') && | ||
| !t.url.includes('chrome-extension') && | ||
| !t.url.includes('chrome://') && | ||
| t.url !== 'about:blank'); | ||
| return agentTab || null; | ||
| } | ||
| /** | ||
| * List tabs with categorization | ||
@@ -194,5 +120,3 @@ */ | ||
| return { | ||
| main: targets.find(t => t.type === 'page' && | ||
| t.url.includes('perplexity.ai') && | ||
| !t.url.includes('sidecar')) || null, | ||
| main: targets.find(t => t.type === 'page' && t.url.includes('perplexity.ai') && !t.url.includes('sidecar')) || null, | ||
| sidecar: targets.find(t => t.type === 'page' && t.url.includes('sidecar')) || null, | ||
@@ -211,3 +135,3 @@ agentBrowsing: targets.find(t => t.type === 'page' && | ||
| /** | ||
| * Check if Comet process is running (regardless of debug port) | ||
| * Check if Comet process is running | ||
| */ | ||
@@ -217,5 +141,3 @@ async isCometProcessRunning() { | ||
| const check = spawn('pgrep', ['-f', 'Comet.app']); | ||
| check.on('close', (code) => { | ||
| resolve(code === 0); | ||
| }); | ||
| check.on('close', (code) => resolve(code === 0)); | ||
| }); | ||
@@ -229,6 +151,3 @@ } | ||
| const kill = spawn('pkill', ['-f', 'Comet.app']); | ||
| kill.on('close', () => { | ||
| // Wait a bit for process to fully terminate | ||
| setTimeout(resolve, 1000); | ||
| }); | ||
| kill.on('close', () => setTimeout(resolve, 1000)); | ||
| }); | ||
@@ -238,13 +157,10 @@ } | ||
| * Start Comet browser with remote debugging enabled | ||
| * Automatically restarts Comet if it's running without debug port | ||
| */ | ||
| async startComet(port = DEFAULT_PORT) { | ||
| this.state.port = port; | ||
| // Check if Comet is already running WITH debugging enabled | ||
| // Check if already running with debug port | ||
| try { | ||
| const controller = new AbortController(); | ||
| const timeoutId = setTimeout(() => controller.abort(), 2000); | ||
| const response = await fetch(`http://localhost:${port}/json/version`, { | ||
| signal: controller.signal | ||
| }); | ||
| const response = await fetch(`http://localhost:${port}/json/version`, { signal: controller.signal }); | ||
| clearTimeout(timeoutId); | ||
@@ -257,14 +173,10 @@ if (response.ok) { | ||
| catch { | ||
| // Debug port not available, check if Comet is running without it | ||
| const isRunning = await this.isCometProcessRunning(); | ||
| if (isRunning) { | ||
| // Comet is running but without debug port - restart it | ||
| await this.killComet(); | ||
| } | ||
| } | ||
| // Start Comet with debugging enabled | ||
| // Start Comet | ||
| return new Promise((resolve, reject) => { | ||
| this.cometProcess = spawn(COMET_PATH, [ | ||
| `--remote-debugging-port=${port}`, | ||
| ], { | ||
| this.cometProcess = spawn(COMET_PATH, [`--remote-debugging-port=${port}`], { | ||
| detached: true, | ||
@@ -274,4 +186,3 @@ stdio: "ignore", | ||
| this.cometProcess.unref(); | ||
| // Wait for Comet to start | ||
| const maxAttempts = 40; // 20 seconds total | ||
| const maxAttempts = 40; | ||
| let attempts = 0; | ||
@@ -283,5 +194,3 @@ const checkReady = async () => { | ||
| const timeoutId = setTimeout(() => controller.abort(), 2000); | ||
| const response = await fetch(`http://localhost:${port}/json/version`, { | ||
| signal: controller.signal | ||
| }); | ||
| const response = await fetch(`http://localhost:${port}/json/version`, { signal: controller.signal }); | ||
| clearTimeout(timeoutId); | ||
@@ -294,5 +203,3 @@ if (response.ok) { | ||
| } | ||
| catch { | ||
| // Keep trying | ||
| } | ||
| catch { /* keep trying */ } | ||
| if (attempts < maxAttempts) { | ||
@@ -302,3 +209,3 @@ setTimeout(checkReady, 500); | ||
| else { | ||
| reject(new Error(`Timeout waiting for Comet to start. Please try manually: /Applications/Comet.app/Contents/MacOS/Comet --remote-debugging-port=${port}`)); | ||
| reject(new Error(`Timeout waiting for Comet. Try: ${COMET_PATH} --remote-debugging-port=${port}`)); | ||
| } | ||
@@ -314,5 +221,4 @@ }; | ||
| const response = await fetch(`http://localhost:${this.state.port}/json/version`); | ||
| if (!response.ok) { | ||
| if (!response.ok) | ||
| throw new Error(`Failed to get version: ${response.status}`); | ||
| } | ||
| return response.json(); | ||
@@ -325,9 +231,8 @@ } | ||
| const response = await fetch(`http://localhost:${this.state.port}/json/list`); | ||
| if (!response.ok) { | ||
| if (!response.ok) | ||
| throw new Error(`Failed to list targets: ${response.status}`); | ||
| } | ||
| return response.json(); | ||
| } | ||
| /** | ||
| * Connect to a specific tab or the first available page | ||
| * Connect to a specific tab | ||
| */ | ||
@@ -338,10 +243,6 @@ async connect(targetId) { | ||
| } | ||
| const options = { | ||
| port: this.state.port, | ||
| }; | ||
| if (targetId) { | ||
| const options = { port: this.state.port }; | ||
| if (targetId) | ||
| options.target = targetId; | ||
| } | ||
| this.client = await CDP(options); | ||
| // Enable necessary domains | ||
| await Promise.all([ | ||
@@ -353,5 +254,4 @@ this.client.Page.enable(), | ||
| ]); | ||
| // Set actual window size (1440x900) to ensure consistent UI | ||
| // Set window size for consistent UI | ||
| try { | ||
| // Get window ID and set bounds | ||
| const { windowId } = await this.client.Browser.getWindowForTarget({ targetId }); | ||
@@ -363,15 +263,9 @@ await this.client.Browser.setWindowBounds({ | ||
| } | ||
| catch (e) { | ||
| // Fallback to emulation if Browser API fails | ||
| catch { | ||
| try { | ||
| await this.client.Emulation.setDeviceMetricsOverride({ | ||
| width: 1440, | ||
| height: 900, | ||
| deviceScaleFactor: 1, | ||
| mobile: false, | ||
| width: 1440, height: 900, deviceScaleFactor: 1, mobile: false, | ||
| }); | ||
| } | ||
| catch { | ||
| // Continue anyway | ||
| } | ||
| catch { /* continue */ } | ||
| } | ||
@@ -381,7 +275,4 @@ this.state.connected = true; | ||
| this.lastTargetId = targetId; | ||
| this.reconnectAttempts = 0; // Reset on successful connect | ||
| // Get current URL | ||
| const { result } = await this.client.Runtime.evaluate({ | ||
| expression: "window.location.href", | ||
| }); | ||
| this.reconnectAttempts = 0; | ||
| const { result } = await this.client.Runtime.evaluate({ expression: "window.location.href" }); | ||
| this.state.currentUrl = result.value; | ||
@@ -407,5 +298,4 @@ return `Connected to tab: ${this.state.currentUrl}`; | ||
| const result = await this.client.Page.navigate({ url }); | ||
| if (waitForLoad) { | ||
| if (waitForLoad) | ||
| await this.client.Page.loadEventFired(); | ||
| } | ||
| this.state.currentUrl = url; | ||
@@ -417,9 +307,5 @@ return result; | ||
| */ | ||
| async screenshot(format = "png", quality) { | ||
| async screenshot(format = "png") { | ||
| this.ensureConnected(); | ||
| const options = { format }; | ||
| if (quality !== undefined) { | ||
| options.quality = quality; | ||
| } | ||
| return this.client.Page.captureScreenshot(options); | ||
| return this.client.Page.captureScreenshot({ format }); | ||
| } | ||
@@ -451,123 +337,10 @@ /** | ||
| /** | ||
| * Get page HTML content | ||
| */ | ||
| async getPageContent() { | ||
| const result = await this.evaluate("document.documentElement.outerHTML"); | ||
| if (result.exceptionDetails) { | ||
| throw new Error(result.exceptionDetails.text); | ||
| } | ||
| return result.result.value; | ||
| } | ||
| /** | ||
| * Get page text content | ||
| */ | ||
| async getPageText() { | ||
| const result = await this.evaluate("document.body.innerText"); | ||
| if (result.exceptionDetails) { | ||
| throw new Error(result.exceptionDetails.text); | ||
| } | ||
| return result.result.value; | ||
| } | ||
| /** | ||
| * Click on an element | ||
| */ | ||
| async click(selector) { | ||
| const result = await this.evaluate(` | ||
| (function() { | ||
| const el = document.querySelector(${JSON.stringify(selector)}); | ||
| if (el) { | ||
| el.click(); | ||
| return true; | ||
| } | ||
| return false; | ||
| })() | ||
| `); | ||
| return result.result.value; | ||
| } | ||
| /** | ||
| * Type text into an element | ||
| */ | ||
| async type(selector, text) { | ||
| const result = await this.evaluate(` | ||
| (function() { | ||
| const el = document.querySelector(${JSON.stringify(selector)}); | ||
| if (el) { | ||
| el.focus(); | ||
| el.value = ${JSON.stringify(text)}; | ||
| el.dispatchEvent(new Event('input', { bubbles: true })); | ||
| el.dispatchEvent(new Event('change', { bubbles: true })); | ||
| return true; | ||
| } | ||
| return false; | ||
| })() | ||
| `); | ||
| return result.result.value; | ||
| } | ||
| /** | ||
| * Press a key | ||
| */ | ||
| async pressKey(key, selector) { | ||
| async pressKey(key) { | ||
| this.ensureConnected(); | ||
| if (selector) { | ||
| await this.evaluate(`document.querySelector(${JSON.stringify(selector)})?.focus()`); | ||
| } | ||
| // Use Input.dispatchKeyEvent for more reliable key events | ||
| await this.client.Input.dispatchKeyEvent({ | ||
| type: "keyDown", | ||
| key, | ||
| }); | ||
| await this.client.Input.dispatchKeyEvent({ | ||
| type: "keyUp", | ||
| key, | ||
| }); | ||
| await this.client.Input.dispatchKeyEvent({ type: "keyDown", key }); | ||
| await this.client.Input.dispatchKeyEvent({ type: "keyUp", key }); | ||
| } | ||
| /** | ||
| * Wait for an element to appear | ||
| */ | ||
| async waitForSelector(selector, timeout = 10000) { | ||
| const startTime = Date.now(); | ||
| while (Date.now() - startTime < timeout) { | ||
| const result = await this.evaluate(` | ||
| document.querySelector(${JSON.stringify(selector)}) !== null | ||
| `); | ||
| if (result.result.value === true) { | ||
| return true; | ||
| } | ||
| await new Promise(resolve => setTimeout(resolve, 100)); | ||
| } | ||
| return false; | ||
| } | ||
| /** | ||
| * Wait for page to be idle (no pending network requests) | ||
| */ | ||
| async waitForNetworkIdle(timeout = 5000) { | ||
| this.ensureConnected(); | ||
| return new Promise((resolve) => { | ||
| let pendingRequests = 0; | ||
| let idleTimer; | ||
| const checkIdle = () => { | ||
| if (pendingRequests === 0) { | ||
| clearTimeout(idleTimer); | ||
| idleTimer = setTimeout(resolve, 500); | ||
| } | ||
| }; | ||
| this.client.Network.requestWillBeSent(() => { | ||
| pendingRequests++; | ||
| clearTimeout(idleTimer); | ||
| }); | ||
| this.client.Network.loadingFinished(() => { | ||
| pendingRequests = Math.max(0, pendingRequests - 1); | ||
| checkIdle(); | ||
| }); | ||
| this.client.Network.loadingFailed(() => { | ||
| pendingRequests = Math.max(0, pendingRequests - 1); | ||
| checkIdle(); | ||
| }); | ||
| // Timeout fallback | ||
| setTimeout(resolve, timeout); | ||
| // Initial check | ||
| checkIdle(); | ||
| }); | ||
| } | ||
| /** | ||
| * Create a new tab | ||
@@ -577,5 +350,4 @@ */ | ||
| const response = await fetch(`http://localhost:${this.state.port}/json/new${url ? `?${url}` : ""}`, { method: 'PUT' }); | ||
| if (!response.ok) { | ||
| if (!response.ok) | ||
| throw new Error(`Failed to create new tab: ${response.status}`); | ||
| } | ||
| return response.json(); | ||
@@ -587,19 +359,15 @@ } | ||
| async closeTab(targetId) { | ||
| const response = await fetch(`http://localhost:${this.state.port}/json/close/${targetId}`); | ||
| if (!response.ok) { | ||
| throw new Error(`Failed to close tab: ${response.status}`); | ||
| try { | ||
| if (this.client) { | ||
| const result = await this.client.Target.closeTarget({ targetId }); | ||
| return result.success; | ||
| } | ||
| } | ||
| } | ||
| /** | ||
| * Close Comet browser | ||
| */ | ||
| async closeComet() { | ||
| await this.disconnect(); | ||
| if (this.cometProcess) { | ||
| this.cometProcess.kill(); | ||
| this.cometProcess = null; | ||
| catch { /* fallback to HTTP */ } | ||
| try { | ||
| const response = await fetch(`http://localhost:${this.state.port}/json/close/${targetId}`); | ||
| return response.ok; | ||
| } | ||
| else { | ||
| // Try to close via pkill | ||
| spawn("pkill", ["-f", "Comet"], { stdio: "ignore" }); | ||
| catch { | ||
| return false; | ||
| } | ||
@@ -613,4 +381,3 @@ } | ||
| } | ||
| // Singleton instance | ||
| export const cometClient = new CometCDPClient(); | ||
| //# sourceMappingURL=cdp-client.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cdp-client.js","sourceRoot":"","sources":["../src/cdp-client.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"cdp-client.js","sourceRoot":"","sources":["../src/cdp-client.ts"],"names":[],"mappings":"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"} |
+2
-34
@@ -1,18 +0,7 @@ | ||
| import type { CometAIResponse } from "./types.js"; | ||
| export declare class CometAI { | ||
| private lastResponseText; | ||
| /** | ||
| * Find the first matching element from a list of selectors | ||
| */ | ||
| findElement(selectors: string[]): Promise<string | null>; | ||
| private findInputElement; | ||
| /** | ||
| * Get information about Comet's AI interface | ||
| */ | ||
| inspectInterface(): Promise<{ | ||
| inputSelector: string | null; | ||
| responseSelector: string | null; | ||
| hasInput: boolean; | ||
| pageInfo: string; | ||
| }>; | ||
| /** | ||
| * Send a prompt to Comet's AI (Perplexity) | ||
@@ -22,28 +11,7 @@ */ | ||
| /** | ||
| * Submit the current prompt - tries multiple strategies | ||
| * Submit the current prompt | ||
| */ | ||
| private submitPrompt; | ||
| /** | ||
| * Check if Comet AI is currently processing/loading | ||
| */ | ||
| isLoading(): Promise<boolean>; | ||
| /** | ||
| * Wait for Comet AI to finish responding | ||
| */ | ||
| waitForResponse(timeout?: number): Promise<CometAIResponse>; | ||
| /** | ||
| * Send prompt and wait for response | ||
| */ | ||
| ask(prompt: string, timeout?: number): Promise<CometAIResponse>; | ||
| /** | ||
| * Get the current visible response text | ||
| */ | ||
| getCurrentResponse(): Promise<string>; | ||
| /** | ||
| * Clear the current conversation/input | ||
| */ | ||
| clearConversation(): Promise<boolean>; | ||
| /** | ||
| * Get current agent status and progress (for polling) | ||
| * Gets fresh data each time, extracts URL from actual browsing tab | ||
| */ | ||
@@ -50,0 +18,0 @@ getAgentStatus(): Promise<{ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"comet-ai.d.ts","sourceRoot":"","sources":["../src/comet-ai.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAoClD,qBAAa,OAAO;IAClB,OAAO,CAAC,gBAAgB,CAAc;IAEtC;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAY9D;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC;QAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAwBF;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0CjD;;OAEG;YACW,YAAY;IAwH1B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAKnC;;OAEG;IACG,eAAe,CAAC,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAsDxE;;OAEG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAS5E;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAwB3C;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAgB3C;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC;QAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;QACzC,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,OAAO,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IAwJF;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CA0BpC;AAED,eAAO,MAAM,OAAO,SAAgB,CAAC"} | ||
| {"version":3,"file":"comet-ai.d.ts","sourceRoot":"","sources":["../src/comet-ai.ts"],"names":[],"mappings":"AAcA,qBAAa,OAAO;IAClB;;OAEG;YACW,gBAAgB;IAY9B;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwCjD;;OAEG;YACW,YAAY;IAkH1B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC;QAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;QACzC,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,OAAO,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IAuHF;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAoBpC;AAED,eAAO,MAAM,OAAO,SAAgB,CAAC"} |
+117
-323
| // Comet AI interaction module | ||
| // Handles sending prompts to Comet's AI assistant and reading responses | ||
| import { cometClient } from "./cdp-client.js"; | ||
| // Selectors for Perplexity/Comet AI interface | ||
| const SELECTORS = { | ||
| // Input selectors - contenteditable div is primary for Perplexity | ||
| input: [ | ||
| '[contenteditable="true"]', | ||
| 'textarea[placeholder*="Ask"]', | ||
| 'textarea[placeholder*="Search"]', | ||
| 'textarea', | ||
| 'input[type="text"]', | ||
| ], | ||
| // Response/output selectors for Perplexity | ||
| response: [ | ||
| '[class*="prose"]', | ||
| 'main article', | ||
| '[data-testid*="answer"]', | ||
| '[class*="answer"]', | ||
| '[class*="response"]', | ||
| ], | ||
| // Loading indicator selectors | ||
| loading: [ | ||
| '[class*="animate-pulse"]', | ||
| '[class*="loading"]', | ||
| '[class*="thinking"]', | ||
| '.spinner', | ||
| ], | ||
| // Submit button selectors - Perplexity uses arrow button | ||
| submit: [ | ||
| 'button[aria-label*="Submit"]', | ||
| 'button[aria-label*="Send"]', | ||
| 'button[type="submit"]', | ||
| 'button svg[class*="arrow"]', | ||
| ], | ||
| }; | ||
| // Input selectors - contenteditable div is primary for Perplexity | ||
| const INPUT_SELECTORS = [ | ||
| '[contenteditable="true"]', | ||
| 'textarea[placeholder*="Ask"]', | ||
| 'textarea[placeholder*="Search"]', | ||
| 'textarea', | ||
| 'input[type="text"]', | ||
| ]; | ||
| export class CometAI { | ||
| lastResponseText = ""; | ||
| /** | ||
| * Find the first matching element from a list of selectors | ||
| */ | ||
| async findElement(selectors) { | ||
| for (const selector of selectors) { | ||
| async findInputElement() { | ||
| for (const selector of INPUT_SELECTORS) { | ||
| const result = await cometClient.evaluate(` | ||
@@ -54,30 +28,6 @@ document.querySelector(${JSON.stringify(selector)}) !== null | ||
| /** | ||
| * Get information about Comet's AI interface | ||
| */ | ||
| async inspectInterface() { | ||
| const inputSelector = await this.findElement(SELECTORS.input); | ||
| const responseSelector = await this.findElement(SELECTORS.response); | ||
| // Get general page info | ||
| const pageInfoResult = await cometClient.evaluate(` | ||
| JSON.stringify({ | ||
| url: window.location.href, | ||
| title: document.title, | ||
| textareas: document.querySelectorAll('textarea').length, | ||
| inputs: document.querySelectorAll('input').length, | ||
| contentEditables: document.querySelectorAll('[contenteditable="true"]').length, | ||
| buttons: document.querySelectorAll('button').length, | ||
| }) | ||
| `); | ||
| return { | ||
| inputSelector, | ||
| responseSelector, | ||
| hasInput: inputSelector !== null, | ||
| pageInfo: pageInfoResult.result.value, | ||
| }; | ||
| } | ||
| /** | ||
| * Send a prompt to Comet's AI (Perplexity) | ||
| */ | ||
| async sendPrompt(prompt) { | ||
| const inputSelector = await this.findElement(SELECTORS.input); | ||
| const inputSelector = await this.findInputElement(); | ||
| if (!inputSelector) { | ||
@@ -94,3 +44,3 @@ throw new Error("Could not find input element. Navigate to Perplexity first."); | ||
| document.execCommand('insertText', false, ${JSON.stringify(prompt)}); | ||
| return { success: true, text: el.innerText }; | ||
| return { success: true }; | ||
| } | ||
@@ -103,3 +53,3 @@ // Fallback for textarea | ||
| textarea.dispatchEvent(new Event('input', { bubbles: true })); | ||
| return { success: true, text: textarea.value }; | ||
| return { success: true }; | ||
| } | ||
@@ -118,11 +68,44 @@ return { success: false }; | ||
| /** | ||
| * Submit the current prompt - tries multiple strategies | ||
| * Submit the current prompt | ||
| */ | ||
| async submitPrompt() { | ||
| // Wait a moment for the UI to register the input | ||
| await new Promise(resolve => setTimeout(resolve, 200)); | ||
| // Strategy 1: Try clicking the submit button with various selectors | ||
| const clickResult = await cometClient.evaluate(` | ||
| // Wait for React to process the typed content | ||
| await new Promise(resolve => setTimeout(resolve, 500)); | ||
| // Verify text was typed before attempting submit | ||
| const hasContent = await cometClient.evaluate(` | ||
| (() => { | ||
| // Common submit button selectors for Perplexity | ||
| const el = document.querySelector('[contenteditable="true"]'); | ||
| if (el && el.innerText.trim().length > 0) return true; | ||
| const textarea = document.querySelector('textarea'); | ||
| if (textarea && textarea.value.trim().length > 0) return true; | ||
| return false; | ||
| })() | ||
| `); | ||
| if (!hasContent.result.value) { | ||
| throw new Error("Prompt text not found in input - typing may have failed"); | ||
| } | ||
| // Strategy 1: Use Enter key (most reliable for Perplexity) | ||
| await cometClient.evaluate(` | ||
| (() => { | ||
| const el = document.querySelector('[contenteditable="true"]') || | ||
| document.querySelector('textarea'); | ||
| if (el) el.focus(); | ||
| })() | ||
| `); | ||
| await cometClient.pressKey("Enter"); | ||
| await new Promise(resolve => setTimeout(resolve, 500)); | ||
| // Check if submission worked | ||
| const submitted = await cometClient.evaluate(` | ||
| (() => { | ||
| const el = document.querySelector('[contenteditable="true"]'); | ||
| if (el && el.innerText.trim().length < 5) return true; | ||
| const hasLoading = document.querySelector('[class*="animate"]') !== null; | ||
| return hasLoading; | ||
| })() | ||
| `); | ||
| if (submitted.result.value) | ||
| return; | ||
| // Strategy 2: Click submit button | ||
| await cometClient.evaluate(` | ||
| (() => { | ||
| const selectors = [ | ||
@@ -133,21 +116,13 @@ 'button[aria-label*="Submit"]', | ||
| 'button[type="submit"]', | ||
| // Perplexity specific - arrow button near input | ||
| 'button:has(svg path[d*="M12"])', // Arrow icon paths often start with M12 | ||
| 'button:has(svg[class*="arrow"])', | ||
| 'button:has(svg[class*="send"])', | ||
| ]; | ||
| for (const sel of selectors) { | ||
| try { | ||
| const btn = document.querySelector(sel); | ||
| if (btn && !btn.disabled && btn.offsetParent !== null) { | ||
| btn.click(); | ||
| return { clicked: true, selector: sel, method: 'direct' }; | ||
| } | ||
| } catch (e) { | ||
| // :has() might not be supported, continue | ||
| const btn = document.querySelector(sel); | ||
| if (btn && !btn.disabled && btn.offsetParent !== null) { | ||
| btn.click(); | ||
| return true; | ||
| } | ||
| } | ||
| // Strategy 2: Find the submit button - rightmost button with arrow/send icon | ||
| // Find rightmost button with SVG near input | ||
| const inputEl = document.querySelector('[contenteditable="true"]') || | ||
@@ -165,15 +140,10 @@ document.querySelector('textarea'); | ||
| const ariaLabel = (btn.getAttribute('aria-label') || '').toLowerCase(); | ||
| const btnText = (btn.textContent || '').toLowerCase(); | ||
| // Skip: mode buttons, source/attach buttons, voice buttons | ||
| // Skip mode/attach/voice buttons | ||
| if (ariaLabel.includes('search') || ariaLabel.includes('research') || | ||
| ariaLabel.includes('labs') || ariaLabel.includes('learn') || | ||
| ariaLabel.includes('mode') || ariaLabel.includes('source') || | ||
| ariaLabel.includes('attach') || ariaLabel.includes('add') || | ||
| ariaLabel.includes('voice') || ariaLabel.includes('micro') || | ||
| ariaLabel.includes('record') || btnText === '+') { | ||
| ariaLabel.includes('attach') || ariaLabel.includes('voice')) { | ||
| continue; | ||
| } | ||
| // Must have SVG and be visible and to the right of input | ||
| if (btn.querySelector('svg') && btn.offsetParent !== null && | ||
@@ -187,168 +157,30 @@ btnRect.left > inputRect.left && btnRect.width > 0) { | ||
| // Click the rightmost candidate (submit is usually rightmost) | ||
| if (candidates.length > 0) { | ||
| candidates.sort((a, b) => b.right - a.right); | ||
| candidates[0].btn.click(); | ||
| return { clicked: true, selector: 'rightmost-button', method: 'traversal' }; | ||
| } | ||
| } | ||
| return { clicked: false }; | ||
| })() | ||
| `); | ||
| const clicked = clickResult.result.value?.clicked; | ||
| if (clicked) { | ||
| // Wait briefly to ensure click was processed | ||
| await new Promise(resolve => setTimeout(resolve, 100)); | ||
| return; | ||
| } | ||
| // Strategy 4: Use keyboard shortcuts | ||
| // First, ensure input is focused | ||
| await cometClient.evaluate(` | ||
| // Final check and retry with Enter if still not submitted | ||
| await new Promise(resolve => setTimeout(resolve, 500)); | ||
| const finalCheck = await cometClient.evaluate(` | ||
| (() => { | ||
| const el = document.querySelector('[contenteditable="true"]') || | ||
| document.querySelector('textarea'); | ||
| if (el) el.focus(); | ||
| const el = document.querySelector('[contenteditable="true"]'); | ||
| if (el && el.innerText.trim().length < 5) return true; | ||
| const hasLoading = document.querySelector('[class*="animate"]') !== null; | ||
| const hasProseContent = document.querySelectorAll('[class*="prose"]').length > 0; | ||
| return hasLoading || hasProseContent; | ||
| })() | ||
| `); | ||
| // Try Cmd/Ctrl + Enter (common submit shortcut) | ||
| try { | ||
| if (!finalCheck.result.value) { | ||
| // Last resort: try Enter one more time | ||
| await cometClient.pressKey("Enter"); | ||
| await new Promise(resolve => setTimeout(resolve, 100)); | ||
| } | ||
| catch { | ||
| // Fallback: dispatch keyboard event directly | ||
| await cometClient.evaluate(` | ||
| (() => { | ||
| const el = document.querySelector('[contenteditable="true"]') || | ||
| document.querySelector('textarea'); | ||
| if (el) { | ||
| el.dispatchEvent(new KeyboardEvent('keydown', { | ||
| key: 'Enter', | ||
| code: 'Enter', | ||
| keyCode: 13, | ||
| which: 13, | ||
| bubbles: true, | ||
| cancelable: true | ||
| })); | ||
| } | ||
| })() | ||
| `); | ||
| } | ||
| } | ||
| /** | ||
| * Check if Comet AI is currently processing/loading | ||
| */ | ||
| async isLoading() { | ||
| const loadingSelector = await this.findElement(SELECTORS.loading); | ||
| return loadingSelector !== null; | ||
| } | ||
| /** | ||
| * Wait for Comet AI to finish responding | ||
| */ | ||
| async waitForResponse(timeout = 30000) { | ||
| const startTime = Date.now(); | ||
| let lastText = ""; | ||
| let stableCount = 0; | ||
| // Wait for page to start loading response | ||
| await new Promise(resolve => setTimeout(resolve, 2000)); | ||
| while (Date.now() - startTime < timeout) { | ||
| // Get response text from Perplexity's answer area | ||
| const result = await cometClient.evaluate(` | ||
| (() => { | ||
| // Look for the main answer content | ||
| const proseEl = document.querySelector('[class*="prose"]'); | ||
| if (proseEl) return proseEl.innerText; | ||
| // Alternative: look for answer section | ||
| const mainText = document.body.innerText; | ||
| const answerMatch = mainText.match(/Reviewed \\d+ sources[\\s\\S]*?(?=Related|Ask a follow-up|$)/); | ||
| if (answerMatch) return answerMatch[0]; | ||
| return ""; | ||
| })() | ||
| `); | ||
| const currentText = result.result.value || ""; | ||
| // Check if response has stabilized (text same for 3 consecutive checks) | ||
| if (currentText.length > 10 && currentText === lastText) { | ||
| stableCount++; | ||
| if (stableCount >= 3) { | ||
| this.lastResponseText = currentText; | ||
| return { | ||
| text: currentText, | ||
| complete: true, | ||
| timestamp: Date.now(), | ||
| }; | ||
| } | ||
| } | ||
| else { | ||
| stableCount = 0; | ||
| } | ||
| lastText = currentText; | ||
| await new Promise(resolve => setTimeout(resolve, 500)); | ||
| } | ||
| // Timeout - return whatever we have | ||
| return { | ||
| text: lastText || "No response detected within timeout", | ||
| complete: false, | ||
| timestamp: Date.now(), | ||
| }; | ||
| } | ||
| /** | ||
| * Send prompt and wait for response | ||
| */ | ||
| async ask(prompt, timeout = 30000) { | ||
| await this.sendPrompt(prompt); | ||
| // Wait a bit for the response to start | ||
| await new Promise(resolve => setTimeout(resolve, 1000)); | ||
| return this.waitForResponse(timeout); | ||
| } | ||
| /** | ||
| * Get the current visible response text | ||
| */ | ||
| async getCurrentResponse() { | ||
| const responseSelector = await this.findElement(SELECTORS.response); | ||
| if (!responseSelector) { | ||
| // Try to get any visible text that looks like a response | ||
| const result = await cometClient.evaluate(` | ||
| // Look for the main content area | ||
| const contentAreas = document.querySelectorAll('main, article, [role="main"], .content'); | ||
| for (const area of contentAreas) { | ||
| if (area.innerText.length > 100) { | ||
| return area.innerText; | ||
| } | ||
| } | ||
| return document.body.innerText.substring(0, 5000); | ||
| `); | ||
| return result.result.value; | ||
| } | ||
| const result = await cometClient.evaluate(` | ||
| document.querySelector(${JSON.stringify(responseSelector)})?.innerText || "" | ||
| `); | ||
| return result.result.value; | ||
| } | ||
| /** | ||
| * Clear the current conversation/input | ||
| */ | ||
| async clearConversation() { | ||
| const result = await cometClient.evaluate(` | ||
| (function() { | ||
| const clearButtons = document.querySelectorAll( | ||
| 'button[aria-label*="Clear"], button[aria-label*="New"], [class*="clear"], [class*="new-chat"]' | ||
| ); | ||
| for (const btn of clearButtons) { | ||
| btn.click(); | ||
| return true; | ||
| } | ||
| return false; | ||
| })() | ||
| `); | ||
| return result.result.value; | ||
| } | ||
| /** | ||
| * Get current agent status and progress (for polling) | ||
| * Gets fresh data each time, extracts URL from actual browsing tab | ||
| */ | ||
| async getAgentStatus() { | ||
| // Get the actual browsing URL from the agent's tab (not from text parsing) | ||
| // Get browsing URL from agent's tab | ||
| let agentBrowsingUrl = ''; | ||
@@ -364,13 +196,10 @@ try { | ||
| } | ||
| // Get status from the current Perplexity page | ||
| const result = await cometClient.safeEvaluate(` | ||
| (() => { | ||
| // Force fresh read | ||
| const body = document.body.innerText; | ||
| // Check for ACTIVE stop button - multiple detection methods | ||
| // Check for active stop button | ||
| let hasActiveStopButton = false; | ||
| const stopButtons = document.querySelectorAll('button'); | ||
| for (const btn of stopButtons) { | ||
| const rect = btn.querySelector('rect'); // Square icon | ||
| for (const btn of document.querySelectorAll('button')) { | ||
| const rect = btn.querySelector('rect'); | ||
| const ariaLabel = (btn.getAttribute('aria-label') || '').toLowerCase(); | ||
@@ -384,22 +213,18 @@ if ((rect || ariaLabel.includes('stop')) && | ||
| // Check for animated loading indicators | ||
| const hasLoadingSpinner = document.querySelector('[class*="animate-spin"], [class*="animate-pulse"], .spinner') !== null; | ||
| // Check for completion indicators | ||
| const stepsCompletedMatch = body.match(/(\\d+) steps? completed/i); | ||
| const hasStepsCompleted = stepsCompletedMatch !== null; | ||
| // Check for "Finished" or "Reviewed N sources" | ||
| const hasLoadingSpinner = document.querySelector('[class*="animate-spin"], [class*="animate-pulse"]') !== null; | ||
| const hasStepsCompleted = /\\d+ steps? completed/i.test(body); | ||
| const hasFinishedMarker = body.includes('Finished') && !hasActiveStopButton; | ||
| const hasReviewedSources = /Reviewed \\d+ sources?/i.test(body); | ||
| const hasAskFollowUp = body.includes('Ask a follow-up'); | ||
| const hasProseContent = [...document.querySelectorAll('[class*="prose"]')].some( | ||
| el => el.innerText.trim().length > 0 | ||
| ); | ||
| // Working indicators | ||
| const workingPatterns = [ | ||
| 'Working…', 'Working...', 'Searching', 'Reviewing sources', | ||
| 'Preparing to assist', 'Clicking', 'Typing:', 'Navigating to', | ||
| 'Reading', 'Analyzing' | ||
| 'Working', 'Searching', 'Reviewing sources', 'Preparing to assist', | ||
| 'Clicking', 'Typing:', 'Navigating to', 'Reading', 'Analyzing' | ||
| ]; | ||
| const hasWorkingText = workingPatterns.some(p => body.includes(p)); | ||
| // Status determination | ||
| // Determine status | ||
| let status = 'idle'; | ||
@@ -414,67 +239,43 @@ if (hasActiveStopButton || hasLoadingSpinner) { | ||
| status = 'working'; | ||
| } else if (hasAskFollowUp && hasProseContent && !hasActiveStopButton) { | ||
| status = 'completed'; | ||
| } | ||
| // Extract agent steps | ||
| // Extract steps | ||
| const steps = []; | ||
| const stepPatterns = [ | ||
| /Preparing to assist[^\\n]*/g, | ||
| /Clicking[^\\n]*/g, | ||
| /Typing:[^\\n]*/g, | ||
| /Navigating[^\\n]*/g, | ||
| /Reading[^\\n]*/g, | ||
| /Searching[^\\n]*/g, | ||
| /Found[^\\n]*/g | ||
| /Preparing to assist[^\\n]*/g, /Clicking[^\\n]*/g, /Typing:[^\\n]*/g, | ||
| /Navigating[^\\n]*/g, /Reading[^\\n]*/g, /Searching[^\\n]*/g, /Found[^\\n]*/g | ||
| ]; | ||
| for (const pattern of stepPatterns) { | ||
| const matches = body.match(pattern); | ||
| if (matches) { | ||
| steps.push(...matches.map(s => s.trim().substring(0, 100))); | ||
| } | ||
| if (matches) steps.push(...matches.map(s => s.trim().substring(0, 100))); | ||
| } | ||
| const currentStep = steps.length > 0 ? steps[steps.length - 1] : ''; | ||
| // Extract response for completed status | ||
| // Extract response | ||
| let response = ''; | ||
| if (status === 'completed') { | ||
| // Strategy 1: Look for prose elements (main answer content) | ||
| // Take the LAST one - most recent answer in conversation | ||
| const proseEls = document.querySelectorAll('[class*="prose"]'); | ||
| for (let i = proseEls.length - 1; i >= 0; i--) { | ||
| const text = proseEls[i].innerText.trim(); | ||
| if (text.length > 5 && !text.startsWith('Related')) { | ||
| response = text; | ||
| break; | ||
| } | ||
| const mainContent = document.querySelector('main') || document.body; | ||
| const allProseEls = mainContent.querySelectorAll('[class*="prose"]'); | ||
| const validProseTexts = []; | ||
| for (const el of allProseEls) { | ||
| if (el.closest('nav, aside, header, footer, form')) continue; | ||
| const text = el.innerText.trim(); | ||
| const isUIText = ['Library', 'Discover', 'Spaces', 'Finance', 'Account', | ||
| 'Upgrade', 'Home', 'Search', 'Ask a follow-up'].some(ui => text.startsWith(ui)); | ||
| if (isUIText) continue; | ||
| if (text.endsWith('?') && text.length < 100) continue; | ||
| if (text.length > 5) validProseTexts.push(text); | ||
| } | ||
| // Strategy 2: Look for answer section by structure | ||
| if (!response) { | ||
| // Find the main content area after "Reviewed X sources" | ||
| const reviewedMatch = body.match(/Reviewed \\d+ sources?/); | ||
| if (reviewedMatch) { | ||
| const startIdx = body.indexOf(reviewedMatch[0]) + reviewedMatch[0].length; | ||
| const endMarkers = ['Related', 'Ask a follow-up', 'Ask anything', 'Share', 'Copy']; | ||
| let endIdx = body.length; | ||
| for (const marker of endMarkers) { | ||
| const idx = body.indexOf(marker, startIdx); | ||
| if (idx > startIdx && idx < endIdx) endIdx = idx; | ||
| } | ||
| response = body.substring(startIdx, endIdx).trim(); | ||
| } | ||
| if (validProseTexts.length > 0) { | ||
| response = validProseTexts[validProseTexts.length - 1]; | ||
| } | ||
| // Strategy 3: Fallback - extract after completion marker | ||
| if (!response || response.length < 5) { | ||
| const completionIdx = body.indexOf('steps completed'); | ||
| if (completionIdx > -1) { | ||
| const afterCompletion = body.substring(completionIdx + 15); | ||
| const endMarkers = ['Related', 'Ask a follow-up', 'Ask anything', 'Sources']; | ||
| let endIdx = afterCompletion.length; | ||
| for (const marker of endMarkers) { | ||
| const idx = afterCompletion.indexOf(marker); | ||
| if (idx > 0 && idx < endIdx) endIdx = idx; | ||
| } | ||
| response = afterCompletion.substring(0, endIdx).trim(); | ||
| } | ||
| // Clean up response | ||
| if (response) { | ||
| response = response.replace(/View All|Show more|Ask a follow-up|\\d+ sources?/gi, '').trim(); | ||
| response = response.replace(/\\s+/g, ' ').trim(); | ||
| } | ||
@@ -486,4 +287,4 @@ } | ||
| steps: [...new Set(steps)].slice(-5), | ||
| currentStep, | ||
| response: response.substring(0, 3000), | ||
| currentStep: steps.length > 0 ? steps[steps.length - 1] : '', | ||
| response: response.substring(0, 8000), | ||
| hasStopButton: hasActiveStopButton | ||
@@ -493,6 +294,5 @@ }; | ||
| `); | ||
| const evalResult = result.result.value; | ||
| return { | ||
| ...evalResult, | ||
| agentBrowsingUrl, // From actual tab, not text parsing | ||
| ...result.result.value, | ||
| agentBrowsingUrl, | ||
| }; | ||
@@ -506,15 +306,10 @@ } | ||
| (() => { | ||
| // Try to find and click stop/cancel button | ||
| const stopButtons = document.querySelectorAll( | ||
| 'button[aria-label*="Stop"], button[aria-label*="Cancel"], button[aria-label*="Pause"]' | ||
| ); | ||
| for (const btn of stopButtons) { | ||
| // Try aria-label buttons first | ||
| for (const btn of document.querySelectorAll('button[aria-label*="Stop"], button[aria-label*="Cancel"]')) { | ||
| btn.click(); | ||
| return true; | ||
| } | ||
| // Try finding a square stop icon button | ||
| const buttons = document.querySelectorAll('button'); | ||
| for (const btn of buttons) { | ||
| if (btn.querySelector('svg rect, svg[class*="stop"]')) { | ||
| // Try square stop icon | ||
| for (const btn of document.querySelectorAll('button')) { | ||
| if (btn.querySelector('svg rect')) { | ||
| btn.click(); | ||
@@ -524,3 +319,2 @@ return true; | ||
| } | ||
| return false; | ||
@@ -527,0 +321,0 @@ })() |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"comet-ai.js","sourceRoot":"","sources":["../src/comet-ai.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,wEAAwE;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,8CAA8C;AAC9C,MAAM,SAAS,GAAG;IAChB,kEAAkE;IAClE,KAAK,EAAE;QACL,0BAA0B;QAC1B,8BAA8B;QAC9B,iCAAiC;QACjC,UAAU;QACV,oBAAoB;KACrB;IACD,2CAA2C;IAC3C,QAAQ,EAAE;QACR,kBAAkB;QAClB,cAAc;QACd,yBAAyB;QACzB,mBAAmB;QACnB,qBAAqB;KACtB;IACD,8BAA8B;IAC9B,OAAO,EAAE;QACP,0BAA0B;QAC1B,oBAAoB;QACpB,qBAAqB;QACrB,UAAU;KACX;IACD,yDAAyD;IACzD,MAAM,EAAE;QACN,8BAA8B;QAC9B,4BAA4B;QAC5B,uBAAuB;QACvB,4BAA4B;KAC7B;CACF,CAAC;AAEF,MAAM,OAAO,OAAO;IACV,gBAAgB,GAAW,EAAE,CAAC;IAEtC;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,SAAmB;QACnC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;iCACf,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;OAClD,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjC,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB;QAMpB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEpE,wBAAwB;QACxB,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;;;;;;;;;KASjD,CAAC,CAAC;QAEH,OAAO;YACL,aAAa;YACb,gBAAgB;YAChB,QAAQ,EAAE,aAAa,KAAK,IAAI;YAChC,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,KAAe;SAChD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE9D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QAED,sEAAsE;QACtE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;;;;;;sDAMQ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;;;;;;;6BAO/C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;;;;;;KAM9C,CAAC,CAAC;QAEH,MAAM,KAAK,GAAI,MAAM,CAAC,MAAM,CAAC,KAA8B,EAAE,OAAO,CAAC;QACrE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QAED,oBAAoB;QACpB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAE1B,OAAO,iBAAiB,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IACvF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACxB,iDAAiD;QACjD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEvD,oEAAoE;QACpE,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsE9C,CAAC,CAAC;QAEH,MAAM,OAAO,GAAI,WAAW,CAAC,MAAM,CAAC,KAA+C,EAAE,OAAO,CAAC;QAE7F,IAAI,OAAO,EAAE,CAAC;YACZ,6CAA6C;YAC7C,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,qCAAqC;QACrC,iCAAiC;QACjC,MAAM,WAAW,CAAC,QAAQ,CAAC;;;;;;KAM1B,CAAC,CAAC;QAEH,gDAAgD;QAChD,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,6CAA6C;YAC7C,MAAM,WAAW,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;OAe1B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClE,OAAO,eAAe,KAAK,IAAI,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,UAAkB,KAAK;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,0CAA0C;QAC1C,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAExD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;YACxC,kDAAkD;YAClD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;;;;;;;;;;;;;OAazC,CAAC,CAAC;YAEH,MAAM,WAAW,GAAI,MAAM,CAAC,MAAM,CAAC,KAAgB,IAAI,EAAE,CAAC;YAE1D,wEAAwE;YACxE,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACxD,WAAW,EAAE,CAAC;gBACd,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;oBACrB,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;oBACpC,OAAO;wBACL,IAAI,EAAE,WAAW;wBACjB,QAAQ,EAAE,IAAI;wBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,CAAC,CAAC;YAClB,CAAC;YAED,QAAQ,GAAG,WAAW,CAAC;YACvB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,oCAAoC;QACpC,OAAO;YACL,IAAI,EAAE,QAAQ,IAAI,qCAAqC;YACvD,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,UAAkB,KAAK;QAC/C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE9B,uCAAuC;QACvC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAExD,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACtB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEpE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,yDAAyD;YACzD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;;;;;;;;;OASzC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,MAAM,CAAC,KAAe,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;+BACf,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;KAC1D,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,CAAC,KAAe,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;;;;;;;;;;;KAWzC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,CAAC,KAAgB,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc;QAQlB,2EAA2E;QAC3E,IAAI,gBAAgB,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,mBAAmB,EAAE,CAAC;YACrD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YAC5C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;QAED,8CAA8C;QAC9C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2H7C,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAMhC,CAAC;QAEF,OAAO;YACL,GAAG,UAAU;YACb,gBAAgB,EAAE,oCAAoC;SACvD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;KAsBzC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,CAAC,KAAgB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC"} | ||
| {"version":3,"file":"comet-ai.js","sourceRoot":"","sources":["../src/comet-ai.ts"],"names":[],"mappings":"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"} |
+116
-93
@@ -18,20 +18,3 @@ #!/usr/bin/env node | ||
| name: "comet_ask", | ||
| description: `Send a prompt to Comet/Perplexity and wait for the complete response (blocking). | ||
| WHEN TO USE COMET vs other tools: | ||
| - USE COMET for: tasks requiring real browser interaction (login walls, dynamic content, multi-step navigation, filling forms, clicking buttons, scraping live data from specific sites) | ||
| - USE COMET for: deep research that benefits from Perplexity's agentic browsing (comparing multiple sources, following links, comprehensive analysis) | ||
| - USE regular WebSearch/WebFetch for: simple factual queries, quick lookups, static content | ||
| IMPORTANT - Comet is for DOING, not just ASKING: | ||
| - DON'T ask "how to" questions → use WebSearch instead | ||
| - DO ask Comet to perform actions: "Go to X and do Y" | ||
| - Bad: "How do I generate a P8 key in App Store Connect?" | ||
| - Good: "Take over the browser, go to App Store Connect, navigate to In-App Purchase keys section" | ||
| PROMPTING TIPS: | ||
| - Give context and goals, not step-by-step instructions | ||
| - Example: "Research the pricing models of top 3 auth providers for a B2B SaaS" (good) | ||
| - Example: "Go to auth0.com, click pricing, then go to clerk.dev..." (less effective) | ||
| - Comet will figure out the best browsing strategy`, | ||
| description: "Send a prompt to Comet/Perplexity and wait for the complete response (blocking). Ideal for tasks requiring real browser interaction (login walls, dynamic content, filling forms) or deep research with agentic browsing.", | ||
| inputSchema: { | ||
@@ -41,4 +24,4 @@ type: "object", | ||
| prompt: { type: "string", description: "Question or task for Comet - focus on goals and context" }, | ||
| timeout: { type: "number", description: "Max wait time in ms (default: 300000 = 5 min)" }, | ||
| newChat: { type: "boolean", description: "Start a fresh conversation (default: false)" }, | ||
| timeout: { type: "number", description: "Max wait time in ms (default: 15000 = 15s)" }, | ||
| }, | ||
@@ -78,3 +61,3 @@ required: ["prompt"], | ||
| ]; | ||
| const server = new Server({ name: "comet-bridge", version: "2.0.0" }, { capabilities: { tools: {} } }); | ||
| const server = new Server({ name: "comet-bridge", version: "2.2.0" }, { capabilities: { tools: {} } }); | ||
| server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS })); | ||
@@ -117,83 +100,126 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { | ||
| case "comet_ask": { | ||
| const prompt = args?.prompt; | ||
| const timeout = args?.timeout || 300000; // Default 5 minutes | ||
| let prompt = args?.prompt; | ||
| const timeout = args?.timeout || 15000; // Default 15s, use poll for longer tasks | ||
| const newChat = args?.newChat || false; | ||
| // Start fresh conversation if requested, or navigate if not on Perplexity | ||
| const state = cometClient.currentState; | ||
| const isOnPerplexity = state.currentUrl?.includes('perplexity.ai'); | ||
| if (newChat || !isOnPerplexity) { | ||
| // Validate prompt | ||
| if (!prompt || prompt.trim().length === 0) { | ||
| return { content: [{ type: "text", text: "Error: prompt cannot be empty" }] }; | ||
| } | ||
| // Normalize prompt - convert markdown/bullets to natural text | ||
| prompt = prompt | ||
| .replace(/^[-*•]\s*/gm, '') // Remove bullet points | ||
| .replace(/\n+/g, ' ') // Collapse newlines to spaces | ||
| .replace(/\s+/g, ' ') // Collapse multiple spaces | ||
| .trim(); | ||
| // For newChat: full reset (same as comet_connect) to handle post-agentic state | ||
| if (newChat) { | ||
| // Clean up extra tabs (fixes CDP state after agentic browsing) | ||
| const targets = await cometClient.listTargets(); | ||
| const pageTabs = targets.filter(t => t.type === 'page'); | ||
| if (pageTabs.length > 1) { | ||
| for (let i = 1; i < pageTabs.length; i++) { | ||
| try { | ||
| await cometClient.closeTab(pageTabs[i].id); | ||
| } | ||
| catch { /* ignore */ } | ||
| } | ||
| } | ||
| // Fresh connect to remaining tab | ||
| const freshTargets = await cometClient.listTargets(); | ||
| const mainTab = freshTargets.find(t => t.type === 'page'); | ||
| if (mainTab) { | ||
| await cometClient.connect(mainTab.id); | ||
| } | ||
| // Navigate to Perplexity home | ||
| await cometClient.navigate("https://www.perplexity.ai/", true); | ||
| await new Promise(resolve => setTimeout(resolve, 1500)); // Wait for page load | ||
| await new Promise(resolve => setTimeout(resolve, 1500)); | ||
| } | ||
| else { | ||
| // Not newChat - just ensure we're on Perplexity | ||
| const tabs = await cometClient.listTabsCategorized(); | ||
| if (tabs.main) { | ||
| await cometClient.connect(tabs.main.id); | ||
| } | ||
| const urlResult = await cometClient.evaluate('window.location.href'); | ||
| const currentUrl = urlResult.result.value; | ||
| const isOnPerplexity = currentUrl?.includes('perplexity.ai'); | ||
| if (!isOnPerplexity) { | ||
| await cometClient.navigate("https://www.perplexity.ai/", true); | ||
| await new Promise(resolve => setTimeout(resolve, 2000)); | ||
| } | ||
| } | ||
| // Capture old response state BEFORE sending prompt (for follow-up detection) | ||
| const oldStateResult = await cometClient.evaluate(` | ||
| (() => { | ||
| const proseEls = document.querySelectorAll('[class*="prose"]'); | ||
| const lastProse = proseEls[proseEls.length - 1]; | ||
| return { | ||
| count: proseEls.length, | ||
| lastText: lastProse ? lastProse.innerText.substring(0, 100) : '' | ||
| }; | ||
| })() | ||
| `); | ||
| const oldState = oldStateResult.result.value; | ||
| // Send the prompt | ||
| await cometAI.sendPrompt(prompt); | ||
| // Wait for completion with polling - log progress to stderr in real-time | ||
| // Wait for completion | ||
| const startTime = Date.now(); | ||
| const progressLog = []; | ||
| const seenSteps = new Set(); | ||
| let lastUrl = ''; | ||
| let sawWorkingState = false; // Track if we've seen task actually start | ||
| const log = (msg) => { | ||
| const elapsed = Math.round((Date.now() - startTime) / 1000); | ||
| const line = `[comet ${elapsed}s] ${msg}`; | ||
| console.error(line); // stderr won't interfere with MCP protocol | ||
| progressLog.push(line); | ||
| }; | ||
| log('🚀 Task started'); | ||
| const stepsCollected = []; | ||
| let sawNewResponse = false; | ||
| while (Date.now() - startTime < timeout) { | ||
| await new Promise(resolve => setTimeout(resolve, 2000)); // Poll every 2s | ||
| // Check if we have a NEW response (more prose elements or different text) | ||
| const currentStateResult = await cometClient.evaluate(` | ||
| (() => { | ||
| const proseEls = document.querySelectorAll('[class*="prose"]'); | ||
| const lastProse = proseEls[proseEls.length - 1]; | ||
| return { | ||
| count: proseEls.length, | ||
| lastText: lastProse ? lastProse.innerText.substring(0, 100) : '' | ||
| }; | ||
| })() | ||
| `); | ||
| const currentState = currentStateResult.result.value; | ||
| // Detect new response | ||
| if (!sawNewResponse) { | ||
| if (currentState.count > oldState.count || | ||
| (currentState.lastText && currentState.lastText !== oldState.lastText)) { | ||
| sawNewResponse = true; | ||
| } | ||
| } | ||
| const status = await cometAI.getAgentStatus(); | ||
| // Log new steps we haven't seen | ||
| // Collect steps | ||
| for (const step of status.steps) { | ||
| if (!seenSteps.has(step)) { | ||
| seenSteps.add(step); | ||
| log(`📋 ${step}`); | ||
| if (!stepsCollected.includes(step)) { | ||
| stepsCollected.push(step); | ||
| } | ||
| } | ||
| // Log URL changes during agentic browsing | ||
| if (status.agentBrowsingUrl && status.agentBrowsingUrl !== lastUrl) { | ||
| lastUrl = status.agentBrowsingUrl; | ||
| log(`🌐 ${lastUrl}`); | ||
| // Task completed - return result directly (but only if we saw a NEW response) | ||
| if (status.status === 'completed' && sawNewResponse) { | ||
| return { content: [{ type: "text", text: status.response || 'Task completed (no response text extracted)' }] }; | ||
| } | ||
| // Track if task has actually started (working state) | ||
| if (status.status === 'working') { | ||
| if (!sawWorkingState) { | ||
| sawWorkingState = true; | ||
| log('⚙️ Task processing...'); | ||
| } | ||
| if (status.currentStep && !progressLog[progressLog.length - 1]?.includes(status.currentStep)) { | ||
| log(`⏳ ${status.currentStep}`); | ||
| } | ||
| } | ||
| // Only accept "completed" if we've seen the task actually start | ||
| // This prevents returning stale responses from previous queries | ||
| if (status.status === 'completed' && sawWorkingState) { | ||
| log('✅ Task completed'); | ||
| let output = status.response || 'Task completed (no response text extracted)'; | ||
| return { content: [{ type: "text", text: output }] }; | ||
| } | ||
| // If still showing "completed" but we haven't seen "working" yet, | ||
| // it's the old response - wait for new task to start | ||
| if (status.status === 'completed' && !sawWorkingState) { | ||
| // Check if it's been too long without seeing working state (maybe simple query) | ||
| const elapsed = Date.now() - startTime; | ||
| if (elapsed > 10000) { | ||
| // After 10s, if still showing completed, accept it | ||
| log('✅ Task completed (quick response)'); | ||
| let output = status.response || 'Task completed (no response text extracted)'; | ||
| return { content: [{ type: "text", text: output }] }; | ||
| } | ||
| } | ||
| } | ||
| // Timeout | ||
| log('⏰ Timeout'); | ||
| return { | ||
| content: [{ | ||
| type: "text", | ||
| text: `Timeout after ${timeout / 1000}s.\n\nProgress:\n${progressLog.join('\n')}\n\nUse comet_poll to check if still working.`, | ||
| }], | ||
| }; | ||
| // Still working after initial wait - return "in progress" (non-blocking) | ||
| const finalStatus = await cometAI.getAgentStatus(); | ||
| let inProgressMsg = `Task in progress (${stepsCollected.length} steps so far).\n`; | ||
| inProgressMsg += `Status: ${finalStatus.status.toUpperCase()}\n`; | ||
| if (finalStatus.currentStep) { | ||
| inProgressMsg += `Current: ${finalStatus.currentStep}\n`; | ||
| } | ||
| if (finalStatus.agentBrowsingUrl) { | ||
| inProgressMsg += `Browsing: ${finalStatus.agentBrowsingUrl}\n`; | ||
| } | ||
| if (stepsCollected.length > 0) { | ||
| inProgressMsg += `\nSteps:\n${stepsCollected.map(s => ` • ${s}`).join('\n')}\n`; | ||
| } | ||
| inProgressMsg += `\nUse comet_poll to check progress or comet_stop to cancel.`; | ||
| return { content: [{ type: "text", text: inProgressMsg }] }; | ||
| } | ||
| case "comet_poll": { | ||
| const status = await cometAI.getAgentStatus(); | ||
| // If completed, return the response directly (most useful case) | ||
| if (status.status === 'completed' && status.response) { | ||
| return { content: [{ type: "text", text: status.response }] }; | ||
| } | ||
| // Still working - return progress info | ||
| let output = `Status: ${status.status.toUpperCase()}\n`; | ||
@@ -203,14 +229,11 @@ if (status.agentBrowsingUrl) { | ||
| } | ||
| if (status.currentStep) { | ||
| output += `Current: ${status.currentStep}\n`; | ||
| } | ||
| if (status.steps.length > 0) { | ||
| output += `\nRecent steps:\n${status.steps.map(s => ` • ${s}`).join('\n')}\n`; | ||
| output += `\nSteps:\n${status.steps.map(s => ` • ${s}`).join('\n')}\n`; | ||
| } | ||
| if (status.currentStep && status.status === 'working') { | ||
| output += `\nCurrent: ${status.currentStep}\n`; | ||
| if (status.status === 'working') { | ||
| output += `\n[Use comet_stop to interrupt, or comet_screenshot to see current page]`; | ||
| } | ||
| if (status.status === 'completed' && status.response) { | ||
| output += `\n--- Response ---\n${status.response}\n`; | ||
| } | ||
| else if (status.status === 'working' && status.hasStopButton) { | ||
| output += `\n[Agent is working - use comet_stop to interrupt if needed]`; | ||
| } | ||
| return { content: [{ type: "text", text: output }] }; | ||
@@ -217,0 +240,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
+0
-5
@@ -45,7 +45,2 @@ export interface CDPTarget { | ||
| } | ||
| export interface CometAIResponse { | ||
| text: string; | ||
| complete: boolean; | ||
| timestamp: number; | ||
| } | ||
| //# sourceMappingURL=types.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,gBAAgB,CAAC,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE;YACV,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"} | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,gBAAgB,CAAC,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE;YACV,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"} |
+3
-3
| { | ||
| "name": "comet-mcp", | ||
| "version": "2.1.0", | ||
| "version": "2.2.0", | ||
| "description": "MCP Server that gives Claude Code superpowers with Perplexity Comet browser - agentic web browsing, deep research, and real-time monitoring", | ||
@@ -8,3 +8,3 @@ "type": "module", | ||
| "bin": { | ||
| "comet-mcp": "./dist/index.js" | ||
| "comet-mcp": "dist/index.js" | ||
| }, | ||
@@ -38,3 +38,3 @@ "files": [ | ||
| "type": "git", | ||
| "url": "https://github.com/hanzili/comet-mcp" | ||
| "url": "git+https://github.com/hanzili/comet-mcp.git" | ||
| }, | ||
@@ -41,0 +41,0 @@ "homepage": "https://github.com/hanzili/comet-mcp#readme", |
+38
-96
| # comet-mcp | ||
| [](https://www.npmjs.com/package/comet-mcp) | ||
| <a href="https://glama.ai/mcp/servers/@hanzili/comet-mcp"> | ||
| <img width="380" height="200" src="https://glama.ai/mcp/servers/@hanzili/comet-mcp/badge" /> | ||
| </a> | ||
| **Give Claude Code a browser that thinks.** | ||
@@ -7,14 +13,21 @@ | ||
| <!--  --> | ||
|  | ||
| ## Why? | ||
| Claude Code is powerful, but it can't browse the web autonomously. Comet can browse, research, and execute multi-step web tasks - but it's isolated in a browser. | ||
| Existing web tools for Claude Code fall into two categories, both with limitations: | ||
| **comet-mcp bridges them.** Now Claude can: | ||
| - Delegate web research to Comet's agentic browser | ||
| - Monitor browsing progress in real-time | ||
| - Intervene if tasks go off track | ||
| - Get comprehensive research reports | ||
| ### 1. Search APIs (Tavily, Perplexity API, WebFetch) | ||
| Return static text. No interaction, no login, no dynamic content. Great for quick lookups, but can't navigate complex sites or fill forms. | ||
| ### 2. Browser Automation (browser-use, Puppeteer MCP, Playwright MCP) | ||
| Can interact with pages, but use a **one-agent-do-all** approach: the same reasoning model that's writing your code is also deciding where to click, what to type, and how to navigate. This overwhelms the context window and fragments focus. | ||
| ### 3. Comet MCP: Multi-Agent Delegation | ||
| **Comet MCP takes a different approach.** Instead of Claude controlling a browser directly, it delegates to [Perplexity Comet](https://www.perplexity.ai/comet) - an AI purpose-built for web research and browsing. | ||
| - **Claude** stays focused on your coding task | ||
| - **Comet** handles the browsing: navigation, login walls, dynamic content, deep research | ||
| - **Result**: Claude's coding intelligence + Perplexity's web intelligence, working together | ||
| ## Quick Start | ||
@@ -24,3 +37,3 @@ | ||
| Add to `~/.claude.json` (scope: user) or `.mcp.json` (scope: project): | ||
| Add to `~/.claude.json` or `.mcp.json`: | ||
@@ -38,29 +51,8 @@ ```json | ||
| Or install globally first: | ||
| ### 2. Install Comet Browser | ||
| ```bash | ||
| npm install -g comet-mcp | ||
| ``` | ||
| Download and install [Perplexity Comet](https://www.perplexity.ai/comet). | ||
| Then use: | ||
| That's it! The MCP server automatically launches Comet with remote debugging when needed. | ||
| ```json | ||
| { | ||
| "mcpServers": { | ||
| "comet-bridge": { | ||
| "command": "comet-mcp" | ||
| } | ||
| } | ||
| } | ||
| ``` | ||
| ### 2. Start Comet Browser | ||
| Download [Perplexity Comet](https://www.perplexity.ai/comet) and launch with remote debugging: | ||
| ```bash | ||
| # macOS | ||
| /Applications/Comet.app/Contents/MacOS/Comet --remote-debugging-port=9222 | ||
| ``` | ||
| ### 3. Use in Claude Code | ||
@@ -70,6 +62,9 @@ | ||
| You: "Use Comet to research the top AI frameworks in 2025" | ||
| Claude: [connects to Comet, delegates research, monitors progress, returns results] | ||
| Claude: [delegates to Comet, monitors progress, returns results] | ||
| You: "Log into my GitHub and check my notifications" | ||
| Claude: [Comet handles the login flow and navigation] | ||
| ``` | ||
| ## Tools (6) | ||
| ## Tools | ||
@@ -79,67 +74,17 @@ | Tool | Description | | ||
| | `comet_connect` | Connect to Comet (auto-starts if needed) | | ||
| | `comet_ask` | Send a task to Comet (non-blocking) | | ||
| | `comet_poll` | Check task progress and get results | | ||
| | `comet_stop` | Stop current task if off-track | | ||
| | `comet_ask` | Send a task and wait for response | | ||
| | `comet_poll` | Check progress on long-running tasks | | ||
| | `comet_stop` | Stop current task | | ||
| | `comet_screenshot` | Capture current page | | ||
| | `comet_mode` | Switch modes: search, research, labs, learn | | ||
| ## Modes | ||
| ## How It Works | ||
| | Mode | Best For | | ||
| |------|----------| | ||
| | `search` | Quick web searches | | ||
| | `research` | Deep, comprehensive analysis | | ||
| | `labs` | Data visualization & analytics | | ||
| | `learn` | Educational explanations | | ||
| ## Prompting Tips | ||
| When sending tasks to Comet via `comet_ask`, focus on **context and goals** rather than step-by-step instructions: | ||
| **Good prompts:** | ||
| ``` | ||
| "I need to find the best React state management libraries for a large-scale app. | ||
| Compare their bundle sizes, learning curves, and community support." | ||
| "Help me understand how Stripe's pricing API works. I'm building a SaaS | ||
| and need to implement usage-based billing." | ||
| Claude Code → MCP Server → CDP → Comet Browser → Perplexity AI | ||
| (reasoning) (bridge) (web browsing) | ||
| ``` | ||
| **Less effective prompts:** | ||
| ``` | ||
| "Go to google.com, search for React state management, click the first result..." | ||
| ``` | ||
| Claude sends high-level goals ("research X", "log into Y"). Comet figures out the clicks, scrolls, and searches. Results flow back to Claude. | ||
| Claude understands the task context; Comet handles the browsing. Let them collaborate - Comet will figure out the best way to navigate and gather information. | ||
| ## Example Workflow | ||
| ``` | ||
| # Claude Code conversation | ||
| You: Find the top 3 trending Python repos on GitHub | ||
| Claude: I'll use Comet to browse GitHub directly. | ||
| [comet_connect] → Connected to Perplexity | ||
| [comet_mode research] → Switched to research mode | ||
| [comet_ask "Find top 3 trending Python repos on GitHub today with their star counts"] → Task sent | ||
| [comet_poll] → Status: WORKING, Navigating to github.com/trending... | ||
| [comet_poll] → Status: WORKING, Filtering by Python... | ||
| [comet_poll] → Status: COMPLETED | ||
| Results: | ||
| 1. project-a - 2.3k stars today | ||
| 2. project-b - 1.8k stars today | ||
| 3. project-c - 1.2k stars today | ||
| ``` | ||
| ## Architecture | ||
| ``` | ||
| Claude Code ←→ MCP Protocol ←→ comet-mcp ←→ Chrome DevTools Protocol ←→ Comet Browser | ||
| ↓ | ||
| Perplexity AI (agentic browsing) | ||
| ``` | ||
| ## Requirements | ||
@@ -149,3 +94,3 @@ | ||
| - [Perplexity Comet Browser](https://www.perplexity.ai/comet) | ||
| - Claude Code (or any MCP-compatible client) | ||
| - Claude Code (or any MCP client) | ||
@@ -155,3 +100,3 @@ ## Troubleshooting | ||
| **"Cannot connect to Comet"** | ||
| - Make sure Comet is running with `--remote-debugging-port=9222` | ||
| - Ensure Comet is installed at `/Applications/Comet.app` | ||
| - Check if port 9222 is available | ||
@@ -161,3 +106,2 @@ | ||
| - Restart Claude Code after config changes | ||
| - Verify `~/.mcp.json` syntax | ||
@@ -170,4 +114,2 @@ ## License | ||
| **Built for the Claude Code community.** | ||
| [Report Issues](https://github.com/hanzili/comet-mcp/issues) · [Contribute](https://github.com/hanzili/comet-mcp) |
| #!/usr/bin/env node | ||
| export {}; | ||
| //# sourceMappingURL=test-cdp.d.ts.map |
| {"version":3,"file":"test-cdp.d.ts","sourceRoot":"","sources":["../src/test-cdp.ts"],"names":[],"mappings":""} |
| #!/usr/bin/env node | ||
| // Test script to verify CDP connection to Comet browser | ||
| // Run: npx ts-node src/test-cdp.ts | ||
| const PORT = 9222; | ||
| async function testCDP() { | ||
| console.log("Testing CDP connection to Comet browser...\n"); | ||
| // Test 1: Check if Comet is running with debugging enabled | ||
| console.log("1. Checking if Comet is accessible on port", PORT); | ||
| try { | ||
| const versionResponse = await fetch(`http://localhost:${PORT}/json/version`); | ||
| if (!versionResponse.ok) { | ||
| throw new Error(`HTTP ${versionResponse.status}`); | ||
| } | ||
| const version = await versionResponse.json(); | ||
| console.log(" ✓ Connected!"); | ||
| console.log(" Browser:", version.Browser); | ||
| console.log(" Protocol:", version["Protocol-Version"]); | ||
| console.log(" WebSocket:", version.webSocketDebuggerUrl); | ||
| } | ||
| catch (error) { | ||
| console.log(" ✗ Failed to connect"); | ||
| console.log(" Error:", error instanceof Error ? error.message : error); | ||
| console.log("\n To start Comet with debugging:"); | ||
| console.log(" pkill -f Comet"); | ||
| console.log(` /Applications/Comet.app/Contents/MacOS/Comet --remote-debugging-port=${PORT}`); | ||
| process.exit(1); | ||
| } | ||
| // Test 2: List available targets | ||
| console.log("\n2. Listing available tabs/targets"); | ||
| try { | ||
| const listResponse = await fetch(`http://localhost:${PORT}/json/list`); | ||
| const targets = await listResponse.json(); | ||
| console.log(` ✓ Found ${targets.length} target(s)`); | ||
| for (const target of targets) { | ||
| console.log(`\n [${target.type}] ${target.title || "(no title)"}`); | ||
| console.log(` URL: ${target.url}`); | ||
| console.log(` ID: ${target.id}`); | ||
| } | ||
| } | ||
| catch (error) { | ||
| console.log(" ✗ Failed to list targets"); | ||
| console.log(" Error:", error instanceof Error ? error.message : error); | ||
| } | ||
| // Test 3: Try to connect via WebSocket | ||
| console.log("\n3. Testing WebSocket connection"); | ||
| try { | ||
| const CDP = (await import("chrome-remote-interface")).default; | ||
| const client = await CDP({ port: PORT }); | ||
| // Enable Page domain | ||
| await client.Page.enable(); | ||
| await client.Runtime.enable(); | ||
| // Get current URL | ||
| const { result } = await client.Runtime.evaluate({ | ||
| expression: "window.location.href", | ||
| }); | ||
| console.log(" ✓ WebSocket connected!"); | ||
| console.log(" Current URL:", result.value); | ||
| // Get page title | ||
| const titleResult = await client.Runtime.evaluate({ | ||
| expression: "document.title", | ||
| }); | ||
| console.log(" Page Title:", titleResult.result.value); | ||
| await client.close(); | ||
| } | ||
| catch (error) { | ||
| console.log(" ✗ WebSocket connection failed"); | ||
| console.log(" Error:", error instanceof Error ? error.message : error); | ||
| } | ||
| console.log("\n✓ CDP test complete!"); | ||
| } | ||
| testCDP().catch((error) => { | ||
| console.error("Test failed:", error); | ||
| process.exit(1); | ||
| }); | ||
| export {}; | ||
| //# sourceMappingURL=test-cdp.js.map |
| {"version":3,"file":"test-cdp.js","sourceRoot":"","sources":["../src/test-cdp.ts"],"names":[],"mappings":"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"} |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
3
-25%7
-22.22%82775
-27.84%19
-17.39%1192
-32.23%107
-35.15%