acpx 0.9.0 → 0.10.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.
- package/README.md +1 -0
- package/dist/{cli-Bf3yjqzE.js → cli-8dP_TqBp.js} +4 -4
- package/dist/{cli-Bf3yjqzE.js.map → cli-8dP_TqBp.js.map} +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +392 -12
- package/dist/cli.js.map +1 -1
- package/dist/{client-BssohYqM.d.ts → client-C4iJBO0j.d.ts} +2 -2
- package/dist/{client-BssohYqM.d.ts.map → client-C4iJBO0j.d.ts.map} +1 -1
- package/dist/{flags-C-rwARqg.js → flags--2oX_ubW.js} +3 -3
- package/dist/flags--2oX_ubW.js.map +1 -0
- package/dist/{flows-WLs26_5Y.js → flows-e4umXVbY.js} +4 -4
- package/dist/{flows-WLs26_5Y.js.map → flows-e4umXVbY.js.map} +1 -1
- package/dist/flows.d.ts +1 -1
- package/dist/flows.js +1 -1
- package/dist/{live-checkpoint-D5d-K9s1.js → live-checkpoint-CuFft_Nd.js} +300 -272
- package/dist/live-checkpoint-CuFft_Nd.js.map +1 -0
- package/dist/{output-DPg20dvn.js → output-Di77Yugq.js} +12 -12
- package/dist/{output-DPg20dvn.js.map → output-Di77Yugq.js.map} +1 -1
- package/dist/runtime.d.ts +2 -2
- package/dist/runtime.js +1 -1
- package/dist/{session-options-CFudjdkU.d.ts → session-options-Bh1bIqQ2.d.ts} +8 -1
- package/dist/{session-options-CFudjdkU.d.ts.map → session-options-Bh1bIqQ2.d.ts.map} +1 -1
- package/package.json +7 -1
- package/skills/acpx/SKILL.md +11 -2
- package/dist/flags-C-rwARqg.js.map +0 -1
- package/dist/live-checkpoint-D5d-K9s1.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-checkpoint-CuFft_Nd.js","names":["asRecord","asRecord","normalizeAgentName","asRecord","asRecord","sessionBaseDir","asRecord","hasOwn","isUserMessage","isAgentMessage","asRecord","fs","fs","isoNow","nowIso","canPromptForPermission","fs","canPromptForPermission","isoNow","waitForSpawn","asRecord","isoNow","waitForSpawn","ensureAcpxState","isoNow"],"sources":["../src/errors.ts","../src/types.ts","../src/acp/error-shapes.ts","../src/acp/error-normalization.ts","../src/agent-registry.ts","../src/async-control.ts","../src/prompt-content.ts","../src/acp/jsonrpc.ts","../src/session/event-log.ts","../src/acp/agent-session-id.ts","../src/session/runtime-session-id.ts","../src/session/persistence/serialize.ts","../src/session/persistence/parse.ts","../src/perf-metrics.ts","../src/persisted-key-policy.ts","../src/session/persistence/index.ts","../src/session/persistence/repository.ts","../src/permission-prompt.ts","../src/filesystem.ts","../src/permissions.ts","../src/spawn-command-options.ts","../src/acp/client-process.ts","../src/acp/agent-command.ts","../src/acp/auth-env.ts","../src/acp/session-control-errors.ts","../src/acp/terminal-manager.ts","../src/acp/client.ts","../src/runtime/engine/lifecycle.ts","../src/runtime/engine/session-options.ts","../src/session/conversation-model.ts","../src/session/config-options.ts","../src/session/mode-preference.ts","../src/acp/model-support.ts","../src/session/model-application.ts","../src/runtime/engine/reconnect.ts","../src/runtime/engine/connected-session.ts","../src/runtime/engine/prompt-turn.ts","../src/session/live-checkpoint.ts"],"sourcesContent":["import type { OutputErrorAcpPayload, OutputErrorCode, OutputErrorOrigin } from \"./types.js\";\n\ntype AcpxErrorOptions = ErrorOptions & {\n outputCode?: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n outputAlreadyEmitted?: boolean;\n};\n\nexport class AcpxOperationalError extends Error {\n readonly outputCode?: OutputErrorCode;\n readonly detailCode?: string;\n readonly origin?: OutputErrorOrigin;\n readonly retryable?: boolean;\n readonly acp?: OutputErrorAcpPayload;\n readonly outputAlreadyEmitted?: boolean;\n\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n this.outputCode = options?.outputCode;\n this.detailCode = options?.detailCode;\n this.origin = options?.origin;\n this.retryable = options?.retryable;\n this.acp = options?.acp;\n this.outputAlreadyEmitted = options?.outputAlreadyEmitted;\n }\n}\n\nexport class SessionNotFoundError extends AcpxOperationalError {\n readonly sessionId: string;\n\n constructor(sessionId: string) {\n super(`Session not found: ${sessionId}`);\n this.sessionId = sessionId;\n }\n}\n\nexport class SessionResolutionError extends AcpxOperationalError {}\n\nexport class AgentSpawnError extends AcpxOperationalError {\n readonly agentCommand: string;\n\n constructor(agentCommand: string, cause?: unknown) {\n super(`Failed to spawn agent command: ${agentCommand}`, {\n cause: cause instanceof Error ? cause : undefined,\n });\n this.agentCommand = agentCommand;\n }\n}\n\nexport class AgentStartupError extends AcpxOperationalError {\n readonly agentCommand: string;\n readonly exitCode: number | null;\n readonly signal: NodeJS.Signals | null;\n readonly stderrSummary?: string;\n\n constructor(params: {\n agentCommand: string;\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n stderrSummary?: string;\n cause?: unknown;\n }) {\n const exitSummary = `exit=${params.exitCode ?? \"null\"}, signal=${params.signal ?? \"null\"}`;\n const stderrSuffix =\n typeof params.stderrSummary === \"string\" && params.stderrSummary.trim().length > 0\n ? `: ${params.stderrSummary.trim()}`\n : \"\";\n super(`ACP agent exited before initialize completed (${exitSummary})${stderrSuffix}`, {\n cause: params.cause instanceof Error ? params.cause : undefined,\n outputCode: \"RUNTIME\",\n detailCode: \"AGENT_STARTUP_FAILED\",\n origin: \"acp\",\n });\n this.agentCommand = params.agentCommand;\n this.exitCode = params.exitCode;\n this.signal = params.signal;\n this.stderrSummary = params.stderrSummary?.trim() || undefined;\n }\n}\n\nexport class AgentDisconnectedError extends AcpxOperationalError {\n readonly reason: string;\n readonly exitCode: number | null;\n readonly signal: NodeJS.Signals | null;\n\n constructor(\n reason: string,\n exitCode: number | null,\n signal: NodeJS.Signals | null,\n options?: AcpxErrorOptions,\n ) {\n super(\n `ACP agent disconnected during request (${reason}, exit=${exitCode ?? \"null\"}, signal=${signal ?? \"null\"})`,\n {\n outputCode: \"RUNTIME\",\n detailCode: \"AGENT_DISCONNECTED\",\n origin: \"acp\",\n ...options,\n },\n );\n this.reason = reason;\n this.exitCode = exitCode;\n this.signal = signal;\n }\n}\n\nexport class UnsupportedPromptContentError extends AcpxOperationalError {\n constructor(message: string) {\n super(message, {\n outputCode: \"USAGE\",\n detailCode: \"UNSUPPORTED_PROMPT_CONTENT\",\n origin: \"acp\",\n });\n }\n}\n\nexport class SessionResumeRequiredError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"RUNTIME\",\n detailCode: \"SESSION_RESUME_REQUIRED\",\n origin: \"acp\",\n retryable: true,\n ...options,\n });\n }\n}\n\nexport class GeminiAcpStartupTimeoutError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"TIMEOUT\",\n detailCode: \"GEMINI_ACP_STARTUP_TIMEOUT\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class SessionModeReplayError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"RUNTIME\",\n detailCode: \"SESSION_MODE_REPLAY_FAILED\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class SessionModelReplayError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"RUNTIME\",\n detailCode: \"SESSION_MODEL_REPLAY_FAILED\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class SessionConfigOptionReplayError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"RUNTIME\",\n detailCode: \"SESSION_CONFIG_OPTION_REPLAY_FAILED\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class ClaudeAcpSessionCreateTimeoutError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"TIMEOUT\",\n detailCode: \"CLAUDE_ACP_SESSION_CREATE_TIMEOUT\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class CopilotAcpUnsupportedError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"RUNTIME\",\n detailCode: \"COPILOT_ACP_UNSUPPORTED\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class AuthPolicyError extends AcpxOperationalError {\n constructor(message: string, options?: AcpxErrorOptions) {\n super(message, {\n outputCode: \"RUNTIME\",\n detailCode: \"AUTH_REQUIRED\",\n origin: \"acp\",\n ...options,\n });\n }\n}\n\nexport class QueueConnectionError extends AcpxOperationalError {}\n\nexport class QueueProtocolError extends AcpxOperationalError {}\n\nexport class PermissionDeniedError extends AcpxOperationalError {}\n\nexport class PermissionPromptUnavailableError extends AcpxOperationalError {\n constructor() {\n super(\"Permission prompt unavailable in non-interactive mode\");\n }\n}\n","import type {\n AgentCapabilities,\n AnyMessage,\n McpServer,\n RequestPermissionRequest,\n SessionNotification,\n SessionConfigOption,\n SessionInfo,\n SetSessionConfigOptionResponse,\n StopReason,\n ToolKind,\n} from \"@agentclientprotocol/sdk\";\nexport type { McpServer, SessionNotification } from \"@agentclientprotocol/sdk\";\nimport type { PromptInput } from \"./prompt-content.js\";\n\nexport type AcpPermissionRequest = {\n sessionId: string;\n raw: RequestPermissionRequest;\n inferredKind: ToolKind | undefined;\n};\n\nexport type AcpPermissionDecision =\n | { outcome: \"allow_once\" }\n | { outcome: \"allow_always\" }\n | { outcome: \"reject_once\" }\n | { outcome: \"reject_always\" }\n | { outcome: \"cancel\" };\n\nexport const EXIT_CODES = {\n SUCCESS: 0,\n ERROR: 1,\n USAGE: 2,\n TIMEOUT: 3,\n NO_SESSION: 4,\n PERMISSION_DENIED: 5,\n INTERRUPTED: 130,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n\nexport const OUTPUT_FORMATS = [\"text\", \"json\", \"quiet\"] as const;\nexport type OutputFormat = (typeof OUTPUT_FORMATS)[number];\n\nexport const PERMISSION_MODES = [\"approve-all\", \"approve-reads\", \"deny-all\"] as const;\nexport type PermissionMode = (typeof PERMISSION_MODES)[number];\n\nexport const AUTH_POLICIES = [\"skip\", \"fail\"] as const;\nexport type AuthPolicy = (typeof AUTH_POLICIES)[number];\n\nexport const NON_INTERACTIVE_PERMISSION_POLICIES = [\"deny\", \"fail\"] as const;\nexport type NonInteractivePermissionPolicy = (typeof NON_INTERACTIVE_PERMISSION_POLICIES)[number];\n\nexport const PERMISSION_POLICY_ACTIONS = [\"approve\", \"deny\", \"escalate\"] as const;\nexport type PermissionPolicyAction = (typeof PERMISSION_POLICY_ACTIONS)[number];\n\nexport type PermissionPolicy = {\n autoApprove?: string[];\n autoDeny?: string[];\n escalate?: string[];\n defaultAction?: PermissionPolicyAction;\n};\n\nexport type PermissionEscalationEvent = {\n type: \"permission_escalation\";\n sessionId: string;\n toolCallId: string;\n toolName?: string;\n toolTitle: string;\n toolInput?: unknown;\n toolKind?: ToolKind;\n action: \"escalate\";\n matchedRule?: string;\n message: string;\n timestamp: string;\n};\n\nexport const SESSION_RESUME_POLICIES = [\"allow-new\", \"same-session-only\"] as const;\nexport type SessionResumePolicy = (typeof SESSION_RESUME_POLICIES)[number];\n\nexport const OUTPUT_STREAMS = [\"prompt\", \"control\"] as const;\nexport type OutputStream = (typeof OUTPUT_STREAMS)[number];\nexport type AcpJsonRpcMessage = AnyMessage;\nexport type AcpMessageDirection = \"outbound\" | \"inbound\";\n\nexport const OUTPUT_ERROR_CODES = [\n \"NO_SESSION\",\n \"TIMEOUT\",\n \"PERMISSION_DENIED\",\n \"PERMISSION_PROMPT_UNAVAILABLE\",\n \"RUNTIME\",\n \"USAGE\",\n] as const;\nexport type OutputErrorCode = (typeof OUTPUT_ERROR_CODES)[number];\n\nexport const OUTPUT_ERROR_ORIGINS = [\"cli\", \"runtime\", \"queue\", \"acp\"] as const;\nexport type OutputErrorOrigin = (typeof OUTPUT_ERROR_ORIGINS)[number];\n\nexport const QUEUE_ERROR_DETAIL_CODES = [\n \"QUEUE_OWNER_CLOSED\",\n \"QUEUE_OWNER_SHUTTING_DOWN\",\n \"QUEUE_OWNER_OVERLOADED\",\n \"QUEUE_OWNER_GENERATION_MISMATCH\",\n \"QUEUE_REQUEST_INVALID\",\n \"QUEUE_REQUEST_PAYLOAD_INVALID_JSON\",\n \"QUEUE_ACK_MISSING\",\n \"QUEUE_DISCONNECTED_BEFORE_ACK\",\n \"QUEUE_DISCONNECTED_BEFORE_COMPLETION\",\n \"QUEUE_PROTOCOL_INVALID_JSON\",\n \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n \"QUEUE_PROTOCOL_UNEXPECTED_RESPONSE\",\n \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n \"QUEUE_CONTROL_REQUEST_FAILED\",\n \"QUEUE_RUNTIME_PROMPT_FAILED\",\n] as const;\nexport type QueueErrorDetailCode = (typeof QUEUE_ERROR_DETAIL_CODES)[number];\n\nexport type OutputErrorAcpPayload = {\n code: number;\n message: string;\n data?: unknown;\n};\n\nexport type PermissionStats = {\n requested: number;\n approved: number;\n denied: number;\n cancelled: number;\n};\n\nexport type ClientOperationMethod =\n | \"fs/read_text_file\"\n | \"fs/write_text_file\"\n | \"terminal/create\"\n | \"terminal/output\"\n | \"terminal/wait_for_exit\"\n | \"terminal/kill\"\n | \"terminal/release\";\n\nexport type ClientOperationStatus = \"running\" | \"completed\" | \"failed\";\n\nexport type ClientOperation = {\n method: ClientOperationMethod;\n status: ClientOperationStatus;\n summary: string;\n details?: string;\n timestamp: string;\n};\n\nexport type SessionEventLog = {\n active_path: string;\n segment_count: number;\n max_segment_bytes: number;\n max_segments: number;\n last_write_at?: string;\n last_write_error?: string | null;\n};\n\nexport type PerfMetricSummary = {\n count: number;\n totalMs: number;\n maxMs: number;\n};\n\nexport type PerfMetricsSnapshot = {\n counters: Record<string, number>;\n timings: Record<string, PerfMetricSummary>;\n gauges: Record<string, number>;\n};\n\nexport type OutputFormatterContext = {\n sessionId: string;\n};\n\nexport type OutputPolicy = {\n format: OutputFormat;\n jsonStrict: boolean;\n suppressReads: boolean;\n suppressNonJsonStderr: boolean;\n queueErrorAlreadyEmitted: boolean;\n suppressSdkConsoleErrors: boolean;\n};\n\nexport type OutputErrorEmissionPolicy = {\n queueErrorAlreadyEmitted: boolean;\n};\n\nexport interface OutputFormatter {\n setContext(context: OutputFormatterContext): void;\n onAcpMessage(message: AcpJsonRpcMessage): void;\n onError(params: {\n code: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n timestamp?: string;\n }): void;\n onPermissionEscalation(event: PermissionEscalationEvent): void;\n flush(): void;\n}\n\nexport type AcpClientOptions = {\n agentCommand: string;\n cwd: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n sessionOptions?: {\n model?: string;\n allowedTools?: string[];\n maxTurns?: number;\n systemPrompt?: string | { append: string };\n };\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onAcpOutputMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n onPermissionEscalation?: (event: PermissionEscalationEvent) => void;\n onPermissionRequest?: (\n req: AcpPermissionRequest,\n ctx: { signal: AbortSignal },\n ) => Promise<AcpPermissionDecision | undefined>;\n};\n\nexport const SESSION_RECORD_SCHEMA = \"acpx.session.v1\" as const;\nexport type SessionMessageImage = {\n source: string;\n size?: {\n width: number;\n height: number;\n } | null;\n};\n\nexport type SessionMessageAudio = {\n source: string;\n mime_type: string;\n};\n\nexport type SessionUserContent =\n | {\n Text: string;\n }\n | {\n Mention: {\n uri: string;\n content: string;\n };\n }\n | {\n Image: SessionMessageImage;\n }\n | {\n Audio: SessionMessageAudio;\n };\n\nexport type SessionToolUse = {\n id: string;\n name: string;\n raw_input: string;\n input: unknown;\n is_input_complete: boolean;\n thought_signature?: string | null;\n};\n\nexport type SessionToolResultContent =\n | {\n Text: string;\n }\n | {\n Image: SessionMessageImage;\n };\n\nexport type SessionToolResult = {\n tool_use_id: string;\n tool_name: string;\n is_error: boolean;\n content: SessionToolResultContent;\n output?: unknown;\n};\n\nexport type SessionAgentContent =\n | {\n Text: string;\n }\n | {\n Thinking: {\n text: string;\n signature?: string | null;\n };\n }\n | {\n RedactedThinking: string;\n }\n | {\n ToolUse: SessionToolUse;\n };\n\nexport type SessionUserMessage = {\n id: string;\n content: SessionUserContent[];\n};\n\nexport type SessionAgentMessage = {\n content: SessionAgentContent[];\n tool_results: Record<string, SessionToolResult>;\n reasoning_details?: unknown;\n};\n\nexport type SessionMessage =\n | {\n User: SessionUserMessage;\n }\n | {\n Agent: SessionAgentMessage;\n }\n | \"Resume\";\n\nexport type SessionTokenUsage = {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n};\n\nexport type SessionConversation = {\n title?: string | null;\n messages: SessionMessage[];\n updated_at: string;\n cumulative_token_usage: SessionTokenUsage;\n request_token_usage: Record<string, SessionTokenUsage>;\n};\n\nexport type SessionAcpxState = {\n reset_on_next_ensure?: boolean;\n current_mode_id?: string;\n desired_mode_id?: string;\n desired_config_options?: Record<string, string>;\n current_model_id?: string;\n available_models?: string[];\n available_commands?: string[];\n config_options?: SessionConfigOption[];\n session_options?: {\n model?: string;\n allowed_tools?: string[];\n max_turns?: number;\n system_prompt?: string | { append: string };\n };\n};\n\nexport type SessionImportedFrom = {\n recordId: string;\n cwdOriginal: string;\n exportedBy: string;\n exportedAt: string;\n};\n\nexport type SessionRecord = {\n schema: typeof SESSION_RECORD_SCHEMA;\n acpxRecordId: string;\n acpSessionId: string;\n agentSessionId?: string;\n agentCommand: string;\n cwd: string;\n name?: string;\n createdAt: string;\n lastUsedAt: string;\n lastSeq: number;\n lastRequestId?: string;\n eventLog: SessionEventLog;\n closed?: boolean;\n closedAt?: string;\n pid?: number;\n agentStartedAt?: string;\n lastPromptAt?: string;\n lastAgentExitCode?: number | null;\n lastAgentExitSignal?: NodeJS.Signals | null;\n lastAgentExitAt?: string;\n lastAgentDisconnectReason?: string;\n protocolVersion?: number;\n agentCapabilities?: AgentCapabilities;\n title?: string | null;\n messages: SessionMessage[];\n updated_at: string;\n cumulative_token_usage: SessionTokenUsage;\n request_token_usage: Record<string, SessionTokenUsage>;\n acpx?: SessionAcpxState;\n importedFrom?: SessionImportedFrom;\n};\n\nexport type RunPromptResult = {\n stopReason: StopReason;\n permissionStats: PermissionStats;\n sessionId: string;\n};\n\nexport type SessionSendResult = RunPromptResult & {\n record: SessionRecord;\n resumed: boolean;\n loadError?: string;\n};\n\nexport type SessionSetModeResult = {\n record: SessionRecord;\n resumed: boolean;\n loadError?: string;\n};\n\nexport type SessionSetConfigOptionResult = {\n record: SessionRecord;\n response: SetSessionConfigOptionResponse;\n resumed: boolean;\n loadError?: string;\n};\n\nexport type SessionSetModelResult = {\n record: SessionRecord;\n resumed: boolean;\n loadError?: string;\n};\n\nexport type SessionEnsureResult = {\n record: SessionRecord;\n created: boolean;\n};\n\nexport type AgentSessionListResult = {\n _meta?: {\n [key: string]: unknown;\n } | null;\n source: \"agent\";\n sessions: SessionInfo[];\n cursor?: string;\n cwd?: string;\n nextCursor?: string | null;\n};\n\nexport type SessionEnqueueResult = {\n queued: true;\n sessionId: string;\n requestId: string;\n};\n\nexport type SessionSendOutcome = SessionSendResult | SessionEnqueueResult;\nexport type { PromptInput };\n","import type { OutputErrorAcpPayload } from \"../types.js\";\n\nconst RESOURCE_NOT_FOUND_ACP_CODES = new Set([-32001, -32002]);\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nexport function toAcpErrorPayload(value: unknown): OutputErrorAcpPayload | undefined {\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n\n if (typeof record.code !== \"number\" || !Number.isFinite(record.code)) {\n return undefined;\n }\n if (typeof record.message !== \"string\" || record.message.length === 0) {\n return undefined;\n }\n\n return {\n code: record.code,\n message: record.message,\n data: record.data,\n };\n}\n\nfunction extractAcpErrorInternal(value: unknown, depth: number): OutputErrorAcpPayload | undefined {\n if (depth > 5) {\n return undefined;\n }\n\n const direct = toAcpErrorPayload(value);\n if (direct) {\n return direct;\n }\n\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n\n return extractNestedAcpError(record, depth);\n}\n\nfunction extractNestedAcpError(\n record: Record<string, unknown>,\n depth: number,\n): OutputErrorAcpPayload | undefined {\n for (const key of [\"error\", \"acp\", \"cause\"] as const) {\n if (key in record) {\n const nested = extractAcpErrorInternal(record[key], depth + 1);\n if (nested) {\n return nested;\n }\n }\n }\n return undefined;\n}\n\nexport function formatUnknownErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (error && typeof error === \"object\") {\n const maybeMessage = (error as { message?: unknown }).message;\n if (typeof maybeMessage === \"string\" && maybeMessage.length > 0) {\n return maybeMessage;\n }\n\n try {\n return JSON.stringify(error);\n } catch {\n // fall through\n }\n }\n\n return String(error);\n}\n\n// Matches \"session\" followed by optional ID (quoted or unquoted) followed by \"not found\"\n// Examples: \"Session \\\"abc\\\" not found\", \"Session abc-123 not found\"\nconst SESSION_NOT_FOUND_PATTERN = /session\\s+[\"'\\w-]+\\s+not found/i;\n\nfunction isSessionNotFoundText(value: unknown): boolean {\n if (typeof value !== \"string\") {\n return false;\n }\n\n const normalized = value.toLowerCase();\n return (\n normalized.includes(\"resource_not_found\") ||\n normalized.includes(\"resource not found\") ||\n normalized.includes(\"session not found\") ||\n normalized.includes(\"unknown session\") ||\n normalized.includes(\"invalid session identifier\") ||\n SESSION_NOT_FOUND_PATTERN.test(value)\n );\n}\n\nfunction hasSessionNotFoundHint(value: unknown, depth = 0): boolean {\n if (depth > 4) {\n return false;\n }\n\n if (isSessionNotFoundText(value)) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.some((entry) => hasSessionNotFoundHint(entry, depth + 1));\n }\n\n const record = asRecord(value);\n if (!record) {\n return false;\n }\n\n return Object.values(record).some((entry) => hasSessionNotFoundHint(entry, depth + 1));\n}\n\nexport function extractAcpError(error: unknown): OutputErrorAcpPayload | undefined {\n return extractAcpErrorInternal(error, 0);\n}\n\nexport function isAcpResourceNotFoundError(error: unknown): boolean {\n const acp = extractAcpError(error);\n if (acp && RESOURCE_NOT_FOUND_ACP_CODES.has(acp.code)) {\n return true;\n }\n\n if (acp) {\n if (isSessionNotFoundText(acp.message)) {\n return true;\n }\n if (hasSessionNotFoundHint(acp.data)) {\n return true;\n }\n }\n\n return isSessionNotFoundText(formatUnknownErrorMessage(error));\n}\n","import {\n AuthPolicyError,\n PermissionDeniedError,\n PermissionPromptUnavailableError,\n} from \"../errors.js\";\nimport {\n EXIT_CODES,\n OUTPUT_ERROR_CODES,\n OUTPUT_ERROR_ORIGINS,\n type ExitCode,\n type OutputErrorAcpPayload,\n type OutputErrorCode,\n type OutputErrorOrigin,\n} from \"../types.js\";\nimport {\n extractAcpError,\n formatUnknownErrorMessage,\n isAcpResourceNotFoundError,\n} from \"./error-shapes.js\";\n\nconst AUTH_REQUIRED_ACP_CODES = new Set([-32000]);\nconst QUERY_CLOSED_BEFORE_RESPONSE_DETAIL = \"query closed before response received\";\n\ntype ErrorMeta = {\n outputCode?: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n};\n\nexport type NormalizedOutputError = {\n code: OutputErrorCode;\n message: string;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n};\n\nexport type NormalizeOutputErrorOptions = {\n defaultCode?: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction isAuthRequiredMessage(value: string | undefined): boolean {\n if (!value) {\n return false;\n }\n const normalized = value.toLowerCase();\n return [\n \"auth required\",\n \"authentication required\",\n \"authorization required\",\n \"credential required\",\n \"credentials required\",\n \"token required\",\n \"login required\",\n ].some((needle) => normalized.includes(needle));\n}\n\nfunction isAcpAuthRequiredPayload(acp: OutputErrorAcpPayload | undefined): boolean {\n if (!acp) {\n return false;\n }\n if (!AUTH_REQUIRED_ACP_CODES.has(acp.code)) {\n return false;\n }\n if (isAuthRequiredMessage(acp.message)) {\n return true;\n }\n\n const data = asRecord(acp.data);\n if (!data) {\n return false;\n }\n\n return hasAuthRequiredData(data);\n}\n\nfunction hasAuthRequiredData(data: Record<string, unknown>): boolean {\n return (\n data.authRequired === true || hasNonEmptyString(data.methodId) || hasNonEmptyArray(data.methods)\n );\n}\n\nfunction hasNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction hasNonEmptyArray(value: unknown): value is unknown[] {\n return Array.isArray(value) && value.length > 0;\n}\n\nfunction isOutputErrorCode(value: unknown): value is OutputErrorCode {\n return typeof value === \"string\" && OUTPUT_ERROR_CODES.includes(value as OutputErrorCode);\n}\n\nfunction isOutputErrorOrigin(value: unknown): value is OutputErrorOrigin {\n return typeof value === \"string\" && OUTPUT_ERROR_ORIGINS.includes(value as OutputErrorOrigin);\n}\n\nfunction readOutputErrorMeta(error: unknown): ErrorMeta {\n const record = asRecord(error);\n if (!record) {\n return {};\n }\n\n const outputCode = isOutputErrorCode(record.outputCode) ? record.outputCode : undefined;\n const detailCode =\n typeof record.detailCode === \"string\" && record.detailCode.trim().length > 0\n ? record.detailCode\n : undefined;\n const origin = isOutputErrorOrigin(record.origin) ? record.origin : undefined;\n const retryable = typeof record.retryable === \"boolean\" ? record.retryable : undefined;\n\n const acp = extractAcpError(record.acp);\n return {\n outputCode,\n detailCode,\n origin,\n retryable,\n acp,\n };\n}\n\nfunction isTimeoutLike(error: unknown): boolean {\n return error instanceof Error && error.name === \"TimeoutError\";\n}\n\nfunction isNoSessionLike(error: unknown): boolean {\n return error instanceof Error && error.name === \"NoSessionError\";\n}\n\nfunction isUsageLike(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n return (\n error.name === \"CommanderError\" ||\n error.name === \"InvalidArgumentError\" ||\n asRecord(error)?.code === \"commander.invalidArgument\"\n );\n}\n\nexport function formatErrorMessage(error: unknown): string {\n return formatUnknownErrorMessage(error);\n}\n\nexport { extractAcpError, isAcpResourceNotFoundError };\n\nexport function isAcpQueryClosedBeforeResponseError(error: unknown): boolean {\n const acp = extractAcpError(error);\n if (!acp || acp.code !== -32603) {\n return false;\n }\n\n const data = asRecord(acp.data);\n const details = data?.details;\n if (typeof details !== \"string\") {\n return false;\n }\n\n return details.toLowerCase().includes(QUERY_CLOSED_BEFORE_RESPONSE_DETAIL);\n}\n\nfunction mapErrorCode(error: unknown): OutputErrorCode | undefined {\n if (error instanceof PermissionPromptUnavailableError) {\n return \"PERMISSION_PROMPT_UNAVAILABLE\";\n }\n if (error instanceof PermissionDeniedError) {\n return \"PERMISSION_DENIED\";\n }\n if (isTimeoutLike(error)) {\n return \"TIMEOUT\";\n }\n if (isNoSessionLike(error) || isAcpResourceNotFoundError(error)) {\n return \"NO_SESSION\";\n }\n if (isUsageLike(error)) {\n return \"USAGE\";\n }\n return undefined;\n}\n\nexport function normalizeOutputError(\n error: unknown,\n options: NormalizeOutputErrorOptions = {},\n): NormalizedOutputError {\n const meta = readOutputErrorMeta(error);\n const code = resolveOutputErrorCode(error, options, meta);\n const acp = options.acp ?? meta.acp ?? extractAcpError(error);\n return {\n code,\n message: formatErrorMessage(error),\n detailCode: resolveDetailCode(error, acp, options, meta),\n origin: meta.origin ?? options.origin,\n retryable: meta.retryable ?? options.retryable,\n acp,\n };\n}\n\nfunction resolveOutputErrorCode(\n error: unknown,\n options: NormalizeOutputErrorOptions,\n meta: ErrorMeta,\n): OutputErrorCode {\n const code = meta.outputCode ?? mapErrorCode(error) ?? options.defaultCode ?? \"RUNTIME\";\n if (code === \"RUNTIME\" && isAcpResourceNotFoundError(error)) {\n return \"NO_SESSION\";\n }\n return code;\n}\n\nfunction resolveDetailCode(\n error: unknown,\n acp: OutputErrorAcpPayload | undefined,\n options: NormalizeOutputErrorOptions,\n meta: ErrorMeta,\n): string | undefined {\n return (\n meta.detailCode ??\n options.detailCode ??\n (error instanceof AuthPolicyError || isAcpAuthRequiredPayload(acp)\n ? \"AUTH_REQUIRED\"\n : undefined)\n );\n}\n\n/**\n * Returns true when an error from `client.prompt()` looks transient and\n * can reasonably be retried (e.g. model-API 400/500, network hiccups that\n * surface as ACP internal errors).\n *\n * Errors that are definitively non-recoverable (auth, missing session,\n * invalid params, timeout, permission) return false.\n */\nexport function isRetryablePromptError(error: unknown): boolean {\n if (isNonRetryablePromptError(error)) {\n return false;\n }\n\n // Extract ACP payload once and reuse for all subsequent checks.\n const acp = extractAcpError(error);\n if (!acp) {\n // Non-ACP errors (e.g. process crash) are not retried at the prompt level.\n return false;\n }\n\n if (isPermanentPromptAcpError(acp)) {\n return false;\n }\n\n // ACP internal errors (-32603) typically wrap model-API failures → retryable.\n // Parse errors (-32700) can also be transient.\n return acp.code === -32603 || acp.code === -32700;\n}\n\nfunction isNonRetryablePromptError(error: unknown): boolean {\n return (\n error instanceof PermissionDeniedError ||\n error instanceof PermissionPromptUnavailableError ||\n isTimeoutLike(error) ||\n isNoSessionLike(error) ||\n isUsageLike(error)\n );\n}\n\nfunction isPermanentPromptAcpError(acp: OutputErrorAcpPayload): boolean {\n return (\n acp.code === -32001 ||\n acp.code === -32002 ||\n acp.code === -32601 ||\n acp.code === -32602 ||\n isAcpAuthRequiredPayload(acp)\n );\n}\n\nexport function exitCodeForOutputErrorCode(code: OutputErrorCode): ExitCode {\n switch (code) {\n case \"USAGE\":\n return EXIT_CODES.USAGE;\n case \"TIMEOUT\":\n return EXIT_CODES.TIMEOUT;\n case \"NO_SESSION\":\n return EXIT_CODES.NO_SESSION;\n case \"PERMISSION_DENIED\":\n case \"PERMISSION_PROMPT_UNAVAILABLE\":\n return EXIT_CODES.PERMISSION_DENIED;\n case \"RUNTIME\":\n default:\n return EXIT_CODES.ERROR;\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst ACP_ADAPTER_PACKAGE_RANGES = {\n pi: \"^0.0.26\",\n codex: \"^0.0.44\",\n claude: \"^0.36.1\",\n} as const;\n\ntype BuiltInAgentPackageSpec = {\n packageName: string;\n packageRange: string;\n preferredBinName: string;\n fallbackCommand: string;\n legacyFallbackCommands?: string[];\n};\n\ntype BuiltInAgentLaunch = {\n source: \"installed\" | \"package-exec\";\n command: string;\n args: string[];\n packageName: string;\n packageRange: string;\n packageVersion?: string;\n binPath?: string;\n npmCliPath?: string;\n};\n\ntype BuiltInLaunchResolverOptions = {\n existsSync?: (path: string) => boolean;\n readFileSync?: typeof fs.readFileSync;\n resolvePackageRoot?: (packageName: string) => string;\n execPath?: string;\n resolveNpmCliPath?: (execPath: string) => string;\n};\n\nexport const AGENT_REGISTRY: Record<string, string> = {\n pi: `npx pi-acp@${ACP_ADAPTER_PACKAGE_RANGES.pi}`,\n openclaw: \"openclaw acp\",\n codex: `npx -y @agentclientprotocol/codex-acp@${ACP_ADAPTER_PACKAGE_RANGES.codex}`,\n claude: `npx -y @agentclientprotocol/claude-agent-acp@${ACP_ADAPTER_PACKAGE_RANGES.claude}`,\n gemini: \"gemini --acp\",\n cursor: \"cursor-agent acp\",\n copilot: \"copilot --acp --stdio\",\n droid: \"droid exec --output-format acp\",\n iflow: \"iflow --experimental-acp\",\n kilocode: \"npx -y @kilocode/cli acp\",\n kimi: \"kimi acp\",\n kiro: \"kiro-cli-chat acp\",\n opencode: \"npx -y opencode-ai acp\",\n qoder: \"qodercli --acp\",\n qwen: \"qwen --acp\",\n trae: \"traecli acp serve\",\n};\n\nexport const BUILT_IN_AGENT_PACKAGES = {\n codex: {\n packageName: \"@agentclientprotocol/codex-acp\",\n packageRange: ACP_ADAPTER_PACKAGE_RANGES.codex,\n preferredBinName: \"codex-acp\",\n fallbackCommand: AGENT_REGISTRY.codex,\n legacyFallbackCommands: [],\n },\n claude: {\n packageName: \"@agentclientprotocol/claude-agent-acp\",\n packageRange: ACP_ADAPTER_PACKAGE_RANGES.claude,\n preferredBinName: \"claude-agent-acp\",\n fallbackCommand: AGENT_REGISTRY.claude,\n legacyFallbackCommands: [\n `npm exec @agentclientprotocol/claude-agent-acp@${ACP_ADAPTER_PACKAGE_RANGES.claude}`,\n ],\n },\n} as const satisfies Record<string, BuiltInAgentPackageSpec>;\n\nconst AGENT_ALIASES: Record<string, string> = {\n \"factory-droid\": \"droid\",\n factorydroid: \"droid\",\n};\n\nexport const DEFAULT_AGENT_NAME = \"codex\";\n\nexport function normalizeAgentName(value: string): string {\n return value.trim().toLowerCase();\n}\n\nexport function mergeAgentRegistry(overrides?: Record<string, string>): Record<string, string> {\n if (!overrides) {\n return { ...AGENT_REGISTRY };\n }\n\n const merged = { ...AGENT_REGISTRY };\n for (const [name, command] of Object.entries(overrides)) {\n const normalized = normalizeAgentName(name);\n if (!normalized || !command.trim()) {\n continue;\n }\n merged[normalized] = command.trim();\n }\n return merged;\n}\n\nexport function resolveAgentCommand(agentName: string, overrides?: Record<string, string>): string {\n const normalized = normalizeAgentName(agentName);\n const registry = mergeAgentRegistry(overrides);\n return registry[normalized] ?? registry[AGENT_ALIASES[normalized] ?? normalized] ?? agentName;\n}\n\nexport function findBuiltInAgentPackage(agentCommand: string): BuiltInAgentPackageSpec | undefined {\n const normalized = agentCommand.trim();\n const builtInAgentPackages = Object.values(BUILT_IN_AGENT_PACKAGES) as BuiltInAgentPackageSpec[];\n return builtInAgentPackages.find(\n (spec) =>\n spec.fallbackCommand === normalized || spec.legacyFallbackCommands?.includes(normalized),\n );\n}\n\nfunction defaultResolvePackageRoot(packageName: string): string {\n const segments = packageName.split(\"/\");\n let cursor = path.dirname(fileURLToPath(import.meta.url));\n\n while (true) {\n const candidateRoot = path.join(cursor, \"node_modules\", ...segments);\n const manifestPath = path.join(candidateRoot, \"package.json\");\n if (fs.existsSync(manifestPath)) {\n try {\n const parsed = JSON.parse(fs.readFileSync(manifestPath, \"utf8\")) as {\n name?: string;\n };\n if (parsed.name === packageName) {\n return candidateRoot;\n }\n } catch {\n // best effort; keep walking upward\n }\n }\n\n const parent = path.dirname(cursor);\n if (parent === cursor) {\n throw new Error(`Built-in agent package not found: ${packageName}`);\n }\n cursor = parent;\n }\n}\n\nfunction resolvePackageBin(\n spec: BuiltInAgentPackageSpec,\n manifest: {\n bin?: string | Record<string, string>;\n },\n): string | undefined {\n if (typeof manifest.bin === \"string\") {\n return manifest.bin;\n }\n if (!manifest.bin || typeof manifest.bin !== \"object\") {\n return undefined;\n }\n return (\n manifest.bin[spec.preferredBinName] ??\n (Object.keys(manifest.bin).length === 1 ? Object.values(manifest.bin)[0] : undefined)\n );\n}\n\nfunction defaultResolveNpmCliPath(execPath: string): string {\n const candidate = path.resolve(\n path.dirname(execPath),\n \"..\",\n \"lib\",\n \"node_modules\",\n \"npm\",\n \"bin\",\n \"npm-cli.js\",\n );\n if (!fs.existsSync(candidate)) {\n throw new Error(`npm CLI not found for execPath: ${execPath}`);\n }\n return candidate;\n}\n\nexport function resolveInstalledBuiltInAgentLaunch(\n agentCommand: string,\n options: BuiltInLaunchResolverOptions = {},\n): BuiltInAgentLaunch | undefined {\n const spec = findBuiltInAgentPackage(agentCommand);\n if (!spec) {\n return undefined;\n }\n\n const readFileSync = options.readFileSync ?? fs.readFileSync;\n const existsSync = options.existsSync ?? fs.existsSync;\n const resolvePackageRoot = options.resolvePackageRoot ?? defaultResolvePackageRoot;\n\n try {\n const resolved = resolveInstalledBuiltInAgentPackage(spec, {\n readFileSync,\n existsSync,\n resolvePackageRoot,\n });\n if (!resolved) {\n return undefined;\n }\n\n return {\n source: \"installed\",\n command: process.execPath,\n args: [resolved.binPath],\n packageName: spec.packageName,\n packageRange: spec.packageRange,\n packageVersion: resolved.packageVersion,\n binPath: resolved.binPath,\n };\n } catch {\n return undefined;\n }\n}\n\nfunction resolveInstalledBuiltInAgentPackage(\n spec: BuiltInAgentPackageSpec,\n options: Required<\n Pick<BuiltInLaunchResolverOptions, \"readFileSync\" | \"existsSync\" | \"resolvePackageRoot\">\n >,\n): { packageVersion?: string; binPath: string } | undefined {\n const packageRoot = options.resolvePackageRoot(spec.packageName);\n const manifest = JSON.parse(\n options.readFileSync(path.join(packageRoot, \"package.json\"), \"utf8\"),\n ) as {\n name?: string;\n version?: string;\n bin?: string | Record<string, string>;\n };\n if (manifest.name !== spec.packageName) {\n return undefined;\n }\n\n const relativeBinPath = resolvePackageBin(spec, manifest);\n if (!relativeBinPath) {\n return undefined;\n }\n\n const binPath = path.resolve(packageRoot, relativeBinPath);\n return options.existsSync(binPath) ? { packageVersion: manifest.version, binPath } : undefined;\n}\n\nexport function resolvePackageExecBuiltInAgentLaunch(\n agentCommand: string,\n options: BuiltInLaunchResolverOptions = {},\n): BuiltInAgentLaunch | undefined {\n const spec = findBuiltInAgentPackage(agentCommand);\n if (!spec) {\n return undefined;\n }\n\n const existsSync = options.existsSync ?? fs.existsSync;\n const execPath = options.execPath ?? process.execPath;\n const resolveNpmCliPath = options.resolveNpmCliPath ?? defaultResolveNpmCliPath;\n\n try {\n const npmCliPath = resolveNpmCliPath(execPath);\n if (!existsSync(npmCliPath)) {\n return undefined;\n }\n\n return {\n source: \"package-exec\",\n command: execPath,\n args: [\n npmCliPath,\n \"exec\",\n \"--yes\",\n `--package=${spec.packageName}@${spec.packageRange}`,\n \"--\",\n spec.preferredBinName,\n ],\n packageName: spec.packageName,\n packageRange: spec.packageRange,\n npmCliPath,\n };\n } catch {\n return undefined;\n }\n}\n\nexport function resolveBuiltInAgentLaunch(\n agentCommand: string,\n options: BuiltInLaunchResolverOptions = {},\n): BuiltInAgentLaunch | undefined {\n return (\n resolveInstalledBuiltInAgentLaunch(agentCommand, options) ??\n resolvePackageExecBuiltInAgentLaunch(agentCommand, options)\n );\n}\n\nexport function listBuiltInAgents(overrides?: Record<string, string>): string[] {\n return Object.keys(mergeAgentRegistry(overrides));\n}\n","export class TimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`Timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n\nexport class InterruptedError extends Error {\n constructor() {\n super(\"Interrupted\");\n this.name = \"InterruptedError\";\n }\n}\n\nexport async function withTimeout<T>(promise: Promise<T>, timeoutMs?: number): Promise<T> {\n if (timeoutMs == null || timeoutMs <= 0) {\n return await promise;\n }\n\n let timer: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<T>((_resolve, reject) => {\n timer = setTimeout(() => {\n reject(new TimeoutError(timeoutMs));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([promise, timeoutPromise]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n}\n\nexport async function withInterrupt<T>(\n run: () => Promise<T>,\n onInterrupt: () => Promise<void>,\n): Promise<T> {\n return await new Promise<T>((resolve, reject) => {\n let settled = false;\n\n const finish = (cb: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n process.off(\"SIGHUP\", onSighup);\n cb();\n };\n\n const rejectInterrupted = () => {\n void onInterrupt().finally(() => {\n finish(() => reject(new InterruptedError()));\n });\n };\n\n const onSigint = () => {\n rejectInterrupted();\n };\n\n const onSigterm = () => {\n rejectInterrupted();\n };\n\n const onSighup = () => {\n rejectInterrupted();\n };\n\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n process.once(\"SIGHUP\", onSighup);\n\n void run().then(\n (result) => finish(() => resolve(result)),\n (error) => finish(() => reject(error)),\n );\n });\n}\n","import type { AgentCapabilities, ContentBlock } from \"@agentclientprotocol/sdk\";\n\nexport type PromptInput = ContentBlock[];\n\nexport class PromptInputValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PromptInputValidationError\";\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction isBase64Data(value: string): boolean {\n if (value.length === 0 || value.length % 4 !== 0) {\n return false;\n }\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value);\n}\n\nfunction isImageMimeType(value: string): boolean {\n return /^image\\/[A-Za-z0-9.+-]+$/i.test(value);\n}\n\nfunction isAudioMimeType(value: string): boolean {\n return /^audio\\/[A-Za-z0-9.+-]+$/i.test(value);\n}\n\nfunction isTextBlock(value: unknown): value is Extract<ContentBlock, { type: \"text\" }> {\n const record = asRecord(value);\n return record?.type === \"text\" && typeof record.text === \"string\";\n}\n\nfunction isImageBlock(value: unknown): value is Extract<ContentBlock, { type: \"image\" }> {\n const record = asRecord(value);\n return (\n record?.type === \"image\" &&\n isNonEmptyString(record.mimeType) &&\n isImageMimeType(record.mimeType) &&\n typeof record.data === \"string\" &&\n isBase64Data(record.data)\n );\n}\n\nfunction isAudioBlock(value: unknown): value is Extract<ContentBlock, { type: \"audio\" }> {\n const record = asRecord(value);\n return (\n record?.type === \"audio\" &&\n isNonEmptyString(record.mimeType) &&\n isAudioMimeType(record.mimeType) &&\n typeof record.data === \"string\" &&\n isBase64Data(record.data)\n );\n}\n\nfunction isResourceLinkBlock(\n value: unknown,\n): value is Extract<ContentBlock, { type: \"resource_link\" }> {\n const record = asRecord(value);\n return (\n record?.type === \"resource_link\" &&\n isNonEmptyString(record.uri) &&\n (record.title === undefined || typeof record.title === \"string\") &&\n (record.name === undefined || typeof record.name === \"string\")\n );\n}\n\nfunction isResourcePayload(value: unknown): boolean {\n const record = asRecord(value);\n if (!record || !isNonEmptyString(record.uri)) {\n return false;\n }\n return record.text === undefined || typeof record.text === \"string\";\n}\n\nfunction isResourceBlock(value: unknown): value is Extract<ContentBlock, { type: \"resource\" }> {\n const record = asRecord(value);\n return record?.type === \"resource\" && isResourcePayload(record.resource);\n}\n\nconst CONTENT_BLOCK_VALIDATORS = [\n isTextBlock,\n isImageBlock,\n isAudioBlock,\n isResourceLinkBlock,\n isResourceBlock,\n] as const;\n\nfunction isContentBlock(value: unknown): value is ContentBlock {\n return CONTENT_BLOCK_VALIDATORS.some((validator) => validator(value));\n}\n\ntype ContentBlockValidation = (\n record: Record<string, unknown>,\n index: number,\n) => string | undefined;\n\nconst CONTENT_BLOCK_ERROR_VALIDATORS: Record<string, ContentBlockValidation> = {\n text: validateTextContentBlock,\n image: validateImageContentBlock,\n audio: validateAudioContentBlock,\n resource_link: validateResourceLinkContentBlock,\n resource: validateResourceContentBlock,\n};\n\nfunction contentBlockErrorValidator(type: string): ContentBlockValidation | undefined {\n return Object.hasOwn(CONTENT_BLOCK_ERROR_VALIDATORS, type)\n ? CONTENT_BLOCK_ERROR_VALIDATORS[type]\n : undefined;\n}\n\nfunction validateTextContentBlock(\n record: Record<string, unknown>,\n index: number,\n): string | undefined {\n return typeof record.text === \"string\"\n ? undefined\n : `prompt[${index}] text block must include a string text field`;\n}\n\nfunction validateImageContentBlock(\n record: Record<string, unknown>,\n index: number,\n): string | undefined {\n if (!isNonEmptyString(record.mimeType)) {\n return `prompt[${index}] image block must include a non-empty mimeType`;\n }\n if (!isImageMimeType(record.mimeType)) {\n return `prompt[${index}] image block mimeType must start with image/`;\n }\n if (typeof record.data !== \"string\" || record.data.length === 0) {\n return `prompt[${index}] image block must include non-empty base64 data`;\n }\n return isBase64Data(record.data)\n ? undefined\n : `prompt[${index}] image block data must be valid base64`;\n}\n\nfunction validateAudioContentBlock(\n record: Record<string, unknown>,\n index: number,\n): string | undefined {\n if (!isNonEmptyString(record.mimeType)) {\n return `prompt[${index}] audio block must include a non-empty mimeType`;\n }\n if (!isAudioMimeType(record.mimeType)) {\n return `prompt[${index}] audio block mimeType must start with audio/`;\n }\n if (typeof record.data !== \"string\" || record.data.length === 0) {\n return `prompt[${index}] audio block must include non-empty base64 data`;\n }\n return isBase64Data(record.data)\n ? undefined\n : `prompt[${index}] audio block data must be valid base64`;\n}\n\nfunction validateResourceLinkContentBlock(\n record: Record<string, unknown>,\n index: number,\n): string | undefined {\n if (!isNonEmptyString(record.uri)) {\n return `prompt[${index}] resource_link block must include a non-empty uri`;\n }\n if (record.title !== undefined && typeof record.title !== \"string\") {\n return `prompt[${index}] resource_link block title must be a string when present`;\n }\n if (record.name !== undefined && typeof record.name !== \"string\") {\n return `prompt[${index}] resource_link block name must be a string when present`;\n }\n return undefined;\n}\n\nfunction validateResourceContentBlock(\n record: Record<string, unknown>,\n index: number,\n): string | undefined {\n if (!asRecord(record.resource)) {\n return `prompt[${index}] resource block must include a resource object`;\n }\n return isResourcePayload(record.resource)\n ? undefined\n : `prompt[${index}] resource block resource must include a non-empty uri and optional text`;\n}\n\nfunction getContentBlockValidationError(value: unknown, index: number): string | undefined {\n const record = asRecord(value);\n if (!record || typeof record.type !== \"string\") {\n return `prompt[${index}] must be an ACP content block object`;\n }\n\n const validator = contentBlockErrorValidator(record.type);\n return validator\n ? validator(record, index)\n : `prompt[${index}] has unsupported content block type ${JSON.stringify(record.type)}`;\n}\n\nexport function isPromptInput(value: unknown): value is PromptInput {\n return Array.isArray(value) && value.every((entry) => isContentBlock(entry));\n}\n\ntype PromptCapabilityName = \"image\" | \"audio\" | \"embeddedContext\";\n\ntype PromptCapabilityRequirement = {\n blockType: \"image\" | \"audio\" | \"resource\";\n capability: PromptCapabilityName;\n};\n\nfunction promptCapabilityRequirement(block: ContentBlock): PromptCapabilityRequirement | undefined {\n switch (block.type) {\n case \"image\":\n return { blockType: \"image\", capability: \"image\" };\n case \"audio\":\n return { blockType: \"audio\", capability: \"audio\" };\n case \"resource\":\n return { blockType: \"resource\", capability: \"embeddedContext\" };\n default:\n return undefined;\n }\n}\n\nexport function getUnsupportedPromptContentMessage(\n prompt: PromptInput,\n agentCapabilities: AgentCapabilities | undefined,\n): string | undefined {\n for (const [index, block] of prompt.entries()) {\n const requirement = promptCapabilityRequirement(block);\n if (!requirement) {\n continue;\n }\n if (agentCapabilities?.promptCapabilities?.[requirement.capability] === true) {\n continue;\n }\n return `prompt[${index}] ${requirement.blockType} content requires agentCapabilities.promptCapabilities.${requirement.capability}`;\n }\n return undefined;\n}\n\nexport function textPrompt(text: string): PromptInput {\n return [\n {\n type: \"text\",\n text,\n },\n ];\n}\n\nfunction parseStructuredPrompt(source: string): PromptInput | undefined {\n if (!source.startsWith(\"[\")) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(source) as unknown;\n if (isPromptInput(parsed)) {\n return parsed;\n }\n if (Array.isArray(parsed)) {\n const detail =\n parsed\n .map((entry, index) => getContentBlockValidationError(entry, index))\n .find((message) => message !== undefined) ??\n \"Structured prompt JSON must be an array of valid ACP content blocks\";\n throw new PromptInputValidationError(detail);\n }\n return undefined;\n } catch (error) {\n if (error instanceof PromptInputValidationError) {\n throw error;\n }\n return undefined;\n }\n}\n\nexport function parsePromptSource(source: string): PromptInput {\n const trimmed = source.trim();\n const structured = parseStructuredPrompt(trimmed);\n if (structured) {\n return structured;\n }\n if (!trimmed) {\n return [];\n }\n return textPrompt(trimmed);\n}\n\nexport function mergePromptSourceWithText(source: string, suffixText: string): PromptInput {\n const prompt = parsePromptSource(source);\n const appended = suffixText.trim();\n if (!appended) {\n return prompt;\n }\n if (prompt.length === 0) {\n return textPrompt(appended);\n }\n return [...prompt, ...textPrompt(appended)];\n}\n\nexport function promptToDisplayText(prompt: PromptInput): string {\n return prompt\n .map((block) => contentBlockDisplayText(block))\n .filter((entry) => entry.trim().length > 0)\n .join(\"\\n\\n\")\n .trim();\n}\n\nfunction contentBlockDisplayText(block: ContentBlock): string {\n switch (block.type) {\n case \"text\":\n return block.text;\n case \"resource_link\":\n return block.title ?? block.name ?? block.uri;\n case \"resource\":\n return resourceBlockDisplayText(block);\n case \"image\":\n return `[image] ${block.mimeType}`;\n case \"audio\":\n return `[audio] ${block.mimeType}`;\n default:\n return \"\";\n }\n}\n\nfunction resourceBlockDisplayText(block: Extract<ContentBlock, { type: \"resource\" }>): string {\n return \"text\" in block.resource && typeof block.resource.text === \"string\"\n ? block.resource.text\n : block.resource.uri;\n}\n","import type { AnyMessage, SessionNotification } from \"@agentclientprotocol/sdk\";\n\ntype JsonRpcId = string | number | null;\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction hasValidId(value: unknown): value is JsonRpcId {\n return (\n value === null ||\n typeof value === \"string\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\nfunction isErrorObject(value: unknown): value is { code: number; message: string } {\n const record = asRecord(value);\n return (\n !!record &&\n typeof record.code === \"number\" &&\n Number.isFinite(record.code) &&\n typeof record.message === \"string\"\n );\n}\n\nfunction hasResultOrError(value: Record<string, unknown>): boolean {\n const hasResult = Object.hasOwn(value, \"result\");\n const hasError = Object.hasOwn(value, \"error\");\n if (hasResult && hasError) {\n return false;\n }\n if (!hasResult && !hasError) {\n return false;\n }\n if (hasError && !isErrorObject(value.error)) {\n return false;\n }\n return true;\n}\n\nfunction hasMethod(value: Record<string, unknown>): boolean {\n return typeof value.method === \"string\" && value.method.length > 0;\n}\n\nfunction isJsonRpcRequest(value: Record<string, unknown>): boolean {\n return hasMethod(value) && Object.hasOwn(value, \"id\") && hasValidId(value.id);\n}\n\nfunction isJsonRpcNotificationRecord(value: Record<string, unknown>): boolean {\n return hasMethod(value) && !Object.hasOwn(value, \"id\");\n}\n\nfunction isJsonRpcResponse(value: Record<string, unknown>): boolean {\n if (hasMethod(value) || !Object.hasOwn(value, \"id\") || !hasValidId(value.id)) {\n return false;\n }\n return hasResultOrError(value);\n}\n\nexport function isAcpJsonRpcMessage(value: unknown): value is AnyMessage {\n const record = asRecord(value);\n if (!record || record.jsonrpc !== \"2.0\") {\n return false;\n }\n\n return (\n isJsonRpcNotificationRecord(record) || isJsonRpcRequest(record) || isJsonRpcResponse(record)\n );\n}\n\nexport function isJsonRpcNotification(message: AnyMessage): boolean {\n return (\n Object.hasOwn(message, \"method\") &&\n typeof (message as { method?: unknown }).method === \"string\" &&\n !Object.hasOwn(message, \"id\")\n );\n}\n\nexport function isSessionUpdateNotification(message: AnyMessage): boolean {\n return (\n isJsonRpcNotification(message) && (message as { method?: unknown }).method === \"session/update\"\n );\n}\n\nexport function extractSessionUpdateNotification(\n message: AnyMessage,\n): SessionNotification | undefined {\n if (!isSessionUpdateNotification(message)) {\n return undefined;\n }\n\n const params = asRecord((message as { params?: unknown }).params);\n if (!params) {\n return undefined;\n }\n\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : null;\n if (!sessionId) {\n return undefined;\n }\n\n const update = asRecord(params.update);\n if (!update || typeof update.sessionUpdate !== \"string\") {\n return undefined;\n }\n\n return {\n sessionId,\n update: update as SessionNotification[\"update\"],\n };\n}\n\nexport function parsePromptStopReason(message: AnyMessage): string | undefined {\n if (!Object.hasOwn(message, \"id\") || !Object.hasOwn(message, \"result\")) {\n return undefined;\n }\n const record = asRecord((message as { result?: unknown }).result);\n if (!record) {\n return undefined;\n }\n return typeof record.stopReason === \"string\" ? record.stopReason : undefined;\n}\n\nexport function parseJsonRpcErrorMessage(message: AnyMessage): string | undefined {\n if (!Object.hasOwn(message, \"error\")) {\n return undefined;\n }\n const errorRecord = asRecord((message as { error?: unknown }).error);\n if (!errorRecord || typeof errorRecord.message !== \"string\") {\n return undefined;\n }\n return errorRecord.message;\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport type { SessionEventLog } from \"../types.js\";\n\nexport const DEFAULT_EVENT_SEGMENT_MAX_BYTES = 64 * 1024 * 1024;\nexport const DEFAULT_EVENT_MAX_SEGMENTS = 5;\n\nexport function sessionBaseDir(): string {\n return path.join(os.homedir(), \".acpx\", \"sessions\");\n}\n\nexport function safeSessionId(sessionId: string): string {\n return encodeURIComponent(sessionId);\n}\n\nexport function sessionEventActivePath(sessionId: string): string {\n return path.join(sessionBaseDir(), `${safeSessionId(sessionId)}.stream.ndjson`);\n}\n\nexport function sessionEventSegmentPath(sessionId: string, segment: number): string {\n return path.join(sessionBaseDir(), `${safeSessionId(sessionId)}.stream.${segment}.ndjson`);\n}\n\nexport function sessionEventLockPath(sessionId: string): string {\n return path.join(sessionBaseDir(), `${safeSessionId(sessionId)}.stream.lock`);\n}\n\nexport function defaultSessionEventLog(sessionId: string): SessionEventLog {\n return {\n active_path: sessionEventActivePath(sessionId),\n segment_count: DEFAULT_EVENT_MAX_SEGMENTS,\n max_segment_bytes: DEFAULT_EVENT_SEGMENT_MAX_BYTES,\n max_segments: DEFAULT_EVENT_MAX_SEGMENTS,\n last_write_at: undefined,\n last_write_error: null,\n };\n}\n","const AGENT_SESSION_ID_META_KEYS = [\"agentSessionId\", \"sessionId\"] as const;\n\nexport function normalizeAgentSessionId(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction asMetaRecord(meta: unknown): Record<string, unknown> | undefined {\n if (!meta || typeof meta !== \"object\" || Array.isArray(meta)) {\n return undefined;\n }\n return meta as Record<string, unknown>;\n}\n\nexport function extractAgentSessionId(meta: unknown): string | undefined {\n const record = asMetaRecord(meta);\n if (!record) {\n return undefined;\n }\n\n for (const key of AGENT_SESSION_ID_META_KEYS) {\n const normalized = normalizeAgentSessionId(record[key]);\n if (normalized) {\n return normalized;\n }\n }\n\n return undefined;\n}\n\nexport { AGENT_SESSION_ID_META_KEYS };\n","import {\n AGENT_SESSION_ID_META_KEYS,\n extractAgentSessionId,\n normalizeAgentSessionId,\n} from \"../acp/agent-session-id.js\";\n\nexport const RUNTIME_SESSION_ID_META_KEYS = AGENT_SESSION_ID_META_KEYS;\n\nexport function normalizeRuntimeSessionId(value: unknown): string | undefined {\n return normalizeAgentSessionId(value);\n}\n\nexport function extractRuntimeSessionId(meta: unknown): string | undefined {\n return extractAgentSessionId(meta);\n}\n","import type { SessionRecord } from \"../../types.js\";\nimport { SESSION_RECORD_SCHEMA } from \"../../types.js\";\nimport { normalizeRuntimeSessionId } from \"../runtime-session-id.js\";\n\nexport function serializeSessionRecordForDisk(record: SessionRecord): Record<string, unknown> {\n const canonical: SessionRecord = {\n ...record,\n schema: SESSION_RECORD_SCHEMA,\n };\n\n return {\n schema: canonical.schema,\n acpx_record_id: canonical.acpxRecordId,\n acp_session_id: canonical.acpSessionId,\n agent_session_id: normalizeRuntimeSessionId(canonical.agentSessionId),\n agent_command: canonical.agentCommand,\n cwd: canonical.cwd,\n name: canonical.name,\n created_at: canonical.createdAt,\n last_used_at: canonical.lastUsedAt,\n last_seq: canonical.lastSeq,\n last_request_id: canonical.lastRequestId,\n event_log: canonical.eventLog,\n closed: canonical.closed,\n closed_at: canonical.closedAt,\n pid: canonical.pid,\n agent_started_at: canonical.agentStartedAt,\n last_prompt_at: canonical.lastPromptAt,\n last_agent_exit_code: canonical.lastAgentExitCode,\n last_agent_exit_signal: canonical.lastAgentExitSignal,\n last_agent_exit_at: canonical.lastAgentExitAt,\n last_agent_disconnect_reason: canonical.lastAgentDisconnectReason,\n protocol_version: canonical.protocolVersion,\n agent_capabilities: canonical.agentCapabilities,\n title: canonical.title,\n messages: canonical.messages,\n updated_at: canonical.updated_at,\n cumulative_token_usage: canonical.cumulative_token_usage,\n request_token_usage: canonical.request_token_usage,\n acpx: canonical.acpx,\n imported_from: canonical.importedFrom\n ? {\n record_id: canonical.importedFrom.recordId,\n cwd_original: canonical.importedFrom.cwdOriginal,\n exported_by: canonical.importedFrom.exportedBy,\n exported_at: canonical.importedFrom.exportedAt,\n }\n : undefined,\n };\n}\n","import type {\n SessionAcpxState,\n SessionEventLog,\n SessionRecord,\n SessionConversation,\n} from \"../../types.js\";\nimport { SESSION_RECORD_SCHEMA } from \"../../types.js\";\nimport { defaultSessionEventLog } from \"../event-log.js\";\nimport { normalizeRuntimeSessionId } from \"../runtime-session-id.js\";\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction hasOwn(source: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(source, key);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nfunction parseTokenUsage(\n raw: unknown,\n): SessionConversation[\"cumulative_token_usage\"] | null | undefined {\n if (raw === undefined || raw === null) {\n return undefined;\n }\n\n const record = asRecord(raw);\n if (!record) {\n return null;\n }\n\n const usage: SessionConversation[\"cumulative_token_usage\"] = {};\n const fields: Array<keyof SessionConversation[\"cumulative_token_usage\"]> = [\n \"input_tokens\",\n \"output_tokens\",\n \"cache_creation_input_tokens\",\n \"cache_read_input_tokens\",\n ];\n\n for (const field of fields) {\n const value = record[field];\n if (value === undefined) {\n continue;\n }\n if (!isNonNegativeFiniteNumber(value)) {\n return null;\n }\n usage[field] = value;\n }\n\n return usage;\n}\n\nfunction isNonNegativeFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n}\n\nfunction parseRequestTokenUsage(\n raw: unknown,\n): SessionConversation[\"request_token_usage\"] | null | undefined {\n if (raw === undefined || raw === null) {\n return undefined;\n }\n\n const record = asRecord(raw);\n if (!record) {\n return null;\n }\n\n const usage: SessionConversation[\"request_token_usage\"] = {};\n for (const [key, value] of Object.entries(record)) {\n const parsed = parseTokenUsage(value);\n if (parsed == null) {\n return null;\n }\n usage[key] = parsed;\n }\n\n return usage;\n}\n\nfunction isSessionMessageImage(raw: unknown): boolean {\n const record = asRecord(raw);\n if (!record || typeof record.source !== \"string\") {\n return false;\n }\n\n if (record.size === undefined || record.size === null) {\n return true;\n }\n\n const size = asRecord(record.size);\n return !!size && isFiniteNumber(size.width) && isFiniteNumber(size.height);\n}\n\nfunction isSessionMessageAudio(raw: unknown): boolean {\n const record = asRecord(raw);\n return !!record && typeof record.source === \"string\" && typeof record.mime_type === \"string\";\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isUserContent(raw: unknown): boolean {\n const record = asRecord(raw);\n if (!record) {\n return false;\n }\n\n if (typeof record.Text === \"string\") {\n return true;\n }\n\n if (record.Mention !== undefined) {\n const mention = asRecord(record.Mention);\n return !!mention && typeof mention.uri === \"string\" && typeof mention.content === \"string\";\n }\n\n if (record.Image !== undefined) {\n return isSessionMessageImage(record.Image);\n }\n\n if (record.Audio !== undefined) {\n return isSessionMessageAudio(record.Audio);\n }\n\n return false;\n}\n\nfunction isToolUse(raw: unknown): boolean {\n const record = asRecord(raw);\n return (\n !!record &&\n hasStringFields(record, [\"id\", \"name\", \"raw_input\"]) &&\n hasOwn(record, \"input\") &&\n typeof record.is_input_complete === \"boolean\" &&\n isOptionalString(record.thought_signature)\n );\n}\n\nfunction hasStringFields(record: Record<string, unknown>, keys: readonly string[]): boolean {\n return keys.every((key) => typeof record[key] === \"string\");\n}\n\nfunction isOptionalString(value: unknown): boolean {\n return value === undefined || value === null || typeof value === \"string\";\n}\n\nfunction isToolResultContent(raw: unknown): boolean {\n const record = asRecord(raw);\n if (!record) {\n return false;\n }\n\n if (typeof record.Text === \"string\") {\n return true;\n }\n\n if (record.Image !== undefined) {\n return isSessionMessageImage(record.Image);\n }\n\n return false;\n}\n\nfunction isToolResult(raw: unknown): boolean {\n const record = asRecord(raw);\n return (\n !!record &&\n typeof record.tool_use_id === \"string\" &&\n typeof record.tool_name === \"string\" &&\n typeof record.is_error === \"boolean\" &&\n isToolResultContent(record.content)\n );\n}\n\nfunction isAgentContent(raw: unknown): boolean {\n const record = asRecord(raw);\n if (!record) {\n return false;\n }\n\n if (typeof record.Text === \"string\") {\n return true;\n }\n\n if (record.Thinking !== undefined) {\n return isThinkingContent(record.Thinking);\n }\n\n if (typeof record.RedactedThinking === \"string\") {\n return true;\n }\n\n if (record.ToolUse !== undefined) {\n return isToolUse(record.ToolUse);\n }\n\n return false;\n}\n\nfunction isThinkingContent(raw: unknown): boolean {\n const thinking = asRecord(raw);\n return !!thinking && typeof thinking.text === \"string\" && isOptionalString(thinking.signature);\n}\n\nfunction isUserMessage(raw: unknown): boolean {\n const record = asRecord(raw);\n if (!record || record.User === undefined) {\n return false;\n }\n\n const user = asRecord(record.User);\n return (\n !!user &&\n typeof user.id === \"string\" &&\n Array.isArray(user.content) &&\n user.content.every((entry) => isUserContent(entry))\n );\n}\n\nfunction isAgentMessage(raw: unknown): boolean {\n const record = asRecord(raw);\n if (!record || record.Agent === undefined) {\n return false;\n }\n\n const agent = asRecord(record.Agent);\n if (!agent || !Array.isArray(agent.content) || !agent.content.every(isAgentContent)) {\n return false;\n }\n\n const toolResults = asRecord(agent.tool_results);\n if (!toolResults) {\n return false;\n }\n\n return Object.values(toolResults).every(isToolResult);\n}\n\nfunction isConversationMessage(raw: unknown): boolean {\n return raw === \"Resume\" || isUserMessage(raw) || isAgentMessage(raw);\n}\n\nfunction parseConversationRecord(record: Record<string, unknown>): SessionConversation | undefined {\n if (!hasValidConversationCore(record)) {\n return undefined;\n }\n\n const title = parseConversationTitle(record.title);\n if (title === INVALID_VALUE) {\n return undefined;\n }\n\n const cumulativeTokenUsage = parseTokenUsage(record.cumulative_token_usage);\n const requestTokenUsage = parseRequestTokenUsage(record.request_token_usage);\n if (cumulativeTokenUsage === null || requestTokenUsage === null) {\n return undefined;\n }\n\n return {\n title,\n messages: record.messages,\n updated_at: record.updated_at,\n cumulative_token_usage: cumulativeTokenUsage ?? {},\n request_token_usage: requestTokenUsage ?? {},\n };\n}\n\nconst INVALID_VALUE = Symbol(\"invalid\");\n\nfunction parseConversationTitle(value: unknown): string | null | undefined | typeof INVALID_VALUE {\n if (value === undefined || value === null || typeof value === \"string\") {\n return value;\n }\n return INVALID_VALUE;\n}\n\nfunction hasValidConversationCore(record: Record<string, unknown>): record is Record<\n string,\n unknown\n> & {\n messages: SessionConversation[\"messages\"];\n updated_at: string;\n} {\n return (\n Array.isArray(record.messages) &&\n record.messages.every(isConversationMessage) &&\n typeof record.updated_at === \"string\"\n );\n}\n\nfunction parseAcpxState(raw: unknown): SessionAcpxState | undefined {\n const record = asRecord(raw);\n if (!record) {\n return undefined;\n }\n\n const state: SessionAcpxState = {};\n\n assignBooleanTrue(state, \"reset_on_next_ensure\", record.reset_on_next_ensure);\n assignStringState(state, \"current_mode_id\", record.current_mode_id);\n assignStringState(state, \"desired_mode_id\", record.desired_mode_id);\n\n assignDesiredConfigOptions(state, record.desired_config_options);\n\n assignStringState(state, \"current_model_id\", record.current_model_id);\n\n if (isStringArray(record.available_models)) {\n state.available_models = [...record.available_models];\n }\n\n if (isStringArray(record.available_commands)) {\n state.available_commands = [...record.available_commands];\n }\n\n if (Array.isArray(record.config_options)) {\n state.config_options = record.config_options as SessionAcpxState[\"config_options\"];\n }\n\n assignParsedSessionOptions(state, record.session_options);\n\n return state;\n}\n\nfunction assignBooleanTrue(\n state: SessionAcpxState,\n key: \"reset_on_next_ensure\",\n value: unknown,\n): void {\n if (value === true) {\n state[key] = true;\n }\n}\n\nfunction assignStringState(\n state: SessionAcpxState,\n key: \"current_mode_id\" | \"desired_mode_id\" | \"current_model_id\",\n value: unknown,\n): void {\n if (typeof value === \"string\") {\n state[key] = value;\n }\n}\n\nfunction assignDesiredConfigOptions(state: SessionAcpxState, raw: unknown): void {\n const desiredConfigOptions = asRecord(raw);\n if (!desiredConfigOptions) {\n return;\n }\n\n const parsed = Object.fromEntries(\n Object.entries(desiredConfigOptions).filter((entry): entry is [string, string] => {\n const [, value] = entry;\n return typeof value === \"string\";\n }),\n );\n if (Object.keys(parsed).length > 0) {\n state.desired_config_options = parsed;\n }\n}\n\nfunction assignParsedSessionOptions(state: SessionAcpxState, raw: unknown): void {\n const sessionOptions = asRecord(raw);\n if (!sessionOptions) {\n return;\n }\n\n const parsedSessionOptions: NonNullable<SessionAcpxState[\"session_options\"]> = {};\n assignSessionOptionModel(parsedSessionOptions, sessionOptions.model);\n assignSessionOptionAllowedTools(parsedSessionOptions, sessionOptions.allowed_tools);\n assignSessionOptionMaxTurns(parsedSessionOptions, sessionOptions.max_turns);\n assignSessionOptionSystemPrompt(parsedSessionOptions, sessionOptions.system_prompt);\n\n if (Object.keys(parsedSessionOptions).length > 0) {\n state.session_options = parsedSessionOptions;\n }\n}\n\nfunction assignSessionOptionModel(\n options: NonNullable<SessionAcpxState[\"session_options\"]>,\n value: unknown,\n): void {\n if (typeof value === \"string\") {\n options.model = value;\n }\n}\n\nfunction assignSessionOptionAllowedTools(\n options: NonNullable<SessionAcpxState[\"session_options\"]>,\n value: unknown,\n): void {\n if (isStringArray(value)) {\n options.allowed_tools = [...value];\n }\n}\n\nfunction assignSessionOptionMaxTurns(\n options: NonNullable<SessionAcpxState[\"session_options\"]>,\n value: unknown,\n): void {\n if (typeof value === \"number\" && Number.isInteger(value) && value > 0) {\n options.max_turns = value;\n }\n}\n\nfunction assignSessionOptionSystemPrompt(\n options: NonNullable<SessionAcpxState[\"session_options\"]>,\n value: unknown,\n): void {\n if (typeof value === \"string\" && value.length > 0) {\n options.system_prompt = value;\n return;\n }\n\n const appendRecord = asRecord(value);\n if (appendRecord && typeof appendRecord.append === \"string\" && appendRecord.append.length > 0) {\n options.system_prompt = { append: appendRecord.append };\n }\n}\n\nfunction parseEventLog(raw: unknown, sessionId: string): SessionEventLog {\n const record = asRecord(raw);\n if (!record || !hasValidEventLogCore(record)) {\n return defaultSessionEventLog(sessionId);\n }\n\n return {\n active_path: record.active_path,\n segment_count: record.segment_count,\n max_segment_bytes: record.max_segment_bytes,\n max_segments: record.max_segments,\n last_write_at: typeof record.last_write_at === \"string\" ? record.last_write_at : undefined,\n last_write_error:\n record.last_write_error == null || typeof record.last_write_error === \"string\"\n ? record.last_write_error\n : null,\n };\n}\n\nfunction hasValidEventLogCore(record: Record<string, unknown>): record is Record<\n string,\n unknown\n> & {\n active_path: string;\n segment_count: number;\n max_segment_bytes: number;\n max_segments: number;\n} {\n return (\n typeof record.active_path === \"string\" &&\n isPositiveInteger(record.segment_count) &&\n isPositiveInteger(record.max_segment_bytes) &&\n isPositiveInteger(record.max_segments)\n );\n}\n\nfunction isPositiveInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value) && value > 0;\n}\n\nfunction parseImportedFrom(raw: unknown): SessionRecord[\"importedFrom\"] | null | undefined {\n if (raw == null) {\n return undefined;\n }\n\n const record = asRecord(raw);\n if (\n !record ||\n typeof record.record_id !== \"string\" ||\n typeof record.cwd_original !== \"string\" ||\n typeof record.exported_by !== \"string\" ||\n typeof record.exported_at !== \"string\"\n ) {\n return null;\n }\n\n return {\n recordId: record.record_id,\n cwdOriginal: record.cwd_original,\n exportedBy: record.exported_by,\n exportedAt: record.exported_at,\n };\n}\n\nfunction parseSessionRecordMetadata(record: Record<string, unknown>): {\n lastRequestId: string | undefined;\n importedFrom: SessionRecord[\"importedFrom\"];\n} | null {\n const lastRequestId = normalizeOptionalString(record.last_request_id);\n if (lastRequestId === null) {\n return null;\n }\n\n const importedFrom = parseImportedFrom(record.imported_from);\n if (importedFrom === null) {\n return null;\n }\n\n return { lastRequestId, importedFrom };\n}\n\nfunction normalizeOptionalName(value: unknown): string | undefined | null {\n if (value == null) {\n return undefined;\n }\n\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction normalizeOptionalPid(value: unknown): number | undefined | null {\n if (value == null) {\n return undefined;\n }\n\n if (!Number.isInteger(value) || (value as number) <= 0) {\n return null;\n }\n\n return value as number;\n}\n\nfunction normalizeOptionalBoolean(value: unknown, fallback = false): boolean | null {\n if (value == null) {\n return fallback;\n }\n return typeof value === \"boolean\" ? value : null;\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined | null {\n if (value == null) {\n return undefined;\n }\n return typeof value === \"string\" ? value : null;\n}\n\nfunction normalizeOptionalExitCode(value: unknown): number | null | undefined | symbol {\n if (value === undefined) {\n return undefined;\n }\n if (value === null) {\n return null;\n }\n if (Number.isInteger(value)) {\n return value as number;\n }\n return Symbol(\"invalid\");\n}\n\nfunction normalizeOptionalSignal(value: unknown): NodeJS.Signals | null | undefined | symbol {\n if (value === undefined) {\n return undefined;\n }\n if (value === null) {\n return null;\n }\n if (typeof value === \"string\") {\n return value as NodeJS.Signals;\n }\n return Symbol(\"invalid\");\n}\n\nexport function parseSessionRecord(raw: unknown): SessionRecord | null {\n const record = asRecord(raw);\n if (!record) {\n return null;\n }\n\n if (record.schema !== SESSION_RECORD_SCHEMA) {\n return null;\n }\n\n const name = normalizeOptionalName(record.name);\n const pid = normalizeOptionalPid(record.pid);\n const closed = normalizeOptionalBoolean(record.closed, false);\n const closedAt = normalizeOptionalString(record.closed_at);\n const agentStartedAt = normalizeOptionalString(record.agent_started_at);\n const lastPromptAt = normalizeOptionalString(record.last_prompt_at);\n const lastAgentExitCode = normalizeOptionalExitCode(record.last_agent_exit_code);\n const lastAgentExitSignal = normalizeOptionalSignal(record.last_agent_exit_signal);\n const lastAgentExitAt = normalizeOptionalString(record.last_agent_exit_at);\n const lastAgentDisconnectReason = normalizeOptionalString(record.last_agent_disconnect_reason);\n const optionals = validSessionOptionals({\n name,\n pid,\n closed,\n closedAt,\n agentStartedAt,\n lastPromptAt,\n lastAgentExitCode,\n lastAgentExitSignal,\n lastAgentExitAt,\n lastAgentDisconnectReason,\n });\n\n if (!hasValidSessionRecordCore(record) || !optionals) {\n return null;\n }\n\n const conversation = parseConversationRecord(record);\n if (!conversation) {\n return null;\n }\n\n const eventLog = parseEventLog(record.event_log, record.acpx_record_id);\n const metadata = parseSessionRecordMetadata(record);\n if (!metadata) {\n return null;\n }\n\n return {\n schema: SESSION_RECORD_SCHEMA,\n acpxRecordId: record.acpx_record_id,\n acpSessionId: record.acp_session_id,\n agentSessionId: normalizeRuntimeSessionId(record.agent_session_id),\n agentCommand: record.agent_command,\n cwd: record.cwd,\n name: optionals.name,\n createdAt: record.created_at,\n lastUsedAt: record.last_used_at,\n lastSeq: record.last_seq,\n lastRequestId: metadata.lastRequestId,\n eventLog,\n closed: optionals.closed,\n closedAt: optionals.closedAt,\n pid: optionals.pid,\n agentStartedAt: optionals.agentStartedAt,\n lastPromptAt: optionals.lastPromptAt,\n lastAgentExitCode: optionals.lastAgentExitCode,\n lastAgentExitSignal: optionals.lastAgentExitSignal,\n lastAgentExitAt: optionals.lastAgentExitAt,\n lastAgentDisconnectReason: optionals.lastAgentDisconnectReason,\n protocolVersion:\n typeof record.protocol_version === \"number\" ? record.protocol_version : undefined,\n agentCapabilities: asRecord(record.agent_capabilities) as SessionRecord[\"agentCapabilities\"],\n title: conversation.title,\n messages: conversation.messages,\n updated_at: conversation.updated_at,\n cumulative_token_usage: conversation.cumulative_token_usage,\n request_token_usage: conversation.request_token_usage,\n acpx: parseAcpxState(record.acpx),\n importedFrom: metadata.importedFrom,\n };\n}\n\nfunction hasValidSessionRecordCore(record: Record<string, unknown>): record is Record<\n string,\n unknown\n> & {\n acpx_record_id: string;\n acp_session_id: string;\n agent_command: string;\n cwd: string;\n created_at: string;\n last_used_at: string;\n last_seq: number;\n} {\n return (\n hasStringFields(record, [\n \"acpx_record_id\",\n \"acp_session_id\",\n \"agent_command\",\n \"cwd\",\n \"created_at\",\n \"last_used_at\",\n ]) &&\n typeof record.last_seq === \"number\" &&\n Number.isInteger(record.last_seq) &&\n record.last_seq >= 0\n );\n}\n\ntype NormalizedSessionOptionals = {\n name: string | undefined | null;\n pid: number | undefined | null;\n closed: boolean | null;\n closedAt: string | undefined | null;\n agentStartedAt: string | undefined | null;\n lastPromptAt: string | undefined | null;\n lastAgentExitCode: number | null | undefined | symbol;\n lastAgentExitSignal: NodeJS.Signals | null | undefined | symbol;\n lastAgentExitAt: string | undefined | null;\n lastAgentDisconnectReason: string | undefined | null;\n};\n\ntype ValidSessionOptionals = {\n name: string | undefined;\n pid: number | undefined;\n closed: boolean;\n closedAt: string | undefined;\n agentStartedAt: string | undefined;\n lastPromptAt: string | undefined;\n lastAgentExitCode: number | null | undefined;\n lastAgentExitSignal: NodeJS.Signals | null | undefined;\n lastAgentExitAt: string | undefined;\n lastAgentDisconnectReason: string | undefined;\n};\n\nfunction validSessionOptionals(options: NormalizedSessionOptionals): ValidSessionOptionals | null {\n if (hasNullOptionalSessionFields(options) || hasInvalidExitStatus(options)) {\n return null;\n }\n return options as ValidSessionOptionals;\n}\n\nfunction hasNullOptionalSessionFields(options: NormalizedSessionOptionals): boolean {\n return [\n options.name,\n options.pid,\n options.closed,\n options.closedAt,\n options.agentStartedAt,\n options.lastPromptAt,\n options.lastAgentExitAt,\n options.lastAgentDisconnectReason,\n ].some((value) => value === null);\n}\n\nfunction hasInvalidExitStatus(options: NormalizedSessionOptionals): boolean {\n return (\n typeof options.lastAgentExitCode === \"symbol\" || typeof options.lastAgentExitSignal === \"symbol\"\n );\n}\n","import type { PerfMetricsSnapshot } from \"./types.js\";\n\ntype TimingBucket = {\n count: number;\n totalMs: number;\n maxMs: number;\n};\n\nconst counters = new Map<string, number>();\nconst gauges = new Map<string, number>();\nconst timings = new Map<string, TimingBucket>();\n\nfunction hrNow(): bigint {\n return process.hrtime.bigint();\n}\n\nfunction durationMs(start: bigint): number {\n return Number(process.hrtime.bigint() - start) / 1_000_000;\n}\n\nfunction roundMetric(value: number): number {\n return Number(value.toFixed(3));\n}\n\nexport function incrementPerfCounter(name: string, delta = 1): void {\n counters.set(name, (counters.get(name) ?? 0) + delta);\n}\n\nexport function setPerfGauge(name: string, value: number): void {\n gauges.set(name, value);\n}\n\nexport function recordPerfDuration(name: string, durationMsValue: number): void {\n const next = timings.get(name) ?? {\n count: 0,\n totalMs: 0,\n maxMs: 0,\n };\n next.count += 1;\n next.totalMs += durationMsValue;\n next.maxMs = Math.max(next.maxMs, durationMsValue);\n timings.set(name, next);\n}\n\nexport async function measurePerf<T>(name: string, run: () => Promise<T>): Promise<T> {\n const startedAt = hrNow();\n try {\n return await run();\n } finally {\n recordPerfDuration(name, durationMs(startedAt));\n }\n}\n\nexport function startPerfTimer(name: string): () => number {\n const startedAt = hrNow();\n return () => {\n const elapsedMs = durationMs(startedAt);\n recordPerfDuration(name, elapsedMs);\n return elapsedMs;\n };\n}\n\nexport function getPerfMetricsSnapshot(): PerfMetricsSnapshot {\n return {\n counters: Object.fromEntries(counters.entries()),\n gauges: Object.fromEntries(gauges.entries()),\n timings: Object.fromEntries(\n [...timings.entries()].map(([name, bucket]) => [\n name,\n {\n count: bucket.count,\n totalMs: roundMetric(bucket.totalMs),\n maxMs: roundMetric(bucket.maxMs),\n },\n ]),\n ),\n };\n}\n\nexport function resetPerfMetrics(): void {\n counters.clear();\n gauges.clear();\n timings.clear();\n}\n\nexport function formatPerfMetric(name: string, durationMsValue: number): string {\n return `${name}=${roundMetric(durationMsValue)}ms`;\n}\n","const SNAKE_CASE_KEY = /^[a-z][a-z0-9_]*$/;\n\nconst ZED_TAG_KEYS = new Set([\n \"User\",\n \"Agent\",\n \"Resume\",\n \"Text\",\n \"Mention\",\n \"Image\",\n \"Audio\",\n \"Thinking\",\n \"RedactedThinking\",\n \"ToolUse\",\n]);\n\nconst MAP_OBJECT_PATHS = new Set([\"request_token_usage\", \"messages.Agent.tool_results\"]);\n\nconst OPAQUE_VALUE_PATHS = new Set([\n \"agent_capabilities\",\n \"messages.Agent.content.ToolUse.input\",\n \"acpx.desired_config_options\",\n \"acpx.config_options\",\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction joinPath(path: string[]): string {\n return path.join(\".\");\n}\n\nfunction isAllowedKey(path: string[], key: string): boolean {\n if (ZED_TAG_KEYS.has(key)) {\n return true;\n }\n\n return false;\n}\n\nfunction shouldSkipKeyRule(path: string[]): boolean {\n return MAP_OBJECT_PATHS.has(joinPath(path));\n}\n\nfunction shouldSkipDescend(path: string[]): boolean {\n return OPAQUE_VALUE_PATHS.has(joinPath(path)) || isToolResultOutputPath(path);\n}\n\nfunction isToolResultOutputTail(path: string[], toolResultsIndex: number): boolean {\n return toolResultsIndex !== -1 && toolResultsIndex + 2 === path.length - 1;\n}\n\nfunction isToolResultOutputPath(path: string[]): boolean {\n if (path.length < 5 || path[path.length - 1] !== \"output\") {\n return false;\n }\n\n const toolResultsIndex = path.lastIndexOf(\"tool_results\");\n if (!isToolResultOutputTail(path, toolResultsIndex)) {\n return false;\n }\n\n const parentPath = path.slice(0, toolResultsIndex + 1).join(\".\");\n return parentPath === \"messages.Agent.tool_results\";\n}\n\nfunction collectViolations(value: unknown, path: string[], violations: string[]): void {\n if (Array.isArray(value)) {\n for (const entry of value) {\n collectViolations(entry, path, violations);\n }\n return;\n }\n\n if (!isRecord(value)) {\n return;\n }\n\n const skipKeyRule = shouldSkipKeyRule(path);\n for (const [key, child] of Object.entries(value)) {\n collectKeyViolation(child, key, path, skipKeyRule, violations);\n }\n}\n\nfunction collectKeyViolation(\n child: unknown,\n key: string,\n path: string[],\n skipKeyRule: boolean,\n violations: string[],\n): void {\n if (!skipKeyRule && !SNAKE_CASE_KEY.test(key) && !isAllowedKey(path, key)) {\n violations.push(`${joinPath(path)}.${key}`.replace(/^\\./, \"\"));\n }\n\n const childPath = [...path, key];\n if (!shouldSkipDescend(childPath)) {\n collectViolations(child, childPath, violations);\n }\n}\n\nexport function findPersistedKeyPolicyViolations(value: unknown): string[] {\n const violations: string[] = [];\n collectViolations(value, [], violations);\n return violations;\n}\n\nexport function assertPersistedKeyPolicy(value: unknown): void {\n const violations = findPersistedKeyPolicyViolations(value);\n if (violations.length === 0) {\n return;\n }\n\n throw new Error(\n `Persisted key policy violation (expected snake_case keys): ${violations.join(\", \")}`,\n );\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SessionRecord } from \"../../types.js\";\nimport { parseSessionRecord } from \"./parse.js\";\n\nconst SESSION_INDEX_SCHEMA = \"acpx.session-index.v1\";\n\nexport type SessionIndexEntry = {\n file: string;\n acpxRecordId: string;\n acpSessionId: string;\n agentCommand: string;\n cwd: string;\n name?: string;\n closed: boolean;\n lastUsedAt: string;\n};\n\ntype SessionIndex = {\n schema: typeof SESSION_INDEX_SCHEMA;\n files: string[];\n entries: SessionIndexEntry[];\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction parseIndexEntry(raw: unknown): SessionIndexEntry | undefined {\n const record = asRecord(raw);\n if (!record) {\n return undefined;\n }\n if (!hasRequiredIndexEntryFields(record)) {\n return undefined;\n }\n if (record.name !== undefined && typeof record.name !== \"string\") {\n return undefined;\n }\n return {\n file: record.file,\n acpxRecordId: record.acpxRecordId,\n acpSessionId: record.acpSessionId,\n agentCommand: record.agentCommand,\n cwd: record.cwd,\n name: record.name,\n closed: record.closed,\n lastUsedAt: record.lastUsedAt,\n };\n}\n\nfunction hasRequiredIndexEntryFields(record: Record<string, unknown>): record is Record<\n string,\n unknown\n> & {\n file: string;\n acpxRecordId: string;\n acpSessionId: string;\n agentCommand: string;\n cwd: string;\n lastUsedAt: string;\n closed: boolean;\n} {\n return (\n [\"file\", \"acpxRecordId\", \"acpSessionId\", \"agentCommand\", \"cwd\", \"lastUsedAt\"].every(\n (key) => typeof record[key] === \"string\",\n ) && typeof record.closed === \"boolean\"\n );\n}\n\nexport function sessionIndexPath(sessionDir: string): string {\n return path.join(sessionDir, \"index.json\");\n}\n\nexport function toSessionIndexEntry(record: SessionRecord, fileName: string): SessionIndexEntry {\n return {\n file: fileName,\n acpxRecordId: record.acpxRecordId,\n acpSessionId: record.acpSessionId,\n agentCommand: record.agentCommand,\n cwd: record.cwd,\n name: record.name,\n closed: record.closed === true,\n lastUsedAt: record.lastUsedAt,\n };\n}\n\nexport async function readSessionIndex(sessionDir: string): Promise<SessionIndex | undefined> {\n const filePath = sessionIndexPath(sessionDir);\n try {\n const payload = await fs.readFile(filePath, \"utf8\");\n const parsed = JSON.parse(payload) as unknown;\n const record = asRecord(parsed);\n if (!record || record.schema !== SESSION_INDEX_SCHEMA || !Array.isArray(record.files)) {\n return undefined;\n }\n const files = record.files.filter((entry): entry is string => typeof entry === \"string\");\n if (files.length !== record.files.length || !Array.isArray(record.entries)) {\n return undefined;\n }\n const entries = record.entries\n .map((entry) => parseIndexEntry(entry))\n .filter((entry): entry is SessionIndexEntry => Boolean(entry));\n if (entries.length !== record.entries.length) {\n return undefined;\n }\n return {\n schema: SESSION_INDEX_SCHEMA,\n files,\n entries,\n };\n } catch {\n return undefined;\n }\n}\n\nexport async function writeSessionIndex(\n sessionDir: string,\n index: {\n files: string[];\n entries: SessionIndexEntry[];\n },\n): Promise<void> {\n const filePath = sessionIndexPath(sessionDir);\n const tempFile = `${filePath}.${process.pid}.${Date.now()}.tmp`;\n const payload = JSON.stringify(\n {\n schema: SESSION_INDEX_SCHEMA,\n files: [...index.files].toSorted(),\n entries: [...index.entries].toSorted((a, b) => b.lastUsedAt.localeCompare(a.lastUsedAt)),\n },\n null,\n 2,\n );\n await fs.writeFile(tempFile, `${payload}\\n`, \"utf8\");\n await fs.rename(tempFile, filePath);\n}\n\nexport async function rebuildSessionIndex(sessionDir: string): Promise<SessionIndex> {\n const entries = await fs.readdir(sessionDir, { withFileTypes: true });\n const files = entries\n .filter(\n (entry) => entry.isFile() && entry.name.endsWith(\".json\") && entry.name !== \"index.json\",\n )\n .map((entry) => entry.name)\n .toSorted();\n\n const indexEntries: SessionIndexEntry[] = [];\n for (const file of files) {\n try {\n const payload = await fs.readFile(path.join(sessionDir, file), \"utf8\");\n const parsed = parseSessionRecord(JSON.parse(payload));\n if (!parsed) {\n continue;\n }\n indexEntries.push(toSessionIndexEntry(parsed, file));\n } catch {\n // ignore corrupt session files while rebuilding the cache index\n }\n }\n\n const index: SessionIndex = {\n schema: SESSION_INDEX_SCHEMA,\n files,\n entries: indexEntries,\n };\n await writeSessionIndex(sessionDir, index);\n return index;\n}\n\nexport async function loadOrRebuildSessionIndex(sessionDir: string): Promise<SessionIndex> {\n const files = (await fs.readdir(sessionDir, { withFileTypes: true }))\n .filter(\n (entry) => entry.isFile() && entry.name.endsWith(\".json\") && entry.name !== \"index.json\",\n )\n .map((entry) => entry.name)\n .toSorted();\n const existing = await readSessionIndex(sessionDir);\n if (\n existing &&\n existing.files.length === files.length &&\n existing.files.every((file, index) => file === files[index])\n ) {\n return existing;\n }\n return await rebuildSessionIndex(sessionDir);\n}\n","import { statSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { SessionNotFoundError, SessionResolutionError } from \"../../errors.js\";\nimport { incrementPerfCounter, measurePerf } from \"../../perf-metrics.js\";\nimport { assertPersistedKeyPolicy } from \"../../persisted-key-policy.js\";\nimport type { SessionRecord } from \"../../types.js\";\nimport {\n loadOrRebuildSessionIndex,\n rebuildSessionIndex,\n toSessionIndexEntry,\n writeSessionIndex,\n type SessionIndexEntry,\n} from \"./index.js\";\nimport { parseSessionRecord } from \"./parse.js\";\nimport { serializeSessionRecordForDisk } from \"./serialize.js\";\n\nexport const DEFAULT_HISTORY_LIMIT = 20;\n\ntype FindSessionOptions = {\n agentCommand: string;\n cwd: string;\n name?: string;\n includeClosed?: boolean;\n};\n\ntype FindSessionByDirectoryWalkOptions = {\n agentCommand: string;\n cwd: string;\n name?: string;\n boundary?: string;\n};\n\nfunction sessionFilePath(acpxRecordId: string): string {\n const safeId = encodeURIComponent(acpxRecordId);\n return path.join(sessionBaseDir(), `${safeId}.json`);\n}\n\nfunction sessionBaseDir(): string {\n return path.join(os.homedir(), \".acpx\", \"sessions\");\n}\n\nasync function ensureSessionDir(): Promise<void> {\n await fs.mkdir(sessionBaseDir(), { recursive: true });\n}\n\nasync function loadRecordFromIndexEntry(\n entry: SessionIndexEntry,\n): Promise<SessionRecord | undefined> {\n try {\n const payload = await fs.readFile(path.join(sessionBaseDir(), entry.file), \"utf8\");\n return parseSessionRecord(JSON.parse(payload)) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function loadSessionIndexEntries(): Promise<SessionIndexEntry[]> {\n await ensureSessionDir();\n const index = await measurePerf(\"session.index_load\", async () => {\n return await loadOrRebuildSessionIndex(sessionBaseDir());\n });\n return index.entries;\n}\n\nfunction matchesSessionEntry(\n session: SessionIndexEntry,\n normalizedCwd: string,\n normalizedName: string | undefined,\n includeClosed = false,\n): boolean {\n if (session.cwd !== normalizedCwd) {\n return false;\n }\n if (!includeClosed && session.closed) {\n return false;\n }\n if (normalizedName == null) {\n return session.name == null;\n }\n return session.name === normalizedName;\n}\n\nexport async function writeSessionRecord(record: SessionRecord): Promise<void> {\n await measurePerf(\"session.write_record\", async () => {\n await ensureSessionDir();\n\n const persisted = serializeSessionRecordForDisk(record);\n assertPersistedKeyPolicy(persisted);\n\n const file = sessionFilePath(record.acpxRecordId);\n const tempFile = `${file}.${process.pid}.${Date.now()}.tmp`;\n const payload = JSON.stringify(persisted, null, 2);\n await fs.writeFile(tempFile, `${payload}\\n`, \"utf8\");\n await fs.rename(tempFile, file);\n\n const sessionDir = sessionBaseDir();\n const index = await loadOrRebuildSessionIndex(sessionDir);\n const fileName = path.basename(file);\n const entries = index.entries.filter((entry) => entry.file !== fileName);\n entries.push(toSessionIndexEntry(record, fileName));\n const files = [...new Set([...index.files.filter((entry) => entry !== fileName), fileName])];\n await writeSessionIndex(sessionDir, { files, entries });\n });\n}\n\nexport async function resolveSessionRecord(sessionId: string): Promise<SessionRecord> {\n await ensureSessionDir();\n\n const directPath = sessionFilePath(sessionId);\n try {\n const directPayload = await measurePerf(\"session.resolve_direct\", async () => {\n return await fs.readFile(directPath, \"utf8\");\n });\n const directRecord = parseSessionRecord(JSON.parse(directPayload));\n if (directRecord) {\n return directRecord;\n }\n } catch {\n // fallback to indexed search\n }\n\n const entries = await loadSessionIndexEntries();\n const exactEntries = entries.filter(\n (entry) => entry.acpxRecordId === sessionId || entry.acpSessionId === sessionId,\n );\n const exactRecords = (\n await Promise.all(exactEntries.map((entry) => loadRecordFromIndexEntry(entry)))\n ).filter((entry): entry is SessionRecord => Boolean(entry));\n if (exactRecords.length === 1) {\n return exactRecords[0];\n }\n if (exactRecords.length > 1) {\n throw new SessionResolutionError(`Multiple sessions match id: ${sessionId}`);\n }\n\n const suffixEntries = entries.filter(\n (entry) => entry.acpxRecordId.endsWith(sessionId) || entry.acpSessionId.endsWith(sessionId),\n );\n const suffixRecords = (\n await Promise.all(suffixEntries.map((entry) => loadRecordFromIndexEntry(entry)))\n ).filter((entry): entry is SessionRecord => Boolean(entry));\n if (suffixRecords.length === 1) {\n return suffixRecords[0];\n }\n if (suffixRecords.length > 1) {\n throw new SessionResolutionError(`Session id is ambiguous: ${sessionId}`);\n }\n\n incrementPerfCounter(\"session.resolve_miss\");\n throw new SessionNotFoundError(sessionId);\n}\n\nfunction hasGitDirectory(dir: string): boolean {\n const gitPath = path.join(dir, \".git\");\n try {\n return statSync(gitPath).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isWithinBoundary(boundary: string, target: string): boolean {\n const relative = path.relative(boundary, target);\n return relative.length === 0 || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nexport function absolutePath(value: string): string {\n return path.resolve(value);\n}\n\nexport function findGitRepositoryRoot(startDir: string): string | undefined {\n let current = absolutePath(startDir);\n const root = path.parse(current).root;\n\n for (;;) {\n if (hasGitDirectory(current)) {\n return current;\n }\n\n if (current === root) {\n return undefined;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n current = parent;\n }\n}\n\nexport function normalizeName(value: string | undefined): string | undefined {\n if (value == null) {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function isoNow(): string {\n return new Date().toISOString();\n}\n\nexport async function listSessions(): Promise<SessionRecord[]> {\n await ensureSessionDir();\n const entries = await loadSessionIndexEntries();\n const records: SessionRecord[] = [];\n\n for (const entry of entries) {\n const parsed = await loadRecordFromIndexEntry(entry);\n if (parsed) {\n records.push(parsed);\n }\n }\n\n records.sort((a, b) => b.lastUsedAt.localeCompare(a.lastUsedAt));\n return records;\n}\n\nexport async function listSessionsForAgent(agentCommand: string): Promise<SessionRecord[]> {\n const entries = (await loadSessionIndexEntries()).filter(\n (session) => session.agentCommand === agentCommand,\n );\n const records = await Promise.all(entries.map((entry) => loadRecordFromIndexEntry(entry)));\n return records\n .filter((entry): entry is SessionRecord => Boolean(entry))\n .toSorted((a, b) => b.lastUsedAt.localeCompare(a.lastUsedAt));\n}\n\nexport async function findSession(options: FindSessionOptions): Promise<SessionRecord | undefined> {\n const normalizedCwd = absolutePath(options.cwd);\n const normalizedName = normalizeName(options.name);\n const entries = await loadSessionIndexEntries();\n const match = entries.find(\n (session) =>\n session.agentCommand === options.agentCommand &&\n matchesSessionEntry(session, normalizedCwd, normalizedName, options.includeClosed),\n );\n if (!match) {\n return undefined;\n }\n return await loadRecordFromIndexEntry(match);\n}\n\nexport async function findSessionByDirectoryWalk(\n options: FindSessionByDirectoryWalkOptions,\n): Promise<SessionRecord | undefined> {\n const normalizedName = normalizeName(options.name);\n const normalizedStart = absolutePath(options.cwd);\n const normalizedBoundary = absolutePath(options.boundary ?? normalizedStart);\n const walkBoundary = isWithinBoundary(normalizedBoundary, normalizedStart)\n ? normalizedBoundary\n : normalizedStart;\n const sessions = (await loadSessionIndexEntries()).filter(\n (session) => session.agentCommand === options.agentCommand,\n );\n\n let current = normalizedStart;\n const walkRoot = path.parse(current).root;\n\n for (;;) {\n const match = sessions.find((session) => matchesSessionEntry(session, current, normalizedName));\n if (match) {\n return await loadRecordFromIndexEntry(match);\n }\n\n const parent = nextWalkParent(current, walkBoundary, walkRoot);\n if (!parent) {\n return undefined;\n }\n current = parent;\n }\n}\n\nfunction nextWalkParent(\n current: string,\n walkBoundary: string,\n walkRoot: string,\n): string | undefined {\n if (current === walkBoundary || current === walkRoot) {\n return undefined;\n }\n\n const parent = path.dirname(current);\n if (parent === current || !isWithinBoundary(walkBoundary, parent)) {\n return undefined;\n }\n\n return parent;\n}\n\nfunction killSignalCandidates(signal: NodeJS.Signals | undefined): NodeJS.Signals[] {\n if (!signal) {\n return [\"SIGTERM\", \"SIGKILL\"];\n }\n\n const normalized = signal.toUpperCase() as NodeJS.Signals;\n if (normalized === \"SIGKILL\") {\n return [\"SIGKILL\"];\n }\n\n return [normalized, \"SIGKILL\"];\n}\n\nexport type PruneOptions = {\n agentCommand?: string;\n before?: Date;\n olderThanMs?: number;\n includeHistory?: boolean;\n dryRun?: boolean;\n};\n\nexport type PruneResult = {\n pruned: SessionRecord[];\n bytesFreed: number;\n dryRun: boolean;\n};\n\nfunction closedAtOrLastUsedAt(record: SessionRecord): string {\n return record.closedAt ?? record.lastUsedAt;\n}\n\nfunction isSessionStreamFile(fileName: string, safeId: string): boolean {\n return (\n fileName === `${safeId}.stream.ndjson` ||\n fileName === `${safeId}.stream.lock` ||\n fileName.startsWith(`${safeId}.stream.`)\n );\n}\n\nexport async function pruneSessions(options: PruneOptions = {}): Promise<PruneResult> {\n await ensureSessionDir();\n const entries = await loadSessionIndexEntries();\n\n const eligible = filterPruneCandidates(entries, options.agentCommand);\n\n const cutoff =\n options.before ??\n (options.olderThanMs != null ? new Date(Date.now() - options.olderThanMs) : undefined);\n\n const records = await loadPrunableRecords(eligible, cutoff);\n\n if (options.dryRun) {\n return { pruned: records, bytesFreed: 0, dryRun: true };\n }\n\n const sessionDir = sessionBaseDir();\n let bytesFreed = 0;\n\n // Read the directory once upfront so stream-file matching doesn't re-read\n // it for every session in the loop.\n let dirEntries: string[] = [];\n if (options.includeHistory) {\n try {\n dirEntries = await fs.readdir(sessionDir);\n } catch {\n // ignore\n }\n }\n\n for (const record of records) {\n bytesFreed += await pruneSessionFiles(\n record,\n sessionDir,\n dirEntries,\n options.includeHistory === true,\n );\n }\n\n await rebuildSessionIndex(sessionDir).catch(() => {\n // best effort cache rebuild\n });\n\n return { pruned: records, bytesFreed, dryRun: false };\n}\n\nfunction filterPruneCandidates(\n entries: SessionIndexEntry[],\n agentCommand: string | undefined,\n): SessionIndexEntry[] {\n return entries.filter(\n (entry) => entry.closed && (!agentCommand || entry.agentCommand === agentCommand),\n );\n}\n\nasync function loadPrunableRecords(\n entries: SessionIndexEntry[],\n cutoff: Date | undefined,\n): Promise<SessionRecord[]> {\n const records: SessionRecord[] = [];\n const cutoffIso = cutoff?.toISOString();\n for (const entry of entries) {\n const record = await loadRecordFromIndexEntry(entry);\n if (record && isBeforeCutoff(record, cutoffIso)) {\n records.push(record);\n }\n }\n return records;\n}\n\nfunction isBeforeCutoff(record: SessionRecord, cutoffIso: string | undefined): boolean {\n return !cutoffIso || closedAtOrLastUsedAt(record) < cutoffIso;\n}\n\nasync function pruneSessionFiles(\n record: SessionRecord,\n sessionDir: string,\n dirEntries: string[],\n includeHistory: boolean,\n): Promise<number> {\n const safeId = encodeURIComponent(record.acpxRecordId);\n let bytesFreed = await unlinkCountingBytes(path.join(sessionDir, `${safeId}.json`));\n if (includeHistory) {\n for (const name of dirEntries.filter((entry) => isSessionStreamFile(entry, safeId))) {\n bytesFreed += await unlinkCountingBytes(path.join(sessionDir, name));\n }\n }\n return bytesFreed;\n}\n\nasync function unlinkCountingBytes(filePath: string): Promise<number> {\n let bytes = 0;\n try {\n const stat = await fs.stat(filePath);\n bytes = stat.size;\n } catch {\n // file already gone\n }\n await fs.unlink(filePath).catch(() => undefined);\n return bytes;\n}\n\nexport async function closeSession(id: string): Promise<SessionRecord> {\n const record = await resolveSessionRecord(id);\n const now = isoNow();\n\n if (record.pid) {\n for (const signal of killSignalCandidates(record.lastAgentExitSignal ?? undefined)) {\n try {\n process.kill(record.pid, signal);\n } catch {\n // ignore\n }\n }\n }\n\n record.closed = true;\n record.closedAt = now;\n record.pid = undefined;\n record.lastUsedAt = now;\n record.lastPromptAt = record.lastPromptAt ?? now;\n\n await writeSessionRecord(record);\n await rebuildSessionIndex(sessionBaseDir()).catch(() => {\n // best effort cache rebuild\n });\n return record;\n}\n","import readline from \"node:readline/promises\";\n\nexport type PermissionPromptOptions = {\n prompt: string;\n header?: string;\n details?: string;\n};\n\nexport async function promptForPermission(options: PermissionPromptOptions): Promise<boolean> {\n if (!process.stdin.isTTY || !process.stderr.isTTY) {\n return false;\n }\n\n if (options.header) {\n process.stderr.write(`\\n${options.header}\\n`);\n }\n if (options.details && options.details.trim().length > 0) {\n process.stderr.write(`${options.details}\\n`);\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n\n try {\n const answer = await rl.question(options.prompt);\n const normalized = answer.trim().toLowerCase();\n return normalized === \"y\" || normalized === \"yes\";\n } finally {\n rl.close();\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type {\n ReadTextFileRequest,\n ReadTextFileResponse,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport { PermissionDeniedError, PermissionPromptUnavailableError } from \"./errors.js\";\nimport { promptForPermission } from \"./permission-prompt.js\";\nimport type { ClientOperation, NonInteractivePermissionPolicy, PermissionMode } from \"./types.js\";\n\nconst WRITE_PREVIEW_MAX_LINES = 16;\nconst WRITE_PREVIEW_MAX_CHARS = 1_200;\n\nexport type FileSystemHandlersOptions = {\n cwd: string;\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n onOperation?: (operation: ClientOperation) => void;\n confirmWrite?: (filePath: string, preview: string) => Promise<boolean>;\n};\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction isWithinRoot(rootDir: string, targetPath: string): boolean {\n const relative = path.relative(rootDir, targetPath);\n return relative.length === 0 || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction toWritePreview(content: string): string {\n const normalized = content.replace(/\\r\\n/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n const visibleLines = lines.slice(0, WRITE_PREVIEW_MAX_LINES);\n let preview = visibleLines.join(\"\\n\");\n\n if (lines.length > visibleLines.length) {\n preview += `\\n... (${lines.length - visibleLines.length} more lines)`;\n }\n\n if (preview.length > WRITE_PREVIEW_MAX_CHARS) {\n preview = `${preview.slice(0, WRITE_PREVIEW_MAX_CHARS - 3)}...`;\n }\n\n return preview;\n}\n\nasync function defaultConfirmWrite(filePath: string, preview: string): Promise<boolean> {\n return await promptForPermission({\n header: `[permission] Allow write to ${filePath}?`,\n details: preview,\n prompt: \"Allow write? (y/N) \",\n });\n}\n\nfunction canPromptForPermission(): boolean {\n return process.stdin.isTTY && process.stderr.isTTY;\n}\n\nexport class FileSystemHandlers {\n private readonly rootDir: string;\n private permissionMode: PermissionMode;\n private nonInteractivePermissions: NonInteractivePermissionPolicy;\n private readonly onOperation?: (operation: ClientOperation) => void;\n private readonly usesDefaultConfirmWrite: boolean;\n private readonly confirmWrite: (filePath: string, preview: string) => Promise<boolean>;\n\n constructor(options: FileSystemHandlersOptions) {\n this.rootDir = path.resolve(options.cwd);\n this.permissionMode = options.permissionMode;\n this.nonInteractivePermissions = options.nonInteractivePermissions ?? \"deny\";\n this.onOperation = options.onOperation;\n this.usesDefaultConfirmWrite = options.confirmWrite == null;\n this.confirmWrite = options.confirmWrite ?? defaultConfirmWrite;\n }\n\n updatePermissionPolicy(\n permissionMode: PermissionMode,\n nonInteractivePermissions?: NonInteractivePermissionPolicy,\n ): void {\n this.permissionMode = permissionMode;\n this.nonInteractivePermissions = nonInteractivePermissions ?? \"deny\";\n }\n\n async readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n const filePath = this.resolvePathWithinRoot(params.path);\n const summary = `read_text_file: ${filePath}`;\n this.emitOperation({\n method: \"fs/read_text_file\",\n status: \"running\",\n summary,\n details: this.readWindowDetails(params.line, params.limit),\n timestamp: nowIso(),\n });\n\n try {\n if (this.permissionMode === \"deny-all\") {\n throw new PermissionDeniedError(\"Permission denied for fs/read_text_file (--deny-all)\");\n }\n\n const content = await fs.readFile(filePath, \"utf8\");\n const sliced = this.sliceContent(content, params.line, params.limit);\n\n this.emitOperation({\n method: \"fs/read_text_file\",\n status: \"completed\",\n summary,\n details: this.readWindowDetails(params.line, params.limit),\n timestamp: nowIso(),\n });\n return { content: sliced };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emitOperation({\n method: \"fs/read_text_file\",\n status: \"failed\",\n summary,\n details: message,\n timestamp: nowIso(),\n });\n throw error;\n }\n }\n\n async writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n const filePath = this.resolvePathWithinRoot(params.path);\n const preview = toWritePreview(params.content);\n const summary = `write_text_file: ${filePath}`;\n\n this.emitOperation({\n method: \"fs/write_text_file\",\n status: \"running\",\n summary,\n details: preview,\n timestamp: nowIso(),\n });\n\n try {\n if (!(await this.isWriteApproved(filePath, preview))) {\n throw new PermissionDeniedError(\"Permission denied for fs/write_text_file\");\n }\n\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, params.content, \"utf8\");\n\n this.emitOperation({\n method: \"fs/write_text_file\",\n status: \"completed\",\n summary,\n details: preview,\n timestamp: nowIso(),\n });\n return {};\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emitOperation({\n method: \"fs/write_text_file\",\n status: \"failed\",\n summary,\n details: message,\n timestamp: nowIso(),\n });\n throw error;\n }\n }\n\n private async isWriteApproved(filePath: string, preview: string): Promise<boolean> {\n if (this.permissionMode === \"approve-all\") {\n return true;\n }\n if (this.permissionMode === \"deny-all\") {\n return false;\n }\n if (\n this.usesDefaultConfirmWrite &&\n this.nonInteractivePermissions === \"fail\" &&\n !canPromptForPermission()\n ) {\n throw new PermissionPromptUnavailableError();\n }\n return await this.confirmWrite(filePath, preview);\n }\n\n private resolvePathWithinRoot(rawPath: string): string {\n if (!path.isAbsolute(rawPath)) {\n throw new Error(`Path must be absolute: ${rawPath}`);\n }\n const resolved = path.resolve(rawPath);\n if (!isWithinRoot(this.rootDir, resolved)) {\n throw new Error(`Path is outside allowed cwd subtree: ${resolved}`);\n }\n return resolved;\n }\n\n private sliceContent(\n content: string,\n line: number | null | undefined,\n limit: number | null | undefined,\n ): string {\n if (line == null && limit == null) {\n return content;\n }\n\n const lines = content.split(\"\\n\");\n const startLine = line == null ? 1 : Math.max(1, Math.trunc(line));\n const startIndex = Math.max(0, startLine - 1);\n const maxLines = limit == null ? undefined : Math.max(0, Math.trunc(limit));\n\n if (maxLines === 0) {\n return \"\";\n }\n\n const endIndex =\n maxLines == null ? lines.length : Math.min(lines.length, startIndex + maxLines);\n\n return lines.slice(startIndex, endIndex).join(\"\\n\");\n }\n\n private readWindowDetails(\n line: number | null | undefined,\n limit: number | null | undefined,\n ): string | undefined {\n if (line == null && limit == null) {\n return undefined;\n }\n const start = line == null ? 1 : Math.max(1, Math.trunc(line));\n const max = limit == null ? \"all\" : Math.max(0, Math.trunc(limit));\n return `line=${start}, limit=${max}`;\n }\n\n private emitOperation(operation: ClientOperation): void {\n this.onOperation?.(operation);\n }\n}\n","import {\n type PermissionOption,\n type RequestPermissionRequest,\n type RequestPermissionResponse,\n type ToolKind,\n} from \"@agentclientprotocol/sdk\";\nimport { PermissionPromptUnavailableError } from \"./errors.js\";\nimport { promptForPermission } from \"./permission-prompt.js\";\nimport type {\n AcpPermissionDecision,\n NonInteractivePermissionPolicy,\n PermissionEscalationEvent,\n PermissionMode,\n PermissionPolicy,\n PermissionPolicyAction,\n} from \"./types.js\";\n\ntype PermissionDecision = \"approved\" | \"denied\" | \"cancelled\";\ntype PermissionPolicyMatch = {\n action: PermissionPolicyAction;\n matchedRule?: string;\n};\nexport type ResolvedPermissionRequest = {\n response: RequestPermissionResponse;\n escalation?: PermissionEscalationEvent;\n};\nconst PERMISSION_MODE_RANK: Record<PermissionMode, number> = {\n \"deny-all\": 0,\n \"approve-reads\": 1,\n \"approve-all\": 2,\n};\n\nfunction selected(optionId: string): RequestPermissionResponse {\n return { outcome: { outcome: \"selected\", optionId } };\n}\n\nfunction cancelled(): RequestPermissionResponse {\n return { outcome: { outcome: \"cancelled\" } };\n}\n\nfunction withEscalationMetadata(\n response: RequestPermissionResponse,\n event: PermissionEscalationEvent,\n): RequestPermissionResponse {\n return {\n ...response,\n _meta: {\n ...response._meta,\n acpx: {\n ...(response._meta?.acpx &&\n typeof response._meta.acpx === \"object\" &&\n !Array.isArray(response._meta.acpx)\n ? response._meta.acpx\n : {}),\n permissionEscalation: event,\n },\n },\n };\n}\n\nfunction pickOption(\n options: PermissionOption[],\n kinds: PermissionOption[\"kind\"][],\n): PermissionOption | undefined {\n for (const kind of kinds) {\n const match = options.find((option) => option.kind === kind);\n if (match) {\n return match;\n }\n }\n return undefined;\n}\n\nconst TOOL_KIND_TITLE_MATCHERS: Array<{ kind: ToolKind; needles: readonly string[] }> = [\n { kind: \"read\", needles: [\"read\", \"cat\"] },\n { kind: \"search\", needles: [\"search\", \"find\", \"grep\"] },\n { kind: \"edit\", needles: [\"write\", \"edit\", \"patch\"] },\n { kind: \"delete\", needles: [\"delete\", \"remove\"] },\n { kind: \"move\", needles: [\"move\", \"rename\"] },\n { kind: \"execute\", needles: [\"run\", \"execute\", \"bash\"] },\n { kind: \"fetch\", needles: [\"fetch\", \"http\", \"url\"] },\n { kind: \"think\", needles: [\"think\"] },\n];\n\nexport function inferToolKind(params: RequestPermissionRequest): ToolKind | undefined {\n if (params.toolCall.kind) {\n return params.toolCall.kind;\n }\n\n const title = params.toolCall.title?.trim().toLowerCase();\n if (!title) {\n return undefined;\n }\n\n const head = title.split(\":\", 1)[0]?.trim();\n if (!head) {\n return undefined;\n }\n\n return titleHeadToolKind(head) ?? \"other\";\n}\n\nfunction titleHeadToolKind(head: string): ToolKind | undefined {\n return TOOL_KIND_TITLE_MATCHERS.find(({ needles }) =>\n needles.some((needle) => head.includes(needle)),\n )?.kind;\n}\n\nfunction isAutoApprovedReadKind(kind: ToolKind | undefined): boolean {\n return kind === \"read\" || kind === \"search\";\n}\n\nasync function promptForToolPermission(params: RequestPermissionRequest): Promise<boolean> {\n const toolName = params.toolCall.title ?? \"tool\";\n const toolKind = inferToolKind(params) ?? \"other\";\n return await promptForPermission({\n prompt: `\\n[permission] Allow ${toolName} [${toolKind}]? (y/N) `,\n });\n}\n\nfunction canPromptForPermission(): boolean {\n return process.stdin.isTTY && process.stderr.isTTY;\n}\n\nfunction readStringProperty(value: unknown, keys: string[]): string | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n const record = value as Record<string, unknown>;\n for (const key of keys) {\n const entry = record[key];\n if (typeof entry === \"string\" && entry.trim().length > 0) {\n return entry.trim();\n }\n }\n return undefined;\n}\n\nfunction readToolName(params: RequestPermissionRequest): string | undefined {\n const rawInputName = readStringProperty(params.toolCall.rawInput, [\"name\", \"tool\", \"toolName\"]);\n if (rawInputName) {\n return rawInputName;\n }\n\n const title = params.toolCall.title?.trim();\n const head = title?.split(/[:\\s]/, 1)[0]?.trim();\n return head && head.length > 0 ? head : undefined;\n}\n\nfunction normalizeMatcher(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction permissionMatchTokens(params: RequestPermissionRequest): string[] {\n const tokens = new Set<string>();\n const kind = inferToolKind(params);\n const rawKind = params.toolCall.kind;\n const title = params.toolCall.title?.trim();\n const toolName = readToolName(params);\n\n for (const value of [kind, rawKind, title, toolName]) {\n if (typeof value === \"string\" && value.trim().length > 0) {\n tokens.add(normalizeMatcher(value));\n }\n }\n\n if (title) {\n const head = title.split(/[:\\s]/, 1)[0]?.trim();\n if (head) {\n tokens.add(normalizeMatcher(head));\n }\n }\n\n return [...tokens];\n}\n\nfunction findPolicyRule(\n rules: string[] | undefined,\n params: RequestPermissionRequest,\n): string | undefined {\n if (!rules || rules.length === 0) {\n return undefined;\n }\n\n const tokens = permissionMatchTokens(params);\n for (const rule of rules) {\n const normalized = normalizeMatcher(rule);\n if (normalized === \"*\" || tokens.includes(normalized)) {\n return rule;\n }\n }\n return undefined;\n}\n\nfunction matchPermissionPolicy(\n params: RequestPermissionRequest,\n policy: PermissionPolicy | undefined,\n): PermissionPolicyMatch | undefined {\n if (!policy) {\n return undefined;\n }\n\n const denyRule = findPolicyRule(policy.autoDeny, params);\n if (denyRule) {\n return { action: \"deny\", matchedRule: denyRule };\n }\n\n const approveRule = findPolicyRule(policy.autoApprove, params);\n if (approveRule) {\n return { action: \"approve\", matchedRule: approveRule };\n }\n\n const escalateRule = findPolicyRule(policy.escalate, params);\n if (escalateRule) {\n return { action: \"escalate\", matchedRule: escalateRule };\n }\n\n return policy.defaultAction ? { action: policy.defaultAction } : undefined;\n}\n\nfunction buildEscalationEvent(\n params: RequestPermissionRequest,\n matchedRule: string | undefined,\n): PermissionEscalationEvent {\n const toolKind = inferToolKind(params);\n const toolTitle = params.toolCall.title?.trim() || \"tool\";\n const toolName = readToolName(params);\n return {\n type: \"permission_escalation\",\n sessionId: params.sessionId,\n toolCallId: params.toolCall.toolCallId,\n ...(toolName ? { toolName } : {}),\n toolTitle,\n ...(params.toolCall.rawInput !== undefined ? { toolInput: params.toolCall.rawInput } : {}),\n ...(toolKind ? { toolKind } : {}),\n action: \"escalate\",\n ...(matchedRule ? { matchedRule } : {}),\n message: `Permission escalation required for ${toolTitle}`,\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction selectedOrFirst(\n options: PermissionOption[],\n allowOption: PermissionOption | undefined,\n): ResolvedPermissionRequest {\n return { response: selected((allowOption ?? options[0]).optionId) };\n}\n\nfunction selectedOrCancelled(option: PermissionOption | undefined): ResolvedPermissionRequest {\n return { response: option ? selected(option.optionId) : cancelled() };\n}\n\nasync function resolveEscalatingPermissionRequest(\n params: RequestPermissionRequest,\n policyMatch: PermissionPolicyMatch,\n allowOption: PermissionOption | undefined,\n rejectOption: PermissionOption | undefined,\n): Promise<ResolvedPermissionRequest> {\n if (canPromptForPermission()) {\n return resolveInteractivePromptResult(params, allowOption, rejectOption);\n }\n\n const escalation = buildEscalationEvent(params, policyMatch.matchedRule);\n const response = rejectOption ? selected(rejectOption.optionId) : cancelled();\n return {\n response: withEscalationMetadata(response, escalation),\n escalation,\n };\n}\n\nasync function resolveInteractivePromptResult(\n params: RequestPermissionRequest,\n allowOption: PermissionOption | undefined,\n rejectOption: PermissionOption | undefined,\n): Promise<ResolvedPermissionRequest> {\n const approved = await promptForToolPermission(params);\n if (approved && allowOption) {\n return { response: selected(allowOption.optionId) };\n }\n if (!approved && rejectOption) {\n return { response: selected(rejectOption.optionId) };\n }\n return { response: cancelled() };\n}\n\nfunction resolvePolicyMatch(\n params: RequestPermissionRequest,\n policyMatch: PermissionPolicyMatch | undefined,\n options: PermissionOption[],\n allowOption: PermissionOption | undefined,\n rejectOption: PermissionOption | undefined,\n): Promise<ResolvedPermissionRequest | undefined> | ResolvedPermissionRequest | undefined {\n if (policyMatch?.action === \"approve\") {\n return selectedOrFirst(options, allowOption);\n }\n if (policyMatch?.action === \"deny\") {\n return selectedOrCancelled(rejectOption);\n }\n if (policyMatch?.action === \"escalate\") {\n return resolveEscalatingPermissionRequest(params, policyMatch, allowOption, rejectOption);\n }\n return undefined;\n}\n\nfunction resolveModeMatch(\n options: PermissionOption[],\n mode: PermissionMode,\n allowOption: PermissionOption | undefined,\n rejectOption: PermissionOption | undefined,\n): ResolvedPermissionRequest | undefined {\n if (mode === \"approve-all\") {\n return selectedOrFirst(options, allowOption);\n }\n if (mode === \"deny-all\") {\n return selectedOrCancelled(rejectOption);\n }\n return undefined;\n}\n\nfunction resolveNonInteractivePermission(\n nonInteractivePolicy: NonInteractivePermissionPolicy,\n rejectOption: PermissionOption | undefined,\n): ResolvedPermissionRequest {\n if (nonInteractivePolicy === \"fail\") {\n throw new PermissionPromptUnavailableError();\n }\n return selectedOrCancelled(rejectOption);\n}\n\nasync function resolveReadOrPromptPermission(\n params: RequestPermissionRequest,\n nonInteractivePolicy: NonInteractivePermissionPolicy,\n allowOption: PermissionOption | undefined,\n rejectOption: PermissionOption | undefined,\n): Promise<ResolvedPermissionRequest> {\n const kind = inferToolKind(params);\n if (isAutoApprovedReadKind(kind) && allowOption) {\n return { response: selected(allowOption.optionId) };\n }\n\n if (!canPromptForPermission()) {\n return resolveNonInteractivePermission(nonInteractivePolicy, rejectOption);\n }\n\n return resolveInteractivePromptResult(params, allowOption, rejectOption);\n}\n\nexport function permissionModeSatisfies(actual: PermissionMode, required: PermissionMode): boolean {\n return PERMISSION_MODE_RANK[actual] >= PERMISSION_MODE_RANK[required];\n}\n\nexport async function resolvePermissionRequest(\n params: RequestPermissionRequest,\n mode: PermissionMode,\n nonInteractivePolicy: NonInteractivePermissionPolicy = \"deny\",\n policy?: PermissionPolicy,\n): Promise<RequestPermissionResponse> {\n const result = await resolvePermissionRequestWithDetails(\n params,\n mode,\n nonInteractivePolicy,\n policy,\n );\n return result.response;\n}\n\nexport async function resolvePermissionRequestWithDetails(\n params: RequestPermissionRequest,\n mode: PermissionMode,\n nonInteractivePolicy: NonInteractivePermissionPolicy = \"deny\",\n policy?: PermissionPolicy,\n): Promise<ResolvedPermissionRequest> {\n const options = params.options ?? [];\n if (options.length === 0) {\n return { response: cancelled() };\n }\n\n const allowOption = pickOption(options, [\"allow_once\", \"allow_always\"]);\n const rejectOption = pickOption(options, [\"reject_once\", \"reject_always\"]);\n const policyMatch = matchPermissionPolicy(params, policy);\n\n const resolvedByPolicy = await resolvePolicyMatch(\n params,\n policyMatch,\n options,\n allowOption,\n rejectOption,\n );\n if (resolvedByPolicy) {\n return resolvedByPolicy;\n }\n\n const resolvedByMode = resolveModeMatch(options, mode, allowOption, rejectOption);\n if (resolvedByMode) {\n return resolvedByMode;\n }\n\n return resolveReadOrPromptPermission(params, nonInteractivePolicy, allowOption, rejectOption);\n}\n\nconst DECISION_FALLBACK_ORDER: Record<\n Exclude<AcpPermissionDecision[\"outcome\"], \"cancel\">,\n PermissionOption[\"kind\"][]\n> = {\n allow_once: [\"allow_once\", \"allow_always\"],\n allow_always: [\"allow_always\", \"allow_once\"],\n reject_once: [\"reject_once\", \"reject_always\"],\n reject_always: [\"reject_always\", \"reject_once\"],\n};\n\nexport function decisionToResponse(\n params: RequestPermissionRequest,\n decision: AcpPermissionDecision,\n): RequestPermissionResponse {\n if (decision.outcome === \"cancel\") {\n return cancelled();\n }\n const matched = pickOption(params.options ?? [], DECISION_FALLBACK_ORDER[decision.outcome]);\n return matched ? selected(matched.optionId) : cancelled();\n}\n\nexport function classifyPermissionDecision(\n params: RequestPermissionRequest,\n response: RequestPermissionResponse,\n): PermissionDecision {\n if (response.outcome.outcome !== \"selected\") {\n return \"cancelled\";\n }\n\n const selectedOptionId = response.outcome.optionId;\n const selectedOption = params.options.find((option) => option.optionId === selectedOptionId);\n\n if (!selectedOption) {\n return \"cancelled\";\n }\n\n if (selectedOption.kind === \"allow_once\" || selectedOption.kind === \"allow_always\") {\n return \"approved\";\n }\n\n return \"denied\";\n}\n","import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport function readWindowsEnvValue(env: NodeJS.ProcessEnv, key: string): string | undefined {\n const matchedKey = Object.keys(env).find((entry) => entry.toUpperCase() === key);\n return matchedKey ? env[matchedKey] : undefined;\n}\n\nfunction windowsExecutableExtensions(env: NodeJS.ProcessEnv): string[] {\n return (readWindowsEnvValue(env, \"PATHEXT\") ?? \".COM;.EXE;.BAT;.CMD\")\n .split(\";\")\n .map((value) => value.trim().toLowerCase())\n .filter((value) => value.length > 0);\n}\n\nfunction commandCandidates(command: string, env: NodeJS.ProcessEnv): string[] {\n const commandExtension = path.extname(command);\n if (commandExtension.length > 0) {\n return [command];\n }\n return windowsExecutableExtensions(env).map((extension) => `${command}${extension}`);\n}\n\nfunction commandHasPath(command: string): boolean {\n return command.includes(\"/\") || command.includes(\"\\\\\") || path.isAbsolute(command);\n}\n\nfunction resolveWindowsPathCommand(command: string, env: NodeJS.ProcessEnv): string | undefined {\n const candidates = commandCandidates(command, env);\n const pathValue = readWindowsEnvValue(env, \"PATH\");\n if (!pathValue) {\n return undefined;\n }\n\n for (const directory of pathValue.split(\";\")) {\n const resolved = findExistingCommandInDirectory(directory, candidates);\n if (resolved) {\n return resolved;\n }\n }\n\n return undefined;\n}\n\nfunction findExistingCommandInDirectory(\n directory: string,\n candidates: string[],\n): string | undefined {\n const trimmedDirectory = directory.trim();\n if (trimmedDirectory.length === 0) {\n return undefined;\n }\n\n return candidates\n .map((candidate) => path.join(trimmedDirectory, candidate))\n .find((resolved) => fs.existsSync(resolved));\n}\n\nexport function resolveWindowsCommand(\n command: string,\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const candidates = commandCandidates(command, env);\n\n if (commandHasPath(command)) {\n return candidates.find((candidate) => fs.existsSync(candidate));\n }\n\n return resolveWindowsPathCommand(command, env);\n}\n\nfunction shouldUseWindowsBatchShell(\n command: string,\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n if (platform !== \"win32\") {\n return false;\n }\n const resolvedCommand = resolveWindowsCommand(command, env) ?? command;\n const ext = path.extname(resolvedCommand).toLowerCase();\n return ext === \".cmd\" || ext === \".bat\";\n}\n\nexport function buildSpawnCommandOptions(\n command: string,\n options: Parameters<typeof spawn>[2],\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n): Parameters<typeof spawn>[2] {\n if (!shouldUseWindowsBatchShell(command, platform, env)) {\n return options;\n }\n return {\n ...options,\n shell: true,\n };\n}\n\nexport type TerminalSpawnCommand = {\n command: string;\n args: string[];\n killProcessGroup: boolean;\n};\n\nexport function buildTerminalSpawnCommand(\n command: string,\n args: string[] | undefined,\n): TerminalSpawnCommand {\n return { command, args: args ?? [], killProcessGroup: false };\n}\n\nexport function buildTerminalShellSpawnCommand(\n command: string,\n platform: NodeJS.Platform = process.platform,\n): TerminalSpawnCommand {\n if (platform === \"win32\") {\n return { command: \"cmd.exe\", args: [\"/d\", \"/s\", \"/c\", command], killProcessGroup: true };\n }\n return { command: \"/bin/sh\", args: [\"-c\", command], killProcessGroup: true };\n}\n","import { execFile, type ChildProcess, type ChildProcessByStdio } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Readable, Writable } from \"node:stream\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport type CommandParts = {\n command: string;\n args: string[];\n};\n\ntype ResolveSessionCwdOptions = {\n platform?: NodeJS.Platform;\n existsSync?: (filePath: string) => boolean;\n runWslpath?: (cwd: string) => Promise<string>;\n};\n\nexport function isoNow(): string {\n return new Date().toISOString();\n}\n\nexport function waitForSpawn(child: ChildProcess): Promise<void> {\n return new Promise((resolve, reject) => {\n const onSpawn = () => {\n child.off(\"error\", onError);\n resolve();\n };\n const onError = (error: Error) => {\n child.off(\"spawn\", onSpawn);\n reject(error);\n };\n\n child.once(\"spawn\", onSpawn);\n child.once(\"error\", onError);\n });\n}\n\nexport function isChildProcessRunning(child: ChildProcess): boolean {\n return child.exitCode == null && child.signalCode == null;\n}\n\nexport function requireAgentStdio(\n child: ChildProcess,\n): ChildProcessByStdio<Writable, Readable, Readable> {\n if (!child.stdin || !child.stdout || !child.stderr) {\n throw new Error(\"ACP agent must be spawned with piped stdin/stdout/stderr\");\n }\n return child as ChildProcessByStdio<Writable, Readable, Readable>;\n}\n\nexport function waitForChildExit(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n timeoutMs: number,\n): Promise<boolean> {\n if (!isChildProcessRunning(child)) {\n return Promise.resolve(true);\n }\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const timer = setTimeout(\n () => {\n finish(false);\n },\n Math.max(0, timeoutMs),\n );\n\n const finish = (value: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n child.off(\"close\", onExitLike);\n child.off(\"exit\", onExitLike);\n clearTimeout(timer);\n resolve(value);\n };\n\n const onExitLike = () => {\n finish(true);\n };\n\n child.once(\"close\", onExitLike);\n child.once(\"exit\", onExitLike);\n });\n}\n\nexport function splitCommandLine(value: string): CommandParts {\n const parts: string[] = [];\n let current = \"\";\n let quote: \"'\" | '\"' | null = null;\n let escaping = false;\n\n for (const ch of value) {\n const next = readCommandLineChar({ ch, current, quote, escaping, parts });\n current = next.current;\n quote = next.quote;\n escaping = next.escaping;\n }\n\n if (escaping) {\n current += \"\\\\\";\n }\n\n if (quote) {\n throw new Error(\"Invalid --agent command: unterminated quote\");\n }\n\n if (current.length > 0) {\n parts.push(current);\n }\n\n if (parts.length === 0) {\n throw new Error(\"Invalid --agent command: empty command\");\n }\n\n return {\n command: parts[0],\n args: parts.slice(1),\n };\n}\n\nfunction readCommandLineChar(state: {\n ch: string;\n current: string;\n quote: \"'\" | '\"' | null;\n escaping: boolean;\n parts: string[];\n}): { current: string; quote: \"'\" | '\"' | null; escaping: boolean } {\n if (state.escaping) {\n return { current: state.current + state.ch, quote: state.quote, escaping: false };\n }\n if (state.ch === \"\\\\\" && state.quote !== \"'\") {\n return { current: state.current, quote: state.quote, escaping: true };\n }\n if (state.quote) {\n return readQuotedCommandLineChar({\n ch: state.ch,\n current: state.current,\n quote: state.quote,\n });\n }\n return readUnquotedCommandLineChar(state);\n}\n\nfunction readQuotedCommandLineChar(state: { ch: string; current: string; quote: \"'\" | '\"' }): {\n current: string;\n quote: \"'\" | '\"' | null;\n escaping: boolean;\n} {\n if (state.ch === state.quote) {\n return { current: state.current, quote: null, escaping: false };\n }\n return { current: state.current + state.ch, quote: state.quote, escaping: false };\n}\n\nfunction readUnquotedCommandLineChar(state: { ch: string; current: string; parts: string[] }): {\n current: string;\n quote: \"'\" | '\"' | null;\n escaping: boolean;\n} {\n if (state.ch === \"'\" || state.ch === '\"') {\n return { current: state.current, quote: state.ch, escaping: false };\n }\n if (/\\s/.test(state.ch)) {\n flushCommandLinePart(state.parts, state.current);\n return { current: \"\", quote: null, escaping: false };\n }\n return { current: state.current + state.ch, quote: null, escaping: false };\n}\n\nfunction flushCommandLinePart(parts: string[], current: string): void {\n if (current.length > 0) {\n parts.push(current);\n }\n}\n\nexport function asAbsoluteCwd(cwd: string): string {\n return path.resolve(cwd);\n}\n\nexport async function resolveAgentSessionCwd(\n cwd: string,\n agentCommand: string,\n options: ResolveSessionCwdOptions = {},\n): Promise<string> {\n const resolved = asAbsoluteCwd(cwd);\n if (!shouldTranslateWslWindowsCwd(agentCommand, options)) {\n return resolved;\n }\n\n const translated = (await (options.runWslpath ?? runWslpath)(resolved)).trim();\n if (!translated) {\n throw new Error(`wslpath returned an empty Windows path for cwd: ${resolved}`);\n }\n return translated;\n}\n\nfunction shouldTranslateWslWindowsCwd(\n agentCommand: string,\n options: ResolveSessionCwdOptions,\n): boolean {\n if (!isWsl(options)) {\n return false;\n }\n\n try {\n const { command } = splitCommandLine(agentCommand);\n return isWindowsExecutableCommand(command);\n } catch {\n return false;\n }\n}\n\nfunction isWsl(options: ResolveSessionCwdOptions): boolean {\n const platform = options.platform ?? process.platform;\n if (platform !== \"linux\") {\n return false;\n }\n\n const existsSync = options.existsSync ?? fs.existsSync;\n return existsSync(\"/proc/sys/fs/binfmt_misc/WSLInterop\");\n}\n\nconst WINDOWS_EXECUTABLE_EXTENSION_RE = /\\.(?:exe|cmd|bat)$/u;\n\nfunction isWindowsExecutableCommand(command: string): boolean {\n const normalized = command.toLowerCase();\n return WINDOWS_EXECUTABLE_EXTENSION_RE.test(normalized);\n}\n\nasync function runWslpath(cwd: string): Promise<string> {\n const { stdout } = await execFileAsync(\"wslpath\", [\"-w\", cwd], {\n encoding: \"utf8\",\n });\n return stdout;\n}\n\nexport function basenameToken(value: string): string {\n return path\n .basename(value)\n .toLowerCase()\n .replace(/\\.(cmd|exe|bat)$/u, \"\");\n}\n","import { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport { CopilotAcpUnsupportedError } from \"../errors.js\";\nimport {\n buildSpawnCommandOptions,\n readWindowsEnvValue,\n resolveWindowsCommand,\n} from \"../spawn-command-options.js\";\nimport { type AcpClientOptions } from \"../types.js\";\nimport { basenameToken, splitCommandLine } from \"./client-process.js\";\n\nconst DEFAULT_AGENT_CLOSE_AFTER_STDIN_END_MS = 100;\nconst QODER_AGENT_CLOSE_AFTER_STDIN_END_MS = 750;\nconst GEMINI_ACP_STARTUP_TIMEOUT_MS = 15_000;\nconst CLAUDE_ACP_SESSION_CREATE_TIMEOUT_MS = 60_000;\nconst GEMINI_VERSION_TIMEOUT_MS = 2_000;\nconst GEMINI_ACP_FLAG_VERSION = [0, 33, 0] as const;\nconst COPILOT_HELP_TIMEOUT_MS = 2_000;\n\ntype GeminiVersion = {\n raw: string;\n parts: [number, number, number];\n};\n\nconst QODER_BENIGN_STDOUT_LINES = new Set([\n \"Received interrupt signal. Cleaning up resources...\",\n \"Cleanup completed. Exiting...\",\n]);\n\nexport function resolveAgentCloseAfterStdinEndMs(agentCommand: string): number {\n const { command } = splitCommandLine(agentCommand);\n return basenameToken(command) === \"qodercli\"\n ? QODER_AGENT_CLOSE_AFTER_STDIN_END_MS\n : DEFAULT_AGENT_CLOSE_AFTER_STDIN_END_MS;\n}\n\nexport function shouldIgnoreNonJsonAgentOutputLine(\n agentCommand: string,\n trimmedLine: string,\n): boolean {\n const { command } = splitCommandLine(agentCommand);\n return basenameToken(command) === \"qodercli\" && QODER_BENIGN_STDOUT_LINES.has(trimmedLine);\n}\n\nexport function isGeminiAcpCommand(command: string, args: readonly string[]): boolean {\n return (\n basenameToken(command) === \"gemini\" &&\n (args.includes(\"--acp\") || args.includes(\"--experimental-acp\"))\n );\n}\n\nexport function isClaudeAcpCommand(command: string, args: readonly string[]): boolean {\n const commandToken = basenameToken(command);\n if (commandToken === \"claude-agent-acp\") {\n return true;\n }\n return args.some((arg) => arg.includes(\"claude-agent-acp\"));\n}\n\nexport function isCopilotAcpCommand(command: string, args: readonly string[]): boolean {\n return basenameToken(command) === \"copilot\" && args.includes(\"--acp\");\n}\n\nexport function isQoderAcpCommand(command: string, args: readonly string[]): boolean {\n return basenameToken(command) === \"qodercli\" && args.includes(\"--acp\");\n}\n\nfunction hasCommandFlag(args: readonly string[], flagName: string): boolean {\n return args.some((arg) => arg === flagName || arg.startsWith(`${flagName}=`));\n}\n\nfunction normalizeQoderAllowedToolName(tool: string): string {\n switch (tool.trim().toLowerCase()) {\n case \"bash\":\n case \"glob\":\n case \"grep\":\n case \"ls\":\n case \"read\":\n case \"write\":\n return tool.trim().toUpperCase();\n default:\n return tool.trim();\n }\n}\n\nexport function buildQoderAcpCommandArgs(\n initialArgs: readonly string[],\n options: Pick<AcpClientOptions, \"sessionOptions\">,\n): string[] {\n const args = [...initialArgs];\n const sessionOptions = options.sessionOptions;\n\n if (typeof sessionOptions?.maxTurns === \"number\" && !hasCommandFlag(args, \"--max-turns\")) {\n args.push(`--max-turns=${sessionOptions.maxTurns}`);\n }\n\n if (\n Array.isArray(sessionOptions?.allowedTools) &&\n !hasCommandFlag(args, \"--allowed-tools\") &&\n !hasCommandFlag(args, \"--disallowed-tools\")\n ) {\n const encodedTools = sessionOptions.allowedTools.map(normalizeQoderAllowedToolName).join(\",\");\n args.push(`--allowed-tools=${encodedTools}`);\n }\n\n return args;\n}\n\nexport function resolveGeminiAcpStartupTimeoutMs(): number {\n const raw = process.env.ACPX_GEMINI_ACP_STARTUP_TIMEOUT_MS;\n if (typeof raw === \"string\" && raw.trim().length > 0) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.round(parsed);\n }\n }\n return GEMINI_ACP_STARTUP_TIMEOUT_MS;\n}\n\nexport function resolveClaudeAcpSessionCreateTimeoutMs(): number {\n const raw = process.env.ACPX_CLAUDE_ACP_SESSION_CREATE_TIMEOUT_MS;\n if (typeof raw === \"string\" && raw.trim().length > 0) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.round(parsed);\n }\n }\n return CLAUDE_ACP_SESSION_CREATE_TIMEOUT_MS;\n}\n\nfunction parseGeminiVersion(value: string | undefined): GeminiVersion | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const normalized = value.trim();\n const match = normalized.match(/(\\d+)\\.(\\d+)\\.(\\d+)/);\n if (!match) {\n return undefined;\n }\n\n return {\n raw: normalized,\n parts: [Number(match[1]), Number(match[2]), Number(match[3])],\n };\n}\n\nfunction compareVersionParts(left: readonly number[], right: readonly number[]): number {\n for (let index = 0; index < Math.max(left.length, right.length); index += 1) {\n const leftPart = left[index] ?? 0;\n const rightPart = right[index] ?? 0;\n if (leftPart !== rightPart) {\n return leftPart - rightPart;\n }\n }\n return 0;\n}\n\nasync function detectGeminiVersion(command: string): Promise<GeminiVersion | undefined> {\n const output = await readCommandOutput(command, [\"--version\"], GEMINI_VERSION_TIMEOUT_MS);\n const versionLine = output\n ?.split(/\\r?\\n/)\n .map((line) => line.trim())\n .find((line) => /\\d+\\.\\d+\\.\\d+/.test(line));\n return parseGeminiVersion(versionLine);\n}\n\nexport async function resolveGeminiCommandArgs(\n command: string,\n args: readonly string[],\n): Promise<string[]> {\n if (basenameToken(command) !== \"gemini\" || !args.includes(\"--acp\")) {\n return [...args];\n }\n\n const version = await detectGeminiVersion(command);\n if (version && compareVersionParts(version.parts, GEMINI_ACP_FLAG_VERSION) < 0) {\n return args.map((arg) => (arg === \"--acp\" ? \"--experimental-acp\" : arg));\n }\n\n return [...args];\n}\n\nasync function readCommandOutput(\n command: string,\n args: readonly string[],\n timeoutMs: number,\n): Promise<string | undefined> {\n return await new Promise<string | undefined>((resolve) => {\n const child = spawn(\n command,\n [...args],\n buildSpawnCommandOptions(command, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n }),\n );\n\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n const finish = (value: string | undefined) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n child.removeAllListeners();\n child.stdout?.removeAllListeners();\n child.stderr?.removeAllListeners();\n resolve(value);\n };\n const timer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n finish(undefined);\n }, timeoutMs);\n\n child.stdout?.setEncoding(\"utf8\");\n child.stderr?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr?.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.once(\"error\", () => {\n finish(undefined);\n });\n child.once(\"close\", () => {\n finish(`${stdout}\\n${stderr}`);\n });\n });\n}\n\nexport async function buildGeminiAcpStartupTimeoutMessage(command: string): Promise<string> {\n const parts = [\n \"Gemini CLI ACP startup timed out before initialize completed.\",\n \"This usually means the local Gemini CLI is waiting on interactive OAuth or has incompatible ACP subprocess behavior.\",\n ];\n\n const version = await detectGeminiVersion(command);\n if (version) {\n parts.push(`Detected Gemini CLI version: ${version.raw}.`);\n }\n\n if (!process.env.GEMINI_API_KEY && !process.env.GOOGLE_API_KEY) {\n parts.push(\"No GEMINI_API_KEY or GOOGLE_API_KEY was set for non-interactive auth.\");\n }\n\n parts.push(\"Try upgrading Gemini CLI and using API-key-based auth for non-interactive ACP runs.\");\n return parts.join(\" \");\n}\n\nexport function buildClaudeAcpSessionCreateTimeoutMessage(): string {\n return [\n \"Claude ACP session creation timed out before session/new completed.\",\n \"This matches the known persistent-session stall seen with some Claude Code and @agentclientprotocol/claude-agent-acp combinations.\",\n \"In harnessed or non-interactive runs, prefer --approve-all with nonInteractivePermissions=deny, upgrade Claude Code and the Claude ACP adapter, or use acpx claude exec as a one-shot fallback.\",\n ].join(\" \");\n}\n\nasync function buildCopilotAcpUnsupportedMessage(command: string): Promise<string> {\n const parts = [\n \"GitHub Copilot CLI ACP stdio mode is not available in the installed copilot binary.\",\n \"acpx copilot expects a Copilot CLI release that supports --acp --stdio.\",\n ];\n\n const helpOutput = await readCommandOutput(command, [\"--help\"], COPILOT_HELP_TIMEOUT_MS);\n if (typeof helpOutput === \"string\" && !helpOutput.includes(\"--acp\")) {\n parts.push(\"Detected copilot --help output without --acp support.\");\n }\n\n parts.push(\n \"Upgrade GitHub Copilot CLI to a release with ACP stdio support, or use --agent with another ACP-compatible adapter in the meantime.\",\n );\n return parts.join(\" \");\n}\n\nexport async function ensureCopilotAcpSupport(command: string): Promise<void> {\n const helpOutput = await readCommandOutput(command, [\"--help\"], COPILOT_HELP_TIMEOUT_MS);\n if (typeof helpOutput === \"string\" && !helpOutput.includes(\"--acp\")) {\n throw new CopilotAcpUnsupportedError(await buildCopilotAcpUnsupportedMessage(command), {\n retryable: false,\n });\n }\n}\n\nexport function buildClaudeCodeOptionsMeta(\n options: AcpClientOptions[\"sessionOptions\"],\n): Record<string, unknown> | undefined {\n if (!options) {\n return undefined;\n }\n\n const claudeCodeOptions: Record<string, unknown> = {};\n assignClaudeCodeOptions(claudeCodeOptions, options);\n\n const meta: Record<string, unknown> = {};\n if (Object.keys(claudeCodeOptions).length > 0) {\n meta.claudeCode = { options: claudeCodeOptions };\n }\n\n assignClaudeCodeSystemPrompt(meta, options.systemPrompt);\n\n if (Object.keys(meta).length === 0) {\n return undefined;\n }\n\n return meta;\n}\n\nfunction assignClaudeCodeOptions(\n target: Record<string, unknown>,\n options: NonNullable<AcpClientOptions[\"sessionOptions\"]>,\n): void {\n if (typeof options.model === \"string\" && options.model.trim().length > 0) {\n target.model = options.model;\n }\n if (Array.isArray(options.allowedTools)) {\n target.allowedTools = [...options.allowedTools];\n }\n if (typeof options.maxTurns === \"number\") {\n target.maxTurns = options.maxTurns;\n }\n}\n\nfunction assignClaudeCodeSystemPrompt(\n target: Record<string, unknown>,\n systemPrompt: NonNullable<AcpClientOptions[\"sessionOptions\"]>[\"systemPrompt\"],\n): void {\n if (typeof systemPrompt === \"string\" && systemPrompt.length > 0) {\n target.systemPrompt = systemPrompt;\n return;\n }\n if (isAppendSystemPrompt(systemPrompt)) {\n target.systemPrompt = { append: systemPrompt.append };\n }\n}\n\nfunction isAppendSystemPrompt(\n value: NonNullable<AcpClientOptions[\"sessionOptions\"]>[\"systemPrompt\"],\n): value is { append: string } {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof value.append === \"string\" &&\n value.append.length > 0\n );\n}\n\nexport function resolveClaudeCodeExecutable(\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n if (platform !== \"win32\") {\n return undefined;\n }\n if (readWindowsEnvValue(env, \"CLAUDE_CODE_EXECUTABLE\")) {\n return undefined;\n }\n const resolved = resolveWindowsCommand(\"claude\", env);\n if (!resolved) {\n return undefined;\n }\n return path.resolve(resolved);\n}\n","import type { AcpClientOptions } from \"../types.js\";\n\nconst AUTH_ENV_PREFIX = \"ACPX_AUTH_\";\n\nfunction toEnvToken(value: string): string {\n return value\n .trim()\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toUpperCase();\n}\n\nfunction buildAuthEnvKey(methodId: string): string | undefined {\n const token = toEnvToken(methodId);\n return token.length > 0 ? `${AUTH_ENV_PREFIX}${token}` : undefined;\n}\n\nconst authEnvKeyCache = new Map<string, string | undefined>();\n\nfunction authEnvKey(methodId: string): string | undefined {\n const cached = authEnvKeyCache.get(methodId);\n if (cached !== undefined) {\n return cached;\n }\n const key = buildAuthEnvKey(methodId);\n authEnvKeyCache.set(methodId, key);\n return key;\n}\n\nexport function readEnvCredential(methodId: string): string | undefined {\n const key = authEnvKey(methodId);\n if (!key) {\n return undefined;\n }\n const value = process.env[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n return undefined;\n}\n\nfunction promotePrefixedAuthEnvironment(env: NodeJS.ProcessEnv): void {\n for (const [key, value] of Object.entries(env)) {\n if (!key.startsWith(AUTH_ENV_PREFIX)) {\n continue;\n }\n if (typeof value !== \"string\" || value.trim().length === 0) {\n continue;\n }\n\n const normalized = key.slice(AUTH_ENV_PREFIX.length);\n if (!normalized || env[normalized] != null) {\n continue;\n }\n\n env[normalized] = value;\n }\n}\n\nfunction buildAgentEnvironment(\n authCredentials: Record<string, string> | undefined,\n): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = { ...process.env };\n promotePrefixedAuthEnvironment(env);\n if (!authCredentials) {\n return env;\n }\n\n for (const [methodId, credential] of Object.entries(authCredentials)) {\n assignAuthCredentialEnv(env, methodId, credential);\n }\n\n return env;\n}\n\nfunction assignAuthCredentialEnv(\n env: NodeJS.ProcessEnv,\n methodId: string,\n credential: string,\n): void {\n if (typeof credential !== \"string\" || credential.trim().length === 0) {\n return;\n }\n\n if (!methodId.includes(\"=\") && !methodId.includes(\"\\u0000\") && env[methodId] == null) {\n env[methodId] = credential;\n }\n\n const normalized = toEnvToken(methodId);\n if (normalized) {\n assignIfMissing(env, `${AUTH_ENV_PREFIX}${normalized}`, credential);\n assignIfMissing(env, normalized, credential);\n }\n}\n\nfunction assignIfMissing(env: NodeJS.ProcessEnv, key: string, value: string): void {\n if (env[key] == null) {\n env[key] = value;\n }\n}\n\nexport function resolveConfiguredAuthCredential(\n methodId: string,\n authCredentials: AcpClientOptions[\"authCredentials\"],\n): string | undefined {\n const configCredentials = authCredentials ?? {};\n return configCredentials[methodId] ?? configCredentials[toEnvToken(methodId)];\n}\n\nexport function buildAgentSpawnOptions(\n cwd: string,\n authCredentials: Record<string, string> | undefined,\n): {\n cwd: string;\n env: NodeJS.ProcessEnv;\n stdio: [\"pipe\", \"pipe\", \"pipe\"];\n windowsHide: true;\n} {\n return {\n cwd,\n env: buildAgentEnvironment(authCredentials),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n windowsHide: true,\n };\n}\n","import { extractAcpError } from \"./error-shapes.js\";\n\nconst SESSION_CONTROL_UNSUPPORTED_ACP_CODES = new Set([-32601, -32602]);\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction isLikelySessionControlUnsupportedError(acp: {\n code: number;\n message: string;\n data?: unknown;\n}): boolean {\n if (SESSION_CONTROL_UNSUPPORTED_ACP_CODES.has(acp.code)) {\n return true;\n }\n\n if (acp.code !== -32603) {\n return false;\n }\n\n const details = asRecord(acp.data)?.details;\n return typeof details === \"string\" && details.toLowerCase().includes(\"invalid params\");\n}\n\nexport function formatSessionControlAcpSummary(acp: {\n code: number;\n message: string;\n data?: unknown;\n}): string {\n const details = asRecord(acp.data)?.details;\n if (typeof details === \"string\" && details.trim().length > 0) {\n return `${details.trim()} (ACP ${acp.code}, adapter reported \"${acp.message}\")`;\n }\n return `${acp.message} (ACP ${acp.code})`;\n}\n\nexport function maybeWrapSessionControlError(\n method: \"session/set_mode\" | \"session/set_config_option\" | \"session/set_model\",\n error: unknown,\n context?: string,\n): unknown {\n const acp = extractAcpError(error);\n if (!acp || !isLikelySessionControlUnsupportedError(acp)) {\n return error;\n }\n\n const acpSummary = formatSessionControlAcpSummary(acp);\n const contextSuffix = context ? ` ${context}` : \"\";\n const message =\n `Agent rejected ${method}${contextSuffix}: ${acpSummary}. ` +\n `The adapter may not implement ${method}, or the requested value is not supported.`;\n const wrapped = new Error(message, {\n cause: error instanceof Error ? error : undefined,\n }) as Error & {\n acp?: typeof acp;\n };\n wrapped.acp = acp;\n return wrapped;\n}\n","import { spawn, type ChildProcessByStdio } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport type {\n CreateTerminalRequest,\n CreateTerminalResponse,\n KillTerminalRequest,\n KillTerminalResponse,\n ReleaseTerminalRequest,\n ReleaseTerminalResponse,\n TerminalOutputRequest,\n TerminalOutputResponse,\n WaitForTerminalExitRequest,\n WaitForTerminalExitResponse,\n} from \"@agentclientprotocol/sdk\";\nimport { PermissionDeniedError, PermissionPromptUnavailableError } from \"../errors.js\";\nimport { promptForPermission } from \"../permission-prompt.js\";\nimport {\n buildSpawnCommandOptions,\n buildTerminalShellSpawnCommand,\n buildTerminalSpawnCommand,\n type TerminalSpawnCommand,\n} from \"../spawn-command-options.js\";\nimport type { ClientOperation, NonInteractivePermissionPolicy, PermissionMode } from \"../types.js\";\n\nconst DEFAULT_TERMINAL_OUTPUT_LIMIT_BYTES = 64 * 1024;\nconst DEFAULT_KILL_GRACE_MS = 1_500;\n\ntype ManagedTerminal = {\n process: ChildProcessByStdio<null, Readable, Readable>;\n killProcessGroup: boolean;\n descendantPids: Set<number>;\n processGroupSnapshotPromise?: Promise<void>;\n output: Buffer;\n truncated: boolean;\n outputByteLimit: number;\n exitCode: number | null | undefined;\n signal: NodeJS.Signals | null | undefined;\n exitPromise: Promise<WaitForTerminalExitResponse>;\n resolveExit: (response: WaitForTerminalExitResponse) => void;\n};\n\nexport type TerminalManagerOptions = {\n cwd: string;\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n onOperation?: (operation: ClientOperation) => void;\n confirmExecute?: (commandLine: string) => Promise<boolean>;\n killGraceMs?: number;\n};\n\ntype TerminalSpawnOptions = {\n cwd: string;\n env: NodeJS.ProcessEnv | undefined;\n stdio: [\"ignore\", \"pipe\", \"pipe\"];\n detached?: boolean;\n shell?: true;\n windowsHide: true;\n};\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction toCommandLine(command: string, args: string[] | undefined): string {\n const renderedArgs = (args ?? []).map((arg) => JSON.stringify(arg)).join(\" \");\n return renderedArgs.length > 0 ? `${command} ${renderedArgs}` : command;\n}\n\nfunction toEnvObject(env: CreateTerminalRequest[\"env\"]): NodeJS.ProcessEnv | undefined {\n if (!env || env.length === 0) {\n return undefined;\n }\n\n const merged: NodeJS.ProcessEnv = { ...process.env };\n for (const entry of env) {\n merged[entry.name] = entry.value;\n }\n return merged;\n}\n\nexport function buildTerminalSpawnOptions(\n command: string,\n cwd: string,\n env: CreateTerminalRequest[\"env\"],\n platform: NodeJS.Platform = process.platform,\n): TerminalSpawnOptions {\n const resolvedEnv = toEnvObject(env);\n const options: TerminalSpawnOptions = {\n cwd,\n env: resolvedEnv,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n };\n return buildSpawnCommandOptions(\n command,\n options,\n platform,\n resolvedEnv ?? process.env,\n ) as TerminalSpawnOptions;\n}\n\nfunction trimToUtf8Boundary(buffer: Buffer, limit: number): Buffer {\n if (limit <= 0) {\n return Buffer.alloc(0);\n }\n if (buffer.length <= limit) {\n return buffer;\n }\n\n let start = buffer.length - limit;\n while (start < buffer.length && (buffer[start] & 0b1100_0000) === 0b1000_0000) {\n start += 1;\n }\n\n if (start >= buffer.length) {\n start = buffer.length - limit;\n }\n return buffer.subarray(start);\n}\n\nfunction waitForSpawn(process: ChildProcessByStdio<null, Readable, Readable>): Promise<void> {\n return new Promise((resolve, reject) => {\n const onSpawn = () => {\n process.off(\"error\", onError);\n resolve();\n };\n const onError = (error: Error) => {\n process.off(\"spawn\", onSpawn);\n reject(error);\n };\n\n process.once(\"spawn\", onSpawn);\n process.once(\"error\", onError);\n });\n}\n\nasync function defaultConfirmExecute(commandLine: string): Promise<boolean> {\n return await promptForPermission({\n prompt: `\\n[permission] Allow terminal command \"${commandLine}\"? (y/N) `,\n });\n}\n\nfunction canPromptForPermission(): boolean {\n return process.stdin.isTTY && process.stderr.isTTY;\n}\n\nfunction waitMs(ms: number): Promise<void> {\n return new Promise<void>((resolve) => {\n setTimeout(resolve, Math.max(0, ms));\n });\n}\n\nexport class TerminalManager {\n private readonly cwd: string;\n private permissionMode: PermissionMode;\n private nonInteractivePermissions: NonInteractivePermissionPolicy;\n private readonly onOperation?: (operation: ClientOperation) => void;\n private readonly usesDefaultConfirmExecute: boolean;\n private readonly confirmExecute: (commandLine: string) => Promise<boolean>;\n private readonly killGraceMs: number;\n private readonly terminals = new Map<string, ManagedTerminal>();\n\n constructor(options: TerminalManagerOptions) {\n this.cwd = options.cwd;\n this.permissionMode = options.permissionMode;\n this.nonInteractivePermissions = options.nonInteractivePermissions ?? \"deny\";\n this.onOperation = options.onOperation;\n this.usesDefaultConfirmExecute = options.confirmExecute == null;\n this.confirmExecute = options.confirmExecute ?? defaultConfirmExecute;\n this.killGraceMs = Math.max(0, Math.round(options.killGraceMs ?? DEFAULT_KILL_GRACE_MS));\n }\n\n updatePermissionPolicy(\n permissionMode: PermissionMode,\n nonInteractivePermissions?: NonInteractivePermissionPolicy,\n ): void {\n this.permissionMode = permissionMode;\n this.nonInteractivePermissions = nonInteractivePermissions ?? \"deny\";\n }\n\n async createTerminal(params: CreateTerminalRequest): Promise<CreateTerminalResponse> {\n const commandLine = toCommandLine(params.command, params.args);\n const summary = `terminal/create: ${commandLine}`;\n\n this.emitOperation({\n method: \"terminal/create\",\n status: \"running\",\n summary,\n timestamp: nowIso(),\n });\n\n try {\n if (!(await this.isExecuteApproved(commandLine))) {\n throw new PermissionDeniedError(\"Permission denied for terminal/create\");\n }\n\n const outputByteLimit = Math.max(\n 0,\n Math.round(params.outputByteLimit ?? DEFAULT_TERMINAL_OUTPUT_LIMIT_BYTES),\n );\n const { proc, spawnCommand } = await spawnTerminalProcess(params, this.cwd);\n\n let resolveExit: (response: WaitForTerminalExitResponse) => void = () => {};\n const exitPromise = new Promise<WaitForTerminalExitResponse>((resolve) => {\n resolveExit = resolve;\n });\n\n const terminal: ManagedTerminal = {\n process: proc,\n killProcessGroup: spawnCommand.killProcessGroup,\n descendantPids: new Set(),\n output: Buffer.alloc(0),\n truncated: false,\n outputByteLimit,\n exitCode: undefined,\n signal: undefined,\n exitPromise,\n resolveExit,\n };\n\n const appendOutput = (chunk: Buffer | string): void => {\n const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n if (bytes.length === 0) {\n return;\n }\n\n terminal.output = Buffer.concat([terminal.output, bytes]);\n if (terminal.output.length > terminal.outputByteLimit) {\n terminal.output = trimToUtf8Boundary(terminal.output, terminal.outputByteLimit);\n terminal.truncated = true;\n }\n };\n\n proc.stdout.on(\"data\", appendOutput);\n proc.stderr.on(\"data\", appendOutput);\n proc.once(\"exit\", (exitCode, signal) => {\n terminal.exitCode = exitCode;\n terminal.signal = signal;\n terminal.processGroupSnapshotPromise = rememberProcessGroupPids(terminal);\n void (async () => {\n await terminal.processGroupSnapshotPromise;\n terminal.resolveExit({\n exitCode: exitCode ?? null,\n signal: signal ?? null,\n });\n })();\n });\n\n const terminalId = randomUUID();\n this.terminals.set(terminalId, terminal);\n\n this.emitOperation({\n method: \"terminal/create\",\n status: \"completed\",\n summary,\n details: `terminalId=${terminalId}`,\n timestamp: nowIso(),\n });\n return { terminalId };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emitOperation({\n method: \"terminal/create\",\n status: \"failed\",\n summary,\n details: message,\n timestamp: nowIso(),\n });\n throw error;\n }\n }\n\n async terminalOutput(params: TerminalOutputRequest): Promise<TerminalOutputResponse> {\n const terminal = this.getTerminal(params.terminalId);\n if (!terminal) {\n throw new Error(`Unknown terminal: ${params.terminalId}`);\n }\n\n const hasExitStatus = terminal.exitCode !== undefined || terminal.signal !== undefined;\n\n this.emitOperation({\n method: \"terminal/output\",\n status: \"completed\",\n summary: `terminal/output: ${params.terminalId}`,\n timestamp: nowIso(),\n });\n\n return {\n output: terminal.output.toString(\"utf8\"),\n truncated: terminal.truncated,\n exitStatus: hasExitStatus\n ? {\n exitCode: terminal.exitCode ?? null,\n signal: terminal.signal ?? null,\n }\n : undefined,\n };\n }\n\n async waitForTerminalExit(\n params: WaitForTerminalExitRequest,\n ): Promise<WaitForTerminalExitResponse> {\n const terminal = this.getTerminal(params.terminalId);\n if (!terminal) {\n throw new Error(`Unknown terminal: ${params.terminalId}`);\n }\n\n const response = await terminal.exitPromise;\n this.emitOperation({\n method: \"terminal/wait_for_exit\",\n status: \"completed\",\n summary: `terminal/wait_for_exit: ${params.terminalId}`,\n details: `exitCode=${response.exitCode ?? \"null\"}, signal=${response.signal ?? \"null\"}`,\n timestamp: nowIso(),\n });\n return response;\n }\n\n async killTerminal(params: KillTerminalRequest): Promise<KillTerminalResponse> {\n const terminal = this.getTerminal(params.terminalId);\n if (!terminal) {\n throw new Error(`Unknown terminal: ${params.terminalId}`);\n }\n\n const summary = `terminal/kill: ${params.terminalId}`;\n this.emitOperation({\n method: \"terminal/kill\",\n status: \"running\",\n summary,\n timestamp: nowIso(),\n });\n\n try {\n await this.killProcess(terminal);\n this.emitOperation({\n method: \"terminal/kill\",\n status: \"completed\",\n summary,\n timestamp: nowIso(),\n });\n return {};\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emitOperation({\n method: \"terminal/kill\",\n status: \"failed\",\n summary,\n details: message,\n timestamp: nowIso(),\n });\n throw error;\n }\n }\n\n async releaseTerminal(params: ReleaseTerminalRequest): Promise<ReleaseTerminalResponse> {\n const summary = `terminal/release: ${params.terminalId}`;\n this.emitOperation({\n method: \"terminal/release\",\n status: \"running\",\n summary,\n timestamp: nowIso(),\n });\n\n const terminal = this.getTerminal(params.terminalId);\n if (!terminal) {\n this.emitOperation({\n method: \"terminal/release\",\n status: \"completed\",\n summary,\n details: \"already released\",\n timestamp: nowIso(),\n });\n return {};\n }\n\n try {\n await this.killProcess(terminal);\n await terminal.exitPromise.catch(() => {\n // ignore best-effort wait failures\n });\n terminal.output = Buffer.alloc(0);\n this.terminals.delete(params.terminalId);\n\n this.emitOperation({\n method: \"terminal/release\",\n status: \"completed\",\n summary,\n timestamp: nowIso(),\n });\n return {};\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emitOperation({\n method: \"terminal/release\",\n status: \"failed\",\n summary,\n details: message,\n timestamp: nowIso(),\n });\n throw error;\n }\n }\n\n async shutdown(): Promise<void> {\n for (const terminalId of Array.from(this.terminals.keys())) {\n await this.releaseTerminal({ terminalId, sessionId: \"shutdown\" });\n }\n }\n\n private getTerminal(terminalId: string): ManagedTerminal | undefined {\n return this.terminals.get(terminalId);\n }\n\n private emitOperation(operation: ClientOperation): void {\n this.onOperation?.(operation);\n }\n\n private async isExecuteApproved(commandLine: string): Promise<boolean> {\n if (this.permissionMode === \"approve-all\") {\n return true;\n }\n if (this.permissionMode === \"deny-all\") {\n return false;\n }\n if (\n this.usesDefaultConfirmExecute &&\n this.nonInteractivePermissions === \"fail\" &&\n !canPromptForPermission()\n ) {\n throw new PermissionPromptUnavailableError();\n }\n return await this.confirmExecute(commandLine);\n }\n\n private isRunning(terminal: ManagedTerminal): boolean {\n return terminal.exitCode === undefined && terminal.signal === undefined;\n }\n\n private async killProcess(terminal: ManagedTerminal): Promise<void> {\n if (!this.isRunning(terminal) && !terminal.killProcessGroup) {\n return;\n }\n\n try {\n await this.signalProcess(terminal, \"SIGTERM\");\n } catch {\n return;\n }\n\n const exitedAfterTerm = await this.waitForCleanupAfterSignal(terminal);\n if (exitedAfterTerm && !terminal.killProcessGroup) {\n return;\n }\n\n try {\n await this.signalProcess(terminal, \"SIGKILL\");\n } catch {\n return;\n }\n\n await this.waitForCleanupAfterSignal(terminal);\n }\n\n private async signalProcess(terminal: ManagedTerminal, signal: NodeJS.Signals): Promise<void> {\n const pid = terminal.process.pid;\n if (terminal.killProcessGroup && pid && process.platform === \"win32\") {\n await this.signalWindowsProcessGroup(terminal, pid, signal);\n return;\n }\n if (terminal.killProcessGroup && pid) {\n await this.signalPosixProcessGroup(terminal, pid, signal);\n return;\n }\n terminal.process.kill(signal);\n }\n\n private async signalWindowsProcessGroup(\n terminal: ManagedTerminal,\n pid: number,\n signal: NodeJS.Signals,\n ): Promise<void> {\n await this.captureDescendantPids(terminal, pid);\n if (this.isRunning(terminal)) {\n await killWindowsProcessTree(pid, signal);\n return;\n }\n for (const descendantPid of terminal.descendantPids) {\n await killWindowsProcessTree(descendantPid, signal);\n }\n }\n\n private async signalPosixProcessGroup(\n terminal: ManagedTerminal,\n pid: number,\n signal: NodeJS.Signals,\n ): Promise<void> {\n await this.captureDescendantPids(terminal, pid);\n if (hasLiveProcessGroup(pid)) {\n sendSignal(-pid, signal);\n return;\n }\n for (const descendantPid of terminal.descendantPids) {\n sendSignal(descendantPid, signal);\n }\n }\n\n private async captureDescendantPids(terminal: ManagedTerminal, pid: number): Promise<void> {\n if (!this.isRunning(terminal)) {\n await terminal.processGroupSnapshotPromise?.catch(() => {\n // ignore best-effort process group snapshot failures\n });\n }\n for (const descendantPid of await listDescendantPids(pid)) {\n terminal.descendantPids.add(descendantPid);\n }\n }\n\n private async waitForCleanupAfterSignal(terminal: ManagedTerminal): Promise<boolean> {\n return await Promise.race([\n this.waitForTerminalAndTrackedDescendants(terminal).then(() => true),\n waitMs(this.killGraceMs).then(() => false),\n ]);\n }\n\n private async waitForTerminalAndTrackedDescendants(terminal: ManagedTerminal): Promise<void> {\n await terminal.exitPromise;\n while (hasLiveTerminalProcessGroup(terminal)) {\n await waitMs(25);\n }\n while (hasLivePid(terminal.descendantPids)) {\n await waitMs(25);\n }\n }\n}\n\nasync function spawnTerminalProcess(\n params: CreateTerminalRequest,\n defaultCwd: string,\n): Promise<{\n proc: ChildProcessByStdio<null, Readable, Readable>;\n spawnCommand: TerminalSpawnCommand;\n}> {\n const directCommand = buildTerminalSpawnCommand(params.command, params.args);\n try {\n return {\n proc: await spawnAndWait(directCommand, params, defaultCwd),\n spawnCommand: directCommand,\n };\n } catch (error) {\n const fallbackCommand =\n params.args === undefined && isNotFoundSpawnError(error)\n ? buildTerminalFallbackSpawnCommand(params.command, params.cwd ?? defaultCwd)\n : undefined;\n if (!fallbackCommand) {\n throw error;\n }\n return {\n proc: await spawnAndWait(fallbackCommand, params, defaultCwd),\n spawnCommand: fallbackCommand,\n };\n }\n}\n\nasync function spawnAndWait(\n spawnCommand: TerminalSpawnCommand,\n params: CreateTerminalRequest,\n defaultCwd: string,\n): Promise<ChildProcessByStdio<null, Readable, Readable>> {\n const spawnOptions = buildTerminalSpawnOptions(\n spawnCommand.command,\n params.cwd ?? defaultCwd,\n params.env,\n );\n if (spawnCommand.killProcessGroup) {\n spawnOptions.detached = true;\n }\n const proc = spawn(spawnCommand.command, spawnCommand.args, spawnOptions);\n await waitForSpawn(proc);\n return proc;\n}\n\nfunction isNotFoundSpawnError(error: unknown): boolean {\n return error instanceof Error && (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nfunction buildTerminalFallbackSpawnCommand(\n command: string,\n cwd: string,\n platform: NodeJS.Platform = process.platform,\n): TerminalSpawnCommand | undefined {\n if (commandPathExists(command, cwd)) {\n return undefined;\n }\n\n if (platform === \"win32\") {\n return hasWindowsShellSyntax(command) || /\\s/u.test(command)\n ? buildTerminalShellSpawnCommand(command, platform)\n : undefined;\n }\n\n if (hasShellSyntax(command) || /\\s/u.test(command)) {\n return buildTerminalShellSpawnCommand(command, platform);\n }\n\n return undefined;\n}\n\nfunction hasShellSyntax(command: string): boolean {\n return /[|&;<>()>$`*?[\\]{}'\"\\\\\\r\\n]/u.test(command);\n}\n\nfunction hasWindowsShellSyntax(command: string): boolean {\n return /[|&;<>()>$`*?[\\]{}'\"\\r\\n]/u.test(command);\n}\n\nfunction commandPathExists(command: string, cwd: string): boolean {\n if (!/[\\\\/]/u.test(command)) {\n return false;\n }\n const resolvedPath = path.isAbsolute(command) ? command : path.resolve(cwd, command);\n return fs.existsSync(resolvedPath);\n}\n\nasync function listDescendantPids(rootPid: number): Promise<number[]> {\n let output: string;\n try {\n output = await runProcessListCommand();\n } catch {\n return [];\n }\n\n const childrenByParent = new Map<number, number[]>();\n for (const line of output.split(\"\\n\")) {\n addProcessListLine(childrenByParent, line);\n }\n\n const descendants: number[] = [];\n const queue = [...(childrenByParent.get(rootPid) ?? [])];\n for (let index = 0; index < queue.length; index += 1) {\n const pid = queue[index];\n descendants.push(pid);\n queue.push(...(childrenByParent.get(pid) ?? []));\n }\n return descendants;\n}\n\nfunction addProcessListLine(childrenByParent: Map<number, number[]>, line: string): void {\n const parsed = parseProcessListLine(line);\n if (!parsed) {\n return;\n }\n\n const children = childrenByParent.get(parsed.parentPid);\n if (children) {\n children.push(parsed.pid);\n } else {\n childrenByParent.set(parsed.parentPid, [parsed.pid]);\n }\n}\n\nfunction parseProcessListLine(line: string): { pid: number; parentPid: number } | undefined {\n const match = line.trim().match(/^(\\d+)\\s+(\\d+)$/);\n if (!match) {\n return undefined;\n }\n\n const pid = Number(match[1]);\n const parentPid = Number(match[2]);\n if (!Number.isInteger(pid) || !Number.isInteger(parentPid) || pid <= 0 || parentPid <= 0) {\n return undefined;\n }\n return { pid, parentPid };\n}\n\nasync function runProcessListCommand(): Promise<string> {\n if (process.platform === \"win32\") {\n return await runWindowsProcessListCommand();\n }\n\n return await new Promise<string>((resolve, reject) => {\n const child = spawn(\"ps\", [\"-eo\", \"pid=,ppid=\"], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n\n child.once(\"error\", reject);\n child.once(\"close\", (code, signal) => {\n if (code === 0) {\n resolve(stdout);\n return;\n }\n reject(\n new Error(`ps exited with code ${code ?? \"null\"} signal ${signal ?? \"null\"}: ${stderr}`),\n );\n });\n });\n}\n\nasync function rememberProcessGroupPids(terminal: ManagedTerminal): Promise<void> {\n const processGroupId = terminal.process.pid;\n if (!terminal.killProcessGroup || !processGroupId) {\n return;\n }\n\n if (process.platform === \"win32\") {\n for (const pid of await listDescendantPids(processGroupId)) {\n terminal.descendantPids.add(pid);\n }\n return;\n }\n\n for (const pid of await listProcessGroupPids(processGroupId)) {\n if (pid !== processGroupId) {\n terminal.descendantPids.add(pid);\n }\n }\n}\n\nasync function listProcessGroupPids(processGroupId: number): Promise<number[]> {\n let output: string;\n try {\n output = await runProcessGroupListCommand();\n } catch {\n return [];\n }\n\n const pids: number[] = [];\n for (const line of output.split(\"\\n\")) {\n const match = line.trim().match(/^(\\d+)\\s+(\\d+)$/);\n if (!match) {\n continue;\n }\n\n const pid = Number(match[1]);\n const pgid = Number(match[2]);\n if (Number.isInteger(pid) && Number.isInteger(pgid) && pid > 0 && pgid === processGroupId) {\n pids.push(pid);\n }\n }\n return pids;\n}\n\nasync function runProcessGroupListCommand(): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const child = spawn(\"ps\", [\"-eo\", \"pid=,pgid=\"], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n\n child.once(\"error\", reject);\n child.once(\"close\", (code, signal) => {\n if (code === 0) {\n resolve(stdout);\n return;\n }\n reject(\n new Error(`ps exited with code ${code ?? \"null\"} signal ${signal ?? \"null\"}: ${stderr}`),\n );\n });\n });\n}\n\nasync function runWindowsProcessListCommand(): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const command = [\n \"Get-CimInstance Win32_Process |\",\n 'ForEach-Object { \"$($_.ProcessId) $($_.ParentProcessId)\" }',\n ].join(\" \");\n const child = spawn(\"powershell.exe\", [\"-NoProfile\", \"-NonInteractive\", \"-Command\", command], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n\n child.once(\"error\", reject);\n child.once(\"close\", (code, signal) => {\n if (code === 0) {\n resolve(stdout);\n return;\n }\n reject(\n new Error(\n `powershell process list exited with code ${code ?? \"null\"} signal ${\n signal ?? \"null\"\n }: ${stderr}`,\n ),\n );\n });\n });\n}\n\nasync function killWindowsProcessTree(pid: number, signal: NodeJS.Signals): Promise<void> {\n const args = [\"/pid\", String(pid), \"/t\"];\n if (signal === \"SIGKILL\") {\n args.push(\"/f\");\n }\n await new Promise<void>((resolve) => {\n const child = spawn(\"taskkill\", args, {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n windowsHide: true,\n });\n child.once(\"error\", () => resolve());\n child.once(\"close\", () => resolve());\n });\n}\n\nfunction sendSignal(pid: number, signal: NodeJS.Signals): void {\n try {\n process.kill(pid, signal);\n } catch {\n // Process tree cleanup is best-effort because descendants can exit between ps and kill.\n }\n}\n\nfunction hasLiveProcessGroup(processGroupId: number): boolean {\n try {\n process.kill(-processGroupId, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction hasLiveTerminalProcessGroup(terminal: ManagedTerminal): boolean {\n const pid = terminal.process.pid;\n return Boolean(\n terminal.killProcessGroup && pid && process.platform !== \"win32\" && hasLiveProcessGroup(pid),\n );\n}\n\nfunction hasLivePid(pids: Set<number>): boolean {\n for (const pid of pids) {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n pids.delete(pid);\n }\n }\n return false;\n}\n","import { spawn, type ChildProcess, type ChildProcessByStdio } from \"node:child_process\";\nimport { Readable, Writable } from \"node:stream\";\nimport {\n ClientSideConnection,\n PROTOCOL_VERSION,\n type AnyMessage,\n type AuthMethod,\n type CreateTerminalRequest,\n type CreateTerminalResponse,\n type InitializeResponse,\n type ListSessionsRequest,\n type ListSessionsResponse,\n type KillTerminalRequest,\n type KillTerminalResponse,\n type LoadSessionResponse,\n type PromptResponse,\n type ReadTextFileRequest,\n type ReadTextFileResponse,\n type ReleaseTerminalRequest,\n type ReleaseTerminalResponse,\n type ResumeSessionResponse,\n type RequestPermissionRequest,\n type RequestPermissionResponse,\n type SessionNotification,\n type SetSessionConfigOptionResponse,\n type TerminalOutputRequest,\n type TerminalOutputResponse,\n type WaitForTerminalExitRequest,\n type WaitForTerminalExitResponse,\n type WriteTextFileRequest,\n type WriteTextFileResponse,\n type SessionConfigOption,\n type SessionModelState,\n} from \"@agentclientprotocol/sdk\";\nimport { resolveBuiltInAgentLaunch } from \"../agent-registry.js\";\nimport { TimeoutError, withTimeout } from \"../async-control.js\";\nimport {\n AgentDisconnectedError,\n AgentSpawnError,\n AgentStartupError,\n AuthPolicyError,\n ClaudeAcpSessionCreateTimeoutError,\n GeminiAcpStartupTimeoutError,\n PermissionDeniedError,\n PermissionPromptUnavailableError,\n UnsupportedPromptContentError,\n} from \"../errors.js\";\nimport { FileSystemHandlers } from \"../filesystem.js\";\nimport {\n classifyPermissionDecision,\n decisionToResponse,\n inferToolKind,\n resolvePermissionRequestWithDetails,\n} from \"../permissions.js\";\nimport { getUnsupportedPromptContentMessage, textPrompt } from \"../prompt-content.js\";\nimport { extractRuntimeSessionId } from \"../session/runtime-session-id.js\";\nimport { buildSpawnCommandOptions } from \"../spawn-command-options.js\";\nimport type {\n AcpClientOptions,\n NonInteractivePermissionPolicy,\n PermissionMode,\n PermissionStats,\n PromptInput,\n} from \"../types.js\";\nimport {\n buildClaudeAcpSessionCreateTimeoutMessage,\n buildClaudeCodeOptionsMeta,\n buildGeminiAcpStartupTimeoutMessage,\n buildQoderAcpCommandArgs,\n ensureCopilotAcpSupport,\n isClaudeAcpCommand,\n isCopilotAcpCommand,\n isGeminiAcpCommand,\n isQoderAcpCommand,\n resolveAgentCloseAfterStdinEndMs,\n resolveClaudeAcpSessionCreateTimeoutMs,\n resolveClaudeCodeExecutable,\n resolveGeminiAcpStartupTimeoutMs,\n resolveGeminiCommandArgs,\n shouldIgnoreNonJsonAgentOutputLine,\n} from \"./agent-command.js\";\nimport {\n buildAgentSpawnOptions,\n readEnvCredential,\n resolveConfiguredAuthCredential,\n} from \"./auth-env.js\";\nimport {\n asAbsoluteCwd,\n isoNow,\n isChildProcessRunning,\n requireAgentStdio,\n resolveAgentSessionCwd,\n splitCommandLine,\n waitForChildExit,\n waitForSpawn,\n} from \"./client-process.js\";\nimport { extractAcpError } from \"./error-shapes.js\";\nimport { isSessionUpdateNotification } from \"./jsonrpc.js\";\nimport {\n formatSessionControlAcpSummary,\n maybeWrapSessionControlError,\n} from \"./session-control-errors.js\";\nimport { TerminalManager } from \"./terminal-manager.js\";\n\nexport { buildSpawnCommandOptions };\nexport {\n buildAgentSpawnOptions,\n buildQoderAcpCommandArgs,\n resolveAgentCloseAfterStdinEndMs,\n shouldIgnoreNonJsonAgentOutputLine,\n};\n\nconst REPLAY_IDLE_MS = 80;\nconst REPLAY_DRAIN_TIMEOUT_MS = 5_000;\nconst DRAIN_POLL_INTERVAL_MS = 20;\nconst AGENT_CLOSE_TERM_GRACE_MS = 1_500;\nconst AGENT_CLOSE_KILL_GRACE_MS = 1_000;\nconst STARTUP_STDERR_MAX_CHARS = 8_192;\n\ntype LoadSessionOptions = {\n suppressReplayUpdates?: boolean;\n replayIdleMs?: number;\n replayDrainTimeoutMs?: number;\n};\n\nexport type SessionCreateResult = {\n sessionId: string;\n agentSessionId?: string;\n configOptions?: SessionConfigOption[];\n models?: SessionModelState;\n};\n\nexport type SessionLoadResult = {\n agentSessionId?: string;\n configOptions?: SessionConfigOption[];\n models?: SessionModelState;\n};\n\nexport type SessionResumeResult = SessionLoadResult;\n\ntype ReconnectedSessionResponse = LoadSessionResponse | ResumeSessionResponse;\n\nfunction toReconnectedSessionResult(\n response: ReconnectedSessionResponse | undefined,\n): SessionLoadResult {\n return {\n agentSessionId: extractRuntimeSessionId(response?._meta),\n configOptions: response?.configOptions ?? undefined,\n models: response?.models ?? undefined,\n };\n}\n\ntype AgentDisconnectReason = \"process_exit\" | \"process_close\" | \"pipe_close\" | \"connection_close\";\n\ntype PendingConnectionRequest = {\n settled: boolean;\n reject: (error: unknown) => void;\n};\n\ntype AuthSelection = {\n methodId: string;\n credential: string;\n source: \"env\" | \"config\";\n};\n\ntype AgentLaunchPlan = {\n spawnCommand: string;\n args: string[];\n resolvedBuiltInLaunch: ReturnType<typeof resolveBuiltInAgentLaunch>;\n geminiAcp: boolean;\n copilotAcp: boolean;\n claudeAcp: boolean;\n spawnOptions: ReturnType<typeof buildAgentSpawnOptions>;\n};\n\ntype StartupFailureWatcher = {\n promise: Promise<never>;\n dispose: () => void;\n};\n\ntype SessionUpdateSuppressionState = {\n suppressSessionUpdates: boolean;\n suppressReplaySessionUpdateMessages: boolean;\n};\n\nexport type AgentExitInfo = {\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n exitedAt: string;\n reason: AgentDisconnectReason;\n unexpectedDuringPrompt: boolean;\n};\n\nexport type AgentLifecycleSnapshot = {\n pid?: number;\n startedAt?: string;\n running: boolean;\n lastExit?: AgentExitInfo;\n};\n\ntype ConsoleErrorMethod = typeof console.error;\n\nfunction childProcessIsRunning(\n agent: ChildProcessByStdio<Writable, Readable, Readable> | undefined,\n): boolean {\n if (!agent) {\n return false;\n }\n return agent.exitCode == null && agent.signalCode == null && !agent.killed;\n}\n\nfunction cancelledPermissionResponse(): RequestPermissionResponse {\n return {\n outcome: {\n outcome: \"cancelled\",\n },\n };\n}\n\nfunction shouldSuppressSdkConsoleError(args: unknown[]): boolean {\n if (args.length === 0) {\n return false;\n }\n return typeof args[0] === \"string\" && args[0] === \"Error handling request\";\n}\n\nfunction installSdkConsoleErrorSuppression(): () => void {\n const originalConsoleError: ConsoleErrorMethod = console.error;\n console.error = (...args: unknown[]) => {\n if (shouldSuppressSdkConsoleError(args)) {\n return;\n }\n originalConsoleError(...args);\n };\n return () => {\n console.error = originalConsoleError;\n };\n}\n\nfunction enqueueNdJsonLine(\n agentCommand: string,\n line: string,\n controller: ReadableStreamDefaultController<AnyMessage>,\n): void {\n const trimmedLine = line.trim();\n if (!trimmedLine || shouldIgnoreNonJsonAgentOutputLine(agentCommand, trimmedLine)) {\n return;\n }\n try {\n const message = JSON.parse(trimmedLine) as AnyMessage;\n controller.enqueue(message);\n } catch (err) {\n console.error(\"Failed to parse JSON message:\", trimmedLine, err);\n }\n}\n\nfunction enqueueNdJsonLines(\n agentCommand: string,\n lines: string[],\n controller: ReadableStreamDefaultController<AnyMessage>,\n): void {\n for (const line of lines) {\n enqueueNdJsonLine(agentCommand, line, controller);\n }\n}\n\nfunction createNdJsonMessageStream(\n agentCommand: string,\n output: WritableStream<Uint8Array>,\n input: ReadableStream<Uint8Array>,\n): {\n readable: ReadableStream<AnyMessage>;\n writable: WritableStream<AnyMessage>;\n} {\n const textEncoder = new TextEncoder();\n const textDecoder = new TextDecoder();\n\n const readable = new ReadableStream<AnyMessage>({\n async start(controller) {\n let content = \"\";\n const reader = input.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n if (!value) {\n continue;\n }\n content += textDecoder.decode(value, { stream: true });\n const lines = content.split(\"\\n\");\n content = lines.pop() || \"\";\n enqueueNdJsonLines(agentCommand, lines, controller);\n }\n } finally {\n reader.releaseLock();\n controller.close();\n }\n },\n });\n\n const writable = new WritableStream<AnyMessage>({\n async write(message) {\n const content = JSON.stringify(message) + \"\\n\";\n const writer = output.getWriter();\n try {\n await writer.write(textEncoder.encode(content));\n } finally {\n writer.releaseLock();\n }\n },\n });\n\n return { readable, writable };\n}\n\nexport class AcpClient {\n private options: AcpClientOptions;\n private connection?: ClientSideConnection;\n private agent?: ChildProcessByStdio<Writable, Readable, Readable>;\n private initResult?: InitializeResponse;\n private loadedSessionId?: string;\n private eventHandlers: Pick<\n AcpClientOptions,\n | \"onAcpMessage\"\n | \"onAcpOutputMessage\"\n | \"onSessionUpdate\"\n | \"onClientOperation\"\n | \"onPermissionEscalation\"\n >;\n private readonly permissionStats: PermissionStats = {\n requested: 0,\n approved: 0,\n denied: 0,\n cancelled: 0,\n };\n private readonly filesystem: FileSystemHandlers;\n private readonly terminalManager: TerminalManager;\n private sessionUpdateChain: Promise<void> = Promise.resolve();\n private observedSessionUpdates = 0;\n private processedSessionUpdates = 0;\n private suppressSessionUpdates = false;\n private suppressReplaySessionUpdateMessages = false;\n private activePrompt?: {\n sessionId: string;\n promise: Promise<PromptResponse>;\n };\n private readonly cancellingSessionIds = new Set<string>();\n private readonly permissionAbortControllers = new Map<string, AbortController>();\n private closing = false;\n private agentStartedAt?: string;\n private lastAgentExit?: AgentExitInfo;\n private lastKnownPid?: number;\n private readonly promptPermissionFailures = new Map<string, PermissionPromptUnavailableError>();\n private readonly pendingConnectionRequests = new Set<PendingConnectionRequest>();\n\n constructor(options: AcpClientOptions) {\n this.options = {\n ...options,\n cwd: asAbsoluteCwd(options.cwd),\n authPolicy: options.authPolicy ?? \"skip\",\n };\n this.eventHandlers = {\n onAcpMessage: this.options.onAcpMessage,\n onAcpOutputMessage: this.options.onAcpOutputMessage,\n onSessionUpdate: this.options.onSessionUpdate,\n onClientOperation: this.options.onClientOperation,\n onPermissionEscalation: this.options.onPermissionEscalation,\n };\n\n this.filesystem = new FileSystemHandlers({\n cwd: this.options.cwd,\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n onOperation: (operation) => {\n this.eventHandlers.onClientOperation?.(operation);\n },\n });\n this.terminalManager = new TerminalManager({\n cwd: this.options.cwd,\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n onOperation: (operation) => {\n this.eventHandlers.onClientOperation?.(operation);\n },\n });\n }\n\n get initializeResult(): InitializeResponse | undefined {\n return this.initResult;\n }\n\n getAgentPid(): number | undefined {\n return this.agent?.pid ?? this.lastKnownPid;\n }\n\n getPermissionStats(): PermissionStats {\n return { ...this.permissionStats };\n }\n\n getAgentLifecycleSnapshot(): AgentLifecycleSnapshot {\n const pid = this.agent?.pid ?? this.lastKnownPid;\n const running = childProcessIsRunning(this.agent);\n return {\n pid,\n startedAt: this.agentStartedAt,\n running,\n lastExit: this.lastAgentExit ? { ...this.lastAgentExit } : undefined,\n };\n }\n\n supportsLoadSession(): boolean {\n return Boolean(this.initResult?.agentCapabilities?.loadSession);\n }\n\n supportsResumeSession(): boolean {\n return Boolean(this.initResult?.agentCapabilities?.sessionCapabilities?.resume);\n }\n\n supportsCloseSession(): boolean {\n return Boolean(this.initResult?.agentCapabilities?.sessionCapabilities?.close);\n }\n\n supportsListSessions(): boolean {\n return Boolean(this.initResult?.agentCapabilities?.sessionCapabilities?.list);\n }\n\n setEventHandlers(\n handlers: Pick<\n AcpClientOptions,\n | \"onAcpMessage\"\n | \"onAcpOutputMessage\"\n | \"onSessionUpdate\"\n | \"onClientOperation\"\n | \"onPermissionEscalation\"\n >,\n ): void {\n this.eventHandlers = { ...handlers };\n }\n\n clearEventHandlers(): void {\n this.eventHandlers = {};\n }\n\n updateRuntimeOptions(options: {\n permissionMode?: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: AcpClientOptions[\"permissionPolicy\"];\n terminal?: boolean;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n }): void {\n const shouldRefreshPermissionPolicy =\n options.permissionMode !== undefined || options.nonInteractivePermissions !== undefined;\n if (options.permissionMode) {\n this.options.permissionMode = options.permissionMode;\n }\n if (options.nonInteractivePermissions !== undefined) {\n this.options.nonInteractivePermissions = options.nonInteractivePermissions;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"permissionPolicy\")) {\n this.options.permissionPolicy = options.permissionPolicy;\n }\n if (options.terminal !== undefined) {\n this.options.terminal = options.terminal;\n }\n this.refreshRuntimePermissionPolicy(shouldRefreshPermissionPolicy);\n if (options.suppressSdkConsoleErrors !== undefined) {\n this.options.suppressSdkConsoleErrors = options.suppressSdkConsoleErrors;\n }\n if (options.verbose !== undefined) {\n this.options.verbose = options.verbose;\n }\n }\n\n private refreshRuntimePermissionPolicy(enabled: boolean): void {\n if (!enabled) {\n return;\n }\n this.filesystem.updatePermissionPolicy(\n this.options.permissionMode,\n this.options.nonInteractivePermissions,\n );\n this.terminalManager.updatePermissionPolicy(\n this.options.permissionMode,\n this.options.nonInteractivePermissions,\n );\n }\n\n hasReusableSession(sessionId: string): boolean {\n return (\n this.connection != null &&\n this.agent != null &&\n isChildProcessRunning(this.agent) &&\n this.loadedSessionId === sessionId\n );\n }\n\n hasActivePrompt(sessionId?: string): boolean {\n if (!this.activePrompt) {\n return false;\n }\n if (sessionId == null) {\n return true;\n }\n return this.activePrompt.sessionId === sessionId;\n }\n\n async start(): Promise<void> {\n if (this.connection && this.agent && isChildProcessRunning(this.agent)) {\n return;\n }\n if (this.connection || this.agent) {\n await this.close();\n }\n\n const launch = await this.resolveAgentLaunchPlan();\n this.logAgentLaunch(launch);\n await this.ensureLaunchSupport(launch);\n const child = await this.spawnAgentProcess(launch);\n this.closing = false;\n this.agentStartedAt = isoNow();\n this.lastAgentExit = undefined;\n this.lastKnownPid = child.pid ?? undefined;\n this.attachAgentLifecycleObservers(child);\n const startupStderr: string[] = [];\n\n child.stderr.on(\"data\", (chunk: Buffer | string) => {\n this.captureStartupStderr(startupStderr, chunk);\n if (!this.options.verbose) {\n return;\n }\n process.stderr.write(chunk);\n });\n\n const input = Writable.toWeb(child.stdin);\n const output = Readable.toWeb(child.stdout) as ReadableStream<Uint8Array>;\n const stream = this.createTappedStream(\n createNdJsonMessageStream(this.options.agentCommand, input, output),\n );\n\n const connection = this.createConnection(stream);\n connection.signal.addEventListener(\n \"abort\",\n () => {\n this.recordAgentExit(\"connection_close\", child.exitCode ?? null, child.signalCode ?? null);\n },\n { once: true },\n );\n const startupFailure = this.createStartupFailureWatcher(child, startupStderr);\n\n await this.initializeAgentConnection({\n child,\n connection,\n startupFailure,\n startupStderr,\n launch,\n });\n }\n\n private async resolveAgentLaunchPlan(): Promise<AgentLaunchPlan> {\n const configuredCommand = splitCommandLine(this.options.agentCommand);\n const resolvedBuiltInLaunch = resolveBuiltInAgentLaunch(this.options.agentCommand);\n const spawnCommand = resolvedBuiltInLaunch?.command ?? configuredCommand.command;\n let args = resolvedBuiltInLaunch?.args ?? configuredCommand.args;\n args = await resolveGeminiCommandArgs(spawnCommand, args);\n if (isQoderAcpCommand(spawnCommand, args)) {\n args = buildQoderAcpCommandArgs(args, this.options);\n }\n return {\n spawnCommand,\n args,\n resolvedBuiltInLaunch,\n geminiAcp: isGeminiAcpCommand(spawnCommand, args),\n copilotAcp: isCopilotAcpCommand(spawnCommand, args),\n claudeAcp: isClaudeAcpCommand(spawnCommand, args),\n spawnOptions: buildAgentSpawnOptions(this.options.cwd, this.options.authCredentials),\n };\n }\n\n private logAgentLaunch(plan: AgentLaunchPlan): void {\n const launch = plan.resolvedBuiltInLaunch;\n if (launch?.source === \"installed\") {\n this.log(\n `spawning installed built-in agent ${launch.packageName}${launch.packageVersion ? `@${launch.packageVersion}` : \"\"} via ${plan.spawnCommand} ${plan.args.join(\" \")}`,\n );\n return;\n }\n if (launch?.source === \"package-exec\") {\n this.log(\n `spawning built-in agent ${launch.packageName}@${launch.packageRange} via current Node package exec bridge ${plan.spawnCommand} ${plan.args.join(\" \")}`,\n );\n return;\n }\n this.log(`spawning agent: ${plan.spawnCommand} ${plan.args.join(\" \")}`);\n }\n\n private async ensureLaunchSupport(plan: AgentLaunchPlan): Promise<void> {\n if (plan.copilotAcp) {\n await ensureCopilotAcpSupport(plan.spawnCommand);\n }\n if (!plan.claudeAcp) {\n return;\n }\n const claudeExe = resolveClaudeCodeExecutable(process.platform, plan.spawnOptions.env);\n if (claudeExe) {\n plan.spawnOptions.env.CLAUDE_CODE_EXECUTABLE = claudeExe;\n this.log(`resolved system Claude Code executable: ${claudeExe}`);\n }\n }\n\n private async spawnAgentProcess(\n plan: AgentLaunchPlan,\n ): Promise<ChildProcessByStdio<Writable, Readable, Readable>> {\n const spawnedChild = spawn(\n plan.spawnCommand,\n plan.args,\n buildSpawnCommandOptions(plan.spawnCommand, plan.spawnOptions),\n ) as ChildProcessByStdio<Writable, Readable, Readable>;\n try {\n await waitForSpawn(spawnedChild);\n } catch (error) {\n throw new AgentSpawnError(this.options.agentCommand, error);\n }\n return requireAgentStdio(spawnedChild);\n }\n\n private createConnection(stream: {\n readable: ReadableStream<AnyMessage>;\n writable: WritableStream<AnyMessage>;\n }): ClientSideConnection {\n return new ClientSideConnection(\n () => ({\n sessionUpdate: async (params: SessionNotification) => {\n await this.handleSessionUpdate(params);\n },\n requestPermission: async (\n params: RequestPermissionRequest,\n ): Promise<RequestPermissionResponse> => {\n return this.handlePermissionRequest(params);\n },\n readTextFile: async (params: ReadTextFileRequest): Promise<ReadTextFileResponse> => {\n return this.handleReadTextFile(params);\n },\n writeTextFile: async (params: WriteTextFileRequest): Promise<WriteTextFileResponse> => {\n return this.handleWriteTextFile(params);\n },\n createTerminal: async (params: CreateTerminalRequest): Promise<CreateTerminalResponse> => {\n return this.handleCreateTerminal(params);\n },\n terminalOutput: async (params: TerminalOutputRequest): Promise<TerminalOutputResponse> => {\n return this.handleTerminalOutput(params);\n },\n waitForTerminalExit: async (\n params: WaitForTerminalExitRequest,\n ): Promise<WaitForTerminalExitResponse> => {\n return this.handleWaitForTerminalExit(params);\n },\n killTerminal: async (params: KillTerminalRequest): Promise<KillTerminalResponse> => {\n return this.handleKillTerminal(params);\n },\n releaseTerminal: async (\n params: ReleaseTerminalRequest,\n ): Promise<ReleaseTerminalResponse> => {\n return this.handleReleaseTerminal(params);\n },\n }),\n stream,\n );\n }\n\n private async initializeAgentConnection(params: {\n child: ChildProcessByStdio<Writable, Readable, Readable>;\n connection: ClientSideConnection;\n startupFailure: StartupFailureWatcher;\n startupStderr: string[];\n launch: AgentLaunchPlan;\n }): Promise<void> {\n try {\n const initResult = await Promise.race([\n this.initializeProtocolConnection(params.connection, params.launch.geminiAcp),\n params.startupFailure.promise,\n ]);\n params.startupFailure.dispose();\n this.connection = params.connection;\n this.agent = params.child;\n this.initResult = initResult;\n this.log(`initialized protocol version ${initResult.protocolVersion}`);\n } catch (error) {\n await this.handleInitializeFailure(params, error);\n }\n }\n\n private async initializeProtocolConnection(\n connection: ClientSideConnection,\n geminiAcp: boolean,\n ): Promise<InitializeResponse> {\n const initializePromise = connection.initialize({\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: {\n readTextFile: true,\n writeTextFile: true,\n },\n terminal: this.options.terminal !== false,\n },\n clientInfo: {\n name: \"acpx\",\n version: \"0.1.0\",\n },\n });\n const initialized = geminiAcp\n ? await withTimeout(initializePromise, resolveGeminiAcpStartupTimeoutMs())\n : await initializePromise;\n await this.authenticateIfRequired(connection, initialized.authMethods ?? []);\n return initialized;\n }\n\n private async handleInitializeFailure(\n params: {\n child: ChildProcessByStdio<Writable, Readable, Readable>;\n startupFailure: StartupFailureWatcher;\n startupStderr: string[];\n launch: AgentLaunchPlan;\n },\n error: unknown,\n ): Promise<never> {\n params.startupFailure.dispose();\n const normalizedError = await this.normalizeInitializeError(\n error,\n params.child,\n params.startupStderr,\n );\n try {\n params.child.kill();\n } catch {\n // best effort\n }\n if (params.launch.geminiAcp && error instanceof TimeoutError) {\n throw new GeminiAcpStartupTimeoutError(\n await buildGeminiAcpStartupTimeoutMessage(params.launch.spawnCommand),\n {\n cause: error,\n retryable: true,\n },\n );\n }\n throw normalizedError;\n }\n\n private createTappedStream(base: {\n readable: ReadableStream<AnyMessage>;\n writable: WritableStream<AnyMessage>;\n }): {\n readable: ReadableStream<AnyMessage>;\n writable: WritableStream<AnyMessage>;\n } {\n const onAcpMessage = () => this.eventHandlers.onAcpMessage;\n const onAcpOutputMessage = () => this.eventHandlers.onAcpOutputMessage;\n\n const shouldSuppressInboundReplaySessionUpdate = (message: AnyMessage): boolean => {\n return this.suppressReplaySessionUpdateMessages && isSessionUpdateNotification(message);\n };\n\n const readable = new ReadableStream<AnyMessage>({\n async start(controller) {\n const reader = base.readable.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n if (!value) {\n continue;\n }\n if (!shouldSuppressInboundReplaySessionUpdate(value)) {\n onAcpOutputMessage()?.(\"inbound\", value);\n onAcpMessage()?.(\"inbound\", value);\n }\n controller.enqueue(value);\n }\n } finally {\n reader.releaseLock();\n controller.close();\n }\n },\n });\n\n const writable = new WritableStream<AnyMessage>({\n async write(message) {\n onAcpOutputMessage()?.(\"outbound\", message);\n onAcpMessage()?.(\"outbound\", message);\n const writer = base.writable.getWriter();\n try {\n await writer.write(message);\n } finally {\n writer.releaseLock();\n }\n },\n });\n\n return { readable, writable };\n }\n\n async createSession(cwd = this.options.cwd): Promise<SessionCreateResult> {\n const connection = this.getConnection();\n const { command, args } = splitCommandLine(this.options.agentCommand);\n const claudeAcp = isClaudeAcpCommand(command, args);\n const sessionCwd = await resolveAgentSessionCwd(cwd, this.options.agentCommand);\n\n let result: Awaited<ReturnType<typeof connection.newSession>>;\n try {\n const createPromise = this.runConnectionRequest(() =>\n connection.newSession({\n cwd: sessionCwd,\n mcpServers: this.options.mcpServers ?? [],\n _meta: buildClaudeCodeOptionsMeta(this.options.sessionOptions),\n }),\n );\n result = claudeAcp\n ? await withTimeout(createPromise, resolveClaudeAcpSessionCreateTimeoutMs())\n : await createPromise;\n } catch (error) {\n if (claudeAcp && error instanceof TimeoutError) {\n throw new ClaudeAcpSessionCreateTimeoutError(buildClaudeAcpSessionCreateTimeoutMessage(), {\n cause: error,\n retryable: true,\n });\n }\n throw error;\n }\n\n this.loadedSessionId = result.sessionId;\n\n return {\n sessionId: result.sessionId,\n agentSessionId: extractRuntimeSessionId(result._meta),\n configOptions: result.configOptions ?? undefined,\n models: result.models ?? undefined,\n };\n }\n\n async loadSession(sessionId: string, cwd = this.options.cwd): Promise<SessionLoadResult> {\n this.getConnection();\n return await this.loadSessionWithOptions(sessionId, cwd, {});\n }\n\n async loadSessionWithOptions(\n sessionId: string,\n cwd = this.options.cwd,\n options: LoadSessionOptions = {},\n ): Promise<SessionLoadResult> {\n const connection = this.getConnection();\n const sessionCwd = await resolveAgentSessionCwd(cwd, this.options.agentCommand);\n const previousSuppression = this.applySessionUpdateSuppression(\n Boolean(options.suppressReplayUpdates),\n );\n\n let response: LoadSessionResponse | undefined;\n\n try {\n response = await this.runConnectionRequest(() =>\n connection.loadSession({\n sessionId,\n cwd: sessionCwd,\n mcpServers: this.options.mcpServers ?? [],\n }),\n );\n\n await this.waitForSessionUpdateDrain(\n options.replayIdleMs ?? REPLAY_IDLE_MS,\n options.replayDrainTimeoutMs ?? REPLAY_DRAIN_TIMEOUT_MS,\n );\n } finally {\n this.restoreSessionUpdateSuppression(previousSuppression);\n }\n\n this.loadedSessionId = sessionId;\n\n return toReconnectedSessionResult(response);\n }\n\n async resumeSession(sessionId: string, cwd = this.options.cwd): Promise<SessionResumeResult> {\n const connection = this.getConnection();\n const sessionCwd = await resolveAgentSessionCwd(cwd, this.options.agentCommand);\n const response = await this.runConnectionRequest(() =>\n connection.resumeSession({\n sessionId,\n cwd: sessionCwd,\n mcpServers: this.options.mcpServers ?? [],\n }),\n );\n\n this.loadedSessionId = sessionId;\n\n return toReconnectedSessionResult(response);\n }\n\n private applySessionUpdateSuppression(enabled: boolean): SessionUpdateSuppressionState {\n const previous = {\n suppressSessionUpdates: this.suppressSessionUpdates,\n suppressReplaySessionUpdateMessages: this.suppressReplaySessionUpdateMessages,\n };\n this.suppressSessionUpdates = previous.suppressSessionUpdates || enabled;\n this.suppressReplaySessionUpdateMessages =\n previous.suppressReplaySessionUpdateMessages || enabled;\n return previous;\n }\n\n private restoreSessionUpdateSuppression(previous: SessionUpdateSuppressionState): void {\n this.suppressSessionUpdates = previous.suppressSessionUpdates;\n this.suppressReplaySessionUpdateMessages = previous.suppressReplaySessionUpdateMessages;\n }\n\n async prompt(sessionId: string, prompt: PromptInput | string): Promise<PromptResponse> {\n const connection = this.getConnection();\n const normalizedPrompt = this.normalizePromptForAgent(prompt);\n const restoreConsoleError = this.options.suppressSdkConsoleErrors\n ? installSdkConsoleErrorSuppression()\n : undefined;\n\n let promptPromise: Promise<PromptResponse>;\n try {\n promptPromise = this.runConnectionRequest(() =>\n connection.prompt({\n sessionId,\n prompt: normalizedPrompt,\n }),\n );\n } catch (error) {\n restoreConsoleError?.();\n throw error;\n }\n\n this.activePrompt = {\n sessionId,\n promise: promptPromise,\n };\n\n try {\n return this.returnPromptResponseOrPermissionFailure(sessionId, await promptPromise);\n } catch (error) {\n this.throwPromptPermissionFailureIfPresent(sessionId);\n throw error;\n } finally {\n restoreConsoleError?.();\n if (this.activePrompt?.promise === promptPromise) {\n this.activePrompt = undefined;\n }\n this.cancellingSessionIds.delete(sessionId);\n this.abortAndDropPermissionSignal(sessionId);\n this.promptPermissionFailures.delete(sessionId);\n }\n }\n\n private normalizePromptForAgent(prompt: PromptInput | string): PromptInput {\n const normalizedPrompt = typeof prompt === \"string\" ? textPrompt(prompt) : prompt;\n const unsupportedPromptContent = getUnsupportedPromptContentMessage(\n normalizedPrompt,\n this.initResult?.agentCapabilities,\n );\n if (unsupportedPromptContent) {\n throw new UnsupportedPromptContentError(unsupportedPromptContent);\n }\n return normalizedPrompt;\n }\n\n private returnPromptResponseOrPermissionFailure(\n sessionId: string,\n response: PromptResponse,\n ): PromptResponse {\n this.throwPromptPermissionFailureIfPresent(sessionId);\n return response;\n }\n\n private throwPromptPermissionFailureIfPresent(sessionId: string): void {\n const permissionFailure = this.consumePromptPermissionFailure(sessionId);\n if (permissionFailure) {\n throw permissionFailure;\n }\n }\n\n async setSessionMode(sessionId: string, modeId: string): Promise<void> {\n const connection = this.getConnection();\n try {\n await this.runConnectionRequest(() =>\n connection.setSessionMode({\n sessionId,\n modeId,\n }),\n );\n } catch (error) {\n throw maybeWrapSessionControlError(\"session/set_mode\", error, `for mode \"${modeId}\"`);\n }\n }\n\n async setSessionConfigOption(\n sessionId: string,\n configId: string,\n value: string,\n ): Promise<SetSessionConfigOptionResponse> {\n const connection = this.getConnection();\n try {\n return await this.runConnectionRequest(() =>\n connection.setSessionConfigOption({\n sessionId,\n configId,\n value,\n }),\n );\n } catch (error) {\n throw maybeWrapSessionControlError(\n \"session/set_config_option\",\n error,\n `for \"${configId}\"=\"${value}\"`,\n );\n }\n }\n\n async setSessionModel(sessionId: string, modelId: string): Promise<void> {\n const connection = this.getConnection();\n try {\n await this.runConnectionRequest(() =>\n connection.unstable_setSessionModel({\n sessionId,\n modelId,\n }),\n );\n } catch (error) {\n const wrapped = maybeWrapSessionControlError(\n \"session/set_model\",\n error,\n `for model \"${modelId}\"`,\n );\n if (wrapped !== error) {\n throw wrapped;\n }\n const acp = extractAcpError(error);\n const summary = acp\n ? formatSessionControlAcpSummary(acp)\n : error instanceof Error\n ? error.message\n : String(error);\n if (error instanceof Error) {\n throw new Error(`Failed session/set_model for model \"${modelId}\": ${summary}`, {\n cause: error,\n });\n }\n throw new Error(`Failed session/set_model for model \"${modelId}\": ${summary}`, {\n cause: error,\n });\n }\n }\n\n async cancel(sessionId: string): Promise<void> {\n const connection = this.getConnection();\n this.cancellingSessionIds.add(sessionId);\n this.abortAndDropPermissionSignal(sessionId);\n await this.runConnectionRequest(() =>\n connection.cancel({\n sessionId,\n }),\n );\n }\n\n async closeSession(sessionId: string): Promise<void> {\n const connection = this.getConnection();\n await this.runConnectionRequest(() =>\n connection.closeSession({\n sessionId,\n }),\n );\n if (this.loadedSessionId === sessionId) {\n this.loadedSessionId = undefined;\n }\n }\n\n async listSessions(params: ListSessionsRequest = {}): Promise<ListSessionsResponse> {\n const connection = this.getConnection();\n return await this.runConnectionRequest(() => connection.listSessions(params));\n }\n\n async requestCancelActivePrompt(): Promise<boolean> {\n const active = this.activePrompt;\n if (!active) {\n return false;\n }\n await this.cancel(active.sessionId);\n return true;\n }\n\n async cancelActivePrompt(waitMs = 2_500): Promise<PromptResponse | undefined> {\n const active = this.activePrompt;\n if (!active) {\n return undefined;\n }\n\n try {\n await this.cancel(active.sessionId);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.log(`failed to send session/cancel: ${message}`);\n }\n\n if (waitMs <= 0) {\n return undefined;\n }\n\n let timer: NodeJS.Timeout | number | undefined;\n const timeoutPromise = new Promise<undefined>((resolve) => {\n timer = setTimeout(resolve, waitMs);\n });\n\n try {\n return await Promise.race([\n active.promise.then(\n (response) => response,\n () => undefined,\n ),\n timeoutPromise,\n ]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n }\n\n async close(): Promise<void> {\n this.closing = true;\n\n await this.terminalManager.shutdown();\n\n const agent = this.agent;\n if (agent) {\n await this.terminateAgentProcess(agent);\n }\n if (this.pendingConnectionRequests.size > 0) {\n this.rejectPendingConnectionRequests(\n this.lastAgentExit\n ? new AgentDisconnectedError(\n this.lastAgentExit.reason,\n this.lastAgentExit.exitCode,\n this.lastAgentExit.signal,\n {\n outputAlreadyEmitted: Boolean(this.activePrompt),\n },\n )\n : new AgentDisconnectedError(\"connection_close\", null, null, {\n outputAlreadyEmitted: Boolean(this.activePrompt),\n }),\n );\n }\n\n this.sessionUpdateChain = Promise.resolve();\n this.observedSessionUpdates = 0;\n this.processedSessionUpdates = 0;\n this.suppressSessionUpdates = false;\n this.suppressReplaySessionUpdateMessages = false;\n this.activePrompt = undefined;\n this.cancellingSessionIds.clear();\n for (const controller of this.permissionAbortControllers.values()) {\n controller.abort();\n }\n this.permissionAbortControllers.clear();\n this.promptPermissionFailures.clear();\n this.loadedSessionId = undefined;\n this.initResult = undefined;\n this.connection = undefined;\n this.agent = undefined;\n }\n\n private async terminateAgentProcess(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n ): Promise<void> {\n const stdinCloseGraceMs = resolveAgentCloseAfterStdinEndMs(this.options.agentCommand);\n this.endAgentStdin(child);\n let exited = await waitForChildExit(child, stdinCloseGraceMs);\n exited = await this.killAgentIfRunning(child, exited, \"SIGTERM\", AGENT_CLOSE_TERM_GRACE_MS);\n if (!exited) {\n this.log(`agent did not exit after ${AGENT_CLOSE_TERM_GRACE_MS}ms; forcing SIGKILL`);\n exited = await this.killAgentIfRunning(child, exited, \"SIGKILL\", AGENT_CLOSE_KILL_GRACE_MS);\n }\n\n // Ensure stdio handles don't keep this process alive after close() returns.\n this.detachAgentHandles(child, !exited);\n }\n\n private endAgentStdin(child: ChildProcessByStdio<Writable, Readable, Readable>): void {\n // Closing stdin is the most graceful shutdown signal for stdio-based ACP agents.\n if (child.stdin.destroyed) {\n return;\n }\n try {\n child.stdin.end();\n } catch {\n // best effort\n }\n }\n\n private async killAgentIfRunning(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n alreadyExited: boolean,\n signal: NodeJS.Signals,\n waitMs: number,\n ): Promise<boolean> {\n if (alreadyExited || !isChildProcessRunning(child)) {\n return alreadyExited;\n }\n try {\n child.kill(signal);\n } catch {\n // best effort\n }\n return await waitForChildExit(child, waitMs);\n }\n\n private detachAgentHandles(agent: ChildProcess, unref: boolean): void {\n const stdin = agent.stdin;\n const stdout = agent.stdout;\n const stderr = agent.stderr;\n\n stdin?.destroy();\n stdout?.destroy();\n stderr?.destroy();\n\n if (unref) {\n try {\n agent.unref();\n } catch {\n // best effort\n }\n }\n }\n\n private getConnection(): ClientSideConnection {\n if (!this.connection) {\n throw new Error(\"ACP client not started\");\n }\n return this.connection;\n }\n\n private log(message: string): void {\n if (!this.options.verbose) {\n return;\n }\n process.stderr.write(`[acpx] ${message}\\n`);\n }\n\n private captureStartupStderr(target: string[], chunk: Buffer | string): void {\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n if (text.length === 0) {\n return;\n }\n target.push(text);\n const overflow = target.join(\"\").length - STARTUP_STDERR_MAX_CHARS;\n if (overflow <= 0) {\n return;\n }\n const joined = target.join(\"\");\n target.splice(0, target.length, joined.slice(-STARTUP_STDERR_MAX_CHARS));\n }\n\n private summarizeStartupStderr(target: string[]): string | undefined {\n const joined = target.join(\"\").trim();\n if (!joined) {\n return undefined;\n }\n const collapsed = joined.replace(/\\s+/gu, \" \").trim();\n return collapsed.slice(0, STARTUP_STDERR_MAX_CHARS);\n }\n\n private createStartupFailureWatcher(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n startupStderr: string[],\n ): StartupFailureWatcher {\n let settled = false;\n let rejectPromise: (error: unknown) => void;\n\n const cleanup = () => {\n child.off(\"error\", onError);\n child.off(\"exit\", onExit);\n child.off(\"close\", onClose);\n };\n\n const finish = (error?: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n if (error) {\n rejectPromise(error);\n }\n };\n\n const createError = (params?: {\n cause?: unknown;\n exitCode?: number | null;\n signal?: NodeJS.Signals | null;\n }) =>\n new AgentStartupError({\n agentCommand: this.options.agentCommand,\n exitCode: params?.exitCode ?? child.exitCode ?? null,\n signal: params?.signal ?? child.signalCode ?? null,\n stderrSummary: this.summarizeStartupStderr(startupStderr),\n cause: params?.cause,\n });\n\n const onError = (error: Error) => {\n finish(createError({ cause: error }));\n };\n\n const onExit = (exitCode: number | null, signal: NodeJS.Signals | null) => {\n finish(createError({ exitCode, signal }));\n };\n\n const onClose = (exitCode: number | null, signal: NodeJS.Signals | null) => {\n finish(createError({ exitCode, signal }));\n };\n\n const promise = new Promise<never>((_resolve, reject) => {\n rejectPromise = reject;\n child.once(\"error\", onError);\n child.once(\"exit\", onExit);\n child.once(\"close\", onClose);\n });\n\n return {\n promise,\n dispose: () => finish(),\n };\n }\n\n private async normalizeInitializeError(\n error: unknown,\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n startupStderr: string[],\n ): Promise<unknown> {\n if (error instanceof AgentStartupError) {\n return error;\n }\n\n const connectionClosedDuringInitialize =\n error instanceof Error && /acp connection closed/i.test(error.message);\n await waitForChildExit(child, 100);\n const childExited = child.exitCode !== null || child.signalCode !== null;\n if (!connectionClosedDuringInitialize && !childExited) {\n return error;\n }\n\n return new AgentStartupError({\n agentCommand: this.options.agentCommand,\n exitCode: child.exitCode ?? null,\n signal: child.signalCode ?? null,\n stderrSummary: this.summarizeStartupStderr(startupStderr),\n cause: error,\n });\n }\n\n private selectAuthMethod(methods: AuthMethod[]): AuthSelection | undefined {\n for (const method of methods) {\n const envCredential = readEnvCredential(method.id);\n if (envCredential) {\n return {\n methodId: method.id,\n credential: envCredential,\n source: \"env\",\n };\n }\n\n const configCredential = resolveConfiguredAuthCredential(\n method.id,\n this.options.authCredentials,\n );\n if (typeof configCredential === \"string\" && configCredential.trim().length > 0) {\n return {\n methodId: method.id,\n credential: configCredential,\n source: \"config\",\n };\n }\n }\n\n return undefined;\n }\n\n private async authenticateIfRequired(\n connection: ClientSideConnection,\n methods: AuthMethod[],\n ): Promise<void> {\n if (methods.length === 0) {\n return;\n }\n\n const selected = this.selectAuthMethod(methods);\n if (!selected) {\n if (this.options.authPolicy === \"fail\") {\n throw new AuthPolicyError(\n `agent advertised auth methods [${methods.map((m) => m.id).join(\", \")}] but no matching credentials found`,\n );\n }\n\n this.log(\n `agent advertised auth methods [${methods.map((m) => m.id).join(\", \")}] but no matching credentials found — skipping (agent may handle auth internally)`,\n );\n return;\n }\n\n await connection.authenticate({\n methodId: selected.methodId,\n });\n\n this.log(`authenticated with method ${selected.methodId} (${selected.source})`);\n }\n\n private async handlePermissionRequest(\n params: RequestPermissionRequest,\n ): Promise<RequestPermissionResponse> {\n if (this.cancellingSessionIds.has(params.sessionId)) {\n return cancelledPermissionResponse();\n }\n\n const hostResponse = await this.tryHandlePermissionRequestWithHost(params);\n if (hostResponse) {\n return hostResponse;\n }\n\n const { response, recorded } = await this.resolvePermissionRequestFromMode(params);\n if (!recorded) {\n const decision = classifyPermissionDecision(params, response);\n this.recordPermissionDecision(decision);\n }\n\n return response;\n }\n\n private async tryHandlePermissionRequestWithHost(\n params: RequestPermissionRequest,\n ): Promise<RequestPermissionResponse | undefined> {\n if (!this.options.onPermissionRequest) {\n return undefined;\n }\n const signal = this.cancellationSignalForSession(params.sessionId);\n try {\n const decision = await this.options.onPermissionRequest(\n {\n sessionId: params.sessionId,\n raw: params,\n inferredKind: inferToolKind(params),\n },\n { signal },\n );\n return this.hostPermissionDecisionResponse(params, signal, decision);\n } catch (error) {\n return this.hostPermissionErrorResponse(params, signal, error);\n }\n }\n\n private hostPermissionDecisionResponse(\n params: RequestPermissionRequest,\n signal: AbortSignal,\n decision: Parameters<typeof decisionToResponse>[1] | undefined,\n ): RequestPermissionResponse | undefined {\n if (signal.aborted || this.cancellingSessionIds.has(params.sessionId)) {\n this.recordPermissionDecision(\"cancelled\");\n return cancelledPermissionResponse();\n }\n if (!decision) {\n return undefined;\n }\n const response = decisionToResponse(params, decision);\n this.recordPermissionDecision(classifyPermissionDecision(params, response));\n return response;\n }\n\n private hostPermissionErrorResponse(\n params: RequestPermissionRequest,\n signal: AbortSignal,\n error: unknown,\n ): RequestPermissionResponse | undefined {\n if (signal.aborted || this.cancellingSessionIds.has(params.sessionId)) {\n this.recordPermissionDecision(\"cancelled\");\n return cancelledPermissionResponse();\n }\n // Fall through to the mode-based resolver so a host UI error\n // doesn't take down the turn.\n this.log(\n `onPermissionRequest threw, falling through to mode-based resolver: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n return undefined;\n }\n\n private async resolvePermissionRequestFromMode(\n params: RequestPermissionRequest,\n ): Promise<{ response: RequestPermissionResponse; recorded: boolean }> {\n try {\n const result = await resolvePermissionRequestWithDetails(\n params,\n this.options.permissionMode,\n this.options.nonInteractivePermissions ?? \"deny\",\n this.options.permissionPolicy,\n );\n this.emitPermissionEscalation(result.escalation);\n return { response: result.response, recorded: false };\n } catch (error) {\n return this.handleModePermissionError(params.sessionId, error);\n }\n }\n\n private emitPermissionEscalation(\n escalation: Parameters<NonNullable<AcpClientOptions[\"onPermissionEscalation\"]>>[0] | undefined,\n ): void {\n if (escalation) {\n this.eventHandlers.onPermissionEscalation?.(escalation);\n }\n }\n\n private handleModePermissionError(\n sessionId: string,\n error: unknown,\n ): { response: RequestPermissionResponse; recorded: boolean } {\n if (!(error instanceof PermissionPromptUnavailableError)) {\n throw error;\n }\n this.notePromptPermissionFailure(sessionId, error);\n this.recordPermissionDecision(\"cancelled\");\n return { response: cancelledPermissionResponse(), recorded: true };\n }\n\n private attachAgentLifecycleObservers(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n ): void {\n child.once(\"exit\", (exitCode, signal) => {\n this.recordAgentExit(\"process_exit\", exitCode, signal);\n });\n\n child.once(\"close\", (exitCode, signal) => {\n this.recordAgentExit(\"process_close\", exitCode, signal);\n });\n\n child.stdout.once(\"close\", () => {\n this.recordAgentExit(\"pipe_close\", child.exitCode ?? null, child.signalCode ?? null);\n });\n }\n\n private recordAgentExit(\n reason: AgentDisconnectReason,\n exitCode: number | null,\n signal: NodeJS.Signals | null,\n ): void {\n if (this.lastAgentExit) {\n return;\n }\n\n this.lastAgentExit = {\n exitCode,\n signal,\n exitedAt: isoNow(),\n reason,\n unexpectedDuringPrompt: !this.closing && Boolean(this.activePrompt),\n };\n this.rejectPendingConnectionRequests(\n new AgentDisconnectedError(reason, exitCode, signal, {\n outputAlreadyEmitted: Boolean(this.activePrompt),\n }),\n );\n }\n\n private notePromptPermissionFailure(\n sessionId: string,\n error: PermissionPromptUnavailableError,\n ): void {\n if (!this.promptPermissionFailures.has(sessionId)) {\n this.promptPermissionFailures.set(sessionId, error);\n }\n }\n\n private consumePromptPermissionFailure(\n sessionId: string,\n ): PermissionPromptUnavailableError | undefined {\n const error = this.promptPermissionFailures.get(sessionId);\n if (error) {\n this.promptPermissionFailures.delete(sessionId);\n }\n return error;\n }\n\n private async runConnectionRequest<T>(run: () => Promise<T>): Promise<T> {\n return await new Promise<T>((resolve, reject) => {\n const pending: PendingConnectionRequest = {\n settled: false,\n reject,\n };\n\n const finish = (cb: () => void) => {\n if (pending.settled) {\n return;\n }\n pending.settled = true;\n this.pendingConnectionRequests.delete(pending);\n cb();\n };\n\n this.pendingConnectionRequests.add(pending);\n void Promise.resolve()\n .then(run)\n .then(\n (value) => finish(() => resolve(value)),\n (error) => finish(() => reject(error)),\n );\n });\n }\n\n private rejectPendingConnectionRequests(error: unknown): void {\n for (const pending of this.pendingConnectionRequests) {\n if (pending.settled) {\n this.pendingConnectionRequests.delete(pending);\n continue;\n }\n pending.settled = true;\n this.pendingConnectionRequests.delete(pending);\n pending.reject(error);\n }\n }\n\n private async handleReadTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n try {\n return await this.filesystem.readTextFile(params);\n } catch (error) {\n this.recordPermissionError(params.sessionId, error);\n throw error;\n }\n }\n\n private async handleWriteTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n try {\n return await this.filesystem.writeTextFile(params);\n } catch (error) {\n this.recordPermissionError(params.sessionId, error);\n throw error;\n }\n }\n\n private async handleCreateTerminal(\n params: CreateTerminalRequest,\n ): Promise<CreateTerminalResponse> {\n try {\n return await this.terminalManager.createTerminal(params);\n } catch (error) {\n this.recordPermissionError(params.sessionId, error);\n throw error;\n }\n }\n\n private async handleTerminalOutput(\n params: TerminalOutputRequest,\n ): Promise<TerminalOutputResponse> {\n return await this.terminalManager.terminalOutput(params);\n }\n\n private async handleWaitForTerminalExit(\n params: WaitForTerminalExitRequest,\n ): Promise<WaitForTerminalExitResponse> {\n return await this.terminalManager.waitForTerminalExit(params);\n }\n\n private async handleKillTerminal(params: KillTerminalRequest): Promise<KillTerminalResponse> {\n return await this.terminalManager.killTerminal(params);\n }\n\n private async handleReleaseTerminal(\n params: ReleaseTerminalRequest,\n ): Promise<ReleaseTerminalResponse> {\n return await this.terminalManager.releaseTerminal(params);\n }\n\n private cancellationSignalForSession(sessionId: string): AbortSignal {\n let controller = this.permissionAbortControllers.get(sessionId);\n if (!controller) {\n controller = new AbortController();\n this.permissionAbortControllers.set(sessionId, controller);\n }\n return controller.signal;\n }\n\n private abortAndDropPermissionSignal(sessionId: string): void {\n const controller = this.permissionAbortControllers.get(sessionId);\n if (controller) {\n controller.abort();\n this.permissionAbortControllers.delete(sessionId);\n }\n }\n\n private recordPermissionDecision(decision: \"approved\" | \"denied\" | \"cancelled\"): void {\n this.permissionStats.requested += 1;\n if (decision === \"approved\") {\n this.permissionStats.approved += 1;\n return;\n }\n if (decision === \"denied\") {\n this.permissionStats.denied += 1;\n return;\n }\n this.permissionStats.cancelled += 1;\n }\n\n private recordPermissionError(sessionId: string, error: unknown): void {\n if (error instanceof PermissionPromptUnavailableError) {\n this.notePromptPermissionFailure(sessionId, error);\n this.recordPermissionDecision(\"cancelled\");\n return;\n }\n if (error instanceof PermissionDeniedError) {\n this.recordPermissionDecision(\"denied\");\n }\n }\n\n private async handleSessionUpdate(notification: SessionNotification): Promise<void> {\n const sequence = ++this.observedSessionUpdates;\n this.sessionUpdateChain = this.sessionUpdateChain.then(async () => {\n try {\n if (!this.suppressSessionUpdates) {\n this.eventHandlers.onSessionUpdate?.(notification);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.log(`session update handler failed: ${message}`);\n } finally {\n this.processedSessionUpdates = sequence;\n }\n });\n\n await this.sessionUpdateChain;\n }\n\n private async waitForSessionUpdateDrain(idleMs: number, timeoutMs: number): Promise<void> {\n const normalizedIdleMs = Math.max(0, idleMs);\n const normalizedTimeoutMs = Math.max(normalizedIdleMs, timeoutMs);\n const deadline = Date.now() + normalizedTimeoutMs;\n let lastObserved = this.observedSessionUpdates;\n let idleSince = Date.now();\n\n while (Date.now() <= deadline) {\n const observed = this.observedSessionUpdates;\n if (observed !== lastObserved) {\n lastObserved = observed;\n idleSince = Date.now();\n }\n\n if (\n this.processedSessionUpdates === this.observedSessionUpdates &&\n Date.now() - idleSince >= normalizedIdleMs\n ) {\n await this.sessionUpdateChain;\n if (this.processedSessionUpdates === this.observedSessionUpdates) {\n return;\n }\n }\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, DRAIN_POLL_INTERVAL_MS);\n });\n }\n\n throw new Error(`Timed out waiting for session replay drain after ${normalizedTimeoutMs}ms`);\n }\n\n async waitForSessionUpdatesIdle(options?: {\n idleMs?: number;\n timeoutMs?: number;\n }): Promise<void> {\n await this.waitForSessionUpdateDrain(options?.idleMs ?? 0, options?.timeoutMs ?? 0);\n }\n}\n","import type { AgentLifecycleSnapshot } from \"../../acp/client.js\";\nimport { normalizeRuntimeSessionId } from \"../../session/runtime-session-id.js\";\nimport type { SessionConversation, SessionRecord } from \"../../types.js\";\n\nexport function applyLifecycleSnapshotToRecord(\n record: SessionRecord,\n snapshot: AgentLifecycleSnapshot | undefined,\n): void {\n if (!snapshot) {\n return;\n }\n\n record.pid = snapshot.running ? snapshot.pid : undefined;\n record.agentStartedAt = snapshot.startedAt;\n\n if (snapshot.lastExit) {\n record.lastAgentExitCode = snapshot.lastExit.exitCode;\n record.lastAgentExitSignal = snapshot.lastExit.signal;\n record.lastAgentExitAt = snapshot.lastExit.exitedAt;\n record.lastAgentDisconnectReason = snapshot.lastExit.reason;\n return;\n }\n\n record.lastAgentExitCode = undefined;\n record.lastAgentExitSignal = undefined;\n record.lastAgentExitAt = undefined;\n record.lastAgentDisconnectReason = undefined;\n}\n\nexport function reconcileAgentSessionId(\n record: SessionRecord,\n agentSessionId: string | undefined,\n): void {\n const normalized = normalizeRuntimeSessionId(agentSessionId);\n if (!normalized) {\n return;\n }\n\n record.agentSessionId = normalized;\n}\n\nexport function sessionHasAgentMessages(\n recordOrConversation: Pick<SessionRecord, \"messages\"> | SessionConversation,\n): boolean {\n return recordOrConversation.messages.some(\n (message) => typeof message === \"object\" && message !== null && \"Agent\" in message,\n );\n}\n\nexport function applyConversation(record: SessionRecord, conversation: SessionConversation): void {\n record.title = conversation.title;\n record.updated_at = conversation.updated_at;\n record.messages = conversation.messages;\n record.cumulative_token_usage = conversation.cumulative_token_usage;\n record.request_token_usage = conversation.request_token_usage;\n}\n","import type { SessionRecord } from \"../../types.js\";\n\nexport type SystemPromptOption = string | { append: string };\n\nexport type SessionAgentOptions = {\n model?: string;\n allowedTools?: string[];\n maxTurns?: number;\n systemPrompt?: SystemPromptOption;\n};\n\nexport function mergeSessionOptions(\n preferred: SessionAgentOptions | undefined,\n fallback: SessionAgentOptions | undefined,\n): SessionAgentOptions | undefined {\n const merged: SessionAgentOptions = { ...fallback };\n assignDefinedOption(merged, \"model\", preferred?.model);\n assignDefinedOption(merged, \"allowedTools\", preferred?.allowedTools);\n assignDefinedOption(merged, \"maxTurns\", preferred?.maxTurns);\n assignDefinedOption(merged, \"systemPrompt\", preferred?.systemPrompt);\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction assignDefinedOption<Key extends keyof SessionAgentOptions>(\n target: SessionAgentOptions,\n key: Key,\n value: SessionAgentOptions[Key] | undefined,\n): void {\n if (value !== undefined) {\n target[key] = value;\n }\n}\n\nexport function persistSessionOptions(\n record: SessionRecord,\n options: SessionAgentOptions | undefined,\n): void {\n const next = options === undefined ? undefined : persistedSessionOptions(options);\n if (next !== undefined) {\n record.acpx = {\n ...record.acpx,\n session_options: next,\n };\n return;\n }\n\n if (!record.acpx) {\n return;\n }\n\n delete record.acpx.session_options;\n}\n\nexport function sessionOptionsFromRecord(record: SessionRecord): SessionAgentOptions | undefined {\n const stored = record.acpx?.session_options;\n if (!stored) {\n return undefined;\n }\n\n const sessionOptions: SessionAgentOptions = {};\n assignStoredOption(sessionOptions, \"model\", nonEmptyString(stored.model));\n assignStoredOption(sessionOptions, \"allowedTools\", storedAllowedTools(stored.allowed_tools));\n assignStoredOption(sessionOptions, \"maxTurns\", storedMaxTurns(stored.max_turns));\n assignStoredOption(\n sessionOptions,\n \"systemPrompt\",\n storedSystemPromptOption(stored.system_prompt),\n );\n\n return Object.keys(sessionOptions).length > 0 ? sessionOptions : undefined;\n}\n\ntype PersistedSessionOptions = NonNullable<NonNullable<SessionRecord[\"acpx\"]>[\"session_options\"]>;\n\nfunction persistedSessionOptions(\n options: SessionAgentOptions,\n): PersistedSessionOptions | undefined {\n const next = {\n model: nonEmptyString(options.model),\n allowed_tools: Array.isArray(options.allowedTools) ? [...options.allowedTools] : undefined,\n max_turns: typeof options.maxTurns === \"number\" ? options.maxTurns : undefined,\n system_prompt: normalizeSystemPromptOption(options.systemPrompt),\n } satisfies PersistedSessionOptions;\n return hasPersistedSessionOptions(next) ? next : undefined;\n}\n\nfunction hasPersistedSessionOptions(options: PersistedSessionOptions): boolean {\n return (\n options.model !== undefined ||\n options.allowed_tools !== undefined ||\n options.max_turns !== undefined ||\n options.system_prompt !== undefined\n );\n}\n\nfunction normalizeSystemPromptOption(value: unknown): SystemPromptOption | undefined {\n const prompt = nonEmptyString(value);\n if (prompt !== undefined) {\n return prompt;\n }\n const append = appendedSystemPrompt(value);\n return append === undefined ? undefined : { append };\n}\n\nfunction appendedSystemPrompt(value: unknown): string | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return undefined;\n }\n return nonEmptyString((value as { append?: unknown }).append);\n}\n\nfunction assignStoredOption<Key extends keyof SessionAgentOptions>(\n target: SessionAgentOptions,\n key: Key,\n value: SessionAgentOptions[Key] | undefined,\n): void {\n assignDefinedOption(target, key, value);\n}\n\nfunction storedAllowedTools(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\")\n ? [...value]\n : undefined;\n}\n\nfunction storedMaxTurns(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction storedSystemPromptOption(value: unknown): SystemPromptOption | undefined {\n return normalizeSystemPromptOption(value);\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value : undefined;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n ContentBlock,\n SessionNotification,\n SessionUpdate,\n ToolCall,\n ToolCallUpdate,\n UsageUpdate,\n} from \"@agentclientprotocol/sdk\";\nimport { textPrompt } from \"../prompt-content.js\";\nimport type {\n ClientOperation,\n PromptInput,\n SessionAcpxState,\n SessionConversation,\n SessionAgentContent,\n SessionAgentMessage,\n SessionMessage,\n SessionTokenUsage,\n SessionToolResult,\n SessionToolResultContent,\n SessionToolUse,\n SessionUserContent,\n} from \"../types.js\";\n\nexport type LegacyHistoryEntry = {\n role: \"user\" | \"assistant\";\n timestamp: string;\n textPreview: string;\n};\n\nconst MAX_RUNTIME_MESSAGES = 200;\nconst MAX_RUNTIME_AGENT_TEXT_CHARS = 8_000;\nconst MAX_RUNTIME_THINKING_CHARS = 4_000;\nconst MAX_RUNTIME_TOOL_IO_CHARS = 4_000;\nconst MAX_RUNTIME_REQUEST_TOKEN_USAGE = 100;\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\nfunction deepClone<T>(value: T): T {\n try {\n return structuredClone(value);\n } catch {\n return value;\n }\n}\n\nfunction hasOwn(source: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(source, key);\n}\n\nfunction normalizeAgentName(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction extractText(content: ContentBlock): string | undefined {\n switch (content.type) {\n case \"text\":\n return content.text;\n case \"resource_link\":\n return content.title ?? content.name ?? content.uri;\n case \"resource\":\n return extractResourceText(content);\n case \"audio\":\n return `[audio] ${content.mimeType}`;\n default:\n return undefined;\n }\n}\n\nfunction extractResourceText(content: Extract<ContentBlock, { type: \"resource\" }>): string {\n return \"text\" in content.resource && typeof content.resource.text === \"string\"\n ? content.resource.text\n : content.resource.uri;\n}\n\nfunction contentToUserContent(content: ContentBlock): SessionUserContent | undefined {\n if (content.type === \"text\") {\n return {\n Text: content.text,\n };\n }\n\n if (content.type === \"resource_link\") {\n const value = content.title ?? content.name ?? content.uri;\n return {\n Mention: {\n uri: content.uri,\n content: value,\n },\n };\n }\n\n if (content.type === \"resource\") {\n return resourceToUserContent(content);\n }\n\n if (content.type === \"image\") {\n return {\n Image: {\n source: content.data,\n size: null,\n },\n };\n }\n\n if (content.type === \"audio\") {\n return {\n Audio: {\n source: content.data,\n mime_type: content.mimeType,\n },\n };\n }\n\n return undefined;\n}\n\nfunction resourceToUserContent(\n content: Extract<ContentBlock, { type: \"resource\" }>,\n): SessionUserContent {\n if (\"text\" in content.resource && typeof content.resource.text === \"string\") {\n return {\n Text: content.resource.text,\n };\n }\n\n return {\n Mention: {\n uri: content.resource.uri,\n content: content.resource.uri,\n },\n };\n}\n\nfunction nextUserMessageId(): string {\n return randomUUID();\n}\n\nfunction isUserMessage(message: SessionMessage): message is {\n User: SessionConversation[\"messages\"][number] extends infer T\n ? T extends { User: infer U }\n ? U\n : never\n : never;\n} {\n return typeof message === \"object\" && message !== null && hasOwn(message, \"User\");\n}\n\nfunction isAgentMessage(message: SessionMessage): message is { Agent: SessionAgentMessage } {\n return typeof message === \"object\" && message !== null && hasOwn(message, \"Agent\");\n}\n\nfunction isAgentTextContent(content: SessionAgentContent): content is { Text: string } {\n return hasOwn(content, \"Text\");\n}\n\nfunction isAgentThinkingContent(\n content: SessionAgentContent,\n): content is { Thinking: { text: string; signature?: string | null } } {\n return hasOwn(content, \"Thinking\");\n}\n\nfunction isAgentToolUseContent(\n content: SessionAgentContent,\n): content is { ToolUse: SessionToolUse } {\n return hasOwn(content, \"ToolUse\");\n}\n\nfunction updateConversationTimestamp(conversation: SessionConversation, timestamp: string): void {\n conversation.updated_at = timestamp;\n}\n\nfunction ensureAgentMessage(conversation: SessionConversation): SessionAgentMessage {\n const last = conversation.messages.at(-1);\n if (last && isAgentMessage(last)) {\n return last.Agent;\n }\n\n const created: SessionAgentMessage = {\n content: [],\n tool_results: {},\n };\n conversation.messages.push({ Agent: created });\n return created;\n}\n\nfunction appendAgentText(agent: SessionAgentMessage, text: string): void {\n if (!text.trim()) {\n return;\n }\n\n const last = agent.content.at(-1);\n if (last && isAgentTextContent(last)) {\n last.Text = trimRuntimeText(`${last.Text}${text}`, MAX_RUNTIME_AGENT_TEXT_CHARS);\n return;\n }\n\n const next: SessionAgentContent = {\n Text: text,\n };\n agent.content.push(next);\n}\n\nfunction appendAgentThinking(agent: SessionAgentMessage, text: string): void {\n if (!text.trim()) {\n return;\n }\n\n const last = agent.content.at(-1);\n if (last && isAgentThinkingContent(last)) {\n last.Thinking.text = trimRuntimeText(\n `${last.Thinking.text}${text}`,\n MAX_RUNTIME_THINKING_CHARS,\n );\n return;\n }\n\n const next: SessionAgentContent = {\n Thinking: {\n text,\n signature: null,\n },\n };\n agent.content.push(next);\n}\n\nfunction trimRuntimeText(value: string, maxChars: number): string {\n if (value.length <= maxChars) {\n return value;\n }\n return `${value.slice(0, Math.max(0, maxChars - 3))}...`;\n}\n\nfunction statusIndicatesComplete(status: unknown): boolean {\n if (typeof status !== \"string\") {\n return false;\n }\n const normalized = status.toLowerCase();\n return (\n normalized.includes(\"complete\") ||\n normalized.includes(\"done\") ||\n normalized.includes(\"success\") ||\n normalized.includes(\"failed\") ||\n normalized.includes(\"error\") ||\n normalized.includes(\"cancel\")\n );\n}\n\nfunction statusIndicatesError(status: unknown): boolean {\n if (typeof status !== \"string\") {\n return false;\n }\n const normalized = status.toLowerCase();\n return normalized.includes(\"fail\") || normalized.includes(\"error\");\n}\n\nfunction toToolResultContent(value: unknown): SessionToolResultContent {\n if (typeof value === \"string\") {\n return { Text: trimRuntimeText(value, MAX_RUNTIME_TOOL_IO_CHARS) };\n }\n\n if (value != null) {\n try {\n return { Text: trimRuntimeText(JSON.stringify(value), MAX_RUNTIME_TOOL_IO_CHARS) };\n } catch {\n return { Text: \"[Unserializable value]\" };\n }\n }\n\n return { Text: \"\" };\n}\n\nfunction toRawInput(value: unknown): string {\n if (typeof value === \"string\") {\n return trimRuntimeText(value, MAX_RUNTIME_TOOL_IO_CHARS);\n }\n\n try {\n return trimRuntimeText(JSON.stringify(value ?? {}), MAX_RUNTIME_TOOL_IO_CHARS);\n } catch {\n return value == null ? \"\" : \"[Unserializable input]\";\n }\n}\n\nfunction ensureToolUseContent(agent: SessionAgentMessage, toolCallId: string): SessionToolUse {\n for (const content of agent.content) {\n if (isAgentToolUseContent(content) && content.ToolUse.id === toolCallId) {\n return content.ToolUse;\n }\n }\n\n const created: SessionToolUse = {\n id: toolCallId,\n name: \"tool_call\",\n raw_input: \"{}\",\n input: {},\n is_input_complete: false,\n thought_signature: null,\n };\n agent.content.push({ ToolUse: created });\n return created;\n}\n\nfunction upsertToolResult(\n agent: SessionAgentMessage,\n toolCallId: string,\n patch: Partial<SessionToolResult>,\n): void {\n const existing = agent.tool_results[toolCallId];\n const fallback = existingToolResultValues(existing);\n const next: SessionToolResult = {\n tool_use_id: toolCallId,\n tool_name: patch.tool_name ?? fallback.tool_name,\n is_error: patch.is_error ?? fallback.is_error,\n content: patch.content ?? fallback.content,\n output: patch.output ?? fallback.output,\n };\n agent.tool_results[toolCallId] = next;\n}\n\nfunction existingToolResultValues(existing: SessionToolResult | undefined): SessionToolResult {\n if (existing) {\n return existing;\n }\n return {\n tool_use_id: \"\",\n tool_name: \"tool_call\",\n is_error: false,\n content: { Text: \"\" },\n output: undefined,\n };\n}\n\nfunction applyToolCallUpdate(agent: SessionAgentMessage, update: ToolCall | ToolCallUpdate): void {\n const tool = ensureToolUseContent(agent, update.toolCallId);\n\n applyToolIdentityUpdate(tool, update);\n applyToolInputUpdate(tool, update);\n applyToolStatusUpdate(tool, update);\n applyToolResultUpdate(agent, tool, update);\n}\n\nfunction applyToolIdentityUpdate(tool: SessionToolUse, update: ToolCall | ToolCallUpdate): void {\n if (hasOwn(update, \"title\")) {\n tool.name =\n normalizeAgentName((update as { title?: unknown }).title) ?? tool.name ?? \"tool_call\";\n }\n\n if (hasOwn(update, \"kind\")) {\n const kindName = normalizeAgentName((update as { kind?: unknown }).kind);\n if (!tool.name || tool.name === \"tool_call\") {\n tool.name = kindName ?? tool.name;\n }\n }\n}\n\nfunction applyToolInputUpdate(tool: SessionToolUse, update: ToolCall | ToolCallUpdate): void {\n if (!hasOwn(update, \"rawInput\")) {\n return;\n }\n const rawInput = deepClone((update as { rawInput?: unknown }).rawInput);\n tool.input = rawInput ?? {};\n tool.raw_input = toRawInput(rawInput);\n}\n\nfunction applyToolStatusUpdate(tool: SessionToolUse, update: ToolCall | ToolCallUpdate): void {\n if (hasOwn(update, \"status\")) {\n tool.is_input_complete = statusIndicatesComplete((update as { status?: unknown }).status);\n }\n}\n\nfunction applyToolResultUpdate(\n agent: SessionAgentMessage,\n tool: SessionToolUse,\n update: ToolCall | ToolCallUpdate,\n): void {\n if (!hasToolResultPatch(update)) {\n return;\n }\n const status = (update as { status?: unknown }).status;\n const output = hasOwn(update, \"rawOutput\")\n ? deepClone((update as { rawOutput?: unknown }).rawOutput)\n : undefined;\n\n upsertToolResult(agent, update.toolCallId, {\n tool_name: tool.name,\n is_error: statusIndicatesError(status),\n content: output === undefined ? undefined : toToolResultContent(output),\n output,\n });\n}\n\nfunction hasToolResultPatch(update: ToolCall | ToolCallUpdate): boolean {\n return [\"rawOutput\", \"status\", \"title\", \"kind\"].some((key) => hasOwn(update, key));\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction numberField(source: Record<string, unknown>, keys: readonly string[]): number | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"number\" && Number.isFinite(value) && value >= 0) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction usageToTokenUsage(update: UsageUpdate): SessionTokenUsage | undefined {\n const updateRecord = asRecord(update);\n const usageMeta = asRecord(updateRecord?._meta)?.usage;\n const source = asRecord(usageMeta) ?? updateRecord;\n if (!source) {\n return undefined;\n }\n\n const normalized: SessionTokenUsage = {\n input_tokens: numberField(source, [\"input_tokens\", \"inputTokens\"]),\n output_tokens: numberField(source, [\"output_tokens\", \"outputTokens\"]),\n cache_creation_input_tokens: numberField(source, [\n \"cache_creation_input_tokens\",\n \"cacheCreationInputTokens\",\n \"cachedWriteTokens\",\n ]),\n cache_read_input_tokens: numberField(source, [\n \"cache_read_input_tokens\",\n \"cacheReadInputTokens\",\n \"cachedReadTokens\",\n ]),\n };\n\n if (!hasTokenUsageValue(normalized)) {\n return undefined;\n }\n\n return normalized;\n}\n\nfunction hasTokenUsageValue(usage: SessionTokenUsage): boolean {\n return Object.values(usage).some((value) => value !== undefined);\n}\n\nfunction ensureAcpxState(state: SessionAcpxState | undefined): SessionAcpxState {\n return state ?? {};\n}\n\nfunction lastUserMessageId(conversation: SessionConversation): string | undefined {\n for (let index = conversation.messages.length - 1; index >= 0; index -= 1) {\n const message = conversation.messages[index];\n if (message && isUserMessage(message)) {\n return message.User.id;\n }\n }\n return undefined;\n}\n\nexport function createSessionConversation(timestamp = isoNow()): SessionConversation {\n return {\n title: null,\n messages: [],\n updated_at: timestamp,\n cumulative_token_usage: {},\n request_token_usage: {},\n };\n}\n\nexport function cloneSessionConversation(\n conversation: SessionConversation | undefined,\n): SessionConversation {\n if (!conversation) {\n return createSessionConversation();\n }\n\n return {\n title: conversation.title,\n messages: deepClone(conversation.messages ?? []),\n updated_at: conversation.updated_at,\n cumulative_token_usage: deepClone(conversation.cumulative_token_usage ?? {}),\n request_token_usage: deepClone(conversation.request_token_usage ?? {}),\n };\n}\n\nexport function cloneSessionAcpxState(\n state: SessionAcpxState | undefined,\n): SessionAcpxState | undefined {\n if (!state) {\n return undefined;\n }\n\n return {\n current_mode_id: state.current_mode_id,\n desired_mode_id: state.desired_mode_id,\n desired_config_options: state.desired_config_options\n ? { ...state.desired_config_options }\n : undefined,\n current_model_id: state.current_model_id,\n available_models: state.available_models ? [...state.available_models] : undefined,\n available_commands: state.available_commands ? [...state.available_commands] : undefined,\n config_options: state.config_options ? deepClone(state.config_options) : undefined,\n session_options: cloneSessionOptions(state.session_options),\n };\n}\n\nfunction cloneSessionOptions(\n options: SessionAcpxState[\"session_options\"],\n): SessionAcpxState[\"session_options\"] {\n if (!options) {\n return undefined;\n }\n return {\n model: options.model,\n allowed_tools: options.allowed_tools ? [...options.allowed_tools] : undefined,\n max_turns: options.max_turns,\n ...(options.system_prompt !== undefined\n ? { system_prompt: cloneSystemPromptOption(options.system_prompt) }\n : {}),\n };\n}\n\nfunction cloneSystemPromptOption(\n option: NonNullable<NonNullable<SessionAcpxState[\"session_options\"]>[\"system_prompt\"]>,\n): NonNullable<NonNullable<SessionAcpxState[\"session_options\"]>[\"system_prompt\"]> {\n return typeof option === \"string\" ? option : { append: option.append };\n}\n\nexport function appendLegacyHistory(\n conversation: SessionConversation,\n entries: LegacyHistoryEntry[],\n): void {\n for (const entry of entries) {\n const text = entry.textPreview?.trim();\n if (!text) {\n continue;\n }\n\n if (entry.role === \"user\") {\n conversation.messages.push({\n User: {\n id: nextUserMessageId(),\n content: [{ Text: text }],\n },\n });\n } else {\n conversation.messages.push({\n Agent: {\n content: [{ Text: text }],\n tool_results: {},\n },\n });\n }\n\n updateConversationTimestamp(conversation, entry.timestamp || conversation.updated_at);\n }\n}\n\nexport function recordPromptSubmission(\n conversation: SessionConversation,\n prompt: PromptInput | string,\n timestamp = isoNow(),\n): string | undefined {\n const normalizedPrompt = typeof prompt === \"string\" ? textPrompt(prompt) : prompt;\n const userContent = normalizedPrompt\n .map((content) => contentToUserContent(content))\n .filter((content) => content !== undefined);\n if (userContent.length === 0) {\n return undefined;\n }\n\n const promptMessageId = nextUserMessageId();\n conversation.messages.push({\n User: {\n id: promptMessageId,\n content: userContent.map((content) => {\n if (\"Text\" in content) {\n return {\n Text: trimRuntimeText(content.Text, MAX_RUNTIME_AGENT_TEXT_CHARS),\n };\n }\n return content;\n }),\n },\n });\n updateConversationTimestamp(conversation, timestamp);\n trimConversationForRuntime(conversation);\n return promptMessageId;\n}\n\nfunction agentMessageHasObservedReply(message: SessionAgentMessage): boolean {\n return message.content.length > 0 || Object.keys(message.tool_results).length > 0;\n}\n\nexport function hasAgentReplyAfterPrompt(\n conversation: SessionConversation,\n promptMessageId: string,\n): boolean {\n let sawPrompt = false;\n\n for (const message of conversation.messages) {\n if (!sawPrompt) {\n if (isUserMessage(message) && message.User.id === promptMessageId) {\n sawPrompt = true;\n }\n continue;\n }\n\n if (isAgentMessage(message) && agentMessageHasObservedReply(message.Agent)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function recordSessionUpdate(\n conversation: SessionConversation,\n state: SessionAcpxState | undefined,\n notification: SessionNotification,\n timestamp = isoNow(),\n): SessionAcpxState {\n const acpx = ensureAcpxState(state);\n\n const update: SessionUpdate = notification.update;\n applySessionUpdate(conversation, acpx, update);\n\n updateConversationTimestamp(conversation, timestamp);\n trimConversationForRuntime(conversation);\n return acpx;\n}\n\nfunction applySessionUpdate(\n conversation: SessionConversation,\n acpx: SessionAcpxState,\n update: SessionUpdate,\n): void {\n const handler = SESSION_UPDATE_HANDLERS[update.sessionUpdate];\n handler?.(conversation, acpx, update);\n}\n\ntype SessionUpdateHandler = (\n conversation: SessionConversation,\n acpx: SessionAcpxState,\n update: SessionUpdate,\n) => void;\n\nconst SESSION_UPDATE_HANDLERS: Record<string, SessionUpdateHandler> = {\n user_message_chunk: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"user_message_chunk\") {\n appendUserMessageChunk(conversation, update.content);\n }\n },\n agent_message_chunk: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"agent_message_chunk\") {\n appendAgentMessageChunk(conversation, update.content, appendAgentText);\n }\n },\n agent_thought_chunk: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"agent_thought_chunk\") {\n appendAgentMessageChunk(conversation, update.content, appendAgentThinking);\n }\n },\n tool_call: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"tool_call\" || update.sessionUpdate === \"tool_call_update\") {\n applyToolCallUpdate(ensureAgentMessage(conversation), update);\n }\n },\n tool_call_update: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"tool_call\" || update.sessionUpdate === \"tool_call_update\") {\n applyToolCallUpdate(ensureAgentMessage(conversation), update);\n }\n },\n usage_update: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"usage_update\") {\n applyUsageUpdate(conversation, update);\n }\n },\n session_info_update: (conversation, _acpx, update) => {\n if (update.sessionUpdate === \"session_info_update\") {\n applySessionInfoUpdate(conversation, update);\n }\n },\n available_commands_update: (_conversation, acpx, update) => {\n if (update.sessionUpdate === \"available_commands_update\") {\n acpx.available_commands = update.availableCommands\n .map((entry) => entry.name)\n .filter((entry) => typeof entry === \"string\" && entry.trim().length > 0);\n }\n },\n current_mode_update: (_conversation, acpx, update) => {\n if (update.sessionUpdate === \"current_mode_update\") {\n acpx.current_mode_id = update.currentModeId;\n }\n },\n config_option_update: (_conversation, acpx, update) => {\n if (update.sessionUpdate === \"config_option_update\") {\n acpx.config_options = deepClone(update.configOptions);\n }\n },\n};\n\nfunction appendUserMessageChunk(conversation: SessionConversation, content: ContentBlock): void {\n const userContent = contentToUserContent(content);\n if (!userContent) {\n return;\n }\n conversation.messages.push({\n User: {\n id: nextUserMessageId(),\n content: [userContent],\n },\n });\n}\n\nfunction appendAgentMessageChunk(\n conversation: SessionConversation,\n content: ContentBlock,\n append: (agent: SessionAgentMessage, text: string) => void,\n): void {\n const text = extractText(content);\n if (text) {\n append(ensureAgentMessage(conversation), text);\n }\n}\n\nfunction applyUsageUpdate(conversation: SessionConversation, update: UsageUpdate): void {\n const usage = usageToTokenUsage(update);\n if (!usage) {\n return;\n }\n conversation.cumulative_token_usage = usage;\n const userId = lastUserMessageId(conversation);\n if (userId) {\n conversation.request_token_usage[userId] = usage;\n }\n}\n\nfunction applySessionInfoUpdate(\n conversation: SessionConversation,\n update: Extract<SessionUpdate, { sessionUpdate: \"session_info_update\" }>,\n): void {\n if (hasOwn(update, \"title\")) {\n conversation.title = update.title ?? null;\n }\n if (hasOwn(update, \"updatedAt\")) {\n conversation.updated_at = update.updatedAt ?? conversation.updated_at;\n }\n}\n\nexport function recordClientOperation(\n conversation: SessionConversation,\n state: SessionAcpxState | undefined,\n operation: ClientOperation,\n timestamp = isoNow(),\n): SessionAcpxState {\n const acpx = ensureAcpxState(state);\n updateConversationTimestamp(conversation, timestamp);\n trimConversationForRuntime(conversation);\n return acpx;\n}\n\nexport function trimConversationForRuntime(conversation: SessionConversation): void {\n if (conversation.messages.length > MAX_RUNTIME_MESSAGES) {\n conversation.messages = conversation.messages.slice(-MAX_RUNTIME_MESSAGES);\n }\n\n for (const message of conversation.messages) {\n trimRuntimeMessage(message);\n }\n\n const requestUsageEntries = Object.entries(conversation.request_token_usage);\n if (requestUsageEntries.length > MAX_RUNTIME_REQUEST_TOKEN_USAGE) {\n conversation.request_token_usage = Object.fromEntries(\n requestUsageEntries.slice(-MAX_RUNTIME_REQUEST_TOKEN_USAGE),\n );\n }\n}\n\nfunction trimRuntimeMessage(message: SessionMessage): void {\n if (isUserMessage(message)) {\n trimRuntimeUserMessage(message.User);\n return;\n }\n\n if (isAgentMessage(message)) {\n trimRuntimeAgentMessage(message.Agent);\n }\n}\n\nfunction trimRuntimeUserMessage(message: { content: SessionUserContent[] }): void {\n message.content = message.content.map((content) => {\n if (\"Text\" in content) {\n return {\n Text: trimRuntimeText(content.Text, MAX_RUNTIME_AGENT_TEXT_CHARS),\n };\n }\n return content;\n });\n}\n\nfunction trimRuntimeAgentMessage(message: SessionAgentMessage): void {\n for (const content of message.content) {\n trimRuntimeAgentContent(content);\n }\n\n for (const result of Object.values(message.tool_results)) {\n trimRuntimeToolResult(result);\n }\n}\n\nfunction trimRuntimeAgentContent(content: SessionAgentContent): void {\n if (\"Text\" in content) {\n content.Text = trimRuntimeText(content.Text, MAX_RUNTIME_AGENT_TEXT_CHARS);\n } else if (\"Thinking\" in content) {\n content.Thinking.text = trimRuntimeText(content.Thinking.text, MAX_RUNTIME_THINKING_CHARS);\n } else if (\"ToolUse\" in content) {\n content.ToolUse.raw_input = trimRuntimeText(\n content.ToolUse.raw_input,\n MAX_RUNTIME_TOOL_IO_CHARS,\n );\n }\n}\n\nfunction trimRuntimeToolResult(result: SessionToolResult): void {\n if (\"Text\" in result.content) {\n result.content.Text = trimRuntimeText(result.content.Text, MAX_RUNTIME_TOOL_IO_CHARS);\n }\n if (typeof result.output === \"string\") {\n result.output = trimRuntimeText(result.output, MAX_RUNTIME_TOOL_IO_CHARS);\n }\n}\n","import type { SessionCreateResult, SessionLoadResult } from \"../acp/client.js\";\nimport type { SessionAcpxState, SessionRecord } from \"../types.js\";\nimport { cloneSessionAcpxState } from \"./conversation-model.js\";\n\ntype ConfigOptionsResult = Pick<SessionCreateResult | SessionLoadResult, \"configOptions\">;\n\nexport function applyConfigOptionsToRecord(\n record: SessionRecord,\n result: ConfigOptionsResult | undefined,\n): void {\n const configOptions = result?.configOptions;\n if (!configOptions) {\n return;\n }\n\n const acpxState: SessionAcpxState = cloneSessionAcpxState(record.acpx) ?? {};\n acpxState.config_options = structuredClone(configOptions);\n record.acpx = acpxState;\n}\n","import type { SessionModelState } from \"@agentclientprotocol/sdk\";\nimport type { SessionAcpxState, SessionRecord } from \"../types.js\";\n\nfunction ensureAcpxState(state: SessionAcpxState | undefined): SessionAcpxState {\n return state ?? {};\n}\n\nexport function normalizeModeId(modeId: string | undefined): string | undefined {\n if (typeof modeId !== \"string\") {\n return undefined;\n }\n const trimmed = modeId.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction normalizeModelId(modelId: string | undefined): string | undefined {\n if (typeof modelId !== \"string\") {\n return undefined;\n }\n const trimmed = modelId.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function getDesiredModeId(state: SessionAcpxState | undefined): string | undefined {\n return normalizeModeId(state?.desired_mode_id);\n}\n\nexport function getDesiredConfigOptions(\n state: SessionAcpxState | undefined,\n): Record<string, string> {\n const desired = state?.desired_config_options;\n if (!desired) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(desired).flatMap(([configId, value]) => {\n const normalizedConfigId = normalizeModeId(configId);\n return normalizedConfigId && typeof value === \"string\" ? [[normalizedConfigId, value]] : [];\n }),\n );\n}\n\nexport function setDesiredModeId(record: SessionRecord, modeId: string | undefined): void {\n const acpx = ensureAcpxState(record.acpx);\n const normalized = normalizeModeId(modeId);\n\n if (normalized) {\n acpx.desired_mode_id = normalized;\n } else {\n delete acpx.desired_mode_id;\n }\n\n record.acpx = acpx;\n}\n\nexport function setDesiredConfigOption(\n record: SessionRecord,\n configId: string,\n value: string | undefined,\n): void {\n const normalizedConfigId = normalizeModeId(configId);\n if (!normalizedConfigId || normalizedConfigId === \"mode\" || normalizedConfigId === \"model\") {\n return;\n }\n\n const acpx = ensureAcpxState(record.acpx);\n const desired = { ...acpx.desired_config_options };\n\n if (typeof value === \"string\") {\n desired[normalizedConfigId] = value;\n } else {\n delete desired[normalizedConfigId];\n }\n\n if (Object.keys(desired).length > 0) {\n acpx.desired_config_options = desired;\n } else {\n delete acpx.desired_config_options;\n }\n\n record.acpx = acpx;\n}\n\nexport function getDesiredModelId(state: SessionAcpxState | undefined): string | undefined {\n return normalizeModelId(state?.session_options?.model);\n}\n\nexport function setDesiredModelId(record: SessionRecord, modelId: string | undefined): void {\n const acpx = ensureAcpxState(record.acpx);\n const normalized = normalizeModelId(modelId);\n const sessionOptions = { ...acpx.session_options };\n\n if (normalized) {\n sessionOptions.model = normalized;\n } else {\n delete sessionOptions.model;\n }\n\n if (\n typeof sessionOptions.model === \"string\" ||\n Array.isArray(sessionOptions.allowed_tools) ||\n typeof sessionOptions.max_turns === \"number\" ||\n sessionOptions.system_prompt !== undefined\n ) {\n acpx.session_options = sessionOptions;\n } else {\n delete acpx.session_options;\n }\n\n record.acpx = acpx;\n}\n\nexport function setCurrentModelId(record: SessionRecord, modelId: string | undefined): void {\n const acpx = ensureAcpxState(record.acpx);\n const normalized = normalizeModelId(modelId);\n\n if (normalized) {\n acpx.current_model_id = normalized;\n } else {\n delete acpx.current_model_id;\n }\n\n record.acpx = acpx;\n}\n\nexport function syncAdvertisedModelState(\n record: SessionRecord,\n models: SessionModelState | undefined,\n): void {\n if (!models) {\n return;\n }\n\n const acpx = ensureAcpxState(record.acpx);\n acpx.current_model_id = models.currentModelId;\n acpx.available_models = models.availableModels.map((model) => model.modelId);\n record.acpx = acpx;\n}\n","import type { SessionModelState } from \"@agentclientprotocol/sdk\";\nimport { isClaudeAcpCommand } from \"./agent-command.js\";\nimport { splitCommandLine } from \"./client-process.js\";\n\nexport class RequestedModelUnsupportedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RequestedModelUnsupportedError\";\n }\n}\n\nexport function supportsLegacyClaudeCodeModelMetadata(agentCommand: string | undefined): boolean {\n if (!agentCommand) {\n return false;\n }\n const { command, args } = splitCommandLine(agentCommand);\n return isClaudeAcpCommand(command, args);\n}\n\nexport function formatAvailableModelIds(models: SessionModelState | undefined): string {\n const ids =\n models?.availableModels\n .map((model) => model.modelId.trim())\n .filter((modelId) => modelId.length > 0) ?? [];\n return ids.length > 0 ? ids.join(\", \") : \"none advertised\";\n}\n\nexport function assertRequestedModelSupported(params: {\n requestedModel: string;\n models: SessionModelState | undefined;\n agentCommand?: string;\n context: \"apply\" | \"replay\";\n}): void {\n if (!params.models) {\n if (supportsLegacyClaudeCodeModelMetadata(params.agentCommand)) {\n return;\n }\n const action = params.context === \"replay\" ? \"replay saved model\" : \"apply --model\";\n throw new RequestedModelUnsupportedError(\n `Cannot ${action} \"${params.requestedModel}\": the ACP agent did not advertise model support. Generic model selection requires ACP models plus session/set_model support, or an adapter-specific startup model flag.`,\n );\n }\n\n const advertised = new Set(params.models.availableModels.map((model) => model.modelId));\n if (!advertised.has(params.requestedModel)) {\n const action = params.context === \"replay\" ? \"replay saved model\" : \"apply --model\";\n throw new RequestedModelUnsupportedError(\n `Cannot ${action} \"${params.requestedModel}\": the ACP agent did not advertise that model. Available models: ${formatAvailableModelIds(params.models)}.`,\n );\n }\n}\n","import type { AcpClient, SessionCreateResult } from \"../acp/client.js\";\nimport { assertRequestedModelSupported } from \"../acp/model-support.js\";\nimport { withTimeout } from \"../async-control.js\";\n\nexport async function applyRequestedModelIfAdvertised(params: {\n client: AcpClient;\n sessionId: string;\n requestedModel: string | undefined;\n models: SessionCreateResult[\"models\"];\n agentCommand?: string;\n timeoutMs?: number;\n}): Promise<boolean> {\n const requestedModel =\n typeof params.requestedModel === \"string\" ? params.requestedModel.trim() : \"\";\n if (!requestedModel) {\n return false;\n }\n assertRequestedModelSupported({\n requestedModel,\n models: params.models,\n agentCommand: params.agentCommand,\n context: \"apply\",\n });\n if (!params.models) {\n return false;\n }\n if (params.models.currentModelId === requestedModel) {\n return true;\n }\n\n await withTimeout(\n params.client.setSessionModel(params.sessionId, requestedModel),\n params.timeoutMs,\n );\n return true;\n}\n","import type { AcpClient } from \"../../acp/client.js\";\nimport {\n extractAcpError,\n formatErrorMessage,\n isAcpQueryClosedBeforeResponseError,\n isAcpResourceNotFoundError,\n} from \"../../acp/error-normalization.js\";\nimport { assertRequestedModelSupported } from \"../../acp/model-support.js\";\nimport { InterruptedError, TimeoutError, withTimeout } from \"../../async-control.js\";\nimport {\n SessionConfigOptionReplayError,\n SessionModeReplayError,\n SessionModelReplayError,\n SessionResumeRequiredError,\n} from \"../../errors.js\";\nimport { incrementPerfCounter } from \"../../perf-metrics.js\";\nimport { applyConfigOptionsToRecord } from \"../../session/config-options.js\";\nimport {\n getDesiredConfigOptions,\n getDesiredModeId,\n getDesiredModelId,\n setCurrentModelId,\n syncAdvertisedModelState,\n} from \"../../session/mode-preference.js\";\nimport type { SessionRecord, SessionResumePolicy } from \"../../types.js\";\nimport {\n applyLifecycleSnapshotToRecord,\n reconcileAgentSessionId,\n sessionHasAgentMessages,\n} from \"./lifecycle.js\";\n\nexport type ConnectedSessionController = {\n hasActivePrompt: () => boolean;\n requestCancelActivePrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string) => Promise<void>;\n setSessionModel: (modelId: string) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => ReturnType<AcpClient[\"setSessionConfigOption\"]>;\n};\n\nfunction isProcessAlive(pid: number | undefined): boolean {\n if (!pid || !Number.isInteger(pid) || pid <= 0 || pid === process.pid) {\n return false;\n }\n\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport type ConnectAndLoadSessionOptions = {\n client: AcpClient;\n record: SessionRecord;\n resumePolicy?: SessionResumePolicy;\n timeoutMs?: number;\n verbose?: boolean;\n activeController: ConnectedSessionController;\n onClientAvailable?: (controller: ConnectedSessionController) => void;\n onConnectedRecord?: (record: SessionRecord) => void;\n onSessionIdResolved?: (sessionId: string) => void;\n};\n\nexport type ConnectAndLoadSessionResult = {\n sessionId: string;\n agentSessionId?: string;\n resumed: boolean;\n loadError?: string;\n};\n\nconst SESSION_LOAD_UNSUPPORTED_CODES = new Set([-32601, -32602]);\n\nfunction shouldFallbackToNewSession(error: unknown, record: SessionRecord): boolean {\n if (isHardReconnectFailure(error)) {\n return false;\n }\n const acp = extractAcpError(error);\n if (isAcpResourceNotFoundError(error) || isUnsupportedSessionLoadAcpError(acp)) {\n return true;\n }\n\n return !sessionHasAgentMessages(record) && isFallbackSafeEmptySessionError(error, acp);\n}\n\nfunction isHardReconnectFailure(error: unknown): boolean {\n return error instanceof TimeoutError || error instanceof InterruptedError;\n}\n\nfunction isUnsupportedSessionLoadAcpError(acp: ReturnType<typeof extractAcpError>): boolean {\n return !!acp && SESSION_LOAD_UNSUPPORTED_CODES.has(acp.code);\n}\n\nfunction isFallbackSafeEmptySessionError(\n error: unknown,\n acp: ReturnType<typeof extractAcpError>,\n): boolean {\n return isAcpQueryClosedBeforeResponseError(error) || acp?.code === -32603;\n}\n\nfunction requiresSameSession(resumePolicy: SessionResumePolicy | undefined): boolean {\n return resumePolicy === \"same-session-only\";\n}\n\nfunction makeSessionResumeRequiredError(params: {\n record: SessionRecord;\n reason: string;\n cause?: unknown;\n}): SessionResumeRequiredError {\n return new SessionResumeRequiredError(\n `Persistent ACP session ${params.record.acpSessionId} could not be resumed: ${params.reason}`,\n {\n cause: params.cause instanceof Error ? params.cause : undefined,\n },\n );\n}\n\nasync function replayDesiredMode(params: {\n client: AcpClient;\n sessionId: string;\n desiredModeId: string | undefined;\n previousSessionId: string;\n timeoutMs?: number;\n verbose?: boolean;\n}): Promise<void> {\n if (!params.desiredModeId) {\n return;\n }\n\n try {\n await withTimeout(\n params.client.setSessionMode(params.sessionId, params.desiredModeId),\n params.timeoutMs,\n );\n if (params.verbose) {\n process.stderr.write(\n `[acpx] replayed desired mode ${params.desiredModeId} on fresh ACP session ${params.sessionId} (previous ${params.previousSessionId})\\n`,\n );\n }\n } catch (error) {\n throw new SessionModeReplayError(\n `Failed to replay saved session mode ${params.desiredModeId} on fresh ACP session ${params.sessionId}: ${formatErrorMessage(error)}`,\n {\n cause: error instanceof Error ? error : undefined,\n retryable: true,\n },\n );\n }\n}\n\nasync function replayDesiredModel(params: {\n client: AcpClient;\n sessionId: string;\n desiredModelId: string | undefined;\n previousSessionId: string;\n record: SessionRecord;\n models: import(\"../../acp/client.js\").SessionLoadResult[\"models\"] | undefined;\n timeoutMs?: number;\n verbose?: boolean;\n}): Promise<void> {\n if (!params.desiredModelId) {\n return;\n }\n\n try {\n assertRequestedModelSupported({\n requestedModel: params.desiredModelId,\n models: params.models,\n agentCommand: params.record.agentCommand,\n context: \"replay\",\n });\n if (!params.models || params.models.currentModelId === params.desiredModelId) {\n return;\n }\n await withTimeout(\n params.client.setSessionModel(params.sessionId, params.desiredModelId),\n params.timeoutMs,\n );\n if (params.verbose) {\n process.stderr.write(\n `[acpx] replayed desired model ${params.desiredModelId} on fresh ACP session ${params.sessionId} (previous ${params.previousSessionId})\\n`,\n );\n }\n } catch (error) {\n throw new SessionModelReplayError(\n `Failed to replay saved session model ${params.desiredModelId} on fresh ACP session ${params.sessionId}: ${formatErrorMessage(error)}`,\n {\n cause: error instanceof Error ? error : undefined,\n retryable: true,\n },\n );\n }\n}\n\nasync function replayDesiredConfigOptions(params: {\n client: AcpClient;\n sessionId: string;\n desiredConfigOptions: Record<string, string>;\n previousSessionId: string;\n timeoutMs?: number;\n verbose?: boolean;\n}): Promise<void> {\n for (const [configId, value] of Object.entries(params.desiredConfigOptions)) {\n try {\n await withTimeout(\n params.client.setSessionConfigOption(params.sessionId, configId, value),\n params.timeoutMs,\n );\n if (params.verbose) {\n process.stderr.write(\n `[acpx] replayed desired config option ${configId} on fresh ACP session ${params.sessionId} (previous ${params.previousSessionId})\\n`,\n );\n }\n } catch (error) {\n throw new SessionConfigOptionReplayError(\n `Failed to replay saved session config option ${configId} on fresh ACP session ${params.sessionId}: ${formatErrorMessage(error)}`,\n {\n cause: error instanceof Error ? error : undefined,\n retryable: true,\n },\n );\n }\n }\n}\n\nfunction restoreOriginalSessionState(params: {\n record: SessionRecord;\n sessionId: string;\n agentSessionId: string | undefined;\n}): void {\n params.record.acpSessionId = params.sessionId;\n params.record.agentSessionId = params.agentSessionId;\n}\n\nexport async function connectAndLoadSession(\n options: ConnectAndLoadSessionOptions,\n): Promise<ConnectAndLoadSessionResult> {\n const record = options.record;\n const client = options.client;\n const sameSessionOnly = requiresSameSession(options.resumePolicy) || Boolean(record.importedFrom);\n const originalSessionId = record.acpSessionId;\n const originalAgentSessionId = record.agentSessionId;\n const desiredModeId = getDesiredModeId(record.acpx);\n const desiredModelId = getDesiredModelId(record.acpx);\n const desiredConfigOptions = getDesiredConfigOptions(record.acpx);\n const storedProcessAlive = isProcessAlive(record.pid);\n const shouldReconnect = Boolean(record.pid) && !storedProcessAlive;\n\n logReconnectAttempt(record, storedProcessAlive, shouldReconnect, options.verbose);\n\n const reusingLoadedSession = client.hasReusableSession(record.acpSessionId);\n if (reusingLoadedSession) {\n incrementPerfCounter(\"runtime.connect_and_load.reused_session\");\n } else {\n await withTimeout(client.start(), options.timeoutMs);\n }\n options.onClientAvailable?.(options.activeController);\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n record.closed = false;\n record.closedAt = undefined;\n options.onConnectedRecord?.(record);\n\n let resumed = false;\n let loadError: string | undefined;\n let sessionId = record.acpSessionId;\n let createdFreshSession = false;\n let pendingAgentSessionId = record.agentSessionId;\n let sessionModels: import(\"../../acp/client.js\").SessionLoadResult[\"models\"];\n\n const loadState = await loadOrCreateRuntimeSession({\n client,\n record,\n reusingLoadedSession,\n sameSessionOnly,\n timeoutMs: options.timeoutMs,\n });\n resumed = loadState.resumed;\n loadError = loadState.loadError;\n sessionId = loadState.sessionId;\n createdFreshSession = loadState.createdFreshSession;\n pendingAgentSessionId = loadState.pendingAgentSessionId;\n sessionModels = loadState.sessionModels;\n\n await replayFreshSessionPreferences({\n client,\n record,\n createdFreshSession,\n sessionId,\n pendingAgentSessionId,\n originalSessionId,\n originalAgentSessionId,\n desiredModeId,\n desiredModelId,\n desiredConfigOptions,\n sessionModels,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n\n applyReconnectedModelState(record, sessionModels, createdFreshSession, desiredModelId);\n\n options.onSessionIdResolved?.(sessionId);\n\n return {\n sessionId,\n agentSessionId: record.agentSessionId,\n resumed,\n loadError,\n };\n}\n\nfunction applyReconnectedModelState(\n record: SessionRecord,\n sessionModels: import(\"../../acp/client.js\").SessionLoadResult[\"models\"],\n createdFreshSession: boolean,\n desiredModelId: string | undefined,\n): void {\n syncAdvertisedModelState(record, sessionModels);\n if (createdFreshSession && desiredModelId && sessionModels) {\n setCurrentModelId(record, desiredModelId);\n }\n}\n\nfunction logReconnectAttempt(\n record: SessionRecord,\n storedProcessAlive: boolean,\n shouldReconnect: boolean,\n verbose: boolean | undefined,\n): void {\n if (!verbose) {\n return;\n }\n if (storedProcessAlive) {\n process.stderr.write(\n `[acpx] saved session pid ${record.pid} is running; reconnecting to saved ACP session\\n`,\n );\n return;\n }\n if (shouldReconnect) {\n process.stderr.write(\n `[acpx] saved session pid ${record.pid} is dead; respawning agent and attempting session reconnect\\n`,\n );\n }\n}\n\nasync function replayFreshSessionPreferences(params: {\n client: AcpClient;\n record: SessionRecord;\n createdFreshSession: boolean;\n sessionId: string;\n pendingAgentSessionId: string | undefined;\n originalSessionId: string;\n originalAgentSessionId: string | undefined;\n desiredModeId: string | undefined;\n desiredModelId: string | undefined;\n desiredConfigOptions: Record<string, string>;\n sessionModels: import(\"../../acp/client.js\").SessionLoadResult[\"models\"];\n timeoutMs?: number;\n verbose?: boolean;\n}): Promise<void> {\n if (!params.createdFreshSession) {\n return;\n }\n\n try {\n await replayDesiredMode({\n client: params.client,\n sessionId: params.sessionId,\n desiredModeId: params.desiredModeId,\n previousSessionId: params.originalSessionId,\n timeoutMs: params.timeoutMs,\n verbose: params.verbose,\n });\n await replayDesiredModel({\n client: params.client,\n sessionId: params.sessionId,\n desiredModelId: params.desiredModelId,\n previousSessionId: params.originalSessionId,\n record: params.record,\n models: params.sessionModels,\n timeoutMs: params.timeoutMs,\n verbose: params.verbose,\n });\n await replayDesiredConfigOptions({\n client: params.client,\n sessionId: params.sessionId,\n desiredConfigOptions: params.desiredConfigOptions,\n previousSessionId: params.originalSessionId,\n timeoutMs: params.timeoutMs,\n verbose: params.verbose,\n });\n } catch (error) {\n restoreOriginalSessionState({\n record: params.record,\n sessionId: params.originalSessionId,\n agentSessionId: params.originalAgentSessionId,\n });\n if (params.verbose) {\n process.stderr.write(`[acpx] ${formatErrorMessage(error)}\\n`);\n }\n throw error;\n }\n\n params.record.acpSessionId = params.sessionId;\n reconcileAgentSessionId(params.record, params.pendingAgentSessionId);\n}\n\ntype RuntimeSessionLoadState = {\n sessionId: string;\n pendingAgentSessionId: string | undefined;\n sessionModels: import(\"../../acp/client.js\").SessionLoadResult[\"models\"];\n resumed: boolean;\n createdFreshSession: boolean;\n loadError?: string;\n};\n\nasync function loadOrCreateRuntimeSession(params: {\n client: AcpClient;\n record: SessionRecord;\n reusingLoadedSession: boolean;\n sameSessionOnly: boolean;\n timeoutMs?: number;\n}): Promise<RuntimeSessionLoadState> {\n if (params.reusingLoadedSession) {\n return {\n sessionId: params.record.acpSessionId,\n pendingAgentSessionId: params.record.agentSessionId,\n sessionModels: undefined,\n resumed: true,\n createdFreshSession: false,\n };\n }\n\n if (params.client.supportsResumeSession()) {\n return await resumeRuntimeSession(params);\n }\n\n if (params.client.supportsLoadSession()) {\n return await loadRuntimeSession(params);\n }\n\n if (params.sameSessionOnly) {\n throw makeSessionResumeRequiredError({\n record: params.record,\n reason: \"agent does not support session/resume or session/load\",\n });\n }\n\n return await createFreshRuntimeSession(params.client, params.record, params.timeoutMs);\n}\n\nasync function resumeRuntimeSession(params: {\n client: AcpClient;\n record: SessionRecord;\n sameSessionOnly: boolean;\n timeoutMs?: number;\n}): Promise<RuntimeSessionLoadState> {\n try {\n const resumeResult = await withTimeout(\n params.client.resumeSession(params.record.acpSessionId, params.record.cwd),\n params.timeoutMs,\n );\n reconcileAgentSessionId(params.record, resumeResult.agentSessionId);\n applyConfigOptionsToRecord(params.record, resumeResult);\n return {\n sessionId: params.record.acpSessionId,\n pendingAgentSessionId: params.record.agentSessionId,\n sessionModels: resumeResult.models,\n resumed: true,\n createdFreshSession: false,\n };\n } catch (error) {\n return await recoverRuntimeSessionLoadFailure(params, error);\n }\n}\n\nasync function loadRuntimeSession(params: {\n client: AcpClient;\n record: SessionRecord;\n sameSessionOnly: boolean;\n timeoutMs?: number;\n}): Promise<RuntimeSessionLoadState> {\n try {\n const loadResult = await withTimeout(\n params.client.loadSessionWithOptions(params.record.acpSessionId, params.record.cwd, {\n suppressReplayUpdates: true,\n }),\n params.timeoutMs,\n );\n reconcileAgentSessionId(params.record, loadResult.agentSessionId);\n applyConfigOptionsToRecord(params.record, loadResult);\n return {\n sessionId: params.record.acpSessionId,\n pendingAgentSessionId: params.record.agentSessionId,\n sessionModels: loadResult.models,\n resumed: true,\n createdFreshSession: false,\n };\n } catch (error) {\n return await recoverRuntimeSessionLoadFailure(params, error);\n }\n}\n\nasync function recoverRuntimeSessionLoadFailure(\n params: {\n client: AcpClient;\n record: SessionRecord;\n sameSessionOnly: boolean;\n timeoutMs?: number;\n },\n error: unknown,\n): Promise<RuntimeSessionLoadState> {\n const loadError = formatErrorMessage(error);\n if (params.sameSessionOnly) {\n throw makeSessionResumeRequiredError({\n record: params.record,\n reason: loadError,\n cause: error,\n });\n }\n if (!shouldFallbackToNewSession(error, params.record)) {\n throw error;\n }\n return {\n ...(await createFreshRuntimeSession(params.client, params.record, params.timeoutMs)),\n loadError,\n };\n}\n\nasync function createFreshRuntimeSession(\n client: AcpClient,\n record: SessionRecord,\n timeoutMs: number | undefined,\n): Promise<RuntimeSessionLoadState> {\n const createdSession = await withTimeout(client.createSession(record.cwd), timeoutMs);\n applyConfigOptionsToRecord(record, createdSession);\n return {\n sessionId: createdSession.sessionId,\n pendingAgentSessionId: createdSession.agentSessionId,\n sessionModels: createdSession.models,\n resumed: false,\n createdFreshSession: true,\n };\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { AcpClient } from \"../../acp/client.js\";\nimport { withInterrupt } from \"../../async-control.js\";\nimport { absolutePath, isoNow } from \"../../session/persistence.js\";\nimport type {\n AcpPermissionDecision,\n AcpPermissionRequest,\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n PermissionMode,\n SessionRecord,\n SessionResumePolicy,\n} from \"../../types.js\";\nimport { applyLifecycleSnapshotToRecord } from \"./lifecycle.js\";\nimport { connectAndLoadSession, type ConnectedSessionController } from \"./reconnect.js\";\nimport { sessionOptionsFromRecord } from \"./session-options.js\";\n\nexport type FullConnectedSessionController = ConnectedSessionController & {\n setSessionModel: (modelId: string) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\ntype ConnectedSessionContext = {\n record: SessionRecord;\n client: AcpClient;\n activeController: FullConnectedSessionController;\n sessionId: string;\n resumed: boolean;\n loadError?: string;\n};\n\nexport type WithConnectedSessionOptions<T> = {\n sessionRecordId: string;\n loadRecord: (sessionRecordId: string) => Promise<SessionRecord>;\n saveRecord: (record: SessionRecord) => Promise<void>;\n createClient?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n mcpServers?: McpServer[];\n permissionMode?: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n onPermissionRequest?: (\n req: AcpPermissionRequest,\n ctx: { signal: AbortSignal },\n ) => Promise<AcpPermissionDecision | undefined>;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n resumePolicy?: SessionResumePolicy;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: FullConnectedSessionController) => void;\n onClientClosed?: () => void;\n onConnectedRecord?: (record: SessionRecord) => void;\n onInterrupt?: (params: { client: AcpClient; record: SessionRecord }) => Promise<void>;\n run: (context: ConnectedSessionContext) => Promise<T>;\n};\n\nexport type WithConnectedSessionResult<T> = {\n value: T;\n record: SessionRecord;\n resumed: boolean;\n loadError?: string;\n};\n\nfunction createActiveSessionController(params: {\n client: AcpClient;\n getActiveSessionId: () => string;\n}): FullConnectedSessionController {\n const getActiveSessionId = () => params.getActiveSessionId();\n return {\n hasActivePrompt: () => params.client.hasActivePrompt(),\n requestCancelActivePrompt: async () => await params.client.requestCancelActivePrompt(),\n setSessionMode: async (modeId: string) => {\n await params.client.setSessionMode(getActiveSessionId(), modeId);\n },\n setSessionModel: async (modelId: string) => {\n await params.client.setSessionModel(getActiveSessionId(), modelId);\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n return await params.client.setSessionConfigOption(getActiveSessionId(), configId, value);\n },\n };\n}\n\nexport async function withConnectedSession<T>(\n options: WithConnectedSessionOptions<T>,\n): Promise<WithConnectedSessionResult<T>> {\n const record = await options.loadRecord(options.sessionRecordId);\n const client =\n options.createClient?.({\n agentCommand: record.agentCommand,\n cwd: absolutePath(record.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode ?? \"approve-reads\",\n nonInteractivePermissions: options.nonInteractivePermissions,\n onPermissionRequest: options.onPermissionRequest,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n verbose: options.verbose,\n sessionOptions: sessionOptionsFromRecord(record),\n }) ??\n new AcpClient({\n agentCommand: record.agentCommand,\n cwd: absolutePath(record.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode ?? \"approve-reads\",\n nonInteractivePermissions: options.nonInteractivePermissions,\n onPermissionRequest: options.onPermissionRequest,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n verbose: options.verbose,\n sessionOptions: sessionOptionsFromRecord(record),\n });\n let activeSessionIdForControl = record.acpSessionId;\n let notifiedClientAvailable = false;\n const activeController = createActiveSessionController({\n client,\n getActiveSessionId: () => activeSessionIdForControl,\n });\n\n try {\n return await withInterrupt(\n async () => {\n const { sessionId, resumed, loadError } = await connectAndLoadSession({\n client,\n record,\n resumePolicy: options.resumePolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n activeController,\n onClientAvailable: (controller) => {\n options.onClientAvailable?.(controller as FullConnectedSessionController);\n notifiedClientAvailable = true;\n },\n onConnectedRecord: options.onConnectedRecord,\n onSessionIdResolved: (sessionIdValue) => {\n activeSessionIdForControl = sessionIdValue;\n },\n });\n\n const value = await options.run({\n record,\n client,\n activeController,\n sessionId,\n resumed,\n loadError,\n });\n\n const now = isoNow();\n record.lastUsedAt = now;\n record.closed = false;\n record.closedAt = undefined;\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n await options.saveRecord(record);\n\n return {\n value,\n record,\n resumed,\n loadError,\n };\n },\n async () => {\n if (options.onInterrupt) {\n await options.onInterrupt({ client, record });\n } else {\n await client.cancelActivePrompt(2_500);\n }\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n record.lastUsedAt = isoNow();\n await options.saveRecord(record).catch(() => {\n // best effort while process is being interrupted\n });\n await client.close();\n },\n );\n } finally {\n if (notifiedClientAvailable) {\n options.onClientClosed?.();\n }\n await client.close();\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n await options.saveRecord(record).catch(() => {\n // best effort on close\n });\n }\n}\n","import { TimeoutError, withTimeout } from \"../../async-control.js\";\nimport { hasAgentReplyAfterPrompt } from \"../../session/conversation-model.js\";\nimport type { PromptInput, RunPromptResult, SessionConversation } from \"../../types.js\";\n\nconst SESSION_REPLY_IDLE_MS = 1_000;\nconst SESSION_REPLY_DRAIN_TIMEOUT_MS = 5_000;\n\ntype PromptTurnClient = {\n prompt: (\n sessionId: string,\n prompt: PromptInput | string,\n ) => Promise<{ stopReason: RunPromptResult[\"stopReason\"] }>;\n waitForSessionUpdatesIdle?: (options?: { idleMs?: number; timeoutMs?: number }) => Promise<void>;\n};\n\nexport async function runPromptTurn(params: {\n client: PromptTurnClient;\n sessionId: string;\n prompt: PromptInput | string;\n timeoutMs?: number;\n conversation: SessionConversation;\n promptMessageId?: string;\n onPromptStarted?: () => Promise<void> | void;\n}): Promise<{ stopReason: RunPromptResult[\"stopReason\"]; source: \"rpc\" | \"session\" }> {\n try {\n const promptPromise = params.client.prompt(params.sessionId, params.prompt);\n await params.onPromptStarted?.();\n const response = await withTimeout(promptPromise, params.timeoutMs);\n await params.client\n .waitForSessionUpdatesIdle?.({\n idleMs: SESSION_REPLY_IDLE_MS,\n timeoutMs: SESSION_REPLY_DRAIN_TIMEOUT_MS,\n })\n .catch(() => {\n // Best effort. The prompt already completed successfully, so keep the\n // original stop reason if late update draining itself times out.\n });\n return {\n stopReason: response.stopReason,\n source: \"rpc\",\n };\n } catch (error) {\n if (!(error instanceof TimeoutError) || !params.promptMessageId) {\n throw error;\n }\n\n await params.client\n .waitForSessionUpdatesIdle?.({\n idleMs: SESSION_REPLY_IDLE_MS,\n timeoutMs: SESSION_REPLY_DRAIN_TIMEOUT_MS,\n })\n .catch(() => {\n // Best effort. If the update drain itself times out, fall back to the prompt error.\n });\n\n if (hasAgentReplyAfterPrompt(params.conversation, params.promptMessageId)) {\n return {\n stopReason: \"end_turn\",\n source: \"session\",\n };\n }\n\n throw error;\n }\n}\n","const DEFAULT_LIVE_CHECKPOINT_INTERVAL_MS = 500;\n\nexport type LiveSessionCheckpointOptions = {\n save: () => Promise<void>;\n intervalMs?: number;\n onError?: (error: unknown) => void;\n};\n\nexport class LiveSessionCheckpoint {\n private readonly save: () => Promise<void>;\n private readonly intervalMs: number;\n private readonly onError: ((error: unknown) => void) | undefined;\n private dirty = false;\n private flushing: Promise<void> | undefined;\n private timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(options: LiveSessionCheckpointOptions) {\n this.save = options.save;\n this.intervalMs = options.intervalMs ?? DEFAULT_LIVE_CHECKPOINT_INTERVAL_MS;\n this.onError = options.onError;\n }\n\n request(): void {\n this.dirty = true;\n if (this.timer) {\n return;\n }\n\n this.timer = setTimeout(() => {\n this.timer = undefined;\n void this.flush().catch((error: unknown) => {\n this.onError?.(error);\n });\n }, this.intervalMs);\n this.timer.unref?.();\n }\n\n async checkpoint(): Promise<void> {\n this.dirty = true;\n await this.flush();\n }\n\n async flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n\n if (this.flushing) {\n await this.flushing;\n if (!this.dirty) {\n return;\n }\n }\n\n this.flushing = this.flushDirty();\n try {\n await this.flushing;\n } finally {\n this.flushing = undefined;\n }\n }\n\n private async flushDirty(): Promise<void> {\n while (this.dirty) {\n this.dirty = false;\n await this.save();\n }\n }\n}\n"],"mappings":"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"}
|