@rallycry/conveyor-agent 7.0.1 → 7.0.2

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runner/file-cache.ts","../src/debug/cdp-client.ts","../src/debug/playwright-types.ts","../src/debug/playwright-client.ts","../src/debug/debug-manager.ts","../src/debug/lifecycle-manager.ts","../src/debug/hypothesis-tracker.ts","../src/setup/config.ts","../src/setup/codespace.ts"],"sourcesContent":["/**\n * 50 MB default max cache size.\n * 1 hour default TTL.\n */\nconst DEFAULT_MAX_SIZE_BYTES = 50 * 1024 * 1024;\nconst DEFAULT_TTL_MS = 60 * 60 * 1000;\n\ninterface CacheEntry {\n content: Buffer;\n mimeType: string;\n fileName: string;\n createdAt: number;\n size: number;\n}\n\nexport class FileCache {\n private cache = new Map<string, CacheEntry>();\n private currentSize = 0;\n private readonly maxSizeBytes: number;\n private readonly ttlMs: number;\n\n constructor(maxSizeBytes = DEFAULT_MAX_SIZE_BYTES, ttlMs = DEFAULT_TTL_MS) {\n this.maxSizeBytes = maxSizeBytes;\n this.ttlMs = ttlMs;\n }\n\n get(fileId: string): CacheEntry | null {\n const entry = this.cache.get(fileId);\n if (!entry) return null;\n\n if (Date.now() - entry.createdAt > this.ttlMs) {\n this.delete(fileId);\n return null;\n }\n\n this.cache.delete(fileId);\n this.cache.set(fileId, entry);\n return entry;\n }\n\n set(fileId: string, content: Buffer, mimeType: string, fileName: string): void {\n if (this.cache.has(fileId)) {\n this.delete(fileId);\n }\n\n const size = content.byteLength;\n if (size > this.maxSizeBytes) return;\n\n while (this.currentSize + size > this.maxSizeBytes && this.cache.size > 0) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.delete(oldestKey);\n }\n }\n\n this.cache.set(fileId, {\n content,\n mimeType,\n fileName,\n createdAt: Date.now(),\n size,\n });\n this.currentSize += size;\n }\n\n private delete(fileId: string): void {\n const entry = this.cache.get(fileId);\n if (entry) {\n this.currentSize -= entry.size;\n this.cache.delete(fileId);\n }\n }\n\n clear(): void {\n this.cache.clear();\n this.currentSize = 0;\n }\n\n get stats(): { entries: number; sizeBytes: number; maxSizeBytes: number } {\n return {\n entries: this.cache.size,\n sizeBytes: this.currentSize,\n maxSizeBytes: this.maxSizeBytes,\n };\n }\n}\n","// ── CDP Protocol Types ─────────────────────────────────────────────────────\n\ninterface CdpRequest {\n id: number;\n method: string;\n params?: Record<string, unknown>;\n}\n\ninterface CdpResponse {\n id: number;\n result?: Record<string, unknown>;\n error?: { code: number; message: string };\n}\n\ninterface CdpEvent {\n method: string;\n params?: Record<string, unknown>;\n}\n\ninterface CdpCallFrame {\n callFrameId: string;\n functionName: string;\n location: { scriptId: string; lineNumber: number; columnNumber: number };\n url: string;\n scopeChain: CdpScope[];\n}\n\ninterface CdpScope {\n type: string;\n object: { objectId?: string };\n name?: string;\n}\n\ninterface CdpRemoteObject {\n type: string;\n subtype?: string;\n value?: unknown;\n description?: string;\n objectId?: string;\n}\n\ninterface CdpPropertyDescriptor {\n name: string;\n value?: CdpRemoteObject;\n configurable: boolean;\n enumerable: boolean;\n}\n\n// ── Public Types ───────────────────────────────────────────────────────────\n\nexport interface BreakpointInfo {\n breakpointId: string;\n file: string;\n line: number;\n condition?: string;\n}\n\nexport interface ProbeInfo {\n probeId: string;\n breakpointId: string;\n file: string;\n line: number;\n expressions: string[];\n label: string;\n}\n\nexport interface ProbeHit {\n label: string;\n data: Record<string, unknown>;\n timestamp: number;\n}\n\nexport interface CallFrameInfo {\n index: number;\n functionName: string;\n file: string;\n line: number;\n column: number;\n callFrameId: string;\n}\n\nexport interface ScopeVariable {\n name: string;\n type: string;\n value: string;\n}\n\nexport interface PausedState {\n callFrames: CallFrameInfo[];\n reason: string;\n hitBreakpoints?: string[];\n}\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\nconst MAX_VARIABLE_VALUE_BYTES = 2048;\nconst MAX_VARIABLES_PER_SCOPE = 50;\nconst AUTO_RESUME_TIMEOUT_MS = 30_000;\nconst PROBE_BUFFER_MAX_SIZE = 1000;\n\n// ── Protocol Types ────────────────────────────────────────────────────────\n\nexport type InspectorProtocol = \"cdp\" | \"webkit\";\n\n// ── CDP Client ─────────────────────────────────────────────────────────────\n\nexport class CdpDebugClient {\n private ws: WebSocket | null = null;\n private requestId = 0;\n private pendingRequests = new Map<\n number,\n { resolve: (value: Record<string, unknown>) => void; reject: (err: Error) => void }\n >();\n private breakpoints = new Map<string, BreakpointInfo>();\n private probes = new Map<string, ProbeInfo>();\n private probeCounter = 0;\n private probeBufferInjected = false;\n private pausedState: PausedState | null = null;\n private autoResumeTimer: ReturnType<typeof setTimeout> | null = null;\n private protocol: InspectorProtocol = \"cdp\";\n\n private onPausedCallback: ((state: PausedState) => void) | null = null;\n private onResumedCallback: (() => void) | null = null;\n private onAutoResumedCallback: (() => void) | null = null;\n\n // ── Connection ─────────────────────────────────────────────────────────\n\n // oxlint-disable-next-line require-await\n async connect(wsUrl: string, protocol?: InspectorProtocol): Promise<void> {\n if (this.ws) {\n throw new Error(\"Already connected to CDP\");\n }\n this.protocol = protocol ?? \"cdp\";\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(wsUrl);\n\n ws.addEventListener(\"open\", async () => {\n this.ws = ws;\n try {\n await this.send(\"Debugger.enable\", {});\n await this.send(\"Runtime.enable\", {});\n resolve();\n } catch (err) {\n reject(err);\n }\n });\n\n ws.addEventListener(\"message\", (event: MessageEvent) => {\n const data = typeof event.data === \"string\" ? event.data : String(event.data);\n this.handleMessage(data);\n });\n\n ws.addEventListener(\"error\", () => {\n reject(new Error(`CDP WebSocket connection failed: ${wsUrl}`));\n });\n\n ws.addEventListener(\"close\", () => {\n this.cleanup();\n });\n });\n }\n\n disconnect(): void {\n if (this.ws) {\n this.clearAutoResumeTimer();\n this.ws.close();\n this.cleanup();\n }\n }\n\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n getProtocol(): InspectorProtocol {\n return this.protocol;\n }\n\n // ── Breakpoints ────────────────────────────────────────────────────────\n\n async setBreakpoint(file: string, line: number, condition?: string): Promise<string> {\n const params: Record<string, unknown> = {\n urlRegex: this.fileToUrlRegex(file),\n // CDP uses 0-based lines\n lineNumber: line - 1,\n };\n if (condition) {\n params.condition = condition;\n }\n\n const result = await this.send(\"Debugger.setBreakpointByUrl\", params);\n const breakpointId = result.breakpointId as string;\n\n this.breakpoints.set(breakpointId, { breakpointId, file, line, condition });\n return breakpointId;\n }\n\n async removeBreakpoint(breakpointId: string): Promise<void> {\n await this.send(\"Debugger.removeBreakpoint\", { breakpointId });\n this.breakpoints.delete(breakpointId);\n }\n\n async removeAllBreakpoints(): Promise<void> {\n const ids = [...this.breakpoints.keys()];\n for (const id of ids) {\n try {\n await this.removeBreakpoint(id);\n } catch {\n // Best-effort removal\n this.breakpoints.delete(id);\n }\n }\n }\n\n listBreakpoints(): BreakpointInfo[] {\n return [...this.breakpoints.values()];\n }\n\n // ── Probes (Logpoints) ────────────────────────────────────────────────\n\n async setLogpoint(\n file: string,\n line: number,\n expressions: string[],\n label?: string,\n ): Promise<string> {\n await this.ensureProbeBuffer();\n\n const probeId = `probe-${++this.probeCounter}`;\n const probeLabel = label ?? `${file}:${line}`;\n\n // Build the condition expression: captures each expression into a data object,\n // calls the probe buffer, and always returns false so execution never pauses.\n const dataEntries = expressions.map((expr) => `${JSON.stringify(expr)}: (${expr})`).join(\", \");\n const condition = `(globalThis.__conveyorProbes?.probe(${JSON.stringify(probeLabel)}, {${dataEntries}}), false)`;\n\n const breakpointId = await this.setBreakpoint(file, line, condition);\n\n const probe: ProbeInfo = { probeId, breakpointId, file, line, expressions, label: probeLabel };\n this.probes.set(probeId, probe);\n return probeId;\n }\n\n async removeProbe(probeId: string): Promise<void> {\n const probe = this.probes.get(probeId);\n if (!probe) {\n throw new Error(`Probe ${probeId} not found`);\n }\n await this.removeBreakpoint(probe.breakpointId);\n this.probes.delete(probeId);\n }\n\n listProbes(): ProbeInfo[] {\n return [...this.probes.values()];\n }\n\n async getProbeResults(label?: string, limit?: number): Promise<ProbeHit[]> {\n const args = [\n label === undefined ? \"undefined\" : JSON.stringify(label),\n limit === undefined ? \"undefined\" : String(limit),\n ].join(\", \");\n\n const result = await this.evaluate(\n `JSON.stringify(globalThis.__conveyorProbes?.read(${args}) ?? [])`,\n );\n\n if (result.type === \"error\") {\n return [];\n }\n\n try {\n // The value comes back as a JSON-encoded string (with quotes around it)\n const raw = result.value;\n const parsed = JSON.parse(raw.startsWith('\"') ? JSON.parse(raw) : raw);\n return parsed as ProbeHit[];\n } catch {\n return [];\n }\n }\n\n async clearProbeResults(label?: string): Promise<void> {\n const arg = label === undefined ? \"undefined\" : JSON.stringify(label);\n await this.evaluate(`(globalThis.__conveyorProbes?.clear(${arg}), undefined)`);\n }\n\n // ── Paused State ───────────────────────────────────────────────────────\n\n isPaused(): boolean {\n return this.pausedState !== null;\n }\n\n getPausedState(): PausedState | null {\n return this.pausedState;\n }\n\n getCallStack(): CallFrameInfo[] {\n return this.pausedState?.callFrames ?? [];\n }\n\n async getScopeVariables(callFrameId: string): Promise<ScopeVariable[]> {\n if (!this.pausedState) {\n throw new Error(\"Debugger is not paused\");\n }\n\n const frame = this.pausedState.callFrames.find((f) => f.callFrameId === callFrameId);\n if (!frame) {\n throw new Error(`Call frame ${callFrameId} not found`);\n }\n\n // Re-fetch scope chain from CDP by finding the original callFrames data\n // We need to use the callFrameId to evaluate and get scope objects\n const result = await this.send(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression: \"this\",\n returnByValue: false,\n });\n\n // Get local scope variables via the scope chain\n // We'll evaluate a special expression to gather locals\n const variables: ScopeVariable[] = [];\n\n try {\n const scopeResult = await this.send(\"Runtime.getProperties\", {\n objectId: (result.result as CdpRemoteObject)?.objectId,\n ownProperties: true,\n generatePreview: false,\n });\n\n const descriptors = (scopeResult.result as CdpPropertyDescriptor[]) ?? [];\n for (const desc of descriptors.slice(0, MAX_VARIABLES_PER_SCOPE)) {\n if (desc.value) {\n variables.push({\n name: desc.name,\n type: desc.value.type,\n value: this.truncateValue(this.formatRemoteObject(desc.value)),\n });\n }\n }\n } catch {\n // If scope inspection fails, return what we have\n }\n\n return variables;\n }\n\n // ── Execution Control ──────────────────────────────────────────────────\n\n async resume(): Promise<void> {\n this.clearAutoResumeTimer();\n await this.send(\"Debugger.resume\", {});\n this.pausedState = null;\n }\n\n async stepOver(): Promise<void> {\n this.clearAutoResumeTimer();\n await this.send(\"Debugger.stepOver\", {});\n }\n\n async stepInto(): Promise<void> {\n this.clearAutoResumeTimer();\n await this.send(\"Debugger.stepInto\", {});\n }\n\n // ── Evaluation ─────────────────────────────────────────────────────────\n\n async evaluate(\n expression: string,\n callFrameId?: string,\n ): Promise<{ type: string; value: string }> {\n let result: Record<string, unknown>;\n\n if (callFrameId && this.pausedState) {\n result = await this.send(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression,\n returnByValue: false,\n generatePreview: true,\n });\n } else {\n result = await this.send(\"Runtime.evaluate\", {\n expression,\n returnByValue: false,\n generatePreview: true,\n });\n }\n\n const remoteObj = result.result as CdpRemoteObject;\n const errorValue = this.extractEvalError(result, remoteObj);\n if (errorValue !== null) {\n return { type: \"error\", value: errorValue };\n }\n\n return {\n type: remoteObj?.type ?? \"undefined\",\n value: this.truncateValue(this.formatRemoteObject(remoteObj)),\n };\n }\n\n // ── Event Callbacks ────────────────────────────────────────────────────\n\n onPaused(callback: (state: PausedState) => void): void {\n this.onPausedCallback = callback;\n }\n\n onResumed(callback: () => void): void {\n this.onResumedCallback = callback;\n }\n\n onAutoResumed(callback: () => void): void {\n this.onAutoResumedCallback = callback;\n }\n\n // ── Private: CDP Communication ─────────────────────────────────────────\n\n private send(method: string, params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n reject(new Error(\"CDP WebSocket is not connected\"));\n return;\n }\n\n const id = ++this.requestId;\n const request: CdpRequest = { id, method, params };\n\n this.pendingRequests.set(id, { resolve, reject });\n this.ws.send(JSON.stringify(request));\n\n // Timeout after 10 seconds\n setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`CDP request timed out: ${method}`));\n }\n }, 10_000);\n });\n }\n\n private handleMessage(raw: string): void {\n let msg: CdpResponse | CdpEvent;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n\n // Handle responses to our requests\n if (\"id\" in msg && typeof msg.id === \"number\") {\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n this.pendingRequests.delete(msg.id);\n const response = msg as CdpResponse;\n if (response.error) {\n pending.reject(new Error(`CDP error: ${response.error.message}`));\n } else {\n pending.resolve(response.result ?? {});\n }\n }\n return;\n }\n\n // Handle events\n const event = msg as CdpEvent;\n if (event.method === \"Debugger.paused\") {\n this.handlePaused(event.params ?? {});\n } else if (event.method === \"Debugger.resumed\") {\n this.pausedState = null;\n this.clearAutoResumeTimer();\n this.onResumedCallback?.();\n }\n }\n\n private handlePaused(params: Record<string, unknown>): void {\n const rawFrames = (params.callFrames as CdpCallFrame[]) ?? [];\n const reason = (params.reason as string) ?? \"unknown\";\n const hitBreakpoints = params.hitBreakpoints as string[] | undefined;\n\n const callFrames: CallFrameInfo[] = rawFrames.map((frame, index) => ({\n index,\n functionName: frame.functionName || \"(anonymous)\",\n file: frame.url,\n // Convert to 1-based\n line: frame.location.lineNumber + 1,\n column: frame.location.columnNumber + 1,\n callFrameId: frame.callFrameId,\n }));\n\n this.pausedState = { callFrames, reason, hitBreakpoints };\n\n // Start auto-resume timer\n this.clearAutoResumeTimer();\n this.autoResumeTimer = setTimeout(() => {\n if (this.pausedState) {\n this.resume()\n .then(() => {\n this.onAutoResumedCallback?.();\n })\n .catch(() => {\n // Best-effort auto-resume\n });\n }\n }, AUTO_RESUME_TIMEOUT_MS);\n\n this.onPausedCallback?.(this.pausedState);\n }\n\n // ── Private: Probe Buffer ──────────────────────────────────────────────\n\n private async ensureProbeBuffer(): Promise<void> {\n if (this.probeBufferInjected) return;\n\n await this.send(\"Runtime.evaluate\", {\n expression: `\n globalThis.__conveyorProbes = globalThis.__conveyorProbes || {\n _buffer: [],\n _maxSize: ${PROBE_BUFFER_MAX_SIZE},\n probe(label, data) {\n this._buffer.push({ label, data, timestamp: Date.now() });\n if (this._buffer.length > this._maxSize) this._buffer.shift();\n },\n read(label, limit) {\n const items = label !== undefined\n ? this._buffer.filter(function(e) { return e.label === label; })\n : this._buffer;\n return limit !== undefined ? items.slice(-limit) : items;\n },\n clear(label) {\n if (label !== undefined) {\n this._buffer = this._buffer.filter(function(e) { return e.label !== label; });\n } else {\n this._buffer = [];\n }\n }\n };\n \"ok\"\n `,\n returnByValue: true,\n });\n\n this.probeBufferInjected = true;\n }\n\n // ── Private: Helpers ───────────────────────────────────────────────────\n\n private extractEvalError(\n result: Record<string, unknown>,\n remoteObj: CdpRemoteObject | undefined,\n ): string | null {\n // WebKit Inspector Protocol uses `wasThrown` instead of `exceptionDetails`\n if (this.protocol === \"webkit\") {\n if (result.wasThrown) {\n return remoteObj?.description ?? remoteObj?.value?.toString() ?? \"Unknown error\";\n }\n return null;\n }\n\n const exceptionDetails = result.exceptionDetails as\n | { text: string; exception?: CdpRemoteObject }\n | undefined;\n\n if (exceptionDetails) {\n return exceptionDetails.exception?.description ?? exceptionDetails.text ?? \"Unknown error\";\n }\n return null;\n }\n\n private fileToUrlRegex(file: string): string {\n // Escape regex special chars and create a pattern that matches the file path\n const escaped = file.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return `.*${escaped}$`;\n }\n\n private formatRemoteObject(obj: CdpRemoteObject | undefined): string {\n if (!obj) return \"undefined\";\n\n if (obj.type === \"undefined\") return \"undefined\";\n if (obj.type === \"boolean\" || obj.type === \"number\") return String(obj.value);\n if (obj.type === \"string\") return JSON.stringify(obj.value);\n if (obj.value === null) return \"null\";\n\n // For complex objects, use description or type+subtype\n if (obj.description) return obj.description;\n if (obj.subtype) return `[${obj.type}:${obj.subtype}]`;\n return `[${obj.type}]`;\n }\n\n private truncateValue(value: string): string {\n if (value.length <= MAX_VARIABLE_VALUE_BYTES) return value;\n return value.slice(0, MAX_VARIABLE_VALUE_BYTES - 3) + \"...\";\n }\n\n private clearAutoResumeTimer(): void {\n if (this.autoResumeTimer) {\n clearTimeout(this.autoResumeTimer);\n this.autoResumeTimer = null;\n }\n }\n\n private cleanup(): void {\n this.clearAutoResumeTimer();\n this.ws = null;\n this.pausedState = null;\n this.probes.clear();\n this.probeBufferInjected = false;\n for (const [, pending] of this.pendingRequests) {\n pending.reject(new Error(\"CDP connection closed\"));\n }\n this.pendingRequests.clear();\n }\n}\n","// Minimal Playwright type interfaces — actual objects come from dynamic import at runtime.\nexport interface PwBrowser {\n close(): Promise<void>;\n contexts(): PwBrowserContext[];\n}\nexport interface PwBrowserContext {\n newCDPSession(page: PwPage): Promise<PwCDPSession>;\n}\nexport interface PwPage {\n goto(url: string, opts?: { waitUntil?: string }): Promise<unknown>;\n screenshot(opts?: { type?: string; encoding?: string }): Promise<string | Buffer>;\n on(event: string, handler: (...args: unknown[]) => void): void;\n click(selector: string, opts?: { timeout?: number }): Promise<void>;\n url(): string;\n close(): Promise<void>;\n}\nexport interface PwCDPSession {\n send(method: string, params?: Record<string, unknown>): Promise<Record<string, unknown>>;\n on(event: string, handler: (params: Record<string, unknown>) => void): void;\n detach(): Promise<void>;\n}\n\nexport interface CdpCallFrame {\n callFrameId: string;\n functionName: string;\n location: { scriptId: string; lineNumber: number; columnNumber: number };\n url: string;\n scopeChain: { type: string; object: { objectId?: string }; name?: string }[];\n}\nexport interface CdpRemoteObject {\n type: string;\n subtype?: string;\n value?: unknown;\n description?: string;\n objectId?: string;\n}\nexport interface CdpPropertyDescriptor {\n name: string;\n value?: CdpRemoteObject;\n configurable: boolean;\n enumerable: boolean;\n}\n\nexport interface ConsoleMessage {\n level: string;\n text: string;\n timestamp: number;\n url?: string;\n line?: number;\n}\nexport interface NetworkRequest {\n url: string;\n method: string;\n status?: number;\n resourceType?: string;\n timestamp: number;\n duration?: number;\n}\nexport interface ClientPageError {\n message: string;\n stack?: string;\n timestamp: number;\n}\n\nconst MAX_VARIABLE_VALUE_BYTES = 2048;\n\nexport function formatRemoteObject(obj: CdpRemoteObject | undefined): string {\n if (!obj) return \"undefined\";\n if (obj.type === \"undefined\") return \"undefined\";\n if (obj.type === \"boolean\" || obj.type === \"number\") return String(obj.value);\n if (obj.type === \"string\") return JSON.stringify(obj.value);\n if (obj.value === null) return \"null\";\n if (obj.description) return obj.description;\n if (obj.subtype) return `[${obj.type}:${obj.subtype}]`;\n return `[${obj.type}]`;\n}\n\nexport function truncateValue(value: string): string {\n if (value.length <= MAX_VARIABLE_VALUE_BYTES) return value;\n return value.slice(0, MAX_VARIABLE_VALUE_BYTES - 3) + \"...\";\n}\n","import type {\n BreakpointInfo,\n CallFrameInfo,\n ScopeVariable,\n PausedState,\n ProbeInfo,\n ProbeHit,\n} from \"./cdp-client.js\";\nimport type {\n PwBrowser,\n PwBrowserContext,\n PwPage,\n PwCDPSession,\n CdpCallFrame,\n CdpRemoteObject,\n CdpPropertyDescriptor,\n ConsoleMessage,\n NetworkRequest,\n ClientPageError,\n} from \"./playwright-types.js\";\nimport { formatRemoteObject, truncateValue } from \"./playwright-types.js\";\n\nexport type { ConsoleMessage, NetworkRequest, ClientPageError } from \"./playwright-types.js\";\nconst MAX_VARIABLES_PER_SCOPE = 50;\nconst AUTO_RESUME_TIMEOUT_MS = 30_000;\nconst PROBE_BUFFER_MAX_SIZE = 1000;\nconst BUFFER_MAX = 500;\nconst ERROR_BUFFER_MAX = 200;\nconst INACTIVITY_TIMEOUT_MS = 600_000;\n\nexport class PlaywrightDebugClient {\n private browser: PwBrowser | null = null;\n private page: PwPage | null = null;\n private cdpSession: PwCDPSession | null = null;\n private breakpoints = new Map<string, BreakpointInfo>();\n private probes = new Map<string, ProbeInfo>();\n private probeCounter = 0;\n private probeBufferInjected = false;\n private pausedState: PausedState | null = null;\n private autoResumeTimer: ReturnType<typeof setTimeout> | null = null;\n private inactivityTimer: ReturnType<typeof setTimeout> | null = null;\n private onPausedCallback: ((state: PausedState) => void) | null = null;\n private onResumedCallback: (() => void) | null = null;\n private onAutoResumedCallback: (() => void) | null = null;\n private consoleMessages: ConsoleMessage[] = [];\n private networkRequests: NetworkRequest[] = [];\n private pageErrors: ClientPageError[] = [];\n private sourceMapDetected: boolean | null = null;\n\n async launch(previewUrl: string): Promise<void> {\n if (this.browser) throw new Error(\"Playwright browser is already running\");\n\n // @ts-expect-error playwright-core is lazily installed at runtime, not a compile-time dep\n const { chromium } = await import(\"playwright-core\");\n this.browser = (await chromium.launch({\n headless: true,\n args: [\n \"--no-sandbox\",\n \"--disable-setuid-sandbox\",\n \"--disable-dev-shm-usage\",\n \"--disable-gpu\",\n ],\n })) as unknown as PwBrowser;\n\n const context =\n this.browser.contexts()[0] ??\n (await (this.browser as never as { newContext(): Promise<PwBrowserContext> }).newContext());\n this.page = await (context as never as { newPage(): Promise<PwPage> }).newPage();\n this.setupPassiveCapture();\n await this.page.goto(previewUrl, { waitUntil: \"domcontentloaded\" });\n\n this.cdpSession = await context.newCDPSession(this.page);\n await this.cdpSession.send(\"Debugger.enable\", {});\n await this.cdpSession.send(\"Runtime.enable\", {});\n this.setupCdpEvents();\n await this.checkSourceMaps();\n this.resetInactivityTimer();\n }\n\n async close(): Promise<void> {\n this.clearAutoResumeTimer();\n this.clearInactivityTimer();\n if (this.cdpSession) {\n try {\n await this.cdpSession.detach();\n } catch {\n // Best-effort detach\n }\n this.cdpSession = null;\n }\n if (this.browser) {\n try {\n await this.browser.close();\n } catch {\n // Best-effort close\n }\n this.browser = null;\n }\n this.page = null;\n this.pausedState = null;\n this.breakpoints.clear();\n this.probes.clear();\n this.probeBufferInjected = false;\n this.consoleMessages = [];\n this.networkRequests = [];\n this.pageErrors = [];\n }\n\n isConnected(): boolean {\n return this.browser !== null && this.cdpSession !== null;\n }\n hasSourceMaps(): boolean | null {\n return this.sourceMapDetected;\n }\n\n async setBreakpoint(file: string, line: number, condition?: string): Promise<string> {\n const session = this.requireSession();\n this.resetInactivityTimer();\n const params: Record<string, unknown> = {\n urlRegex: this.fileToUrlRegex(file),\n // CDP uses 0-based lines\n lineNumber: line - 1,\n };\n if (condition) params.condition = condition;\n const result = await session.send(\"Debugger.setBreakpointByUrl\", params);\n const breakpointId = result.breakpointId as string;\n this.breakpoints.set(breakpointId, { breakpointId, file, line, condition });\n return breakpointId;\n }\n\n async removeBreakpoint(breakpointId: string): Promise<void> {\n const session = this.requireSession();\n await session.send(\"Debugger.removeBreakpoint\", { breakpointId });\n this.breakpoints.delete(breakpointId);\n }\n\n async removeAllBreakpoints(): Promise<void> {\n for (const id of [...this.breakpoints.keys()]) {\n try {\n await this.removeBreakpoint(id);\n } catch {\n this.breakpoints.delete(id);\n }\n }\n }\n\n listBreakpoints(): BreakpointInfo[] {\n return [...this.breakpoints.values()];\n }\n\n async setLogpoint(\n file: string,\n line: number,\n expressions: string[],\n label?: string,\n ): Promise<string> {\n await this.ensureProbeBuffer();\n const probeId = `client-probe-${++this.probeCounter}`;\n const probeLabel = label ?? `${file}:${line}`;\n const dataEntries = expressions.map((expr) => `${JSON.stringify(expr)}: (${expr})`).join(\", \");\n const condition = `(globalThis.__conveyorProbes?.probe(${JSON.stringify(probeLabel)}, {${dataEntries}}), false)`;\n const breakpointId = await this.setBreakpoint(file, line, condition);\n this.probes.set(probeId, { probeId, breakpointId, file, line, expressions, label: probeLabel });\n return probeId;\n }\n\n async removeProbe(probeId: string): Promise<void> {\n const probe = this.probes.get(probeId);\n if (!probe) throw new Error(`Probe ${probeId} not found`);\n await this.removeBreakpoint(probe.breakpointId);\n this.probes.delete(probeId);\n }\n\n listProbes(): ProbeInfo[] {\n return [...this.probes.values()];\n }\n\n async getProbeResults(label?: string, limit?: number): Promise<ProbeHit[]> {\n const args = [\n label === undefined ? \"undefined\" : JSON.stringify(label),\n limit === undefined ? \"undefined\" : String(limit),\n ].join(\", \");\n const result = await this.evaluate(\n `JSON.stringify(globalThis.__conveyorProbes?.read(${args}) ?? [])`,\n );\n if (result.type === \"error\") return [];\n try {\n const raw = result.value;\n return JSON.parse(raw.startsWith('\"') ? JSON.parse(raw) : raw) as ProbeHit[];\n } catch {\n return [];\n }\n }\n\n async clearProbeResults(label?: string): Promise<void> {\n const arg = label === undefined ? \"undefined\" : JSON.stringify(label);\n await this.evaluate(`(globalThis.__conveyorProbes?.clear(${arg}), undefined)`);\n }\n\n isPaused(): boolean {\n return this.pausedState !== null;\n }\n getPausedState(): PausedState | null {\n return this.pausedState;\n }\n getCallStack(): CallFrameInfo[] {\n return this.pausedState?.callFrames ?? [];\n }\n\n async getScopeVariables(callFrameId: string): Promise<ScopeVariable[]> {\n if (!this.pausedState) throw new Error(\"Debugger is not paused\");\n const session = this.requireSession();\n const frame = this.pausedState.callFrames.find((f) => f.callFrameId === callFrameId);\n if (!frame) throw new Error(`Call frame ${callFrameId} not found`);\n\n const result = await session.send(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression: \"this\",\n returnByValue: false,\n });\n const variables: ScopeVariable[] = [];\n try {\n const scopeResult = await session.send(\"Runtime.getProperties\", {\n objectId: (result.result as CdpRemoteObject)?.objectId,\n ownProperties: true,\n generatePreview: false,\n });\n for (const desc of ((scopeResult.result as CdpPropertyDescriptor[]) ?? []).slice(\n 0,\n MAX_VARIABLES_PER_SCOPE,\n )) {\n if (desc.value) {\n variables.push({\n name: desc.name,\n type: desc.value.type,\n value: truncateValue(formatRemoteObject(desc.value)),\n });\n }\n }\n } catch {\n // Scope inspection can fail for some frames\n }\n return variables;\n }\n\n async resume(): Promise<void> {\n this.clearAutoResumeTimer();\n await this.requireSession().send(\"Debugger.resume\", {});\n this.pausedState = null;\n }\n\n async stepOver(): Promise<void> {\n this.clearAutoResumeTimer();\n await this.requireSession().send(\"Debugger.stepOver\", {});\n }\n\n async stepInto(): Promise<void> {\n this.clearAutoResumeTimer();\n await this.requireSession().send(\"Debugger.stepInto\", {});\n }\n\n async evaluate(\n expression: string,\n callFrameId?: string,\n ): Promise<{ type: string; value: string }> {\n const session = this.requireSession();\n this.resetInactivityTimer();\n let result: Record<string, unknown>;\n if (callFrameId && this.pausedState) {\n result = await session.send(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression,\n returnByValue: false,\n generatePreview: true,\n });\n } else {\n result = await session.send(\"Runtime.evaluate\", {\n expression,\n returnByValue: false,\n generatePreview: true,\n });\n }\n const remoteObj = result.result as CdpRemoteObject;\n const exDetails = result.exceptionDetails as\n | { text: string; exception?: CdpRemoteObject }\n | undefined;\n if (exDetails) {\n return {\n type: \"error\",\n value: exDetails.exception?.description ?? exDetails.text ?? \"Unknown error\",\n };\n }\n return {\n type: remoteObj?.type ?? \"undefined\",\n value: truncateValue(formatRemoteObject(remoteObj)),\n };\n }\n\n async navigate(url: string): Promise<void> {\n this.requirePage();\n this.resetInactivityTimer();\n await this.page?.goto(url, { waitUntil: \"domcontentloaded\" });\n }\n\n async click(selector: string): Promise<void> {\n this.requirePage();\n this.resetInactivityTimer();\n await this.page?.click(selector, { timeout: 10_000 });\n }\n\n async screenshot(): Promise<string> {\n this.requirePage();\n this.resetInactivityTimer();\n const buffer = await this.page?.screenshot({ type: \"png\", encoding: \"base64\" });\n return typeof buffer === \"string\" ? buffer : Buffer.from(buffer as Buffer).toString(\"base64\");\n }\n\n getCurrentUrl(): string {\n this.requirePage();\n return this.page?.url() ?? \"\";\n }\n\n getConsoleMessages(level?: string, limit?: number): ConsoleMessage[] {\n let messages = this.consoleMessages;\n if (level) messages = messages.filter((m) => m.level === level);\n if (limit) messages = messages.slice(-limit);\n return messages;\n }\n\n getNetworkRequests(filter?: string, limit?: number): NetworkRequest[] {\n let requests = this.networkRequests;\n if (filter) {\n const regex = new RegExp(filter, \"i\");\n requests = requests.filter((r) => regex.test(r.url));\n }\n if (limit) requests = requests.slice(-limit);\n return requests;\n }\n\n getPageErrors(limit?: number): ClientPageError[] {\n return limit ? this.pageErrors.slice(-limit) : [...this.pageErrors];\n }\n\n onPaused(callback: (state: PausedState) => void): void {\n this.onPausedCallback = callback;\n }\n onResumed(callback: () => void): void {\n this.onResumedCallback = callback;\n }\n onAutoResumed(callback: () => void): void {\n this.onAutoResumedCallback = callback;\n }\n\n // ── Private ───────────────────────────────────────────────────────────\n\n private setupCdpEvents(): void {\n if (!this.cdpSession) return;\n this.cdpSession.on(\"Debugger.paused\", (params) => this.handlePaused(params));\n this.cdpSession.on(\"Debugger.resumed\", () => {\n this.pausedState = null;\n this.clearAutoResumeTimer();\n this.onResumedCallback?.();\n });\n }\n\n private handlePaused(params: Record<string, unknown>): void {\n const rawFrames = (params.callFrames as CdpCallFrame[]) ?? [];\n const callFrames: CallFrameInfo[] = rawFrames.map((frame, index) => ({\n index,\n functionName: frame.functionName || \"(anonymous)\",\n file: frame.url,\n line: frame.location.lineNumber + 1,\n column: frame.location.columnNumber + 1,\n callFrameId: frame.callFrameId,\n }));\n this.pausedState = {\n callFrames,\n reason: (params.reason as string) ?? \"unknown\",\n hitBreakpoints: params.hitBreakpoints as string[] | undefined,\n };\n this.clearAutoResumeTimer();\n this.autoResumeTimer = setTimeout(() => {\n if (this.pausedState) {\n this.resume()\n .then(() => this.onAutoResumedCallback?.())\n .catch(() => {});\n }\n }, AUTO_RESUME_TIMEOUT_MS);\n this.onPausedCallback?.(this.pausedState);\n }\n\n private setupPassiveCapture(): void {\n if (!this.page) return;\n this.page.on(\"console\", (msg: unknown) => {\n const m = msg as {\n type(): string;\n text(): string;\n location(): { url?: string; lineNumber?: number };\n };\n this.consoleMessages.push({\n level: m.type(),\n text: m.text(),\n timestamp: Date.now(),\n url: m.location()?.url,\n line: m.location()?.lineNumber,\n });\n if (this.consoleMessages.length > BUFFER_MAX) this.consoleMessages.shift();\n });\n this.page.on(\"pageerror\", (error: unknown) => {\n const e = error as { message: string; stack?: string };\n this.pageErrors.push({ message: e.message, stack: e.stack, timestamp: Date.now() });\n if (this.pageErrors.length > ERROR_BUFFER_MAX) this.pageErrors.shift();\n });\n this.page.on(\"request\", (request: unknown) => {\n const r = request as { url(): string; method(): string; resourceType(): string };\n this.networkRequests.push({\n url: r.url(),\n method: r.method(),\n resourceType: r.resourceType(),\n timestamp: Date.now(),\n });\n if (this.networkRequests.length > BUFFER_MAX) this.networkRequests.shift();\n });\n this.page.on(\"response\", (response: unknown) => {\n const resp = response as { url(): string; status(): number };\n const url = resp.url();\n for (let i = this.networkRequests.length - 1; i >= 0; i--) {\n const req = this.networkRequests[i];\n if (req.url === url && req.status === undefined) {\n req.status = resp.status();\n req.duration = Date.now() - req.timestamp;\n break;\n }\n }\n });\n }\n\n private async checkSourceMaps(): Promise<void> {\n const hasMapFiles = this.networkRequests.some(\n (r) => r.url.endsWith(\".map\") || r.url.includes(\"sourceMappingURL\"),\n );\n if (hasMapFiles) {\n this.sourceMapDetected = true;\n return;\n }\n try {\n const result = await this.requireSession().send(\"Runtime.evaluate\", {\n expression: \"true\",\n returnByValue: true,\n });\n this.sourceMapDetected = result.result ? null : false;\n } catch {\n this.sourceMapDetected = null;\n }\n }\n\n private async ensureProbeBuffer(): Promise<void> {\n if (this.probeBufferInjected) return;\n const session = this.requireSession();\n await session.send(\"Runtime.evaluate\", {\n expression: `globalThis.__conveyorProbes=globalThis.__conveyorProbes||{_buffer:[],_maxSize:${PROBE_BUFFER_MAX_SIZE},probe(l,d){this._buffer.push({label:l,data:d,timestamp:Date.now()});if(this._buffer.length>this._maxSize)this._buffer.shift()},read(l,n){var i=l!==void 0?this._buffer.filter(function(e){return e.label===l}):this._buffer;return n!==void 0?i.slice(-n):i},clear(l){if(l!==void 0){this._buffer=this._buffer.filter(function(e){return e.label!==l})}else{this._buffer=[]}}};\"ok\"`,\n returnByValue: true,\n });\n this.probeBufferInjected = true;\n }\n\n private requireSession(): PwCDPSession {\n if (!this.cdpSession) throw new Error(\"Playwright CDP session is not connected\");\n return this.cdpSession;\n }\n\n private requirePage(): void {\n if (!this.page) throw new Error(\"No page available\");\n }\n\n private fileToUrlRegex(file: string): string {\n return `.*${file.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}$`;\n }\n\n private clearAutoResumeTimer(): void {\n if (this.autoResumeTimer) {\n clearTimeout(this.autoResumeTimer);\n this.autoResumeTimer = null;\n }\n }\n\n private resetInactivityTimer(): void {\n this.clearInactivityTimer();\n this.inactivityTimer = setTimeout(() => {\n this.close().catch(() => {});\n }, INACTIVITY_TIMEOUT_MS);\n }\n\n private clearInactivityTimer(): void {\n if (this.inactivityTimer) {\n clearTimeout(this.inactivityTimer);\n this.inactivityTimer = null;\n }\n }\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { execSync } from \"node:child_process\";\nimport { CdpDebugClient, type PausedState } from \"./cdp-client.js\";\nimport { PlaywrightDebugClient } from \"./playwright-client.js\";\nimport { injectTelemetry } from \"./telemetry-injector.js\";\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport type InspectorRuntime = \"node\" | \"bun\" | \"unknown\";\n\nexport interface DebugEventHandler {\n onDebugModeEntered: () => void;\n onDebugModeExited: () => void;\n onBreakpointHit: (state: PausedState) => void;\n onClientBreakpointHit: (state: PausedState) => void;\n onAutoResumed: () => void;\n onDebugError: (message: string) => void;\n onOutput: (stream: \"stdout\" | \"stderr\", data: string) => void;\n}\n\nexport interface DebugModeOptions {\n serverSide?: boolean;\n clientSide?: boolean;\n previewUrl?: string;\n}\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\n/** Matches Node.js: `Debugger listening on ws://127.0.0.1:9229/{uuid}` */\nconst NODE_INSPECTOR_REGEX = /Debugger listening on (ws:\\/\\/127\\.0\\.0\\.1:\\d+\\/[^\\s]+)/;\n\n/** Matches Bun's inspector URL anywhere in stderr (e.g. `ws://localhost:6499/{token}`) */\nconst BUN_INSPECTOR_REGEX = /(ws:\\/\\/[\\w.-]+:\\d+\\/[\\w-]+)/;\n\nconst CONNECTION_TIMEOUT_MS = 10_000;\nconst PLAYWRIGHT_INSTALL_TIMEOUT_MS = 120_000;\n\n// ── Debug Manager ──────────────────────────────────────────────────────────\n\nexport class DebugManager {\n private cdpClient: CdpDebugClient | null = null;\n private playwrightClient: PlaywrightDebugClient | null = null;\n private debugProcess: ChildProcess | null = null;\n private _isDebugMode = false;\n private _isClientDebugMode = false;\n private startCommand: string;\n private workingDir: string;\n private eventHandler: DebugEventHandler;\n private breakpointHitQueue: PausedState[] = [];\n private clientBreakpointHitQueue: PausedState[] = [];\n\n constructor(startCommand: string, workingDir: string, eventHandler: DebugEventHandler) {\n this.startCommand = startCommand;\n this.workingDir = workingDir;\n this.eventHandler = eventHandler;\n }\n\n // ── Public API ─────────────────────────────────────────────────────────\n\n isDebugMode(): boolean {\n return this._isDebugMode;\n }\n\n isClientDebugMode(): boolean {\n return this._isClientDebugMode;\n }\n\n getClient(): CdpDebugClient | null {\n return this.cdpClient;\n }\n\n getPlaywrightClient(): PlaywrightDebugClient | null {\n return this.playwrightClient;\n }\n\n drainBreakpointHitQueue(): PausedState[] {\n const queued = [...this.breakpointHitQueue];\n this.breakpointHitQueue = [];\n return queued;\n }\n\n drainClientBreakpointHitQueue(): PausedState[] {\n const queued = [...this.clientBreakpointHitQueue];\n this.clientBreakpointHitQueue = [];\n return queued;\n }\n\n async enterDebugMode(killCurrentProcess?: () => void, options?: DebugModeOptions): Promise<void> {\n const serverSide = options?.serverSide ?? !options?.clientSide;\n const clientSide = options?.clientSide ?? false;\n\n if (serverSide && this._isDebugMode) {\n throw new Error(\"Already in server debug mode\");\n }\n if (clientSide && this._isClientDebugMode) {\n throw new Error(\"Already in client debug mode\");\n }\n\n if (serverSide && !this._isDebugMode) {\n await this.activateServerDebug(killCurrentProcess);\n }\n\n if (clientSide && !this._isClientDebugMode) {\n await this.activateClientDebug(options?.previewUrl);\n }\n\n this.eventHandler.onDebugModeEntered();\n }\n\n async exitDebugMode(restartNormalServer?: () => void): Promise<void> {\n if (!this._isDebugMode && !this._isClientDebugMode) {\n throw new Error(\"Not in debug mode\");\n }\n\n // Clean up server-side CDP\n if (this.cdpClient) {\n try {\n await this.cdpClient.removeAllBreakpoints();\n } catch {\n // Best-effort cleanup\n }\n this.cdpClient.disconnect();\n this.cdpClient = null;\n }\n\n // Clean up client-side Playwright\n if (this.playwrightClient) {\n try {\n await this.playwrightClient.removeAllBreakpoints();\n } catch {\n // Best-effort cleanup\n }\n try {\n await this.playwrightClient.close();\n } catch {\n // Best-effort cleanup\n }\n this.playwrightClient = null;\n }\n\n // Kill the debug process\n if (this.debugProcess && !this.debugProcess.killed) {\n this.debugProcess.kill(\"SIGTERM\");\n this.debugProcess = null;\n }\n\n this._isDebugMode = false;\n this._isClientDebugMode = false;\n this.breakpointHitQueue = [];\n this.clientBreakpointHitQueue = [];\n\n // Restart the normal dev server\n restartNormalServer?.();\n this.eventHandler.onDebugModeExited();\n }\n\n // ── Debug Mode Activation ────────────────────────────────────────────\n\n private async activateServerDebug(killCurrentProcess?: () => void): Promise<void> {\n killCurrentProcess?.();\n\n // Start the dev server with --inspect\n const runtime = detectRuntime(this.startCommand);\n const inspectorUrl = await this.startWithInspector();\n\n // Connect CDP client — Bun uses WebKit Inspector Protocol\n const protocol = runtime === \"bun\" ? \"webkit\" : \"cdp\";\n this.cdpClient = new CdpDebugClient();\n\n this.cdpClient.onPaused((state) => {\n this.breakpointHitQueue.push(state);\n this.eventHandler.onBreakpointHit(state);\n });\n\n this.cdpClient.onAutoResumed(() => {\n this.eventHandler.onAutoResumed();\n });\n\n await this.cdpClient.connect(inspectorUrl, protocol);\n this._isDebugMode = true;\n\n // Auto-inject telemetry after CDP connects (non-fatal)\n try {\n await injectTelemetry(this.cdpClient);\n } catch {\n // Telemetry injection is best-effort — debug mode still works without it\n }\n }\n\n private async activateClientDebug(previewUrl?: string): Promise<void> {\n if (!previewUrl) {\n throw new Error(\"previewUrl is required for client-side debug mode\");\n }\n\n await this.ensurePlaywrightInstalled();\n\n this.playwrightClient = new PlaywrightDebugClient();\n\n this.playwrightClient.onPaused((state) => {\n this.clientBreakpointHitQueue.push(state);\n this.eventHandler.onClientBreakpointHit(state);\n });\n\n this.playwrightClient.onAutoResumed(() => {\n this.eventHandler.onAutoResumed();\n });\n\n await this.playwrightClient.launch(previewUrl);\n this._isClientDebugMode = true;\n }\n\n // ── Playwright Installation ───────────────────────────────────────────\n\n private async ensurePlaywrightInstalled(): Promise<void> {\n // Check if playwright-core and Chromium are already available\n try {\n // @ts-expect-error playwright-core is lazily installed at runtime, not a compile-time dep\n await import(\"playwright-core\");\n // Check if Chromium binary exists by trying to resolve the executable\n // @ts-expect-error playwright-core is lazily installed at runtime\n const pw = await import(\"playwright-core\");\n const executablePath = (pw.chromium as { executablePath(): string }).executablePath();\n // Already installed\n if (executablePath) return;\n } catch {\n // Not installed yet — continue to install\n }\n\n this.eventHandler.onOutput(\n \"stderr\",\n \"Installing Playwright Chromium (first-time setup, ~250MB)...\\n\",\n );\n\n try {\n execSync(\"npx playwright install chromium --with-deps\", {\n cwd: this.workingDir,\n timeout: PLAYWRIGHT_INSTALL_TIMEOUT_MS,\n stdio: \"pipe\",\n });\n this.eventHandler.onOutput(\"stderr\", \"Playwright Chromium installed successfully.\\n\");\n } catch (error) {\n throw new Error(\n `Failed to install Playwright Chromium: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n { cause: error },\n );\n }\n }\n\n // ── Private ────────────────────────────────────────────────────────────\n\n // oxlint-disable-next-line require-await\n private async startWithInspector(): Promise<string> {\n const runtime = detectRuntime(this.startCommand);\n\n return new Promise<string>((resolve, reject) => {\n let resolved = false;\n const timeout = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n reject(new Error(getTimeoutMessage(runtime)));\n }\n }, CONNECTION_TIMEOUT_MS);\n\n let cmd = this.startCommand;\n let env = { ...process.env };\n\n if (runtime === \"bun\") {\n // Bun ignores NODE_OPTIONS; inject --inspect flag into command\n cmd = injectBunInspectFlag(this.startCommand);\n } else {\n // Node.js (or unknown) — use NODE_OPTIONS to enable inspector on random port\n env = { ...env, NODE_OPTIONS: \"--inspect=0\" };\n }\n\n const inspectorRegex = runtime === \"bun\" ? BUN_INSPECTOR_REGEX : NODE_INSPECTOR_REGEX;\n\n const child = runStartCommandWithEnv(cmd, this.workingDir, env, (stream, data) => {\n this.eventHandler.onOutput(stream, data);\n\n // Parse inspector URL from stderr\n if (!resolved && stream === \"stderr\") {\n const match = data.match(inspectorRegex);\n if (match?.[1]) {\n resolved = true;\n clearTimeout(timeout);\n resolve(match[1]);\n }\n }\n });\n\n this.debugProcess = child;\n\n child.on(\"error\", (err) => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timeout);\n reject(err);\n }\n });\n\n child.on(\"exit\", (code) => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timeout);\n reject(new Error(`Debug process exited with code ${code} before inspector started`));\n }\n });\n });\n }\n}\n\n// ── Helper: Runtime Detection ─────────────────────────────────────────────\n\nconst BUN_COMMAND_REGEX = /\\b(bun|bunx)\\b/;\nconst NODE_COMMAND_REGEX = /\\b(node|npx|tsx|ts-node)\\b/;\n\nexport function detectRuntime(startCommand: string): InspectorRuntime {\n if (BUN_COMMAND_REGEX.test(startCommand)) return \"bun\";\n if (NODE_COMMAND_REGEX.test(startCommand)) return \"node\";\n // Check environment as secondary signal\n if (process.env.BUN_INSTALL) return \"bun\";\n return \"node\";\n}\n\n// ── Helper: Bun --inspect flag injection ──────────────────────────────────\n\nexport function injectBunInspectFlag(command: string): string {\n // Insert --inspect right after the `bun` or `bunx` token.\n // e.g. \"bun run dev\" → \"bun --inspect run dev\"\n // e.g. \"bun server.ts\" → \"bun --inspect server.ts\"\n // e.g. \"bunx serve\" → \"bunx --inspect serve\"\n return command.replace(/\\b(bunx?)\\b/, \"$1 --inspect\");\n}\n\n// ── Helper: Timeout error messages ────────────────────────────────────────\n\nfunction getTimeoutMessage(runtime: InspectorRuntime): string {\n switch (runtime) {\n case \"bun\":\n return \"Timed out waiting for Bun inspector (--inspect flag). Ensure your start command begins with 'bun'\";\n case \"node\":\n return \"Timed out waiting for Node.js inspector (NODE_OPTIONS='--inspect=0')\";\n default:\n return \"Timed out waiting for debugger inspector. Your runtime may not support CDP.\";\n }\n}\n\n// ── Helper: Start command with custom env ──────────────────────────────────\n\nfunction runStartCommandWithEnv(\n cmd: string,\n cwd: string,\n env: NodeJS.ProcessEnv,\n onOutput: (stream: \"stdout\" | \"stderr\", data: string) => void,\n): ChildProcess {\n const child = spawn(\"sh\", [\"-c\", cmd], {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: true,\n env: { ...env },\n });\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n onOutput(\"stdout\", chunk.toString());\n });\n\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n onOutput(\"stderr\", chunk.toString());\n });\n\n child.unref();\n return child;\n}\n","import type { AgentConnection } from \"../connection/agent-connection.js\";\nimport type { DebugManager, DebugEventHandler } from \"./debug-manager.js\";\nimport type { PausedState } from \"./cdp-client.js\";\nimport type {\n DebugSessionState,\n DebugSessionSummary,\n DebugBreakpointInfo,\n DebugProbeInfo,\n DebugTelemetryEvent,\n} from \"@project/shared\";\n\n/**\n * Orchestrates the debug session lifecycle, tracks state for the web UI,\n * and generates session summaries. Wraps DebugManager events and forwards\n * state changes to the API via AgentConnection.\n */\nexport class DebugLifecycleManager {\n private connection: AgentConnection;\n private debugManager: DebugManager | null = null;\n private hypothesis?: string;\n private sessionStartedAt?: string;\n private breakpointsHitCount = 0;\n private telemetryEvents: DebugTelemetryEvent[] = [];\n private reproduceRequested = false;\n private keyFindings: string[] = [];\n private _isActive = false;\n\n constructor(connection: AgentConnection) {\n this.connection = connection;\n }\n\n get isActive(): boolean {\n return this._isActive;\n }\n\n setDebugManager(manager: DebugManager): void {\n this.debugManager = manager;\n }\n\n /**\n * Creates a DebugEventHandler that bridges DebugManager events\n * to the lifecycle manager and broadcasts state to the web UI.\n */\n createEventHandler(\n baseOnOutput: (stream: \"stdout\" | \"stderr\", data: string) => void,\n ): DebugEventHandler {\n return {\n onDebugModeEntered: () => {\n this._isActive = true;\n this.sessionStartedAt = new Date().toISOString();\n this.breakpointsHitCount = 0;\n this.telemetryEvents = [];\n this.keyFindings = [];\n this.broadcastState();\n },\n onDebugModeExited: () => {\n this.broadcastState();\n },\n onBreakpointHit: (state: PausedState) => {\n this.breakpointsHitCount++;\n const file = state.callFrames[0]?.file ?? \"unknown\";\n const line = state.callFrames[0]?.line ?? 0;\n this.keyFindings.push(`Breakpoint hit at ${file}:${line} (${state.reason})`);\n this.broadcastState();\n },\n onClientBreakpointHit: (state: PausedState) => {\n this.breakpointsHitCount++;\n const file = state.callFrames[0]?.file ?? \"unknown\";\n const line = state.callFrames[0]?.line ?? 0;\n this.keyFindings.push(`Client breakpoint hit at ${file}:${line}`);\n this.broadcastState();\n },\n onAutoResumed: () => {\n this.broadcastState();\n },\n onDebugError: (message: string) => {\n this.keyFindings.push(`Debug error: ${message}`);\n this.broadcastState();\n },\n onOutput: baseOnOutput,\n };\n }\n\n /** Mark the hypothesis for the current debug session */\n setHypothesis(hypothesis: string): void {\n this.hypothesis = hypothesis;\n this.broadcastState();\n }\n\n /** Signal that the user has been asked to reproduce the bug */\n requestReproduce(hypothesis?: string): void {\n this.reproduceRequested = true;\n if (hypothesis) this.hypothesis = hypothesis;\n this.connection.sendEvent({\n type: \"debug_reproduce_requested\",\n hypothesis: hypothesis ?? this.hypothesis,\n });\n this.broadcastState();\n }\n\n /** Add a telemetry event to the debug session */\n addTelemetryEvent(event: DebugTelemetryEvent): void {\n this.telemetryEvents.push(event);\n // Keep only the last 100 events\n if (this.telemetryEvents.length > 100) {\n this.telemetryEvents = this.telemetryEvents.slice(-100);\n }\n this.broadcastState();\n }\n\n /** Generate and broadcast a debug session summary, then reset state */\n completeSession(): DebugSessionSummary | null {\n if (!this._isActive && !this.sessionStartedAt) return null;\n\n const endedAt = new Date().toISOString();\n const startedAt = this.sessionStartedAt ?? endedAt;\n const durationMs = new Date(endedAt).getTime() - new Date(startedAt).getTime();\n\n const breakpoints = this.getBreakpoints();\n const probes = this.getProbes();\n\n const summary: DebugSessionSummary = {\n hypothesis: this.hypothesis,\n breakpointsSet: breakpoints.length,\n breakpointsHit: this.breakpointsHitCount,\n probesSet: probes.length,\n telemetryEventsCaptured: this.telemetryEvents.length,\n keyFindings: this.keyFindings.slice(0, 20),\n durationMs,\n startedAt,\n endedAt,\n };\n\n this.connection.sendEvent({ type: \"debug_session_complete\", summary });\n\n // Reset state\n this._isActive = false;\n this.hypothesis = undefined;\n this.sessionStartedAt = undefined;\n this.breakpointsHitCount = 0;\n this.telemetryEvents = [];\n this.reproduceRequested = false;\n this.keyFindings = [];\n\n this.broadcastState();\n\n return summary;\n }\n\n /** Auto-exit cleanup — called when agent session ends */\n autoCleanup(): void {\n if (this._isActive || this.sessionStartedAt) {\n this.completeSession();\n }\n }\n\n // ── Private ────────────────────────────────────────────────────────\n\n private getBreakpoints(): DebugBreakpointInfo[] {\n if (!this.debugManager) return [];\n const client = this.debugManager.getClient();\n if (!client?.isConnected()) return [];\n try {\n return client.listBreakpoints().map((bp) => ({\n id: bp.breakpointId,\n file: bp.file,\n line: bp.line,\n condition: bp.condition,\n hitCount: 0,\n }));\n } catch {\n return [];\n }\n }\n\n private getProbes(): DebugProbeInfo[] {\n if (!this.debugManager) return [];\n const client = this.debugManager.getClient();\n if (!client?.isConnected()) return [];\n try {\n return client.listProbes().map((p) => ({\n id: p.probeId,\n file: p.file,\n line: p.line,\n expressions: p.expressions,\n label: p.label,\n }));\n } catch {\n return [];\n }\n }\n\n private buildState(): DebugSessionState {\n const serverDebug = this.debugManager?.isDebugMode() ?? false;\n const clientDebug = this.debugManager?.isClientDebugMode() ?? false;\n const active = this._isActive && (serverDebug || clientDebug);\n\n let pausedAt: { file: string; line: number } | undefined;\n const client = this.debugManager?.getClient();\n if (client?.isPaused()) {\n const callStack = client.getCallStack();\n if (callStack[0]) {\n pausedAt = {\n file: callStack[0].file,\n line: callStack[0].line,\n };\n }\n }\n\n return {\n active,\n hypothesis: this.hypothesis,\n serverDebug,\n clientDebug,\n breakpoints: this.getBreakpoints(),\n probes: this.getProbes(),\n telemetryEvents: this.telemetryEvents.slice(-50),\n pausedAt,\n reproduceRequested: this.reproduceRequested,\n };\n }\n\n private broadcastState(): void {\n this.connection.sendEvent({\n type: \"debug_state_changed\",\n state: this.buildState(),\n });\n }\n}\n","// ── Hypothesis-Driven Debug Session Tracker ────────────────────────────────\n\nconst MAX_ITERATIONS = 3;\n\nexport interface Observation {\n description: string;\n confirmsHypothesis: boolean;\n iteration: number;\n timestamp: number;\n}\n\nexport interface HypothesisState {\n hypothesis: string | null;\n iteration: number;\n observations: Observation[];\n active: boolean;\n conclusion: string | null;\n}\n\nexport class HypothesisTracker {\n private hypothesis: string | null = null;\n private iteration = 0;\n private observations: Observation[] = [];\n private _active = false;\n private conclusion: string | null = null;\n\n // ── Public API ─────────────────────────────────────────────────────────\n\n /**\n * Start or update the current debugging hypothesis.\n * Increments the iteration count if a hypothesis was already set.\n */\n setHypothesis(text: string): { accepted: boolean; message: string } {\n if (!this._active) {\n this._active = true;\n this.hypothesis = text;\n this.iteration = 1;\n this.observations = [];\n this.conclusion = null;\n return { accepted: true, message: `Hypothesis set (iteration 1/${MAX_ITERATIONS}): ${text}` };\n }\n\n if (this.iteration >= MAX_ITERATIONS) {\n return {\n accepted: false,\n message: `Max iterations (${MAX_ITERATIONS}) reached. You must make a decision based on what you've observed. Use concludeSession() to summarize findings and exit debug mode.`,\n };\n }\n\n this.iteration++;\n this.hypothesis = text;\n return {\n accepted: true,\n message: `Hypothesis updated (iteration ${this.iteration}/${MAX_ITERATIONS}): ${text}`,\n };\n }\n\n /**\n * Record an observation from debug data (breakpoint hit, telemetry, etc.).\n */\n recordObservation(description: string, confirmsHypothesis: boolean): void {\n this.observations.push({\n description,\n confirmsHypothesis,\n iteration: this.iteration,\n timestamp: Date.now(),\n });\n }\n\n /**\n * End the debug session with a conclusion.\n */\n concludeSession(conclusion: string): string {\n this.conclusion = conclusion;\n this._active = false;\n\n const summary = this.getSessionSummary();\n this.reset();\n return summary;\n }\n\n /**\n * Get formatted debug context for injection into the agent's system prompt.\n * Returns empty string if no active session.\n */\n getDebugContext(): string {\n if (!this._active || !this.hypothesis) return \"\";\n\n const lines = [\n `Current debug session (iteration ${this.iteration}/${MAX_ITERATIONS}):`,\n `Hypothesis: \"${this.hypothesis}\"`,\n ];\n\n if (this.observations.length > 0) {\n // Group observations by iteration\n const byIteration = new Map<number, Observation[]>();\n for (const obs of this.observations) {\n const group = byIteration.get(obs.iteration) ?? [];\n group.push(obs);\n byIteration.set(obs.iteration, group);\n }\n\n for (const [iter, iterObs] of byIteration) {\n for (const obs of iterObs) {\n const verdict = obs.confirmsHypothesis ? \"SUPPORTS\" : \"CONTRADICTS\";\n lines.push(`Iteration ${iter}: ${obs.description} — ${verdict} hypothesis`);\n }\n }\n }\n\n if (this.iteration >= MAX_ITERATIONS) {\n lines.push(\n `⚠️ Final iteration reached. Analyze observations and make a decision — no more debug iterations available.`,\n );\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Get the full state (for serialization/testing).\n */\n getState(): HypothesisState {\n return {\n hypothesis: this.hypothesis,\n iteration: this.iteration,\n observations: [...this.observations],\n active: this._active,\n conclusion: this.conclusion,\n };\n }\n\n isActive(): boolean {\n return this._active;\n }\n\n getIteration(): number {\n return this.iteration;\n }\n\n getMaxIterations(): number {\n return MAX_ITERATIONS;\n }\n\n // ── Private ────────────────────────────────────────────────────────────\n\n private getSessionSummary(): string {\n const parts = [`Debug session complete.`];\n\n if (this.hypothesis) {\n parts.push(`Final hypothesis: \"${this.hypothesis}\"`);\n }\n\n parts.push(`Total iterations: ${this.iteration}`);\n\n if (this.observations.length > 0) {\n parts.push(\"Observations:\");\n for (const obs of this.observations) {\n const verdict = obs.confirmsHypothesis ? \"✓\" : \"✗\";\n parts.push(` ${verdict} [iter ${obs.iteration}] ${obs.description}`);\n }\n }\n\n const supporting = this.observations.filter((o) => o.confirmsHypothesis).length;\n const contradicting = this.observations.length - supporting;\n parts.push(`Evidence: ${supporting} supporting, ${contradicting} contradicting`);\n\n if (this.conclusion) {\n parts.push(`Conclusion: ${this.conclusion}`);\n }\n\n return parts.join(\"\\n\");\n }\n\n private reset(): void {\n this.hypothesis = null;\n this.iteration = 0;\n this.observations = [];\n this._active = false;\n this.conclusion = null;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ConveyorConfig {\n setupCommand?: string;\n startCommand?: string;\n previewPort?: number;\n}\n\nconst DEVCONTAINER_PATH = \".devcontainer/conveyor/devcontainer.json\";\n\nexport async function loadForwardPorts(workspaceDir: string): Promise<number[]> {\n try {\n const raw = await readFile(join(workspaceDir, DEVCONTAINER_PATH), \"utf-8\");\n const parsed = JSON.parse(raw) as { forwardPorts?: number[] };\n return parsed.forwardPorts ?? [];\n } catch {\n return [];\n }\n}\n\n/** Load config from env vars (project-level settings injected via bootstrap). */\nexport function loadConveyorConfig(): ConveyorConfig | null {\n const envSetup = process.env.CONVEYOR_SETUP_COMMAND;\n const envStart = process.env.CONVEYOR_START_COMMAND;\n const envPort = process.env.CONVEYOR_PREVIEW_PORT;\n if (envSetup || envStart) {\n return {\n setupCommand: envSetup,\n startCommand: envStart,\n previewPort: envPort ? Number(envPort) : undefined,\n };\n }\n return null;\n}\n","import { execSync } from \"node:child_process\";\n\n/** Fetch full git history if the repo was cloned with --depth=1. */\nexport function unshallowRepo(workspaceDir: string): void {\n try {\n execSync(\"git fetch --unshallow\", {\n cwd: workspaceDir,\n timeout: 60_000,\n stdio: \"ignore\",\n });\n } catch {\n // Already unshallowed or not a shallow clone\n }\n}\n"],"mappings":"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","names":["MAX_VARIABLE_VALUE_BYTES","MAX_VARIABLES_PER_SCOPE","AUTO_RESUME_TIMEOUT_MS","PROBE_BUFFER_MAX_SIZE","execSync"]}
1
+ {"version":3,"sources":["../src/runner/file-cache.ts","../src/debug/cdp-client.ts","../src/debug/playwright-types.ts","../src/debug/playwright-client.ts","../src/debug/debug-manager.ts","../src/debug/lifecycle-manager.ts","../src/debug/hypothesis-tracker.ts","../src/setup/config.ts","../src/setup/codespace.ts"],"sourcesContent":["/**\n * 50 MB default max cache size.\n * 1 hour default TTL.\n */\nconst DEFAULT_MAX_SIZE_BYTES = 50 * 1024 * 1024;\nconst DEFAULT_TTL_MS = 60 * 60 * 1000;\n\ninterface CacheEntry {\n content: Buffer;\n mimeType: string;\n fileName: string;\n createdAt: number;\n size: number;\n}\n\nexport class FileCache {\n private cache = new Map<string, CacheEntry>();\n private currentSize = 0;\n private readonly maxSizeBytes: number;\n private readonly ttlMs: number;\n\n constructor(maxSizeBytes = DEFAULT_MAX_SIZE_BYTES, ttlMs = DEFAULT_TTL_MS) {\n this.maxSizeBytes = maxSizeBytes;\n this.ttlMs = ttlMs;\n }\n\n get(fileId: string): CacheEntry | null {\n const entry = this.cache.get(fileId);\n if (!entry) return null;\n\n if (Date.now() - entry.createdAt > this.ttlMs) {\n this.delete(fileId);\n return null;\n }\n\n this.cache.delete(fileId);\n this.cache.set(fileId, entry);\n return entry;\n }\n\n set(fileId: string, content: Buffer, mimeType: string, fileName: string): void {\n if (this.cache.has(fileId)) {\n this.delete(fileId);\n }\n\n const size = content.byteLength;\n if (size > this.maxSizeBytes) return;\n\n while (this.currentSize + size > this.maxSizeBytes && this.cache.size > 0) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.delete(oldestKey);\n }\n }\n\n this.cache.set(fileId, {\n content,\n mimeType,\n fileName,\n createdAt: Date.now(),\n size,\n });\n this.currentSize += size;\n }\n\n private delete(fileId: string): void {\n const entry = this.cache.get(fileId);\n if (entry) {\n this.currentSize -= entry.size;\n this.cache.delete(fileId);\n }\n }\n\n clear(): void {\n this.cache.clear();\n this.currentSize = 0;\n }\n\n get stats(): { entries: number; sizeBytes: number; maxSizeBytes: number } {\n return {\n entries: this.cache.size,\n sizeBytes: this.currentSize,\n maxSizeBytes: this.maxSizeBytes,\n };\n }\n}\n","// ── CDP Protocol Types ─────────────────────────────────────────────────────\n\ninterface CdpRequest {\n id: number;\n method: string;\n params?: Record<string, unknown>;\n}\n\ninterface CdpResponse {\n id: number;\n result?: Record<string, unknown>;\n error?: { code: number; message: string };\n}\n\ninterface CdpEvent {\n method: string;\n params?: Record<string, unknown>;\n}\n\ninterface CdpCallFrame {\n callFrameId: string;\n functionName: string;\n location: { scriptId: string; lineNumber: number; columnNumber: number };\n url: string;\n scopeChain: CdpScope[];\n}\n\ninterface CdpScope {\n type: string;\n object: { objectId?: string };\n name?: string;\n}\n\ninterface CdpRemoteObject {\n type: string;\n subtype?: string;\n value?: unknown;\n description?: string;\n objectId?: string;\n}\n\ninterface CdpPropertyDescriptor {\n name: string;\n value?: CdpRemoteObject;\n configurable: boolean;\n enumerable: boolean;\n}\n\n// ── Public Types ───────────────────────────────────────────────────────────\n\nexport interface BreakpointInfo {\n breakpointId: string;\n file: string;\n line: number;\n condition?: string;\n}\n\nexport interface ProbeInfo {\n probeId: string;\n breakpointId: string;\n file: string;\n line: number;\n expressions: string[];\n label: string;\n}\n\nexport interface ProbeHit {\n label: string;\n data: Record<string, unknown>;\n timestamp: number;\n}\n\nexport interface CallFrameInfo {\n index: number;\n functionName: string;\n file: string;\n line: number;\n column: number;\n callFrameId: string;\n}\n\nexport interface ScopeVariable {\n name: string;\n type: string;\n value: string;\n}\n\nexport interface PausedState {\n callFrames: CallFrameInfo[];\n reason: string;\n hitBreakpoints?: string[];\n}\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\nconst MAX_VARIABLE_VALUE_BYTES = 2048;\nconst MAX_VARIABLES_PER_SCOPE = 50;\nconst AUTO_RESUME_TIMEOUT_MS = 30_000;\nconst PROBE_BUFFER_MAX_SIZE = 1000;\n\n// ── Protocol Types ────────────────────────────────────────────────────────\n\nexport type InspectorProtocol = \"cdp\" | \"webkit\";\n\n// ── CDP Client ─────────────────────────────────────────────────────────────\n\nexport class CdpDebugClient {\n private ws: WebSocket | null = null;\n private requestId = 0;\n private pendingRequests = new Map<\n number,\n { resolve: (value: Record<string, unknown>) => void; reject: (err: Error) => void }\n >();\n private breakpoints = new Map<string, BreakpointInfo>();\n private probes = new Map<string, ProbeInfo>();\n private probeCounter = 0;\n private probeBufferInjected = false;\n private pausedState: PausedState | null = null;\n private autoResumeTimer: ReturnType<typeof setTimeout> | null = null;\n private protocol: InspectorProtocol = \"cdp\";\n\n private onPausedCallback: ((state: PausedState) => void) | null = null;\n private onResumedCallback: (() => void) | null = null;\n private onAutoResumedCallback: (() => void) | null = null;\n\n // ── Connection ─────────────────────────────────────────────────────────\n\n // oxlint-disable-next-line require-await\n async connect(wsUrl: string, protocol?: InspectorProtocol): Promise<void> {\n if (this.ws) {\n throw new Error(\"Already connected to CDP\");\n }\n this.protocol = protocol ?? \"cdp\";\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(wsUrl);\n\n ws.addEventListener(\"open\", async () => {\n this.ws = ws;\n try {\n await this.send(\"Debugger.enable\", {});\n await this.send(\"Runtime.enable\", {});\n resolve();\n } catch (err) {\n reject(err);\n }\n });\n\n ws.addEventListener(\"message\", (event: MessageEvent) => {\n const data = typeof event.data === \"string\" ? event.data : String(event.data);\n this.handleMessage(data);\n });\n\n ws.addEventListener(\"error\", () => {\n reject(new Error(`CDP WebSocket connection failed: ${wsUrl}`));\n });\n\n ws.addEventListener(\"close\", () => {\n this.cleanup();\n });\n });\n }\n\n disconnect(): void {\n if (this.ws) {\n this.clearAutoResumeTimer();\n this.ws.close();\n this.cleanup();\n }\n }\n\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n getProtocol(): InspectorProtocol {\n return this.protocol;\n }\n\n // ── Breakpoints ────────────────────────────────────────────────────────\n\n async setBreakpoint(file: string, line: number, condition?: string): Promise<string> {\n const params: Record<string, unknown> = {\n urlRegex: this.fileToUrlRegex(file),\n // CDP uses 0-based lines\n lineNumber: line - 1,\n };\n if (condition) {\n params.condition = condition;\n }\n\n const result = await this.send(\"Debugger.setBreakpointByUrl\", params);\n const breakpointId = result.breakpointId as string;\n\n this.breakpoints.set(breakpointId, { breakpointId, file, line, condition });\n return breakpointId;\n }\n\n async removeBreakpoint(breakpointId: string): Promise<void> {\n await this.send(\"Debugger.removeBreakpoint\", { breakpointId });\n this.breakpoints.delete(breakpointId);\n }\n\n async removeAllBreakpoints(): Promise<void> {\n const ids = [...this.breakpoints.keys()];\n for (const id of ids) {\n try {\n await this.removeBreakpoint(id);\n } catch {\n // Best-effort removal\n this.breakpoints.delete(id);\n }\n }\n }\n\n listBreakpoints(): BreakpointInfo[] {\n return [...this.breakpoints.values()];\n }\n\n // ── Probes (Logpoints) ────────────────────────────────────────────────\n\n async setLogpoint(\n file: string,\n line: number,\n expressions: string[],\n label?: string,\n ): Promise<string> {\n await this.ensureProbeBuffer();\n\n const probeId = `probe-${++this.probeCounter}`;\n const probeLabel = label ?? `${file}:${line}`;\n\n // Build the condition expression: captures each expression into a data object,\n // calls the probe buffer, and always returns false so execution never pauses.\n const dataEntries = expressions.map((expr) => `${JSON.stringify(expr)}: (${expr})`).join(\", \");\n const condition = `(globalThis.__conveyorProbes?.probe(${JSON.stringify(probeLabel)}, {${dataEntries}}), false)`;\n\n const breakpointId = await this.setBreakpoint(file, line, condition);\n\n const probe: ProbeInfo = { probeId, breakpointId, file, line, expressions, label: probeLabel };\n this.probes.set(probeId, probe);\n return probeId;\n }\n\n async removeProbe(probeId: string): Promise<void> {\n const probe = this.probes.get(probeId);\n if (!probe) {\n throw new Error(`Probe ${probeId} not found`);\n }\n await this.removeBreakpoint(probe.breakpointId);\n this.probes.delete(probeId);\n }\n\n listProbes(): ProbeInfo[] {\n return [...this.probes.values()];\n }\n\n async getProbeResults(label?: string, limit?: number): Promise<ProbeHit[]> {\n const args = [\n label === undefined ? \"undefined\" : JSON.stringify(label),\n limit === undefined ? \"undefined\" : String(limit),\n ].join(\", \");\n\n const result = await this.evaluate(\n `JSON.stringify(globalThis.__conveyorProbes?.read(${args}) ?? [])`,\n );\n\n if (result.type === \"error\") {\n return [];\n }\n\n try {\n // The value comes back as a JSON-encoded string (with quotes around it)\n const raw = result.value;\n const parsed = JSON.parse(raw.startsWith('\"') ? JSON.parse(raw) : raw);\n return parsed as ProbeHit[];\n } catch {\n return [];\n }\n }\n\n async clearProbeResults(label?: string): Promise<void> {\n const arg = label === undefined ? \"undefined\" : JSON.stringify(label);\n await this.evaluate(`(globalThis.__conveyorProbes?.clear(${arg}), undefined)`);\n }\n\n // ── Paused State ───────────────────────────────────────────────────────\n\n isPaused(): boolean {\n return this.pausedState !== null;\n }\n\n getPausedState(): PausedState | null {\n return this.pausedState;\n }\n\n getCallStack(): CallFrameInfo[] {\n return this.pausedState?.callFrames ?? [];\n }\n\n async getScopeVariables(callFrameId: string): Promise<ScopeVariable[]> {\n if (!this.pausedState) {\n throw new Error(\"Debugger is not paused\");\n }\n\n const frame = this.pausedState.callFrames.find((f) => f.callFrameId === callFrameId);\n if (!frame) {\n throw new Error(`Call frame ${callFrameId} not found`);\n }\n\n // Re-fetch scope chain from CDP by finding the original callFrames data\n // We need to use the callFrameId to evaluate and get scope objects\n const result = await this.send(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression: \"this\",\n returnByValue: false,\n });\n\n // Get local scope variables via the scope chain\n // We'll evaluate a special expression to gather locals\n const variables: ScopeVariable[] = [];\n\n try {\n const scopeResult = await this.send(\"Runtime.getProperties\", {\n objectId: (result.result as CdpRemoteObject)?.objectId,\n ownProperties: true,\n generatePreview: false,\n });\n\n const descriptors = (scopeResult.result as CdpPropertyDescriptor[]) ?? [];\n for (const desc of descriptors.slice(0, MAX_VARIABLES_PER_SCOPE)) {\n if (desc.value) {\n variables.push({\n name: desc.name,\n type: desc.value.type,\n value: this.truncateValue(this.formatRemoteObject(desc.value)),\n });\n }\n }\n } catch {\n // If scope inspection fails, return what we have\n }\n\n return variables;\n }\n\n // ── Execution Control ──────────────────────────────────────────────────\n\n async resume(): Promise<void> {\n this.clearAutoResumeTimer();\n await this.send(\"Debugger.resume\", {});\n this.pausedState = null;\n }\n\n async stepOver(): Promise<void> {\n this.clearAutoResumeTimer();\n await this.send(\"Debugger.stepOver\", {});\n }\n\n async stepInto(): Promise<void> {\n this.clearAutoResumeTimer();\n await this.send(\"Debugger.stepInto\", {});\n }\n\n // ── Evaluation ─────────────────────────────────────────────────────────\n\n async evaluate(\n expression: string,\n callFrameId?: string,\n ): Promise<{ type: string; value: string }> {\n let result: Record<string, unknown>;\n\n if (callFrameId && this.pausedState) {\n result = await this.send(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression,\n returnByValue: false,\n generatePreview: true,\n });\n } else {\n result = await this.send(\"Runtime.evaluate\", {\n expression,\n returnByValue: false,\n generatePreview: true,\n });\n }\n\n const remoteObj = result.result as CdpRemoteObject;\n const errorValue = this.extractEvalError(result, remoteObj);\n if (errorValue !== null) {\n return { type: \"error\", value: errorValue };\n }\n\n return {\n type: remoteObj?.type ?? \"undefined\",\n value: this.truncateValue(this.formatRemoteObject(remoteObj)),\n };\n }\n\n // ── Event Callbacks ────────────────────────────────────────────────────\n\n onPaused(callback: (state: PausedState) => void): void {\n this.onPausedCallback = callback;\n }\n\n onResumed(callback: () => void): void {\n this.onResumedCallback = callback;\n }\n\n onAutoResumed(callback: () => void): void {\n this.onAutoResumedCallback = callback;\n }\n\n // ── Private: CDP Communication ─────────────────────────────────────────\n\n private send(method: string, params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n reject(new Error(\"CDP WebSocket is not connected\"));\n return;\n }\n\n const id = ++this.requestId;\n const request: CdpRequest = { id, method, params };\n\n this.pendingRequests.set(id, { resolve, reject });\n this.ws.send(JSON.stringify(request));\n\n // Timeout after 10 seconds\n setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`CDP request timed out: ${method}`));\n }\n }, 10_000);\n });\n }\n\n private handleMessage(raw: string): void {\n let msg: CdpResponse | CdpEvent;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n\n // Handle responses to our requests\n if (\"id\" in msg && typeof msg.id === \"number\") {\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n this.pendingRequests.delete(msg.id);\n const response = msg as CdpResponse;\n if (response.error) {\n pending.reject(new Error(`CDP error: ${response.error.message}`));\n } else {\n pending.resolve(response.result ?? {});\n }\n }\n return;\n }\n\n // Handle events\n const event = msg as CdpEvent;\n if (event.method === \"Debugger.paused\") {\n this.handlePaused(event.params ?? {});\n } else if (event.method === \"Debugger.resumed\") {\n this.pausedState = null;\n this.clearAutoResumeTimer();\n this.onResumedCallback?.();\n }\n }\n\n private handlePaused(params: Record<string, unknown>): void {\n const rawFrames = (params.callFrames as CdpCallFrame[]) ?? [];\n const reason = (params.reason as string) ?? \"unknown\";\n const hitBreakpoints = params.hitBreakpoints as string[] | undefined;\n\n const callFrames: CallFrameInfo[] = rawFrames.map((frame, index) => ({\n index,\n functionName: frame.functionName || \"(anonymous)\",\n file: frame.url,\n // Convert to 1-based\n line: frame.location.lineNumber + 1,\n column: frame.location.columnNumber + 1,\n callFrameId: frame.callFrameId,\n }));\n\n this.pausedState = { callFrames, reason, hitBreakpoints };\n\n // Start auto-resume timer\n this.clearAutoResumeTimer();\n this.autoResumeTimer = setTimeout(() => {\n if (this.pausedState) {\n this.resume()\n .then(() => {\n this.onAutoResumedCallback?.();\n })\n .catch(() => {\n // Best-effort auto-resume\n });\n }\n }, AUTO_RESUME_TIMEOUT_MS);\n\n this.onPausedCallback?.(this.pausedState);\n }\n\n // ── Private: Probe Buffer ──────────────────────────────────────────────\n\n private async ensureProbeBuffer(): Promise<void> {\n if (this.probeBufferInjected) return;\n\n await this.send(\"Runtime.evaluate\", {\n expression: `\n globalThis.__conveyorProbes = globalThis.__conveyorProbes || {\n _buffer: [],\n _maxSize: ${PROBE_BUFFER_MAX_SIZE},\n probe(label, data) {\n this._buffer.push({ label, data, timestamp: Date.now() });\n if (this._buffer.length > this._maxSize) this._buffer.shift();\n },\n read(label, limit) {\n const items = label !== undefined\n ? this._buffer.filter(function(e) { return e.label === label; })\n : this._buffer;\n return limit !== undefined ? items.slice(-limit) : items;\n },\n clear(label) {\n if (label !== undefined) {\n this._buffer = this._buffer.filter(function(e) { return e.label !== label; });\n } else {\n this._buffer = [];\n }\n }\n };\n \"ok\"\n `,\n returnByValue: true,\n });\n\n this.probeBufferInjected = true;\n }\n\n // ── Private: Helpers ───────────────────────────────────────────────────\n\n private extractEvalError(\n result: Record<string, unknown>,\n remoteObj: CdpRemoteObject | undefined,\n ): string | null {\n // WebKit Inspector Protocol uses `wasThrown` instead of `exceptionDetails`\n if (this.protocol === \"webkit\") {\n if (result.wasThrown) {\n return remoteObj?.description ?? remoteObj?.value?.toString() ?? \"Unknown error\";\n }\n return null;\n }\n\n const exceptionDetails = result.exceptionDetails as\n | { text: string; exception?: CdpRemoteObject }\n | undefined;\n\n if (exceptionDetails) {\n return exceptionDetails.exception?.description ?? exceptionDetails.text ?? \"Unknown error\";\n }\n return null;\n }\n\n private fileToUrlRegex(file: string): string {\n // Escape regex special chars and create a pattern that matches the file path\n const escaped = file.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return `.*${escaped}$`;\n }\n\n private formatRemoteObject(obj: CdpRemoteObject | undefined): string {\n if (!obj) return \"undefined\";\n\n if (obj.type === \"undefined\") return \"undefined\";\n if (obj.type === \"boolean\" || obj.type === \"number\") return String(obj.value);\n if (obj.type === \"string\") return JSON.stringify(obj.value);\n if (obj.value === null) return \"null\";\n\n // For complex objects, use description or type+subtype\n if (obj.description) return obj.description;\n if (obj.subtype) return `[${obj.type}:${obj.subtype}]`;\n return `[${obj.type}]`;\n }\n\n private truncateValue(value: string): string {\n if (value.length <= MAX_VARIABLE_VALUE_BYTES) return value;\n return value.slice(0, MAX_VARIABLE_VALUE_BYTES - 3) + \"...\";\n }\n\n private clearAutoResumeTimer(): void {\n if (this.autoResumeTimer) {\n clearTimeout(this.autoResumeTimer);\n this.autoResumeTimer = null;\n }\n }\n\n private cleanup(): void {\n this.clearAutoResumeTimer();\n this.ws = null;\n this.pausedState = null;\n this.probes.clear();\n this.probeBufferInjected = false;\n for (const [, pending] of this.pendingRequests) {\n pending.reject(new Error(\"CDP connection closed\"));\n }\n this.pendingRequests.clear();\n }\n}\n","// Minimal Playwright type interfaces — actual objects come from dynamic import at runtime.\nexport interface PwBrowser {\n close(): Promise<void>;\n contexts(): PwBrowserContext[];\n}\nexport interface PwBrowserContext {\n newCDPSession(page: PwPage): Promise<PwCDPSession>;\n}\nexport interface PwPage {\n goto(url: string, opts?: { waitUntil?: string }): Promise<unknown>;\n screenshot(opts?: { type?: string; encoding?: string }): Promise<string | Buffer>;\n on(event: string, handler: (...args: unknown[]) => void): void;\n click(selector: string, opts?: { timeout?: number }): Promise<void>;\n url(): string;\n close(): Promise<void>;\n}\nexport interface PwCDPSession {\n send(method: string, params?: Record<string, unknown>): Promise<Record<string, unknown>>;\n on(event: string, handler: (params: Record<string, unknown>) => void): void;\n detach(): Promise<void>;\n}\n\nexport interface CdpCallFrame {\n callFrameId: string;\n functionName: string;\n location: { scriptId: string; lineNumber: number; columnNumber: number };\n url: string;\n scopeChain: { type: string; object: { objectId?: string }; name?: string }[];\n}\nexport interface CdpRemoteObject {\n type: string;\n subtype?: string;\n value?: unknown;\n description?: string;\n objectId?: string;\n}\nexport interface CdpPropertyDescriptor {\n name: string;\n value?: CdpRemoteObject;\n configurable: boolean;\n enumerable: boolean;\n}\n\nexport interface ConsoleMessage {\n level: string;\n text: string;\n timestamp: number;\n url?: string;\n line?: number;\n}\nexport interface NetworkRequest {\n url: string;\n method: string;\n status?: number;\n resourceType?: string;\n timestamp: number;\n duration?: number;\n}\nexport interface ClientPageError {\n message: string;\n stack?: string;\n timestamp: number;\n}\n\nconst MAX_VARIABLE_VALUE_BYTES = 2048;\n\nexport function formatRemoteObject(obj: CdpRemoteObject | undefined): string {\n if (!obj) return \"undefined\";\n if (obj.type === \"undefined\") return \"undefined\";\n if (obj.type === \"boolean\" || obj.type === \"number\") return String(obj.value);\n if (obj.type === \"string\") return JSON.stringify(obj.value);\n if (obj.value === null) return \"null\";\n if (obj.description) return obj.description;\n if (obj.subtype) return `[${obj.type}:${obj.subtype}]`;\n return `[${obj.type}]`;\n}\n\nexport function truncateValue(value: string): string {\n if (value.length <= MAX_VARIABLE_VALUE_BYTES) return value;\n return value.slice(0, MAX_VARIABLE_VALUE_BYTES - 3) + \"...\";\n}\n","import type {\n BreakpointInfo,\n CallFrameInfo,\n ScopeVariable,\n PausedState,\n ProbeInfo,\n ProbeHit,\n} from \"./cdp-client.js\";\nimport type {\n PwBrowser,\n PwBrowserContext,\n PwPage,\n PwCDPSession,\n CdpCallFrame,\n CdpRemoteObject,\n CdpPropertyDescriptor,\n ConsoleMessage,\n NetworkRequest,\n ClientPageError,\n} from \"./playwright-types.js\";\nimport { formatRemoteObject, truncateValue } from \"./playwright-types.js\";\n\nexport type { ConsoleMessage, NetworkRequest, ClientPageError } from \"./playwright-types.js\";\nconst MAX_VARIABLES_PER_SCOPE = 50;\nconst AUTO_RESUME_TIMEOUT_MS = 30_000;\nconst PROBE_BUFFER_MAX_SIZE = 1000;\nconst BUFFER_MAX = 500;\nconst ERROR_BUFFER_MAX = 200;\nconst INACTIVITY_TIMEOUT_MS = 600_000;\n\nexport class PlaywrightDebugClient {\n private browser: PwBrowser | null = null;\n private page: PwPage | null = null;\n private cdpSession: PwCDPSession | null = null;\n private breakpoints = new Map<string, BreakpointInfo>();\n private probes = new Map<string, ProbeInfo>();\n private probeCounter = 0;\n private probeBufferInjected = false;\n private pausedState: PausedState | null = null;\n private autoResumeTimer: ReturnType<typeof setTimeout> | null = null;\n private inactivityTimer: ReturnType<typeof setTimeout> | null = null;\n private onPausedCallback: ((state: PausedState) => void) | null = null;\n private onResumedCallback: (() => void) | null = null;\n private onAutoResumedCallback: (() => void) | null = null;\n private consoleMessages: ConsoleMessage[] = [];\n private networkRequests: NetworkRequest[] = [];\n private pageErrors: ClientPageError[] = [];\n private sourceMapDetected: boolean | null = null;\n\n async launch(previewUrl: string): Promise<void> {\n if (this.browser) throw new Error(\"Playwright browser is already running\");\n\n // @ts-expect-error playwright-core is lazily installed at runtime, not a compile-time dep\n const { chromium } = await import(\"playwright-core\");\n this.browser = (await chromium.launch({\n headless: true,\n args: [\n \"--no-sandbox\",\n \"--disable-setuid-sandbox\",\n \"--disable-dev-shm-usage\",\n \"--disable-gpu\",\n ],\n })) as unknown as PwBrowser;\n\n const context =\n this.browser.contexts()[0] ??\n (await (this.browser as never as { newContext(): Promise<PwBrowserContext> }).newContext());\n this.page = await (context as never as { newPage(): Promise<PwPage> }).newPage();\n this.setupPassiveCapture();\n await this.page.goto(previewUrl, { waitUntil: \"domcontentloaded\" });\n\n this.cdpSession = await context.newCDPSession(this.page);\n await this.cdpSession.send(\"Debugger.enable\", {});\n await this.cdpSession.send(\"Runtime.enable\", {});\n this.setupCdpEvents();\n await this.checkSourceMaps();\n this.resetInactivityTimer();\n }\n\n async close(): Promise<void> {\n this.clearAutoResumeTimer();\n this.clearInactivityTimer();\n if (this.cdpSession) {\n try {\n await this.cdpSession.detach();\n } catch {\n // Best-effort detach\n }\n this.cdpSession = null;\n }\n if (this.browser) {\n try {\n await this.browser.close();\n } catch {\n // Best-effort close\n }\n this.browser = null;\n }\n this.page = null;\n this.pausedState = null;\n this.breakpoints.clear();\n this.probes.clear();\n this.probeBufferInjected = false;\n this.consoleMessages = [];\n this.networkRequests = [];\n this.pageErrors = [];\n }\n\n isConnected(): boolean {\n return this.browser !== null && this.cdpSession !== null;\n }\n hasSourceMaps(): boolean | null {\n return this.sourceMapDetected;\n }\n\n async setBreakpoint(file: string, line: number, condition?: string): Promise<string> {\n const session = this.requireSession();\n this.resetInactivityTimer();\n const params: Record<string, unknown> = {\n urlRegex: this.fileToUrlRegex(file),\n // CDP uses 0-based lines\n lineNumber: line - 1,\n };\n if (condition) params.condition = condition;\n const result = await session.send(\"Debugger.setBreakpointByUrl\", params);\n const breakpointId = result.breakpointId as string;\n this.breakpoints.set(breakpointId, { breakpointId, file, line, condition });\n return breakpointId;\n }\n\n async removeBreakpoint(breakpointId: string): Promise<void> {\n const session = this.requireSession();\n await session.send(\"Debugger.removeBreakpoint\", { breakpointId });\n this.breakpoints.delete(breakpointId);\n }\n\n async removeAllBreakpoints(): Promise<void> {\n for (const id of [...this.breakpoints.keys()]) {\n try {\n await this.removeBreakpoint(id);\n } catch {\n this.breakpoints.delete(id);\n }\n }\n }\n\n listBreakpoints(): BreakpointInfo[] {\n return [...this.breakpoints.values()];\n }\n\n async setLogpoint(\n file: string,\n line: number,\n expressions: string[],\n label?: string,\n ): Promise<string> {\n await this.ensureProbeBuffer();\n const probeId = `client-probe-${++this.probeCounter}`;\n const probeLabel = label ?? `${file}:${line}`;\n const dataEntries = expressions.map((expr) => `${JSON.stringify(expr)}: (${expr})`).join(\", \");\n const condition = `(globalThis.__conveyorProbes?.probe(${JSON.stringify(probeLabel)}, {${dataEntries}}), false)`;\n const breakpointId = await this.setBreakpoint(file, line, condition);\n this.probes.set(probeId, { probeId, breakpointId, file, line, expressions, label: probeLabel });\n return probeId;\n }\n\n async removeProbe(probeId: string): Promise<void> {\n const probe = this.probes.get(probeId);\n if (!probe) throw new Error(`Probe ${probeId} not found`);\n await this.removeBreakpoint(probe.breakpointId);\n this.probes.delete(probeId);\n }\n\n listProbes(): ProbeInfo[] {\n return [...this.probes.values()];\n }\n\n async getProbeResults(label?: string, limit?: number): Promise<ProbeHit[]> {\n const args = [\n label === undefined ? \"undefined\" : JSON.stringify(label),\n limit === undefined ? \"undefined\" : String(limit),\n ].join(\", \");\n const result = await this.evaluate(\n `JSON.stringify(globalThis.__conveyorProbes?.read(${args}) ?? [])`,\n );\n if (result.type === \"error\") return [];\n try {\n const raw = result.value;\n return JSON.parse(raw.startsWith('\"') ? JSON.parse(raw) : raw) as ProbeHit[];\n } catch {\n return [];\n }\n }\n\n async clearProbeResults(label?: string): Promise<void> {\n const arg = label === undefined ? \"undefined\" : JSON.stringify(label);\n await this.evaluate(`(globalThis.__conveyorProbes?.clear(${arg}), undefined)`);\n }\n\n isPaused(): boolean {\n return this.pausedState !== null;\n }\n getPausedState(): PausedState | null {\n return this.pausedState;\n }\n getCallStack(): CallFrameInfo[] {\n return this.pausedState?.callFrames ?? [];\n }\n\n async getScopeVariables(callFrameId: string): Promise<ScopeVariable[]> {\n if (!this.pausedState) throw new Error(\"Debugger is not paused\");\n const session = this.requireSession();\n const frame = this.pausedState.callFrames.find((f) => f.callFrameId === callFrameId);\n if (!frame) throw new Error(`Call frame ${callFrameId} not found`);\n\n const result = await session.send(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression: \"this\",\n returnByValue: false,\n });\n const variables: ScopeVariable[] = [];\n try {\n const scopeResult = await session.send(\"Runtime.getProperties\", {\n objectId: (result.result as CdpRemoteObject)?.objectId,\n ownProperties: true,\n generatePreview: false,\n });\n for (const desc of ((scopeResult.result as CdpPropertyDescriptor[]) ?? []).slice(\n 0,\n MAX_VARIABLES_PER_SCOPE,\n )) {\n if (desc.value) {\n variables.push({\n name: desc.name,\n type: desc.value.type,\n value: truncateValue(formatRemoteObject(desc.value)),\n });\n }\n }\n } catch {\n // Scope inspection can fail for some frames\n }\n return variables;\n }\n\n async resume(): Promise<void> {\n this.clearAutoResumeTimer();\n await this.requireSession().send(\"Debugger.resume\", {});\n this.pausedState = null;\n }\n\n async stepOver(): Promise<void> {\n this.clearAutoResumeTimer();\n await this.requireSession().send(\"Debugger.stepOver\", {});\n }\n\n async stepInto(): Promise<void> {\n this.clearAutoResumeTimer();\n await this.requireSession().send(\"Debugger.stepInto\", {});\n }\n\n async evaluate(\n expression: string,\n callFrameId?: string,\n ): Promise<{ type: string; value: string }> {\n const session = this.requireSession();\n this.resetInactivityTimer();\n let result: Record<string, unknown>;\n if (callFrameId && this.pausedState) {\n result = await session.send(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression,\n returnByValue: false,\n generatePreview: true,\n });\n } else {\n result = await session.send(\"Runtime.evaluate\", {\n expression,\n returnByValue: false,\n generatePreview: true,\n });\n }\n const remoteObj = result.result as CdpRemoteObject;\n const exDetails = result.exceptionDetails as\n | { text: string; exception?: CdpRemoteObject }\n | undefined;\n if (exDetails) {\n return {\n type: \"error\",\n value: exDetails.exception?.description ?? exDetails.text ?? \"Unknown error\",\n };\n }\n return {\n type: remoteObj?.type ?? \"undefined\",\n value: truncateValue(formatRemoteObject(remoteObj)),\n };\n }\n\n async navigate(url: string): Promise<void> {\n this.requirePage();\n this.resetInactivityTimer();\n await this.page?.goto(url, { waitUntil: \"domcontentloaded\" });\n }\n\n async click(selector: string): Promise<void> {\n this.requirePage();\n this.resetInactivityTimer();\n await this.page?.click(selector, { timeout: 10_000 });\n }\n\n async screenshot(): Promise<string> {\n this.requirePage();\n this.resetInactivityTimer();\n const buffer = await this.page?.screenshot({ type: \"png\", encoding: \"base64\" });\n return typeof buffer === \"string\" ? buffer : Buffer.from(buffer as Buffer).toString(\"base64\");\n }\n\n getCurrentUrl(): string {\n this.requirePage();\n return this.page?.url() ?? \"\";\n }\n\n getConsoleMessages(level?: string, limit?: number): ConsoleMessage[] {\n let messages = this.consoleMessages;\n if (level) messages = messages.filter((m) => m.level === level);\n if (limit) messages = messages.slice(-limit);\n return messages;\n }\n\n getNetworkRequests(filter?: string, limit?: number): NetworkRequest[] {\n let requests = this.networkRequests;\n if (filter) {\n const regex = new RegExp(filter, \"i\");\n requests = requests.filter((r) => regex.test(r.url));\n }\n if (limit) requests = requests.slice(-limit);\n return requests;\n }\n\n getPageErrors(limit?: number): ClientPageError[] {\n return limit ? this.pageErrors.slice(-limit) : [...this.pageErrors];\n }\n\n onPaused(callback: (state: PausedState) => void): void {\n this.onPausedCallback = callback;\n }\n onResumed(callback: () => void): void {\n this.onResumedCallback = callback;\n }\n onAutoResumed(callback: () => void): void {\n this.onAutoResumedCallback = callback;\n }\n\n // ── Private ───────────────────────────────────────────────────────────\n\n private setupCdpEvents(): void {\n if (!this.cdpSession) return;\n this.cdpSession.on(\"Debugger.paused\", (params) => this.handlePaused(params));\n this.cdpSession.on(\"Debugger.resumed\", () => {\n this.pausedState = null;\n this.clearAutoResumeTimer();\n this.onResumedCallback?.();\n });\n }\n\n private handlePaused(params: Record<string, unknown>): void {\n const rawFrames = (params.callFrames as CdpCallFrame[]) ?? [];\n const callFrames: CallFrameInfo[] = rawFrames.map((frame, index) => ({\n index,\n functionName: frame.functionName || \"(anonymous)\",\n file: frame.url,\n line: frame.location.lineNumber + 1,\n column: frame.location.columnNumber + 1,\n callFrameId: frame.callFrameId,\n }));\n this.pausedState = {\n callFrames,\n reason: (params.reason as string) ?? \"unknown\",\n hitBreakpoints: params.hitBreakpoints as string[] | undefined,\n };\n this.clearAutoResumeTimer();\n this.autoResumeTimer = setTimeout(() => {\n if (this.pausedState) {\n this.resume()\n .then(() => this.onAutoResumedCallback?.())\n .catch(() => {});\n }\n }, AUTO_RESUME_TIMEOUT_MS);\n this.onPausedCallback?.(this.pausedState);\n }\n\n private setupPassiveCapture(): void {\n if (!this.page) return;\n this.page.on(\"console\", (msg: unknown) => {\n const m = msg as {\n type(): string;\n text(): string;\n location(): { url?: string; lineNumber?: number };\n };\n this.consoleMessages.push({\n level: m.type(),\n text: m.text(),\n timestamp: Date.now(),\n url: m.location()?.url,\n line: m.location()?.lineNumber,\n });\n if (this.consoleMessages.length > BUFFER_MAX) this.consoleMessages.shift();\n });\n this.page.on(\"pageerror\", (error: unknown) => {\n const e = error as { message: string; stack?: string };\n this.pageErrors.push({ message: e.message, stack: e.stack, timestamp: Date.now() });\n if (this.pageErrors.length > ERROR_BUFFER_MAX) this.pageErrors.shift();\n });\n this.page.on(\"request\", (request: unknown) => {\n const r = request as { url(): string; method(): string; resourceType(): string };\n this.networkRequests.push({\n url: r.url(),\n method: r.method(),\n resourceType: r.resourceType(),\n timestamp: Date.now(),\n });\n if (this.networkRequests.length > BUFFER_MAX) this.networkRequests.shift();\n });\n this.page.on(\"response\", (response: unknown) => {\n const resp = response as { url(): string; status(): number };\n const url = resp.url();\n for (let i = this.networkRequests.length - 1; i >= 0; i--) {\n const req = this.networkRequests[i];\n if (req.url === url && req.status === undefined) {\n req.status = resp.status();\n req.duration = Date.now() - req.timestamp;\n break;\n }\n }\n });\n }\n\n private async checkSourceMaps(): Promise<void> {\n const hasMapFiles = this.networkRequests.some(\n (r) => r.url.endsWith(\".map\") || r.url.includes(\"sourceMappingURL\"),\n );\n if (hasMapFiles) {\n this.sourceMapDetected = true;\n return;\n }\n try {\n const result = await this.requireSession().send(\"Runtime.evaluate\", {\n expression: \"true\",\n returnByValue: true,\n });\n this.sourceMapDetected = result.result ? null : false;\n } catch {\n this.sourceMapDetected = null;\n }\n }\n\n private async ensureProbeBuffer(): Promise<void> {\n if (this.probeBufferInjected) return;\n const session = this.requireSession();\n await session.send(\"Runtime.evaluate\", {\n expression: `globalThis.__conveyorProbes=globalThis.__conveyorProbes||{_buffer:[],_maxSize:${PROBE_BUFFER_MAX_SIZE},probe(l,d){this._buffer.push({label:l,data:d,timestamp:Date.now()});if(this._buffer.length>this._maxSize)this._buffer.shift()},read(l,n){var i=l!==void 0?this._buffer.filter(function(e){return e.label===l}):this._buffer;return n!==void 0?i.slice(-n):i},clear(l){if(l!==void 0){this._buffer=this._buffer.filter(function(e){return e.label!==l})}else{this._buffer=[]}}};\"ok\"`,\n returnByValue: true,\n });\n this.probeBufferInjected = true;\n }\n\n private requireSession(): PwCDPSession {\n if (!this.cdpSession) throw new Error(\"Playwright CDP session is not connected\");\n return this.cdpSession;\n }\n\n private requirePage(): void {\n if (!this.page) throw new Error(\"No page available\");\n }\n\n private fileToUrlRegex(file: string): string {\n return `.*${file.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}$`;\n }\n\n private clearAutoResumeTimer(): void {\n if (this.autoResumeTimer) {\n clearTimeout(this.autoResumeTimer);\n this.autoResumeTimer = null;\n }\n }\n\n private resetInactivityTimer(): void {\n this.clearInactivityTimer();\n this.inactivityTimer = setTimeout(() => {\n this.close().catch(() => {});\n }, INACTIVITY_TIMEOUT_MS);\n }\n\n private clearInactivityTimer(): void {\n if (this.inactivityTimer) {\n clearTimeout(this.inactivityTimer);\n this.inactivityTimer = null;\n }\n }\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { execSync } from \"node:child_process\";\nimport { CdpDebugClient, type PausedState } from \"./cdp-client.js\";\nimport { PlaywrightDebugClient } from \"./playwright-client.js\";\nimport { injectTelemetry } from \"./telemetry-injector.js\";\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport type InspectorRuntime = \"node\" | \"bun\" | \"unknown\";\n\nexport interface DebugEventHandler {\n onDebugModeEntered: () => void;\n onDebugModeExited: () => void;\n onBreakpointHit: (state: PausedState) => void;\n onClientBreakpointHit: (state: PausedState) => void;\n onAutoResumed: () => void;\n onDebugError: (message: string) => void;\n onOutput: (stream: \"stdout\" | \"stderr\", data: string) => void;\n}\n\nexport interface DebugModeOptions {\n serverSide?: boolean;\n clientSide?: boolean;\n previewUrl?: string;\n}\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\n/** Matches Node.js: `Debugger listening on ws://127.0.0.1:9229/{uuid}` */\nconst NODE_INSPECTOR_REGEX = /Debugger listening on (ws:\\/\\/127\\.0\\.0\\.1:\\d+\\/[^\\s]+)/;\n\n/** Matches Bun's inspector URL anywhere in stderr (e.g. `ws://localhost:6499/{token}`) */\nconst BUN_INSPECTOR_REGEX = /(ws:\\/\\/[\\w.-]+:\\d+\\/[\\w-]+)/;\n\nconst CONNECTION_TIMEOUT_MS = 10_000;\nconst PLAYWRIGHT_INSTALL_TIMEOUT_MS = 120_000;\n\n// ── Debug Manager ──────────────────────────────────────────────────────────\n\nexport class DebugManager {\n private cdpClient: CdpDebugClient | null = null;\n private playwrightClient: PlaywrightDebugClient | null = null;\n private debugProcess: ChildProcess | null = null;\n private _isDebugMode = false;\n private _isClientDebugMode = false;\n private startCommand: string;\n private workingDir: string;\n private eventHandler: DebugEventHandler;\n private breakpointHitQueue: PausedState[] = [];\n private clientBreakpointHitQueue: PausedState[] = [];\n\n constructor(startCommand: string, workingDir: string, eventHandler: DebugEventHandler) {\n this.startCommand = startCommand;\n this.workingDir = workingDir;\n this.eventHandler = eventHandler;\n }\n\n // ── Public API ─────────────────────────────────────────────────────────\n\n isDebugMode(): boolean {\n return this._isDebugMode;\n }\n\n isClientDebugMode(): boolean {\n return this._isClientDebugMode;\n }\n\n getClient(): CdpDebugClient | null {\n return this.cdpClient;\n }\n\n getPlaywrightClient(): PlaywrightDebugClient | null {\n return this.playwrightClient;\n }\n\n drainBreakpointHitQueue(): PausedState[] {\n const queued = [...this.breakpointHitQueue];\n this.breakpointHitQueue = [];\n return queued;\n }\n\n drainClientBreakpointHitQueue(): PausedState[] {\n const queued = [...this.clientBreakpointHitQueue];\n this.clientBreakpointHitQueue = [];\n return queued;\n }\n\n async enterDebugMode(killCurrentProcess?: () => void, options?: DebugModeOptions): Promise<void> {\n const serverSide = options?.serverSide ?? !options?.clientSide;\n const clientSide = options?.clientSide ?? false;\n\n if (serverSide && this._isDebugMode) {\n throw new Error(\"Already in server debug mode\");\n }\n if (clientSide && this._isClientDebugMode) {\n throw new Error(\"Already in client debug mode\");\n }\n\n if (serverSide && !this._isDebugMode) {\n await this.activateServerDebug(killCurrentProcess);\n }\n\n if (clientSide && !this._isClientDebugMode) {\n await this.activateClientDebug(options?.previewUrl);\n }\n\n this.eventHandler.onDebugModeEntered();\n }\n\n async exitDebugMode(restartNormalServer?: () => void): Promise<void> {\n if (!this._isDebugMode && !this._isClientDebugMode) {\n throw new Error(\"Not in debug mode\");\n }\n\n // Clean up server-side CDP\n if (this.cdpClient) {\n try {\n await this.cdpClient.removeAllBreakpoints();\n } catch {\n // Best-effort cleanup\n }\n this.cdpClient.disconnect();\n this.cdpClient = null;\n }\n\n // Clean up client-side Playwright\n if (this.playwrightClient) {\n try {\n await this.playwrightClient.removeAllBreakpoints();\n } catch {\n // Best-effort cleanup\n }\n try {\n await this.playwrightClient.close();\n } catch {\n // Best-effort cleanup\n }\n this.playwrightClient = null;\n }\n\n // Kill the debug process\n if (this.debugProcess && !this.debugProcess.killed) {\n this.debugProcess.kill(\"SIGTERM\");\n this.debugProcess = null;\n }\n\n this._isDebugMode = false;\n this._isClientDebugMode = false;\n this.breakpointHitQueue = [];\n this.clientBreakpointHitQueue = [];\n\n // Restart the normal dev server\n restartNormalServer?.();\n this.eventHandler.onDebugModeExited();\n }\n\n // ── Debug Mode Activation ────────────────────────────────────────────\n\n private async activateServerDebug(killCurrentProcess?: () => void): Promise<void> {\n killCurrentProcess?.();\n\n // Start the dev server with --inspect\n const runtime = detectRuntime(this.startCommand);\n const inspectorUrl = await this.startWithInspector();\n\n // Connect CDP client — Bun uses WebKit Inspector Protocol\n const protocol = runtime === \"bun\" ? \"webkit\" : \"cdp\";\n this.cdpClient = new CdpDebugClient();\n\n this.cdpClient.onPaused((state) => {\n this.breakpointHitQueue.push(state);\n this.eventHandler.onBreakpointHit(state);\n });\n\n this.cdpClient.onAutoResumed(() => {\n this.eventHandler.onAutoResumed();\n });\n\n await this.cdpClient.connect(inspectorUrl, protocol);\n this._isDebugMode = true;\n\n // Auto-inject telemetry after CDP connects (non-fatal)\n try {\n await injectTelemetry(this.cdpClient);\n } catch {\n // Telemetry injection is best-effort — debug mode still works without it\n }\n }\n\n private async activateClientDebug(previewUrl?: string): Promise<void> {\n if (!previewUrl) {\n throw new Error(\"previewUrl is required for client-side debug mode\");\n }\n\n await this.ensurePlaywrightInstalled();\n\n this.playwrightClient = new PlaywrightDebugClient();\n\n this.playwrightClient.onPaused((state) => {\n this.clientBreakpointHitQueue.push(state);\n this.eventHandler.onClientBreakpointHit(state);\n });\n\n this.playwrightClient.onAutoResumed(() => {\n this.eventHandler.onAutoResumed();\n });\n\n await this.playwrightClient.launch(previewUrl);\n this._isClientDebugMode = true;\n }\n\n // ── Playwright Installation ───────────────────────────────────────────\n\n private async ensurePlaywrightInstalled(): Promise<void> {\n // Check if playwright-core and Chromium are already available\n try {\n // @ts-expect-error playwright-core is lazily installed at runtime, not a compile-time dep\n await import(\"playwright-core\");\n // Check if Chromium binary exists by trying to resolve the executable\n // @ts-expect-error playwright-core is lazily installed at runtime\n const pw = await import(\"playwright-core\");\n const executablePath = (pw.chromium as { executablePath(): string }).executablePath();\n // Already installed\n if (executablePath) return;\n } catch {\n // Not installed yet — continue to install\n }\n\n this.eventHandler.onOutput(\n \"stderr\",\n \"Installing Playwright Chromium (first-time setup, ~250MB)...\\n\",\n );\n\n try {\n execSync(\"npx playwright install chromium --with-deps\", {\n cwd: this.workingDir,\n timeout: PLAYWRIGHT_INSTALL_TIMEOUT_MS,\n stdio: \"pipe\",\n });\n this.eventHandler.onOutput(\"stderr\", \"Playwright Chromium installed successfully.\\n\");\n } catch (error) {\n throw new Error(\n `Failed to install Playwright Chromium: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n { cause: error },\n );\n }\n }\n\n // ── Private ────────────────────────────────────────────────────────────\n\n // oxlint-disable-next-line require-await\n private async startWithInspector(): Promise<string> {\n const runtime = detectRuntime(this.startCommand);\n\n return new Promise<string>((resolve, reject) => {\n let resolved = false;\n const timeout = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n reject(new Error(getTimeoutMessage(runtime)));\n }\n }, CONNECTION_TIMEOUT_MS);\n\n let cmd = this.startCommand;\n let env = { ...process.env };\n\n if (runtime === \"bun\") {\n // Bun ignores NODE_OPTIONS; inject --inspect flag into command\n cmd = injectBunInspectFlag(this.startCommand);\n } else {\n // Node.js (or unknown) — use NODE_OPTIONS to enable inspector on random port\n env = { ...env, NODE_OPTIONS: \"--inspect=0\" };\n }\n\n const inspectorRegex = runtime === \"bun\" ? BUN_INSPECTOR_REGEX : NODE_INSPECTOR_REGEX;\n\n const child = runStartCommandWithEnv(cmd, this.workingDir, env, (stream, data) => {\n this.eventHandler.onOutput(stream, data);\n\n // Parse inspector URL from stderr\n if (!resolved && stream === \"stderr\") {\n const match = data.match(inspectorRegex);\n if (match?.[1]) {\n resolved = true;\n clearTimeout(timeout);\n resolve(match[1]);\n }\n }\n });\n\n this.debugProcess = child;\n\n child.on(\"error\", (err) => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timeout);\n reject(err);\n }\n });\n\n child.on(\"exit\", (code) => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timeout);\n reject(new Error(`Debug process exited with code ${code} before inspector started`));\n }\n });\n });\n }\n}\n\n// ── Helper: Runtime Detection ─────────────────────────────────────────────\n\nconst BUN_COMMAND_REGEX = /\\b(bun|bunx)\\b/;\nconst NODE_COMMAND_REGEX = /\\b(node|npx|tsx|ts-node)\\b/;\n\nexport function detectRuntime(startCommand: string): InspectorRuntime {\n if (BUN_COMMAND_REGEX.test(startCommand)) return \"bun\";\n if (NODE_COMMAND_REGEX.test(startCommand)) return \"node\";\n // Check environment as secondary signal\n if (process.env.BUN_INSTALL) return \"bun\";\n return \"node\";\n}\n\n// ── Helper: Bun --inspect flag injection ──────────────────────────────────\n\nexport function injectBunInspectFlag(command: string): string {\n // Insert --inspect right after the `bun` or `bunx` token.\n // e.g. \"bun run dev\" → \"bun --inspect run dev\"\n // e.g. \"bun server.ts\" → \"bun --inspect server.ts\"\n // e.g. \"bunx serve\" → \"bunx --inspect serve\"\n return command.replace(/\\b(bunx?)\\b/, \"$1 --inspect\");\n}\n\n// ── Helper: Timeout error messages ────────────────────────────────────────\n\nfunction getTimeoutMessage(runtime: InspectorRuntime): string {\n switch (runtime) {\n case \"bun\":\n return \"Timed out waiting for Bun inspector (--inspect flag). Ensure your start command begins with 'bun'\";\n case \"node\":\n return \"Timed out waiting for Node.js inspector (NODE_OPTIONS='--inspect=0')\";\n default:\n return \"Timed out waiting for debugger inspector. Your runtime may not support CDP.\";\n }\n}\n\n// ── Helper: Start command with custom env ──────────────────────────────────\n\nfunction runStartCommandWithEnv(\n cmd: string,\n cwd: string,\n env: NodeJS.ProcessEnv,\n onOutput: (stream: \"stdout\" | \"stderr\", data: string) => void,\n): ChildProcess {\n const child = spawn(\"sh\", [\"-c\", cmd], {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: true,\n env: { ...env },\n });\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n onOutput(\"stdout\", chunk.toString());\n });\n\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n onOutput(\"stderr\", chunk.toString());\n });\n\n child.unref();\n return child;\n}\n","import type { AgentConnection } from \"../connection/agent-connection.js\";\nimport type { DebugManager, DebugEventHandler } from \"./debug-manager.js\";\nimport type { PausedState } from \"./cdp-client.js\";\nimport type {\n DebugSessionState,\n DebugSessionSummary,\n DebugBreakpointInfo,\n DebugProbeInfo,\n DebugTelemetryEvent,\n} from \"@project/shared\";\n\n/**\n * Orchestrates the debug session lifecycle, tracks state for the web UI,\n * and generates session summaries. Wraps DebugManager events and forwards\n * state changes to the API via AgentConnection.\n */\nexport class DebugLifecycleManager {\n private connection: AgentConnection;\n private debugManager: DebugManager | null = null;\n private hypothesis?: string;\n private sessionStartedAt?: string;\n private breakpointsHitCount = 0;\n private telemetryEvents: DebugTelemetryEvent[] = [];\n private reproduceRequested = false;\n private keyFindings: string[] = [];\n private _isActive = false;\n\n constructor(connection: AgentConnection) {\n this.connection = connection;\n }\n\n get isActive(): boolean {\n return this._isActive;\n }\n\n setDebugManager(manager: DebugManager): void {\n this.debugManager = manager;\n }\n\n /**\n * Creates a DebugEventHandler that bridges DebugManager events\n * to the lifecycle manager and broadcasts state to the web UI.\n */\n createEventHandler(\n baseOnOutput: (stream: \"stdout\" | \"stderr\", data: string) => void,\n ): DebugEventHandler {\n return {\n onDebugModeEntered: () => {\n this._isActive = true;\n this.sessionStartedAt = new Date().toISOString();\n this.breakpointsHitCount = 0;\n this.telemetryEvents = [];\n this.keyFindings = [];\n this.broadcastState();\n },\n onDebugModeExited: () => {\n this.broadcastState();\n },\n onBreakpointHit: (state: PausedState) => {\n this.breakpointsHitCount++;\n const file = state.callFrames[0]?.file ?? \"unknown\";\n const line = state.callFrames[0]?.line ?? 0;\n this.keyFindings.push(`Breakpoint hit at ${file}:${line} (${state.reason})`);\n this.broadcastState();\n },\n onClientBreakpointHit: (state: PausedState) => {\n this.breakpointsHitCount++;\n const file = state.callFrames[0]?.file ?? \"unknown\";\n const line = state.callFrames[0]?.line ?? 0;\n this.keyFindings.push(`Client breakpoint hit at ${file}:${line}`);\n this.broadcastState();\n },\n onAutoResumed: () => {\n this.broadcastState();\n },\n onDebugError: (message: string) => {\n this.keyFindings.push(`Debug error: ${message}`);\n this.broadcastState();\n },\n onOutput: baseOnOutput,\n };\n }\n\n /** Mark the hypothesis for the current debug session */\n setHypothesis(hypothesis: string): void {\n this.hypothesis = hypothesis;\n this.broadcastState();\n }\n\n /** Signal that the user has been asked to reproduce the bug */\n requestReproduce(hypothesis?: string): void {\n this.reproduceRequested = true;\n if (hypothesis) this.hypothesis = hypothesis;\n this.connection.sendEvent({\n type: \"debug_reproduce_requested\",\n hypothesis: hypothesis ?? this.hypothesis,\n });\n this.broadcastState();\n }\n\n /** Add a telemetry event to the debug session */\n addTelemetryEvent(event: DebugTelemetryEvent): void {\n this.telemetryEvents.push(event);\n // Keep only the last 100 events\n if (this.telemetryEvents.length > 100) {\n this.telemetryEvents = this.telemetryEvents.slice(-100);\n }\n this.broadcastState();\n }\n\n /** Generate and broadcast a debug session summary, then reset state */\n completeSession(): DebugSessionSummary | null {\n if (!this._isActive && !this.sessionStartedAt) return null;\n\n const endedAt = new Date().toISOString();\n const startedAt = this.sessionStartedAt ?? endedAt;\n const durationMs = new Date(endedAt).getTime() - new Date(startedAt).getTime();\n\n const breakpoints = this.getBreakpoints();\n const probes = this.getProbes();\n\n const summary: DebugSessionSummary = {\n hypothesis: this.hypothesis,\n breakpointsSet: breakpoints.length,\n breakpointsHit: this.breakpointsHitCount,\n probesSet: probes.length,\n telemetryEventsCaptured: this.telemetryEvents.length,\n keyFindings: this.keyFindings.slice(0, 20),\n durationMs,\n startedAt,\n endedAt,\n };\n\n this.connection.sendEvent({ type: \"debug_session_complete\", summary });\n\n // Reset state\n this._isActive = false;\n this.hypothesis = undefined;\n this.sessionStartedAt = undefined;\n this.breakpointsHitCount = 0;\n this.telemetryEvents = [];\n this.reproduceRequested = false;\n this.keyFindings = [];\n\n this.broadcastState();\n\n return summary;\n }\n\n /** Auto-exit cleanup — called when agent session ends */\n autoCleanup(): void {\n if (this._isActive || this.sessionStartedAt) {\n this.completeSession();\n }\n }\n\n // ── Private ────────────────────────────────────────────────────────\n\n private getBreakpoints(): DebugBreakpointInfo[] {\n if (!this.debugManager) return [];\n const client = this.debugManager.getClient();\n if (!client?.isConnected()) return [];\n try {\n return client.listBreakpoints().map((bp) => ({\n id: bp.breakpointId,\n file: bp.file,\n line: bp.line,\n condition: bp.condition,\n hitCount: 0,\n }));\n } catch {\n return [];\n }\n }\n\n private getProbes(): DebugProbeInfo[] {\n if (!this.debugManager) return [];\n const client = this.debugManager.getClient();\n if (!client?.isConnected()) return [];\n try {\n return client.listProbes().map((p) => ({\n id: p.probeId,\n file: p.file,\n line: p.line,\n expressions: p.expressions,\n label: p.label,\n }));\n } catch {\n return [];\n }\n }\n\n private buildState(): DebugSessionState {\n const serverDebug = this.debugManager?.isDebugMode() ?? false;\n const clientDebug = this.debugManager?.isClientDebugMode() ?? false;\n const active = this._isActive && (serverDebug || clientDebug);\n\n let pausedAt: { file: string; line: number } | undefined;\n const client = this.debugManager?.getClient();\n if (client?.isPaused()) {\n const callStack = client.getCallStack();\n if (callStack[0]) {\n pausedAt = {\n file: callStack[0].file,\n line: callStack[0].line,\n };\n }\n }\n\n return {\n active,\n hypothesis: this.hypothesis,\n serverDebug,\n clientDebug,\n breakpoints: this.getBreakpoints(),\n probes: this.getProbes(),\n telemetryEvents: this.telemetryEvents.slice(-50),\n pausedAt,\n reproduceRequested: this.reproduceRequested,\n };\n }\n\n private broadcastState(): void {\n this.connection.sendEvent({\n type: \"debug_state_changed\",\n state: this.buildState(),\n });\n }\n}\n","// ── Hypothesis-Driven Debug Session Tracker ────────────────────────────────\n\nconst MAX_ITERATIONS = 3;\n\nexport interface Observation {\n description: string;\n confirmsHypothesis: boolean;\n iteration: number;\n timestamp: number;\n}\n\nexport interface HypothesisState {\n hypothesis: string | null;\n iteration: number;\n observations: Observation[];\n active: boolean;\n conclusion: string | null;\n}\n\nexport class HypothesisTracker {\n private hypothesis: string | null = null;\n private iteration = 0;\n private observations: Observation[] = [];\n private _active = false;\n private conclusion: string | null = null;\n\n // ── Public API ─────────────────────────────────────────────────────────\n\n /**\n * Start or update the current debugging hypothesis.\n * Increments the iteration count if a hypothesis was already set.\n */\n setHypothesis(text: string): { accepted: boolean; message: string } {\n if (!this._active) {\n this._active = true;\n this.hypothesis = text;\n this.iteration = 1;\n this.observations = [];\n this.conclusion = null;\n return { accepted: true, message: `Hypothesis set (iteration 1/${MAX_ITERATIONS}): ${text}` };\n }\n\n if (this.iteration >= MAX_ITERATIONS) {\n return {\n accepted: false,\n message: `Max iterations (${MAX_ITERATIONS}) reached. You must make a decision based on what you've observed. Use concludeSession() to summarize findings and exit debug mode.`,\n };\n }\n\n this.iteration++;\n this.hypothesis = text;\n return {\n accepted: true,\n message: `Hypothesis updated (iteration ${this.iteration}/${MAX_ITERATIONS}): ${text}`,\n };\n }\n\n /**\n * Record an observation from debug data (breakpoint hit, telemetry, etc.).\n */\n recordObservation(description: string, confirmsHypothesis: boolean): void {\n this.observations.push({\n description,\n confirmsHypothesis,\n iteration: this.iteration,\n timestamp: Date.now(),\n });\n }\n\n /**\n * End the debug session with a conclusion.\n */\n concludeSession(conclusion: string): string {\n this.conclusion = conclusion;\n this._active = false;\n\n const summary = this.getSessionSummary();\n this.reset();\n return summary;\n }\n\n /**\n * Get formatted debug context for injection into the agent's system prompt.\n * Returns empty string if no active session.\n */\n getDebugContext(): string {\n if (!this._active || !this.hypothesis) return \"\";\n\n const lines = [\n `Current debug session (iteration ${this.iteration}/${MAX_ITERATIONS}):`,\n `Hypothesis: \"${this.hypothesis}\"`,\n ];\n\n if (this.observations.length > 0) {\n // Group observations by iteration\n const byIteration = new Map<number, Observation[]>();\n for (const obs of this.observations) {\n const group = byIteration.get(obs.iteration) ?? [];\n group.push(obs);\n byIteration.set(obs.iteration, group);\n }\n\n for (const [iter, iterObs] of byIteration) {\n for (const obs of iterObs) {\n const verdict = obs.confirmsHypothesis ? \"SUPPORTS\" : \"CONTRADICTS\";\n lines.push(`Iteration ${iter}: ${obs.description} — ${verdict} hypothesis`);\n }\n }\n }\n\n if (this.iteration >= MAX_ITERATIONS) {\n lines.push(\n `⚠️ Final iteration reached. Analyze observations and make a decision — no more debug iterations available.`,\n );\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Get the full state (for serialization/testing).\n */\n getState(): HypothesisState {\n return {\n hypothesis: this.hypothesis,\n iteration: this.iteration,\n observations: [...this.observations],\n active: this._active,\n conclusion: this.conclusion,\n };\n }\n\n isActive(): boolean {\n return this._active;\n }\n\n getIteration(): number {\n return this.iteration;\n }\n\n getMaxIterations(): number {\n return MAX_ITERATIONS;\n }\n\n // ── Private ────────────────────────────────────────────────────────────\n\n private getSessionSummary(): string {\n const parts = [`Debug session complete.`];\n\n if (this.hypothesis) {\n parts.push(`Final hypothesis: \"${this.hypothesis}\"`);\n }\n\n parts.push(`Total iterations: ${this.iteration}`);\n\n if (this.observations.length > 0) {\n parts.push(\"Observations:\");\n for (const obs of this.observations) {\n const verdict = obs.confirmsHypothesis ? \"✓\" : \"✗\";\n parts.push(` ${verdict} [iter ${obs.iteration}] ${obs.description}`);\n }\n }\n\n const supporting = this.observations.filter((o) => o.confirmsHypothesis).length;\n const contradicting = this.observations.length - supporting;\n parts.push(`Evidence: ${supporting} supporting, ${contradicting} contradicting`);\n\n if (this.conclusion) {\n parts.push(`Conclusion: ${this.conclusion}`);\n }\n\n return parts.join(\"\\n\");\n }\n\n private reset(): void {\n this.hypothesis = null;\n this.iteration = 0;\n this.observations = [];\n this._active = false;\n this.conclusion = null;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ConveyorConfig {\n setupCommand?: string;\n startCommand?: string;\n previewPort?: number;\n}\n\nconst DEVCONTAINER_PATH = \".devcontainer/conveyor/devcontainer.json\";\n\nexport async function loadForwardPorts(workspaceDir: string): Promise<number[]> {\n try {\n const raw = await readFile(join(workspaceDir, DEVCONTAINER_PATH), \"utf-8\");\n const parsed = JSON.parse(raw) as { forwardPorts?: number[] };\n return parsed.forwardPorts ?? [];\n } catch {\n return [];\n }\n}\n\n/** Load config from env vars (project-level settings injected via bootstrap). */\nexport function loadConveyorConfig(): ConveyorConfig | null {\n const envSetup = process.env.CONVEYOR_SETUP_COMMAND;\n const envStart = process.env.CONVEYOR_START_COMMAND;\n const envPort = process.env.CONVEYOR_PREVIEW_PORT;\n if (envSetup || envStart) {\n return {\n setupCommand: envSetup,\n startCommand: envStart,\n previewPort: envPort ? Number(envPort) : undefined,\n };\n }\n return null;\n}\n","import { execSync } from \"node:child_process\";\n\n/** Fetch full git history if the repo was cloned with --depth=1. */\nexport function unshallowRepo(workspaceDir: string): void {\n try {\n execSync(\"git fetch --unshallow\", {\n cwd: workspaceDir,\n timeout: 60_000,\n stdio: \"ignore\",\n });\n } catch {\n // Already unshallowed or not a shallow clone\n }\n}\n"],"mappings":"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","names":["MAX_VARIABLE_VALUE_BYTES","MAX_VARIABLES_PER_SCOPE","AUTO_RESUME_TIMEOUT_MS","PROBE_BUFFER_MAX_SIZE","execSync"]}