@roblourens/dap-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/errors.ts","../src/cli/output.ts","../src/cli/humanOutput.ts","../src/cli/outputWriter.ts","../src/cli/program.ts","../src/cli/outputMode.ts","../src/cli/commands/controller.ts","../src/controller/requests.ts","../src/controller/diagnostics.ts","../src/controller/ipc.ts","../src/config/paths.ts","../src/controller/client.ts","../src/controller/server.ts","../src/adapters/descriptor.ts","../src/adapters/processAdapter.ts","../src/protocol/stdioTransport.ts","../src/adapters/socketAdapter.ts","../src/protocol/socketTransport.ts","../src/adapters/builtins/jsDebug.ts","../src/protocol/dapClient.ts","../src/protocol/dapMessages.ts","../src/protocol/framing.ts","../src/protocol/eventCache.ts","../src/protocol/lifecycle.ts","../src/generated/dapCommandRegistry.ts","../src/sessions/session.ts","../src/sessions/activeSession.ts","../src/sessions/sessionStore.ts","../src/sessions/sessionManager.ts","../src/controller/pausedState.ts","../src/controller/childSessions.ts","../src/sessions/helperProcessDetection.ts","../src/controller/buildId.ts","../src/controller/pythonExpressionDetector.ts","../src/cli/commands/dapAliases.ts","../src/cli/commands/jsonOptions.ts","../src/cli/commands/dapGenerated.ts","../src/cli/commands/dapCore.ts","../src/adapters/config.ts","../src/adapters/builtins/debugpy.ts","../src/adapters/registry.ts","../src/config/launchConfig.ts","../src/config/programInference.ts","../src/cli/commands/sessions.ts","../src/cli/main.ts","../src/index.ts"],"sourcesContent":["import { ExitCode } from './exitCodes.js';\n\nexport type CliErrorCategory = 'usage' | 'controller' | 'session' | 'dap' | 'adapter' | 'timeout' | 'internal';\n\nexport interface CliErrorOptions {\n code?: string;\n diagnostics?: readonly string[];\n sessionId?: string;\n request?: CliErrorRequestContext;\n adapter?: CliErrorAdapterContext;\n // Plan 05-19 (gap H-3): structured machine-readable recovery data so JSON\n // consumers can act on errors like child_session_not_targetable without\n // string-parsing diagnostics. Kept generic; specific shapes live with\n // their error sites.\n data?: Readonly<Record<string, unknown>>;\n}\n\nexport interface CliErrorRequestContext {\n command: string;\n seq?: number;\n}\n\nexport interface CliErrorAdapterContext {\n descriptorId?: string;\n pid?: number;\n stderrTail?: readonly string[];\n logPath?: string;\n}\n\nexport class CliError extends Error {\n public readonly code: string;\n public readonly category: CliErrorCategory;\n public readonly exitCode: ExitCode;\n public readonly diagnostics: readonly string[];\n public readonly sessionId: string | undefined;\n public readonly request: CliErrorRequestContext | undefined;\n public readonly adapter: CliErrorAdapterContext | undefined;\n public readonly data: Readonly<Record<string, unknown>> | undefined;\n\n public constructor(message: string, category: CliErrorCategory, exitCode: ExitCode, options: CliErrorOptions = {}) {\n super(message);\n this.name = 'CliError';\n this.code = options.code ?? `${category}_error`;\n this.category = category;\n this.exitCode = exitCode;\n this.diagnostics = normalizeDiagnostics(message, options.diagnostics);\n this.sessionId = options.sessionId;\n this.request = options.request;\n this.adapter = options.adapter;\n this.data = options.data;\n }\n}\n\nexport function usageError(message: string, options?: CliErrorOptions): CliError {\n return new CliError(message, 'usage', ExitCode.Usage, options);\n}\n\nexport function controllerError(message: string, options?: CliErrorOptions): CliError {\n return new CliError(message, 'controller', ExitCode.Controller, options);\n}\n\nexport function sessionError(message: string, options?: CliErrorOptions): CliError {\n return new CliError(message, 'session', ExitCode.Session, options);\n}\n\nexport function dapError(message: string, options?: CliErrorOptions): CliError {\n return new CliError(message, 'dap', ExitCode.Dap, options);\n}\n\nexport function adapterError(message: string, options?: CliErrorOptions): CliError {\n return new CliError(message, 'adapter', ExitCode.Adapter, options);\n}\n\nexport function timeoutError(message: string, options?: CliErrorOptions): CliError {\n return new CliError(message, 'timeout', ExitCode.Timeout, options);\n}\n\nexport function internalError(message: string, options?: CliErrorOptions): CliError {\n return new CliError(message, 'internal', ExitCode.Internal, options);\n}\n\nexport function toInternalCliError(error: unknown): CliError {\n if (error instanceof CliError) {\n return error;\n }\n\n return internalError('Unexpected internal error', {\n code: 'internal_error',\n diagnostics: ['The command failed unexpectedly. Re-run with diagnostics enabled after controller logging is available.'],\n });\n}\n\nfunction normalizeDiagnostics(message: string, diagnostics: readonly string[] | undefined): readonly string[] {\n const normalized = diagnostics?.filter(diagnostic => diagnostic.trim().length > 0) ?? [];\n\n return normalized.length > 0 ? normalized : [message];\n}\n","import type { CliError } from './errors.js';\n\nexport interface JsonMeta {\n command: string;\n timestamp: string;\n warnings?: readonly string[];\n}\n\nexport interface JsonSuccess<T> {\n ok: true;\n data: T;\n meta: JsonMeta;\n}\n\nexport interface JsonFailure {\n ok: false;\n error: JsonErrorPayload;\n meta: JsonMeta;\n}\n\nexport interface JsonErrorPayload {\n code: string;\n category: string;\n message: string;\n exitCode: number;\n diagnostics: readonly string[];\n sessionId?: string;\n request?: {\n command: string;\n seq?: number;\n };\n adapter?: {\n descriptorId?: string;\n pid?: number;\n stderrTail?: readonly string[];\n logPath?: string;\n };\n // Plan 05-19 (gap H-3): structured machine-readable recovery payload.\n data?: Readonly<Record<string, unknown>>;\n}\n\nexport interface JsonMetaInput {\n command: string;\n timestamp?: Date;\n warnings?: readonly string[];\n}\n\nexport interface JsonWritable {\n write(chunk: string): boolean;\n readonly isTTY?: boolean;\n}\n\nexport function writeJsonSuccess<T>(data: T, meta: JsonMetaInput, stream: JsonWritable = process.stdout): void {\n stream.write(toJsonString({ ok: true, data, meta: createMeta(meta) }));\n}\n\nexport function writeJsonFailure(error: CliError, meta: JsonMetaInput, stream: JsonWritable = process.stdout): void {\n stream.write(toJsonString({ ok: false, error: toJsonErrorPayload(error), meta: createMeta(meta) }));\n}\n\nexport function toJsonString(envelope: JsonSuccess<unknown> | JsonFailure): string {\n return `${JSON.stringify(envelope)}\\n`;\n}\n\nexport function createMeta(input: JsonMetaInput): JsonMeta {\n const meta: JsonMeta = {\n command: input.command,\n timestamp: (input.timestamp ?? new Date()).toISOString(),\n };\n if (input.warnings !== undefined && input.warnings.length > 0) {\n meta.warnings = input.warnings;\n }\n return meta;\n}\n\nexport function toJsonErrorPayload(error: CliError): JsonErrorPayload {\n const payload: JsonErrorPayload = {\n code: error.code,\n category: error.category,\n message: error.message,\n exitCode: error.exitCode,\n diagnostics: error.diagnostics,\n };\n\n if (error.sessionId !== undefined) {\n payload.sessionId = error.sessionId;\n }\n if (error.request !== undefined) {\n payload.request = error.request;\n }\n if (error.adapter !== undefined) {\n payload.adapter = error.adapter;\n }\n if (error.data !== undefined) {\n payload.data = error.data;\n }\n\n return payload;\n}\n","import { inspect } from 'node:util';\nimport type { CliError } from './errors.js';\nimport type { JsonMetaInput } from './output.js';\nimport { createMeta, toJsonErrorPayload } from './output.js';\n\nconst inspectOptions = {\n colors: false,\n depth: 6,\n breakLength: 100,\n compact: false,\n sorted: true,\n} as const;\n\nexport function renderHumanSuccess<T>(data: T, meta: JsonMetaInput): string {\n const renderedMeta = createMeta(meta);\n const curated = renderCuratedSuccess(data, renderedMeta.command);\n if (curated !== undefined) {\n return renderBlock(curated.title, curated.lines);\n }\n\n return [\n 'Data:',\n sanitizeForTerminal(inspect(data, inspectOptions)),\n '',\n ].join('\\n');\n}\n\nexport function renderHumanFailure(error: CliError, _meta: JsonMetaInput): string {\n const payload = toJsonErrorPayload(error);\n const lines = [\n `${styleLabel('Error')}: ${styleValue(sanitizeForTerminal(payload.message), 'error')}`,\n `Code: ${sanitizeForTerminal(payload.code)}`,\n `Category: ${sanitizeForTerminal(payload.category)}`,\n `Exit code: ${payload.exitCode}`,\n ];\n\n if (payload.diagnostics.length > 0) {\n lines.push('Diagnostics:');\n for (const diagnostic of payload.diagnostics) {\n lines.push(`- ${sanitizeForTerminal(diagnostic)}`);\n }\n }\n if (payload.sessionId !== undefined) {\n lines.push(`Session: ${sanitizeForTerminal(payload.sessionId)}`);\n }\n if (payload.request !== undefined) {\n const seq = payload.request.seq === undefined ? '' : ` (seq ${payload.request.seq})`;\n lines.push(`Request: ${sanitizeForTerminal(payload.request.command)}${seq}`);\n }\n if (payload.adapter !== undefined) {\n lines.push('Adapter:');\n if (payload.adapter.descriptorId !== undefined) {\n lines.push(`- Descriptor: ${sanitizeForTerminal(payload.adapter.descriptorId)}`);\n }\n if (payload.adapter.pid !== undefined) {\n lines.push(`- PID: ${payload.adapter.pid}`);\n }\n if (payload.adapter.stderrTail !== undefined && payload.adapter.stderrTail.length > 0) {\n lines.push('- Stderr tail:');\n for (const stderrLine of payload.adapter.stderrTail) {\n lines.push(` - ${sanitizeForTerminal(stderrLine)}`);\n }\n }\n if (payload.adapter.logPath !== undefined) {\n lines.push(`- Log: ${sanitizeForTerminal(payload.adapter.logPath)}`);\n }\n }\n if (payload.data !== undefined) {\n lines.push('Data:');\n lines.push(sanitizeForTerminal(inspect(payload.data, inspectOptions)));\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\nexport function sanitizeForTerminal(value: string): string {\n let sanitized = '';\n for (const character of value) {\n const code = character.charCodeAt(0);\n if (code === 13) {\n sanitized += '\\n';\n } else if ((code < 32 && code !== 9 && code !== 10) || (code >= 127 && code <= 159)) {\n sanitized += '?';\n } else {\n sanitized += character;\n }\n }\n\n return sanitized;\n}\n\ninterface CuratedOutput {\n title: string;\n lines: string[];\n}\n\ntype UnknownRecord = Record<string, unknown>;\ntype StyleKind = 'plain' | 'boolean' | 'status' | 'numberValue' | 'stringValue' | 'booleanValue' | 'functionValue' | 'objectValue' | 'event' | 'error';\n\ninterface TableCell {\n text: string;\n style?: StyleKind;\n}\n\ntype TableRow = Array<string | TableCell>;\n\ninterface TableColumn {\n header: string;\n style?: StyleKind;\n}\n\nfunction renderCuratedSuccess(data: unknown, command: string): CuratedOutput | undefined {\n switch (command) {\n case 'sessions':\n return renderSessions(data);\n case 'status':\n return renderStatus(data);\n case 'events':\n return renderEvents(data);\n case 'breakpoints set':\n return renderBreakpoints(data);\n case 'threads':\n return renderThreads(data);\n case 'stack':\n return renderStack(data);\n case 'scopes':\n return renderScopes(data);\n case 'variables':\n return renderVariables(data);\n case 'evaluate':\n return renderEvaluate(data);\n case 'cleanup':\n return renderRecordSection('Cleanup:', data);\n case 'close':\n return renderRecordSection('Close:', data);\n case 'launch configs':\n return renderLaunchConfigs(data);\n default:\n return undefined;\n }\n}\n\nfunction renderLaunchConfigs(data: unknown): CuratedOutput | undefined {\n if (!isRecordArray(data)) {\n return undefined;\n }\n\n return {\n title: 'Launch Configs:',\n lines: formatTable([\n { header: 'Kind' },\n { header: 'Name' },\n { header: 'Type' },\n { header: 'Request' },\n { header: 'Members' },\n { header: 'Stop all', style: 'boolean' },\n ], data.map(entry => [\n fieldText(entry, 'kind'),\n fieldText(entry, 'name'),\n fieldText(entry, 'type'),\n fieldText(entry, 'request'),\n fieldText(entry, 'configurations'),\n booleanText(entry.stopAll),\n ])),\n };\n}\n\nfunction renderSessions(data: unknown): CuratedOutput | undefined {\n if (!isRecordArray(data)) {\n return undefined;\n }\n\n const includeActive = data.some(session => 'active' in session);\n const includeChild = data.some(session => 'parent_session_id' in session || 'parentSessionId' in session || session.targetable === false);\n const includeCompound = data.some(session => isRecord(session.compound));\n const headers: TableColumn[] = [\n { header: 'ID' },\n { header: 'Name' },\n { header: 'Status', style: 'status' },\n { header: 'Adapter' },\n ];\n if (includeCompound) {\n headers.push({ header: 'Compound' });\n }\n if (includeActive) {\n headers.push({ header: 'Active', style: 'boolean' });\n }\n if (includeChild) {\n headers.push({ header: 'Child', style: 'boolean' });\n }\n\n const rows = data.map(session => {\n const row = [fieldText(session, 'id'), fieldText(session, 'name'), fieldText(session, 'status') || fieldText(session, 'lifecycle'), fieldText(session, 'adapter') || 'unknown'];\n if (includeCompound) {\n row.push(compoundSummaryText(session.compound));\n }\n if (includeActive) {\n row.push(booleanText(session.active));\n }\n if (includeChild) {\n row.push(session.parent_session_id !== undefined || session.parentSessionId !== undefined || session.targetable === false ? 'yes' : 'no');\n }\n return row;\n });\n\n return { title: 'Sessions:', lines: formatTable(headers, rows) };\n}\n\nfunction renderStatus(data: unknown): CuratedOutput | undefined {\n if (!isRecord(data)) {\n return undefined;\n }\n\n const fields: Array<[string, string]> = [];\n pushField(fields, 'ID', data, 'id');\n pushField(fields, 'Name', data, 'name');\n pushField(fields, 'Status', data, 'status');\n pushField(fields, 'Paused', data, 'paused');\n pushField(fields, 'Stopped reason', data, 'stoppedReason');\n pushArrayField(fields, 'Stopped thread IDs', data, 'stoppedThreadIds');\n pushField(fields, 'PID', data, 'pid');\n pushField(fields, 'Endpoint', data, 'endpoint');\n pushField(fields, 'State directory', data, 'stateDir');\n pushField(fields, 'Log directory', data, 'logDir');\n pushField(fields, 'Build ID', data, 'buildId');\n if (isRecord(data.compound)) {\n pushField(fields, 'Compound', data.compound, 'name');\n pushField(fields, 'Compound member', data.compound, 'memberName');\n fields.push(['Compound stop all', booleanText(data.compound.stopAll)]);\n pushArrayField(fields, 'Compound members', data.compound, 'members');\n }\n if (fields.length === 0) {\n return undefined;\n }\n\n return { title: 'Status:', lines: fields.map(([label, value]) => `${label}: ${value}`) };\n}\n\nfunction compoundSummaryText(value: unknown): string {\n if (!isRecord(value)) {\n return '';\n }\n const name = fieldText(value, 'name');\n const member = fieldText(value, 'memberName');\n if (name.length === 0) {\n return member;\n }\n if (member.length === 0) {\n return name;\n }\n return `${name}/${member}`;\n}\n\nfunction renderEvents(data: unknown): CuratedOutput | undefined {\n if (!isRecord(data)) {\n return undefined;\n }\n\n const lines: string[] = [];\n const warnings = arrayField(data, 'warnings').filter((warning): warning is string => typeof warning === 'string');\n if (warnings.length > 0) {\n lines.push('Warnings:');\n for (const warning of warnings) {\n lines.push(`- ${safe(warning)}`);\n }\n }\n\n const sessionName = fieldText(data, 'name');\n const sessionId = fieldText(data, 'sessionId');\n if (sessionName.length > 0 || sessionId.length > 0) {\n lines.push(`Session: ${sessionName.length > 0 ? sessionName : sessionId}${sessionName.length > 0 && sessionId.length > 0 ? ` (${sessionId})` : ''}`);\n }\n pushFieldLine(lines, 'Cursor', data, 'cursor');\n pushFieldLine(lines, 'Dropped', data, 'dropped');\n pushFieldLine(lines, 'Capacity', data, 'capacity');\n if (isRecord(data.capacityByPriority)) {\n lines.push(`Capacity by priority: high ${fieldText(data.capacityByPriority, 'high')}, low ${fieldText(data.capacityByPriority, 'low')}`);\n }\n\n const events = arrayField(data, 'events').filter(isRecord);\n if (events.length > 0) {\n lines.push('Events:');\n lines.push(...formatTable([{ header: 'Event', style: 'event' }, { header: 'Details' }], events.map(event => [fieldText(event, 'event'), inspectOmitting(event, ['event'])])));\n }\n\n return { title: 'Events:', lines };\n}\n\nfunction renderBreakpoints(data: unknown): CuratedOutput | undefined {\n if (!isRecord(data)) {\n return undefined;\n }\n\n const breakpoints = arrayField(data, 'breakpoints').filter(isRecord);\n if (breakpoints.length === 0) {\n return undefined;\n }\n\n return {\n title: 'Breakpoints:',\n lines: formatTable([{ header: 'Line' }, { header: 'Verified', style: 'boolean' }, { header: 'Message' }], breakpoints.map(breakpoint => [\n fieldText(breakpoint, 'line'),\n booleanText(breakpoint.verified),\n fieldText(breakpoint, 'message'),\n ])),\n };\n}\n\nfunction renderThreads(data: unknown): CuratedOutput | undefined {\n return renderArrayTable('Threads:', data, 'threads', [{ header: 'ID' }, { header: 'Name' }], thread => [fieldText(thread, 'id'), fieldText(thread, 'name')]);\n}\n\nfunction renderStack(data: unknown): CuratedOutput | undefined {\n return renderArrayTable('Stack:', data, 'stackFrames', [{ header: 'ID' }, { header: 'Name' }, { header: 'Line' }, { header: 'Source' }], frame => [\n fieldText(frame, 'id'),\n fieldText(frame, 'name'),\n fieldText(frame, 'line'),\n sourceText(frame.source),\n ]);\n}\n\nfunction renderScopes(data: unknown): CuratedOutput | undefined {\n return renderArrayTable('Scopes:', data, 'scopes', [{ header: 'Name' }, { header: 'Variables reference' }, { header: 'Expensive', style: 'boolean' }], scope => [\n fieldText(scope, 'name'),\n fieldText(scope, 'variablesReference'),\n booleanText(scope.expensive),\n ]);\n}\n\nfunction renderVariables(data: unknown): CuratedOutput | undefined {\n return renderArrayTable('Variables:', data, 'variables', [{ header: 'Name' }, { header: 'Value' }, { header: 'Type' }, { header: 'Variables reference' }], variable => [\n fieldText(variable, 'name'),\n { text: fieldText(variable, 'value'), style: variableValueStyle(fieldText(variable, 'type')) },\n fieldText(variable, 'type'),\n fieldText(variable, 'variablesReference'),\n ]);\n}\n\nfunction renderEvaluate(data: unknown): CuratedOutput | undefined {\n if (!isRecord(data)) {\n return undefined;\n }\n\n const lines: string[] = [];\n pushFieldLine(lines, 'Result', data, 'result');\n pushFieldLine(lines, 'Type', data, 'type');\n pushFieldLine(lines, 'Variables reference', data, 'variablesReference');\n if (lines.length === 0) {\n lines.push(formatUnknown(data));\n }\n\n return { title: 'Evaluate:', lines };\n}\n\nfunction renderRecordSection(title: string, data: unknown): CuratedOutput | undefined {\n if (!isRecord(data)) {\n return undefined;\n }\n\n const lines = Object.entries(data).map(([key, value]) => `${styleLabel(labelFromKey(key))}: ${formatValue(value)}`);\n return { title, lines };\n}\n\nfunction renderArrayTable(\n title: string,\n data: unknown,\n field: string,\n headers: TableColumn[],\n toRow: (record: UnknownRecord) => TableRow,\n): CuratedOutput | undefined {\n if (!isRecord(data)) {\n return undefined;\n }\n const items = arrayField(data, field).filter(isRecord);\n if (items.length === 0) {\n return undefined;\n }\n\n return { title, lines: formatTable(headers, items.map(toRow)) };\n}\n\nfunction renderBlock(title: string, lines: string[]): string {\n return [\n styleTitle(title),\n ...lines,\n '',\n ].join('\\n');\n}\n\nfunction formatTable(headers: TableColumn[], rows: TableRow[]): string[] {\n const safeHeaders = headers.map(column => safe(column.header));\n const safeRows = rows.map(row => headers.map((header, index): TableCell => {\n const cell = row[index];\n if (typeof cell === 'object' && cell !== null) {\n return { text: safe(cell.text), style: cell.style ?? header.style ?? 'plain' };\n }\n return { text: safe(cell ?? ''), style: header.style ?? 'plain' };\n }));\n const widths = safeHeaders.map((header, index) => Math.max(header.length, ...safeRows.map(row => row[index]?.text.length ?? 0)));\n\n const top = `┌${widths.map(width => '─'.repeat(width + 2)).join('┬')}┐`;\n const headerSeparator = `├${widths.map(width => '─'.repeat(width + 2)).join('┼')}┤`;\n const bottom = `└${widths.map(width => '─'.repeat(width + 2)).join('┴')}┘`;\n\n const headerLine = formatTableLine(safeHeaders, widths, headers.map(() => 'plain'), true);\n const rowLines = safeRows.map(row => formatTableLine(row, widths, headers.map(column => column.style ?? 'plain'), false));\n\n return [top, headerLine, headerSeparator, ...rowLines, bottom];\n}\n\nfunction formatTableLine(cells: Array<string | TableCell>, widths: number[], styles: StyleKind[], header: boolean): string {\n const renderedCells = cells.map((cell, index) => {\n const text = typeof cell === 'string' ? cell : cell.text;\n const style = typeof cell === 'string' ? styles[index] : cell.style ?? styles[index];\n const padded = text.padEnd(widths[index] ?? text.length, ' ');\n const styled = header ? styleHeader(padded) : styleValue(padded, style ?? 'plain');\n return ` ${styled} `;\n });\n\n return `│${renderedCells.join('│')}│`;\n}\n\nfunction pushField(fields: Array<[string, string]>, label: string, record: UnknownRecord, key: string): void {\n const value = fieldText(record, key);\n if (value.length > 0) {\n fields.push([label, value]);\n }\n}\n\nfunction pushArrayField(fields: Array<[string, string]>, label: string, record: UnknownRecord, key: string): void {\n const values = arrayField(record, key).map(formatValue);\n if (values.length > 0) {\n fields.push([label, values.join(', ')]);\n }\n}\n\nfunction pushFieldLine(lines: string[], label: string, record: UnknownRecord, key: string): void {\n const value = fieldText(record, key);\n if (value.length > 0) {\n lines.push(`${styleLabel(label)}: ${value}`);\n }\n}\n\nfunction fieldText(record: UnknownRecord, key: string): string {\n const value = record[key];\n if (value === undefined || value === null) {\n return '';\n }\n\n return formatValue(value);\n}\n\nfunction arrayField(record: UnknownRecord, key: string): unknown[] {\n const value = record[key];\n return Array.isArray(value) ? value : [];\n}\n\nfunction sourceText(value: unknown): string {\n if (!isRecord(value)) {\n return formatValue(value);\n }\n\n return fieldText(value, 'path') || fieldText(value, 'name') || formatUnknown(value);\n}\n\nfunction booleanText(value: unknown): string {\n if (typeof value !== 'boolean') {\n return '';\n }\n\n return value ? 'yes' : 'no';\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === 'string') {\n return safe(value);\n }\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {\n return String(value);\n }\n if (Array.isArray(value)) {\n return value.map(formatValue).join(', ');\n }\n if (value === undefined || value === null) {\n return '';\n }\n\n return formatUnknown(value);\n}\n\nfunction inspectOmitting(record: UnknownRecord, omittedKeys: readonly string[]): string {\n const rest: UnknownRecord = {};\n for (const [key, value] of Object.entries(record)) {\n if (!omittedKeys.includes(key)) {\n rest[key] = value;\n }\n }\n\n return Object.keys(rest).length === 0\n ? ''\n : Object.entries(rest).map(([key, value]) => `${labelFromKey(key)}: ${formatValue(value)}`).join(', ');\n}\n\nfunction formatUnknown(value: unknown): string {\n return safe(inspect(value, inspectOptions));\n}\n\nfunction labelFromKey(key: string): string {\n return safe(key.replace(/[_-]+/g, ' ').replace(/([a-z])([A-Z])/g, '$1 $2').replace(/^./, first => first.toUpperCase()));\n}\n\nfunction safe(value: string): string {\n return sanitizeForTerminal(value);\n}\n\nfunction styleTitle(value: string): string {\n return colorize(safe(value), 'bold');\n}\n\nfunction styleHeader(value: string): string {\n return colorize(value, 'bold');\n}\n\nfunction styleLabel(value: string): string {\n return colorize(safe(value), 'bold');\n}\n\nfunction styleValue(value: string, style: StyleKind): string {\n switch (style) {\n case 'boolean':\n return colorize(value, value.trim() === 'yes' || value.trim() === 'true' ? 'green' : 'yellow');\n case 'status':\n return colorizeStatus(value);\n case 'numberValue':\n return colorize(value, 'cyan');\n case 'stringValue':\n return colorize(value, 'green');\n case 'booleanValue':\n return colorize(value, 'yellow');\n case 'functionValue':\n return colorize(value, 'blue');\n case 'objectValue':\n return colorize(value, 'magenta');\n case 'event':\n return colorizeEvent(value);\n case 'error':\n return colorize(value, 'red');\n case 'plain':\n return value;\n }\n}\n\nfunction colorizeStatus(value: string): string {\n const normalized = value.trim().toLowerCase();\n if (normalized === 'running' || normalized === 'continued' || normalized === 'initialized') {\n return colorize(value, 'green');\n }\n if (normalized === 'stopped' || normalized === 'paused' || normalized === 'breakpoint') {\n return colorize(value, 'yellow');\n }\n if (normalized === 'terminated' || normalized === 'exited' || normalized === 'closed') {\n return colorize(value, 'dim');\n }\n return value;\n}\n\nfunction colorizeEvent(value: string): string {\n const normalized = value.trim().toLowerCase();\n if (normalized === 'stopped' || normalized === 'breakpoint') {\n return colorize(value, 'yellow');\n }\n if (normalized === 'terminated' || normalized === 'exited') {\n return colorize(value, 'dim');\n }\n if (normalized === 'continued' || normalized === 'initialized') {\n return colorize(value, 'green');\n }\n return value;\n}\n\nfunction variableValueStyle(typeText: string): StyleKind {\n switch (typeText.trim().toLowerCase()) {\n case 'number':\n case 'bigint':\n return 'numberValue';\n case 'string':\n return 'stringValue';\n case 'boolean':\n return 'booleanValue';\n case 'function':\n return 'functionValue';\n case 'object':\n case 'array':\n return 'objectValue';\n default:\n return 'plain';\n }\n}\n\ntype AnsiStyle = 'bold' | 'dim' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan';\n\nconst ansiStyles: Record<AnsiStyle, string> = {\n bold: '\\u001B[1m',\n dim: '\\u001B[2m',\n red: '\\u001B[31m',\n green: '\\u001B[32m',\n yellow: '\\u001B[33m',\n blue: '\\u001B[34m',\n magenta: '\\u001B[35m',\n cyan: '\\u001B[36m',\n};\n\nfunction colorize(value: string, style: AnsiStyle): string {\n if (!shouldUseColor()) {\n return value;\n }\n\n return `${ansiStyles[style]}${value}\\u001B[0m`;\n}\n\nfunction shouldUseColor(): boolean {\n if (process.env.NO_COLOR !== undefined || process.env.TERM === 'dumb') {\n return false;\n }\n const forceColor = process.env.FORCE_COLOR;\n if (forceColor !== undefined && forceColor !== '' && forceColor !== '0') {\n return true;\n }\n\n return process.stdout.isTTY === true;\n}\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isRecordArray(value: unknown): value is UnknownRecord[] {\n return Array.isArray(value) && value.every(isRecord);\n}","import { CliError } from './errors.js';\nimport type { JsonMetaInput, JsonWritable } from './output.js';\nimport { writeJsonFailure, writeJsonSuccess } from './output.js';\nimport type { OutputMode } from './outputMode.js';\nimport { renderHumanFailure, renderHumanSuccess } from './humanOutput.js';\n\nexport interface OutputWriter {\n success<T>(data: T, meta: JsonMetaInput): void;\n failure(error: CliError, meta: JsonMetaInput): void;\n warn(message: string): void;\n}\n\nexport interface CreateOutputWriterOptions {\n stream?: JsonWritable;\n errorStream?: JsonWritable;\n resolveMode: () => OutputMode;\n}\n\nexport function createOutputWriter(options: CreateOutputWriterOptions): OutputWriter {\n const stream = options.stream ?? process.stdout;\n const errorStream = options.errorStream ?? process.stderr;\n const pendingWarnings: string[] = [];\n\n const drainWarnings = (): string[] => {\n const drained = pendingWarnings.slice();\n pendingWarnings.length = 0;\n return drained;\n };\n\n const withWarnings = (meta: JsonMetaInput): JsonMetaInput => {\n const drained = drainWarnings();\n if (drained.length === 0) {\n return meta;\n }\n const existing = meta.warnings ?? [];\n return { ...meta, warnings: [...existing, ...drained] };\n };\n\n return {\n success<T>(data: T, meta: JsonMetaInput): void {\n if (options.resolveMode() === 'human') {\n drainWarnings();\n stream.write(renderHumanSuccess(data, meta));\n return;\n }\n\n writeJsonSuccess(data, withWarnings(meta), stream);\n },\n failure(error: CliError, meta: JsonMetaInput): void {\n let mode: OutputMode;\n try {\n mode = options.resolveMode();\n } catch (modeError) {\n if (modeError instanceof CliError) {\n writeJsonFailure(modeError, withWarnings(meta), stream);\n return;\n }\n throw modeError;\n }\n\n if (mode === 'human') {\n drainWarnings();\n stream.write(renderHumanFailure(error, meta));\n return;\n }\n\n writeJsonFailure(error, withWarnings(meta), stream);\n },\n warn(message: string): void {\n let mode: OutputMode;\n try {\n mode = options.resolveMode();\n } catch {\n // If mode resolution throws (e.g. invalid env), fall back to stderr so we don't lose the warning.\n errorStream.write(`${message}\\n`);\n return;\n }\n if (mode === 'json') {\n pendingWarnings.push(message);\n return;\n }\n errorStream.write(`${message}\\n`);\n },\n };\n}","import { createRequire } from 'node:module';\nimport { Command } from 'commander';\nimport type { JsonWritable } from './output.js';\nimport type { OutputWriter } from './outputWriter.js';\nimport { resolveOutputMode } from './outputMode.js';\nimport { createOutputWriter } from './outputWriter.js';\nimport { registerControllerCommands } from './commands/controller.js';\nimport { registerDapAliasCommands } from './commands/dapAliases.js';\nimport { registerDapCoreCommands } from './commands/dapCore.js';\nimport { registerGeneratedDapCommands } from './commands/dapGenerated.js';\nimport { registerSessionCommands } from './commands/sessions.js';\n\nconst require = createRequire(import.meta.url);\n// Resolve relative to the bundled dist/index.js first; fall back to the\n// source-relative path so vitest (which loads src/cli/program.ts directly)\n// can also read package.json.\nfunction loadPackageJson(): unknown {\n try {\n return require('../package.json');\n } catch {\n return require('../../package.json');\n }\n}\nconst packageJson: unknown = loadPackageJson();\n\nexport interface ProgramOptions {\n stdout?: JsonWritable;\n stderr?: JsonWritable;\n}\n\nconst PROGRAM_OUTPUT_WRITER = Symbol('dap-cli.programOutputWriter');\n\nexport function getProgramOutputWriter(program: Command): OutputWriter | undefined {\n return (program as unknown as Record<symbol, OutputWriter | undefined>)[PROGRAM_OUTPUT_WRITER];\n}\n\nexport function createProgram(options: ProgramOptions = {}): Command {\n const program = new Command();\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const output = createOutputWriter({\n stream: stdout,\n errorStream: stderr,\n resolveMode: () => resolveOutputMode({ cliHuman: getProgramHumanOption(program), isStdoutTTY: stdout.isTTY === true, env: process.env }),\n });\n (program as unknown as Record<symbol, OutputWriter>)[PROGRAM_OUTPUT_WRITER] = output;\n\n program\n .name('dap-cli')\n .description('A Debug Adapter Protocol CLI for agents. Control debug sessions from shell commands.')\n .version(getPackageVersion(packageJson))\n .option('--human', 'render human-readable output (default when stdout is a TTY and DAP_CLI_HUMAN is set)')\n .option('--no-human', 'render machine-readable JSON output even if DAP_CLI_HUMAN is set or stdout is a TTY')\n .showHelpAfterError()\n .exitOverride();\n\n registerControllerCommands(program, output);\n registerSessionCommands(program, output);\n registerDapCoreCommands(program, output);\n registerGeneratedDapCommands(program, output);\n registerDapAliasCommands(program, output);\n\n // Replace commander's default `help [command]` with a variadic walker so\n // `dap-cli help breakpoints set` drills into the subcommand tree (per D-02).\n program.helpCommand(false);\n program\n .command('help [command...]')\n .description('Display help for a command. Pass multiple words to drill into subcommands (e.g. `dap-cli help breakpoints set`).')\n .action((commandPath: string[] | undefined) => {\n const segments = Array.isArray(commandPath) ? commandPath : [];\n if (segments.length === 0) {\n program.outputHelp();\n return;\n }\n let current: Command = program;\n const matched: string[] = [];\n for (const segment of segments) {\n const next = current.commands.find(child => child.name() === segment);\n if (!next) {\n const knownPath = matched.length === 0 ? 'dap-cli' : `dap-cli ${matched.join(' ')}`;\n const requestedPath = `dap-cli ${segments.join(' ')}`;\n const message = `Unknown help target: ${requestedPath}. \\`${segment}\\` is not a subcommand of \\`${knownPath}\\`.`;\n // Render the parent's help so the user sees what IS available, then\n // fail through commander's exitOverride so main.ts emits a real\n // usage_error envelope (NOT a help-dispatch one).\n current.outputHelp({ error: true });\n const error = new Error(message);\n error.name = 'CommanderError';\n (error as Error & { code: string; exitCode: number }).code = 'commander.unknownCommand';\n (error as Error & { code: string; exitCode: number }).exitCode = 2;\n throw error;\n }\n matched.push(segment);\n current = next;\n }\n current.outputHelp();\n });\n\n program.addHelpText('after', `\n\nExamples:\n $ dap-cli start\n $ dap-cli launch --adapter js-debug --program ./app.js\n $ dap-cli status\n $ dap-cli events --after-cursor 0\n $ dap-cli threads\n $ dap-cli stack --thread-id 1\n`);\n\n return program;\n}\n\nexport function getProgramHumanOption(program: Command): boolean | undefined {\n const options: unknown = program.opts();\n if (typeof options !== 'object' || options === null || !('human' in options)) {\n return undefined;\n }\n\n const value = options.human;\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction getPackageVersion(rawPackageJson: unknown): string {\n if (typeof rawPackageJson === 'object' && rawPackageJson !== null && 'version' in rawPackageJson) {\n const version = rawPackageJson.version;\n if (typeof version === 'string') {\n return version;\n }\n }\n\n return '0.0.0';\n}\n","import { usageError } from './errors.js';\n\nexport type OutputMode = 'json' | 'human';\n\nexport interface ResolveOutputModeInput {\n cliHuman: boolean | undefined;\n isStdoutTTY: boolean;\n env?: NodeJS.ProcessEnv;\n}\n\nconst trueValues = new Set(['1', 'true', 'yes', 'on', 'human']);\nconst falseValues = new Set(['0', 'false', 'no', 'off', 'json']);\n\nexport function resolveOutputMode(input: ResolveOutputModeInput): OutputMode {\n if (input.cliHuman === true) {\n return 'human';\n }\n if (input.cliHuman === false) {\n return 'json';\n }\n if (input.isStdoutTTY === false) {\n return 'json';\n }\n\n return parseHumanEnv(input.env ?? process.env) ? 'human' : 'json';\n}\n\nfunction parseHumanEnv(env: NodeJS.ProcessEnv): boolean {\n const rawValue = env.DAP_CLI_HUMAN;\n if (rawValue === undefined) {\n return false;\n }\n\n const value = rawValue.trim().toLowerCase();\n if (value.length === 0) {\n return false;\n }\n if (trueValues.has(value)) {\n return true;\n }\n if (falseValues.has(value)) {\n return false;\n }\n\n throw usageError('Invalid DAP_CLI_HUMAN value.', {\n code: 'invalid_output_mode_env',\n diagnostics: ['Use DAP_CLI_HUMAN=1 for human output or DAP_CLI_HUMAN=0 for JSON output.'],\n });\n}","import { spawn } from 'node:child_process';\nimport type { Command } from 'commander';\nimport { CliError, controllerError } from '../errors.js';\nimport { createControllerClient } from '../../controller/client.js';\nimport { controllerUnavailable } from '../../controller/diagnostics.js';\nimport { isControllerAlive, readControllerDiscovery, removeControllerDiscovery, type ControllerDiscovery } from '../../controller/ipc.js';\nimport { startControllerServer, type ControllerHelloResult, type ControllerStatus } from '../../controller/server.js';\nimport { computeBuildId } from '../../controller/buildId.js';\nimport type { OutputWriter } from '../outputWriter.js';\n\ninterface ControllerStartResult {\n started: boolean;\n reused: boolean;\n pid: number;\n endpoint: ControllerDiscovery['endpoint'];\n stateDir: string;\n logDir: string;\n buildId: string;\n}\n\nexport function registerControllerCommands(program: Command, output: OutputWriter): void {\n program\n .command('start')\n .helpGroup('Controller lifecycle')\n .description('Start the persistent controller for debug sessions')\n .action(async () => {\n output.success(await startControllerProcess(), { command: 'start' });\n });\n\n program\n .command('status')\n .helpGroup('Controller lifecycle')\n .option('--name <name>', 'session name or id')\n .description('Poll session status (running, stopped, terminated)')\n .addHelpText('after', `\n\nExamples:\n $ dap-cli status\n $ dap-cli status --name demo\n`)\n .action(async (options: { name?: string }) => {\n const client = await createControllerClient({ dapCliHome: process.env.DAP_CLI_HOME });\n try {\n const status = await requestSessionOrControllerStatus(client, options.name);\n output.success(status, { command: 'status' });\n } finally {\n await client.close();\n }\n });\n\n program\n .command('stop')\n .helpGroup('Controller lifecycle')\n .option('--name <name>', 'session name or id')\n .description('Stop a debug session, or stop the controller when no session is selected')\n .action(async (options: { name?: string }) => {\n const client = await createControllerClient({ dapCliHome: process.env.DAP_CLI_HOME });\n try {\n const result = await requestSessionOrControllerStop(client, options.name);\n output.success(result, { command: 'stop' });\n } finally {\n await client.close();\n }\n });\n\n program\n .command('serve-controller', { hidden: true })\n .action(async () => {\n const server = await startControllerServer({ dapCliHome: process.env.DAP_CLI_HOME });\n await server.closed;\n });\n\n program\n .command('stop-controller')\n .helpGroup('Controller lifecycle')\n .description('Shut down the persistent controller (does not affect on-disk session records)')\n .action(async () => {\n const result = await stopControllerProcess();\n output.success(result, { command: 'stop-controller' });\n });\n}\n\nasync function stopControllerProcess(): Promise<{ stopped: boolean }> {\n const discovery = await readControllerDiscovery({ dapCliHome: process.env.DAP_CLI_HOME });\n if (discovery === undefined || !(await isControllerAlive(discovery))) {\n return { stopped: false };\n }\n\n const client = await createControllerClient({ dapCliHome: process.env.DAP_CLI_HOME });\n try {\n await client.request<{ stopped: boolean }>('controller.shutdown');\n } finally {\n await client.close();\n }\n return { stopped: true };\n}\n\nasync function requestSessionOrControllerStatus(client: Awaited<ReturnType<typeof createControllerClient>>, name: string | undefined): Promise<unknown> {\n try {\n return await client.request('sessions.status', name === undefined ? undefined : { name });\n } catch (error) {\n if (name === undefined && isMissingSessionSelection(error)) {\n return client.request<ControllerStatus>('controller.status');\n }\n\n throw error;\n }\n}\n\nasync function requestSessionOrControllerStop(client: Awaited<ReturnType<typeof createControllerClient>>, name: string | undefined): Promise<unknown> {\n try {\n return await client.request('sessions.stop', name === undefined ? undefined : { name });\n } catch (error) {\n if (name === undefined && isMissingSessionSelection(error)) {\n return client.request<{ stopped: boolean }>('controller.shutdown');\n }\n\n throw error;\n }\n}\n\nfunction isMissingSessionSelection(error: unknown): boolean {\n return error instanceof CliError && (error.code === 'no_sessions' || error.code === 'no_active_session');\n}\n\nasync function startControllerProcess(): Promise<ControllerStartResult> {\n const currentBuildId = await computeBuildId();\n const existingDiscovery = await readControllerDiscovery({ dapCliHome: process.env.DAP_CLI_HOME });\n if (existingDiscovery !== undefined) {\n if (await isControllerAlive(existingDiscovery)) {\n const existingBuildId = await fetchControllerBuildId(existingDiscovery);\n if (existingBuildId !== undefined && existingBuildId !== currentBuildId) {\n throw controllerBuildMismatch(existingBuildId, currentBuildId);\n }\n return toStartResult(false, true, existingDiscovery, existingBuildId ?? currentBuildId);\n }\n\n await removeControllerDiscovery({ dapCliHome: process.env.DAP_CLI_HOME });\n }\n\n const entrypoint = process.env.DAP_CLI_ENTRYPOINT ?? process.argv[1];\n if (entrypoint === undefined || entrypoint.length === 0) {\n throw controllerUnavailable('Unable to resolve dap-cli entrypoint for controller start.');\n }\n\n const child = spawn(process.execPath, [entrypoint, 'serve-controller'], {\n detached: true,\n env: process.env,\n stdio: 'ignore',\n });\n child.unref();\n\n const discovery = await waitForControllerDiscovery();\n const buildId = (await fetchControllerBuildId(discovery)) ?? currentBuildId;\n return toStartResult(true, false, discovery, buildId);\n}\n\nasync function fetchControllerBuildId(discovery: ControllerDiscovery): Promise<string | undefined> {\n try {\n const client = await createControllerClient({ discovery, timeoutMs: 1_000 });\n try {\n const hello = await client.request<ControllerHelloResult>('controller.hello');\n return hello.buildId;\n } finally {\n await client.close();\n }\n } catch {\n return undefined;\n }\n}\n\nfunction controllerBuildMismatch(existingBuildId: string, currentBuildId: string): CliError {\n return controllerError('Existing dap-cli controller was built from a different version.', {\n code: 'controller_build_mismatch',\n diagnostics: [\n `Existing controller build id: ${existingBuildId}`,\n `Current CLI build id: ${currentBuildId}`,\n 'Run `dap-cli stop-controller` and retry `dap-cli start` to launch a fresh controller.',\n ],\n });\n}\n\nasync function waitForControllerDiscovery(): Promise<ControllerDiscovery> {\n const deadline = Date.now() + 5_000;\n\n while (Date.now() < deadline) {\n const discovery = await readControllerDiscovery({ dapCliHome: process.env.DAP_CLI_HOME });\n if (discovery !== undefined && await isControllerAlive(discovery)) {\n return discovery;\n }\n\n await delay(50);\n }\n\n throw controllerUnavailable('Timed out waiting for dap-cli controller to start.');\n}\n\nfunction toStartResult(started: boolean, reused: boolean, discovery: ControllerDiscovery, buildId: string): ControllerStartResult {\n return {\n started,\n reused,\n pid: discovery.pid,\n endpoint: discovery.endpoint,\n stateDir: discovery.stateDir,\n logDir: discovery.logDir,\n buildId,\n };\n}\n\nasync function delay(ms: number): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, ms));\n}\n","import { z } from 'zod';\n\nexport const controllerRequestMethods = [\n 'controller.start',\n 'controller.status',\n 'controller.shutdown',\n 'controller.cleanup',\n 'controller.hello',\n 'sessions.launch',\n 'sessions.attach',\n 'sessions.list',\n 'sessions.target',\n 'sessions.use',\n 'sessions.status',\n 'sessions.stop',\n 'sessions.detach',\n 'sessions.close',\n 'sessions.cleanup',\n 'dap.start',\n 'dap.startCompound',\n 'dap.request',\n 'dap.capabilities',\n 'dap.continue',\n 'dap.stackTrace',\n 'dap.scopes',\n 'dap.variables',\n 'dap.setBreakpoints',\n 'events.list',\n 'events.recent',\n 'sessions.breakpoints.list',\n 'sessions.breakpoints.clear',\n] as const;\n\nexport type ControllerRequestMethod = (typeof controllerRequestMethods)[number];\n\nexport const controllerRequestMethodSchema = z.enum(controllerRequestMethods);\n\nexport const controllerRequestSchema = z.object({\n id: z.string().min(1),\n method: controllerRequestMethodSchema,\n params: z.unknown().optional(),\n});\n\nexport interface ControllerRequest<TParams = unknown> {\n id: string;\n method: ControllerRequestMethod;\n params?: TParams;\n}\n\nexport interface ControllerResponse<TResponse = unknown> {\n id: string;\n ok: true;\n result: TResponse;\n}\n\nexport interface ControllerFailureResponse {\n id: string;\n ok: false;\n error: {\n code: string;\n message: string;\n category?: string;\n exitCode?: number;\n diagnostics?: readonly string[];\n sessionId?: string;\n request?: { command: string; seq?: number };\n adapter?: { descriptorId?: string; pid?: number; stderrTail?: readonly string[]; logPath?: string };\n // Plan 05-19 (gap H-3): structured machine-readable recovery payload.\n data?: Readonly<Record<string, unknown>>;\n };\n}\n\nexport const controllerSuccessResponseSchema = z.object({\n id: z.string().min(1),\n ok: z.literal(true),\n result: z.unknown(),\n});\n\nexport const controllerFailureResponseSchema = z.object({\n id: z.string().min(1),\n ok: z.literal(false),\n error: z.object({\n code: z.string().min(1),\n message: z.string().min(1),\n category: z.string().min(1).optional(),\n exitCode: z.number().int().optional(),\n diagnostics: z.array(z.string()).optional(),\n sessionId: z.string().min(1).optional(),\n request: z.object({\n command: z.string().min(1),\n seq: z.number().int().positive().optional(),\n }).optional(),\n adapter: z.object({\n descriptorId: z.string().min(1).optional(),\n pid: z.number().int().positive().optional(),\n stderrTail: z.array(z.string()).optional(),\n logPath: z.string().min(1).optional(),\n }).optional(),\n data: z.record(z.string(), z.unknown()).optional(),\n }),\n});\n\nexport const controllerResponseSchema = z.discriminatedUnion('ok', [\n controllerSuccessResponseSchema,\n controllerFailureResponseSchema,\n]);\n","import { controllerError, dapError, timeoutError, type CliError } from '../cli/errors.js';\n\nexport function controllerUnavailable(message = 'dap-cli controller is unavailable.'): CliError {\n return controllerError(message, {\n code: 'controller_unavailable',\n diagnostics: ['Run `dap-cli start` and retry the command.'],\n });\n}\n\nexport function staleControllerDiscovery(message = 'dap-cli controller discovery is stale.'): CliError {\n return controllerError(message, {\n code: 'controller_stale_discovery',\n // Plan 05-20 (gap H-4): plain cleanup-without-purge only touches\n // per-session records, not the controller discovery file. Steer the\n // user at the right recovery surface (`stop-controller`) rather than\n // at a no-op cleanup.\n diagnostics: ['Remove stale state with `dap-cli stop-controller` or start a new controller.'],\n });\n}\n\nexport function malformedControllerJson(message = 'Malformed controller JSON request.'): CliError {\n return controllerError(message, {\n code: 'controller_malformed_json',\n diagnostics: ['Controller IPC requests must be newline-delimited JSON objects.'],\n });\n}\n\nexport function controllerRequestTimeout(message = 'Timed out waiting for dap-cli controller response.'): CliError {\n return timeoutError(message, {\n code: 'controller_request_timeout',\n diagnostics: ['Check whether the controller process is still healthy.'],\n });\n}\n\n/**\n * Plan 05-20 (gap H-7): paused-state-required DAP requests (stackTrace,\n * scopes, variables) get a structured `thread_not_paused` error when the\n * controller can prove the thread isn't paused (via the H-1 paused\n * projection). The recovery hint must NEVER suggest `dap-cli start` for\n * this case — the controller is already running; the issue is that the\n * caller invoked a paused-only DAP request against a running thread.\n */\nexport function threadNotPaused(options: { sessionId?: string; sessionName?: string; command?: string } = {}): CliError {\n const nameRef = options.sessionName ?? '<name>';\n return dapError('Thread is not paused.', {\n code: 'thread_not_paused',\n diagnostics: [\n `Poll \\`dap-cli events --name ${nameRef} --include stopped\\` until a stopped event appears, then retry. Use --stop-on-entry on launch to pause immediately.`,\n ],\n ...(options.sessionId !== undefined ? { sessionId: options.sessionId } : {}),\n ...(options.command !== undefined ? { request: { command: options.command } } : {}),\n });\n}\n\nexport function breakpointBindingGuidance(options: { sourcePath?: string | undefined; adapterId?: string | undefined } = {}): string[] {\n if (options.adapterId !== 'js-debug' && options.adapterId !== undefined) {\n return [];\n }\n\n const diagnostics = [\n 'Breakpoint verification timed out. Check the js-debug trace log for source-map resolution details.',\n ];\n if (options.sourcePath?.endsWith('.js') === true || options.sourcePath?.endsWith('.mjs') === true || options.sourcePath?.endsWith('.cjs') === true) {\n diagnostics.push('For JavaScript source breakpoints, confirm the source path is the file actually loaded by the debuggee. Use `dap-cli stack` after a stopped event to compare reported frame source paths with the requested breakpoint path.');\n diagnostics.push('If the process exits quickly or the module is loaded after launch, retry with `stopOnEntry: true` or set the breakpoint after the child session appears in `dap-cli sessions --show-children`.');\n } else if (options.sourcePath?.endsWith('.ts') === true || options.sourcePath?.endsWith('.tsx') === true) {\n diagnostics.push('TypeScript source breakpoints usually require `sourceMaps: true` and an `outFiles` glob that matches emitted JavaScript, for example `\"outFiles\": [\"${workspaceFolder}/dist/**/*.js\"]`.');\n diagnostics.push('If the launch uses ts-node, make sure source maps are enabled for the runtime; if it uses Jest, prefer `--runInBand --no-coverage` while debugging.');\n }\n return diagnostics;\n}\n","import { promises as fs } from 'node:fs';\nimport net from 'node:net';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { getDapCliLogDir, getDapCliStateDir } from '../config/paths.js';\n\nexport type ControllerEndpoint = { kind: 'ipc'; path: string } | { kind: 'tcp'; host: '127.0.0.1'; port: number };\n\nexport interface ControllerDiscovery {\n version: 1;\n pid: number;\n endpoint: ControllerEndpoint;\n stateDir: string;\n logDir: string;\n activeSessionId?: string | undefined;\n startedAt: string;\n lastHeartbeatAt: string;\n}\n\nexport interface ControllerPathOptions {\n dapCliHome?: string | undefined;\n platform?: NodeJS.Platform;\n}\n\nexport interface ControllerServerSocket {\n server: net.Server;\n endpoint: ControllerEndpoint;\n stateDir: string;\n logDir: string;\n}\n\nconst controllerEndpointSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('ipc'), path: z.string().min(1) }),\n z.object({ kind: z.literal('tcp'), host: z.literal('127.0.0.1'), port: z.number().int().positive() }),\n]);\n\nconst controllerDiscoverySchema = z.object({\n version: z.literal(1),\n pid: z.number().int().positive(),\n endpoint: controllerEndpointSchema,\n stateDir: z.string().min(1),\n logDir: z.string().min(1),\n activeSessionId: z.string().min(1).optional(),\n startedAt: z.string().min(1),\n lastHeartbeatAt: z.string().min(1),\n});\n\nexport function resolveControllerDiscoveryPath(options: ControllerPathOptions = {}): string {\n return path.join(resolveStateDir(options), 'controller.json');\n}\n\nexport async function readControllerDiscovery(options: ControllerPathOptions = {}): Promise<ControllerDiscovery | undefined> {\n const discoveryPath = resolveControllerDiscoveryPath(options);\n\n try {\n const raw = await fs.readFile(discoveryPath, 'utf8');\n return controllerDiscoverySchema.parse(JSON.parse(raw));\n } catch (error) {\n if (isNodeError(error) && error.code === 'ENOENT') {\n return undefined;\n }\n\n throw error;\n }\n}\n\nexport async function writeControllerDiscovery(discovery: ControllerDiscovery, options: ControllerPathOptions = {}): Promise<void> {\n const discoveryPath = resolveControllerDiscoveryPath(options);\n await fs.mkdir(path.dirname(discoveryPath), { recursive: true });\n await fs.writeFile(discoveryPath, `${JSON.stringify(controllerDiscoverySchema.parse(discovery), null, 2)}\\n`, 'utf8');\n}\n\nexport async function removeControllerDiscovery(options: ControllerPathOptions = {}): Promise<void> {\n const discoveryPath = resolveControllerDiscoveryPath(options);\n await fs.rm(discoveryPath, { force: true });\n}\n\nexport async function isControllerAlive(discovery: ControllerDiscovery, timeoutMs = 250): Promise<boolean> {\n if (!isPidAlive(discovery.pid)) {\n return false;\n }\n\n const socket = await connectControllerEndpoint(discovery.endpoint, timeoutMs).catch(() => undefined);\n if (socket === undefined) {\n return false;\n }\n\n socket.destroy();\n return true;\n}\n\nexport async function createControllerServerSocket(\n onConnection: (socket: net.Socket) => void,\n options: ControllerPathOptions = {},\n): Promise<ControllerServerSocket> {\n const stateDir = resolveStateDir(options);\n const logDir = resolveLogDir(options);\n await fs.mkdir(stateDir, { recursive: true });\n await fs.mkdir(logDir, { recursive: true });\n\n const endpoint = createControllerEndpoint(stateDir, options.platform ?? process.platform);\n\n if (endpoint.kind === 'ipc' && process.platform !== 'win32') {\n await fs.rm(endpoint.path, { force: true });\n }\n\n const server = net.createServer(onConnection);\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n const onListening = (): void => {\n server.off('error', reject);\n resolve();\n };\n\n if (endpoint.kind === 'ipc') {\n server.listen(endpoint.path, onListening);\n return;\n }\n\n server.listen(endpoint.port, endpoint.host, onListening);\n });\n\n return { server, endpoint, stateDir, logDir };\n}\n\nexport async function connectControllerEndpoint(endpoint: ControllerEndpoint, timeoutMs = 5_000): Promise<net.Socket> {\n return new Promise((resolve, reject) => {\n const socket = endpoint.kind === 'ipc'\n ? net.createConnection(endpoint.path)\n : net.createConnection({ host: endpoint.host, port: endpoint.port });\n const timeout = setTimeout(() => {\n socket.destroy();\n reject(new Error('Timed out connecting to controller.'));\n }, timeoutMs);\n\n socket.once('connect', () => {\n clearTimeout(timeout);\n resolve(socket);\n });\n socket.once('error', error => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n}\n\nfunction createControllerEndpoint(stateDir: string, platform: NodeJS.Platform): ControllerEndpoint {\n if (platform === 'win32') {\n return { kind: 'ipc', path: `\\\\\\\\.\\\\pipe\\\\dap-cli-${Buffer.from(stateDir).toString('hex').slice(0, 24)}` };\n }\n\n return { kind: 'ipc', path: path.join(stateDir, 'controller.sock') };\n}\n\nfunction resolveStateDir(options: ControllerPathOptions): string {\n return getDapCliStateDir(createEnv(options));\n}\n\nfunction resolveLogDir(options: ControllerPathOptions): string {\n return getDapCliLogDir(createEnv(options));\n}\n\nfunction createEnv(options: ControllerPathOptions): NodeJS.ProcessEnv {\n return options.dapCliHome === undefined ? process.env : { ...process.env, DAP_CLI_HOME: options.dapCliHome };\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return isNodeError(error) && error.code === 'EPERM';\n }\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error;\n}\n","import { homedir } from 'node:os';\nimport path from 'node:path';\n\nconst appDirectoryName = '.dap-cli';\n\nexport function getDapCliHome(env: NodeJS.ProcessEnv = process.env): string {\n const configuredHome = env.DAP_CLI_HOME;\n\n if (configuredHome !== undefined && configuredHome.trim().length > 0) {\n return path.resolve(configuredHome);\n }\n\n return getDefaultDapCliHome();\n}\n\nexport function getDapCliStateDir(env: NodeJS.ProcessEnv = process.env): string {\n return path.join(getDapCliHome(env), 'state');\n}\n\nexport function getDapCliLogDir(env: NodeJS.ProcessEnv = process.env): string {\n return path.join(getDapCliHome(env), 'logs');\n}\n\nexport function getDapCliAdaptersDir(env: NodeJS.ProcessEnv = process.env): string {\n return path.join(getDapCliHome(env), 'adapters');\n}\n\nexport function getDapCliVenvPythonPath(env: NodeJS.ProcessEnv = process.env): string {\n const venvDirectory = path.join(getDapCliHome(env), 'venv');\n if (process.platform === 'win32') {\n return path.join(venvDirectory, 'Scripts', 'python.exe');\n }\n\n return path.join(venvDirectory, 'bin', 'python3');\n}\n\nfunction getDefaultDapCliHome(): string {\n return path.join(homedir(), appDirectoryName);\n}\n","import type net from 'node:net';\nimport { CliError, sessionError, type CliErrorAdapterContext, type CliErrorCategory, type CliErrorOptions, type CliErrorRequestContext } from '../cli/errors.js';\nimport { controllerResponseSchema, type ControllerRequestMethod } from './requests.js';\nimport { controllerRequestTimeout, controllerUnavailable } from './diagnostics.js';\nimport { connectControllerEndpoint, isControllerAlive, readControllerDiscovery, type ControllerDiscovery } from './ipc.js';\n\nexport interface ControllerClient {\n request<TResponse>(method: ControllerRequestMethod, params?: unknown): Promise<TResponse>;\n close(): Promise<void>;\n}\n\nexport interface ControllerClientOptions {\n discovery?: ControllerDiscovery;\n dapCliHome?: string | undefined;\n timeoutMs?: number;\n}\n\nexport async function createControllerClient(options: ControllerClientOptions = {}): Promise<ControllerClient> {\n const discovery = options.discovery ?? await readControllerDiscovery({ dapCliHome: options.dapCliHome });\n\n if (discovery === undefined || !await isControllerAlive(discovery)) {\n throw controllerUnavailable();\n }\n\n return new JsonControllerClient(discovery, options.timeoutMs ?? 5_000);\n}\n\nclass JsonControllerClient implements ControllerClient {\n private nextRequestId = 1;\n\n public constructor(private readonly discovery: ControllerDiscovery, private readonly timeoutMs: number) {}\n\n public async request<TResponse>(method: ControllerRequestMethod, params?: unknown): Promise<TResponse> {\n const id = String(this.nextRequestId);\n this.nextRequestId += 1;\n const socket = await connectControllerEndpoint(this.discovery.endpoint, this.timeoutMs);\n\n try {\n const rawResponse = await this.sendRequest(socket, id, method, params);\n const response = controllerResponseSchema.parse(JSON.parse(rawResponse));\n\n if (!response.ok) {\n if (response.error.category !== undefined && response.error.exitCode !== undefined) {\n const options: CliErrorOptions = {\n code: response.error.code,\n };\n if (response.error.diagnostics !== undefined) {\n options.diagnostics = response.error.diagnostics;\n }\n if (response.error.sessionId !== undefined) {\n options.sessionId = response.error.sessionId;\n }\n if (response.error.request !== undefined) {\n options.request = toRequestContext(response.error.request);\n }\n if (response.error.adapter !== undefined) {\n options.adapter = toAdapterContext(response.error.adapter);\n }\n if (response.error.data !== undefined) {\n options.data = response.error.data;\n }\n\n throw new CliError(response.error.message, toCliErrorCategory(response.error.category), response.error.exitCode, options);\n }\n\n if (isSessionErrorCode(response.error.code)) {\n throw sessionError(response.error.message, { code: response.error.code, diagnostics: [response.error.message] });\n }\n\n throw controllerUnavailable(response.error.message);\n }\n\n return response.result as TResponse;\n } finally {\n socket.destroy();\n }\n }\n\n public async close(): Promise<void> {\n return Promise.resolve();\n }\n\n private async sendRequest(socket: net.Socket, id: string, method: ControllerRequestMethod, params: unknown): Promise<string> {\n return new Promise((resolve, reject) => {\n let buffer = '';\n let settled = false;\n const timeout = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(controllerRequestTimeout());\n }, this.timeoutMs);\n const cleanup = (): void => {\n clearTimeout(timeout);\n socket.off('data', onData);\n socket.off('error', onError);\n socket.off('close', onClose);\n socket.off('end', onEnd);\n };\n const onData = (chunk: Buffer): void => {\n buffer += chunk.toString('utf8');\n const newlineIndex = buffer.indexOf('\\n');\n if (newlineIndex === -1) {\n return;\n }\n\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(buffer.slice(0, newlineIndex));\n };\n const onError = (error: Error): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(error);\n };\n // Round 6 R6-A: if the controller socket closes mid-request without\n // emitting a payload, neither 'data' nor 'error' fires and the request\n // would hang until the per-call timeout (up to 60s for `launch`).\n // Reject promptly with a structured controller-disconnected error so\n // racing `stop-controller` + RPC produces an actionable envelope.\n const onClose = (): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n // If we got partial data, treat as malformed; otherwise the controller\n // closed before responding.\n reject(controllerUnavailable(buffer.length === 0\n ? 'dap-cli controller closed the connection before responding.'\n : 'dap-cli controller closed the connection mid-response.'));\n };\n const onEnd = (): void => {\n onClose();\n };\n\n socket.on('data', onData);\n socket.on('error', onError);\n socket.on('close', onClose);\n socket.on('end', onEnd);\n socket.write(`${JSON.stringify({ id, method, params })}\\n`);\n });\n }\n}\n\nfunction toCliErrorCategory(value: string): CliErrorCategory {\n if (value === 'usage' || value === 'controller' || value === 'session' || value === 'dap' || value === 'adapter' || value === 'timeout' || value === 'internal') {\n return value;\n }\n\n return 'controller';\n}\n\nfunction toRequestContext(value: { command: string; seq?: number | undefined }): CliErrorRequestContext {\n const context: CliErrorRequestContext = { command: value.command };\n if (value.seq !== undefined) {\n context.seq = value.seq;\n }\n\n return context;\n}\n\nfunction toAdapterContext(value: { descriptorId?: string | undefined; pid?: number | undefined; stderrTail?: string[] | undefined; logPath?: string | undefined }): CliErrorAdapterContext {\n const context: CliErrorAdapterContext = {};\n if (value.descriptorId !== undefined) {\n context.descriptorId = value.descriptorId;\n }\n if (value.pid !== undefined) {\n context.pid = value.pid;\n }\n if (value.stderrTail !== undefined) {\n context.stderrTail = value.stderrTail;\n }\n if (value.logPath !== undefined) {\n context.logPath = value.logPath;\n }\n\n return context;\n}\n\nfunction isSessionErrorCode(code: string): boolean {\n return code === 'no_sessions' || code === 'no_active_session' || code === 'session_not_found' || code === 'session_ambiguous' || code === 'session_unavailable' || code === 'session_name_in_use';\n}\n","import type net from 'node:net';\nimport path from 'node:path';\nimport { randomBytes } from 'node:crypto';\nimport { parseAdapterDescriptor, type AdapterDescriptor } from '../adapters/descriptor.js';\nimport { startProcessAdapter, type StartedProcessAdapter } from '../adapters/processAdapter.js';\nimport { connectSocketAdapter, startServerSocketAdapter, type ConnectedSocketAdapter, type StartedServerSocketAdapter } from '../adapters/socketAdapter.js';\nimport { applyJsDebugTraceDefaults } from '../adapters/builtins/jsDebug.js';\nimport { adapterError, CliError, dapError, sessionError, timeoutError, usageError, type CliErrorAdapterContext, type CliErrorOptions, type CliErrorRequestContext } from '../cli/errors.js';\nimport { DapClient, DapResponseError, DapTransportClosedError } from '../protocol/dapClient.js';\nimport { DapEventCache } from '../protocol/eventCache.js';\nimport { DapLifecycleController, DapLifecycleHandshakeTimeoutError } from '../protocol/lifecycle.js';\nimport { getDapGeneratedCommand } from '../generated/dapCommandRegistry.js';\nimport type { DapTransport } from '../protocol/transport.js';\nimport { SessionManager } from '../sessions/sessionManager.js';\nimport type { CompoundSessionMetadata, OwnedAdapterMetadata, SessionStatus } from '../sessions/session.js';\nimport { ChildSessionCoordinator } from './childSessions.js';\nimport { createHelperProcessDetector } from '../sessions/helperProcessDetection.js';\nimport { derivePausedStateFromStopped } from './pausedState.js';\nimport { controllerRequestSchema, type ControllerFailureResponse, type ControllerRequest, type ControllerResponse } from './requests.js';\nimport { createControllerServerSocket, removeControllerDiscovery, writeControllerDiscovery, type ControllerDiscovery, type ControllerEndpoint } from './ipc.js';\nimport { computeBuildId } from './buildId.js';\nimport { threadNotPaused } from './diagnostics.js';\nimport { looksLikePythonStatement, wrapForExec } from './pythonExpressionDetector.js';\n\nexport interface StartControllerServerOptions {\n dapCliHome?: string | undefined;\n /**\n * Plan 05-23 (gap H-8): swappable signal helper used by\n * `terminateRuntime` so tests can mock SIGTERM/SIGKILL semantics. The\n * `target` may be negative — by Node/POSIX convention `process.kill(-pgid,\n * signal)` signals every process whose process group id is |target|. This\n * lets us cascade SIGKILL through Chromium subprocesses spawned by\n * js-debug under the adapter's own process group (Task 1.5).\n */\n signalProcess?: (target: number, signal: NodeJS.Signals) => void;\n /**\n * Plan 05-23 (gap H-8): liveness probe used by `terminateRuntime` to\n * decide whether to escalate SIGTERM → SIGKILL and whether to surface a\n * PID under `orphanPids`. Default: `process.kill(pid, 0)` returns true if\n * the OS still owns the pid.\n */\n isProcessAlive?: (pid: number) => boolean;\n /**\n * Phase 17 S-08 Bug 2 test seam. Override the per-pause wait for a\n * `stopped` event in {@link ControllerServer.maybeAttachPauseWarning}.\n * Defaults to 2_000ms in production. Tests inject a small value (e.g.\n * 50ms) so the warning path runs fast.\n */\n pauseStoppedWaitTimeoutMs?: number;\n}\n\nexport interface ControllerStatus {\n pid: number;\n endpoint: ControllerEndpoint;\n stateDir: string;\n logDir: string;\n uptimeMs: number;\n sessionCount: number;\n buildId: string;\n}\n\nexport interface ControllerHelloResult {\n buildId: string;\n pid: number;\n}\n\nexport class ControllerServer {\n private readonly sockets = new Set<net.Socket>();\n private readonly startedAtMs = Date.now();\n private readonly closedPromise: Promise<void>;\n private resolveClosed: () => void = () => undefined;\n private discovery: ControllerDiscovery | undefined;\n private sessionManager: SessionManager | undefined;\n private readonly runtimes = new Map<string, DapSessionRuntime>();\n private stopped = false;\n private buildId: string = '';\n private readonly signalProcess: (target: number, signal: NodeJS.Signals) => void;\n private readonly isProcessAlive: (pid: number) => boolean;\n // Phase 10 plan 03 (DIAG-01): test-only seam. Production callers leave\n // this undefined and the detector falls back to spawning `ps`. In-process\n // integration tests call `setHelperProcessLookupPpid` to inject a stub.\n // The stub receives BOTH the helper pid and the adapter pid so tests can\n // deterministically force a match (return adapterPid) or a miss (return\n // adapterPid + 1) without having to discover the spawned-adapter pid out\n // of band. The seam is on the server (not the JSON-RPC start params)\n // because functions cannot survive JSON serialization.\n private helperProcessLookupPpid: ((helperPid: number, adapterPid: number) => Promise<number | undefined>) | undefined;\n\n public constructor(private readonly options: StartControllerServerOptions = {}) {\n this.signalProcess = options.signalProcess ?? ((target, signal) => process.kill(target, signal));\n this.isProcessAlive = options.isProcessAlive ?? defaultIsProcessAlive;\n this.closedPromise = new Promise(resolve => {\n this.resolveClosed = resolve;\n });\n }\n\n /**\n * Phase 10 plan 03 (DIAG-01): test-only. Inject a stub `ps` ppid lookup\n * for the helper-process detector. The stub receives both the helper pid\n * (from the DAP `process` event) and the adapter pid; returning the\n * adapter pid forces a match.\n */\n public setHelperProcessLookupPpid(lookupPpid: ((helperPid: number, adapterPid: number) => Promise<number | undefined>) | undefined): void {\n this.helperProcessLookupPpid = lookupPpid;\n }\n\n public get closed(): Promise<void> {\n return this.closedPromise;\n }\n\n public async start(): Promise<ControllerDiscovery> {\n const socket = await createControllerServerSocket(clientSocket => this.handleConnection(clientSocket), this.options);\n this.server = socket.server;\n this.sessionManager = await SessionManager.create({ dapCliHome: this.options.dapCliHome });\n this.buildId = await computeBuildId();\n const now = new Date().toISOString();\n this.discovery = {\n version: 1,\n pid: process.pid,\n endpoint: socket.endpoint,\n stateDir: socket.stateDir,\n logDir: socket.logDir,\n startedAt: now,\n lastHeartbeatAt: now,\n };\n await writeControllerDiscovery(this.discovery, this.options);\n return this.discovery;\n }\n\n public async stop(): Promise<void> {\n if (this.stopped) {\n return this.closedPromise;\n }\n\n this.stopped = true;\n await removeControllerDiscovery(this.options);\n\n // Persist session-store cleanup BEFORE the slow runtime teardown so a\n // racing `dap-cli start` (the CLI returns from `controller.shutdown`\n // as soon as the response is written, not when stop() completes)\n // sees an empty store. Without this, the next controller inherits\n // ghost `running` records pointing at adapters this controller is\n // still in the middle of killing — `events`/`status` then return\n // `session_unavailable` and relaunching with the same name fails as\n // `session_name_in_use`.\n for (const sessionId of [...this.runtimes.keys()]) {\n await this.sessionManager?.closeSession(sessionId).catch(() => undefined);\n }\n\n for (const runtime of this.runtimes.values()) {\n // Plan 05-23 (gap H-8): controller shutdown converges on the same\n // teardown path as `sessions.close` and `cleanup --purge` so behavior\n // is consistent. Ignore orphan results here — they are not surfaced\n // through any controller response since shutdown has no caller.\n await this.terminateRuntime(runtime, { terminateDebuggee: true }).catch(() => undefined);\n }\n this.runtimes.clear();\n\n for (const socket of this.sockets) {\n socket.end();\n socket.destroy();\n }\n this.sockets.clear();\n\n if (this.server === undefined) {\n this.resolveClosed();\n return;\n }\n\n await new Promise<void>(resolve => {\n this.server?.close(() => resolve());\n });\n this.resolveClosed();\n }\n\n private server: net.Server | undefined;\n\n private handleConnection(socket: net.Socket): void {\n this.sockets.add(socket);\n let buffer = '';\n\n socket.on('data', chunk => {\n buffer += chunk.toString('utf8');\n while (buffer.includes('\\n')) {\n const newlineIndex = buffer.indexOf('\\n');\n const line = buffer.slice(0, newlineIndex).trim();\n buffer = buffer.slice(newlineIndex + 1);\n void this.handleLine(socket, line);\n }\n });\n\n socket.on('close', () => {\n this.sockets.delete(socket);\n });\n }\n\n private async handleLine(socket: net.Socket, line: string): Promise<void> {\n if (line.length === 0) {\n return;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n writeResponse(socket, malformedResponse('unknown', 'Malformed JSON request.'));\n return;\n }\n\n const request = controllerRequestSchema.safeParse(parsed);\n if (!request.success) {\n const id = extractRequestId(parsed);\n writeResponse(socket, malformedResponse(id, 'Malformed controller request.'));\n return;\n }\n\n const response = await this.handleRequest(request.data);\n\n if (request.data.method === 'controller.shutdown') {\n socket.end(`${JSON.stringify(response)}\\n`, () => {\n void this.stop();\n });\n return;\n }\n\n writeResponse(socket, response);\n }\n\n private async handleRequest(request: ControllerRequest): Promise<ControllerResponse<unknown> | ControllerFailureResponse> {\n if (request.method === 'controller.status') {\n return {\n id: request.id,\n ok: true,\n result: this.createStatus(),\n };\n }\n\n if (request.method === 'controller.hello') {\n const helloResult: ControllerHelloResult = {\n buildId: this.buildId,\n pid: process.pid,\n };\n return {\n id: request.id,\n ok: true,\n result: helloResult,\n };\n }\n\n if (request.method === 'controller.shutdown') {\n return {\n id: request.id,\n ok: true,\n result: { stopped: true },\n };\n }\n\n try {\n if (isImplementedDapRequestMethod(request.method)) {\n const dapResult = await this.handleDapRequest(request);\n return {\n id: request.id,\n ok: true,\n result: dapResult ?? null,\n };\n }\n\n const sessionResult = await this.handleSessionRequest(request);\n if (sessionResult !== undefined) {\n return {\n id: request.id,\n ok: true,\n result: sessionResult,\n };\n }\n } catch (error) {\n if (error instanceof CliError) {\n return {\n id: request.id,\n ok: false,\n error: toControllerErrorPayload(error),\n };\n }\n\n return {\n id: request.id,\n ok: false,\n error: {\n code: 'controller_request_failed',\n message: error instanceof Error ? error.message : 'Controller request failed.',\n },\n };\n }\n\n return {\n id: request.id,\n ok: false,\n error: {\n code: 'method_not_implemented',\n message: `${request.method} is not implemented by the controller yet.`,\n },\n };\n }\n\n private createStatus(): ControllerStatus {\n if (this.discovery === undefined) {\n throw new Error('Controller server has not started.');\n }\n\n return {\n pid: process.pid,\n endpoint: this.discovery.endpoint,\n stateDir: this.discovery.stateDir,\n logDir: this.discovery.logDir,\n uptimeMs: Date.now() - this.startedAtMs,\n sessionCount: this.sessionManager?.list().length ?? 0,\n buildId: this.buildId,\n };\n }\n\n private async handleSessionRequest(request: ControllerRequest): Promise<unknown> {\n const manager = this.sessionManager;\n if (manager === undefined) {\n throw new Error('Session manager has not started.');\n }\n\n if (request.method === 'sessions.list') {\n const includeChildren = isRecord(request.params) && request.params.includeChildren === true;\n return manager.list({ includeChildren });\n }\n if (request.method === 'sessions.status') {\n const target = getOptionalStringParam(request.params, 'name');\n const status = manager.status(target);\n this.assertNotChildSession(status, target);\n return status;\n }\n if (request.method === 'sessions.target' || request.method === 'sessions.use') {\n const target = getRequiredStringParam(request.params, 'name');\n // Resolve first so we can reject children before mutating active focus.\n const status = manager.status(target);\n this.assertNotChildSession(status, target);\n return manager.targetSession(target);\n }\n if (request.method === 'sessions.stop') {\n const target = getOptionalStringParam(request.params, 'name');\n await this.disconnectRuntimeForTarget(target);\n return manager.stopSession(target);\n }\n if (request.method === 'sessions.detach') {\n const target = getOptionalStringParam(request.params, 'name');\n await this.disconnectRuntimeForTarget(target);\n return manager.detachSession(target);\n }\n if (request.method === 'sessions.close') {\n const target = getOptionalStringParam(request.params, 'name');\n try {\n const status = manager.status(target);\n const closeTargets = status.compound?.stopAll === true\n ? manager.list().filter(session => session.compound?.id === status.compound?.id).map(session => session.id)\n : [status.id];\n const teardownResults = await Promise.all(closeTargets.map(async sessionId => {\n const runtime = this.runtimes.get(sessionId);\n if (runtime !== undefined) {\n const teardown = await this.terminateRuntime(runtime, { terminateDebuggee: true });\n this.runtimes.delete(sessionId);\n return teardown;\n }\n return { orphanPids: [], warnings: [] };\n }));\n for (const sessionId of closeTargets) {\n await manager.closeSession(sessionId);\n }\n const orphanPids = teardownResults.flatMap(result => result.orphanPids);\n const warnings = teardownResults.flatMap(result => result.warnings);\n return { ...status, orphanPids, warnings };\n } catch {\n // Resolution failures (e.g. session_not_found) fall through to\n // closeSession which produces the canonical error.\n }\n const sessionStatus = await manager.closeSession(target);\n return { ...sessionStatus, orphanPids: [], warnings: [] };\n }\n if (request.method === 'sessions.cleanup') {\n const purge = isRecord(request.params) && request.params.purge === true;\n // Plan 05-23 (gap H-8): on `--purge`, run terminateRuntime against\n // every active runtime BEFORE the manager removes records. This\n // converges teardown semantics with `sessions.close` so users don't\n // get silent orphans regardless of which command they use.\n const orphanPids: number[] = [];\n const warnings: string[] = [];\n if (purge) {\n for (const [sessionId, runtime] of [...this.runtimes.entries()]) {\n const teardown = await this.terminateRuntime(runtime, { terminateDebuggee: true }).catch(() => ({ orphanPids: [] as number[], warnings: [] as string[] }));\n orphanPids.push(...teardown.orphanPids);\n warnings.push(...teardown.warnings);\n this.runtimes.delete(sessionId);\n }\n }\n const cleanupResult = await manager.cleanupSessions({ purge });\n return { ...cleanupResult, orphanPids, warnings };\n }\n\n return undefined;\n }\n\n private async handleDapRequest(request: ControllerRequest): Promise<unknown> {\n if (request.method === 'dap.start') {\n return this.startDapSession(request.params);\n }\n if (request.method === 'dap.startCompound') {\n return this.startDapCompound(request.params);\n }\n if (request.method === 'dap.request') {\n return this.routeDapRequest(request.params);\n }\n if (request.method === 'dap.capabilities') {\n return this.reportDapCapabilities(request.params);\n }\n if (request.method === 'sessions.breakpoints.list') {\n return this.handleListBreakpoints(request.params);\n }\n if (request.method === 'sessions.breakpoints.clear') {\n return this.handleClearBreakpoints(request.params);\n }\n if (request.method === 'events.recent' || request.method === 'events.list') {\n return this.recentEvents(request.params);\n }\n\n return undefined;\n }\n\n private async startDapSession(params: unknown): Promise<DapStartResult> {\n return this.startDapSessionFromParams(parseDapStartParams(params));\n }\n\n private async startDapCompound(params: unknown): Promise<DapStartCompoundResult> {\n const manager = this.requireSessionManager();\n const startParams = parseDapStartCompoundParams(params);\n const compoundId = createCompoundId();\n const memberNames = startParams.members.map(member => member.memberName);\n const startedMembers: Array<{ memberName: string; result: DapStartResult }> = [];\n\n try {\n for (const member of startParams.members) {\n const compound: CompoundSessionMetadata = {\n id: compoundId,\n name: startParams.name,\n memberName: member.memberName,\n stopAll: startParams.stopAll,\n members: memberNames,\n };\n const result = await this.startDapSessionFromParams({\n mode: member.mode,\n name: `${startParams.name}/${member.memberName}`,\n use: startParams.use,\n descriptor: member.descriptor,\n config: member.config,\n compound,\n });\n startedMembers.push({ memberName: member.memberName, result });\n }\n } catch (error) {\n for (const started of [...startedMembers].reverse()) {\n const runtime = this.runtimes.get(started.result.sessionId);\n if (runtime !== undefined) {\n await this.terminateRuntime(runtime, { terminateDebuggee: true }).catch(() => undefined);\n this.runtimes.delete(started.result.sessionId);\n }\n await manager.closeSession(started.result.sessionId).catch(() => undefined);\n }\n const failedMemberName = findFailedCompoundMemberName(error, startParams.members, startedMembers.map(member => member.memberName));\n if (failedMemberName !== undefined) {\n await manager.closeSession(`${startParams.name}/${failedMemberName}`).catch(() => undefined);\n }\n throw dapError(`Compound member '${failedMemberName ?? 'unknown'}' failed to start.`, {\n code: 'compound_member_start_failed',\n diagnostics: createCompoundFailureDiagnostics(startParams.name, failedMemberName, error),\n data: {\n compoundName: startParams.name,\n memberName: failedMemberName,\n startedMembers: startedMembers.map(member => member.memberName),\n },\n });\n }\n\n return {\n compoundId,\n name: startParams.name,\n stopAll: startParams.stopAll,\n members: startedMembers.map(member => member.result),\n };\n }\n\n private async startDapSessionFromParams(startParams: DapStartSessionParams): Promise<DapStartResult> {\n const manager = this.requireSessionManager();\n const discovery = this.requireDiscovery();\n const descriptor = parseAdapterDescriptor(startParams.descriptor);\n const adapter = await this.startAdapter(descriptor, discovery.logDir);\n const { config, initialBreakpoints } = extractDapCliStartConfig(startParams.config);\n // Plan 05-21 (gap H-5): for js-debug, inject `trace.logFile` into the\n // launch/attach config so its DAP/CDP wire trace lands in a discoverable\n // sibling file under the controller's log directory. The descriptor lives\n // upstream of launch args, so the merge happens here at the point where\n // both descriptor identity and the resolved logDir are known.\n const preparedConfig = descriptor.id === 'js-debug'\n ? applyJsDebugTraceDefaults(config, discovery.logDir)\n : config;\n const createOptions = {\n name: startParams.name,\n adapter: descriptor.id,\n lifecycle: 'adapterStarting',\n makeActive: startParams.use,\n ownedAdapter: getOwnedAdapter(adapter),\n } as const;\n const session = await manager.create(startParams.compound === undefined ? createOptions : { ...createOptions, compound: startParams.compound });\n const client = new DapClient(adapter.transport, { requestTimeoutMs: controllerDapRequestTimeoutMs });\n const lifecycle = new DapLifecycleController(client, { handshakeTimeoutMs: controllerDapRequestTimeoutMs });\n // Plan 05-18 (gap H-2): two-ring cache so js-debug `loadedSource` spam\n // (93/100 in a single hello-world, see 05-UAT.md) cannot evict critical\n // events like `stopped`. 200 high-priority + 50 low-priority = 250 total.\n const eventCache = new DapEventCache({ highPriorityCapacity: 200, lowPriorityCapacity: 50 });\n\n client.onEvent(event => {\n eventCache.append(session.id, event);\n if (event.event === 'stopped') {\n void manager.updateLifecycle(session.id, 'stopped').catch(() => undefined);\n void manager.updatePausedState(session.id, derivePausedStateFromStopped(event.body)).catch(() => undefined);\n } else if (event.event === 'continued') {\n void manager.updateLifecycle(session.id, 'running').catch(() => undefined);\n void manager.updatePausedState(session.id, { paused: false }).catch(() => undefined);\n } else if (event.event === 'terminated') {\n void manager.updateLifecycle(session.id, 'terminated').catch(() => undefined);\n void manager.updatePausedState(session.id, { paused: false }).catch(() => undefined);\n }\n });\n\n // Phase 10 plan 03 (DIAG-01): helper-process detector. Only js-debug\n // attach sessions can produce the helper-process false-positive cascade\n // documented in analysis.md, so the detector is gated to that case.\n if (descriptor.id === 'js-debug' && startParams.mode === 'attach') {\n const adapterPid = getOwnedAdapter(adapter).pid;\n const detectorOptions: Parameters<typeof createHelperProcessDetector>[0] = {\n sessionId: session.id,\n adapterId: descriptor.id,\n adapterPid,\n mode: startParams.mode,\n eventCache,\n };\n if (this.helperProcessLookupPpid !== undefined) {\n const stub = this.helperProcessLookupPpid;\n const pinnedAdapterPid = adapterPid;\n if (pinnedAdapterPid !== undefined) {\n detectorOptions.lookupPpid = (helperPid: number) => stub(helperPid, pinnedAdapterPid);\n }\n }\n const detector = createHelperProcessDetector(detectorOptions);\n client.onEvent(event => detector.handleEvent(event));\n }\n\n let children: ChildSessionCoordinator | undefined;\n const adapterOpenChildTransport = 'openChildTransport' in adapter && typeof adapter.openChildTransport === 'function'\n ? adapter.openChildTransport.bind(adapter)\n : undefined;\n if (adapterOpenChildTransport !== undefined) {\n children = new ChildSessionCoordinator({\n parentSessionId: session.id,\n parentName: session.name,\n parentClient: client,\n adapterId: descriptor.id,\n ownedAdapter: getOwnedAdapter(adapter) as OwnedAdapterMetadata,\n sessionManager: manager,\n parentEventCache: eventCache,\n openChildTransport: adapterOpenChildTransport,\n });\n children.attach();\n }\n\n const runtime: DapSessionRuntime = children === undefined\n ? { sessionId: session.id, name: session.name, adapterId: descriptor.id, client, lifecycle, eventCache, adapter, capabilities: {} }\n : { sessionId: session.id, name: session.name, adapterId: descriptor.id, client, lifecycle, eventCache, adapter, capabilities: {}, children };\n this.runtimes.set(session.id, runtime);\n let startResult: Awaited<ReturnType<DapLifecycleController['start']>>;\n try {\n const beforeConfigurationDone = createBeforeConfigurationDoneHook(client, initialBreakpoints, children);\n if (startParams.mode === 'launch') {\n startResult = await lifecycle.start(beforeConfigurationDone === undefined\n ? { mode: 'launch', initializeArgs: createInitializeArgs(descriptor.id), launchArgs: preparedConfig }\n : { mode: 'launch', initializeArgs: createInitializeArgs(descriptor.id), launchArgs: preparedConfig, beforeConfigurationDone });\n } else {\n startResult = await lifecycle.start(beforeConfigurationDone === undefined\n ? { mode: 'attach', initializeArgs: createInitializeArgs(descriptor.id), attachArgs: preparedConfig }\n : { mode: 'attach', initializeArgs: createInitializeArgs(descriptor.id), attachArgs: preparedConfig, beforeConfigurationDone });\n }\n } catch (error) {\n await manager.updateLifecycle(session.id, 'failed').catch(() => undefined);\n if (children !== undefined) {\n await children.dispose().catch(() => undefined);\n }\n await client.close().catch(() => undefined);\n await adapter.close().catch(() => undefined);\n this.runtimes.delete(session.id);\n throw toDapCliError(error, createDapErrorContext({\n sessionId: session.id,\n adapter: getAdapterContext(descriptor.id, adapter),\n request: client.lastRequest,\n }));\n }\n runtime.capabilities = startResult.capabilities;\n await manager.updateLifecycle(session.id, lifecycle.state.lifecycle === 'stopped' ? 'stopped' : 'running');\n const snapshot = eventCache.recent();\n\n return {\n sessionId: session.id,\n name: session.name,\n lifecycle: lifecycle.state.lifecycle,\n capabilities: startResult.capabilities,\n eventCursor: snapshot.cursor,\n };\n }\n\n private async routeDapRequest(params: unknown): Promise<unknown> {\n const requestParams = parseDapRequestParams(params);\n const runtime = this.resolveRuntime(requestParams.name);\n this.assertSupportedDapRequest(runtime, requestParams.command);\n this.assertThreadPausedIfRequired(runtime, requestParams.command);\n const evaluateRewrite = maybePythonEvaluateRewrite(runtime.adapterId, requestParams);\n const forwardArgs = evaluateRewrite?.forwardArgs ?? requestParams.args;\n const wrapDapError = (error: unknown): never => {\n // Phase 16-01 (PYEVAL-01): a debugpy `evaluate` that comes back with a\n // SyntaxError shape is upgraded to a structured `evaluate_requires_exec`\n // envelope carrying the exact `exec(...)` recipe so callers can retry\n // verbatim instead of guessing the wrap.\n if (\n evaluateRewrite !== undefined\n && error instanceof DapResponseError\n && /syntaxerror|invalid syntax/i.test(error.message)\n ) {\n const execForm = wrapForExec(evaluateRewrite.originalExpression);\n throw dapError('`evaluate` requires `exec(...)` for Python statements (debugpy is expression-only).', {\n code: 'evaluate_requires_exec',\n diagnostics: [\n `Re-send with \\`args.expression\\` wrapped as: ${execForm}`,\n 'Or set `args.context = \\'no-auto-wrap\\'` to bypass auto-wrap if you intentionally want the raw expression.',\n ],\n data: { exec_form: execForm, original_expression: evaluateRewrite.originalExpression },\n sessionId: runtime.sessionId,\n request: { command: 'evaluate' },\n adapter: getAdapterContext(runtime.adapterId, runtime.adapter),\n });\n }\n let staleStatus: string | undefined;\n try {\n staleStatus = this.requireSessionManager().status(requestParams.name).status;\n } catch {\n staleStatus = undefined;\n }\n throw toDapCliError(error, {\n sessionId: runtime.sessionId,\n adapter: getAdapterContext(runtime.adapterId, runtime.adapter),\n request: runtime.client.lastRequest ?? { command: requestParams.command },\n staleSession: { sessionRef: runtime.sessionId, ...(staleStatus !== undefined ? { status: staleStatus } : {}) },\n });\n };\n let responseBody: unknown;\n let intercepted = false;\n if (runtime.children !== undefined) {\n let childResult;\n try {\n childResult = await runtime.children.maybeIntercept(requestParams.command, forwardArgs);\n } catch (error) {\n wrapDapError(error);\n }\n if (childResult !== undefined) {\n responseBody = childResult.value;\n intercepted = true;\n }\n }\n if (!intercepted) {\n try {\n responseBody = await runtime.client.request(requestParams.command, forwardArgs);\n } catch (error) {\n wrapDapError(error);\n }\n }\n this.maybeTrackBreakpoints(runtime, requestParams, responseBody);\n responseBody = await this.maybeAttachPauseWarning(runtime, requestParams.command, responseBody);\n return responseBody;\n }\n\n /**\n * Phase 17 S-08 Bug 2: a `pause` request can be acknowledged by the\n * adapter (`success: true`) without the targeted thread actually halting\n * — observed against a js-debug attach where `Debugger.pause` was sent\n * to the bootloader root with no CDP `sessionId`, so it landed on a\n * target with no user-pauseable code and never produced a `stopped`\n * event. The CLI then sat at \"pause returned ok\" while every follow-up\n * (`stack`, `vars`) failed with `thread_not_paused`.\n *\n * This post-success hook waits up to 2_000ms for `manager.status(...).\n * paused === true` (which captures both parent and child stopped events\n * via {@link ChildSessionCoordinator.recomputeParentPausedState}). If\n * the deadline elapses, we surface a `pause_no_stopped_event` warning\n * on the response so the caller sees a diagnostic instead of an opaque\n * silent success. The DAP `pause` response body is normally `{}`, so\n * adding a `warnings` field is purely additive.\n *\n * Kept under the 5s controller IPC budget; in the happy case the wait\n * resolves in ~50–500ms (one poll tick after the stopped event lands).\n */\n private async maybeAttachPauseWarning(runtime: DapSessionRuntime, command: string, responseBody: unknown): Promise<unknown> {\n if (command !== 'pause') {\n return responseBody;\n }\n const manager = this.requireSessionManager();\n const sessionId = runtime.sessionId;\n const timeoutMs = this.options.pauseStoppedWaitTimeoutMs ?? 2_000;\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n let paused: boolean | undefined;\n try {\n paused = manager.status(sessionId).paused;\n } catch {\n return responseBody;\n }\n if (paused === true) {\n return responseBody;\n }\n await new Promise<void>(resolve => { setTimeout(resolve, 75).unref?.(); });\n }\n const warning = {\n message: 'pause_no_stopped_event',\n diagnostics: [\n 'pause was acknowledged but no `stopped` event arrived within 2s.',\n 'The targeted thread may belong to a parent (e.g. js-debug bootloader root) that has no user-pauseable code, or to a worker without an active CDP session.',\n 'Run `dap-cli sessions --json` to find the user-code child session and target it explicitly with `--name <child>`.',\n ],\n };\n if (isRecord(responseBody)) {\n return { ...responseBody, warnings: [warning] };\n }\n return { warnings: [warning] };\n }\n\n /**\n * Phase 12 plan 01 (BPCMD-01/02): post-success hook on routeDapRequest.\n * Best-effort — any tracking failure is swallowed so the user's primary\n * request is never poisoned by bookkeeping. Empty `args.breakpoints`\n * deletes the tracked entry (DAP setBreakpoints \"clear\" semantics).\n */\n private maybeTrackBreakpoints(runtime: DapSessionRuntime, requestParams: { command: string; args?: unknown }, responseBody: unknown): void {\n if (requestParams.command !== 'setBreakpoints') {\n return;\n }\n try {\n if (!isRecord(requestParams.args)) {\n return;\n }\n const sourceArg = requestParams.args.source;\n if (!isRecord(sourceArg) || typeof sourceArg.path !== 'string') {\n return;\n }\n const sourcePath = sourceArg.path;\n const requested = Array.isArray(requestParams.args.breakpoints) ? requestParams.args.breakpoints as readonly unknown[] : [];\n if (requested.length === 0) {\n runtime.breakpoints?.delete(sourcePath);\n return;\n }\n const responseBreakpoints = isRecord(responseBody) && Array.isArray(responseBody.breakpoints)\n ? responseBody.breakpoints as readonly unknown[]\n : [];\n const map = runtime.breakpoints ?? new Map<string, TrackedBreakpointSource>();\n map.set(sourcePath, { source: sourceArg as { path: string; [key: string]: unknown }, requested, response: responseBreakpoints });\n runtime.breakpoints = map;\n } catch {\n // best-effort tracking\n }\n }\n\n private handleListBreakpoints(params: unknown): { sources: Array<{ source: unknown; breakpoints: readonly unknown[]; requested: readonly unknown[] }> } {\n const target = getOptionalStringParam(params, 'name');\n const source = getOptionalStringParam(params, 'source');\n const runtime = this.resolveRuntime(target);\n const map = runtime.breakpoints;\n if (map === undefined) {\n return { sources: [] };\n }\n if (source !== undefined) {\n const entry = map.get(path.resolve(source));\n return entry === undefined\n ? { sources: [] }\n : { sources: [{ source: entry.source, breakpoints: entry.response, requested: entry.requested }] };\n }\n return {\n sources: Array.from(map.values(), entry => ({ source: entry.source, breakpoints: entry.response, requested: entry.requested })),\n };\n }\n\n private async handleClearBreakpoints(params: unknown): Promise<{ cleared: Array<{ source: unknown; requested: number }> }> {\n const target = getOptionalStringParam(params, 'name');\n const source = getOptionalStringParam(params, 'source');\n const runtime = this.resolveRuntime(target);\n this.assertSupportedDapRequest(runtime, 'setBreakpoints');\n const map = runtime.breakpoints;\n if (map === undefined || map.size === 0) {\n return { cleared: [] };\n }\n const wrapDapError = (error: unknown): never => {\n throw toDapCliError(error, {\n sessionId: runtime.sessionId,\n adapter: getAdapterContext(runtime.adapterId, runtime.adapter),\n request: runtime.client.lastRequest ?? { command: 'setBreakpoints' },\n });\n };\n const cleared: Array<{ source: unknown; requested: number }> = [];\n if (source !== undefined) {\n const key = path.resolve(source);\n const entry = map.get(key);\n if (entry === undefined) {\n return { cleared: [] };\n }\n try {\n await runtime.client.request('setBreakpoints', { source: entry.source, breakpoints: [], lines: [] });\n } catch (error) {\n wrapDapError(error);\n }\n map.delete(key);\n cleared.push({ source: entry.source, requested: 0 });\n return { cleared };\n }\n const keys = Array.from(map.keys());\n for (const key of keys) {\n const entry = map.get(key);\n if (entry === undefined) {\n continue;\n }\n try {\n await runtime.client.request('setBreakpoints', { source: entry.source, breakpoints: [], lines: [] });\n } catch (error) {\n wrapDapError(error);\n }\n map.delete(key);\n cleared.push({ source: entry.source, requested: 0 });\n }\n return { cleared };\n }\n\n private reportDapCapabilities(params: unknown): DapCapabilitiesResult {\n const runtime = this.resolveRuntime(getOptionalStringParam(params, 'name'));\n return {\n sessionId: runtime.sessionId,\n name: runtime.name,\n adapterId: runtime.adapterId,\n capabilities: runtime.capabilities,\n };\n }\n\n private assertSupportedDapRequest(runtime: DapSessionRuntime, command: string): void {\n const metadata = getDapGeneratedCommand(command);\n if (metadata?.capability === undefined || hasTruthyCapability(runtime.capabilities, metadata.capability)) {\n return;\n }\n\n throw dapError(`DAP request '${command}' requires unsupported adapter capability '${metadata.capability}'.`, {\n code: 'dap_request_unsupported',\n diagnostics: [`Adapter '${runtime.adapterId}' did not report capability '${metadata.capability}' required by request '${command}'.`],\n sessionId: runtime.sessionId,\n request: { command },\n adapter: getAdapterContext(runtime.adapterId, runtime.adapter),\n });\n }\n\n /**\n * Plan 05-20 (gap H-7): paused-state-required DAP requests (stackTrace,\n * scopes, variables) must NOT be forwarded to the adapter when we know\n * the thread isn't paused. Without this gate, the adapter typically\n * returns a generic failure that surfaces as `controller_unavailable:\n * Run dap-cli start` — the wrong recovery hint.\n *\n * The gate consults the H-1 paused projection (`session.paused`):\n * - `paused === false`: known not paused → throw `thread_not_paused`.\n * - `paused === true`: known paused → forward to adapter.\n * - `paused === undefined`: unknown (no stopped/continued event observed\n * yet) → forward to adapter (do not regress legitimate paused\n * requests on a stale projection — see threat T-05-20-02).\n */\n private assertThreadPausedIfRequired(runtime: DapSessionRuntime, command: string): void {\n if (!PAUSED_REQUIRED_DAP_COMMANDS.has(command)) {\n return;\n }\n let paused: boolean | undefined;\n try {\n paused = this.requireSessionManager().status(runtime.sessionId).paused;\n } catch {\n // If status lookup fails for any reason, fall through to the adapter\n // — do not synthesize a paused-state error from a missing projection.\n return;\n }\n if (paused === false) {\n throw threadNotPaused({ sessionId: runtime.sessionId, sessionName: runtime.name, command });\n }\n }\n\n private recentEvents(params: unknown): EventsRecentResult {\n const eventParams = parseEventsRecentParams(params);\n const runtime = this.resolveRuntime(eventParams.name);\n const snapshot = runtime.eventCache.recent(eventParams.options);\n const result: EventsRecentResult = {\n sessionId: runtime.sessionId,\n name: runtime.name,\n events: snapshot.events,\n cursor: snapshot.cursor,\n dropped: snapshot.droppedBeforeCursor ?? 0,\n // Plan 05-18 (gap H-2): expose capacity to the CLI so it can produce\n // honest `limit_exceeded_capacity` warnings client-side.\n capacity: snapshot.capacity,\n capacityByPriority: snapshot.capacityByPriority,\n };\n if (snapshot.truncatedToCapacity !== undefined) {\n result.truncatedToCapacity = snapshot.truncatedToCapacity;\n }\n return result;\n }\n\n private async startAdapter(descriptor: AdapterDescriptor, logDir: string): Promise<AdapterRuntime> {\n if (descriptor.transport.kind === 'stdio') {\n return startProcessAdapter({ descriptor: descriptor.transport, adapterId: descriptor.id, logDir });\n }\n if (descriptor.transport.kind === 'server') {\n return startServerSocketAdapter(descriptor.id, descriptor.transport, logDir);\n }\n\n return connectSocketAdapter(descriptor.id, descriptor.transport);\n }\n\n private resolveRuntime(target: string | undefined): DapSessionRuntime {\n const status = this.requireSessionManager().status(target);\n this.assertNotChildSession(status, target);\n const runtime = this.runtimes.get(status.id);\n if (runtime === undefined) {\n throw sessionError(`No DAP runtime is attached to session ${status.id}.`, {\n code: 'session_unavailable',\n sessionId: status.id,\n diagnostics: createMissingRuntimeDiagnostics(status),\n });\n }\n\n return runtime;\n }\n\n /**\n * Plan 05-19 (gap H-3): reject any public-CLI targeting of a child session\n * BEFORE attempting runtime lookup. The parent owns the bp registry,\n * threads, and event stream in js-debug pwa-chrome (verified by direct DAP\n * trace; see /memories/repo/dap-cli.md). Returning the misleading\n * `session_unavailable: No DAP runtime is attached` was the original H-3\n * symptom — this gate replaces it with an actionable error code and a\n * machine-readable `data` payload pointing at the parent.\n */\n private assertNotChildSession(status: SessionStatus, providedTarget: string | undefined): void {\n if (status.parent_session_id === undefined) {\n return;\n }\n const parent = this.requireSessionManager()\n .list({ includeChildren: true })\n .find(record => record.id === status.parent_session_id);\n const parentName = parent?.name;\n const parentRef = parentName ?? status.parent_session_id;\n const targetLabel = providedTarget ?? status.id;\n throw sessionError(`Child session ${targetLabel} cannot be targeted directly.`, {\n code: 'child_session_not_targetable',\n sessionId: status.id,\n diagnostics: [\n `Child sessions are owned by their parent. Re-run the command with \\`--name ${parentRef}\\` — the parent owns threads, breakpoints, and the event stream for js-debug pwa-chrome (see dev/smoke/hand-driven-smoke.md).`,\n ],\n data: {\n childSessionId: status.id,\n parentSessionId: status.parent_session_id,\n ...(parentName !== undefined ? { parentName } : {}),\n },\n });\n }\n\n private async disconnectRuntimeForTarget(target: string | undefined): Promise<void> {\n let status: SessionStatus;\n try {\n status = this.requireSessionManager().status(target);\n } catch {\n return;\n }\n\n const runtime = this.runtimes.get(status.id);\n if (runtime === undefined) {\n return;\n }\n\n if (runtime.children !== undefined) {\n await runtime.children.dispose().catch(() => undefined);\n }\n await runtime.lifecycle.disconnect().catch(() => undefined);\n await runtime.client.close().catch(() => undefined);\n await runtime.adapter.close().catch(() => undefined);\n this.runtimes.delete(status.id);\n }\n\n private requireSessionManager(): SessionManager {\n const manager = this.sessionManager;\n if (manager === undefined) {\n throw new Error('Session manager has not started.');\n }\n\n return manager;\n }\n\n private requireDiscovery(): ControllerDiscovery {\n if (this.discovery === undefined) {\n throw new Error('Controller server has not started.');\n }\n\n return this.discovery;\n }\n\n /**\n * Plan 05-23 (gap H-8): single teardown path shared by `sessions.close`,\n * `sessions.cleanup --purge`, and `ControllerServer.stop`. Steps:\n *\n * 1. Dispose any child-session coordinator.\n * 2. Send DAP `disconnect` (with `terminateDebuggee` per opts), but do not\n * let a missing adapter response consume the full DAP request timeout.\n * 3. Wait up to 5s for the owned-adapter pid to exit naturally.\n * 4. If still alive, signal the adapter's process group (POSIX) or pid\n * (Windows) with SIGTERM, wait 200ms, escalate to SIGKILL, wait 200ms.\n * 5. Close the DAP client + adapter wrappers.\n * 6. Probe liveness one final time. PIDs that survive are returned in\n * `orphanPids` with a parallel `warnings` entry so callers can surface\n * them honestly to the user.\n *\n * The signal helper and liveness probe are injected via constructor options\n * so tests can simulate \"signal failed; pid stays alive\" without spawning\n * unkillable processes.\n */\n private async terminateRuntime(runtime: DapSessionRuntime, opts: { terminateDebuggee: boolean }): Promise<{ orphanPids: number[]; warnings: string[] }> {\n if (runtime.children !== undefined) {\n await runtime.children.dispose().catch(() => undefined);\n }\n\n // Plan 05-23 race note: the user's hand-driven trace caught a\n // `TypeError: Cannot read properties of undefined (reading 'terminateDebuggee')`\n // inside js-debug's bundled `dapDebugServer.js` when disconnect raced\n // with the adapter's session wiring. We always forward the disconnect\n // (the adapter logs the error and exits, which is exactly what we want\n // on close) and follow up with explicit signaling so a crashed disconnect\n // never leaves the debuggee alive.\n const disconnect = runtime.lifecycle.disconnect({ terminateDebuggee: opts.terminateDebuggee });\n disconnect.catch(() => undefined);\n await this.waitForDisconnect(disconnect, controllerDisconnectTimeoutMs);\n\n const adapterPid = getAdapterPid(runtime.adapter);\n const groupTarget = getGroupSignalTarget(runtime.adapter, adapterPid);\n\n if (adapterPid !== undefined) {\n // Plan 05-23 deviation note: plan called for \"up to 5s\" wait for\n // natural exit, but the CLI controller client has a 5s default\n // timeout (src/controller/client.ts:25). We use 1s here so a stuck\n // teardown still surfaces orphanPids before the IPC client gives up.\n // Real adapters exit in milliseconds after disconnect; 1s is a safe\n // ceiling.\n await this.waitForPidExit(adapterPid, 1_000);\n\n if (groupTarget !== undefined && this.isProcessAlive(adapterPid)) {\n try {\n this.signalProcess(groupTarget, 'SIGTERM');\n } catch {\n // Best-effort: ignore ESRCH and similar; we re-check liveness next.\n }\n await this.waitForPidExit(adapterPid, 200);\n }\n if (groupTarget !== undefined && this.isProcessAlive(adapterPid)) {\n try {\n this.signalProcess(groupTarget, 'SIGKILL');\n } catch {\n // Best-effort: ignore.\n }\n await this.waitForPidExit(adapterPid, 200);\n }\n }\n\n await runtime.client.close().catch(() => undefined);\n await runtime.adapter.close().catch(() => undefined);\n\n if (adapterPid !== undefined && this.isProcessAlive(adapterPid)) {\n return {\n orphanPids: [adapterPid],\n warnings: [`orphan_processes_remain: ${adapterPid}`],\n };\n }\n return { orphanPids: [], warnings: [] };\n }\n\n private async waitForPidExit(pid: number, timeoutMs: number): Promise<void> {\n const intervalMs = 50;\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (!this.isProcessAlive(pid)) {\n return;\n }\n await new Promise<void>(resolve => setTimeout(resolve, intervalMs));\n }\n }\n\n private async waitForDisconnect(disconnect: Promise<void>, timeoutMs: number): Promise<void> {\n let timer: NodeJS.Timeout | undefined;\n try {\n await Promise.race([\n disconnect.catch(() => undefined),\n new Promise<void>(resolve => {\n timer = setTimeout(resolve, timeoutMs);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n }\n}\n\nfunction defaultIsProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n // ESRCH: no such process. Any other error (EPERM) means the pid exists\n // but we can't signal it \\u2014 still report alive so the caller surfaces it\n // as orphan rather than silently dropping it.\n if (error instanceof Error && 'code' in error && (error as NodeJS.ErrnoException).code === 'ESRCH') {\n return false;\n }\n return true;\n }\n}\n\nfunction getAdapterPid(adapter: AdapterRuntime): number | undefined {\n if ('ownedAdapter' in adapter && typeof adapter.ownedAdapter.pid === 'number') {\n return adapter.ownedAdapter.pid;\n }\n return undefined;\n}\n\nfunction getGroupSignalTarget(adapter: AdapterRuntime, adapterPid: number | undefined): number | undefined {\n if (adapterPid === undefined) {\n return undefined;\n }\n if ('processGroupId' in adapter && typeof adapter.processGroupId === 'number') {\n // Negative target signals the process group whose pgid is |target|\n // (Node/POSIX `process.kill(-pgid, signal)` convention). Cascades to\n // adapter children (e.g. Chromium spawned by js-debug pwa-chrome).\n return -adapter.processGroupId;\n }\n return adapterPid;\n}\n\n/**\n * Plan 05-20 (gap H-7): DAP requests that semantically require a paused\n * thread. When the controller can prove the thread is running (via the H-1\n * paused projection), these get a structured `thread_not_paused` error\n * instead of a generic adapter failure.\n */\nconst PAUSED_REQUIRED_DAP_COMMANDS: ReadonlySet<string> = new Set([\n 'stackTrace',\n 'scopes',\n 'variables',\n]);\n\nconst controllerDapRequestTimeoutMs = 30_000;\nconst controllerDisconnectTimeoutMs = 1_000;\n\nfunction createInitializeArgs(adapterId: string): Record<string, unknown> { return {\n adapterID: adapterId,\n clientID: 'dap-cli',\n clientName: 'dap-cli',\n columnsStartAt1: true,\n linesStartAt1: true,\n pathFormat: 'path',\n };\n}\n\ntype AdapterRuntime = (StartedProcessAdapter | ConnectedSocketAdapter | StartedServerSocketAdapter) & { transport: DapTransport };\n\ninterface TrackedBreakpointSource {\n source: { path: string; [key: string]: unknown };\n requested: readonly unknown[];\n response: readonly unknown[];\n}\n\ninterface DapSessionRuntime {\n sessionId: string;\n name: string;\n adapterId: string;\n client: DapClient;\n lifecycle: DapLifecycleController;\n eventCache: DapEventCache;\n adapter: AdapterRuntime;\n capabilities: unknown;\n children?: ChildSessionCoordinator;\n // Phase 12 plan 01 (BPCMD-01/02): in-memory tracking of every successful\n // setBreakpoints the controller has observed for this session, keyed by\n // resolved source.path. Lazy-initialized on first successful set.\n // Initial breakpoints sent during dap.start handshake are NOT tracked\n // here — only requests routed through routeDapRequest are observed.\n breakpoints?: Map<string, TrackedBreakpointSource>;\n}\n\ninterface DapStartResult {\n sessionId: string;\n name: string;\n lifecycle: string;\n capabilities: unknown;\n eventCursor: number;\n}\n\ninterface DapStartCompoundResult {\n compoundId: string;\n name: string;\n stopAll: boolean;\n members: readonly DapStartResult[];\n}\n\ninterface DapStartSessionParams {\n mode: 'launch' | 'attach';\n name: string;\n use: boolean;\n descriptor: unknown;\n config?: unknown;\n compound?: CompoundSessionMetadata;\n}\n\ninterface DapStartCompoundMemberParams {\n memberName: string;\n mode: 'launch' | 'attach';\n descriptor: unknown;\n config?: unknown;\n}\n\ninterface DapStartCompoundParams {\n name: string;\n stopAll: boolean;\n use: boolean;\n members: readonly DapStartCompoundMemberParams[];\n}\n\ninterface EventsRecentResult {\n sessionId: string;\n name: string;\n events: unknown;\n cursor: number;\n dropped: number;\n capacity: number;\n capacityByPriority: { high: number; low: number };\n truncatedToCapacity?: number;\n}\n\ninterface DapCapabilitiesResult {\n sessionId: string;\n name: string;\n adapterId: string;\n capabilities: unknown;\n}\n\nfunction parseDapStartParams(params: unknown): DapStartSessionParams {\n if (!isRecord(params)) {\n throw usageError('Missing DAP start parameters.', { code: 'missing_parameter' });\n }\n\n const mode = params.mode;\n const name = params.name;\n const parsed: DapStartSessionParams = {\n mode: mode === 'attach' ? 'attach' : 'launch',\n name: typeof name === 'string' && name.length > 0 ? name : 'default',\n use: params.use !== false,\n descriptor: params.descriptor,\n };\n if ('config' in params) {\n parsed.config = params.config;\n }\n\n return parsed;\n}\n\nfunction parseDapStartCompoundParams(params: unknown): DapStartCompoundParams {\n if (!isRecord(params)) {\n throw usageError('Missing compound start parameters.', { code: 'missing_parameter' });\n }\n\n const name = typeof params.name === 'string' && params.name.length > 0 ? params.name : undefined;\n if (name === undefined) {\n throw usageError('Missing compound name.', { code: 'missing_parameter' });\n }\n if (!Array.isArray(params.members) || params.members.length === 0) {\n throw usageError('Compound launch requires at least one member.', { code: 'missing_parameter' });\n }\n\n return {\n name,\n stopAll: params.stopAll !== false,\n use: params.use !== false,\n members: params.members.map(parseDapStartCompoundMemberParams),\n };\n}\n\nfunction parseDapStartCompoundMemberParams(value: unknown): DapStartCompoundMemberParams {\n if (!isRecord(value)) {\n throw usageError('Invalid compound member.', { code: 'missing_parameter' });\n }\n const memberName = typeof value.memberName === 'string' && value.memberName.length > 0 ? value.memberName : undefined;\n if (memberName === undefined) {\n throw usageError('Compound member is missing memberName.', { code: 'missing_parameter' });\n }\n const mode = value.mode === 'attach' ? 'attach' : 'launch';\n const parsed: DapStartCompoundMemberParams = {\n memberName,\n mode,\n descriptor: value.descriptor,\n };\n if ('config' in value) {\n parsed.config = value.config;\n }\n return parsed;\n}\n\nfunction createCompoundId(): string {\n return `compound_${randomBytes(12).toString('base64url')}`;\n}\n\nfunction findFailedCompoundMemberName(error: unknown, members: readonly DapStartCompoundMemberParams[], startedMemberNames: readonly string[]): string | undefined {\n const failed = members.find(member => !startedMemberNames.includes(member.memberName));\n if (failed !== undefined) {\n return failed.memberName;\n }\n if (error instanceof CliError && error.data !== undefined && typeof error.data.memberName === 'string') {\n return error.data.memberName;\n }\n return undefined;\n}\n\nfunction createCompoundFailureDiagnostics(compoundName: string, memberName: string | undefined, error: unknown): readonly string[] {\n const diagnostics = [`Compound '${compoundName}' failed while starting member '${memberName ?? 'unknown'}'.`];\n if (error instanceof CliError) {\n diagnostics.push(...error.diagnostics);\n } else if (error instanceof Error) {\n diagnostics.push(error.message);\n }\n return diagnostics;\n}\n\ninterface DapCliStartConfig {\n config: unknown;\n initialBreakpoints: readonly unknown[];\n}\n\nfunction extractDapCliStartConfig(config: unknown): DapCliStartConfig {\n if (!isRecord(config)) {\n return { config, initialBreakpoints: [] };\n }\n\n const initialBreakpoints = Array.isArray(config.__dapCliInitialBreakpoints) ? config.__dapCliInitialBreakpoints : [];\n const sanitizedConfig: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(config)) {\n if (key !== '__dapCliInitialBreakpoints') {\n sanitizedConfig[key] = value;\n }\n }\n\n return { config: sanitizedConfig, initialBreakpoints };\n}\n\nfunction createBeforeConfigurationDoneHook(client: DapClient, initialBreakpoints: readonly unknown[], children?: ChildSessionCoordinator): (() => Promise<void>) | undefined {\n if (initialBreakpoints.length === 0) {\n return undefined;\n }\n\n return async () => {\n for (const breakpointArgs of initialBreakpoints) {\n await client.request('setBreakpoints', breakpointArgs);\n }\n // Children may not exist yet at hook time (the parent has not yet sent\n // configurationDone), but if they do — or once they do — they need the\n // same initial breakpoints. Hand them to the coordinator which replays\n // them to existing children and remembers them for future ones.\n if (children !== undefined) {\n children.registerInitialBreakpoints(initialBreakpoints);\n }\n };\n}\n\nfunction parseDapRequestParams(params: unknown): { name?: string; command: string; args?: unknown } {\n if (!isRecord(params) || typeof params.command !== 'string') {\n throw usageError('Missing DAP request command.', { code: 'missing_parameter' });\n }\n\n const requestParams: { name?: string; command: string; args?: unknown } = {\n command: params.command,\n };\n if (typeof params.name === 'string') {\n requestParams.name = params.name;\n }\n if ('args' in params) {\n requestParams.args = params.args;\n }\n\n return requestParams;\n}\n\nfunction parseEventsRecentParams(params: unknown): { name?: string; options: { afterCursor?: number; limit?: number } } {\n if (!isRecord(params)) {\n return { options: {} };\n }\n\n const eventParams: { name?: string; options: { afterCursor?: number; limit?: number } } = { options: {} };\n if (typeof params.name === 'string') {\n eventParams.name = params.name;\n }\n if (typeof params.afterCursor === 'number') {\n eventParams.options.afterCursor = params.afterCursor;\n }\n if (typeof params.limit === 'number') {\n eventParams.options.limit = params.limit;\n }\n\n return eventParams;\n}\n\nfunction getOwnedAdapter(adapter: AdapterRuntime): Partial<OwnedAdapterMetadata> {\n return 'ownedAdapter' in adapter ? adapter.ownedAdapter : { startedByDapCli: false, stderrTail: [] };\n}\n\nfunction getAdapterContext(descriptorId: string, adapter: AdapterRuntime): CliErrorAdapterContext {\n const context: CliErrorAdapterContext = { descriptorId };\n if ('ownedAdapter' in adapter) {\n if (adapter.ownedAdapter.pid !== undefined) {\n context.pid = adapter.ownedAdapter.pid;\n }\n if (adapter.ownedAdapter.stderrTail.length > 0) {\n context.stderrTail = adapter.ownedAdapter.stderrTail;\n }\n if (adapter.ownedAdapter.logPath !== undefined) {\n context.logPath = adapter.ownedAdapter.logPath;\n }\n }\n\n return context;\n}\n\nfunction toDapCliError(error: unknown, context: { sessionId: string; adapter: CliErrorAdapterContext; request?: CliErrorRequestContext; staleSession?: { sessionRef: string; status?: string } }): CliError {\n if (error instanceof DapLifecycleHandshakeTimeoutError) {\n return adapterError(error.message, withDapContext({\n code: 'lifecycle_handshake_timeout',\n diagnostics: [\n `Adapter did not respond to ${error.stage} within ${error.timeoutMs}ms.`,\n 'The session was abandoned and the controller remains running.',\n 'Inspect adapter stderr or log path for clues.',\n ],\n }, context));\n }\n\n if (error instanceof DapResponseError) {\n if (error.message.includes('timed out')) {\n return timeoutError(error.message, {\n code: 'dap_request_timeout',\n diagnostics: [`DAP request timed out: ${error.command}. Check adapter health and retry.`],\n sessionId: context.sessionId,\n request: { command: error.command, seq: error.requestSeq },\n adapter: context.adapter,\n });\n }\n\n // Round 3 follow-up (gap H-7b): the controller's own paused-state gate\n // (`assertThreadPausedIfRequired`) only fires when we have proof the\n // thread is running (`paused === false`). When the projection is\n // `undefined` (no stopped event observed yet) the request is forwarded\n // and the adapter typically rejects it with a \"Thread … not paused\"\n // string. Surface that as the structured `thread_not_paused` error so\n // the recovery hint points users at `events --include stopped` instead\n // of the generic `dap_request_failed` envelope.\n if (PAUSED_REQUIRED_DAP_COMMANDS.has(error.command) && /not paused/i.test(error.message)) {\n return threadNotPaused({\n sessionId: context.sessionId,\n ...(context.staleSession?.sessionRef !== undefined ? { sessionName: context.staleSession.sessionRef } : {}),\n command: error.command,\n });\n }\n\n return dapError(error.message, {\n code: 'dap_request_failed',\n diagnostics: [`DAP request failed: ${error.command}. Inspect adapter diagnostics and session state.`],\n sessionId: context.sessionId,\n request: { command: error.command, seq: error.requestSeq },\n adapter: context.adapter,\n });\n }\n\n if (error instanceof DapTransportClosedError) {\n const stale = context.staleSession;\n const diagnostics: string[] = [\n 'The adapter transport closed before dap-cli received the expected DAP response.',\n `Session ${context.sessionId} may be stale or the debuggee may have exited.`,\n ];\n if (stale?.status !== undefined) {\n diagnostics.push(`Last-known session status: ${stale.status}.`);\n }\n if (context.adapter.logPath !== undefined) {\n diagnostics.push(`Adapter log: ${context.adapter.logPath}.`);\n }\n diagnostics.push(`Run \\`dap-cli close ${stale?.sessionRef ?? context.sessionId}\\` and relaunch the session.`);\n return adapterError(error.message, withDapContext({\n code: 'adapter_transport_closed',\n diagnostics,\n }, context));\n }\n\n if (error instanceof CliError) {\n return error;\n }\n\n return adapterError(error instanceof Error ? error.message : 'Adapter request failed.', withDapContext({\n code: 'adapter_request_failed',\n diagnostics: ['The adapter failed while processing the DAP request. Check adapter stderr and log path.'],\n }, context));\n}\n\nfunction toControllerErrorPayload(error: CliError): ControllerFailureResponse['error'] {\n const payload: ControllerFailureResponse['error'] = {\n code: error.code,\n message: error.message,\n category: error.category,\n exitCode: error.exitCode,\n diagnostics: error.diagnostics,\n };\n if (error.sessionId !== undefined) {\n payload.sessionId = error.sessionId;\n }\n if (error.request !== undefined) {\n payload.request = error.request;\n }\n if (error.adapter !== undefined) {\n payload.adapter = error.adapter;\n }\n if (error.data !== undefined) {\n payload.data = error.data;\n }\n\n return payload;\n}\n\nfunction createMissingRuntimeDiagnostics(status: SessionStatus): readonly string[] {\n const diagnostics = [\n `Session ${status.id} (${status.name}) is recorded as ${status.status}, but this controller has no attached DAP runtime for it.`,\n 'Run `dap-cli cleanup --purge` to remove stale session state, or relaunch the debug session and retry with the new session ID.',\n ];\n if (status.logPath !== undefined) {\n diagnostics.push(`Adapter log: ${status.logPath}`);\n }\n if (status.stderrTail.length > 0) {\n diagnostics.push(`Adapter stderr tail: ${status.stderrTail.join('\\n')}`);\n }\n\n return diagnostics;\n}\n\nfunction createDapErrorContext(context: { sessionId: string; adapter: CliErrorAdapterContext; request?: CliErrorRequestContext | undefined }): { sessionId: string; adapter: CliErrorAdapterContext; request?: CliErrorRequestContext } {\n const normalized: { sessionId: string; adapter: CliErrorAdapterContext; request?: CliErrorRequestContext } = {\n sessionId: context.sessionId,\n adapter: context.adapter,\n };\n if (context.request !== undefined) {\n normalized.request = context.request;\n }\n\n return normalized;\n}\n\nfunction withDapContext(options: CliErrorOptions, context: { sessionId: string; adapter: CliErrorAdapterContext; request?: CliErrorRequestContext }): CliErrorOptions {\n const enriched: CliErrorOptions = {\n ...options,\n sessionId: context.sessionId,\n adapter: context.adapter,\n };\n if (context.request !== undefined) {\n enriched.request = context.request;\n }\n\n return enriched;\n}\n\nfunction getOptionalStringParam(params: unknown, key: string): string | undefined {\n if (!isRecord(params) || !(key in params)) {\n return undefined;\n }\n\n const value = params[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction getRequiredStringParam(params: unknown, key: string): string {\n const value = getOptionalStringParam(params, key);\n if (value === undefined) {\n throw usageError(`Missing required parameter: ${key}`, { code: 'missing_parameter' });\n }\n\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\n/**\n * Phase 16-01 (PYEVAL-01): on a debugpy `evaluate`, detect statement-shaped\n * Python and rewrite `args.expression` to `exec(\"…\")` so the call doesn't\n * trip debugpy's expression-only `evaluate` rule. Honors a request-level\n * opt-out via `args.context === 'no-auto-wrap'` (the token is stripped\n * from the forwarded args so debugpy doesn't reject an unknown context).\n *\n * Returns `undefined` for any non-debugpy / non-evaluate / malformed-args\n * path so the caller falls through to the original args. When this returns\n * a value, `originalExpression` is the caller's untouched expression so\n * the SyntaxError-fallback path can recover the recipe regardless of\n * whether we wrapped.\n */\nfunction maybePythonEvaluateRewrite(\n adapterId: string,\n requestParams: { command: string; args?: unknown },\n): { forwardArgs: Record<string, unknown>; originalExpression: string } | undefined {\n if (requestParams.command !== 'evaluate' || adapterId !== 'debugpy') {\n return undefined;\n }\n if (!isRecord(requestParams.args)) {\n return undefined;\n }\n const expression = requestParams.args.expression;\n if (typeof expression !== 'string' || expression.length === 0) {\n return undefined;\n }\n const forwardArgs: Record<string, unknown> = { ...requestParams.args };\n if (requestParams.args.context === 'no-auto-wrap') {\n forwardArgs.context = undefined;\n return { forwardArgs, originalExpression: expression };\n }\n if (looksLikePythonStatement(expression)) {\n forwardArgs.expression = wrapForExec(expression);\n }\n return { forwardArgs, originalExpression: expression };\n}\n\nfunction hasTruthyCapability(capabilities: unknown, capability: string): boolean {\n return isRecord(capabilities) && Boolean(capabilities[capability]);\n}\n\nfunction isImplementedDapRequestMethod(method: string): boolean {\n return method === 'dap.start' || method === 'dap.startCompound' || method === 'dap.request' || method === 'dap.capabilities' || method === 'events.recent' || method === 'events.list' || method === 'sessions.breakpoints.list' || method === 'sessions.breakpoints.clear';\n}\n\nexport async function startControllerServer(options: StartControllerServerOptions = {}): Promise<ControllerServer> {\n const server = new ControllerServer(options);\n await server.start();\n return server;\n}\n\nfunction writeResponse(socket: net.Socket, response: ControllerResponse<unknown> | ControllerFailureResponse): void {\n socket.write(`${JSON.stringify(response)}\\n`);\n}\n\nfunction malformedResponse(id: string, message: string): ControllerFailureResponse {\n return {\n id,\n ok: false,\n error: {\n code: 'malformed_request',\n message,\n },\n };\n}\n\nfunction extractRequestId(value: unknown): string {\n if (typeof value === 'object' && value !== null && 'id' in value && typeof value.id === 'string') {\n return value.id;\n }\n\n return 'unknown';\n}\n","import { z } from 'zod';\n\nconst adapterIdSchema = z.string().min(1).regex(/^[A-Za-z0-9._-]+$/, 'Adapter id may only contain letters, numbers, dots, underscores, and dashes.');\n\nexport interface AdapterDescriptor {\n id: string;\n label: string;\n transport:\n | { kind: 'stdio'; command: string; args: string[]; cwd?: string | undefined; env?: Record<string, string> | undefined }\n | { kind: 'socket'; host: '127.0.0.1'; port: number }\n | { kind: 'server'; command: string; args: string[]; host: '127.0.0.1'; cwd?: string | undefined; env?: Record<string, string> | undefined };\n}\n\nexport const adapterDescriptorSchema: z.ZodType<AdapterDescriptor> = z.object({\n id: adapterIdSchema,\n label: z.string().min(1),\n transport: z.discriminatedUnion('kind', [\n z.object({\n kind: z.literal('stdio'),\n command: z.string().min(1),\n args: z.array(z.string()),\n cwd: z.string().min(1).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n z.object({\n kind: z.literal('socket'),\n host: z.literal('127.0.0.1'),\n port: z.number().int().positive(),\n }),\n z.object({\n kind: z.literal('server'),\n command: z.string().min(1),\n args: z.array(z.string()),\n host: z.literal('127.0.0.1'),\n cwd: z.string().min(1).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n ]),\n});\n\nexport function parseAdapterDescriptor(value: unknown): AdapterDescriptor {\n return adapterDescriptorSchema.parse(value);\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport { createWriteStream } from 'node:fs';\nimport path from 'node:path';\nimport type { OwnedAdapterMetadata } from '../sessions/session.js';\nimport { createStdioTransport } from '../protocol/stdioTransport.js';\nimport type { DapTransport } from '../protocol/transport.js';\nimport type { AdapterDescriptor } from './descriptor.js';\n\nconst stderrTailLimit = 100;\n\nexport interface StartedProcessAdapter {\n transport: DapTransport;\n ownedAdapter: OwnedAdapterMetadata;\n /**\n * Plan 05-23 Task 1.5 (gap H-8 cascade): on POSIX, stdio adapters are\n * spawned with `detached: true` so the child becomes the leader of a new\n * process group whose pgid equals its pid. `terminateRuntime` signals the\n * negative pgid so SIGTERM/SIGKILL cascade to subprocesses (e.g. the\n * Chromium tree js-debug pwa-chrome spawns under itself). On Windows or\n * when `detached:true` is unsupported by the platform, this is undefined\n * and terminate falls back to per-PID signaling.\n */\n processGroupId?: number;\n close(): Promise<void>;\n}\n\nexport interface StartProcessAdapterOptions {\n descriptor: Extract<AdapterDescriptor['transport'], { kind: 'stdio' }>;\n adapterId: string;\n logDir: string;\n}\n\nexport function startProcessAdapter(options: StartProcessAdapterOptions): StartedProcessAdapter {\n // Plan 05-23 Task 1.5 (gap H-8): detached:true makes the child the leader\n // of its own process group on POSIX. We deliberately do NOT call\n // child.unref() — we still want the child's exit to be observable to the\n // parent controller for cleanup accounting.\n const detached = process.platform !== 'win32';\n const child = spawn(options.descriptor.command, options.descriptor.args, {\n cwd: options.descriptor.cwd,\n env: options.descriptor.env === undefined ? process.env : { ...process.env, ...options.descriptor.env },\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: false,\n detached,\n });\n const processGroupId = detached && typeof child.pid === 'number' ? child.pid : undefined;\n const stderrTail: string[] = [];\n const logPath = path.join(options.logDir, `${options.adapterId}-${child.pid ?? process.pid}.log`);\n const logStream = createWriteStream(logPath, { flags: 'a' });\n\n // Plan 05-21 (gap H-5): write a header line so a 0-byte log file\n // unambiguously means \"we never started the adapter\" rather than\n // \"the adapter ran fine but said nothing on stderr\".\n logStream.write(`[dap-cli] adapter ${options.adapterId} started pid=${child.pid ?? 'unknown'} at ${new Date().toISOString()}\\n`);\n\n child.stderr.on('data', (chunk: Buffer) => {\n const text = chunk.toString('utf8');\n logStream.write(text);\n appendStderrTail(stderrTail, text);\n });\n\n child.on('error', error => {\n const text = error.message;\n logStream.write(`[dap-cli] adapter ${options.adapterId} spawn error: ${text}\\n`);\n appendStderrTail(stderrTail, text);\n });\n\n const adapter: StartedProcessAdapter = {\n transport: createStdioTransport({ name: options.adapterId, child }),\n ownedAdapter: {\n pid: child.pid,\n logPath,\n stderrTail,\n startedByDapCli: true,\n },\n async close(): Promise<void> {\n child.stdin.end();\n await terminateChild(child);\n await new Promise<void>(resolve => {\n logStream.end(() => resolve());\n });\n },\n };\n if (processGroupId !== undefined) {\n adapter.processGroupId = processGroupId;\n }\n return adapter;\n}\n\nasync function terminateChild(child: ChildProcessWithoutNullStreams): Promise<void> {\n if (child.exitCode !== null || child.signalCode !== null) {\n return;\n }\n\n child.kill('SIGTERM');\n if (await waitForExit(child, 100)) {\n return;\n }\n\n child.kill('SIGKILL');\n await waitForExit(child, 100);\n}\n\nfunction waitForExit(child: ChildProcessWithoutNullStreams, timeoutMs: number): Promise<boolean> {\n if (child.exitCode !== null || child.signalCode !== null) {\n return Promise.resolve(true);\n }\n\n return new Promise(resolve => {\n const timer = setTimeout(() => {\n child.off('exit', onExit);\n resolve(false);\n }, timeoutMs);\n const onExit = (): void => {\n clearTimeout(timer);\n resolve(true);\n };\n child.once('exit', onExit);\n });\n}\n\nfunction appendStderrTail(stderrTail: string[], text: string): void {\n for (const line of text.split(/\\r?\\n/).filter(value => value.length > 0)) {\n stderrTail.push(line);\n while (stderrTail.length > stderrTailLimit) {\n stderrTail.shift();\n }\n }\n}\n","import type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport type { DapTransport } from './transport.js';\n\nexport interface StdioTransportOptions {\n name: string;\n child: ChildProcessWithoutNullStreams;\n}\n\nexport function createStdioTransport(options: StdioTransportOptions): DapTransport {\n return {\n name: options.name,\n readable: options.child.stdout,\n writable: options.child.stdin,\n close(): Promise<void> {\n options.child.stdin.end();\n return Promise.resolve();\n },\n };\n}\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport { createWriteStream } from 'node:fs';\nimport net from 'node:net';\nimport path from 'node:path';\nimport { connectSocketTransport } from '../protocol/socketTransport.js';\nimport type { DapTransport } from '../protocol/transport.js';\nimport type { OwnedAdapterMetadata } from '../sessions/session.js';\nimport type { AdapterDescriptor } from './descriptor.js';\n\nexport interface ConnectedSocketAdapter {\n transport: DapTransport;\n close(): Promise<void>;\n /**\n * Open an additional DAP transport to the same adapter endpoint.\n *\n * pwa-chrome / pwa-node js-debug adapters serve their dapDebugServer over a\n * TCP socket that accepts multiple concurrent DAP connections — one per child\n * session in the parent/child multiplexing model. Plan 05-04 uses this to\n * bring up child sessions without spawning a second adapter process.\n */\n openChildTransport?(name: string): Promise<DapTransport>;\n}\n\nexport interface StartedServerSocketAdapter extends ConnectedSocketAdapter {\n ownedAdapter: OwnedAdapterMetadata;\n}\n\nexport async function connectSocketAdapter(adapterId: string, descriptor: Extract<AdapterDescriptor['transport'], { kind: 'socket' }>): Promise<ConnectedSocketAdapter> {\n const transport = await connectSocketTransport({ name: adapterId, host: descriptor.host, port: descriptor.port });\n return {\n transport,\n close: () => transport.close(),\n openChildTransport: name => connectSocketTransport({ name, host: descriptor.host, port: descriptor.port }),\n };\n}\n\nexport async function startServerSocketAdapter(adapterId: string, descriptor: Extract<AdapterDescriptor['transport'], { kind: 'server' }>, logDir: string): Promise<StartedServerSocketAdapter> {\n const port = await getFreePort(descriptor.host);\n const args = descriptor.args.map(arg => arg === '${port}' ? String(port) : arg);\n const child = spawn(descriptor.command, args, {\n cwd: descriptor.cwd,\n env: descriptor.env === undefined ? process.env : { ...process.env, ...descriptor.env },\n stdio: ['ignore', 'ignore', 'pipe'],\n shell: false,\n });\n const stderrTail: string[] = [];\n const logPath = path.join(logDir, `${adapterId}-${child.pid ?? process.pid}.log`);\n const logStream = createWriteStream(logPath, { flags: 'a' });\n\n // Plan 05-21 (gap H-5): write a header line so a 0-byte log file\n // unambiguously means \"we never started the adapter\". js-debug in\n // particular emits its DAP traffic over its socket transport — not\n // stderr — so without this header the log file is genuinely empty\n // for healthy sessions. js-debug's own DAP/CDP trace is wired\n // separately via `applyJsDebugTraceDefaults` in `builtins/jsDebug.ts`.\n logStream.write(`[dap-cli] adapter ${adapterId} started pid=${child.pid ?? 'unknown'} at ${new Date().toISOString()}\\n`);\n\n child.stderr.on('data', (chunk: Buffer) => {\n const text = chunk.toString('utf8');\n logStream.write(text);\n appendStderrTail(stderrTail, text);\n });\n\n child.on('error', error => {\n const text = error.message;\n logStream.write(`[dap-cli] adapter ${adapterId} spawn error: ${text}\\n`);\n appendStderrTail(stderrTail, text);\n });\n\n try {\n const transport = await connectWithRetry(adapterId, descriptor.host, port);\n return {\n transport,\n ownedAdapter: {\n pid: child.pid,\n logPath,\n stderrTail,\n startedByDapCli: true,\n },\n openChildTransport: name => connectSocketTransport({ name, host: descriptor.host, port }),\n async close(): Promise<void> {\n await transport.close();\n await terminateChild(child);\n await new Promise<void>(resolve => {\n logStream.end(() => resolve());\n });\n },\n };\n } catch (error) {\n await terminateChild(child);\n await new Promise<void>(resolve => {\n logStream.end(() => resolve());\n });\n throw error;\n }\n}\n\nasync function connectWithRetry(adapterId: string, host: '127.0.0.1', port: number): Promise<DapTransport> {\n const deadline = Date.now() + 5_000;\n let lastError: unknown;\n\n while (Date.now() < deadline) {\n try {\n return await connectSocketTransport({ name: adapterId, host, port, timeoutMs: 500 });\n } catch (error) {\n lastError = error;\n await delay(50);\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error('Timed out connecting DAP server adapter.');\n}\n\nfunction getFreePort(host: '127.0.0.1'): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = net.createServer();\n server.once('error', reject);\n server.listen(0, host, () => {\n const address = server.address();\n server.close(() => {\n if (typeof address === 'object' && address !== null) {\n resolve(address.port);\n return;\n }\n\n reject(new Error('Failed to allocate a local adapter server port.'));\n });\n });\n });\n}\n\nasync function terminateChild(child: ChildProcess): Promise<void> {\n if (child.exitCode !== null || child.signalCode !== null) {\n return;\n }\n\n child.kill('SIGTERM');\n if (await waitForExit(child, 100)) {\n return;\n }\n\n child.kill('SIGKILL');\n await waitForExit(child, 100);\n}\n\nfunction waitForExit(child: ChildProcess, timeoutMs: number): Promise<boolean> {\n if (child.exitCode !== null || child.signalCode !== null) {\n return Promise.resolve(true);\n }\n\n return new Promise(resolve => {\n const timer = setTimeout(() => {\n child.off('exit', onExit);\n resolve(false);\n }, timeoutMs);\n const onExit = (): void => {\n clearTimeout(timer);\n resolve(true);\n };\n child.once('exit', onExit);\n });\n}\n\nfunction appendStderrTail(stderrTail: string[], text: string): void {\n for (const line of text.split(/\\r?\\n/).filter(value => value.length > 0)) {\n stderrTail.push(line);\n while (stderrTail.length > 100) {\n stderrTail.shift();\n }\n }\n}\n\nasync function delay(ms: number): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, ms));\n}\n","import net from 'node:net';\nimport type { DapTransport } from './transport.js';\n\nexport interface SocketTransportOptions {\n name: string;\n socket: net.Socket;\n}\n\nexport interface ConnectSocketTransportOptions {\n name: string;\n host: '127.0.0.1';\n port: number;\n timeoutMs?: number;\n}\n\nexport function createSocketTransport(options: SocketTransportOptions): DapTransport {\n return {\n name: options.name,\n readable: options.socket,\n writable: options.socket,\n close(): Promise<void> {\n options.socket.end();\n options.socket.destroy();\n return Promise.resolve();\n },\n };\n}\n\nexport async function connectSocketTransport(options: ConnectSocketTransportOptions): Promise<DapTransport> {\n const socket = await new Promise<net.Socket>((resolve, reject) => {\n const client = net.createConnection({ host: options.host, port: options.port });\n const timeout = setTimeout(() => {\n client.destroy();\n reject(new Error('Timed out connecting DAP socket transport.'));\n }, options.timeoutMs ?? 5_000);\n\n client.once('connect', () => {\n clearTimeout(timeout);\n resolve(client);\n });\n client.once('error', error => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n\n return createSocketTransport({ name: options.name, socket });\n}\n","import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type { AdapterDescriptor } from '../descriptor.js';\nimport { getDapCliAdaptersDir } from '../../config/paths.js';\nimport { usageError } from '../../cli/errors.js';\n\nexport function createJsDebugDescriptor(jsDebugPath?: string): AdapterDescriptor {\n const dapServerPath = jsDebugPath ?? resolveDefaultJsDebugPath();\n return {\n id: 'js-debug',\n label: 'JavaScript Debug Adapter (Node, Chrome, Electron)',\n transport: {\n kind: 'server',\n command: process.execPath,\n args: [dapServerPath, '${port}', '127.0.0.1'],\n host: '127.0.0.1',\n },\n };\n}\n\n/**\n * Plan 05-21 (gap H-5): inject `trace.logFile` into a js-debug launch/attach\n * config so js-debug writes its built-in DAP/CDP wire trace to a discoverable\n * file. js-debug emits DAP traffic over its socket transport rather than\n * stderr, so the log file `socketAdapter.ts` populates from stderr is\n * legitimately empty for healthy sessions. This sibling trace file gives\n * users a real wire log to inspect when something goes wrong.\n *\n * Behavior:\n * - If `config` is not a plain object, returns it unchanged (let the adapter\n * reject the malformed config itself).\n * - If the user already provided a `trace` field, leaves it alone — explicit\n * user config always wins.\n * - Otherwise sets `trace = { stdio: false, logFile: <logDir>/js-debug-trace-<ts>.log }`.\n *\n * The recognized keys inside `trace` were verified against the bundled\n * `dapDebugServer.js` in the provisioned js-debug install: `stdio` (boolean,\n * mirror to stdio) and `logFile` (string, JSON log path). There is no\n * `level` field — verbosity is controlled per-tag via the `trace` object's\n * other keys, but the defaults already include `cdp.send/receive` and\n * `dap.send/receive`, which is what we want for diagnostic capture.\n */\nexport function applyJsDebugTraceDefaults(config: unknown, logDir: string): unknown {\n if (typeof config !== 'object' || config === null || Array.isArray(config)) {\n return config;\n }\n const record = config as Record<string, unknown>;\n if (record.trace !== undefined) {\n return record;\n }\n return {\n ...record,\n trace: {\n stdio: false,\n logFile: path.join(logDir, `js-debug-trace-${Date.now()}.log`),\n },\n };\n}\n\nfunction resolveDefaultJsDebugPath(): string {\n const candidates = [\n path.join(getDapCliAdaptersDir(), 'js-debug', 'src', 'dapDebugServer.js'),\n path.join(process.cwd(), 'node_modules', 'vscode-js-debug', 'src', 'dapDebugServer.js'),\n ];\n\n const found = candidates.find(candidate => existsSync(candidate));\n if (found !== undefined) {\n return found;\n }\n\n throw usageError('js-debug adapter is not installed.', {\n code: 'js_debug_not_found',\n diagnostics: [\n 'Run npm run setup-adapters to provision js-debug, or see docs/ADAPTER-SETUP.md for advanced manual provisioning.',\n `Checked: ${candidates.join(', ')}`,\n ],\n });\n}","import { spawn } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\nimport { z } from 'zod';\nimport { DapFrameError, DapMessageParser, encodeDapMessage } from './framing.js';\nimport type { DapEventMessage, DapProtocolMessage, DapRequestMessage, DapResponseMessage } from './dapMessages.js';\nimport type { DapTransport } from './transport.js';\n\nexport interface LastDapRequest {\n seq: number;\n command: string;\n timestamp: string;\n}\n\nexport interface DapClientOptions {\n requestTimeoutMs?: number;\n}\n\nexport class DapResponseError extends Error {\n public constructor(public readonly command: string, public readonly requestSeq: number, message: string) {\n super(message);\n this.name = 'DapResponseError';\n }\n}\n\nexport class DapTransportClosedError extends Error {\n public constructor(message = 'DAP transport closed.') {\n super(message);\n this.name = 'DapTransportClosedError';\n }\n}\n\ntype EventListener = (event: DapEventMessage) => void;\n\nconst runInTerminalArgumentsSchema = z.object({\n args: z.array(z.string()).min(1),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n});\n\ninterface PendingRequest {\n command: string;\n resolve(value: unknown): void;\n reject(error: Error): void;\n timeout: NodeJS.Timeout | undefined;\n}\n\nexport interface ReverseRequestPayload {\n command: string;\n arguments: unknown;\n seq: number;\n}\n\nexport interface ReverseRequestResult {\n success: boolean;\n body?: unknown;\n message?: string;\n}\n\nexport type ReverseRequestHandler = (\n request: ReverseRequestPayload,\n) => Promise<ReverseRequestResult | undefined> | ReverseRequestResult | undefined;\n\nexport class DapClient {\n private readonly parser = new DapMessageParser();\n private readonly pending = new Map<number, PendingRequest>();\n private readonly eventListeners = new Set<EventListener>();\n private readonly childProcesses = new Set<ChildProcess>();\n private nextSeq = 1;\n private closed = false;\n private reverseRequestHandler: ReverseRequestHandler | undefined;\n public lastRequest: LastDapRequest | undefined;\n\n public constructor(private readonly transport: DapTransport, private readonly options: DapClientOptions = {}) {\n transport.readable.on('data', this.handleData);\n transport.readable.on('close', this.handleClosed);\n transport.readable.on('end', this.handleClosed);\n transport.readable.on('error', this.handleTransportError);\n }\n\n public request<TResponse = unknown>(command: string, args?: unknown): Promise<TResponse> {\n if (this.closed) {\n return Promise.reject(new DapTransportClosedError());\n }\n\n const seq = this.nextSeq;\n this.nextSeq += 1;\n const request = args === undefined\n ? { seq, type: 'request' as const, command }\n : { seq, type: 'request' as const, command, arguments: args };\n this.lastRequest = { seq, command, timestamp: new Date().toISOString() };\n\n return new Promise<TResponse>((resolve, reject) => {\n const timeout = this.options.requestTimeoutMs === undefined\n ? undefined\n : setTimeout(() => {\n this.pending.delete(seq);\n reject(new DapResponseError(command, seq, `DAP request timed out: ${command}`));\n }, this.options.requestTimeoutMs);\n\n this.pending.set(seq, {\n command,\n resolve: value => resolve(value as TResponse),\n reject,\n timeout,\n });\n this.transport.writable.write(encodeDapMessage(request));\n });\n }\n\n public onEvent(listener: EventListener): () => void {\n this.eventListeners.add(listener);\n return () => {\n this.eventListeners.delete(listener);\n };\n }\n\n /**\n * Register a handler for adapter-originated reverse requests.\n *\n * The handler is consulted for every reverse request (including `runInTerminal`).\n * If it resolves to `undefined`, DapClient falls back to the built-in handlers\n * (currently only `runInTerminal`); otherwise the resolved value is written\n * back to the adapter as a DAP response. Handler errors are translated to\n * `{ success: false, message: <error.message> }` and never crash the client.\n *\n * Only one handler may be registered at a time — a later subscription replaces\n * any earlier one. The returned disposer clears the handler if it is still the\n * one currently registered.\n */\n public onReverseRequest(handler: ReverseRequestHandler): () => void {\n this.reverseRequestHandler = handler;\n return () => {\n if (this.reverseRequestHandler === handler) {\n this.reverseRequestHandler = undefined;\n }\n };\n }\n\n public async close(): Promise<void> {\n this.handleClosed();\n this.detachTransportHandlers();\n await this.terminateChildProcesses();\n await this.transport.close();\n }\n\n private readonly handleData = (chunk: Buffer): void => {\n try {\n for (const message of this.parser.push(chunk)) {\n this.handleMessage(message);\n }\n } catch (error) {\n const message = error instanceof DapFrameError ? error.message : 'Failed to parse DAP message.';\n this.rejectPending(new DapTransportClosedError(message));\n }\n };\n\n private readonly handleClosed = (): void => {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n this.rejectPending(new DapTransportClosedError());\n };\n\n private readonly handleTransportError = (error: Error): void => {\n this.rejectPending(error);\n };\n\n private handleMessage(message: DapProtocolMessage): void {\n if (message.type === 'event') {\n this.emitEvent(message);\n return;\n }\n\n if (message.type === 'response') {\n this.handleResponse(message);\n return;\n }\n\n this.handleAdapterRequest(message);\n }\n\n private handleResponse(response: DapResponseMessage): void {\n const pending = this.pending.get(response.request_seq);\n if (pending === undefined) {\n return;\n }\n\n this.pending.delete(response.request_seq);\n if (pending.timeout !== undefined) {\n clearTimeout(pending.timeout);\n }\n\n if (!response.success) {\n pending.reject(new DapResponseError(response.command, response.request_seq, response.message ?? `DAP request failed: ${response.command}`));\n return;\n }\n\n pending.resolve(response.body);\n }\n\n private emitEvent(event: DapEventMessage): void {\n for (const listener of this.eventListeners) {\n listener(event);\n }\n }\n\n private handleAdapterRequest(request: DapRequestMessage): void {\n const handler = this.reverseRequestHandler;\n if (handler !== undefined) {\n this.dispatchReverseRequestToHandler(request, handler);\n return;\n }\n\n this.runDefaultAdapterRequest(request);\n }\n\n private dispatchReverseRequestToHandler(request: DapRequestMessage, handler: ReverseRequestHandler): void {\n let result: Promise<ReverseRequestResult | undefined> | ReverseRequestResult | undefined;\n try {\n result = handler({ command: request.command, arguments: request.arguments, seq: request.seq });\n } catch (error) {\n this.writeAdapterResponse(request, false, undefined, error instanceof Error ? error.message : `Reverse request handler failed: ${request.command}`);\n return;\n }\n\n Promise.resolve(result).then(\n resolved => {\n if (resolved === undefined) {\n this.runDefaultAdapterRequest(request);\n return;\n }\n this.writeAdapterResponse(request, resolved.success, resolved.body, resolved.message);\n },\n error => {\n this.writeAdapterResponse(request, false, undefined, error instanceof Error ? error.message : `Reverse request handler failed: ${request.command}`);\n },\n );\n }\n\n private runDefaultAdapterRequest(request: DapRequestMessage): void {\n if (request.command !== 'runInTerminal') {\n this.writeAdapterResponse(request, false, undefined, `Unsupported adapter request: ${request.command}`);\n return;\n }\n\n try {\n const body = this.handleRunInTerminal(request.arguments);\n this.writeAdapterResponse(request, true, body);\n } catch (error) {\n this.writeAdapterResponse(request, false, undefined, error instanceof Error ? error.message : 'runInTerminal failed.');\n }\n }\n\n private writeAdapterResponse(request: DapRequestMessage, success: boolean, body?: unknown, message?: string): void {\n const response: DapResponseMessage = {\n seq: this.nextSeq,\n type: 'response',\n request_seq: request.seq,\n success,\n command: request.command,\n };\n this.nextSeq += 1;\n if (body !== undefined) {\n response.body = body;\n }\n if (message !== undefined) {\n response.message = message;\n }\n\n this.transport.writable.write(encodeDapMessage(response));\n }\n\n private rejectPending(error: Error): void {\n for (const pending of this.pending.values()) {\n if (pending.timeout !== undefined) {\n clearTimeout(pending.timeout);\n }\n pending.reject(error);\n }\n this.pending.clear();\n }\n\n private detachTransportHandlers(): void {\n this.transport.readable.removeListener('data', this.handleData);\n this.transport.readable.removeListener('close', this.handleClosed);\n this.transport.readable.removeListener('end', this.handleClosed);\n this.transport.readable.removeListener('error', this.handleTransportError);\n }\n\n private handleRunInTerminal(argumentsValue: unknown): { processId?: number } {\n const parsed = runInTerminalArgumentsSchema.safeParse(argumentsValue);\n if (!parsed.success) {\n throw new Error('Invalid runInTerminal request arguments.');\n }\n\n const command = parsed.data.args[0];\n const args = parsed.data.args.slice(1);\n const env = parsed.data.env === undefined ? process.env : { ...process.env, ...parsed.data.env };\n if (command === undefined) {\n throw new Error('Invalid runInTerminal command.');\n }\n\n const child = spawn(command, args, { cwd: parsed.data.cwd, env, stdio: 'ignore', shell: false });\n this.childProcesses.add(child);\n child.once('exit', () => this.childProcesses.delete(child));\n\n return child.pid === undefined ? {} : { processId: child.pid };\n }\n\n private async terminateChildProcesses(): Promise<void> {\n for (const child of this.childProcesses) {\n if (child.exitCode === null && child.signalCode === null) {\n child.kill('SIGTERM');\n if (!await waitForExit(child, 100)) {\n child.kill('SIGKILL');\n await waitForExit(child, 100);\n }\n }\n }\n this.childProcesses.clear();\n }\n}\n\nfunction waitForExit(child: ChildProcess, timeoutMs: number): Promise<boolean> {\n if (child.exitCode !== null || child.signalCode !== null) {\n return Promise.resolve(true);\n }\n\n return new Promise(resolve => {\n const timer = setTimeout(() => {\n child.off('exit', onExit);\n resolve(false);\n }, timeoutMs);\n const onExit = (): void => {\n clearTimeout(timer);\n resolve(true);\n };\n child.once('exit', onExit);\n });\n}\n","export interface DapRequestMessage<TArguments = unknown> {\n seq: number;\n type: 'request';\n command: string;\n arguments?: TArguments;\n}\n\nexport interface DapResponseMessage<TBody = unknown> {\n seq: number;\n type: 'response';\n request_seq: number;\n success: boolean;\n command: string;\n message?: string;\n body?: TBody;\n}\n\nexport interface DapEventMessage<TBody = unknown> {\n seq: number;\n type: 'event';\n event: string;\n body?: TBody;\n}\n\nexport type DapProtocolMessage = DapRequestMessage | DapResponseMessage | DapEventMessage;\n\nexport function isDapRequestMessage(value: unknown): value is DapRequestMessage {\n return isRecord(value)\n && value.type === 'request'\n && isNonNegativeInteger(value.seq)\n && typeof value.command === 'string';\n}\n\nexport function isDapResponseMessage(value: unknown): value is DapResponseMessage {\n return isRecord(value)\n && value.type === 'response'\n && isNonNegativeInteger(value.seq)\n && isNonNegativeInteger(value.request_seq)\n && typeof value.success === 'boolean'\n && typeof value.command === 'string';\n}\n\nexport function isDapEventMessage(value: unknown): value is DapEventMessage {\n return isRecord(value)\n && value.type === 'event'\n && isNonNegativeInteger(value.seq)\n && typeof value.event === 'string';\n}\n\nexport function isDapProtocolMessage(value: unknown): value is DapProtocolMessage {\n return isDapRequestMessage(value) || isDapResponseMessage(value) || isDapEventMessage(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isNonNegativeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0;\n}\n","import { isDapProtocolMessage, type DapProtocolMessage } from './dapMessages.js';\n\nconst headerSeparator = '\\r\\n\\r\\n';\nconst headerSeparatorBytes = Buffer.byteLength(headerSeparator, 'utf8');\n\nexport class DapFrameError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = 'DapFrameError';\n }\n}\n\nexport class DapMessageParser {\n private buffer = Buffer.alloc(0);\n\n public push(chunk: Buffer): DapProtocolMessage[] {\n this.buffer = Buffer.concat([this.buffer, chunk]);\n const messages: DapProtocolMessage[] = [];\n\n while (true) {\n const separatorIndex = this.buffer.indexOf(headerSeparator);\n if (separatorIndex === -1) {\n return messages;\n }\n\n const contentLength = parseContentLength(this.buffer.subarray(0, separatorIndex).toString('ascii'));\n const bodyStart = separatorIndex + headerSeparatorBytes;\n const bodyEnd = bodyStart + contentLength;\n\n if (this.buffer.length < bodyEnd) {\n return messages;\n }\n\n const bodyBuffer = this.buffer.subarray(bodyStart, bodyEnd);\n const parsedMessage = parseBody(bodyBuffer);\n messages.push(parsedMessage);\n this.buffer = this.buffer.subarray(bodyEnd);\n }\n }\n}\n\nexport function encodeDapMessage(message: DapProtocolMessage): Buffer {\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n\n return Buffer.from(`Content-Length: ${contentLength}${headerSeparator}${body}`, 'utf8');\n}\n\nfunction parseContentLength(header: string): number {\n const contentLengthLine = header\n .split('\\r\\n')\n .find(line => line.toLowerCase().startsWith('content-length:'));\n\n if (contentLengthLine === undefined) {\n throw new DapFrameError('Missing Content-Length header.');\n }\n\n const rawLength = contentLengthLine.slice('content-length:'.length).trim();\n\n if (!/^\\d+$/.test(rawLength)) {\n throw new DapFrameError('Invalid Content-Length header.');\n }\n\n const contentLength = Number.parseInt(rawLength, 10);\n\n if (!Number.isSafeInteger(contentLength)) {\n throw new DapFrameError('Content-Length header is too large.');\n }\n\n return contentLength;\n}\n\nfunction parseBody(body: Buffer): DapProtocolMessage {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(body.toString('utf8'));\n } catch {\n throw new DapFrameError('Invalid DAP JSON body.');\n }\n\n if (!isDapProtocolMessage(parsed)) {\n throw new DapFrameError('Invalid DAP message shape.');\n }\n\n return parsed;\n}\n","import type { DapEventMessage } from './dapMessages.js';\n\n/**\n * Default total cache capacity preserved from plan 01-05 (100). The two-ring\n * implementation (plan 05-18, gap H-2) splits this into a high-priority ring\n * and a smaller low-priority ring; new code should pass explicit capacities.\n */\nconst defaultLegacyCapacity = 100;\n\n/**\n * Default low-priority event names. Some adapters emit very frequent\n * `loadedSource` events (source-discovery notifications) that can overwhelm\n * a bounded cache and evict critical events like `stopped`. Routing such\n * names to a separate ring caps the noise without losing observability of\n * state changes. Callers can override via `lowPriorityEventNames`.\n */\nconst defaultLowPriorityEventNames: ReadonlySet<string> = new Set(['loadedSource']);\n\nexport interface CachedDapEvent {\n cursor: number;\n receivedAt: string;\n sessionId: string;\n dapSeq: number;\n event: string;\n body?: unknown;\n summary: string;\n}\n\nexport interface EventCacheCapacityByPriority {\n high: number;\n low: number;\n}\n\nexport interface EventCacheSnapshot {\n cursor: number;\n events: readonly CachedDapEvent[];\n droppedBeforeCursor?: number;\n capacity: number;\n capacityByPriority: EventCacheCapacityByPriority;\n truncatedToCapacity?: number;\n}\n\nexport interface EventCacheRecentOptions {\n afterCursor?: number;\n limit?: number;\n}\n\n/**\n * Plan 05-18 (gap H-2): explicit constructor opts replace the legacy single\n * integer capacity. The two-ring split prevents low-priority `loadedSource`\n * spam from evicting critical events (`stopped`, `thread`, `output`,\n * `terminated`, `breakpoint`, `startDebugging`, ...).\n *\n * Defaults: highPriorityCapacity 200, lowPriorityCapacity 50, low-priority\n * event names `{ 'loadedSource' }`. The legacy single-int constructor still\n * works (treats N as highPriorityCapacity; lowPriorityCapacity defaults to\n * `Math.max(10, Math.ceil(N / 4))`).\n */\nexport interface DapEventCacheOptions {\n highPriorityCapacity?: number;\n lowPriorityCapacity?: number;\n lowPriorityEventNames?: ReadonlySet<string>;\n}\n\ninterface PriorityRing {\n events: CachedDapEvent[];\n capacity: number;\n droppedBeforeCursor: number;\n}\n\nexport class DapEventCache {\n private readonly highRing: PriorityRing;\n private readonly lowRing: PriorityRing;\n private readonly lowPriorityEventNames: ReadonlySet<string>;\n private nextCursor = 1;\n\n public constructor(optsOrCapacity: DapEventCacheOptions | number = defaultLegacyCapacity) {\n let highCap: number;\n let lowCap: number;\n let lowNames: ReadonlySet<string>;\n if (typeof optsOrCapacity === 'number') {\n validateCapacity(optsOrCapacity, 'capacity');\n highCap = optsOrCapacity;\n lowCap = Math.max(10, Math.ceil(optsOrCapacity / 4));\n lowNames = defaultLowPriorityEventNames;\n } else {\n highCap = optsOrCapacity.highPriorityCapacity ?? 200;\n lowCap = optsOrCapacity.lowPriorityCapacity ?? 50;\n validateCapacity(highCap, 'highPriorityCapacity');\n validateCapacity(lowCap, 'lowPriorityCapacity');\n lowNames = optsOrCapacity.lowPriorityEventNames ?? defaultLowPriorityEventNames;\n }\n\n this.highRing = { events: [], capacity: highCap, droppedBeforeCursor: 0 };\n this.lowRing = { events: [], capacity: lowCap, droppedBeforeCursor: 0 };\n this.lowPriorityEventNames = lowNames;\n }\n\n public append(sessionId: string, event: DapEventMessage, receivedAt: Date = new Date()): CachedDapEvent {\n const cachedEvent = createCachedEvent(this.nextCursor, sessionId, event, receivedAt);\n this.nextCursor += 1;\n const ring = this.lowPriorityEventNames.has(event.event) ? this.lowRing : this.highRing;\n ring.events.push(cachedEvent);\n\n while (ring.events.length > ring.capacity) {\n const evicted = ring.events.shift();\n if (evicted !== undefined) {\n ring.droppedBeforeCursor = evicted.cursor;\n }\n }\n\n return cachedEvent;\n }\n\n public recent(options: EventCacheRecentOptions = {}): EventCacheSnapshot {\n // Merge both rings preserving cursor order. Each ring is already sorted\n // by cursor (append-only), so a two-finger merge would suffice; concat +\n // sort is simpler and bounded by (highCap + lowCap), so the cost is fine.\n const merged = [...this.highRing.events, ...this.lowRing.events];\n merged.sort((a, b) => a.cursor - b.cursor);\n\n const afterCursor = options.afterCursor;\n const filtered = afterCursor === undefined\n ? merged\n : merged.filter(event => event.cursor > afterCursor);\n const limited = options.limit === undefined ? filtered : filtered.slice(-options.limit);\n\n const capacityByPriority: EventCacheCapacityByPriority = {\n high: this.highRing.capacity,\n low: this.lowRing.capacity,\n };\n const mergedCapacity = capacityByPriority.high + capacityByPriority.low;\n const snapshot: EventCacheSnapshot = {\n cursor: this.nextCursor - 1,\n events: limited,\n capacity: mergedCapacity,\n capacityByPriority,\n };\n\n // Report the highest evicted cursor across either ring. If both rings\n // have evicted, MAX captures the latest cursor at or below which data\n // may be missing. (Plan worded this as MIN, but MIN collapses to 0\n // whenever one ring is untouched — which is the common case for\n // loadedSource-heavy sessions. MAX is the only value that lets\n // a poller detect any eviction at all.)\n const maxDropped = Math.max(this.highRing.droppedBeforeCursor, this.lowRing.droppedBeforeCursor);\n if (maxDropped > 0) {\n snapshot.droppedBeforeCursor = maxDropped;\n }\n\n if (options.limit !== undefined && options.limit > mergedCapacity) {\n snapshot.truncatedToCapacity = mergedCapacity;\n }\n\n return snapshot;\n }\n}\n\nfunction validateCapacity(value: number, label: string): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`Event cache ${label} must be a positive safe integer.`);\n }\n}\n\nfunction createCachedEvent(cursor: number, sessionId: string, event: DapEventMessage, receivedAt: Date): CachedDapEvent {\n const cachedEvent: CachedDapEvent = {\n cursor,\n receivedAt: receivedAt.toISOString(),\n sessionId,\n dapSeq: event.seq,\n event: event.event,\n summary: `${event.event} event seq=${event.seq}`,\n };\n\n if ('body' in event) {\n return { ...cachedEvent, body: event.body };\n }\n\n return cachedEvent;\n}\n","import type { DapEventMessage } from './dapMessages.js';\n\nexport type DapLifecycleStateName = 'created' | 'initializing' | 'initialized' | 'launching' | 'attaching' | 'running' | 'stopped' | 'terminated' | 'disconnected' | 'failed';\n\nexport interface DapStoppedState {\n reason: string;\n threadId?: number;\n}\n\nexport interface DapLifecycleState {\n lifecycle: DapLifecycleStateName;\n stoppedEpoch: number;\n stopped?: DapStoppedState;\n}\n\nexport interface DapLifecycleClient {\n request<TResponse = unknown>(command: string, args?: unknown): Promise<TResponse>;\n onEvent(listener: (event: DapEventMessage) => void): () => void;\n}\n\nexport type DapLifecycleStartOptions =\n | { mode: 'launch'; initializeArgs?: unknown; launchArgs?: unknown; beforeConfigurationDone?: () => Promise<void> }\n | { mode: 'attach'; initializeArgs?: unknown; attachArgs?: unknown; beforeConfigurationDone?: () => Promise<void> };\n\nexport interface DapLifecycleStartResult {\n capabilities: unknown;\n}\n\nexport interface DapLifecycleControllerOptions {\n /** Per-stage timeout for initialize, launch/attach, the `initialized` event wait, and configurationDone. Defaults to 10_000ms. */\n handshakeTimeoutMs?: number;\n}\n\nexport type DapLifecycleHandshakeStage = 'initialize' | 'launch' | 'attach' | 'initialized-event' | 'configurationDone';\n\nexport class DapLifecycleHandshakeTimeoutError extends Error {\n public readonly stage: DapLifecycleHandshakeStage;\n public readonly timeoutMs: number;\n\n public constructor(stage: DapLifecycleHandshakeStage, timeoutMs: number) {\n super(`DAP lifecycle handshake stage '${stage}' did not complete within ${timeoutMs}ms.`);\n this.name = 'DapLifecycleHandshakeTimeoutError';\n this.stage = stage;\n this.timeoutMs = timeoutMs;\n }\n}\n\nconst DEFAULT_HANDSHAKE_TIMEOUT_MS = 10_000;\n\nexport class DapLifecycleController {\n private initializedSeen = false;\n private initializedResolver: (() => void) | undefined;\n private readonly handshakeTimeoutMs: number;\n public readonly state: DapLifecycleState = { lifecycle: 'created', stoppedEpoch: 0 };\n\n public constructor(private readonly client: DapLifecycleClient, options: DapLifecycleControllerOptions = {}) {\n this.handshakeTimeoutMs = options.handshakeTimeoutMs ?? DEFAULT_HANDSHAKE_TIMEOUT_MS;\n client.onEvent(event => this.handleEvent(event));\n }\n\n public async start(options: DapLifecycleStartOptions): Promise<DapLifecycleStartResult> {\n try {\n this.setRunningState('initializing');\n const capabilities = await this.withTimeout('initialize', this.client.request('initialize', options.initializeArgs));\n this.setRunningState('initialized');\n\n let startRequest: Promise<unknown>;\n if (options.mode === 'launch') {\n this.setRunningState('launching');\n startRequest = this.client.request('launch', options.launchArgs);\n } else {\n this.setRunningState('attaching');\n startRequest = this.client.request('attach', options.attachArgs);\n }\n\n await this.withTimeout('initialized-event', Promise.race([this.waitForInitializedEvent(), rejectWhenStartRequestFails(startRequest)]));\n await options.beforeConfigurationDone?.();\n await this.withTimeout('configurationDone', this.client.request('configurationDone'));\n // The launch/attach request is awaited last; give it its own fresh timeout window.\n // Tracking budget from issuance would be more precise but this is simpler and acceptable for handshake bounds.\n await this.withTimeout(options.mode === 'launch' ? 'launch' : 'attach', startRequest);\n await new Promise(resolve => setImmediate(resolve));\n if (this.state.lifecycle !== 'stopped' && this.state.lifecycle !== 'terminated') {\n this.setRunningState('running');\n }\n return { capabilities };\n } catch (error) {\n if (error instanceof DapLifecycleHandshakeTimeoutError) {\n this.state.lifecycle = 'failed';\n delete this.state.stopped;\n }\n throw error;\n }\n }\n\n private withTimeout<T>(stage: DapLifecycleHandshakeStage, work: Promise<T>): Promise<T> {\n let timer: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n reject(new DapLifecycleHandshakeTimeoutError(stage, this.handshakeTimeoutMs));\n }, this.handshakeTimeoutMs);\n });\n return Promise.race([work, timeoutPromise]).finally(() => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n });\n }\n\n /**\n * Plan 05-23 (gap H-8): callers can ask the adapter to terminate the\n * debuggee process tree (DAP `disconnect` body `{ terminateDebuggee: true }`).\n * Without this, `dap-cli close` left orphan browser processes from\n * stdio adapters that delegate teardown to the debuggee — see\n * `.planning/phases/05-.../05-UAT.md` H-8.\n *\n * Backwards-compatible: zero-arg call sites continue to send no body, and\n * unknown-shape callers (e.g. tests passing raw args) still flow through.\n */\n public async disconnect(opts?: unknown): Promise<void> {\n const args = normalizeDisconnectArgs(opts);\n await this.client.request('disconnect', args);\n this.setRunningState('disconnected');\n }\n\n private handleEvent(event: DapEventMessage): void {\n if (event.event === 'initialized') {\n this.initializedSeen = true;\n this.initializedResolver?.();\n this.initializedResolver = undefined;\n return;\n }\n\n if (event.event === 'stopped') {\n this.state.lifecycle = 'stopped';\n this.state.stoppedEpoch += 1;\n this.state.stopped = parseStoppedState(event.body);\n return;\n }\n\n if (event.event === 'continued') {\n this.setRunningState('running');\n return;\n }\n\n if (event.event === 'terminated') {\n this.setRunningState('terminated');\n }\n }\n\n private async waitForInitializedEvent(): Promise<void> {\n if (this.initializedSeen) {\n return;\n }\n\n await new Promise<void>(resolve => {\n this.initializedResolver = resolve;\n });\n }\n\n private setRunningState(lifecycle: DapLifecycleStateName): void {\n this.state.lifecycle = lifecycle;\n delete this.state.stopped;\n }\n}\n\nfunction parseStoppedState(body: unknown): DapStoppedState {\n if (typeof body !== 'object' || body === null) {\n return { reason: 'unknown' };\n }\n\n const reason = 'reason' in body && typeof body.reason === 'string' ? body.reason : 'unknown';\n const threadId = 'threadId' in body && typeof body.threadId === 'number' ? body.threadId : undefined;\n\n return threadId === undefined ? { reason } : { reason, threadId };\n}\n\nfunction rejectWhenStartRequestFails(startRequest: Promise<unknown>): Promise<never> {\n return startRequest.then(\n () => new Promise<never>(() => undefined),\n (error: unknown) => Promise.reject(error instanceof Error ? error : new Error(typeof error === 'string' ? error : JSON.stringify(error))),\n );\n}\n\nfunction normalizeDisconnectArgs(opts: unknown): unknown {\n if (opts === undefined) {\n return undefined;\n }\n if (typeof opts !== 'object' || opts === null) {\n return opts;\n }\n const record = opts as Record<string, unknown>;\n if ('terminateDebuggee' in record) {\n // Forward the documented option as the DAP request body. Other keys are\n // preserved verbatim so adapter-specific extensions still pass through.\n return record;\n }\n return opts;\n}\n","// This file is generated by src/generator/dapCommandRegistryGenerator.ts. Do not edit by hand.\nimport type { DebugProtocol } from '@vscode/debugprotocol';\n\nexport type DapRequestDirection = 'clientToAdapter' | 'adapterToClient';\nexport type DapGeneratedArgumentType = 'array' | 'boolean' | 'integer' | 'number' | 'object' | 'string' | 'unknown';\n\nexport interface DapGeneratedArgumentProperty {\n readonly name: string;\n readonly type: DapGeneratedArgumentType;\n readonly required: boolean;\n}\n\nexport interface DapGeneratedArgumentValidation {\n readonly argsRequired: boolean;\n readonly requiredProperties: readonly string[];\n readonly propertyTypes: readonly DapGeneratedArgumentProperty[];\n}\n\nexport interface DapGeneratedCommandMetadata {\n readonly command: string;\n readonly cliName: string;\n readonly requestType: string;\n readonly direction: DapRequestDirection;\n readonly argumentsType?: string;\n readonly capability?: keyof DebugProtocol.Capabilities;\n readonly validation: DapGeneratedArgumentValidation;\n}\n\nexport const dapGeneratedCommands = [\n { command: \"attach\", cliName: \"attach\", requestType: \"AttachRequest\", direction: \"clientToAdapter\", argumentsType: \"AttachRequestArguments\", validation: { argsRequired: true, requiredProperties: [], propertyTypes: [{ name: \"__restart\", type: \"array\", required: false }] } },\n { command: \"breakpointLocations\", cliName: \"breakpoint-locations\", requestType: \"BreakpointLocationsRequest\", direction: \"clientToAdapter\", argumentsType: \"BreakpointLocationsArguments\", capability: \"supportsBreakpointLocationsRequest\", validation: { argsRequired: false, requiredProperties: [\"line\",\"source\"], propertyTypes: [{ name: \"column\", type: \"integer\", required: false }, { name: \"endColumn\", type: \"integer\", required: false }, { name: \"endLine\", type: \"integer\", required: false }, { name: \"line\", type: \"integer\", required: true }, { name: \"source\", type: \"object\", required: true }] } },\n { command: \"cancel\", cliName: \"cancel\", requestType: \"CancelRequest\", direction: \"clientToAdapter\", argumentsType: \"CancelArguments\", capability: \"supportsCancelRequest\", validation: { argsRequired: false, requiredProperties: [], propertyTypes: [{ name: \"progressId\", type: \"string\", required: false }, { name: \"requestId\", type: \"integer\", required: false }] } },\n { command: \"completions\", cliName: \"completions\", requestType: \"CompletionsRequest\", direction: \"clientToAdapter\", argumentsType: \"CompletionsArguments\", capability: \"supportsCompletionsRequest\", validation: { argsRequired: true, requiredProperties: [\"column\",\"text\"], propertyTypes: [{ name: \"column\", type: \"integer\", required: true }, { name: \"frameId\", type: \"integer\", required: false }, { name: \"line\", type: \"integer\", required: false }, { name: \"text\", type: \"string\", required: true }] } },\n { command: \"configurationDone\", cliName: \"configuration-done\", requestType: \"ConfigurationDoneRequest\", direction: \"clientToAdapter\", argumentsType: \"ConfigurationDoneArguments\", capability: \"supportsConfigurationDoneRequest\", validation: { argsRequired: false, requiredProperties: [], propertyTypes: [] } },\n { command: \"continue\", cliName: \"continue\", requestType: \"ContinueRequest\", direction: \"clientToAdapter\", argumentsType: \"ContinueArguments\", validation: { argsRequired: true, requiredProperties: [\"threadId\"], propertyTypes: [{ name: \"singleThread\", type: \"boolean\", required: false }, { name: \"threadId\", type: \"integer\", required: true }] } },\n { command: \"dataBreakpointInfo\", cliName: \"data-breakpoint-info\", requestType: \"DataBreakpointInfoRequest\", direction: \"clientToAdapter\", argumentsType: \"DataBreakpointInfoArguments\", capability: \"supportsDataBreakpoints\", validation: { argsRequired: true, requiredProperties: [\"name\"], propertyTypes: [{ name: \"asAddress\", type: \"boolean\", required: false }, { name: \"bytes\", type: \"integer\", required: false }, { name: \"frameId\", type: \"integer\", required: false }, { name: \"mode\", type: \"string\", required: false }, { name: \"name\", type: \"string\", required: true }, { name: \"variablesReference\", type: \"integer\", required: false }] } },\n { command: \"disassemble\", cliName: \"disassemble\", requestType: \"DisassembleRequest\", direction: \"clientToAdapter\", argumentsType: \"DisassembleArguments\", capability: \"supportsDisassembleRequest\", validation: { argsRequired: true, requiredProperties: [\"instructionCount\",\"memoryReference\"], propertyTypes: [{ name: \"instructionCount\", type: \"integer\", required: true }, { name: \"instructionOffset\", type: \"integer\", required: false }, { name: \"memoryReference\", type: \"string\", required: true }, { name: \"offset\", type: \"integer\", required: false }, { name: \"resolveSymbols\", type: \"boolean\", required: false }] } },\n { command: \"disconnect\", cliName: \"disconnect\", requestType: \"DisconnectRequest\", direction: \"clientToAdapter\", argumentsType: \"DisconnectArguments\", validation: { argsRequired: false, requiredProperties: [], propertyTypes: [{ name: \"restart\", type: \"boolean\", required: false }, { name: \"suspendDebuggee\", type: \"boolean\", required: false }, { name: \"terminateDebuggee\", type: \"boolean\", required: false }] } },\n { command: \"evaluate\", cliName: \"evaluate\", requestType: \"EvaluateRequest\", direction: \"clientToAdapter\", argumentsType: \"EvaluateArguments\", validation: { argsRequired: true, requiredProperties: [\"expression\"], propertyTypes: [{ name: \"column\", type: \"integer\", required: false }, { name: \"context\", type: \"string\", required: false }, { name: \"expression\", type: \"string\", required: true }, { name: \"format\", type: \"object\", required: false }, { name: \"frameId\", type: \"integer\", required: false }, { name: \"line\", type: \"integer\", required: false }, { name: \"source\", type: \"object\", required: false }] } },\n { command: \"exceptionInfo\", cliName: \"exception-info\", requestType: \"ExceptionInfoRequest\", direction: \"clientToAdapter\", argumentsType: \"ExceptionInfoArguments\", capability: \"supportsExceptionInfoRequest\", validation: { argsRequired: true, requiredProperties: [\"threadId\"], propertyTypes: [{ name: \"threadId\", type: \"integer\", required: true }] } },\n { command: \"goto\", cliName: \"goto\", requestType: \"GotoRequest\", direction: \"clientToAdapter\", argumentsType: \"GotoArguments\", capability: \"supportsGotoTargetsRequest\", validation: { argsRequired: true, requiredProperties: [\"targetId\",\"threadId\"], propertyTypes: [{ name: \"targetId\", type: \"integer\", required: true }, { name: \"threadId\", type: \"integer\", required: true }] } },\n { command: \"gotoTargets\", cliName: \"goto-targets\", requestType: \"GotoTargetsRequest\", direction: \"clientToAdapter\", argumentsType: \"GotoTargetsArguments\", capability: \"supportsGotoTargetsRequest\", validation: { argsRequired: true, requiredProperties: [\"line\",\"source\"], propertyTypes: [{ name: \"column\", type: \"integer\", required: false }, { name: \"line\", type: \"integer\", required: true }, { name: \"source\", type: \"object\", required: true }] } },\n { command: \"initialize\", cliName: \"initialize\", requestType: \"InitializeRequest\", direction: \"clientToAdapter\", argumentsType: \"InitializeRequestArguments\", validation: { argsRequired: true, requiredProperties: [\"adapterID\"], propertyTypes: [{ name: \"adapterID\", type: \"string\", required: true }, { name: \"clientID\", type: \"string\", required: false }, { name: \"clientName\", type: \"string\", required: false }, { name: \"columnsStartAt1\", type: \"boolean\", required: false }, { name: \"linesStartAt1\", type: \"boolean\", required: false }, { name: \"locale\", type: \"string\", required: false }, { name: \"pathFormat\", type: \"string\", required: false }, { name: \"supportsANSIStyling\", type: \"boolean\", required: false }, { name: \"supportsArgsCanBeInterpretedByShell\", type: \"boolean\", required: false }, { name: \"supportsInvalidatedEvent\", type: \"boolean\", required: false }, { name: \"supportsMemoryEvent\", type: \"boolean\", required: false }, { name: \"supportsMemoryReferences\", type: \"boolean\", required: false }, { name: \"supportsProgressReporting\", type: \"boolean\", required: false }, { name: \"supportsRunInTerminalRequest\", type: \"boolean\", required: false }, { name: \"supportsStartDebuggingRequest\", type: \"boolean\", required: false }, { name: \"supportsVariablePaging\", type: \"boolean\", required: false }, { name: \"supportsVariableType\", type: \"boolean\", required: false }] } },\n { command: \"launch\", cliName: \"launch\", requestType: \"LaunchRequest\", direction: \"clientToAdapter\", argumentsType: \"LaunchRequestArguments\", validation: { argsRequired: true, requiredProperties: [], propertyTypes: [{ name: \"__restart\", type: \"array\", required: false }, { name: \"noDebug\", type: \"boolean\", required: false }] } },\n { command: \"loadedSources\", cliName: \"loaded-sources\", requestType: \"LoadedSourcesRequest\", direction: \"clientToAdapter\", argumentsType: \"LoadedSourcesArguments\", capability: \"supportsLoadedSourcesRequest\", validation: { argsRequired: false, requiredProperties: [], propertyTypes: [] } },\n { command: \"locations\", cliName: \"locations\", requestType: \"LocationsRequest\", direction: \"clientToAdapter\", argumentsType: \"LocationsArguments\", validation: { argsRequired: true, requiredProperties: [\"locationReference\"], propertyTypes: [{ name: \"locationReference\", type: \"integer\", required: true }] } },\n { command: \"modules\", cliName: \"modules\", requestType: \"ModulesRequest\", direction: \"clientToAdapter\", argumentsType: \"ModulesArguments\", capability: \"supportsModulesRequest\", validation: { argsRequired: true, requiredProperties: [], propertyTypes: [{ name: \"moduleCount\", type: \"integer\", required: false }, { name: \"startModule\", type: \"integer\", required: false }] } },\n { command: \"next\", cliName: \"next\", requestType: \"NextRequest\", direction: \"clientToAdapter\", argumentsType: \"NextArguments\", validation: { argsRequired: true, requiredProperties: [\"threadId\"], propertyTypes: [{ name: \"granularity\", type: \"object\", required: false }, { name: \"singleThread\", type: \"boolean\", required: false }, { name: \"threadId\", type: \"integer\", required: true }] } },\n { command: \"pause\", cliName: \"pause\", requestType: \"PauseRequest\", direction: \"clientToAdapter\", argumentsType: \"PauseArguments\", validation: { argsRequired: true, requiredProperties: [\"threadId\"], propertyTypes: [{ name: \"threadId\", type: \"integer\", required: true }] } },\n { command: \"readMemory\", cliName: \"read-memory\", requestType: \"ReadMemoryRequest\", direction: \"clientToAdapter\", argumentsType: \"ReadMemoryArguments\", capability: \"supportsReadMemoryRequest\", validation: { argsRequired: true, requiredProperties: [\"count\",\"memoryReference\"], propertyTypes: [{ name: \"count\", type: \"integer\", required: true }, { name: \"memoryReference\", type: \"string\", required: true }, { name: \"offset\", type: \"integer\", required: false }] } },\n { command: \"restart\", cliName: \"restart\", requestType: \"RestartRequest\", direction: \"clientToAdapter\", argumentsType: \"RestartArguments\", capability: \"supportsRestartRequest\", validation: { argsRequired: false, requiredProperties: [], propertyTypes: [{ name: \"arguments\", type: \"unknown\", required: false }] } },\n { command: \"restartFrame\", cliName: \"restart-frame\", requestType: \"RestartFrameRequest\", direction: \"clientToAdapter\", argumentsType: \"RestartFrameArguments\", capability: \"supportsRestartFrame\", validation: { argsRequired: true, requiredProperties: [\"frameId\"], propertyTypes: [{ name: \"frameId\", type: \"integer\", required: true }] } },\n { command: \"reverseContinue\", cliName: \"reverse-continue\", requestType: \"ReverseContinueRequest\", direction: \"clientToAdapter\", argumentsType: \"ReverseContinueArguments\", capability: \"supportsStepBack\", validation: { argsRequired: true, requiredProperties: [\"threadId\"], propertyTypes: [{ name: \"singleThread\", type: \"boolean\", required: false }, { name: \"threadId\", type: \"integer\", required: true }] } },\n { command: \"runInTerminal\", cliName: \"run-in-terminal\", requestType: \"RunInTerminalRequest\", direction: \"adapterToClient\", argumentsType: \"RunInTerminalRequestArguments\", validation: { argsRequired: true, requiredProperties: [\"args\",\"cwd\"], propertyTypes: [{ name: \"args\", type: \"array\", required: true }, { name: \"argsCanBeInterpretedByShell\", type: \"boolean\", required: false }, { name: \"cwd\", type: \"string\", required: true }, { name: \"env\", type: \"object\", required: false }, { name: \"kind\", type: \"string\", required: false }, { name: \"title\", type: \"string\", required: false }] } },\n { command: \"scopes\", cliName: \"scopes\", requestType: \"ScopesRequest\", direction: \"clientToAdapter\", argumentsType: \"ScopesArguments\", validation: { argsRequired: true, requiredProperties: [\"frameId\"], propertyTypes: [{ name: \"frameId\", type: \"integer\", required: true }] } },\n { command: \"setBreakpoints\", cliName: \"set-breakpoints\", requestType: \"SetBreakpointsRequest\", direction: \"clientToAdapter\", argumentsType: \"SetBreakpointsArguments\", validation: { argsRequired: true, requiredProperties: [\"source\"], propertyTypes: [{ name: \"breakpoints\", type: \"array\", required: false }, { name: \"lines\", type: \"array\", required: false }, { name: \"source\", type: \"object\", required: true }, { name: \"sourceModified\", type: \"boolean\", required: false }] } },\n { command: \"setDataBreakpoints\", cliName: \"set-data-breakpoints\", requestType: \"SetDataBreakpointsRequest\", direction: \"clientToAdapter\", argumentsType: \"SetDataBreakpointsArguments\", capability: \"supportsDataBreakpoints\", validation: { argsRequired: true, requiredProperties: [\"breakpoints\"], propertyTypes: [{ name: \"breakpoints\", type: \"array\", required: true }] } },\n { command: \"setExceptionBreakpoints\", cliName: \"set-exception-breakpoints\", requestType: \"SetExceptionBreakpointsRequest\", direction: \"clientToAdapter\", argumentsType: \"SetExceptionBreakpointsArguments\", capability: \"exceptionBreakpointFilters\", validation: { argsRequired: true, requiredProperties: [\"filters\"], propertyTypes: [{ name: \"exceptionOptions\", type: \"array\", required: false }, { name: \"filterOptions\", type: \"array\", required: false }, { name: \"filters\", type: \"array\", required: true }] } },\n { command: \"setExpression\", cliName: \"set-expression\", requestType: \"SetExpressionRequest\", direction: \"clientToAdapter\", argumentsType: \"SetExpressionArguments\", capability: \"supportsSetExpression\", validation: { argsRequired: true, requiredProperties: [\"expression\",\"value\"], propertyTypes: [{ name: \"expression\", type: \"string\", required: true }, { name: \"format\", type: \"object\", required: false }, { name: \"frameId\", type: \"integer\", required: false }, { name: \"value\", type: \"string\", required: true }] } },\n { command: \"setFunctionBreakpoints\", cliName: \"set-function-breakpoints\", requestType: \"SetFunctionBreakpointsRequest\", direction: \"clientToAdapter\", argumentsType: \"SetFunctionBreakpointsArguments\", capability: \"supportsFunctionBreakpoints\", validation: { argsRequired: true, requiredProperties: [\"breakpoints\"], propertyTypes: [{ name: \"breakpoints\", type: \"array\", required: true }] } },\n { command: \"setInstructionBreakpoints\", cliName: \"set-instruction-breakpoints\", requestType: \"SetInstructionBreakpointsRequest\", direction: \"clientToAdapter\", argumentsType: \"SetInstructionBreakpointsArguments\", capability: \"supportsInstructionBreakpoints\", validation: { argsRequired: true, requiredProperties: [\"breakpoints\"], propertyTypes: [{ name: \"breakpoints\", type: \"array\", required: true }] } },\n { command: \"setVariable\", cliName: \"set-variable\", requestType: \"SetVariableRequest\", direction: \"clientToAdapter\", argumentsType: \"SetVariableArguments\", capability: \"supportsSetVariable\", validation: { argsRequired: true, requiredProperties: [\"name\",\"value\",\"variablesReference\"], propertyTypes: [{ name: \"format\", type: \"object\", required: false }, { name: \"name\", type: \"string\", required: true }, { name: \"value\", type: \"string\", required: true }, { name: \"variablesReference\", type: \"integer\", required: true }] } },\n { command: \"source\", cliName: \"source\", requestType: \"SourceRequest\", direction: \"clientToAdapter\", argumentsType: \"SourceArguments\", validation: { argsRequired: true, requiredProperties: [\"sourceReference\"], propertyTypes: [{ name: \"source\", type: \"object\", required: false }, { name: \"sourceReference\", type: \"integer\", required: true }] } },\n { command: \"stackTrace\", cliName: \"stack-trace\", requestType: \"StackTraceRequest\", direction: \"clientToAdapter\", argumentsType: \"StackTraceArguments\", validation: { argsRequired: true, requiredProperties: [\"threadId\"], propertyTypes: [{ name: \"format\", type: \"object\", required: false }, { name: \"levels\", type: \"integer\", required: false }, { name: \"startFrame\", type: \"integer\", required: false }, { name: \"threadId\", type: \"integer\", required: true }] } },\n { command: \"startDebugging\", cliName: \"start-debugging\", requestType: \"StartDebuggingRequest\", direction: \"adapterToClient\", argumentsType: \"StartDebuggingRequestArguments\", validation: { argsRequired: true, requiredProperties: [\"configuration\",\"request\"], propertyTypes: [{ name: \"configuration\", type: \"object\", required: true }, { name: \"outputPresentation\", type: \"string\", required: false }, { name: \"request\", type: \"string\", required: true }] } },\n { command: \"stepBack\", cliName: \"step-back\", requestType: \"StepBackRequest\", direction: \"clientToAdapter\", argumentsType: \"StepBackArguments\", capability: \"supportsStepBack\", validation: { argsRequired: true, requiredProperties: [\"threadId\"], propertyTypes: [{ name: \"granularity\", type: \"object\", required: false }, { name: \"singleThread\", type: \"boolean\", required: false }, { name: \"threadId\", type: \"integer\", required: true }] } },\n { command: \"stepIn\", cliName: \"step-in\", requestType: \"StepInRequest\", direction: \"clientToAdapter\", argumentsType: \"StepInArguments\", validation: { argsRequired: true, requiredProperties: [\"threadId\"], propertyTypes: [{ name: \"granularity\", type: \"object\", required: false }, { name: \"singleThread\", type: \"boolean\", required: false }, { name: \"targetId\", type: \"integer\", required: false }, { name: \"threadId\", type: \"integer\", required: true }] } },\n { command: \"stepInTargets\", cliName: \"step-in-targets\", requestType: \"StepInTargetsRequest\", direction: \"clientToAdapter\", argumentsType: \"StepInTargetsArguments\", capability: \"supportsStepInTargetsRequest\", validation: { argsRequired: true, requiredProperties: [\"frameId\"], propertyTypes: [{ name: \"frameId\", type: \"integer\", required: true }] } },\n { command: \"stepOut\", cliName: \"step-out\", requestType: \"StepOutRequest\", direction: \"clientToAdapter\", argumentsType: \"StepOutArguments\", validation: { argsRequired: true, requiredProperties: [\"threadId\"], propertyTypes: [{ name: \"granularity\", type: \"object\", required: false }, { name: \"singleThread\", type: \"boolean\", required: false }, { name: \"threadId\", type: \"integer\", required: true }] } },\n { command: \"terminate\", cliName: \"terminate\", requestType: \"TerminateRequest\", direction: \"clientToAdapter\", argumentsType: \"TerminateArguments\", capability: \"supportsTerminateRequest\", validation: { argsRequired: false, requiredProperties: [], propertyTypes: [{ name: \"restart\", type: \"boolean\", required: false }] } },\n { command: \"terminateThreads\", cliName: \"terminate-threads\", requestType: \"TerminateThreadsRequest\", direction: \"clientToAdapter\", argumentsType: \"TerminateThreadsArguments\", capability: \"supportsTerminateThreadsRequest\", validation: { argsRequired: true, requiredProperties: [], propertyTypes: [{ name: \"threadIds\", type: \"array\", required: false }] } },\n { command: \"threads\", cliName: \"threads\", requestType: \"ThreadsRequest\", direction: \"clientToAdapter\", validation: { argsRequired: false, requiredProperties: [], propertyTypes: [] } },\n { command: \"variables\", cliName: \"variables\", requestType: \"VariablesRequest\", direction: \"clientToAdapter\", argumentsType: \"VariablesArguments\", validation: { argsRequired: true, requiredProperties: [\"variablesReference\"], propertyTypes: [{ name: \"count\", type: \"integer\", required: false }, { name: \"filter\", type: \"string\", required: false }, { name: \"format\", type: \"object\", required: false }, { name: \"start\", type: \"integer\", required: false }, { name: \"variablesReference\", type: \"integer\", required: true }] } },\n { command: \"writeMemory\", cliName: \"write-memory\", requestType: \"WriteMemoryRequest\", direction: \"clientToAdapter\", argumentsType: \"WriteMemoryArguments\", capability: \"supportsWriteMemoryRequest\", validation: { argsRequired: true, requiredProperties: [\"data\",\"memoryReference\"], propertyTypes: [{ name: \"allowPartial\", type: \"boolean\", required: false }, { name: \"data\", type: \"string\", required: true }, { name: \"memoryReference\", type: \"string\", required: true }, { name: \"offset\", type: \"integer\", required: false }] } },\n] as const satisfies readonly DapGeneratedCommandMetadata[];\n\nexport type DapGeneratedCommandRegistry = typeof dapGeneratedCommands;\n\nexport function getDapGeneratedCommand(command: string): DapGeneratedCommandMetadata | undefined {\n return dapGeneratedCommands.find(entry => entry.command === command);\n}\n","import { randomBytes } from 'node:crypto';\n\nexport type SessionId = string;\n\nexport type SessionLifecycle =\n | 'created'\n | 'adapterStarting'\n | 'transportOpen'\n | 'initializing'\n | 'initialized'\n | 'launching'\n | 'attaching'\n | 'configuring'\n | 'running'\n | 'stopped'\n | 'terminating'\n | 'terminated'\n | 'disconnected'\n | 'failed';\n\nexport type SessionStatusState = 'running' | 'stopped' | 'terminated' | 'unavailable' | 'failed';\n\n/**\n * Lifecycles that represent a session that has finished or failed and whose\n * record is eligible for cleanup. Quick task 260504-rp5 also uses this set\n * to decide when a session name is considered \"in use\" vs. available for\n * reuse, and which records to deprioritize when resolving a target by name.\n */\nexport const REMOVABLE_LIFECYCLES: ReadonlySet<SessionLifecycle> = new Set([\n 'terminated',\n 'disconnected',\n 'failed',\n]);\n\nexport interface OwnedAdapterMetadata {\n pid?: number | undefined;\n logPath?: string | undefined;\n stderrTail: readonly string[];\n startedByDapCli: boolean;\n}\n\nexport interface CompoundSessionMetadata {\n id: string;\n name: string;\n memberName: string;\n stopAll: boolean;\n members: readonly string[];\n}\n\nexport interface SessionRecord {\n id: SessionId;\n name: string;\n adapter: string;\n lifecycle: SessionLifecycle;\n createdAt: string;\n updatedAt: string;\n ownedAdapter: OwnedAdapterMetadata;\n parent_session_id?: SessionId;\n compound?: CompoundSessionMetadata;\n // Hand-driven gap H-1 (plan 05-17): mirror DAP `stopped`/`continued` event\n // state so `dap-cli status` can report paused-vs-running without polling\n // events. Absence (undefined) means \"unknown\"; explicit `false` means\n // \"we observed continued/terminated and know this is not paused\".\n paused?: boolean;\n stoppedReason?: string;\n stoppedThreadIds?: readonly number[];\n}\n\nexport interface SessionSummary {\n id: SessionId;\n name: string;\n adapter: string;\n lifecycle: SessionLifecycle;\n status: SessionStatusState;\n updatedAt: string;\n parent_session_id?: SessionId;\n compound?: CompoundSessionMetadata;\n // Plan 05-19 (gap H-3): explicit `targetable: false` is set on child\n // sessions because the parent owns the bp registry, threads, and event\n // stream in js-debug pwa-chrome. Absence === targetable. Children stay\n // visible (with --show-children) for diagnostics; targeting them via\n // --name returns child_session_not_targetable, not session_unavailable.\n targetable?: boolean;\n // Hand-driven gap H-1c (round 3): mirror the paused projection on the\n // list view too so `sessions` can show paused state per session at a\n // glance, not just `status` for a single session. Same semantics as\n // SessionRecord.paused (absent === unknown, false === observed running).\n paused?: boolean;\n stoppedReason?: string;\n stoppedThreadIds?: readonly number[];\n}\n\nexport interface SessionStatus extends SessionSummary {\n logPath?: string;\n stderrTail: readonly string[];\n cleanupActions: readonly string[];\n // SessionSummary already declares `targetable?: boolean` (plan 05-19);\n // it surfaces here too because projectSessionStatus spreads the summary.\n // Mirrored from SessionRecord — see SessionRecord for semantics (gap H-1).\n paused?: boolean;\n stoppedReason?: string;\n stoppedThreadIds?: readonly number[];\n}\n\nexport function createSessionId(): SessionId {\n return `sess_${randomBytes(12).toString('base64url')}`;\n}\n\nexport function projectSessionSummary(session: SessionRecord): SessionSummary {\n const summary: SessionSummary = {\n id: session.id,\n name: session.name,\n adapter: session.adapter,\n lifecycle: session.lifecycle,\n status: projectSummaryStatus(session),\n updatedAt: session.updatedAt,\n };\n let result = session.parent_session_id !== undefined\n ? { ...summary, parent_session_id: session.parent_session_id, targetable: false }\n : summary;\n // Hand-driven gap H-1c (round 3): mirror paused projection into the\n // list view too. Conditional spread so absent === unknown.\n if (session.paused !== undefined) {\n result = { ...result, paused: session.paused };\n }\n if (session.stoppedReason !== undefined) {\n result = { ...result, stoppedReason: session.stoppedReason };\n }\n if (session.stoppedThreadIds !== undefined) {\n result = { ...result, stoppedThreadIds: session.stoppedThreadIds };\n }\n if (session.compound !== undefined) {\n result = { ...result, compound: session.compound };\n }\n return result;\n}\n\nexport function projectSessionStatus(session: SessionRecord): SessionStatus {\n // Hand-driven gap H-1c (round 3): paused fields are projected by\n // projectSessionSummary now, so they flow through here automatically.\n const summary = projectSessionSummary(session);\n let status: SessionStatus = {\n ...summary,\n stderrTail: session.ownedAdapter.stderrTail,\n cleanupActions: createCleanupActions(session),\n };\n\n if (session.ownedAdapter.logPath !== undefined) {\n status = { ...status, logPath: session.ownedAdapter.logPath };\n }\n\n return status;\n}\n\n// Phase 11 plan 01: status reflects mirrored `paused` for non-terminal lifecycles\n// so child-event mirrors (js-debug pwa-node/pwa-chrome) project status: 'stopped'\n// even though parent lifecycle stays 'running'. Terminal lifecycles always win.\nfunction projectSummaryStatus(session: SessionRecord): SessionStatusState {\n const fromLifecycle = projectStatusState(session.lifecycle);\n if (fromLifecycle === 'failed' || fromLifecycle === 'terminated') {\n return fromLifecycle;\n }\n if (session.paused === true) {\n return 'stopped';\n }\n return fromLifecycle;\n}\n\nfunction projectStatusState(lifecycle: SessionLifecycle): SessionStatusState {\n if (lifecycle === 'failed') {\n return 'failed';\n }\n\n if (lifecycle === 'stopped') {\n return 'stopped';\n }\n\n if (lifecycle === 'terminated' || lifecycle === 'disconnected') {\n return 'terminated';\n }\n\n if (lifecycle === 'created') {\n return 'unavailable';\n }\n\n return 'running';\n}\n\nfunction createCleanupActions(session: SessionRecord): readonly string[] {\n if (!session.ownedAdapter.startedByDapCli) {\n return ['Adapter process is not owned by dap-cli; close the session state without signaling the process.'];\n }\n\n if (session.ownedAdapter.pid === undefined) {\n return ['No owned adapter pid is available; close stale session state.'];\n }\n\n return [`Signal owned adapter pid ${session.ownedAdapter.pid} if cleanup is required.`];\n}\n","import { sessionError } from '../cli/errors.js';\nimport { projectSessionSummary, REMOVABLE_LIFECYCLES, type SessionRecord } from './session.js';\n\nexport interface ResolveTargetSessionOptions {\n explicitSessionId?: string | undefined;\n activeSessionId?: string | undefined;\n sessions: readonly SessionRecord[];\n requireAvailable?: boolean;\n}\n\nexport function resolveTargetSession(options: ResolveTargetSessionOptions): SessionRecord {\n if (options.sessions.length === 0) {\n throw sessionError('No debug sessions are known.', { code: 'no_sessions', diagnostics: ['Launch or attach a session before targeting one.'] });\n }\n\n const targetId = options.explicitSessionId ?? options.activeSessionId;\n if (targetId === undefined) {\n throw sessionError('No active debug session is selected.', { code: 'no_active_session', diagnostics: ['Run `dap-cli use <name>` or pass --name <name>.'] });\n }\n\n const allMatches = options.sessions.filter(session => session.id === targetId || session.name === targetId);\n if (allMatches.length === 0) {\n throw sessionError(`Session not found: ${targetId}`, { code: 'session_not_found', diagnostics: ['Use `dap-cli sessions` to list available sessions.'] });\n }\n\n // When the target is a name (not an id), prefer live records over\n // terminated ones so a re-launched same-named session shadows its\n // terminated predecessor. Quick task 260504-rp5 also blocks creating two\n // live sessions with the same name (`session_name_in_use`), so the\n // narrowed set should be at most one in normal operation. If no live\n // matches exist, fall back to all matches so the user can still close a\n // terminated session by name.\n const isIdMatch = allMatches.some(session => session.id === targetId);\n const liveMatches = allMatches.filter(session => !REMOVABLE_LIFECYCLES.has(session.lifecycle));\n const matches = isIdMatch ? allMatches : (liveMatches.length > 0 ? liveMatches : allMatches);\n\n if (matches.length > 1) {\n throw sessionError(`Session name is ambiguous: ${targetId}`, { code: 'session_ambiguous', diagnostics: createAmbiguousSessionDiagnostics(targetId, matches) });\n }\n\n const session = matches[0];\n if (session === undefined) {\n throw sessionError(`Session not found: ${targetId}`, { code: 'session_not_found', diagnostics: ['Use `dap-cli sessions` to list available sessions.'] });\n }\n\n if (options.requireAvailable === true && projectSessionSummary(session).status === 'unavailable') {\n throw sessionError(`Session is unavailable: ${targetId}`, { code: 'session_unavailable', diagnostics: ['Close the stale session or start a new one.'] });\n }\n\n return session;\n}\n\nfunction createAmbiguousSessionDiagnostics(targetId: string, matches: readonly SessionRecord[]): readonly string[] {\n // Defensive guard. As of the duplicate-name reversal (quick task\n // 260504-rp5), `SessionManager.create` rejects name collisions with\n // `session_name_in_use`, so this branch should not be reachable through\n // the public CLI. If it ever fires, the underlying state is already\n // wrong; the diagnostic just helps the operator pick a session id.\n return [\n `Multiple sessions match '${targetId}':`,\n ...matches.map(session => {\n const summary = projectSessionSummary(session);\n return `- ${summary.id} ${summary.name} ${summary.status}`;\n }),\n 'Use one of these session IDs with --name.',\n ];\n}\n","import { promises as fs } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { getDapCliStateDir } from '../config/paths.js';\nimport type { SessionId, SessionRecord } from './session.js';\n\nexport interface SessionStoreData {\n activeSessionId?: SessionId | undefined;\n sessions: readonly SessionRecord[];\n}\n\nexport interface SessionStoreOptions {\n dapCliHome?: string | undefined;\n}\n\nconst ownedAdapterSchema = z.object({\n pid: z.number().int().positive().optional(),\n logPath: z.string().min(1).optional(),\n stderrTail: z.array(z.string()),\n startedByDapCli: z.boolean(),\n});\n\nconst compoundSessionMetadataSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n memberName: z.string().min(1),\n stopAll: z.boolean(),\n members: z.array(z.string().min(1)),\n});\n\nconst sessionRecordSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n adapter: z.string().min(1),\n lifecycle: z.enum(['created', 'adapterStarting', 'transportOpen', 'initializing', 'initialized', 'launching', 'attaching', 'configuring', 'running', 'stopped', 'terminating', 'terminated', 'disconnected', 'failed']),\n createdAt: z.string().min(1),\n updatedAt: z.string().min(1),\n ownedAdapter: ownedAdapterSchema,\n // Plan 05-04 (child sessions) — js-debug pwa-chrome multi-process\n // children carry their parent's id so the controller can route requests\n // and so 'sessions list' can hide them by default (plan 05-19, gap H-3).\n parent_session_id: z.string().min(1).optional(),\n compound: compoundSessionMetadataSchema.optional(),\n // Plan 05-17 (gap H-1) — paused projection mirrors DAP stopped/continued\n // events onto persisted SessionRecord state. Optional; absence === unknown.\n paused: z.boolean().optional(),\n stoppedReason: z.string().min(1).optional(),\n stoppedThreadIds: z.array(z.number().int()).optional(),\n});\n\nconst sessionStoreSchema = z.object({\n activeSessionId: z.string().min(1).optional(),\n sessions: z.array(sessionRecordSchema),\n});\n\nexport class SessionStore {\n private readonly storePath: string;\n\n public constructor(options: SessionStoreOptions = {}) {\n const env = options.dapCliHome === undefined ? process.env : { ...process.env, DAP_CLI_HOME: options.dapCliHome };\n this.storePath = path.join(getDapCliStateDir(env), 'sessions.json');\n }\n\n public get path(): string {\n return this.storePath;\n }\n\n public async read(): Promise<SessionStoreData> {\n try {\n const raw = await fs.readFile(this.storePath, 'utf8');\n const parsed = sessionStoreSchema.parse(JSON.parse(raw));\n // zod's `.optional()` produces `T | undefined`, but SessionRecord uses\n // `exactOptionalPropertyTypes: true` strict optional shape (`key?: T`,\n // never `T | undefined`). Strip undefined keys so the schema output\n // assigns cleanly without a cast or widening the record type.\n return {\n ...(parsed.activeSessionId !== undefined ? { activeSessionId: parsed.activeSessionId } : {}),\n sessions: parsed.sessions.map(stripUndefinedKeys) as readonly SessionRecord[],\n };\n } catch (error) {\n if (isNodeError(error) && error.code === 'ENOENT') {\n return { sessions: [] };\n }\n\n // Round 6 R6-F: a corrupt or junk sessions.json (truncated write,\n // hand-edited, partial disk failure) previously crashed\n // `serve-controller` with an opaque internal_error/exit-70 and the\n // parent `start` then timed out with `controller_unavailable` — the\n // user had no idea their state file was the cause. Rename the bad\n // file out of the way and continue with empty state so the user is\n // self-healing; emit a one-line warning to stderr so the move is\n // discoverable.\n if (error instanceof SyntaxError || error instanceof z.ZodError) {\n const backupPath = `${this.storePath}.corrupt.${new Date().toISOString().replace(/[:.]/g, '-')}.bak`;\n try {\n await fs.rename(this.storePath, backupPath);\n process.stderr.write(`dap-cli: sessions.json was unparseable; moved to ${backupPath} and continuing with empty state.\\n`);\n } catch {\n // If rename fails (e.g. permissions), still return empty so the\n // controller can come up; the next write will overwrite.\n }\n return { sessions: [] };\n }\n\n throw error;\n }\n }\n\n public async write(data: SessionStoreData): Promise<void> {\n await fs.mkdir(path.dirname(this.storePath), { recursive: true });\n const validated = sessionStoreSchema.parse(data);\n const tempPath = `${this.storePath}.${process.pid}.${randomUUID()}.tmp`;\n await fs.writeFile(tempPath, `${JSON.stringify(validated, null, 2)}\\n`, 'utf8');\n await fs.rename(tempPath, this.storePath);\n }\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error;\n}\n\nfunction stripUndefinedKeys<T extends object>(value: T): T {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n if (val !== undefined) {\n result[key] = val;\n }\n }\n return result as T;\n}\n","import { resolveTargetSession } from './activeSession.js';\nimport { sessionError } from '../cli/errors.js';\nimport { createSessionId, projectSessionStatus, projectSessionSummary, REMOVABLE_LIFECYCLES, type CompoundSessionMetadata, type OwnedAdapterMetadata, type SessionId, type SessionLifecycle, type SessionRecord, type SessionStatus, type SessionSummary } from './session.js';\nimport { SessionStore, type SessionStoreData } from './sessionStore.js';\n\nexport interface CreateSessionOptions {\n name: string;\n adapter?: string;\n lifecycle?: SessionLifecycle;\n ownedAdapter?: Partial<OwnedAdapterMetadata>;\n compound?: CompoundSessionMetadata;\n makeActive?: boolean;\n}\n\nexport interface RegisterChildSessionOptions extends CreateSessionOptions {\n parent_session_id: SessionId;\n}\n\nexport interface SessionManagerOptions {\n dapCliHome?: string | undefined;\n signalProcess?: (pid: number, signal: NodeJS.Signals) => void;\n}\n\n/**\n * Plan 05-20 (gap H-4): cleanup MUST be honest about what it actually did.\n * The old `{ cleaned, failed }` envelope conflated \"we signaled an adapter\"\n * with \"we removed a record\" with \"we did nothing because the record is still\n * live\". Hand-driven Sequence A Step 8 evidence: `cleanup` reported\n * `cleaned: [<id>]` but `sessions list` still showed the session.\n *\n * New shape:\n * - `signaledAdapter`: session ids whose owned adapter pid we signaled\n * (whether SIGTERM succeeded or returned ESRCH because the process was\n * already dead).\n * - `removedRecords`: session ids whose persisted record was removed.\n * - `keptRunning`: session ids we deliberately did NOT touch (no signal,\n * no removal) because the lifecycle is still in flight or the adapter\n * pid is still alive. Each entry carries a structured `reason` so the\n * caller can decide whether to re-run with `--purge`.\n * - `failed`: signaling failures (non-ESRCH errors). These do NOT also\n * appear in keptRunning — failed and keptRunning are mutually exclusive.\n */\nexport type CleanupKeptReason = 'adapter_alive' | 'lifecycle_running' | 'lifecycle_attaching';\n\nexport interface CleanupKeptRunning {\n sessionId: string;\n reason: CleanupKeptReason;\n}\n\nexport interface CleanupResult {\n signaledAdapter: readonly string[];\n removedRecords: readonly string[];\n keptRunning: readonly CleanupKeptRunning[];\n failed: readonly SessionCleanupFailure[];\n}\n\nexport interface SessionCleanupFailure {\n sessionId: string;\n logPath?: string;\n stderrTail: readonly string[];\n actions: readonly string[];\n message: string;\n}\n\nexport class SessionManager {\n private data: SessionStoreData = { sessions: [] };\n\n private constructor(private readonly store: SessionStore, private readonly signalProcess: (pid: number, signal: NodeJS.Signals) => void) {}\n\n public static async create(options: SessionManagerOptions = {}): Promise<SessionManager> {\n const manager = new SessionManager(new SessionStore({ dapCliHome: options.dapCliHome }), options.signalProcess ?? ((pid, signal) => process.kill(pid, signal)));\n manager.data = await manager.store.read();\n return manager;\n }\n\n /**\n * List sessions. By default, child sessions (records with a non-undefined\n * `parent_session_id`) are filtered out — they are owned by their parent\n * (e.g. js-debug pwa-chrome's bp registry / threads / event stream live on\n * the parent) and cannot be targeted directly from the public CLI. Pass\n * `{ includeChildren: true }` to surface them for diagnostics; their\n * summaries carry `targetable: false`. Plan 05-19 (gap H-3 closure).\n */\n public list(opts: { includeChildren?: boolean } = {}): readonly SessionSummary[] {\n const includeChildren = opts.includeChildren === true;\n const sessions = includeChildren\n ? this.data.sessions\n : this.data.sessions.filter(session => session.parent_session_id === undefined);\n return sessions.map(projectSessionSummary);\n }\n\n public status(target?: string): SessionStatus {\n return projectSessionStatus(this.target(target, false));\n }\n\n public async create(options: CreateSessionOptions): Promise<SessionStatus> {\n // Reject collisions with an in-use name. A previous design supported\n // multiple persisted sessions sharing a `--name` and disambiguated at\n // target time (`session_ambiguous`). The product behavior we actually\n // want is simpler: a new session with the same name as an existing\n // non-terminated session is an error. Reuse against terminated/failed\n // records is allowed — closed sessions should not block a new launch.\n // Children (`registerChild`) are exempt: they have their own\n // `parent#cdp-target-id` naming and aren't user-targetable.\n const collision = this.data.sessions.find(\n candidate =>\n candidate.parent_session_id === undefined &&\n candidate.name === options.name &&\n !REMOVABLE_LIFECYCLES.has(candidate.lifecycle),\n );\n if (collision !== undefined) {\n throw sessionError(`Session name already in use: ${options.name}`, {\n code: 'session_name_in_use',\n diagnostics: [\n `Session ${collision.id} (${collision.lifecycle}) is already using the name '${options.name}'.`,\n `Run \\`dap-cli close ${options.name}\\` to release the name, or relaunch with a different --name.`,\n ],\n });\n }\n\n const session = this.buildSessionRecord(options);\n this.data = {\n activeSessionId: shouldMakeActive(options.makeActive, this.data.activeSessionId) ? session.id : this.data.activeSessionId,\n sessions: [...this.data.sessions, session],\n };\n await this.persist();\n return projectSessionStatus(session);\n }\n\n public async registerChild(options: RegisterChildSessionOptions): Promise<SessionStatus> {\n const parent = this.data.sessions.find(candidate => candidate.id === options.parent_session_id);\n if (parent === undefined) {\n throw sessionError(`Parent session not found: ${options.parent_session_id}`, {\n code: 'parent_not_found',\n diagnostics: [\n `No session with id ${options.parent_session_id} is registered.`,\n 'Open the parent session before registering child sessions against it.',\n ],\n });\n }\n const child: SessionRecord = {\n ...this.buildSessionRecord(options),\n parent_session_id: options.parent_session_id,\n };\n // Child registration never steals active focus from the parent — children are\n // implementation detail of pwa-chrome multiplexing, not user-targeted sessions.\n this.data = {\n ...this.data,\n sessions: [...this.data.sessions, child],\n };\n await this.persist();\n return projectSessionStatus(child);\n }\n\n public listChildren(parentId: SessionId): readonly SessionSummary[] {\n return this.data.sessions\n .filter(session => session.parent_session_id === parentId)\n .map(projectSessionSummary);\n }\n\n public async targetSession(target: string): Promise<SessionStatus> {\n const session = this.target(target, false);\n this.data = { ...this.data, activeSessionId: session.id };\n await this.persist();\n return projectSessionStatus(session);\n }\n\n public async updateLifecycle(target: string, lifecycle: SessionLifecycle): Promise<SessionStatus> {\n const session = this.target(target, false);\n const updated = { ...session, lifecycle, updatedAt: new Date().toISOString() };\n await this.replaceSession(updated);\n return projectSessionStatus(updated);\n }\n\n /**\n * Mirror DAP `stopped`/`continued`/`terminated` event state onto the\n * persisted SessionRecord so `dap-cli status` can report paused-vs-running\n * without polling events. Hand-driven gap H-1 closure (plan 05-17, see\n * `.planning/phases/05-.../05-UAT.md`).\n *\n * - `paused: true` sets the optional `stoppedReason` and `stoppedThreadIds`\n * when provided (overwriting any previous values).\n * - `paused: false` clears `stoppedReason` and `stoppedThreadIds` to\n * undefined so consumers can tell \"we know this isn't paused\" from\n * \"we don't know\" (the latter is `paused === undefined`).\n */\n public async updatePausedState(\n target: string,\n state: { paused: boolean; stoppedReason?: string; stoppedThreadIds?: readonly number[] },\n ): Promise<SessionStatus> {\n const session = this.target(target, false);\n const updated: SessionRecord = { ...session, paused: state.paused, updatedAt: new Date().toISOString() };\n // Always clear the supporting fields first; only re-set them when paused.\n delete (updated as { stoppedReason?: string }).stoppedReason;\n delete (updated as { stoppedThreadIds?: readonly number[] }).stoppedThreadIds;\n if (state.paused) {\n if (state.stoppedReason !== undefined) {\n updated.stoppedReason = state.stoppedReason;\n }\n if (state.stoppedThreadIds !== undefined) {\n updated.stoppedThreadIds = state.stoppedThreadIds;\n }\n }\n await this.replaceSession(updated);\n return projectSessionStatus(updated);\n }\n\n public async stopSession(target?: string): Promise<SessionStatus> {\n return this.transition(target, 'terminated');\n }\n\n public async detachSession(target?: string): Promise<SessionStatus> {\n return this.transition(target, 'disconnected');\n }\n\n public async closeSession(target?: string): Promise<SessionStatus> {\n const session = this.target(target, false);\n const childIds = this.data.sessions\n .filter(candidate => candidate.parent_session_id === session.id)\n .map(child => child.id);\n const removedIds = new Set<string>([session.id, ...childIds]);\n this.data = {\n activeSessionId: removedIds.has(this.data.activeSessionId ?? '') ? undefined : this.data.activeSessionId,\n sessions: this.data.sessions.filter(candidate => !removedIds.has(candidate.id)),\n };\n await this.persist();\n return projectSessionStatus(session);\n }\n\n public async cleanupSessions(options: { purge?: boolean } = {}): Promise<CleanupResult> {\n const signaledAdapter: string[] = [];\n const removedRecords: string[] = [];\n const keptRunning: CleanupKeptRunning[] = [];\n const failed: SessionCleanupFailure[] = [];\n const removed = new Set<string>();\n const purge = options.purge === true;\n\n for (const session of this.data.sessions) {\n const adapter = session.ownedAdapter;\n const owned = adapter.startedByDapCli === true && adapter.pid !== undefined;\n const isRemovableLifecycle = REMOVABLE_LIFECYCLES.has(session.lifecycle);\n\n if (purge) {\n // --purge: signal owned adapters and remove every record regardless\n // of lifecycle (matches prior --purge semantics so cleanup is a\n // hard reset). Signal failures still go to `failed` and skip\n // record removal so the user can investigate.\n if (owned) {\n const signalOutcome = this.signalOwnedAdapter(session, adapter.pid as number);\n if (signalOutcome === 'failed_other') {\n failed.push(createCleanupFailure(session, this.lastSignalError));\n continue;\n }\n signaledAdapter.push(session.id);\n }\n removedRecords.push(session.id);\n removed.add(session.id);\n continue;\n }\n\n // Plain cleanup: only act on sessions that are safe to reclaim.\n if (owned) {\n // Owned: try to signal — on success or ESRCH (already dead) we\n // also remove the record. The adapter is dap-cli-owned so killing\n // it is in scope. Non-ESRCH errors land in `failed` (no removal).\n const signalOutcome = this.signalOwnedAdapter(session, adapter.pid as number);\n if (signalOutcome === 'failed_other') {\n failed.push(createCleanupFailure(session, this.lastSignalError));\n continue;\n }\n signaledAdapter.push(session.id);\n removedRecords.push(session.id);\n removed.add(session.id);\n continue;\n }\n\n // Unowned: only remove the record if the lifecycle says it's done.\n // Otherwise keep it and surface a structured reason so the caller\n // can decide whether to re-run with --purge.\n if (isRemovableLifecycle) {\n removedRecords.push(session.id);\n removed.add(session.id);\n continue;\n }\n\n keptRunning.push({ sessionId: session.id, reason: this.deriveKeptReason(session) });\n }\n\n if (removed.size > 0) {\n const remaining = this.data.sessions.filter(session => !removed.has(session.id));\n const activeSessionId = this.data.activeSessionId !== undefined && removed.has(this.data.activeSessionId)\n ? undefined\n : this.data.activeSessionId;\n this.data = activeSessionId === undefined\n ? { sessions: remaining }\n : { activeSessionId, sessions: remaining };\n await this.persist();\n }\n\n return { signaledAdapter, removedRecords, keptRunning, failed };\n }\n\n private lastSignalError: unknown = undefined;\n\n /**\n * Returns:\n * - 'signaled' on success\n * - 'esrch' when the kernel says the process no longer exists\n * - 'failed_other' on any other error (and stashes the error in\n * `lastSignalError` so the caller can attach it to a CleanupFailure)\n *\n * Plan 05-20: extracted from cleanupSessions so both the --purge and\n * plain paths share one signaling contract.\n */\n private signalOwnedAdapter(session: SessionRecord, pid: number): 'signaled' | 'esrch' | 'failed_other' {\n try {\n this.signalProcess(pid, 'SIGTERM');\n this.lastSignalError = undefined;\n return 'signaled';\n } catch (error) {\n if (isNodeError(error) && error.code === 'ESRCH') {\n this.lastSignalError = undefined;\n return 'esrch';\n }\n this.lastSignalError = error;\n return 'failed_other';\n }\n }\n\n private deriveKeptReason(session: SessionRecord): CleanupKeptReason {\n if (session.lifecycle === 'attaching') {\n return 'lifecycle_attaching';\n }\n return 'lifecycle_running';\n }\n\n private target(target: string | undefined, requireAvailable: boolean): SessionRecord {\n return resolveTargetSession({\n explicitSessionId: target,\n activeSessionId: this.data.activeSessionId,\n sessions: this.data.sessions,\n requireAvailable,\n });\n }\n\n private async transition(target: string | undefined, lifecycle: SessionLifecycle): Promise<SessionStatus> {\n const session = this.target(target, false);\n const updated = { ...session, lifecycle, updatedAt: new Date().toISOString() };\n await this.replaceSession(updated);\n return projectSessionStatus(updated);\n }\n\n private async replaceSession(updated: SessionRecord): Promise<void> {\n this.data = {\n ...this.data,\n sessions: this.data.sessions.map(session => session.id === updated.id ? updated : session),\n };\n await this.persist();\n }\n\n private async persist(): Promise<void> {\n await this.store.write(this.data);\n }\n\n private buildSessionRecord(options: CreateSessionOptions): SessionRecord {\n const now = new Date().toISOString();\n const session: SessionRecord = {\n id: createSessionId(),\n name: options.name,\n adapter: options.adapter ?? 'unknown',\n lifecycle: options.lifecycle ?? 'created',\n createdAt: now,\n updatedAt: now,\n ownedAdapter: {\n stderrTail: options.ownedAdapter?.stderrTail ?? [],\n startedByDapCli: options.ownedAdapter?.startedByDapCli ?? false,\n ...optionalOwnedAdapterFields(options.ownedAdapter),\n },\n };\n if (options.compound !== undefined) {\n session.compound = options.compound;\n }\n return session;\n }\n}\n\nfunction shouldMakeActive(makeActive: boolean | undefined, activeSessionId: string | undefined): boolean {\n if (makeActive !== undefined) {\n return makeActive;\n }\n\n return activeSessionId === undefined;\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error;\n}\n\nfunction optionalOwnedAdapterFields(adapter: Partial<OwnedAdapterMetadata> | undefined): Partial<OwnedAdapterMetadata> {\n const fields: Partial<OwnedAdapterMetadata> = {};\n if (adapter?.pid !== undefined) {\n fields.pid = adapter.pid;\n }\n if (adapter?.logPath !== undefined) {\n fields.logPath = adapter.logPath;\n }\n return fields;\n}\n\nfunction createCleanupFailure(session: SessionRecord, error: unknown): SessionCleanupFailure {\n const failure: SessionCleanupFailure = {\n sessionId: session.id,\n stderrTail: session.ownedAdapter.stderrTail,\n actions: [`Check the adapter process manually and then run \\`dap-cli close ${session.id}\\` for this session.`],\n message: error instanceof Error ? error.message : 'Cleanup failed.',\n };\n\n if (session.ownedAdapter.logPath !== undefined) {\n return { ...failure, logPath: session.ownedAdapter.logPath };\n }\n\n return failure;\n}\n","/**\n * Project a DAP `stopped` event body into the shape SessionManager.updatePausedState\n * expects. Coerces untrusted adapter input (T-05-17-01): reason becomes a string,\n * threadId is only honored when it's an integer. When `allThreadsStopped` is true\n * (or no specific threadId is reported), `stoppedThreadIds` is `[]`.\n *\n * Extracted from `server.ts` (plan 05-25) so both the parent-direct event handler\n * (`server.ts`, debugpy / fake adapter) and the child-mirror handler\n * (`childSessions.ts`, js-debug pwa-node / pwa-chrome) share one coercion contract.\n */\nexport function derivePausedStateFromStopped(body: unknown): { paused: true; stoppedReason: string; stoppedThreadIds: readonly number[] } {\n const record = isRecord(body) ? body : undefined;\n const reasonRaw = record?.reason;\n const stoppedReason = typeof reasonRaw === 'string' ? reasonRaw : 'unknown';\n const allThreadsStopped = record?.allThreadsStopped === true;\n const threadIdRaw = record?.threadId;\n const stoppedThreadIds: readonly number[] = !allThreadsStopped && typeof threadIdRaw === 'number' && Number.isInteger(threadIdRaw)\n ? [threadIdRaw]\n : [];\n return { paused: true, stoppedReason, stoppedThreadIds };\n}\n\n/**\n * Snapshot of a single child's paused-state inputs. See\n * {@link combineChildPausedStates}.\n */\nexport interface ChildPausedSnapshot {\n stoppedThreadIds: ReadonlySet<number>;\n allThreadsStopped: boolean;\n knownThreadIds: ReadonlySet<number>;\n lifecycleEnded: boolean;\n lastStoppedReason: string | undefined;\n}\n\n/**\n * Combine per-child paused-state snapshots into the parent SessionRecord's\n * paused-state shape. Phase 18 fixes the pre-existing \"last child event wins\"\n * mirror in `childSessions.ts` that let a sibling's `terminated` clobber a\n * real `stopped` (S-02 root cause). The union here is the contract the\n * parent's status reflects: paused iff ANY non-terminated child is stopped,\n * with `stoppedThreadIds` = union of stopped thread ids across those\n * children, and `stoppedReason` = the most recently observed reason among\n * children that are currently stopped.\n *\n * `allThreadsStopped` snapshots are expanded to the child's `knownThreadIds`\n * at union time so the parent surfaces every paused thread even when the\n * child reported \"all stopped\" without enumerating ids.\n */\nexport function combineChildPausedStates(snapshots: Iterable<ChildPausedSnapshot>):\n | { paused: false }\n | { paused: true; stoppedReason: string; stoppedThreadIds: readonly number[] } {\n const stopped = new Set<number>();\n let lastReason: string | undefined;\n for (const snapshot of snapshots) {\n if (snapshot.lifecycleEnded) {\n continue;\n }\n let childContributed = false;\n if (snapshot.allThreadsStopped) {\n for (const id of snapshot.knownThreadIds) {\n stopped.add(id);\n childContributed = true;\n }\n } else {\n for (const id of snapshot.stoppedThreadIds) {\n stopped.add(id);\n childContributed = true;\n }\n }\n if (snapshot.lastStoppedReason !== undefined && childContributed) {\n lastReason = snapshot.lastStoppedReason;\n }\n }\n if (stopped.size === 0) {\n return { paused: false };\n }\n return { paused: true, stoppedReason: lastReason ?? 'unknown', stoppedThreadIds: [...stopped] };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n","import type { DapEventCache } from '../protocol/eventCache.js';\nimport { breakpointBindingGuidance, threadNotPaused } from './diagnostics.js';\nimport type { DapEventMessage } from '../protocol/dapMessages.js';\nimport type { DapTransport } from '../protocol/transport.js';\nimport { DapClient, type ReverseRequestResult } from '../protocol/dapClient.js';\nimport { sessionError } from '../cli/errors.js';\nimport type { OwnedAdapterMetadata, SessionId } from '../sessions/session.js';\nimport type { SessionManager } from '../sessions/sessionManager.js';\nimport { combineChildPausedStates } from './pausedState.js';\n\nexport type OpenChildTransport = (name: string) => Promise<DapTransport>;\nexport type CreateChildClient = (transport: DapTransport) => DapClient;\n\nexport interface ChildSessionCoordinatorOptions {\n parentSessionId: SessionId;\n parentName: string;\n parentClient: DapClient;\n adapterId: string;\n ownedAdapter: OwnedAdapterMetadata;\n sessionManager: SessionManager;\n parentEventCache: DapEventCache;\n openChildTransport: OpenChildTransport;\n /** Test seam — defaults to `transport => new DapClient(transport, { requestTimeoutMs: 30_000 })`. */\n createChildClient?: CreateChildClient;\n /**\n * Override the verification timeout for js-debug `setBreakpoints`. Defaults\n * to 5_000ms. Tests use a small value so the verification-timeout path runs\n * fast. See {@link ChildSessionCoordinator.routeSetBreakpointsThroughParent}.\n */\n setBreakpointsVerificationTimeoutMs?: number;\n /**\n * Override the per-child readiness wait used by setBreakpoints fan-out.\n * Defaults to 3_000ms — kept under the 5s controller IPC budget so a child\n * stuck mid-handshake (e.g. a js-debug attach to an Electron utility\n * process whose user-code target never completes `configurationDone`) does\n * not hang the whole request to `controller_request_timeout`. On timeout,\n * still-pending children surface as `child_readiness_timeout` warnings on\n * the response. See Phase 17 S-08 findings (17-S08-FINDINGS.md, Bug 1).\n */\n awaitChildrenReadyTimeoutMs?: number;\n}\n\ninterface ChildRuntime {\n sessionId: SessionId;\n /** Registered SessionRecord name (e.g. `smoke-node#abc123`). User-visible. */\n sessionName: string;\n childIndex: number;\n client: DapClient;\n /**\n * Real thread ids known to live on this child. Populated from\n * (a) every `threads` response, (b) DAP `thread` events\n * (`reason: 'started'` adds, `reason: 'exited'` removes), and\n * (c) `stopped` event `threadId` (additive — paused threads must be\n * discoverable). Used by {@link ChildSessionCoordinator.findChildOwningThread}\n * to route thread-scoped commands by REAL child thread id (no remap).\n */\n knownThreadIds: Set<number>;\n /** Most recently observed `name` per thread id (filled from `threads` responses). */\n threadNames: Map<number, string>;\n /**\n * Per-child paused-thread set. Populated from this child's own `stopped`\n * (additive) and `continued` (removes) events. Combined across all\n * non-{@link lifecycleEnded} children by\n * {@link ChildSessionCoordinator.recomputeParentPausedState} into the\n * parent SessionRecord's paused state — replaces the pre-Phase-18\n * \"last child event wins\" mirror that let a sibling's `terminated`\n * clobber a real `stopped` (S-02 root cause).\n */\n stoppedThreadIds: Set<number>;\n /** True after `stopped { allThreadsStopped: true }`; cleared on a matching all-threads continue, threadless continued, or terminated. */\n allThreadsStopped: boolean;\n /** True after `terminated` or `exited` — child's threads are excluded from paused-state union and routing. */\n lifecycleEnded: boolean;\n /** Most recently observed `stopped.reason` for this child (used to pick the parent-level `stoppedReason`). */\n lastStoppedReason: string | undefined;\n /** frameIds that came from this child (so stack/scopes/variables route back here). */\n frameIds: Set<number>;\n /** variablesReferences that came from this child. */\n variableReferences: Set<number>;\n /** sourceReferences that came from this child. */\n sourceReferences: Set<number>;\n /** Resolves once the child adapter emits `initialized`. */\n initializedPromise: Promise<void>;\n initializedSeen: boolean;\n /**\n * Resolves once the child has completed its full handshake (initialize →\n * initialized → setBreakpoints replay → configurationDone → launch/attach\n * response → lifecycle 'running'). Rejects if the child fails before\n * reaching that state. Used by {@link ChildSessionCoordinator.awaitChildrenReady}\n * to gate fan-out commands like `setBreakpoints` on per-child readiness.\n */\n readyPromise: Promise<void>;\n readySeen: boolean;\n resolveReady: () => void;\n rejectReady: (error: unknown) => void;\n}\n\nconst pausedRequiredRoutedCommands: ReadonlySet<string> = new Set([\n 'stackTrace',\n 'scopes',\n 'variables',\n]);\n\ninterface InterceptedRequest {\n value: unknown;\n}\n\nconst ROUTABLE_COMMANDS = new Set([\n 'threads',\n 'stackTrace',\n 'scopes',\n 'variables',\n 'continue',\n 'next',\n 'stepIn',\n 'stepOut',\n 'pause',\n 'evaluate',\n 'setBreakpoints',\n 'source',\n // Plan 05-26 (gap H-3a): goto is threadId-scoped; setVariable is\n // variablesReference-scoped. Both flow through the parent-name routing\n // layer so users never have to type a child name.\n 'goto',\n 'setVariable',\n]);\n\nexport class ChildSessionCoordinator {\n private readonly children = new Map<SessionId, ChildRuntime>();\n private readonly pendingSetBreakpoints: unknown[] = [];\n private readonly breakpointEventSinks = new Set<(event: DapEventMessage) => void>();\n private childCounter = 0;\n private readonly detachHandlers = new Set<() => void>();\n private readonly bringUps: Promise<unknown>[] = [];\n private readonly activeHandlers: Promise<unknown>[] = [];\n private disposed = false;\n\n public constructor(private readonly options: ChildSessionCoordinatorOptions) {}\n\n public attach(): void {\n this.installStartDebuggingHandler(this.options.parentClient);\n }\n\n /**\n * Install a `startDebugging` reverse-request handler on the given DAP\n * client and remember its detach function so {@link dispose} can clean up.\n *\n * Installed on the **parent** during {@link attach}, AND on every child as\n * it is brought up in {@link handleStartDebugging}. pwa-chrome's session\n * model nests parent → browser-level wrapper → page-level session — without\n * installing the handler on each child, grandchild page sessions are never\n * observed by the controller and `setBreakpoints` fan-out misses the\n * session that actually owns the parsed scripts (returning the\n * DAP-spec-violating `{ breakpoints: [] }` from the wrapper instead).\n *\n * Each client gets its OWN serialization chain so registration order in\n * `this.children` is deterministic per source client. All handler promises\n * are pushed onto `this.activeHandlers` so `awaitPendingChildren()` still\n * observes them regardless of which client originated the request.\n */\n private installStartDebuggingHandler(client: DapClient): () => void {\n let chain: Promise<unknown> = Promise.resolve();\n const detach = client.onReverseRequest(request => {\n if (request.command !== 'startDebugging') {\n return undefined;\n }\n const promise = chain.then(\n () => this.handleStartDebugging(request.arguments),\n () => this.handleStartDebugging(request.arguments),\n );\n chain = promise.then(() => undefined, () => undefined);\n this.activeHandlers.push(promise.then(() => undefined, () => undefined));\n return promise;\n });\n this.detachHandlers.add(detach);\n return detach;\n }\n\n public hasChildren(): boolean {\n return this.children.size > 0;\n }\n\n public listChildSessionIds(): readonly SessionId[] {\n return [...this.children.keys()];\n }\n\n /**\n * Wait for any in-flight child bring-ups initiated via reverse requests.\n * Used by tests to deterministically observe child registration. We yield\n * first so reverse-request messages parsed on the next stream tick get a\n * chance to register their handler promises.\n */\n public async awaitPendingChildren(): Promise<void> {\n await new Promise<void>(resolve => setImmediate(resolve));\n while (this.activeHandlers.length > 0 || this.bringUps.length > 0) {\n const handlers = this.activeHandlers.splice(0, this.activeHandlers.length);\n const ups = this.bringUps.splice(0, this.bringUps.length);\n await Promise.allSettled([...handlers, ...ups]);\n await new Promise<void>(resolve => setImmediate(resolve));\n }\n }\n\n /**\n * Wait for every currently-known child to finish its handshake (or fail).\n * Uses {@link Promise.allSettled} — \"wait for them to settle one way or the\n * other,\" not \"fail if any failed.\" Callers that need to fan a request out\n * to children (notably `setBreakpoints`) should call this first so children\n * still mid-`configurationDone` are not raced.\n */\n public async awaitChildrenReady(): Promise<void> {\n await this.awaitPendingChildren();\n await Promise.allSettled([...this.children.values()].map(child => child.readyPromise));\n }\n\n /**\n * Bounded variant of {@link awaitChildrenReady}. Waits up to\n * `awaitChildrenReadyTimeoutMs` (default 3_000ms) for every currently-known\n * child to settle, then returns the list of child session ids whose\n * `readyPromise` had not yet settled at the deadline. Phase 17 S-08\n * findings (Bug 1): a js-debug attach to an Electron utility process whose\n * user-code target never completes `configurationDone` left\n * `Promise.allSettled` hanging forever, blowing the 5s controller IPC\n * budget and surfacing as `controller_request_timeout` to the agent. Bounding\n * the wait lets the request complete and surface a `child_readiness_timeout`\n * warning per stuck child.\n */\n public async awaitChildrenReadyBounded(): Promise<{ pendingChildSessionIds: SessionId[] }> {\n // Drain reverse-request handlers (which register children into\n // `this.children`) but do NOT await `bringUps` — those are exactly\n // the lifecycle promises we want to bound. A stuck handshake would\n // otherwise leave `awaitPendingChildren` hanging forever, defeating\n // the timeout below.\n await new Promise<void>(resolve => setImmediate(resolve));\n while (this.activeHandlers.length > 0) {\n const handlers = this.activeHandlers.splice(0, this.activeHandlers.length);\n await Promise.allSettled(handlers);\n await new Promise<void>(resolve => setImmediate(resolve));\n }\n const children = [...this.children.values()];\n if (children.length === 0) {\n return { pendingChildSessionIds: [] };\n }\n const timeoutMs = this.options.awaitChildrenReadyTimeoutMs ?? 3_000;\n const settled = new Set<SessionId>();\n await Promise.race([\n Promise.allSettled(children.map(child => child.readyPromise.then(\n () => settled.add(child.sessionId),\n () => settled.add(child.sessionId),\n ))),\n new Promise<void>(resolve => { setTimeout(resolve, timeoutMs).unref?.(); }),\n ]);\n return {\n pendingChildSessionIds: children\n .filter(child => !settled.has(child.sessionId))\n .map(child => child.sessionId),\n };\n }\n\n /**\n * Optionally intercept a parent-targeted DAP request when children exist.\n * Returns `undefined` for non-routable commands or when there are no children.\n */\n public async maybeIntercept(command: string, args: unknown): Promise<InterceptedRequest | undefined> {\n if (!ROUTABLE_COMMANDS.has(command)) {\n return undefined;\n }\n\n if (command === 'setBreakpoints') {\n // js-debug pwa-chrome: parent owns the provisional bp registry and\n // propagates to children internally. Sending setBreakpoints to a child\n // returns `{breakpoints: []}` (a DAP-spec violation, but observed —\n // direct DAP trace evidence in 05/deferred-items.md). Route to parent\n // and wait for the verifying `breakpoint` event. See 05-15-PLAN.md.\n if (this.options.adapterId === 'js-debug') {\n return { value: await this.routeSetBreakpointsThroughParent(args) };\n }\n if (this.children.size === 0) {\n return undefined;\n }\n return { value: await this.fanOutSetBreakpoints(args) };\n }\n\n if (this.children.size === 0) {\n return undefined;\n }\n\n if (command === 'threads') {\n return { value: await this.aggregateThreads() };\n }\n\n if (command === 'stackTrace') {\n return { value: await this.routeByThreadId('stackTrace', args, /* recordFrames */ true) };\n }\n\n if (command === 'continue' || command === 'next' || command === 'stepIn' || command === 'stepOut' || command === 'pause' || command === 'goto') {\n return { value: await this.routeByThreadId(command, args, /* recordFrames */ false) };\n }\n\n if (command === 'scopes') {\n return { value: await this.routeByFrameId(command, args) };\n }\n\n if (command === 'variables' || command === 'evaluate' || command === 'setVariable') {\n return { value: await this.routeByVariableReference(command, args) };\n }\n\n if (command === 'source') {\n return { value: await this.routeBySourceReference(command, args) };\n }\n\n return undefined;\n }\n\n public async dispose(): Promise<void> {\n this.disposed = true;\n for (const detach of this.detachHandlers) {\n try { detach(); } catch { /* ignore */ }\n }\n this.detachHandlers.clear();\n // Wait for any in-flight reverse-request handlers and child bring-ups so\n // pending session-store persists complete before callers tear down state.\n await this.awaitPendingChildren();\n const closes = [...this.children.values()].map(child => child.client.close().catch(() => undefined));\n this.children.clear();\n await Promise.all(closes);\n }\n\n /**\n * Remember initial setBreakpoints payloads that were issued before js-debug\n * created child sessions. The parent response is only provisional for real\n * pwa-node targets; child replay is what lets early source breakpoints bind\n * once the concrete target appears.\n */\n public registerInitialBreakpoints(payloads: readonly unknown[]): void {\n for (const payload of payloads) {\n this.rememberPendingSetBreakpoints(payload);\n }\n }\n\n private rememberPendingSetBreakpoints(args: unknown): void {\n const key = breakpointPayloadSourceKey(args);\n if (key === undefined) {\n this.pendingSetBreakpoints.push(args);\n return;\n }\n\n const existingIndex = this.pendingSetBreakpoints.findIndex(payload => breakpointPayloadSourceKey(payload) === key);\n if (existingIndex === -1) {\n this.pendingSetBreakpoints.push(args);\n return;\n }\n\n this.pendingSetBreakpoints[existingIndex] = args;\n }\n\n private async handleStartDebugging(args: unknown): Promise<ReverseRequestResult> {\n if (!isRecord(args)) {\n return { success: false, message: 'startDebugging arguments must be an object.' };\n }\n\n const requestMode = args.request === 'launch' ? 'launch' : 'attach';\n const configuration = isRecord(args.configuration) ? args.configuration : {};\n const targetIdSuffix = typeof configuration.__pendingTargetId === 'string'\n ? configuration.__pendingTargetId\n : undefined;\n this.childCounter += 1;\n const childIndex = this.childCounter;\n const childName = targetIdSuffix === undefined\n ? `${this.options.parentName}#${childIndex}`\n : `${this.options.parentName}#${targetIdSuffix}`;\n\n let transport: DapTransport;\n try {\n transport = await this.options.openChildTransport(childName);\n } catch (error) {\n return { success: false, message: error instanceof Error ? error.message : 'failed to open child transport' };\n }\n\n const factory = this.options.createChildClient ?? defaultCreateChildClient;\n const client = factory(transport);\n // Install the same startDebugging handler on this new child so any nested\n // startDebugging requests it issues (e.g. pwa-chrome's page-level\n // grandchildren under a browser-level wrapper) bring up further children\n // flat under the same parent. See {@link installStartDebuggingHandler}.\n this.installStartDebuggingHandler(client);\n\n let registered;\n try {\n registered = await this.options.sessionManager.registerChild({\n parent_session_id: this.options.parentSessionId,\n name: childName,\n adapter: this.options.adapterId,\n lifecycle: 'initializing',\n ownedAdapter: this.options.ownedAdapter,\n makeActive: false,\n });\n } catch (error) {\n await client.close().catch(() => undefined);\n return { success: false, message: error instanceof Error ? error.message : 'registerChild failed' };\n }\n\n const childId = registered.id;\n let resolveInitialized!: () => void;\n const initializedPromise = new Promise<void>(resolve => { resolveInitialized = resolve; });\n let resolveReady!: () => void;\n let rejectReady!: (error: unknown) => void;\n const readyPromise = new Promise<void>((resolve, reject) => {\n resolveReady = resolve;\n rejectReady = reject;\n });\n // Avoid unhandled-rejection warnings if no caller has awaited\n // `awaitChildrenReady()` before a child fails.\n readyPromise.catch(() => undefined);\n const runtime: ChildRuntime = {\n sessionId: childId,\n sessionName: childName,\n childIndex,\n client,\n knownThreadIds: new Set(),\n threadNames: new Map(),\n stoppedThreadIds: new Set(),\n allThreadsStopped: false,\n lifecycleEnded: false,\n lastStoppedReason: undefined,\n frameIds: new Set(),\n variableReferences: new Set(),\n sourceReferences: new Set(),\n initializedPromise,\n initializedSeen: false,\n readyPromise,\n readySeen: false,\n resolveReady,\n rejectReady,\n };\n this.children.set(childId, runtime);\n\n // Install initialized-event watcher BEFORE initialize so we never miss the\n // event regardless of when the adapter chooses to emit it.\n client.onEvent(event => {\n if (event.event === 'initialized' && !runtime.initializedSeen) {\n runtime.initializedSeen = true;\n resolveInitialized();\n }\n });\n client.onEvent(event => this.mirrorChildEvent(childId, event));\n // Plan 05-26 (gap H-3a): keep `knownThreadIds` live by observing child\n // `thread` and `stopped` events. The router falls back to a live\n // `threads` request only when no child cache claims the id, so keeping\n // the cache fresh from events keeps the routing fast path snappy.\n client.onEvent(event => {\n if (event.event === 'thread') {\n const body = (event as { body?: { reason?: unknown; threadId?: unknown } }).body;\n const threadId = typeof body?.threadId === 'number' ? body.threadId : undefined;\n if (threadId === undefined) {\n return;\n }\n if (body?.reason === 'exited') {\n runtime.knownThreadIds.delete(threadId);\n runtime.threadNames.delete(threadId);\n } else {\n runtime.knownThreadIds.add(threadId);\n }\n } else if (event.event === 'stopped') {\n const body = (event as { body?: { threadId?: unknown } }).body;\n if (typeof body?.threadId === 'number') {\n runtime.knownThreadIds.add(body.threadId);\n }\n }\n });\n // Plan 05-25 (H-1a/H-1b) + Phase 18: mirror child paused-state onto the\n // PARENT record. The pre-Phase-18 implementation called\n // `updatePausedState` directly per child event, which let a sibling's\n // `terminated` clobber a real `stopped` from another child (the S-02\n // root cause: bootloader child terminates after the ext-host child\n // stops, parent flips back to paused=false). Phase 18 keeps per-child\n // bookkeeping on the {@link ChildRuntime} and lets\n // {@link recomputeParentPausedState} compose the union across\n // non-terminated children. A torn-down parent surfaces inside the\n // recompute as a swallowed `session_not_found` rather than crashing\n // the child event loop.\n client.onEvent(event => {\n if (event.event === 'stopped') {\n const body = (event as { body?: { reason?: unknown; threadId?: unknown; allThreadsStopped?: unknown } }).body;\n // A child resurrecting after `terminated` (re-emitting `stopped`)\n // is a state-correctness path, not a security boundary — just\n // clear the lifecycle flag so the recompute counts it again.\n if (runtime.lifecycleEnded) {\n runtime.lifecycleEnded = false;\n }\n if (body?.allThreadsStopped === true) {\n runtime.allThreadsStopped = true;\n for (const id of runtime.knownThreadIds) {\n runtime.stoppedThreadIds.add(id);\n }\n } else if (typeof body?.threadId === 'number') {\n runtime.stoppedThreadIds.add(body.threadId);\n }\n if (typeof body?.reason === 'string') {\n runtime.lastStoppedReason = body.reason;\n }\n this.recomputeParentPausedState();\n } else if (event.event === 'continued') {\n const body = (event as { body?: { threadId?: unknown; allThreadsContinued?: unknown } }).body;\n if (body?.allThreadsContinued === true || typeof body?.threadId !== 'number') {\n runtime.stoppedThreadIds.clear();\n runtime.allThreadsStopped = false;\n } else {\n runtime.stoppedThreadIds.delete(body.threadId);\n // Single-thread continue does NOT clear `allThreadsStopped`;\n // other threads in the child may still be paused.\n }\n this.recomputeParentPausedState();\n } else if (event.event === 'terminated' || event.event === 'exited') {\n runtime.lifecycleEnded = true;\n runtime.stoppedThreadIds.clear();\n runtime.allThreadsStopped = false;\n this.recomputeParentPausedState();\n } else if (event.event === 'thread') {\n // The separate `thread` handler above maintains `knownThreadIds`;\n // here we only need to drop a thread from the per-child paused\n // set when it exits (so `recomputeParentPausedState` no longer\n // counts it).\n const body = (event as { body?: { reason?: unknown; threadId?: unknown } }).body;\n if (body?.reason === 'exited' && typeof body.threadId === 'number') {\n runtime.stoppedThreadIds.delete(body.threadId);\n this.recomputeParentPausedState();\n }\n }\n });\n\n try {\n await client.request('initialize', createInitializeArgs(this.options.adapterId));\n } catch (error) {\n await this.markChildFailed(childId, error);\n return { success: false, message: error instanceof Error ? error.message : 'child initialize failed' };\n }\n\n // Send attach/launch synchronously up to the request being dispatched, but\n // do NOT await its response here — js-debug deadlocks if we keep the\n // reverse request open while the child handshake completes. The remainder\n // of the lifecycle runs in the background; failures surface as a `failed`\n // child SessionRecord plus an `output` event mirrored into the parent's\n // event cache.\n const command = requestMode;\n const config = configuration;\n const lifecyclePromise = this.runChildLifecycle(childId, runtime, command, config);\n this.bringUps.push(lifecyclePromise.catch(() => undefined));\n\n return { success: true };\n }\n\n private async runChildLifecycle(childId: SessionId, runtime: ChildRuntime, command: 'attach' | 'launch', config: Record<string, unknown>): Promise<void> {\n const client = runtime.client;\n try {\n await this.options.sessionManager.updateLifecycle(childId, command === 'launch' ? 'launching' : 'attaching').catch(() => undefined);\n // Issue launch/attach but DO NOT await the response here — js-debug (and\n // most DAP servers) hold the launch/attach response until\n // configurationDone is received. We must send configurationDone first.\n const requestPromise = client.request(command, config);\n // Suppress unhandled-rejection in the microtask window before we await.\n requestPromise.catch(() => undefined);\n // Wait for the child's `initialized` event before configurationDone.\n await runtime.initializedPromise;\n for (const breakpointArgs of this.pendingSetBreakpoints) {\n await client.request('setBreakpoints', breakpointArgs);\n }\n await client.request('configurationDone');\n await requestPromise;\n await this.options.sessionManager.updateLifecycle(childId, 'running').catch(() => undefined);\n if (!runtime.readySeen) {\n runtime.readySeen = true;\n runtime.resolveReady();\n }\n } catch (error) {\n await this.markChildFailed(childId, error);\n }\n }\n\n private async markChildFailed(childId: SessionId, error: unknown): Promise<void> {\n await this.options.sessionManager.updateLifecycle(childId, 'failed').catch(() => undefined);\n const runtime = this.children.get(childId);\n if (runtime !== undefined && !runtime.readySeen) {\n runtime.readySeen = true;\n runtime.rejectReady(error instanceof Error ? error : new Error(String(error)));\n }\n const message = error instanceof Error ? error.message : String(error);\n const synthetic: DapEventMessage = {\n seq: 0,\n type: 'event',\n event: 'output',\n body: {\n category: 'stderr',\n output: `child session ${childId} failed: ${message}\\n`,\n child_session_id: childId,\n },\n };\n this.options.parentEventCache.append(this.options.parentSessionId, synthetic);\n }\n\n private mirrorChildEvent(childId: SessionId, event: DapEventMessage): void {\n const annotated: DapEventMessage = {\n ...event,\n body: { ...((event as { body?: Record<string, unknown> }).body ?? {}), child_session_id: childId },\n };\n this.options.parentEventCache.append(this.options.parentSessionId, annotated);\n if (event.event === 'breakpoint') {\n for (const sink of this.breakpointEventSinks) {\n sink(annotated);\n }\n }\n }\n\n /**\n * Compose the parent SessionRecord's paused-state from the union of\n * non-terminated children. Called from the per-child `stopped` /\n * `continued` / `thread` (exited) / `terminated` / `exited` handlers\n * installed in {@link handleStartDebugging}. Fire-and-forget on the\n * SessionManager write — a torn-down parent surfaces as a swallowed\n * `session_not_found`.\n */\n private recomputeParentPausedState(): void {\n const snapshots = [...this.children.values()].map(child => ({\n stoppedThreadIds: child.stoppedThreadIds,\n allThreadsStopped: child.allThreadsStopped,\n knownThreadIds: child.knownThreadIds,\n lifecycleEnded: child.lifecycleEnded,\n lastStoppedReason: child.lastStoppedReason,\n }));\n const next = combineChildPausedStates(snapshots);\n void this.options.sessionManager\n .updatePausedState(this.options.parentSessionId, next)\n .catch(() => undefined);\n }\n\n private async aggregateThreads(): Promise<{ threads: Array<{ id: number; name: string; sessionName: string }> }> {\n const result: Array<{ id: number; name: string; sessionName: string }> = [];\n for (const child of this.children.values()) {\n if (child.lifecycleEnded) {\n continue;\n }\n let response: { threads?: Array<{ id: number; name: string }> } | undefined;\n try {\n response = await child.client.request<{ threads?: Array<{ id: number; name: string }> }>('threads');\n } catch {\n continue;\n }\n for (const thread of response?.threads ?? []) {\n // Real child thread id preserved end-to-end. `sessionName` (the child\n // SessionRecord name, e.g. `smoke-node#abc123`) disambiguates when\n // two children legitimately own the same id.\n child.knownThreadIds.add(thread.id);\n if (typeof thread.name === 'string') {\n child.threadNames.set(thread.id, thread.name);\n }\n result.push({ id: thread.id, name: thread.name, sessionName: child.sessionName });\n }\n }\n return { threads: result };\n }\n\n /**\n * Fan a `setBreakpoints` request out to every child. Awaits per-child\n * readiness first ({@link awaitChildrenReady}) so children that are still\n * mid-handshake have a chance to finish before we issue the request — this\n * closes a race where a child appears in `threads` but has not yet processed\n * its own `configurationDone`.\n *\n * Per-child failures are NOT silently swallowed. Each rejected child is\n * reported as a `{ sessionId, message }` entry on a `warnings` array attached\n * to the response. The response shape stays compatible with the DAP\n * `SetBreakpointsResponse` because `warnings` is an additional optional field.\n * If every child failed, we still surface the warnings instead of returning\n * `{ breakpoints: [] }` with no diagnostic.\n */\n private async fanOutSetBreakpoints(args: unknown): Promise<unknown> {\n const { pendingChildSessionIds } = await this.awaitChildrenReadyBounded();\n type ChildBreakpointResponse = { breakpoints?: Array<{ verified?: boolean; id?: number; line?: number }> };\n type ChildResult = { sessionId: SessionId; ok: true; response: ChildBreakpointResponse } | { sessionId: SessionId; ok: false; error: unknown };\n // Phase 17 S-08 Bug 1: only fan out to children whose readyPromise has\n // settled — a still-pending child surfaces as a `child_readiness_timeout`\n // warning instead of letting its un-acked request hang the parent\n // request to controller_request_timeout.\n const pendingSet = new Set(pendingChildSessionIds);\n const readyChildren = [...this.children.values()].filter(child => !pendingSet.has(child.sessionId));\n const results: ChildResult[] = await Promise.all(\n readyChildren.map(async (child): Promise<ChildResult> => {\n try {\n const response = await child.client.request<ChildBreakpointResponse>('setBreakpoints', args);\n return { sessionId: child.sessionId, ok: true, response };\n } catch (error) {\n return { sessionId: child.sessionId, ok: false, error };\n }\n }),\n );\n\n const warnings: Array<{ sessionId: SessionId; message: string }> = results\n .filter((result): result is Extract<ChildResult, { ok: false }> => !result.ok)\n .map(result => ({\n sessionId: result.sessionId,\n message: result.error instanceof Error ? result.error.message : String(result.error),\n }));\n for (const sessionId of pendingChildSessionIds) {\n warnings.push({ sessionId, message: 'child_readiness_timeout' });\n }\n\n if (results.length === 0) {\n return warnings.length > 0 ? { breakpoints: [], warnings } : { breakpoints: [] };\n }\n\n const successes = results.filter((result): result is Extract<ChildResult, { ok: true }> => result.ok);\n const responsesWithBody = successes.map(result => result.response);\n // Prefer a response whose breakpoints array is non-empty over one that\n // returned `breakpoints: []`. With recursive child registration (plan\n // 05-14) intermediate pwa-chrome wrappers come up as siblings of the\n // page-level session that owns the parsed scripts; the wrapper\n // legitimately returns `[]` because the source isn't loaded there, while\n // the page child returns the real verified array. Picking the first\n // *defined* response would surface the empty wrapper response and mask\n // the page child's result.\n const firstWithBreakpoints = responsesWithBody.find(response => response.breakpoints !== undefined && response.breakpoints.length > 0)\n ?? responsesWithBody.find(response => response.breakpoints !== undefined);\n\n if (firstWithBreakpoints === undefined) {\n // Every child either failed or returned no `breakpoints` field. Surface\n // warnings (if any) so the caller sees what went wrong instead of an\n // empty success.\n return warnings.length > 0 ? { breakpoints: [], warnings } : { breakpoints: [] };\n }\n\n const breakpoints = (firstWithBreakpoints.breakpoints ?? []).map((bp, index) => {\n const anyVerified = responsesWithBody.some(response => response.breakpoints?.[index]?.verified === true);\n return { ...bp, verified: anyVerified || bp.verified === true };\n });\n return warnings.length > 0 ? { breakpoints, warnings } : { breakpoints };\n }\n\n /**\n * js-debug pwa-chrome routing for setBreakpoints. The parent owns the\n * provisional bp registry and propagates internally to children — sending\n * setBreakpoints ONLY to children misses the registry update and races\n * with future child bring-ups (direct DAP trace evidence in\n * `.planning/phases/05-.../deferred-items.md`). We therefore:\n *\n * 1. Subscribe to parent `breakpoint` events BEFORE issuing the request\n * so we never miss the verifying event.\n * 2. Issue `setBreakpoints` to the parent (primary, per plan 05-15) so\n * its registry is updated and propagates to current and future\n * children. The provisional response shape is\n * `{breakpoints:[{verified:false, message, line, id}]}`.\n * 3. In parallel, fan out to children so we can harvest verification\n * state directly from any child whose script is already parsed —\n * this is a deviation from plan 05-15 (which assumed all children\n * return `[]`), but in practice the page-level child for the\n * matching script returns `verified:true` synchronously. Children\n * that legitimately have nothing for this source return `[]` and we\n * skip them. Per-child failures surface as `warnings` on the\n * response (Plan 05-09 invariant preserved).\n * 4. For any provisional bps still unverified after the response +\n * child fan-out, wait up to {@link\n * ChildSessionCoordinatorOptions.setBreakpointsVerificationTimeoutMs}\n * (default 3_500ms — kept under the 5s controller IPC timeout in\n * `controller/client.ts`) for a parent `breakpoint` event with\n * `verified: true` that matches by id OR by source.path + line.\n * 5. On timeout, return the merged response with\n * `warnings: [{sessionId, message: 'verification_timeout'}]` so\n * callers see a diagnostic instead of an opaque false-positive.\n *\n * See 05-15-PLAN.md (and the SUMMARY for the documented deviation).\n */\n private async routeSetBreakpointsThroughParent(args: unknown): Promise<unknown> {\n type Bp = { id?: number; verified?: boolean; line?: number; message?: string; [key: string]: unknown };\n type Response = { breakpoints?: Bp[]; [key: string]: unknown };\n type ChildResult =\n | { sessionId: SessionId; ok: true; response: Response | undefined }\n | { sessionId: SessionId; ok: false; error: unknown };\n\n const sourcePath = isRecord(args) && isRecord(args.source) && typeof args.source.path === 'string'\n ? args.source.path\n : undefined;\n\n const verifiedById = new Map<number, Bp>();\n const verifiedByLine = new Map<number, Bp>();\n type Waiter = { resolve: () => void };\n const waiters = new Set<Waiter>();\n const notifyWaiters = (): void => {\n for (const waiter of waiters) {\n waiter.resolve();\n }\n waiters.clear();\n };\n\n const recordVerifiedEvent = (bp: Record<string, unknown>): void => {\n if (bp.verified !== true) {\n return;\n }\n const eventSource = isRecord(bp.source) && typeof bp.source.path === 'string' ? bp.source.path : undefined;\n const lineMatches = sourcePath === undefined || eventSource === undefined || sourceMatches(eventSource, sourcePath);\n if (typeof bp.id === 'number') {\n verifiedById.set(bp.id, bp);\n }\n if (typeof bp.line === 'number' && lineMatches) {\n verifiedByLine.set(bp.line, bp);\n }\n };\n\n // Seed from the parent event cache so prior verifying events don't\n // get missed (e.g. the script was parsed before this call).\n const recentEvents = this.options.parentEventCache.recent().events;\n for (const cached of recentEvents) {\n if (cached.event !== 'breakpoint') {\n continue;\n }\n const body = (cached as { body?: { breakpoint?: unknown } }).body;\n const bp = body?.breakpoint;\n if (isRecord(bp)) {\n recordVerifiedEvent(bp);\n }\n }\n\n const detach = this.options.parentClient.onEvent(event => {\n if (event.event !== 'breakpoint') {\n return;\n }\n const body = (event as { body?: { breakpoint?: unknown } }).body;\n const bp = body?.breakpoint;\n if (isRecord(bp)) {\n recordVerifiedEvent(bp);\n notifyWaiters();\n }\n });\n\n const childBreakpointSink = (event: DapEventMessage): void => {\n const body = (event as { body?: { breakpoint?: unknown } }).body;\n const bp = body?.breakpoint;\n if (isRecord(bp)) {\n recordVerifiedEvent(bp);\n notifyWaiters();\n }\n };\n this.breakpointEventSinks.add(childBreakpointSink);\n\n let timer: NodeJS.Timeout | undefined;\n try {\n this.rememberPendingSetBreakpoints(args);\n // Issue parent setBreakpoints to update its provisional bp registry.\n // Per direct DAP trace evidence, the parent must be told even though\n // its response is provisional — it owns propagation to current and\n // future children.\n const parentRequest = this.options.parentClient.request<Response>('setBreakpoints', args);\n parentRequest.catch(() => undefined);\n\n // Also fan out to existing children for verification info — the\n // page-level child whose script is parsed returns a real verified\n // response synchronously, which is the most reliable signal we have.\n // This is a deviation from plan 05-15 (which assumed children always\n // return `[]`); in practice the page child returns the real array.\n // Per-child failures surface as warnings.\n const { pendingChildSessionIds } = await this.awaitChildrenReadyBounded();\n let childResults: ChildResult[] = [];\n // Phase 17 S-08 Bug 1: only query children whose readyPromise has\n // settled. A still-pending child (utility-process attach where\n // `configurationDone` never returns) would otherwise hang this\n // request past the 5s controller IPC budget and the agent sees a\n // misleading `controller_request_timeout`. Pending sessionIds are\n // surfaced as `child_readiness_timeout` warnings below.\n const pendingSet = new Set(pendingChildSessionIds);\n const readyChildren = [...this.children.values()].filter(child => !pendingSet.has(child.sessionId));\n if (readyChildren.length > 0) {\n childResults = await Promise.all(\n readyChildren.map(async (child): Promise<ChildResult> => {\n try {\n const response = await child.client.request<Response>('setBreakpoints', args);\n return { sessionId: child.sessionId, ok: true, response };\n } catch (error) {\n return { sessionId: child.sessionId, ok: false, error };\n }\n }),\n );\n }\n\n const parentResponse = await parentRequest;\n const parentBps: Bp[] = parentResponse?.breakpoints ?? [];\n\n type BreakpointWarning = { sessionId: SessionId; message: string; diagnostics?: string[] };\n const childWarnings: BreakpointWarning[] = childResults\n .filter((result): result is Extract<ChildResult, { ok: false }> => !result.ok)\n .map(result => ({\n sessionId: result.sessionId,\n message: result.error instanceof Error ? result.error.message : String(result.error),\n }));\n for (const sessionId of pendingChildSessionIds) {\n childWarnings.push({ sessionId, message: 'child_readiness_timeout' });\n }\n\n // Index-based child verification: response.breakpoints[i] corresponds\n // to args.breakpoints[i]. The parent's provisional response often\n // omits `line` (only id+verified+message), so id/line matching fails\n // — index is the contract DAP guarantees.\n const childVerifiedByIndex = new Map<number, Bp>();\n for (const result of childResults) {\n if (!result.ok) {\n continue;\n }\n const bps = result.response?.breakpoints ?? [];\n bps.forEach((bp, index) => {\n if (bp.verified === true && !childVerifiedByIndex.has(index)) {\n childVerifiedByIndex.set(index, bp);\n }\n });\n }\n\n const provisional: { index: number; bp: Bp }[] = [];\n parentBps.forEach((bp, index) => {\n if (bp.verified !== true) {\n provisional.push({ index, bp });\n }\n });\n\n const timeoutMs = this.options.setBreakpointsVerificationTimeoutMs ?? 3_500;\n const matchProvisional = (bp: Bp, index: number): Bp | undefined => {\n if (childVerifiedByIndex.has(index)) {\n return childVerifiedByIndex.get(index);\n }\n if (typeof bp.id === 'number' && verifiedById.has(bp.id)) {\n return verifiedById.get(bp.id);\n }\n if (typeof bp.line === 'number' && verifiedByLine.has(bp.line)) {\n return verifiedByLine.get(bp.line);\n }\n return undefined;\n };\n\n const allMatched = (): boolean => provisional.every(({ bp, index }) => matchProvisional(bp, index) !== undefined);\n\n if (!allMatched()) {\n const timeoutPromise = new Promise<'timeout'>(resolve => {\n timer = setTimeout(() => resolve('timeout'), timeoutMs);\n });\n while (!allMatched()) {\n const wakePromise = new Promise<'wake'>(resolve => {\n waiters.add({ resolve: () => resolve('wake') });\n });\n const winner = await Promise.race([timeoutPromise, wakePromise]);\n if (winner === 'timeout') {\n break;\n }\n }\n }\n\n const merged: Bp[] = parentBps.map((bp, index) => {\n const match = matchProvisional(bp, index);\n if (match === undefined) {\n return bp;\n }\n const { message: _provisionalMessage, ...rest } = bp;\n void _provisionalMessage;\n return { ...rest, ...match, verified: true };\n });\n\n const allVerified = merged.every(bp => bp.verified === true);\n const warnings = [...childWarnings];\n if (!allVerified) {\n warnings.push({\n sessionId: this.options.parentSessionId,\n message: 'verification_timeout',\n diagnostics: breakpointBindingGuidance({ sourcePath, adapterId: this.options.adapterId }),\n });\n }\n\n const result: Record<string, unknown> = { ...(parentResponse ?? {}), breakpoints: merged };\n if (warnings.length > 0) {\n result.warnings = warnings;\n }\n return result;\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n detach();\n this.breakpointEventSinks.delete(childBreakpointSink);\n }\n }\n\n private async routeByThreadId(command: string, args: unknown, recordFrames: boolean): Promise<unknown> {\n const threadId = isRecord(args) && typeof args.threadId === 'number' ? args.threadId : undefined;\n if (threadId === undefined) {\n // Plan 05-26 (gap H-3a): structured `thread_id_required` error so JSON\n // consumers can list every thread known across children without\n // re-querying. The error code string is intentional contract; do not\n // rename without updating consumers in tests/cli/sessionCommands.test.ts.\n throw sessionError(`A thread id is required for '${command}'.`, {\n code: 'thread_id_required',\n diagnostics: [\n `'${command}' requires --thread-id when the named session has children.`,\n 'Run `dap-cli threads --name <parent>` to list available thread ids.',\n ],\n data: { availableThreads: this.listAvailableThreads() },\n });\n }\n const child = await this.findChildOwningThread(threadId);\n if (child === undefined) {\n throw sessionError(`No child session owns thread ${threadId}.`, {\n code: 'thread_not_owned',\n diagnostics: [\n `Thread ${threadId} is not known to any child of this parent session.`,\n 'Run `dap-cli threads --name <parent>` to list available thread ids.',\n ],\n data: { requestedThreadId: threadId, availableThreads: this.listAvailableThreads() },\n });\n }\n // Real child thread id forwarded unchanged — no remap.\n let response: unknown;\n try {\n response = await child.client.request<unknown>(command, args);\n } catch (error) {\n this.normalizeChildRequestError(command, error);\n }\n if (recordFrames && isRecord(response)) {\n const frames = Array.isArray(response.stackFrames) ? response.stackFrames : [];\n for (const frame of frames) {\n if (isRecord(frame) && typeof frame.id === 'number') {\n child.frameIds.add(frame.id);\n }\n if (isRecord(frame) && isRecord(frame.source) && typeof frame.source.sourceReference === 'number' && frame.source.sourceReference > 0) {\n child.sourceReferences.add(frame.source.sourceReference);\n }\n }\n }\n return response;\n }\n\n private async routeByFrameId(command: string, args: unknown): Promise<unknown> {\n const frameId = isRecord(args) && typeof args.frameId === 'number' ? args.frameId : undefined;\n if (frameId === undefined) {\n // Phase 8 round 3: structured error so the CLI does not surface\n // `controller_unavailable: Run dap-cli start` for a missing frameId.\n throw sessionError(`'${command}' requires frameId.`, {\n code: 'frame_id_required',\n diagnostics: [\n `'${command}' requires --frame-id when the named session has children.`,\n 'Run `dap-cli stack --name <parent> --thread-id <id>` to list available frame ids.',\n ],\n data: { availableFrameIds: this.listAvailableFrameIds() },\n });\n }\n const child = this.findChildByFrameId(frameId);\n if (child === undefined) {\n // Phase 8 round 3: same — surface a session-state error, not a\n // bogus controller-unavailable hint.\n throw sessionError(`No child session owns frame ${frameId}.`, {\n code: 'frame_not_found',\n diagnostics: [\n `Frame ${frameId} is not known to any child of this parent session.`,\n 'Run `dap-cli stack --name <parent> --thread-id <id>` to list current frame ids; frame ids change after each stop.',\n ],\n data: { requestedFrameId: frameId, availableFrameIds: this.listAvailableFrameIds() },\n });\n }\n let response: unknown;\n try {\n response = await child.client.request<unknown>(command, args);\n } catch (error) {\n this.normalizeChildRequestError(command, error);\n }\n if (isRecord(response)) {\n const scopes = Array.isArray(response.scopes) ? response.scopes : [];\n for (const scope of scopes) {\n if (isRecord(scope) && typeof scope.variablesReference === 'number' && scope.variablesReference > 0) {\n child.variableReferences.add(scope.variablesReference);\n }\n }\n }\n return response;\n }\n\n private async routeByVariableReference(command: string, args: unknown): Promise<unknown> {\n const reference = isRecord(args) && typeof args.variablesReference === 'number'\n ? args.variablesReference\n : isRecord(args) && typeof args.frameId === 'number'\n ? undefined // evaluate may use frameId\n : undefined;\n let child: ChildRuntime | undefined;\n if (reference !== undefined) {\n child = this.findChildByVariableReference(reference);\n } else if (isRecord(args) && typeof args.frameId === 'number') {\n child = this.findChildByFrameId(args.frameId);\n } else if (command === 'evaluate') {\n // Plan 05-26 (gap H-3a): top-level `evaluate` (no frameId, no\n // variablesReference) is the hand-driven user pattern — they want to\n // evaluate against the currently-paused child without first calling\n // `threads`/`stack` to obtain a frame. Fall back to the first child\n // that has any known thread (i.e., is currently active). For\n // pwa-node single-child this is unambiguous; for pwa-chrome\n // multi-child the deterministic Map iteration order picks the first\n // registered child. Users who need an explicit frame can still pass\n // `--frame-id`.\n for (const candidate of this.children.values()) {\n if (candidate.knownThreadIds.size > 0) {\n child = candidate;\n break;\n }\n }\n }\n if (child === undefined) {\n // Phase 8 round 3: structured error so the CLI does not surface\n // `controller_unavailable: Run dap-cli start` for an unknown\n // variablesReference / frameId.\n throw sessionError(`No child session owns ${command} target.`, {\n code: 'variable_reference_not_found',\n diagnostics: [\n `'${command}' requires --variables-reference (or --frame-id) pointing at a value owned by a paused child of this parent session.`,\n 'Run `dap-cli scopes --name <parent> --frame-id <id>` to list current variablesReferences; references change after each stop.',\n ],\n data: {\n ...(isRecord(args) && typeof args.variablesReference === 'number' ? { requestedVariablesReference: args.variablesReference } : {}),\n ...(isRecord(args) && typeof args.frameId === 'number' ? { requestedFrameId: args.frameId } : {}),\n availableFrameIds: this.listAvailableFrameIds(),\n availableVariableReferences: this.listAvailableVariableReferences(),\n },\n });\n }\n let response: unknown;\n try {\n response = await child.client.request<unknown>(command, args);\n } catch (error) {\n this.normalizeChildRequestError(command, error);\n }\n if (isRecord(response)) {\n const variables = Array.isArray(response.variables) ? response.variables : [];\n for (const variable of variables) {\n if (isRecord(variable) && typeof variable.variablesReference === 'number' && variable.variablesReference > 0) {\n child.variableReferences.add(variable.variablesReference);\n }\n }\n }\n return response;\n }\n\n private normalizeChildRequestError(command: string, error: unknown): never {\n if (pausedRequiredRoutedCommands.has(command) && error instanceof Error && /not paused/i.test(error.message)) {\n throw threadNotPaused({ sessionId: this.options.parentSessionId, sessionName: this.options.parentName, command });\n }\n throw error;\n }\n\n private async routeBySourceReference(command: string, args: unknown): Promise<unknown> {\n const reference = isRecord(args) && isRecord(args.source) && typeof args.source.sourceReference === 'number'\n ? args.source.sourceReference\n : undefined;\n if (reference === undefined) {\n throw sessionError(`'${command}' requires source.sourceReference.`, {\n code: 'source_reference_required',\n diagnostics: [\n `'${command}' requires a source.sourceReference pointing at a virtual source owned by a child of this parent session.`,\n ],\n data: { availableSourceReferences: this.listAvailableSourceReferences() },\n });\n }\n const child = this.findChildBySourceReference(reference);\n if (child === undefined) {\n throw sessionError(`No child session owns source reference ${reference}.`, {\n code: 'source_reference_not_found',\n diagnostics: [\n `Source reference ${reference} is not known to any child of this parent session.`,\n 'Run `dap-cli stack --name <parent> --thread-id <id>` to discover current sourceReferences; references change after each stop.',\n ],\n data: { requestedSourceReference: reference, availableSourceReferences: this.listAvailableSourceReferences() },\n });\n }\n return child.client.request<unknown>(command, args);\n }\n\n /**\n * Find the child whose REAL thread id list contains `threadId`. Three-pass\n * lookup, all passes restricted to non-{@link ChildRuntime.lifecycleEnded}\n * children:\n *\n * 1. Prefer a child that is actually stopped on this thread\n * (`stoppedThreadIds.has(threadId)` OR `allThreadsStopped &&\n * knownThreadIds.has(threadId)`). This is the Phase 18 fix for the\n * pre-existing \"first cache hit wins\" routing that sent\n * thread-bearing commands to a dead bootloader child whose cache\n * still claimed the id (S-02 routing failure).\n * 2. Fall back to any non-terminated child that knows the thread.\n * 3. Cold path — live `threads` fan-out across non-terminated\n * children, then re-run passes 1–2 against the refreshed cache.\n *\n * Iterates `this.children` LIVE so a worker registered between command\n * parse and lookup is observed. When two paused children legitimately own\n * the same id, Map iteration order (= insertion order) breaks the tie\n * and the user can disambiguate via the `sessionName` surfaced by\n * {@link aggregateThreads}.\n */\n private async findChildOwningThread(threadId: number): Promise<ChildRuntime | undefined> {\n // Pass 1: prefer the child actually stopped on this thread.\n for (const child of this.children.values()) {\n if (child.lifecycleEnded) {\n continue;\n }\n if (child.stoppedThreadIds.has(threadId)) {\n return child;\n }\n if (child.allThreadsStopped && child.knownThreadIds.has(threadId)) {\n return child;\n }\n }\n // Pass 2: any non-terminated child that knows the thread.\n for (const child of this.children.values()) {\n if (child.lifecycleEnded) {\n continue;\n }\n if (child.knownThreadIds.has(threadId)) {\n return child;\n }\n }\n // Pass 3: cold path — live `threads` fan-out, only against\n // non-terminated children. Bounded by live child count and the\n // per-request timeout configured on each child's DapClient.\n const live = [...this.children.values()].filter(child => !child.lifecycleEnded);\n const refreshes = live.map(async child => {\n try {\n const response = await child.client.request<{ threads?: Array<{ id: number; name: string }> }>('threads');\n for (const thread of response?.threads ?? []) {\n child.knownThreadIds.add(thread.id);\n if (typeof thread.name === 'string') {\n child.threadNames.set(thread.id, thread.name);\n }\n }\n } catch {\n // Per-child failure ignored — the next child may still claim the id.\n }\n });\n await Promise.allSettled(refreshes);\n for (const child of live) {\n if (child.stoppedThreadIds.has(threadId)) {\n return child;\n }\n if (child.allThreadsStopped && child.knownThreadIds.has(threadId)) {\n return child;\n }\n }\n for (const child of live) {\n if (child.knownThreadIds.has(threadId)) {\n return child;\n }\n }\n return undefined;\n }\n\n /**\n * Snapshot of every cached child thread id, used by error payloads to\n * tell the user where to look. Does NOT trigger a live refresh — the\n * error path must be snappy.\n */\n private listAvailableThreads(): Array<{ sessionName: string; sessionId: SessionId; threadId: number; name?: string }> {\n const result: Array<{ sessionName: string; sessionId: SessionId; threadId: number; name?: string }> = [];\n for (const child of this.children.values()) {\n if (child.lifecycleEnded) {\n continue;\n }\n for (const threadId of child.knownThreadIds) {\n const name = child.threadNames.get(threadId);\n result.push({\n sessionName: child.sessionName,\n sessionId: child.sessionId,\n threadId,\n ...(name !== undefined ? { name } : {}),\n });\n }\n }\n return result;\n }\n\n private findChildByFrameId(frameId: number): ChildRuntime | undefined {\n for (const child of this.children.values()) {\n if (child.frameIds.has(frameId)) {\n return child;\n }\n }\n return undefined;\n }\n\n private findChildByVariableReference(reference: number): ChildRuntime | undefined {\n for (const child of this.children.values()) {\n if (child.variableReferences.has(reference)) {\n return child;\n }\n }\n return undefined;\n }\n\n private findChildBySourceReference(reference: number): ChildRuntime | undefined {\n for (const child of this.children.values()) {\n if (child.sourceReferences.has(reference)) {\n return child;\n }\n }\n return undefined;\n }\n\n private listAvailableFrameIds(): Array<{ sessionName: string; sessionId: SessionId; frameId: number }> {\n const result: Array<{ sessionName: string; sessionId: SessionId; frameId: number }> = [];\n for (const child of this.children.values()) {\n for (const frameId of child.frameIds) {\n result.push({ sessionName: child.sessionName, sessionId: child.sessionId, frameId });\n }\n }\n return result;\n }\n\n private listAvailableVariableReferences(): Array<{ sessionName: string; sessionId: SessionId; variablesReference: number }> {\n const result: Array<{ sessionName: string; sessionId: SessionId; variablesReference: number }> = [];\n for (const child of this.children.values()) {\n for (const reference of child.variableReferences) {\n result.push({ sessionName: child.sessionName, sessionId: child.sessionId, variablesReference: reference });\n }\n }\n return result;\n }\n\n private listAvailableSourceReferences(): Array<{ sessionName: string; sessionId: SessionId; sourceReference: number }> {\n const result: Array<{ sessionName: string; sessionId: SessionId; sourceReference: number }> = [];\n for (const child of this.children.values()) {\n for (const reference of child.sourceReferences) {\n result.push({ sessionName: child.sessionName, sessionId: child.sessionId, sourceReference: reference });\n }\n }\n return result;\n }\n}\n\nfunction defaultCreateChildClient(transport: DapTransport): DapClient {\n return new DapClient(transport, { requestTimeoutMs: 30_000 });\n}\n\nfunction createInitializeArgs(adapterId: string): Record<string, unknown> {\n return {\n adapterID: adapterId,\n clientID: 'dap-cli',\n clientName: 'dap-cli',\n columnsStartAt1: true,\n linesStartAt1: true,\n pathFormat: 'path',\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction breakpointPayloadSourceKey(payload: unknown): string | undefined {\n if (!isRecord(payload) || !isRecord(payload.source)) {\n return undefined;\n }\n const source = payload.source;\n if (typeof source.path === 'string') {\n return `path:${source.path}`;\n }\n if (typeof source.sourceReference === 'number') {\n return `sourceReference:${source.sourceReference}`;\n }\n if (typeof source.name === 'string') {\n return `name:${source.name}`;\n }\n return undefined;\n}\n\n/**\n * Robust source-path comparison that tolerates the file://-vs-absolute-path\n * differences js-debug introduces between request args and breakpoint events.\n */\nfunction sourceMatches(eventPath: string, requestPath: string): boolean {\n if (eventPath === requestPath) {\n return true;\n }\n const normalize = (path: string): string => path.replace(/^file:\\/\\//, '').replace(/\\\\/g, '/');\n return normalize(eventPath) === normalize(requestPath);\n}\n","// Phase 10 plan 03 (DIAG-01): best-effort detector that catches\n// js-debug helper-process attaches even on code paths that bypass\n// 10-01's auto-route (--adapter / --json invocations without --config).\n//\n// When js-debug spawns a helper process during a misrouted launch, the\n// helper's OS-reported parent PID equals the dapDebugServer adapter PID.\n// On every DAP `process` event from a js-debug attach session, the\n// detector resolves `body.systemProcessId`'s ppid via `ps` and, if it\n// matches the adapter PID, injects a synthetic `dapCli.helperProcessWarning`\n// event into the session's event cache.\n//\n// Synthetic events use `seq: -1`. DAP guarantees positive sequence numbers\n// from adapters, so this prefix is unambiguously dap-cli-internal.\n\nimport { execFile } from 'node:child_process';\nimport type { DapEventMessage } from '../protocol/dapMessages.js';\n\nexport interface HelperProcessDetectorOptions {\n sessionId: string;\n adapterId: string;\n adapterPid: number | undefined;\n mode: 'launch' | 'attach';\n eventCache: { append(sessionId: string, event: DapEventMessage): unknown };\n lookupPpid?: (pid: number) => Promise<number | undefined>;\n}\n\nexport interface HelperProcessDetector {\n handleEvent(event: DapEventMessage): void;\n dispose(): void;\n}\n\nexport interface HelperProcessWarningBody {\n code: 'helper_process_detected';\n helperPid: number;\n adapterPid: number;\n sessionId: string;\n hint: string;\n}\n\nexport const helperProcessWarningEventName = 'dapCli.helperProcessWarning';\n\nconst helperHint = 'Likely attached to an adapter-spawned helper process; you probably meant `dap-cli attach`, not `dap-cli launch`.';\n\nexport function createHelperProcessDetector(options: HelperProcessDetectorOptions): HelperProcessDetector {\n const lookup = options.lookupPpid ?? defaultLookupPpid;\n const fired = new Set<string>();\n let disposed = false;\n\n return {\n handleEvent(event: DapEventMessage): void {\n if (disposed) {\n return;\n }\n if (options.mode !== 'attach') {\n return;\n }\n if (options.adapterId !== 'js-debug') {\n return;\n }\n if (options.adapterPid === undefined) {\n return;\n }\n if (event.event !== 'process') {\n return;\n }\n const body = event.body;\n if (typeof body !== 'object' || body === null) {\n return;\n }\n const systemProcessId = (body as { systemProcessId?: unknown }).systemProcessId;\n if (typeof systemProcessId !== 'number' || !Number.isInteger(systemProcessId) || systemProcessId <= 0) {\n return;\n }\n const adapterPid = options.adapterPid;\n const key = `${options.sessionId}:${systemProcessId}`;\n if (fired.has(key)) {\n return;\n }\n fired.add(key);\n\n void lookup(systemProcessId).then(\n ppid => {\n if (disposed) {\n return;\n }\n if (ppid === undefined || ppid !== adapterPid) {\n return;\n }\n const warningBody: HelperProcessWarningBody = {\n code: 'helper_process_detected',\n helperPid: systemProcessId,\n adapterPid,\n sessionId: options.sessionId,\n hint: helperHint,\n };\n options.eventCache.append(options.sessionId, {\n type: 'event',\n seq: -1,\n event: helperProcessWarningEventName,\n body: warningBody,\n });\n },\n () => {\n // Lookup failures are silent — best-effort diagnostic.\n },\n );\n },\n dispose(): void {\n disposed = true;\n fired.clear();\n },\n };\n}\n\nconst psLookupTimeoutMs = 1000;\n\nexport function defaultLookupPpid(pid: number): Promise<number | undefined> {\n if (process.platform === 'win32') {\n return Promise.resolve(undefined);\n }\n if (!Number.isInteger(pid) || pid <= 0) {\n return Promise.resolve(undefined);\n }\n\n return new Promise(resolve => {\n execFile('ps', ['-o', 'ppid=', '-p', String(pid)], { timeout: psLookupTimeoutMs }, (error, stdout) => {\n if (error !== null) {\n resolve(undefined);\n return;\n }\n const trimmed = stdout.trim();\n if (trimmed.length === 0) {\n resolve(undefined);\n return;\n }\n const parsed = Number.parseInt(trimmed, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n resolve(undefined);\n return;\n }\n resolve(parsed);\n });\n });\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nlet cachedBuildId: string | undefined;\n\n/**\n * Compute a deterministic build identifier for the current dap-cli install.\n *\n * Strategy:\n * - Resolve `package.json` by walking up from this module and read its `version`.\n * - If `dist/index.js` exists alongside `package.json`, encode its mtime + size\n * into the id (so prod-style installs from the same build produce identical ids\n * across CLI and controller processes).\n * - Otherwise (development / tests via tsx / vitest) fall back to the package\n * version only — every process in the same source tree agrees on the id, so\n * the controller-reuse handshake does NOT trip during ordinary dev workflows.\n *\n * The result is cached per process; callers may invoke this repeatedly.\n */\nexport async function computeBuildId(): Promise<string> {\n if (cachedBuildId !== undefined) {\n return cachedBuildId;\n }\n\n const envOverride = process.env.DAP_CLI_BUILD_ID;\n if (envOverride !== undefined && envOverride.length > 0) {\n cachedBuildId = envOverride;\n return cachedBuildId;\n }\n\n const here = path.dirname(fileURLToPath(import.meta.url));\n const pkgPath = await findPackageJson(here);\n let version = '0.0.0';\n let pkgDir = here;\n if (pkgPath !== undefined) {\n pkgDir = path.dirname(pkgPath);\n try {\n const raw = await fs.readFile(pkgPath, 'utf8');\n const parsed = JSON.parse(raw) as { version?: unknown };\n if (typeof parsed.version === 'string' && parsed.version.length > 0) {\n version = parsed.version;\n }\n } catch {\n // keep default version\n }\n }\n\n const distPath = path.join(pkgDir, 'dist', 'index.js');\n try {\n const stat = await fs.stat(distPath);\n cachedBuildId = `${version}:dist:${stat.mtimeMs}:${stat.size}`;\n } catch {\n cachedBuildId = `${version}:src`;\n }\n\n return cachedBuildId;\n}\n\n/** Test-only: clear the cached build id so subsequent calls recompute. */\nexport function resetCachedBuildIdForTesting(): void {\n cachedBuildId = undefined;\n}\n\nasync function findPackageJson(startDir: string): Promise<string | undefined> {\n let dir = startDir;\n for (let depth = 0; depth < 8; depth += 1) {\n const candidate = path.join(dir, 'package.json');\n try {\n await fs.access(candidate);\n return candidate;\n } catch {\n const parent = path.dirname(dir);\n if (parent === dir) {\n return undefined;\n }\n dir = parent;\n }\n }\n return undefined;\n}\n","/**\n * Heuristic Python statement-vs-expression classifier for the controller's\n * `evaluate` rewrite path on debugpy sessions. Pure module — no I/O, no\n * project imports, fully unit-testable.\n *\n * `looksLikePythonStatement(source)` returns true when `source` looks like\n * one or more Python statements (which debugpy's expression-only `evaluate`\n * would reject as SyntaxError). False for pure expressions.\n *\n * `wrapForExec(source)` returns `exec(\"...\")` with the source JSON-encoded\n * inside the string literal — Python string-literal escaping is a strict\n * superset of JSON's for newline / quote / backslash / control chars, so\n * `JSON.stringify` produces a valid Python string literal.\n */\n\nconst STATEMENT_KEYWORDS: ReadonlySet<string> = new Set([\n\t'import', 'from', 'def', 'class',\n\t'if', 'elif', 'else', 'for', 'while',\n\t'with', 'try', 'except', 'finally',\n\t'raise', 'return', 'pass', 'break', 'continue',\n\t'global', 'nonlocal', 'del', 'assert', 'yield',\n\t'async', 'await',\n]);\n\nexport function looksLikePythonStatement(source: string): boolean {\n\tconst trimmed = source.trim();\n\tif (trimmed.length === 0) {\n\t\treturn false;\n\t}\n\t// A bare comment line has no executable code; treat as non-statement so\n\t// the rewrite path leaves it alone (debugpy will surface its own error).\n\tif (trimmed.startsWith('#')) {\n\t\treturn false;\n\t}\n\n\t// Leading-keyword check: first identifier-shaped token followed by a\n\t// statement-introducing delimiter.\n\tconst keywordMatch = /^([A-Za-z_][A-Za-z0-9_]*)/.exec(trimmed);\n\tif (keywordMatch !== null) {\n\t\tconst word = keywordMatch[1]!;\n\t\tif (STATEMENT_KEYWORDS.has(word)) {\n\t\t\tconst after = trimmed.charAt(word.length);\n\t\t\tif (after === '' || after === ' ' || after === '\\t' || after === '\\n' || after === '(' || after === ':') {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Linear scan tracking bracket depth and string-literal state.\n\tlet bracketDepth = 0;\n\ttype StringMode = 'none' | \"'\" | '\"' | \"'''\" | '\"\"\"';\n\tlet mode: StringMode = 'none';\n\n\tfor (let i = 0; i < source.length; i++) {\n\t\tconst c = source.charAt(i);\n\n\t\tif (mode === 'none') {\n\t\t\tif (c === '#') {\n\t\t\t\t// Skip to end of line. A newline IS a statement separator,\n\t\t\t\t// so if we hit one we're already a multi-statement input.\n\t\t\t\twhile (i < source.length && source.charAt(i) !== '\\n') {\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tif (i < source.length && source.charAt(i) === '\\n') {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (c === '\"' || c === \"'\") {\n\t\t\t\tif (source.slice(i, i + 3) === c + c + c) {\n\t\t\t\t\tmode = (c + c + c) as StringMode;\n\t\t\t\t\ti += 2;\n\t\t\t\t} else {\n\t\t\t\t\tmode = c;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (c === '(' || c === '[' || c === '{') {\n\t\t\t\tbracketDepth++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (c === ')' || c === ']' || c === '}') {\n\t\t\t\tbracketDepth = Math.max(0, bracketDepth - 1);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (c === '\\n') {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (c === ';') {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (c === '=' && bracketDepth === 0) {\n\t\t\t\tconst prev = i > 0 ? source.charAt(i - 1) : '';\n\t\t\t\tconst next = i + 1 < source.length ? source.charAt(i + 1) : '';\n\t\t\t\tif (next === '=') {\n\t\t\t\t\ti++; // skip past '=='\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (prev === '=' || prev === '!' || prev === '<' || prev === '>' || prev === ':') {\n\t\t\t\t\tcontinue; // part of ==, !=, <=, >=, :=\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Inside a string literal.\n\t\tif (c === '\\\\') {\n\t\t\ti++; // skip the escaped character\n\t\t\tcontinue;\n\t\t}\n\t\tif (mode === \"'\" || mode === '\"') {\n\t\t\tif (c === mode) {\n\t\t\t\tmode = 'none';\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\t// Triple-quoted.\n\t\tif (source.slice(i, i + 3) === mode) {\n\t\t\ti += 2;\n\t\t\tmode = 'none';\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function wrapForExec(source: string): string {\n\treturn `exec(${JSON.stringify(source)})`;\n}\n","import path from 'node:path';\nimport type { Command } from 'commander';\nimport type { OutputWriter } from '../outputWriter.js';\nimport { usageError } from '../errors.js';\nimport { getDapGeneratedCommand } from '../../generated/dapCommandRegistry.js';\nimport { parseIntegerOption, parseIntegerValues, parseRequiredIntegerOption, requireGeneratedCommand, sendGeneratedDapRequest } from './dapGenerated.js';\nimport { createControllerClient, type ControllerClient } from '../../controller/client.js';\n\ninterface NamedOptions {\n name?: string;\n}\n\ninterface BreakpointsSetOptions extends NamedOptions {\n source: string;\n line?: string[];\n condition?: string;\n hitCondition?: string;\n logMessage?: string;\n}\n\ninterface BreakpointsListOptions extends NamedOptions {\n source?: string;\n}\n\ninterface BreakpointsClearOptions extends NamedOptions {\n source?: string;\n}\n\ninterface StackOptions extends NamedOptions {\n threadId?: string;\n startFrame?: string;\n levels?: string;\n}\n\ninterface ScopesOptions extends NamedOptions {\n frameId?: string;\n}\n\ninterface VariablesOptions extends NamedOptions {\n variablesReference?: string;\n}\n\ninterface SourceOptions extends NamedOptions {\n sourceReference?: string;\n path?: string;\n}\n\ninterface EvaluateOptions extends NamedOptions {\n expression?: string;\n frameId?: string;\n context?: string;\n}\n\ninterface ThreadControlOptions extends NamedOptions {\n threadId?: string;\n singleThread?: boolean;\n targetId?: string;\n}\n\ninterface SetBreakpointsResponseBreakpoint {\n id?: number;\n verified?: boolean;\n message?: string;\n line?: number;\n column?: number;\n source?: { path?: string; name?: string; [key: string]: unknown };\n [key: string]: unknown;\n}\n\ninterface SetBreakpointsResponse {\n breakpoints?: ReadonlyArray<SetBreakpointsResponseBreakpoint>;\n [key: string]: unknown;\n}\n\ninterface CapabilitiesResponse {\n capabilities?: { supportsLoadedSourcesRequest?: boolean; [key: string]: unknown };\n}\n\ninterface LoadedSourcesResponse {\n sources?: ReadonlyArray<{ path?: string; name?: string; [key: string]: unknown }>;\n}\n\ninterface VerificationDiagnostic {\n unverifiedCount: number;\n totalCount: number;\n loadedSourcesCount: number;\n matchingLoadedSources: ReadonlyArray<{ path: string; name?: string }>;\n // Phase 17 follow-up: count of js-debug child sessions attached to the\n // parent. When >0 and the parent has 0 loaded sources, that's NORMAL for\n // multi-process pwa-node/pwa-chrome attaches (the runtime sources live\n // on children, not the bootstrap parent). The hint changes accordingly\n // so the diagnostic stops shouting \"wrong process\" at correctly-attached\n // multi-process sessions.\n childSessionCount: number;\n hint: string;\n recipe: string;\n}\n\ninterface SessionsListEntry {\n id?: string;\n parent_session_id?: string;\n [key: string]: unknown;\n}\n\nexport function registerDapAliasCommands(program: Command, output: OutputWriter): void {\n const breakpoints = program.command('breakpoints').helpGroup('Breakpoints').description('Manage source breakpoints');\n breakpoints\n .command('set')\n .requiredOption('--source <path>', 'source path')\n .requiredOption('--line <number...>', 'breakpoint line')\n .option('--name <name>', 'session name or id')\n .option('--condition <expr>', 'breakpoint condition')\n .option('--hit-condition <expr>', 'breakpoint hit condition')\n .option('--log-message <text>', 'breakpoint log message')\n .description('Set breakpoints at source file line numbers')\n .action(async (options: BreakpointsSetOptions) => {\n const lines = parseIntegerValues(options.line, 'line');\n const args = {\n source: { path: path.resolve(options.source) },\n breakpoints: lines.map(line => compactObject({\n line,\n condition: options.condition,\n hitCondition: options.hitCondition,\n logMessage: options.logMessage,\n })),\n lines,\n };\n const client = await createControllerClient({ dapCliHome: process.env.DAP_CLI_HOME });\n try {\n const requestPayload = compactObject({\n command: 'setBreakpoints',\n args,\n name: options.name,\n });\n const response = await client.request<SetBreakpointsResponse>('dap.request', requestPayload);\n const breakpointsResponse = response.breakpoints ?? [];\n const unverifiedCount = breakpointsResponse.filter(b => b.verified === false).length;\n if (unverifiedCount === 0) {\n output.success(response, { command: 'breakpoints set' });\n return;\n }\n const diagnostic = await buildVerificationDiagnostic(client, args.source.path, breakpointsResponse, options.name);\n output.warn(`breakpoints set: ${diagnostic.hint}`);\n output.success({ ...response, verificationDiagnostic: diagnostic }, { command: 'breakpoints set' });\n } finally {\n await client.close();\n }\n });\n\n breakpoints\n .command('list')\n .option('--source <path>', 'filter to a single source path')\n .option('--name <name>', 'session name or id')\n .description('List breakpoints currently tracked for a session (per source, with verified state)')\n .action(async (options: BreakpointsListOptions) => {\n const params = compactObject({\n name: options.name,\n source: options.source === undefined ? undefined : path.resolve(options.source),\n });\n const client = await createControllerClient({ dapCliHome: process.env.DAP_CLI_HOME });\n try {\n const result = await client.request('sessions.breakpoints.list', params);\n output.success(result, { command: 'breakpoints list' });\n } finally {\n await client.close();\n }\n });\n\n breakpoints\n .command('clear')\n .option('--source <path>', 'clear only the named source (otherwise: clear all tracked sources)')\n .option('--name <name>', 'session name or id')\n .description('Clear breakpoints in a source (DAP setBreakpoints empty-list semantics)')\n .action(async (options: BreakpointsClearOptions) => {\n const params = compactObject({\n name: options.name,\n source: options.source === undefined ? undefined : path.resolve(options.source),\n });\n const client = await createControllerClient({ dapCliHome: process.env.DAP_CLI_HOME });\n try {\n const result = await client.request('sessions.breakpoints.clear', params);\n output.success(result, { command: 'breakpoints clear' });\n } finally {\n await client.close();\n }\n });\n\n program.command('threads').helpGroup('Paused-state inspection').option('--name <name>', 'session name or id').description('List active threads in a paused session').addHelpText('after', workflowHelp()).action(async (options: NamedOptions) => {\n await sendAliasRequest(output, 'threads', {}, options.name, 'threads');\n });\n\n program.command('stack').helpGroup('Paused-state inspection').option('--thread-id <number>', 'thread id (defaults to the unique stopped thread when omitted)').option('--start-frame <number>', 'start frame').option('--levels <number>', 'frame count').option('--name <name>', 'session name or id').description('Get stack frames for a thread (auto-resolves to the stopped thread if --thread-id omitted)').addHelpText('after', workflowHelp()).action(async (options: StackOptions) => {\n const threadId = await resolveThreadId(output, options.threadId, options.name, 'stack', 'stopped');\n await sendAliasRequest(output, 'stackTrace', compactObject({\n threadId,\n startFrame: parseIntegerOption(options.startFrame, 'start-frame'),\n levels: parseIntegerOption(options.levels, 'levels'),\n }), options.name, 'stack');\n });\n\n program.command('scopes').helpGroup('Paused-state inspection').requiredOption('--frame-id <number>', 'frame id').option('--name <name>', 'session name or id').description('List scopes for a stack frame (requires frame-id from stack command)').addHelpText('after', workflowHelp()).action(async (options: ScopesOptions) => {\n await sendAliasRequest(output, 'scopes', { frameId: parseRequiredIntegerOption(options.frameId, 'frame-id') }, options.name, 'scopes');\n });\n\n program.command('variables').helpGroup('Paused-state inspection').requiredOption('--variables-reference <number>', 'variables reference').option('--name <name>', 'session name or id').description('Inspect variables for a scope (requires variables-reference from scopes command)').addHelpText('after', workflowHelp()).action(async (options: VariablesOptions) => {\n await sendAliasRequest(output, 'variables', { variablesReference: parseRequiredIntegerOption(options.variablesReference, 'variables-reference') }, options.name, 'variables');\n });\n\n program.command('source').helpGroup('Paused-state inspection').requiredOption('--source-reference <number>', 'source reference').option('--path <path>', 'source path').option('--name <name>', 'session name or id').description('Return source content').action(async (options: SourceOptions) => {\n const path = options.path;\n await sendAliasRequest(output, 'source', compactObject({\n sourceReference: parseRequiredIntegerOption(options.sourceReference, 'source-reference'),\n source: path === undefined ? undefined : { path },\n }), options.name, 'source');\n });\n\n program.command('evaluate').helpGroup('Paused-state inspection').requiredOption('--expression <expr>', 'expression').option('--frame-id <number>', 'frame id (auto-resolved to topmost paused frame when omitted)').option('--context <context>', 'evaluation context').option('--name <name>', 'session name or id').description('Evaluate an expression (auto-uses topmost frame of most-recently-stopped thread when paused)').action(async (options: EvaluateOptions) => {\n let frameId = parseIntegerOption(options.frameId, 'frame-id');\n if (frameId === undefined) {\n frameId = await resolveAutoFrameId(output, options.name);\n }\n await sendAliasRequest(output, 'evaluate', compactObject({\n expression: options.expression,\n frameId,\n context: options.context,\n }), options.name, 'evaluate');\n });\n\n program.command('continue').helpGroup('Execution control').option('--thread-id <number>', 'thread id (defaults to the unique stopped thread when omitted)').option('--single-thread', 'resume only one thread').option('--name <name>', 'session name or id').description('Continue execution (auto-resolves to the stopped thread if --thread-id omitted)').action(async (options: ThreadControlOptions) => {\n await sendThreadControlAlias(output, 'continue', options, 'continue', 'stopped');\n });\n\n program.command('pause').helpGroup('Execution control').option('--thread-id <number>', 'thread id (defaults to the unique running thread when omitted)').option('--name <name>', 'session name or id').description('Pause execution (auto-resolves to the unique thread if --thread-id omitted)').action(async (options: ThreadControlOptions) => {\n await sendThreadControlAlias(output, 'pause', options, 'pause', 'any');\n });\n\n program.command('next').helpGroup('Execution control').option('--thread-id <number>', 'thread id (defaults to the unique stopped thread when omitted)').option('--single-thread', 'step only one thread').option('--name <name>', 'session name or id').description('Step over (auto-resolves to the stopped thread if --thread-id omitted)').action(async (options: ThreadControlOptions) => {\n await sendThreadControlAlias(output, 'next', options, 'next', 'stopped');\n });\n\n program.command('step-in').helpGroup('Execution control').option('--thread-id <number>', 'thread id (defaults to the unique stopped thread when omitted)').option('--single-thread', 'step only one thread').option('--target-id <number>', 'step target id').option('--name <name>', 'session name or id').description('Step in (auto-resolves to the stopped thread if --thread-id omitted)').action(async (options: ThreadControlOptions) => {\n await sendThreadControlAlias(output, 'stepIn', options, 'step-in', 'stopped');\n });\n\n program.command('step-out').helpGroup('Execution control').option('--thread-id <number>', 'thread id (defaults to the unique stopped thread when omitted)').option('--single-thread', 'step only one thread').option('--name <name>', 'session name or id').description('Step out (auto-resolves to the stopped thread if --thread-id omitted)').action(async (options: ThreadControlOptions) => {\n await sendThreadControlAlias(output, 'stepOut', options, 'step-out', 'stopped');\n });\n}\n\nfunction workflowHelp(): string {\n return `\n\nPolling workflow:\n $ dap-cli status\n $ dap-cli events --after-cursor 0\n $ dap-cli threads\n $ dap-cli stack --thread-id 1\n $ dap-cli scopes --frame-id 1000\n $ dap-cli variables --variables-reference 2000\n`;\n}\n\nasync function sendThreadControlAlias(output: OutputWriter, dapCommand: 'continue' | 'pause' | 'next' | 'stepIn' | 'stepOut', options: ThreadControlOptions, commandLabel: string, threadFilter: 'stopped' | 'any'): Promise<void> {\n const threadId = await resolveThreadId(output, options.threadId, options.name, commandLabel, threadFilter);\n await sendAliasRequest(output, dapCommand, compactObject({\n threadId,\n singleThread: options.singleThread === true ? true : undefined,\n targetId: parseIntegerOption(options.targetId, 'target-id'),\n }), options.name, commandLabel);\n}\n\nasync function sendAliasRequest(output: OutputWriter, dapCommand: string, args: Record<string, unknown>, name: string | undefined, commandLabel: string): Promise<void> {\n getDapGeneratedCommand(dapCommand);\n await sendGeneratedDapRequest(output, requireGeneratedCommand(dapCommand), args, name, commandLabel);\n}\n\nfunction compactObject(input: Record<string, unknown>): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input)) {\n if (value !== undefined) {\n output[key] = value;\n }\n }\n\n return output;\n}\n\ninterface SessionStatusForAutoFrame {\n paused?: boolean;\n stoppedThreadIds?: readonly number[];\n}\n\ninterface ThreadInfo {\n id?: unknown;\n name?: unknown;\n}\n\ninterface ThreadsResponse {\n threads?: ReadonlyArray<ThreadInfo>;\n}\n\n// Phase 17 follow-up: when `--thread-id` is omitted on a thread-control or\n// inspection command (continue/pause/next/step-in/step-out/stack), resolve\n// it to the unique candidate thread on the session. Subagents reliably\n// guess `--thread-id 1` when there is exactly one thread (id 0); making the\n// flag optional turns that guess into a successful no-op.\n//\n// threadFilter:\n// 'stopped' — only consider stopped threads (continue/step/stack). Reads\n// status.stoppedThreadIds; falls back to the full threads list if the\n// status payload doesn't carry stop info yet.\n// 'any' — consider every thread (pause). Reads the threads list.\n//\n// Errors with a structured `usage` envelope when ambiguous (>1 candidate)\n// or when no candidate exists. The data payload includes available threads\n// so callers can pick one without re-running `threads`.\nasync function resolveThreadId(\n output: OutputWriter,\n rawThreadId: string | undefined,\n name: string | undefined,\n commandLabel: string,\n threadFilter: 'stopped' | 'any',\n): Promise<number> {\n if (rawThreadId !== undefined) {\n return parseRequiredIntegerOption(rawThreadId, 'thread-id');\n }\n\n let client: ControllerClient;\n try {\n client = await createControllerClient({ dapCliHome: process.env.DAP_CLI_HOME });\n } catch (error) {\n throw usageError(\n `--thread-id is required (auto-resolve unavailable: ${describeError(error)})`,\n { code: 'thread_id_required' },\n );\n }\n\n try {\n let stoppedThreadIds: readonly number[] = [];\n if (threadFilter === 'stopped') {\n try {\n const status = await client.request<SessionStatusForAutoFrame>(\n 'sessions.status',\n name === undefined ? undefined : { name },\n );\n stoppedThreadIds = Array.isArray(status.stoppedThreadIds) ? status.stoppedThreadIds : [];\n } catch {\n // Fall through to full threads list below.\n }\n\n if (stoppedThreadIds.length === 1) {\n const resolved = stoppedThreadIds[0]!;\n output.warn(`${commandLabel}: --thread-id not provided; using stopped thread ${resolved}`);\n return resolved;\n }\n if (stoppedThreadIds.length > 1) {\n throw usageError(\n `--thread-id required: ${stoppedThreadIds.length} threads are stopped (${stoppedThreadIds.join(', ')})`,\n {\n code: 'thread_id_required',\n data: { availableThreadIds: [...stoppedThreadIds] },\n },\n );\n }\n }\n\n let threadsResponse: ThreadsResponse;\n try {\n threadsResponse = await client.request<ThreadsResponse>('dap.request', {\n command: 'threads',\n args: {},\n ...(name === undefined ? {} : { name }),\n });\n } catch (error) {\n throw usageError(\n `--thread-id is required (could not list threads: ${describeError(error)})`,\n { code: 'thread_id_required' },\n );\n }\n\n const threads = (threadsResponse.threads ?? [])\n .map(t => ({ id: t.id, name: typeof t.name === 'string' ? t.name : undefined }))\n .filter((t): t is { id: number; name: string | undefined } => typeof t.id === 'number' && Number.isInteger(t.id));\n\n if (threads.length === 1) {\n const resolved = threads[0]!.id;\n output.warn(`${commandLabel}: --thread-id not provided; using thread ${resolved}`);\n return resolved;\n }\n if (threads.length === 0) {\n throw usageError(\n `--thread-id is required (session reports no threads)`,\n { code: 'thread_id_required' },\n );\n }\n throw usageError(\n `--thread-id required: ${threads.length} threads available`,\n {\n code: 'thread_id_required',\n data: { availableThreads: threads.map(t => ({ id: t.id, name: t.name })) },\n },\n );\n } finally {\n await client.close();\n }\n}\n\ninterface StackTraceResponse {\n stackFrames?: ReadonlyArray<{ id?: unknown }>;\n}\n\n// Phase 11 plan 02 (PAUSED-02): when `--frame-id` is omitted, resolve it to\n// the topmost frame of the most-recently-stopped thread on a paused session.\n// Hints go to stderr; resolution failures fall through to a no-frame evaluate\n// so the user's request is never aborted by auto-frame plumbing.\nasync function resolveAutoFrameId(output: OutputWriter, name: string | undefined): Promise<number | undefined> {\n const hint = (message: string): void => output.warn(`evaluate: ${message}`);\n let client;\n try {\n client = await createControllerClient({ dapCliHome: process.env.DAP_CLI_HOME });\n } catch {\n hint(`auto-frame failed (controller unavailable); sending evaluate without --frame-id`);\n return undefined;\n }\n\n try {\n let status: SessionStatusForAutoFrame;\n try {\n status = await client.request<SessionStatusForAutoFrame>('sessions.status', name === undefined ? undefined : { name });\n } catch {\n hint(`auto-frame failed (status lookup failed); sending evaluate without --frame-id`);\n return undefined;\n }\n\n if (status.paused !== true) {\n hint(`session not paused; sending evaluate without --frame-id (uses adapter REPL context)`);\n return undefined;\n }\n\n let threadId: number | undefined;\n const stoppedThreadIds: readonly number[] = Array.isArray(status.stoppedThreadIds) ? status.stoppedThreadIds : [];\n if (stoppedThreadIds.length > 0) {\n threadId = stoppedThreadIds[0];\n if (stoppedThreadIds.length > 1) {\n hint(`auto-selected frame from thread ${threadId}; ${stoppedThreadIds.length} threads paused — pass --thread-id or --frame-id to disambiguate`);\n }\n } else {\n let threadsResponse: ThreadsResponse;\n try {\n threadsResponse = await client.request<ThreadsResponse>('dap.request', { command: 'threads', args: {}, ...(name === undefined ? {} : { name }) });\n } catch (error) {\n hint(`auto-frame failed (threads request failed: ${describeError(error)}); sending evaluate without --frame-id`);\n return undefined;\n }\n const firstThreadId = threadsResponse.threads?.[0]?.id;\n if (typeof firstThreadId !== 'number' || !Number.isInteger(firstThreadId)) {\n hint(`auto-frame failed (no threads reported); sending evaluate without --frame-id`);\n return undefined;\n }\n threadId = firstThreadId;\n }\n\n let stackResponse: StackTraceResponse;\n try {\n stackResponse = await client.request<StackTraceResponse>('dap.request', {\n command: 'stackTrace',\n args: { threadId, startFrame: 0, levels: 1 },\n ...(name === undefined ? {} : { name }),\n });\n } catch (error) {\n hint(`auto-frame failed (stackTrace request failed: ${describeError(error)}); sending evaluate without --frame-id`);\n return undefined;\n }\n\n const firstFrameId = stackResponse.stackFrames?.[0]?.id;\n if (typeof firstFrameId !== 'number' || !Number.isInteger(firstFrameId)) {\n hint(`auto-frame failed (empty stack trace); sending evaluate without --frame-id`);\n return undefined;\n }\n return firstFrameId;\n } finally {\n await client.close();\n }\n}\n\nfunction describeError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n// Phase 12 plan 02 (BPCMD-03): when `breakpoints set` returns any unverified\n// breakpoint, automatically follow up with a loadedSources probe and attach\n// a structured `verificationDiagnostic` to the success payload. The primary\n// `setBreakpoints` request is never failed by a follow-up error — the worst\n// case is `loadedSourcesCount: -1` plus a degraded hint.\nasync function buildVerificationDiagnostic(\n client: ControllerClient,\n requestedPath: string,\n breakpointsResponse: ReadonlyArray<SetBreakpointsResponseBreakpoint>,\n name: string | undefined,\n): Promise<VerificationDiagnostic> {\n const totalCount = breakpointsResponse.length;\n const unverifiedCount = breakpointsResponse.filter(b => b.verified === false).length;\n const recipe = `dap-cli dap loaded-sources${name === undefined ? '' : ` --name ${name}`}`;\n const baseHint = `${unverifiedCount} of ${totalCount} breakpoints unverified`;\n\n // Phase 17 follow-up: count js-debug child sessions up front so every\n // diagnostic branch can include them and the wrong-process hint can be\n // softened when children exist.\n const childSessionCount = await countChildSessions(client, name);\n\n let supportsLoadedSources = false;\n try {\n const caps = await client.request<CapabilitiesResponse>('dap.capabilities', name === undefined ? undefined : { name });\n supportsLoadedSources = caps?.capabilities?.supportsLoadedSourcesRequest === true;\n if (!supportsLoadedSources) {\n return {\n unverifiedCount,\n totalCount,\n loadedSourcesCount: -1,\n matchingLoadedSources: [],\n childSessionCount,\n hint: `${baseHint}; loadedSources lookup failed (adapter does not support loadedSources). Try running: ${recipe}`,\n recipe,\n };\n }\n } catch (err) {\n return {\n unverifiedCount,\n totalCount,\n loadedSourcesCount: -1,\n matchingLoadedSources: [],\n childSessionCount,\n hint: `${baseHint}; loadedSources lookup failed (capabilities probe failed: ${describeError(err)}). Try running: ${recipe}`,\n recipe,\n };\n }\n\n let loaded: LoadedSourcesResponse;\n try {\n const loadedRequest = compactObject({ command: 'loadedSources', args: {}, name });\n loaded = await client.request<LoadedSourcesResponse>('dap.request', loadedRequest);\n } catch (err) {\n return {\n unverifiedCount,\n totalCount,\n loadedSourcesCount: -1,\n matchingLoadedSources: [],\n childSessionCount,\n hint: `${baseHint}; loadedSources lookup failed (${describeError(err)}). Try running: ${recipe}`,\n recipe,\n };\n }\n\n const sources = loaded.sources ?? [];\n const loadedSourcesCount = sources.length;\n const wantBasename = path.basename(requestedPath);\n const cmp: (a: string, b: string) => boolean = process.platform === 'win32'\n ? (a, b) => a.toLowerCase() === b.toLowerCase()\n : (a, b) => a === b;\n const matchingLoadedSources = sources\n .filter(s => typeof s.path === 'string' && (cmp(s.path, requestedPath) || cmp(path.basename(s.path), wantBasename)))\n .map(s => {\n const sourcePath = s.path as string;\n return typeof s.name === 'string' ? { path: sourcePath, name: s.name } : { path: sourcePath };\n });\n\n const isTsSource = /\\.(?:ts|tsx|mts|cts)$/i.test(requestedPath);\n const sourceMapHint = isTsSource\n ? ' If the bp is on a .ts source, also try the compiled .js path under your build output, or pass `--out-files` / `--resolve-source-maps` matching your build (e.g. `--out-files \"${workspaceFolder}/out/**/*.js\"`).'\n : '';\n\n let hint: string;\n if (loadedSourcesCount === 0) {\n if (childSessionCount > 0) {\n // Multi-process js-debug attach (pwa-node / pwa-chrome). Loaded sources\n // live on the child sessions, not the bootstrap parent. The previous\n // \"wrong process\" wording was actively misleading here — this branch\n // exists specifically for that case.\n hint = `${baseHint}; parent has 0 loaded sources but session has ${childSessionCount} child session(s). This is normal for multi-process js-debug attaches — runtime sources live on children. js-debug should forward the breakpoint to the children that own the source; if it stays unverified after the program runs past the line, the source-map mapping likely failed.${sourceMapHint} Run: ${recipe}`;\n } else {\n hint = `${baseHint}; debuggee has loaded 0 sources — likely attached to the wrong process. Run: ${recipe}`;\n }\n } else if (matchingLoadedSources.length === 0) {\n hint = `${baseHint}; ${loadedSourcesCount} sources loaded but none match ${wantBasename}. Check source maps / outFiles.${sourceMapHint} Run: ${recipe}`;\n } else {\n hint = `${baseHint} despite ${matchingLoadedSources.length} matching loaded source(s). Check breakpoint line numbers. Run: ${recipe}`;\n }\n\n return { unverifiedCount, totalCount, loadedSourcesCount, matchingLoadedSources, childSessionCount, hint, recipe };\n}\n\nasync function countChildSessions(client: ControllerClient, parentName: string | undefined): Promise<number> {\n if (parentName === undefined) {\n return 0;\n }\n try {\n const list = await client.request<ReadonlyArray<SessionsListEntry>>('sessions.list', { includeChildren: true });\n // Re-bind through the typed annotation: Array.isArray's predicate widens to any[].\n const entries: ReadonlyArray<SessionsListEntry> = Array.isArray(list) ? list : [];\n const parent = entries.find(entry => typeof entry === 'object' && entry !== null && (entry as { name?: string }).name === parentName);\n if (parent === undefined) {\n return 0;\n }\n const parentId = parent.id;\n if (typeof parentId !== 'string') {\n return 0;\n }\n return entries.filter(entry => entry.parent_session_id === parentId).length;\n } catch {\n return 0;\n }\n}","import { usageError } from '../errors.js';\n\nexport function parseJsonOption(value: string): unknown {\n try {\n return JSON.parse(value) as unknown;\n } catch {\n throw usageError('Invalid JSON argument.', { code: 'invalid_json' });\n }\n}\n\nexport function parseJsonRecordOption(value: string): Record<string, unknown> {\n const parsed = parseJsonOption(value);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw usageError('JSON argument must be an object.', { code: 'invalid_json' });\n }\n return parsed as Record<string, unknown>;\n}","import type { Command } from 'commander';\nimport { usageError } from '../errors.js';\nimport type { OutputWriter } from '../outputWriter.js';\nimport { createControllerClient } from '../../controller/client.js';\nimport { dapGeneratedCommands, type DapGeneratedArgumentType, type DapGeneratedArgumentValidation, type DapGeneratedCommandMetadata } from '../../generated/dapCommandRegistry.js';\nimport { parseJsonOption } from './jsonOptions.js';\n\nexport interface GeneratedDapCommandOptions {\n json?: string;\n name?: string;\n}\n\nexport function registerGeneratedDapCommands(program: Command, output: OutputWriter): void {\n const dap = program\n .command('dap')\n .helpGroup('DAP protocol escape hatches')\n .description('Send generated DAP requests by protocol command name');\n\n for (const metadata of dapGeneratedCommands) {\n if (metadata.direction !== 'clientToAdapter') {\n continue;\n }\n\n dap\n .command(metadata.cliName)\n .description(`Send DAP ${metadata.command} request`)\n .option('--json <json>', 'request arguments as JSON', '{}')\n .option('--name <name>', 'session name or id')\n .action(async (options: GeneratedDapCommandOptions) => {\n await sendGeneratedDapRequest(output, metadata, parseJsonOption(options.json ?? '{}'), options.name, `dap ${metadata.cliName}`);\n });\n }\n}\n\nexport async function sendGeneratedDapRequest(output: OutputWriter, metadata: DapGeneratedCommandMetadata, args: unknown, name: string | undefined, commandLabel: string): Promise<void> {\n validateGeneratedDapArguments(metadata.validation, args, metadata.command);\n const client = await createControllerClient({ dapCliHome: process.env.DAP_CLI_HOME });\n try {\n output.success(await client.request('dap.request', createDapRequestParams(metadata.command, args, name)), { command: commandLabel });\n } finally {\n await client.close();\n }\n}\n\nexport function validateGeneratedDapArguments(validation: DapGeneratedArgumentValidation, args: unknown, command: string): void {\n if (!validation.argsRequired && args === undefined) {\n return;\n }\n\n if (!isRecord(args)) {\n throw invalidDapArguments(command, 'DAP request arguments must be a JSON object.');\n }\n\n for (const property of validation.requiredProperties) {\n if (!(property in args)) {\n throw invalidDapArguments(command, `Missing required DAP argument: ${property}.`);\n }\n }\n\n for (const property of validation.propertyTypes) {\n if (property.name in args && !isGeneratedArgumentType(args[property.name], property.type)) {\n throw invalidDapArguments(command, `Invalid DAP argument '${property.name}': expected ${property.type}.`);\n }\n }\n}\n\nfunction createDapRequestParams(command: string, args: unknown, name: string | undefined): { command: string; args: unknown; name?: string } {\n const params: { command: string; args: unknown; name?: string } = { command, args };\n if (name !== undefined) {\n params.name = name;\n }\n\n return params;\n}\n\nfunction invalidDapArguments(command: string, message: string): Error {\n return usageError(message, {\n code: 'invalid_dap_arguments',\n diagnostics: [`Invalid arguments for DAP request '${command}': ${message}`],\n });\n}\n\nfunction isGeneratedArgumentType(value: unknown, type: DapGeneratedArgumentType): boolean {\n switch (type) {\n case 'array':\n return Array.isArray(value);\n case 'boolean':\n return typeof value === 'boolean';\n case 'integer':\n return Number.isInteger(value);\n case 'number':\n return typeof value === 'number' && Number.isFinite(value);\n case 'object':\n return isRecord(value) && !Array.isArray(value);\n case 'string':\n return typeof value === 'string';\n case 'unknown':\n return true;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function requireGeneratedCommand(command: string): DapGeneratedCommandMetadata {\n const metadata = dapGeneratedCommands.find(entry => entry.command === command);\n if (metadata === undefined || metadata.direction !== 'clientToAdapter') {\n throw usageError(`DAP request command '${command}' is not available as a client command.`, { code: 'unknown_dap_command' });\n }\n\n return metadata;\n}\n\nexport function parseIntegerOption(value: string | undefined, optionName: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const parsed = Number.parseInt(value, 10);\n if (!Number.isSafeInteger(parsed)) {\n throw usageError(`Invalid --${optionName} value.`, { code: 'invalid_number' });\n }\n\n return parsed;\n}\n\nexport function parseRequiredIntegerOption(value: string | undefined, optionName: string): number {\n const parsed = parseIntegerOption(value, optionName);\n if (parsed === undefined) {\n throw usageError(`Missing required option: --${optionName}.`, { code: 'missing_parameter' });\n }\n\n return parsed;\n}\n\nexport function parseIntegerValues(values: readonly string[] | undefined, optionName: string): number[] {\n if (values === undefined || values.length === 0) {\n throw usageError(`Missing required option: --${optionName}.`, { code: 'missing_parameter' });\n }\n\n return values.map(value => parseRequiredIntegerOption(value, optionName));\n}\n","import path from 'node:path';\nimport type { Command } from 'commander';\nimport { usageError } from '../errors.js';\nimport { createControllerClient } from '../../controller/client.js';\nimport type { AdapterDescriptor } from '../../adapters/descriptor.js';\nimport { loadAdapterConfig } from '../../adapters/config.js';\nimport { AdapterRegistry } from '../../adapters/registry.js';\nimport {\n type LaunchConfiguration,\n loadVSCodeLaunchJson,\n listLaunchConfigEntries,\n mapDebugpyFlags,\n mapJsDebugFlags,\n applyJsDebugSourceMapDefaults,\n resolveAdapterIdFromType,\n resolveLaunchConfig,\n resolveLaunchConfigEntry,\n resolveLaunchConfigurationConfig,\n} from '../../config/launchConfig.js';\nimport { inferAdapterAndType } from '../../config/programInference.js';\nimport type { OutputWriter } from '../outputWriter.js';\nimport { parseJsonOption, parseJsonRecordOption } from './jsonOptions.js';\n\ninterface DapStartCommandOptions {\n adapter?: string;\n config?: string;\n workspace?: string;\n listConfigs?: boolean;\n json?: string;\n script?: string;\n name?: string;\n use?: boolean;\n program?: string;\n cwd?: string;\n runtimeExecutable?: string;\n runtimeArgs?: string[];\n url?: string;\n port?: string;\n python?: string;\n type?: string;\n args?: string[];\n sourceMaps?: string;\n outFiles?: string[];\n resolveSourceMaps?: string[];\n jsonOverrides?: string;\n stopOnEntry?: boolean;\n}\n\ninterface DapRequestCommandOptions {\n json?: string;\n name?: string;\n}\n\ninterface DapCapabilitiesCommandOptions {\n name?: string;\n}\n\ninterface DapEventsCommandOptions {\n name?: string;\n afterCursor?: string;\n limit?: string;\n include?: string;\n exclude?: string;\n}\n\nexport function registerDapCoreCommands(program: Command, output: OutputWriter): void {\n program\n .command('launch')\n .helpGroup('Launch & attach')\n .description('Start a DAP launch session using an adapter id, named launch config, or fake adapter')\n .option('--adapter <adapter>', 'adapter id (inferred from --type or --program when omitted)')\n .option('--config <name>', 'named .vscode/launch.json configuration')\n .option('--workspace <path>', 'workspace root for .vscode/launch.json discovery and variable substitution')\n .option('--list-configs', 'list VS Code launch configurations and compounds without starting a session')\n .option('--json <json>', 'raw adapter-native launch configuration JSON', '{}')\n .option('--script <script>', 'fake adapter script')\n .option('--name <name>', 'session name', 'default')\n .option('--program <path>', 'program path override')\n .option('--cwd <path>', 'working directory override')\n .option('--runtime-executable <path>', 'runtime executable override')\n .option('--runtime-args <arg...>', 'runtime argument overrides')\n .option('--url <url>', 'URL override for browser adapters')\n .option('--port <port>', 'debug port override')\n .option('--python <path>', 'Python executable override')\n .option('--type <type>', 'adapter-native debug type (inferred from --adapter or --program when omitted)')\n .option('--args <arg...>', 'program argument overrides')\n .option('--source-maps <boolean>', 'source map enablement override')\n .option('--out-files <pattern...>', 'source map output file patterns')\n .option('--resolve-source-maps <pattern...>', 'set resolveSourceMapLocations on the resolved config (variadic; mirrors --out-files)')\n .option('--json-overrides <json>', 'extra JSON object merged on top of --config (between named-config and --json layers)')\n .option('--stop-on-entry', 'halt at the first program statement (adapter must support stopOnEntry)')\n .option('--no-use', 'do not make the new session active')\n .action(async (options: DapStartCommandOptions) => {\n await startDap(output, 'launch', options);\n });\n\n program\n .command('attach')\n .helpGroup('Launch & attach')\n .description('Start a DAP attach session using an adapter id, named launch config, or fake adapter')\n .option('--adapter <adapter>', 'adapter id (inferred from --type or --program when omitted)')\n .option('--config <name>', 'named .vscode/launch.json configuration')\n .option('--workspace <path>', 'workspace root for .vscode/launch.json discovery and variable substitution')\n .option('--list-configs', 'list VS Code launch configurations and compounds without starting a session')\n .option('--json <json>', 'raw adapter-native attach configuration JSON', '{}')\n .option('--script <script>', 'fake adapter script')\n .option('--name <name>', 'session name', 'default')\n .option('--program <path>', 'program path override')\n .option('--cwd <path>', 'working directory override')\n .option('--runtime-executable <path>', 'runtime executable override')\n .option('--runtime-args <arg...>', 'runtime argument overrides')\n .option('--url <url>', 'URL override for browser adapters')\n .option('--port <port>', 'debug port override')\n .option('--python <path>', 'Python executable override')\n .option('--type <type>', 'adapter-native debug type (inferred from --adapter or --program when omitted)')\n .option('--args <arg...>', 'program argument overrides')\n .option('--source-maps <boolean>', 'source map enablement override')\n .option('--out-files <pattern...>', 'source map output file patterns')\n .option('--resolve-source-maps <pattern...>', 'set resolveSourceMapLocations on the resolved config (variadic; mirrors --out-files)')\n .option('--json-overrides <json>', 'extra JSON object merged on top of --config (between named-config and --json layers)')\n .option('--stop-on-entry', 'halt at the first program statement (adapter must support stopOnEntry)')\n .option('--no-use', 'do not make the new session active')\n .action(async (options: DapStartCommandOptions) => {\n await startDap(output, 'attach', options);\n });\n\n program\n .command('request')\n .helpGroup('DAP protocol escape hatches')\n .argument('<command>', 'DAP request command')\n .option('--json <json>', 'request arguments as JSON', '{}')\n .option('--name <name>', 'session name or id')\n .description('Send raw DAP request with JSON arguments (escape hatch)')\n .addHelpText('after', `\n\nExamples:\n $ dap-cli request threads\n $ dap-cli request stackTrace --json '{\"threadId\":1}'\n`)\n .action(async (command: string, options: DapRequestCommandOptions) => {\n await withController(output, 'request', async client => client.request('dap.request', {\n command,\n args: parseJsonOption(options.json ?? '{}'),\n name: options.name,\n }));\n });\n\n program\n .command('capabilities')\n .helpGroup('DAP protocol escape hatches')\n .option('--name <name>', 'session name or id')\n .description('Return adapter capabilities for a fake/custom session')\n .action(async (options: DapCapabilitiesCommandOptions) => {\n await withController(output, 'capabilities', async client => client.request('dap.capabilities', createNameParams(options.name)));\n });\n\n program\n .command('events')\n .helpGroup('DAP protocol escape hatches')\n .option('--name <name>', 'session name or id')\n .option('--after-cursor <cursor>', 'return events after cursor')\n .option('--limit <count>', 'maximum events to return')\n .option('--include <names>', 'comma-separated event names to include (applied before --limit)')\n .option('--exclude <names>', 'comma-separated event names to exclude (applied before --limit)')\n .description('Poll recent DAP events with cursor-based pagination')\n .addHelpText('after', `\n\nExamples:\n $ dap-cli events\n $ dap-cli events --after-cursor 12 --limit 25\n $ dap-cli events --limit 50 --exclude loadedSource\n $ dap-cli events --include stopped,thread,output\n`)\n .action(async (options: DapEventsCommandOptions) => {\n await runEventsCommand(output, options);\n });\n}\n\nfunction createNameParams(name: string | undefined): { name?: string } {\n return name === undefined ? {} : { name };\n}\n\nasync function startDap(output: OutputWriter, mode: 'launch' | 'attach', options: DapStartCommandOptions): Promise<void> {\n const workspace = path.resolve(options.workspace ?? process.cwd());\n if (options.listConfigs === true) {\n output.success(listLaunchConfigEntries(await loadVSCodeLaunchJson(workspace)), { command: 'launch configs' });\n return;\n }\n\n const namedEntry = await resolveNamedEntry(options.config, workspace);\n const jsonConfig = parseJsonRecordOption(options.json ?? '{}');\n // Phase 10 plan 02 (OVRD-01): additive override layer between named-config and --json.\n const jsonOverrides = options.jsonOverrides !== undefined\n ? parseJsonRecordOption(options.jsonOverrides)\n : undefined;\n const adapterConfig = await loadAdapterConfig(process.env.DAP_CLI_HOME);\n if (namedEntry?.kind === 'compound') {\n for (const memberName of namedEntry.compound.configurations) {\n if (!namedEntry.document.configurations.some(configuration => configuration.name === memberName)) {\n throw usageError(`Compound member '${memberName}' was not found.`, {\n code: 'compound_member_not_found',\n diagnostics: [`Compound '${namedEntry.compound.name}' references missing configuration '${memberName}'.`],\n data: { workspaceFolder: workspace, compoundName: namedEntry.compound.name, memberName },\n });\n }\n }\n const members = await Promise.all(namedEntry.compound.configurations.map(async memberName => {\n const memberConfig = namedEntry.document.configurations.find(configuration => configuration.name === memberName);\n if (memberConfig === undefined) {\n throw new Error(`Preflight missed compound member '${memberName}'.`);\n }\n return createCompoundStartMember(memberConfig, memberName, namedEntry.document.workspaceFolder, mode, options, jsonConfig, jsonOverrides, adapterConfig);\n }));\n\n await withController(output, mode, async client => client.request('dap.startCompound', {\n name: namedEntry.compound.name,\n stopAll: namedEntry.compound.stopAll !== false,\n use: options.use !== false,\n members,\n }), { timeoutMs: startControllerRequestTimeoutMs });\n return;\n }\n\n const namedConfig = namedEntry?.configuration;\n // Phase 10 plan 01 (AUTOROUTE-01): when --config resolves to a launch.json\n // entry whose `request:` field disagrees with the CLI verb, the launch.json\n // is the source of truth — auto-route to the matching DAP request and\n // surface a warning. Mirrors the per-member logic in\n // createCompoundStartMember below. The auto-route ONLY fires when --config\n // is used; CLI-flag-only and --json-only paths stay verb-driven.\n const effectiveMode: 'launch' | 'attach' =\n namedConfig?.request === 'attach' ? 'attach'\n : namedConfig?.request === 'launch' ? 'launch'\n : mode;\n const autoRouted = effectiveMode !== mode;\n const { adapterId, inferredType } = resolveAdapterAndType(options, namedConfig, adapterConfig.launchConfigTypeMap);\n const adapterFlags = mapFlagsForAdapter(adapterId, collectFlagOverrides(options, inferredType));\n const adapterDefaults = getAdapterDefaults(adapterConfig, adapterId, effectiveMode);\n const config = {\n ...await mapConfigForAdapter(adapterId, resolveLaunchConfig({ namedConfig: { ...adapterDefaults, ...namedConfig }, jsonOverrides, jsonConfig, flags: adapterFlags }), workspace),\n request: effectiveMode,\n };\n const descriptor = adapterId === 'fake'\n ? createFakeDescriptor(options.script ?? (effectiveMode === 'attach' ? 'attach-stopped' : 'stopped-on-entry'), effectiveMode)\n : new AdapterRegistry({ config: adapterConfig }).resolve(adapterId);\n\n const client = await createControllerClient({ dapCliHome: process.env.DAP_CLI_HOME, timeoutMs: startControllerRequestTimeoutMs });\n try {\n const response = await client.request('dap.start', {\n mode: effectiveMode,\n name: options.name ?? 'default',\n use: options.use !== false,\n descriptor,\n config,\n });\n const payload = autoRouted\n ? {\n ...(response as Record<string, unknown>),\n warnings: [`auto_routed_to: '${options.config ?? ''}' has request:'${effectiveMode}'; CLI verb '${mode}' was overridden`],\n autoRouted: { code: 'auto_routed_to', from: mode, to: effectiveMode, configName: options.config ?? null },\n }\n : response;\n output.success(payload, { command: effectiveMode });\n } finally {\n await client.close();\n }\n}\n\nasync function createCompoundStartMember(\n configuration: LaunchConfiguration,\n memberName: string,\n workspaceFolder: string,\n commandMode: 'launch' | 'attach',\n options: DapStartCommandOptions,\n jsonConfig: Record<string, unknown>,\n jsonOverrides: Record<string, unknown> | undefined,\n adapterConfig: Awaited<ReturnType<typeof loadAdapterConfig>>,\n): Promise<{ memberName: string; mode: 'launch' | 'attach'; descriptor: AdapterDescriptor; config: Record<string, unknown> }> {\n const resolvedConfig = resolveLaunchConfigurationConfig(configuration, { workspaceFolder });\n const memberMode = resolvedConfig.request === 'attach' ? 'attach' : resolvedConfig.request === 'launch' ? 'launch' : commandMode;\n const { adapterId, inferredType } = resolveAdapterAndType(options, resolvedConfig, adapterConfig.launchConfigTypeMap);\n const adapterFlags = mapFlagsForAdapter(adapterId, collectFlagOverrides(options, inferredType));\n const adapterDefaults = getAdapterDefaults(adapterConfig, adapterId, memberMode);\n const config = {\n ...await mapConfigForAdapter(adapterId, resolveLaunchConfig({ namedConfig: { ...adapterDefaults, ...resolvedConfig }, jsonOverrides, jsonConfig, flags: adapterFlags }), workspaceFolder),\n request: memberMode,\n };\n const descriptor = adapterId === 'fake'\n ? createFakeDescriptor(options.script ?? (memberMode === 'attach' ? 'attach-stopped' : 'stopped-on-entry'), memberMode)\n : new AdapterRegistry({ config: adapterConfig }).resolve(adapterId);\n\n return { memberName, mode: memberMode, descriptor, config };\n}\n\nfunction getAdapterDefaults(adapterConfig: Awaited<ReturnType<typeof loadAdapterConfig>>, adapterId: string, mode: 'launch' | 'attach'): Record<string, unknown> {\n const configuredAdapter = adapterConfig.adapters?.[adapterId];\n const defaults = mode === 'launch' ? configuredAdapter?.launchDefaults : configuredAdapter?.attachDefaults;\n return defaults ?? {};\n}\n\ntype NamedEntryResolution =\n | { kind: 'configuration'; configuration: Record<string, unknown> }\n | { kind: 'compound'; compound: { name: string; configurations: string[]; stopAll?: boolean | undefined }; document: Awaited<ReturnType<typeof loadVSCodeLaunchJson>> };\n\nasync function resolveNamedEntry(name: string | undefined, workspace: string): Promise<NamedEntryResolution | undefined> {\n if (name === undefined) {\n return undefined;\n }\n\n const document = await loadVSCodeLaunchJson(workspace);\n const entry = resolveLaunchConfigEntry(document, name);\n if (entry.kind === 'compound') {\n return { kind: 'compound', compound: entry.compound, document };\n }\n\n return { kind: 'configuration', configuration: resolveLaunchConfigurationConfig(entry.configuration, { workspaceFolder: workspace }) };\n}\n\nfunction resolveAdapterAndType(\n options: DapStartCommandOptions,\n namedConfig: Record<string, unknown> | undefined,\n customTypeMap: Record<string, string> | undefined,\n): { adapterId: string; inferredType: string | undefined } {\n if (namedConfig !== undefined) {\n if (options.adapter !== undefined) {\n return { adapterId: options.adapter, inferredType: undefined };\n }\n const type = namedConfig.type;\n if (typeof type !== 'string') {\n throw usageError('Named launch configuration is missing a string type.', { code: 'unknown_launch_type' });\n }\n return { adapterId: resolveAdapterIdFromType(type, customTypeMap), inferredType: undefined };\n }\n\n const result = inferAdapterAndType({\n adapter: options.adapter,\n type: options.type,\n program: options.program,\n customTypeMap,\n });\n const inferredType = result.inferred.type && result.type !== undefined ? result.type : undefined;\n return { adapterId: result.adapterId, inferredType };\n}\n\nfunction collectFlagOverrides(options: DapStartCommandOptions, inferredType?: string): Record<string, unknown> {\n const flags: Record<string, unknown> = {};\n setIfDefined(flags, 'program', options.program);\n setIfDefined(flags, 'cwd', options.cwd);\n setIfDefined(flags, 'runtimeExecutable', options.runtimeExecutable);\n setIfDefined(flags, 'runtimeArgs', options.runtimeArgs);\n setIfDefined(flags, 'url', options.url);\n setIfDefined(flags, 'python', options.python);\n setIfDefined(flags, 'type', options.type);\n if (options.type === undefined && inferredType !== undefined) {\n flags.type = inferredType;\n }\n setIfDefined(flags, 'args', options.args);\n setIfDefined(flags, 'outFiles', options.outFiles);\n setIfDefined(flags, 'resolveSourceMapLocations', options.resolveSourceMaps);\n setIfDefined(flags, 'stopOnEntry', options.stopOnEntry);\n if (options.sourceMaps !== undefined) {\n flags.sourceMaps = parseBooleanOption(options.sourceMaps, 'source-maps');\n }\n if (options.port !== undefined) {\n flags.port = parseOptionalInteger(options.port, 'port');\n }\n\n return flags;\n}\n\nfunction mapFlagsForAdapter(adapterId: string, flags: Record<string, unknown>): Record<string, unknown> {\n if (adapterId === 'js-debug') {\n return mapJsDebugFlags(flags);\n }\n if (adapterId === 'debugpy') {\n return mapDebugpyFlags(flags);\n }\n\n return flags;\n}\n\nasync function mapConfigForAdapter(adapterId: string, config: Record<string, unknown>, workspaceFolder: string): Promise<Record<string, unknown>> {\n if (adapterId === 'js-debug') {\n return applyJsDebugSourceMapDefaults(mapJsDebugFlags(config), { workspaceFolder });\n }\n if (adapterId === 'debugpy') {\n return mapDebugpyFlags(config);\n }\n\n return config;\n}\n\nfunction setIfDefined(target: Record<string, unknown>, key: string, value: unknown): void {\n if (value !== undefined) {\n target[key] = value;\n }\n}\n\nconst startControllerRequestTimeoutMs = 60_000;\n\nasync function withController<T>(output: OutputWriter, command: string, callback: (client: Awaited<ReturnType<typeof createControllerClient>>) => Promise<T>, options: { timeoutMs?: number } = {}): Promise<void> {\n const client = await createControllerClient({ dapCliHome: process.env.DAP_CLI_HOME, ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}) });\n try {\n output.success(await callback(client), { command });\n } finally {\n await client.close();\n }\n}\n\nfunction createFakeDescriptor(script: string, mode: 'launch' | 'attach'): AdapterDescriptor {\n return {\n id: 'fake',\n label: 'Generic fake adapter',\n transport: {\n kind: 'stdio',\n command: process.execPath,\n args: ['--experimental-strip-types', path.join(process.cwd(), 'tests', 'fixtures', 'fake-adapter-entry.ts'), '--script', script, '--mode', mode],\n },\n };\n}\n\nfunction parseOptionalInteger(value: string | undefined, optionName: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!/^\\d+$/.test(value)) {\n throw usageError(`Invalid --${optionName} value.`, { code: 'invalid_number' });\n }\n\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed)) {\n throw usageError(`Invalid --${optionName} value.`, { code: 'invalid_number' });\n }\n\n return parsed;\n}\n\nfunction parseBooleanOption(value: string, optionName: string): boolean {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n\n throw usageError(`Invalid --${optionName} value.`, { code: 'invalid_boolean' });\n}\n\n// Plan 05-18 (gap H-2): cap each filter list to prevent unbounded set growth\n// from a malicious or accidental command line (T-05-18-02).\nconst eventFilterMaxEntries = 50;\n\ninterface EventsRecentResponse {\n sessionId: string;\n name: string;\n events: Array<Record<string, unknown> & { event: string }>;\n cursor: number;\n dropped: number;\n capacity?: number;\n capacityByPriority?: { high: number; low: number };\n truncatedToCapacity?: number;\n}\n\ninterface EventsCommandData extends EventsRecentResponse {\n warnings?: string[];\n}\n\nfunction parseEventNameList(raw: string | undefined, optionName: string): ReadonlySet<string> | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const names = raw.split(',').map(name => name.trim()).filter(name => name.length > 0);\n if (names.length === 0) {\n return undefined;\n }\n if (names.length > eventFilterMaxEntries) {\n throw usageError(`Too many entries in --${optionName} (max ${eventFilterMaxEntries}).`, { code: 'invalid_filter' });\n }\n return new Set(names);\n}\n\nasync function runEventsCommand(output: OutputWriter, options: DapEventsCommandOptions): Promise<void> {\n const include = parseEventNameList(options.include, 'include');\n const exclude = parseEventNameList(options.exclude, 'exclude');\n const hasFilter = include !== undefined || exclude !== undefined;\n const limit = parseOptionalInteger(options.limit, 'limit');\n const afterCursor = parseOptionalInteger(options.afterCursor, 'after-cursor');\n\n // Plan 05-18 (gap H-2): if a filter is active, fetch the full snapshot so\n // the filter is applied BEFORE the limit. Otherwise pass --limit through to\n // the cache so it can compute `truncatedToCapacity` itself.\n const requestParams: { name?: string; afterCursor?: number; limit?: number } = {};\n if (options.name !== undefined) {\n requestParams.name = options.name;\n }\n if (afterCursor !== undefined) {\n requestParams.afterCursor = afterCursor;\n }\n if (limit !== undefined && !hasFilter) {\n requestParams.limit = limit;\n }\n\n await withController(output, 'events', async client => {\n const response = await client.request<EventsRecentResponse>('events.recent', requestParams);\n let events = response.events;\n if (include !== undefined) {\n events = events.filter(e => include.has(e.event));\n }\n if (exclude !== undefined) {\n events = events.filter(e => !exclude.has(e.event));\n }\n if (limit !== undefined && hasFilter) {\n events = limit === 0 ? [] : events.slice(-limit);\n }\n\n const data: EventsCommandData = { ...response, events };\n\n // Plan 05-18 (gap H-2): honest warning when the user's --limit exceeds\n // what the cache can hold. Surfaces alongside `truncatedToCapacity`.\n if (limit !== undefined && response.capacity !== undefined && limit > response.capacity) {\n data.warnings = [`limit_exceeded_capacity: ${limit} requested, ${response.capacity} available`];\n // When --include/--exclude is active we did NOT pass `limit` to the\n // server, so the server didn't set truncatedToCapacity. Set it here so\n // the field is consistent with the warning.\n if (data.truncatedToCapacity === undefined) {\n data.truncatedToCapacity = response.capacity;\n }\n }\n\n return data;\n });\n}\n","import { promises as fs } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { adapterDescriptorSchema } from './descriptor.js';\nimport { getDapCliHome } from '../config/paths.js';\nimport { usageError } from '../cli/errors.js';\n\nconst configuredAdapterDescriptorSchema = adapterDescriptorSchema.and(z.object({\n launchDefaults: z.record(z.string(), z.unknown()).optional(),\n attachDefaults: z.record(z.string(), z.unknown()).optional(),\n}));\n\nexport const adapterConfigSchema = z.object({\n adapters: z.record(z.string(), configuredAdapterDescriptorSchema).optional(),\n launchConfigTypeMap: z.record(z.string(), z.string()).optional(),\n});\n\nexport type AdapterConfig = z.infer<typeof adapterConfigSchema>;\n\nexport async function loadAdapterConfig(dapCliHome?: string): Promise<AdapterConfig> {\n const configPath = getAdapterConfigPath(dapCliHome);\n\n try {\n const raw = await fs.readFile(configPath, 'utf8');\n return parseAdapterConfig(raw);\n } catch (error) {\n if (isNodeError(error) && error.code === 'ENOENT') {\n return {};\n }\n\n if (error instanceof SyntaxError || error instanceof z.ZodError) {\n throw invalidConfigError(error);\n }\n\n throw error;\n }\n}\n\nexport async function saveAdapterConfig(config: AdapterConfig, dapCliHome?: string): Promise<void> {\n const configPath = getAdapterConfigPath(dapCliHome);\n const validated = adapterConfigSchema.parse(config);\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n const tempPath = `${configPath}.${process.pid}.${randomUUID()}.tmp`;\n await fs.writeFile(tempPath, `${JSON.stringify(validated, null, 2)}\\n`, 'utf8');\n await fs.rename(tempPath, configPath);\n}\n\nfunction getAdapterConfigPath(dapCliHome: string | undefined): string {\n const home = dapCliHome === undefined ? getDapCliHome() : getDapCliHome({ ...process.env, DAP_CLI_HOME: dapCliHome });\n return path.join(home, 'config', 'adapters.json');\n}\n\nfunction parseAdapterConfig(raw: string): AdapterConfig {\n return adapterConfigSchema.parse(JSON.parse(raw));\n}\n\nfunction invalidConfigError(error: SyntaxError | z.ZodError): Error {\n return usageError('Invalid adapter config.', {\n code: 'invalid_config',\n diagnostics: error instanceof z.ZodError ? error.issues.map(issue => issue.message) : [error.message],\n });\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error;\n}","import { existsSync } from 'node:fs';\nimport { spawnSync } from 'node:child_process';\nimport type { AdapterDescriptor } from '../descriptor.js';\nimport { usageError } from '../../cli/errors.js';\nimport { getDapCliVenvPythonPath } from '../../config/paths.js';\n\nexport function createDebugpyDescriptor(pythonPath?: string): AdapterDescriptor {\n const resolvedPythonPath = pythonPath ?? resolveDefaultDebugpyPythonPath();\n\n return {\n id: 'debugpy',\n label: 'Python Debug Adapter (debugpy)',\n transport: {\n kind: 'stdio',\n command: resolvedPythonPath,\n args: ['-m', 'debugpy.adapter'],\n },\n };\n}\n\nfunction resolveDefaultDebugpyPythonPath(): string {\n const provisionedPython = getDapCliVenvPythonPath();\n const candidates = [provisionedPython, 'python3'];\n\n if (existsSync(provisionedPython) && pythonHasDebugpy(provisionedPython)) {\n return provisionedPython;\n }\n\n if (pythonHasDebugpy('python3')) {\n return 'python3';\n }\n\n throw usageError('debugpy adapter is not installed.', {\n code: 'debugpy_not_found',\n diagnostics: [\n 'Run npm run setup-adapters to provision debugpy, or see docs/ADAPTER-SETUP.md for advanced manual provisioning.',\n `Checked: ${candidates.join(', ')}`,\n ],\n });\n}\n\nfunction pythonHasDebugpy(pythonPath: string): boolean {\n const result = spawnSync(pythonPath, ['-c', 'import debugpy'], { encoding: 'utf8' });\n return result.status === 0;\n}","import type { AdapterDescriptor } from './descriptor.js';\nimport { loadAdapterConfig, type AdapterConfig } from './config.js';\nimport { createDebugpyDescriptor } from './builtins/debugpy.js';\nimport { createJsDebugDescriptor } from './builtins/jsDebug.js';\nimport { usageError } from '../cli/errors.js';\n\nexport interface AdapterRegistryEntry {\n id: string;\n label: string;\n source: 'built-in' | 'custom';\n}\n\nexport interface AdapterRegistryOptions {\n builtInAdapters?: readonly AdapterDescriptor[];\n config?: AdapterConfig;\n includeDefaultBuiltIns?: boolean;\n}\n\nexport interface CreateAdapterRegistryOptions {\n dapCliHome?: string;\n builtInAdapters?: readonly AdapterDescriptor[];\n includeDefaultBuiltIns?: boolean;\n}\n\ninterface BuiltInAdapterFactory {\n id: string;\n label: string;\n create(): AdapterDescriptor;\n}\n\nexport class AdapterRegistry {\n private readonly builtInAdapters = new Map<string, BuiltInAdapterFactory>();\n private readonly customAdapters = new Map<string, AdapterDescriptor>();\n\n public constructor(options: AdapterRegistryOptions = {}) {\n if (options.includeDefaultBuiltIns !== false) {\n this.builtInAdapters.set('js-debug', {\n id: 'js-debug',\n label: 'JavaScript Debug Adapter (Node, Chrome, Electron)',\n create: () => createJsDebugDescriptor(),\n });\n this.builtInAdapters.set('debugpy', {\n id: 'debugpy',\n label: 'Python Debug Adapter (debugpy)',\n create: () => createDebugpyDescriptor(),\n });\n }\n\n for (const descriptor of options.builtInAdapters ?? []) {\n this.builtInAdapters.set(descriptor.id, {\n id: descriptor.id,\n label: descriptor.label,\n create: () => descriptor,\n });\n }\n\n for (const descriptor of Object.values(options.config?.adapters ?? {})) {\n this.customAdapters.set(descriptor.id, descriptor);\n }\n }\n\n public resolve(id: string): AdapterDescriptor {\n const builtInAdapter = this.builtInAdapters.get(id);\n if (builtInAdapter !== undefined) {\n return builtInAdapter.create();\n }\n\n const customAdapter = this.customAdapters.get(id);\n if (customAdapter !== undefined) {\n return customAdapter;\n }\n\n throw usageError(`Adapter '${id}' was not found.`, {\n code: 'adapter_not_found',\n diagnostics: [`No built-in or custom adapter is configured with id '${id}'.`],\n });\n }\n\n public listAll(): AdapterRegistryEntry[] {\n const entries: AdapterRegistryEntry[] = [];\n for (const descriptor of this.builtInAdapters.values()) {\n entries.push({ id: descriptor.id, label: descriptor.label, source: 'built-in' });\n }\n for (const descriptor of this.customAdapters.values()) {\n if (!this.builtInAdapters.has(descriptor.id)) {\n entries.push({ id: descriptor.id, label: descriptor.label, source: 'custom' });\n }\n }\n\n return entries.sort((left, right) => left.id.localeCompare(right.id));\n }\n}\n\nexport async function createAdapterRegistry(options: CreateAdapterRegistryOptions = {}): Promise<AdapterRegistry> {\n const config = await loadAdapterConfig(options.dapCliHome);\n return new AdapterRegistry({\n ...(options.builtInAdapters === undefined ? {} : { builtInAdapters: options.builtInAdapters }),\n ...(options.includeDefaultBuiltIns === undefined ? {} : { includeDefaultBuiltIns: options.includeDefaultBuiltIns }),\n config,\n });\n}","import { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { parse, type ParseError } from 'jsonc-parser';\nimport { z } from 'zod';\nimport { usageError } from '../cli/errors.js';\n\nexport interface LaunchConfiguration extends Record<string, unknown> {\n type: string;\n name: string;\n request?: string | undefined;\n}\n\nexport interface LaunchCompound extends Record<string, unknown> {\n name: string;\n configurations: string[];\n stopAll?: boolean | undefined;\n}\n\nexport interface LaunchJsonDocument {\n workspaceFolder: string;\n configurations: LaunchConfiguration[];\n compounds: LaunchCompound[];\n}\n\nexport type LaunchConfigEntry =\n | { kind: 'configuration'; name: string; type: string; request?: string | undefined }\n | { kind: 'compound'; name: string; configurations: string[]; stopAll?: boolean | undefined };\n\nexport type ResolvedLaunchConfigEntry =\n | { kind: 'configuration'; configuration: LaunchConfiguration }\n | { kind: 'compound'; compound: LaunchCompound };\n\nexport interface LaunchConfigSources {\n namedConfig?: Record<string, unknown> | undefined;\n // Phase 10 plan 02 (OVRD-01): additive layer for `--json-overrides`.\n // Shallow merge — nested objects are replaced wholesale, not deep-merged.\n jsonOverrides?: Record<string, unknown> | undefined;\n jsonConfig?: Record<string, unknown> | undefined;\n flags?: Record<string, unknown> | undefined;\n}\n\nexport interface ResolveLaunchConfigurationOptions {\n workspaceFolder: string;\n platform?: NodeJS.Platform | undefined;\n env?: NodeJS.ProcessEnv | Record<string, string | undefined> | undefined;\n execPath?: string | undefined;\n userHome?: string | undefined;\n}\n\nexport const launchConfigTypeMap: Record<string, string> = {\n node: 'js-debug',\n 'pwa-node': 'js-debug',\n chrome: 'js-debug',\n 'pwa-chrome': 'js-debug',\n python: 'debugpy',\n debugpy: 'debugpy',\n};\n\nconst maxLaunchJsonBytes = 256 * 1024;\nconst platformKeys = new Set(['osx', 'mac', 'linux', 'windows']);\nconst vscodeOnlyLaunchConfigKeys = new Set(['presentation', 'internalConsoleOptions', 'serverReadyAction', 'preLaunchTask', 'postDebugTask']);\nconst launchVariablePattern = /\\$\\{([^}]+)\\}/g;\nconst launchJsonSchema = z.object({\n configurations: z.array(z.object({\n type: z.string().min(1),\n name: z.string().min(1),\n request: z.string().min(1).optional(),\n }).catchall(z.unknown())).max(100).optional(),\n compounds: z.array(z.object({\n name: z.string().min(1),\n configurations: z.array(z.string().min(1)).min(1),\n stopAll: z.boolean().optional(),\n }).catchall(z.unknown())).max(100).optional(),\n}).catchall(z.unknown());\n\nexport function resolveLaunchConfig(sources: LaunchConfigSources): Record<string, unknown> {\n return {\n ...sources.namedConfig,\n ...sources.jsonOverrides,\n ...sources.jsonConfig,\n ...sources.flags,\n };\n}\n\nexport function resolveLaunchConfigurationConfig(\n config: Record<string, unknown>,\n options: ResolveLaunchConfigurationOptions,\n): Record<string, unknown> {\n const workspaceFolder = path.resolve(options.workspaceFolder);\n const platform = options.platform ?? process.platform;\n const merged = applyPlatformOverlay(config, platform);\n const context = {\n workspaceFolder,\n workspaceFolderBasename: path.basename(workspaceFolder),\n userHome: options.userHome ?? os.homedir(),\n execPath: options.execPath ?? process.execPath,\n env: options.env ?? process.env,\n };\n const resolved = resolveLaunchValue(merged, '$', context);\n if (!isPlainRecord(resolved)) {\n throw usageError('Invalid launch configuration.', {\n code: 'invalid_launch_config',\n diagnostics: ['Resolved launch configuration is not an object.'],\n });\n }\n\n for (const key of vscodeOnlyLaunchConfigKeys) {\n delete resolved[key];\n }\n\n return resolved;\n}\n\nexport async function loadVSCodeLaunchConfig(cwd: string): Promise<LaunchConfiguration[]> {\n return (await loadVSCodeLaunchJson(cwd)).configurations;\n}\n\nexport async function loadVSCodeLaunchJson(cwd: string): Promise<LaunchJsonDocument> {\n const workspaceFolder = path.resolve(cwd);\n const launchJsonPath = path.join(cwd, '.vscode', 'launch.json');\n\n try {\n const stat = await fs.stat(launchJsonPath);\n if (stat.size > maxLaunchJsonBytes) {\n throw usageError('Invalid launch.json.', {\n code: 'invalid_launch_json',\n diagnostics: ['.vscode/launch.json is larger than 256KB.'],\n });\n }\n\n const raw = await fs.readFile(launchJsonPath, 'utf8');\n // Round 6 R6-I: VS Code tolerates UTF-8 BOM in launch.json (and editors\n // on Windows often save with BOM). Strip a leading BOM before handing\n // the buffer to the JSONC parser so copies of real workspaces parse.\n const normalized = raw.charCodeAt(0) === 0xFEFF ? raw.slice(1) : raw;\n const parsed = launchJsonSchema.parse(parseJsonc(normalized));\n return {\n workspaceFolder,\n configurations: parsed.configurations ?? [],\n compounds: parsed.compounds ?? [],\n };\n } catch (error) {\n if (isNodeError(error) && error.code === 'ENOENT') {\n return { workspaceFolder, configurations: [], compounds: [] };\n }\n\n // Round 6 R6-H: pointing --workspace at a regular file (instead of a\n // directory) caused fs.stat on `<file>/.vscode/launch.json` to reject\n // with ENOTDIR; only ENOENT was mapped, so the error leaked as a generic\n // internal_error/exit-70. Map the common filesystem-shape errors to a\n // structured invalid_workspace usage error that names the offending path.\n if (isNodeError(error) && (error.code === 'ENOTDIR' || error.code === 'EACCES' || error.code === 'ELOOP' || error.code === 'ENAMETOOLONG')) {\n throw usageError('Invalid workspace path.', {\n code: 'invalid_workspace',\n diagnostics: [`Cannot read '${launchJsonPath}': ${error.code}.`, 'Pass --workspace <directory> pointing at a real workspace folder.'],\n data: { workspaceFolder, errno: error.code },\n });\n }\n\n if (error instanceof SyntaxError || error instanceof z.ZodError) {\n throw usageError('Invalid launch.json.', {\n code: 'invalid_launch_json',\n diagnostics: error instanceof z.ZodError ? error.issues.map(issue => issue.message) : [error.message],\n });\n }\n\n throw error;\n }\n}\n\nexport function listLaunchConfigEntries(document: LaunchJsonDocument): LaunchConfigEntry[] {\n return [\n ...document.configurations.map(configuration => ({\n kind: 'configuration' as const,\n name: configuration.name,\n type: configuration.type,\n request: configuration.request,\n })),\n ...document.compounds.map(compound => ({\n kind: 'compound' as const,\n name: compound.name,\n configurations: compound.configurations,\n stopAll: compound.stopAll,\n })),\n ];\n}\n\nexport function resolveLaunchConfigEntry(document: LaunchJsonDocument, name: string): ResolvedLaunchConfigEntry {\n const configuration = document.configurations.find(entry => entry.name === name);\n const compound = document.compounds.find(entry => entry.name === name);\n\n if (configuration !== undefined && compound !== undefined) {\n const matches: LaunchConfigEntry[] = [\n { kind: 'configuration', name: configuration.name, type: configuration.type, request: configuration.request },\n { kind: 'compound', name: compound.name, configurations: compound.configurations, stopAll: compound.stopAll },\n ];\n throw usageError(`Launch configuration '${name}' is ambiguous.`, {\n code: 'launch_config_ambiguous',\n diagnostics: [`Workspace '${document.workspaceFolder}' contains both a configuration and compound named '${name}'.`],\n data: { workspaceFolder: document.workspaceFolder, name, matches },\n });\n }\n\n if (configuration !== undefined) {\n return { kind: 'configuration', configuration };\n }\n\n if (compound !== undefined) {\n return { kind: 'compound', compound };\n }\n\n throw usageError(`Launch configuration '${name}' was not found.`, {\n code: 'launch_config_not_found',\n diagnostics: [`Workspace '${document.workspaceFolder}' has no configuration or compound named '${name}'.`],\n data: { workspaceFolder: document.workspaceFolder, name },\n });\n}\n\nfunction parseJsonc(raw: string): unknown {\n const errors: ParseError[] = [];\n const parsed = parse(raw, errors, { allowTrailingComma: true, disallowComments: false }) as unknown;\n if (errors.length > 0) {\n throw new SyntaxError(`Invalid JSONC at offset ${errors[0]?.offset ?? 0}.`);\n }\n\n return parsed;\n}\n\nexport function resolveAdapterIdFromType(type: string, customTypeMap: Record<string, string> = {}): string {\n const adapterId = customTypeMap[type] ?? launchConfigTypeMap[type];\n if (adapterId === undefined) {\n throw usageError(`Unknown launch configuration type '${type}'.`, {\n code: 'unknown_launch_type',\n diagnostics: [`No adapter mapping is configured for launch type '${type}'.`],\n });\n }\n\n return adapterId;\n}\n\nexport function mapJsDebugFlags(flags: Record<string, unknown>): Record<string, unknown> {\n const mapped = copyDefinedEntries(flags);\n\n if (flags.type === 'node') {\n mapped.type = 'pwa-node';\n }\n if (flags.type === 'chrome') {\n mapped.type = 'pwa-chrome';\n }\n if (flags.runtimeExecutable === 'electron') {\n mapped.type = 'pwa-node';\n }\n\n return mapped;\n}\n\nexport async function applyJsDebugSourceMapDefaults(config: Record<string, unknown>, options: { workspaceFolder: string }): Promise<Record<string, unknown>> {\n if (!isJsDebugLaunchType(config.type)) {\n return config;\n }\n\n const hasTsConfig = await pathExists(path.join(options.workspaceFolder, 'tsconfig.json'));\n if (!hasTsConfig) {\n return config;\n }\n\n const mapped = { ...config };\n if (mapped.sourceMaps === undefined) {\n mapped.sourceMaps = true;\n }\n if (mapped.outFiles === undefined) {\n mapped.outFiles = [\n path.join(options.workspaceFolder, 'dist', '**', '*.js'),\n path.join(options.workspaceFolder, 'out', '**', '*.js'),\n path.join(options.workspaceFolder, 'build', '**', '*.js'),\n ];\n }\n\n return mapped;\n}\n\nexport function mapDebugpyFlags(flags: Record<string, unknown>): Record<string, unknown> {\n const mapped = copyDefinedEntries(flags);\n if (typeof flags.port === 'number') {\n mapped.connect = { host: '127.0.0.1', port: flags.port };\n delete mapped.port;\n }\n\n return mapped;\n}\n\nfunction applyPlatformOverlay(config: Record<string, unknown>, platform: NodeJS.Platform): Record<string, unknown> {\n const base: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(config)) {\n if (!platformKeys.has(key)) {\n base[key] = cloneLaunchValue(value);\n }\n }\n\n const overlayNames = platform === 'darwin' ? ['osx', 'mac'] : platform === 'win32' ? ['windows'] : platform === 'linux' ? ['linux'] : [];\n for (const overlayName of overlayNames) {\n const overlay = config[overlayName];\n if (isPlainRecord(overlay)) {\n mergeRecordInto(base, overlay);\n }\n }\n\n return base;\n}\n\nfunction mergeRecordInto(target: Record<string, unknown>, source: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(source)) {\n const current = target[key];\n if (isPlainRecord(current) && isPlainRecord(value)) {\n mergeRecordInto(current, value);\n } else {\n target[key] = cloneLaunchValue(value);\n }\n }\n}\n\nfunction resolveLaunchValue(value: unknown, jsonPath: string, context: Required<ResolveLaunchContext>): unknown {\n if (typeof value === 'string') {\n return resolveLaunchString(value, jsonPath, context);\n }\n\n if (Array.isArray(value)) {\n return value.map((item, index) => resolveLaunchValue(item, `${jsonPath}[${index}]`, context));\n }\n\n if (isPlainRecord(value)) {\n const resolved: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n resolved[key] = resolveLaunchValue(entry, `${jsonPath}.${key}`, context);\n }\n return resolved;\n }\n\n return value;\n}\n\ninterface ResolveLaunchContext {\n workspaceFolder: string;\n workspaceFolderBasename: string;\n userHome: string;\n execPath: string;\n env: NodeJS.ProcessEnv | Record<string, string | undefined>;\n}\n\nfunction resolveLaunchString(value: string, jsonPath: string, context: Required<ResolveLaunchContext>): string {\n return value.replace(launchVariablePattern, (token: string, variableName: string): string => {\n if (variableName === 'workspaceFolder') {\n return context.workspaceFolder;\n }\n if (variableName === 'workspaceFolderBasename') {\n return context.workspaceFolderBasename;\n }\n if (variableName === 'userHome') {\n return context.userHome;\n }\n if (variableName === 'execPath') {\n return context.execPath;\n }\n if (variableName.startsWith('env:')) {\n const envName = variableName.slice('env:'.length);\n const envValue = context.env[envName];\n if (envValue === undefined) {\n throw usageError(`Launch variable '${token}' could not be resolved.`, {\n code: 'unresolved_launch_variable',\n diagnostics: [`${jsonPath}: environment variable '${envName}' is not set.`],\n data: { token, path: jsonPath, variable: envName },\n });\n }\n return envValue;\n }\n if (variableName.startsWith('input:') || variableName.startsWith('command:')) {\n throw usageError(`Launch variable '${token}' is not supported.`, {\n code: 'unsupported_launch_variable',\n diagnostics: [`${jsonPath}: '${token}' requires VS Code interaction and is not supported by dap-cli.`],\n data: { token, path: jsonPath },\n });\n }\n\n throw usageError(`Launch variable '${token}' could not be resolved.`, {\n code: 'unresolved_launch_variable',\n diagnostics: [`${jsonPath}: '${token}' is not a supported launch variable.`],\n data: { token, path: jsonPath },\n });\n });\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.stat(filePath);\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === 'ENOENT') {\n return false;\n }\n throw error;\n }\n}\n\nfunction isJsDebugLaunchType(type: unknown): boolean {\n return type === 'node' || type === 'pwa-node' || type === 'chrome' || type === 'pwa-chrome';\n}\n\nfunction cloneLaunchValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(item => cloneLaunchValue(item));\n }\n\n if (isPlainRecord(value)) {\n const cloned: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n cloned[key] = cloneLaunchValue(entry);\n }\n return cloned;\n }\n\n return value;\n}\n\nfunction copyDefinedEntries(source: Record<string, unknown>): Record<string, unknown> {\n const target: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(source)) {\n if (value !== undefined) {\n target[key] = cloneLaunchValue(value);\n }\n }\n return target;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error;\n}","import path from 'node:path';\nimport { usageError } from '../cli/errors.js';\nimport { resolveAdapterIdFromType } from './launchConfig.js';\n\nexport interface InferAdapterAndTypeArgs {\n adapter?: string | undefined;\n type?: string | undefined;\n program?: string | undefined;\n customTypeMap?: Record<string, string> | undefined;\n}\n\nexport interface InferAdapterAndTypeResult {\n adapterId: string;\n type: string | undefined;\n inferred: { adapter: boolean; type: boolean };\n}\n\nconst extensionTable: Record<string, { adapterId: string; type: string }> = {\n '.py': { adapterId: 'debugpy', type: 'python' },\n '.js': { adapterId: 'js-debug', type: 'pwa-node' },\n '.mjs': { adapterId: 'js-debug', type: 'pwa-node' },\n '.cjs': { adapterId: 'js-debug', type: 'pwa-node' },\n '.ts': { adapterId: 'js-debug', type: 'pwa-node' },\n '.mts': { adapterId: 'js-debug', type: 'pwa-node' },\n '.cts': { adapterId: 'js-debug', type: 'pwa-node' },\n '.html': { adapterId: 'js-debug', type: 'pwa-chrome' },\n '.htm': { adapterId: 'js-debug', type: 'pwa-chrome' },\n};\n\nexport function inferAdapterAndType(args: InferAdapterAndTypeArgs): InferAdapterAndTypeResult {\n const { adapter, type, program, customTypeMap } = args;\n\n if (adapter !== undefined && type !== undefined) {\n return { adapterId: adapter, type, inferred: { adapter: false, type: false } };\n }\n\n if (adapter !== undefined) {\n const inferredType = defaultTypeForAdapter(adapter, program);\n return {\n adapterId: adapter,\n type: inferredType,\n inferred: { adapter: false, type: inferredType !== undefined },\n };\n }\n\n if (type !== undefined) {\n const adapterId = resolveAdapterIdFromType(type, customTypeMap);\n return { adapterId, type, inferred: { adapter: true, type: false } };\n }\n\n if (program !== undefined) {\n const extension = path.extname(program).toLowerCase();\n const match = extensionTable[extension];\n if (match === undefined) {\n throw usageError(`Cannot infer adapter from program extension '${extension}'. Pass --adapter or --type explicitly.`, {\n code: 'adapter_inference_failed',\n diagnostics: [`No adapter mapping is configured for program extension '${extension}'.`, 'Pass --adapter or --type explicitly.'],\n data: { program, extension },\n });\n }\n return { adapterId: match.adapterId, type: match.type, inferred: { adapter: true, type: true } };\n }\n\n return { adapterId: 'fake', type: undefined, inferred: { adapter: false, type: false } };\n}\n\nfunction defaultTypeForAdapter(adapterId: string, program: string | undefined): string | undefined {\n if (adapterId === 'js-debug') {\n if (program !== undefined) {\n const ext = path.extname(program).toLowerCase();\n if (ext === '.html' || ext === '.htm') {\n return 'pwa-chrome';\n }\n }\n return 'pwa-node';\n }\n if (adapterId === 'debugpy') {\n return 'python';\n }\n return undefined;\n}\n","import type { Command } from 'commander';\nimport { createControllerClient } from '../../controller/client.js';\nimport { usageError } from '../errors.js';\nimport type { OutputWriter } from '../outputWriter.js';\n\nexport function registerSessionCommands(program: Command, output: OutputWriter): void {\n program\n .command('sessions')\n .helpGroup('Sessions')\n .description('List known debug sessions (child sessions are hidden by default; use --show-children to include them)')\n .option('--show-children', 'include child sessions (e.g. js-debug pwa-chrome page-level children) in the listing')\n .option('--all', 'alias for --show-children')\n .action(async (options: { showChildren?: boolean; all?: boolean }) => {\n const includeChildren = options.showChildren === true || options.all === true;\n await withController(output, 'sessions', async client => client.request('sessions.list', { includeChildren }));\n });\n\n program\n .command('use')\n .helpGroup('Sessions')\n .argument('<name>', 'session name or id')\n .description('Set the active debug session')\n .action(async (name: string) => {\n await withController(output, 'use', async client => client.request('sessions.target', { name }));\n });\n\n program\n .command('detach')\n .helpGroup('Sessions')\n .option('--name <name>', 'session name or id')\n .description('Detach from a debug session')\n .action(async (options: { name?: string }) => {\n await withController(output, 'detach', async client => client.request('sessions.detach', createNameParams(options.name)));\n });\n\n program\n .command('close')\n .helpGroup('Sessions')\n .argument('[name]', 'session name or id (positional, optional)')\n .option('--name <name>', 'session name or id')\n .description('Close a debug session')\n .action(async (positional: string | undefined, options: { name?: string }) => {\n if (positional !== undefined && options.name !== undefined && positional !== options.name) {\n throw usageError('Provide --name OR positional id, not both.');\n }\n const target = positional ?? options.name;\n // Hand-driven gap H-8b (round 3): the controller's close handler runs\n // terminateRuntime which waits up to ~6s (1s exit + 200ms SIGTERM +\n // 200ms SIGKILL plus a `disconnect` round-trip that can stretch to\n // the DAP client's 5s timeout when an adapter is wedged). The default\n // IPC client timeout is 5s, so close was returning controller_request_timeout\n // exit 7 even though the underlying cascade finished cleanly. Give close\n // a 60s ceiling so the command surfaces the real outcome (orphanPids etc.)\n // instead of a misleading timeout. Other commands keep the 5s default.\n await withController(output, 'close', async client => client.request('sessions.close', createNameParams(target)), { timeoutMs: closeControllerRequestTimeoutMs });\n });\n\n program\n .command('cleanup')\n .helpGroup('Sessions')\n .option('--force', 'alias for --purge (legacy)')\n .option('--purge', 'also remove records for sessions dap-cli does not own')\n .description('Clean up stale session state')\n .action(async (options: { force?: boolean; purge?: boolean }) => {\n const purge = options.purge === true || options.force === true;\n await withController(output, 'cleanup', async client => client.request('sessions.cleanup', { purge }));\n });\n}\n\nasync function withController<T>(output: OutputWriter, command: string, callback: (client: Awaited<ReturnType<typeof createControllerClient>>) => Promise<T>, options: { timeoutMs?: number } = {}): Promise<void> {\n const client = await createControllerClient({ dapCliHome: process.env.DAP_CLI_HOME, ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}) });\n try {\n output.success(await callback(client), { command });\n } finally {\n await client.close();\n }\n}\n\nconst closeControllerRequestTimeoutMs = 60_000;\n\nfunction createNameParams(name: string | undefined): { name?: string } {\n return name === undefined ? {} : { name };\n}\n","import type { Command } from 'commander';\nimport { CliError, internalError, usageError } from './errors.js';\nimport { ExitCode } from './exitCodes.js';\nimport type { JsonWritable } from './output.js';\nimport { createOutputWriter } from './outputWriter.js';\nimport { createProgram, getProgramHumanOption, getProgramOutputWriter } from './program.js';\nimport { resolveOutputMode } from './outputMode.js';\n\nexport interface CliStreams {\n stdout: JsonWritable;\n stderr: JsonWritable;\n}\n\nexport async function main(args: readonly string[], program: Command | undefined = undefined, streams: CliStreams = process): Promise<ExitCode> {\n const command = getCommandName(args);\n const activeProgram = program ?? createProgram({ stdout: streams.stdout, stderr: streams.stderr });\n // Reuse the program's writer so warnings buffered by command handlers (e.g.\n // auto-resolve hints from `continue --thread-id`) survive into the top-level\n // failure envelope's meta.warnings instead of being silently dropped.\n const output = getProgramOutputWriter(activeProgram) ?? createOutputWriter({\n stream: streams.stdout,\n errorStream: streams.stderr,\n resolveMode: () => resolveOutputMode({ cliHuman: getProgramHumanOption(activeProgram), isStdoutTTY: streams.stdout.isTTY === true, env: process.env }),\n });\n\n activeProgram.configureOutput({\n writeOut: chunk => { streams.stdout.write(chunk); },\n writeErr: chunk => { streams.stderr.write(chunk); },\n });\n // Propagate to subcommands so `subcmd.outputHelp()` (used by the variadic\n // `help` walker in program.ts) routes through the captured streams instead\n // of process.stdout.\n configureSubcommandOutputs(activeProgram, streams);\n\n try {\n await activeProgram.parseAsync([...args], { from: 'user' });\n return ExitCode.Success;\n } catch (error) {\n if (isCommanderHelp(error)) {\n return ExitCode.Success;\n }\n\n if (error instanceof CliError) {\n const cliError = selectRenderableError(error, activeProgram, streams);\n output.failure(cliError, { command });\n return cliError.exitCode;\n }\n\n if (isCommanderError(error)) {\n const cliError = selectRenderableError(usageError(error.message, {\n code: 'usage_error',\n diagnostics: [error.message],\n }), activeProgram, streams);\n output.failure(cliError, { command });\n return cliError.exitCode;\n }\n\n const cliError = selectRenderableError(internalError('Unexpected internal error', {\n code: 'internal_error',\n diagnostics: ['The command failed unexpectedly.'],\n }), activeProgram, streams);\n output.failure(cliError, { command });\n return cliError.exitCode;\n }\n}\n\nfunction selectRenderableError(error: CliError, program: Command, streams: CliStreams): CliError {\n try {\n resolveOutputMode({ cliHuman: getProgramHumanOption(program), isStdoutTTY: streams.stdout.isTTY === true, env: process.env });\n return error;\n } catch (modeError) {\n if (modeError instanceof CliError) {\n return modeError;\n }\n throw modeError;\n }\n}\n\nfunction isCommanderError(error: unknown): error is Error {\n return error instanceof Error && error.name === 'CommanderError';\n}\n\nfunction configureSubcommandOutputs(command: Command, streams: CliStreams): void {\n for (const child of command.commands) {\n child.configureOutput({\n writeOut: chunk => { streams.stdout.write(chunk); },\n writeErr: chunk => { streams.stderr.write(chunk); },\n });\n configureSubcommandOutputs(child, streams);\n }\n}\n\nfunction isCommanderHelp(error: unknown): boolean {\n if (!isCommanderError(error)) {\n return false;\n }\n const code = 'code' in error ? (error as { code?: unknown }).code : undefined;\n if (code === 'commander.helpDisplayed' || code === 'commander.help') {\n return true;\n }\n // Defensive fallback: commander help paths are documented to exit 0;\n // other CommanderError flavors (unknown option, missing arg, ...) exit non-zero.\n const exitCode = 'exitCode' in error ? (error as { exitCode?: unknown }).exitCode : undefined;\n return exitCode === 0;\n}\n\nfunction getCommandName(args: readonly string[]): string {\n const commandParts = args\n .filter(arg => !arg.startsWith('-') && !arg.startsWith('{') && !arg.startsWith('['))\n .slice(0, 2);\n\n return commandParts.length > 0 ? commandParts.join(' ') : 'dap-cli';\n}\n","#!/usr/bin/env node\nimport { main } from './cli/main.js';\n\nprocess.exitCode = await main(process.argv.slice(2));\n"],"mappings":"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","names":["headerSeparator","spawn","path","z","z","path","path","randomBytes","z","path","path","spawn","createWriteStream","net","path","net","spawn","path","createWriteStream","appendStderrTail","terminateChild","net","waitForExit","path","path","spawn","z","isRecord","z","spawn","waitForExit","session","fs","path","z","z","path","fs","isNodeError","isNodeError","isRecord","isRecord","result","path","fs","path","path","fs","isRecord","createInitializeArgs","path","randomBytes","spawn","delay","path","isRecord","path","path","fs","randomUUID","path","z","z","fs","isNodeError","path","z","isNodeError","existsSync","existsSync","fs","path","z","z","path","path","fs","isNodeError","z","path","path","path","client","withController","createNameParams","require","cliError"]}