acpx 0.16.0 → 0.17.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.
Files changed (36) hide show
  1. package/README.md +2 -0
  2. package/dist/{cli-BkYIxj_N.js → cli-CiyfEC7L.js} +5 -4
  3. package/dist/{cli-BkYIxj_N.js.map → cli-CiyfEC7L.js.map} +1 -1
  4. package/dist/cli.d.ts +1 -1
  5. package/dist/cli.js +33 -26
  6. package/dist/cli.js.map +1 -1
  7. package/dist/{client-5levcBIs.d.ts → client-C6NUFqr-.d.ts} +12 -6
  8. package/dist/client-C6NUFqr-.d.ts.map +1 -0
  9. package/dist/{flows-Bxs4udrs.js → flows-CTOdIk-m.js} +6 -5
  10. package/dist/{flows-Bxs4udrs.js.map → flows-CTOdIk-m.js.map} +1 -1
  11. package/dist/flows.d.ts +2 -2
  12. package/dist/flows.js +1 -1
  13. package/dist/{invocation-options-BY4lxkn3.js → invocation-options-DbCcOAzM.js} +4 -3
  14. package/dist/{invocation-options-BY4lxkn3.js.map → invocation-options-DbCcOAzM.js.map} +1 -1
  15. package/dist/ipc-D3akHMEq.js +3350 -0
  16. package/dist/ipc-D3akHMEq.js.map +1 -0
  17. package/dist/output-BPPjvJTI.js +980 -0
  18. package/dist/output-BPPjvJTI.js.map +1 -0
  19. package/dist/{live-checkpoint-BEfxBKCh.js → queue-owner-runtime--IbbndGz.js} +3052 -1852
  20. package/dist/queue-owner-runtime--IbbndGz.js.map +1 -0
  21. package/dist/runtime.d.ts +99 -12
  22. package/dist/runtime.d.ts.map +1 -1
  23. package/dist/runtime.js +308 -69
  24. package/dist/runtime.js.map +1 -1
  25. package/dist/{session-options-t3d-F4dn.d.ts → session-options-Dp6mzNSy.d.ts} +2 -2
  26. package/dist/{session-options-t3d-F4dn.d.ts.map → session-options-Dp6mzNSy.d.ts.map} +1 -1
  27. package/dist/session-watch--UX5dh00.js +76 -0
  28. package/dist/session-watch--UX5dh00.js.map +1 -0
  29. package/dist/watch-BbBxO-kb.js +32 -0
  30. package/dist/watch-BbBxO-kb.js.map +1 -0
  31. package/package.json +1 -1
  32. package/skills/acpx/SKILL.md +5 -2
  33. package/dist/client-5levcBIs.d.ts.map +0 -1
  34. package/dist/live-checkpoint-BEfxBKCh.js.map +0 -1
  35. package/dist/output-uo5a27KB.js +0 -4711
  36. package/dist/output-uo5a27KB.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-D3akHMEq.js","names":["asRecord","fs","asRecord","delay","asRecord","parseNonEmptyString","hasStringFields","isPositiveInteger","asRecord","fs","fs","asRecord","fs"],"sources":["../src/errors.ts","../src/types.ts","../src/acp/error-shapes.ts","../src/process-liveness.ts","../src/state-files.ts","../src/session/event-log.ts","../src/acp/jsonrpc.ts","../src/perf-metrics.ts","../src/session/journal.ts","../src/acp/agent-session-id.ts","../src/session/persistence/serialize.ts","../src/acp/builtin-command-migration.ts","../src/session/persistence/parse.ts","../src/persisted-key-policy.ts","../src/session/persistence/index.ts","../src/session/persistence/repository.ts","../src/prompt-content.ts","../src/session/queue/paths.ts","../src/session/queue/lease-store.ts","../src/session/queue/ipc-transport.ts","../src/session/queue/ipc-health.ts","../src/session/queue/messages.ts","../src/session/queue/request-limit.ts","../src/session/queue/ipc.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 const spawnCode = cause instanceof Error ? (cause as NodeJS.ErrnoException).code : undefined;\n const spawnEnoent = spawnCode === \"ENOENT\";\n const message = spawnEnoent\n ? `Failed to spawn agent command: ${agentCommand}. The agent process could not start because a required executable, interpreter, working directory, or other launch path was not found. Check the command, effective PATH, and working directory, or verify the custom agent's configured argv.`\n : `Failed to spawn agent command: ${agentCommand}`;\n super(message, {\n cause: cause instanceof Error ? cause : undefined,\n ...(spawnEnoent\n ? {\n detailCode: \"AGENT_SPAWN_ENOENT\",\n }\n : {}),\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 CreateElicitationRequest,\n ElicitationContentValue,\n JsonRpcId,\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 type AcpPermissionHandler = (\n request: AcpPermissionRequest,\n context: { signal: AbortSignal },\n) => Promise<AcpPermissionDecision | undefined>;\n\nexport const ACP_ELICITATION_MODES = [\"form\", \"url\"] as const;\nexport type AcpElicitationMode = (typeof ACP_ELICITATION_MODES)[number];\nexport type AcpElicitationRequest = CreateElicitationRequest;\n\nexport type AcpElicitationContext = {\n /** Exact JSON-RPC id of the outer `elicitation/create` request. */\n requestId: JsonRpcId;\n /** Aborts with the request itself or its owning prompt turn/session. */\n signal: AbortSignal;\n};\n\ntype AcpElicitationResponseMeta = {\n _meta?: Record<string, unknown> | null;\n};\n\nexport type AcpElicitationResponse =\n | ({\n action: \"accept\";\n content?: Record<string, ElicitationContentValue> | null;\n } & AcpElicitationResponseMeta)\n | ({ action: \"decline\" } & AcpElicitationResponseMeta)\n | ({ action: \"cancel\" } & AcpElicitationResponseMeta);\n\nexport type AcpElicitationHandler = (\n request: AcpElicitationRequest,\n context: AcpElicitationContext,\n) => Promise<AcpElicitationResponse>;\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 | \"session/request_permission\"\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 AcpProcessLaunchScope =\n | Readonly<{ kind: \"client\" }>\n | Readonly<{ kind: \"runtime-session\"; sessionKey: string }>\n | Readonly<{ kind: \"runtime-probe\"; agent: string }>;\n\nexport type AcpProcessLaunch = Readonly<{\n launchId: string;\n scope: AcpProcessLaunchScope;\n command: string;\n args: readonly string[];\n cwd: string;\n}>;\n\nexport type AcpProcessStarted = AcpProcessLaunch &\n Readonly<{\n pid: number;\n startedAt: string;\n }>;\n\nexport type AcpProcessSpawnFailure = AcpProcessLaunch &\n Readonly<{\n error: unknown;\n failedAt: string;\n }>;\n\nexport type AcpProcessExit = AcpProcessStarted &\n Readonly<{\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n exitedAt: string;\n }>;\n\n/**\n * Optional process lifecycle seam for embedding hosts that persist their own\n * launch ownership. Pre-spawn and spawned hooks are admission boundaries:\n * rejecting either aborts startup, and a process rejected after spawn is\n * terminated before the error is returned. Failure and exit hooks are\n * best-effort observations and cannot replace the launch or exit outcome.\n */\nexport type AcpProcessLifecycle = {\n onBeforeSpawn?: (launch: AcpProcessLaunch) => Promise<void> | void;\n onSpawned?: (process: AcpProcessStarted) => Promise<void> | void;\n onSpawnFailed?: (failure: AcpProcessSpawnFailure) => Promise<void> | void;\n onExit?: (exit: AcpProcessExit) => Promise<void> | void;\n};\n\nexport type AcpClientOptions = {\n agentCommand: string;\n agentArgv?: string[];\n /** Trusted child-only environment overlay; never persisted as session options. */\n agentProcessEnv?: Record<string, 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 fs?: boolean;\n terminal?: boolean;\n elicitationModes?: readonly AcpElicitationMode[];\n processLifecycle?: AcpProcessLifecycle;\n processLaunchScope?: AcpProcessLaunchScope;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n sessionOptions?: {\n model?: string;\n allowedTools?: string[];\n maxTurns?: number;\n systemPrompt?: string | { append: string };\n env?: Record<string, 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?: AcpPermissionHandler;\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 thought_tokens?: number;\n total_tokens?: number;\n};\n\nexport type SessionUsageCost = {\n amount?: number;\n currency?: string;\n};\n\nexport type SessionAvailableCommand = {\n name: string;\n description?: string;\n has_input?: boolean;\n};\n\nexport type SessionConversation = {\n title?: string | null;\n messages: SessionMessage[];\n updated_at: string;\n cumulative_token_usage: SessionTokenUsage;\n cumulative_cost?: SessionUsageCost;\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_model_names?: Record<string, string>;\n model_control?: \"config_option\" | \"legacy_set_model\";\n available_commands?: SessionAvailableCommand[];\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 env?: Record<string, 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 agentArgv?: 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 cumulative_cost?: SessionUsageCost;\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 _meta?: Record<string, unknown> | null;\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 response?: SetSessionConfigOptionResponse;\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","export function 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","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { tempFile } from \"@openclaw/fs-safe/advanced\";\n\nexport async function writePrivateFile(\n filePath: string,\n content: string | Uint8Array,\n options: { privateDirectory?: boolean } = {},\n): Promise<void> {\n const privateDirectory = options.privateDirectory !== false;\n await fs.mkdir(path.dirname(filePath), {\n recursive: true,\n mode: privateDirectory ? 0o700 : undefined,\n });\n const directory = await fs.realpath(path.dirname(filePath));\n if (privateDirectory && process.platform !== \"win32\") {\n await fs.chmod(directory, 0o700);\n }\n await using temporary = await tempFile({\n rootDir: directory,\n prefix: \"acpx-write\",\n fileName: \"record.json\",\n });\n const handle = await fs.open(temporary.path, \"wx\", 0o600);\n try {\n await handle.writeFile(content, \"utf8\");\n await handle.chmod(0o600);\n } finally {\n await handle.close();\n }\n\n // Stage on the same filesystem, then retain ordinary last-writer-wins rename\n // semantics without persistent locks or post-publication inode requirements.\n await fs.rename(temporary.path, path.join(directory, path.basename(filePath)));\n}\n\nexport async function writePrivateJsonFile(filePath: string, value: unknown): Promise<void> {\n await writePrivateFile(filePath, `${JSON.stringify(value, null, 2)}\\n`);\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","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\nexport function isAcpMessageObject(value: unknown): value is AnyMessage {\n return asRecord(value) !== null;\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 parsePermissionNotice(message: AnyMessage): string | undefined {\n if (!Object.hasOwn(message, \"id\") || !Object.hasOwn(message, \"result\")) {\n return undefined;\n }\n const result = asRecord((message as { result?: unknown }).result);\n const notice = asRecord(asRecord(result?._meta)?.acpx)?.permissionNotice;\n return typeof notice === \"string\" ? notice : 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 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","import type { Stats } from \"node:fs\";\nimport type { FileHandle } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { root, type OpenResult } from \"@openclaw/fs-safe\";\nimport { statRegularFile } from \"@openclaw/fs-safe/advanced\";\nimport { z } from \"zod\";\nimport { isAcpJsonRpcMessage } from \"../acp/jsonrpc.js\";\nimport { AcpxOperationalError } from \"../errors.js\";\nimport type { AcpJsonRpcMessage, SessionRecord } from \"../types.js\";\nimport { sessionEventActivePath, sessionEventSegmentPath } from \"./event-log.js\";\n\nexport type SessionWatchResult =\n | {\n status: \"completed\" | \"cancelled\";\n stopReason?: string;\n _meta?: Record<string, unknown> | null;\n }\n | {\n status: \"failed\";\n error: { message: string; code?: string; detailCode?: string; retryable?: boolean };\n };\n\nexport type SessionWatchEvent = { cursor: string } & (\n | { type: \"message\"; requestId: string | null; message: AcpJsonRpcMessage }\n | { type: \"turn_started\"; requestId: string }\n | { type: \"turn_result\"; requestId: string; result: SessionWatchResult }\n);\n\nexport const SESSION_JOURNAL_SCHEMA = \"acpx.session.journal.v1\";\nconst sequenceSchema = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER);\nconst resultSchema = z.union([\n z.object({\n status: z.enum([\"completed\", \"cancelled\"]),\n stopReason: z.string().optional(),\n _meta: z.record(z.string(), z.unknown()).nullable().optional(),\n }),\n z.object({\n status: z.literal(\"failed\"),\n error: z.object({\n message: z.string(),\n code: z.string().optional(),\n detailCode: z.string().optional(),\n retryable: z.boolean().optional(),\n }),\n }),\n]);\nconst markerSchema = z.discriminatedUnion(\"type\", [\n z.object({\n schema: z.literal(SESSION_JOURNAL_SCHEMA),\n type: z.literal(\"segment\"),\n record_id: z.string(),\n sequence: sequenceSchema,\n message_sequence: sequenceSchema,\n request_id: z.string().nullable(),\n }),\n z.object({\n schema: z.literal(SESSION_JOURNAL_SCHEMA),\n type: z.literal(\"turn_started\"),\n request_id: z.string().min(1),\n }),\n z.object({\n schema: z.literal(SESSION_JOURNAL_SCHEMA),\n type: z.literal(\"turn_result\"),\n request_id: z.string().min(1),\n result: resultSchema,\n }),\n]);\n\nexport type SessionJournalMarker = z.infer<typeof markerSchema>;\ntype JournalEvent = SessionWatchEvent & { sequence: number };\ntype JournalPage = { events: JournalEvent[]; after: number; bytes: number; maxBytes: number };\ntype JournalReadOptions = { after?: number; maxBytes?: number };\nconst WATCH_PAGE_BYTES = 1024 * 1024;\n\nfunction createJournalPage(options: JournalReadOptions = {}): JournalPage {\n const maxBytes = options.maxBytes ?? Infinity;\n if (!(maxBytes > 0)) {\n throw new Error(\"Session journal page size must be positive\");\n }\n return { events: [], after: options.after ?? -1, bytes: 0, maxBytes };\n}\n\nfunction pageFull(page: JournalPage | undefined): boolean {\n return page !== undefined && page.bytes >= page.maxBytes;\n}\n\nfunction eventSink(\n page: JournalPage | undefined,\n sequence: number,\n bytes: number,\n): JournalEvent[] | undefined {\n if (!page || sequence <= page.after) {\n return undefined;\n }\n page.bytes += bytes;\n return page.events;\n}\n\nexport class SessionWatchError extends AcpxOperationalError {\n constructor(\n readonly code:\n | \"WATCH_CURSOR_INVALID\"\n | \"WATCH_CURSOR_FOREIGN\"\n | \"WATCH_CURSOR_EXPIRED\"\n | \"WATCH_CURSOR_FUTURE\"\n | \"WATCH_OWNER_UNSUPPORTED\"\n | \"WATCH_OUTCOME_UNKNOWN\"\n | \"WATCH_JOURNAL_CORRUPT\",\n message: string,\n ) {\n super(message, {\n outputCode: code.startsWith(\"WATCH_CURSOR_\") ? \"USAGE\" : \"RUNTIME\",\n detailCode: code,\n origin: \"runtime\",\n retryable: false,\n });\n }\n}\n\nfunction corrupt(message: string): never {\n throw new SessionWatchError(\"WATCH_JOURNAL_CORRUPT\", message);\n}\n\nfunction sessionWatchCursor(recordId: string, sequence: number): string {\n return Buffer.from(JSON.stringify([recordId, sequence])).toString(\"base64url\");\n}\n\nfunction parseCursor(recordId: string, cursor: string): number {\n let value: unknown;\n try {\n value = JSON.parse(Buffer.from(cursor, \"base64url\").toString(\"utf8\"));\n } catch {\n throw new SessionWatchError(\"WATCH_CURSOR_INVALID\", \"Invalid session watch cursor\");\n }\n const parsed = z.tuple([z.string(), sequenceSchema]).safeParse(value);\n if (!parsed.success || sessionWatchCursor(...parsed.data) !== cursor) {\n throw new SessionWatchError(\"WATCH_CURSOR_INVALID\", \"Invalid session watch cursor\");\n }\n if (parsed.data[0] !== recordId) {\n throw new SessionWatchError(\"WATCH_CURSOR_FOREIGN\", \"Cursor belongs to another session\");\n }\n return parsed.data[1];\n}\n\ntype OpenSegment = { filePath: string; opened: OpenResult; identity: string };\ntype SegmentState = {\n offset: number;\n pending: Buffer;\n firstSequence?: number;\n sequence: number;\n messageSequence: number;\n requestId: string | null;\n};\n\nfunction fileIdentity(stat: Stats): string {\n return `${stat.dev}:${stat.ino}:${stat.birthtimeMs}`;\n}\n\nfunction emptySegment(): SegmentState {\n return { offset: 0, pending: Buffer.alloc(0), sequence: 0, messageSequence: 0, requestId: null };\n}\n\nfunction retryableSnapshotError(error: unknown): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"not-found\" || error.code === \"path-mismatch\")\n );\n}\n\nexport class SessionJournalReader {\n private readonly states = new Map<string, SegmentState>();\n\n constructor(\n private readonly record: { acpxRecordId: string; eventLog: { max_segments: number } },\n ) {}\n\n private paths(): string[] {\n const paths: string[] = [];\n for (let index = this.record.eventLog.max_segments; index > 0; index -= 1) {\n paths.push(sessionEventSegmentPath(this.record.acpxRecordId, index));\n }\n paths.push(sessionEventActivePath(this.record.acpxRecordId));\n return paths;\n }\n\n private async openSnapshot(signal?: AbortSignal): Promise<OpenSegment[]> {\n for (;;) {\n signal?.throwIfAborted();\n const segments: OpenSegment[] = [];\n try {\n const paths = await this.openPresentSegments(segments);\n // Pin all files before reading: path renumbering must not skip or duplicate a segment.\n const current = await Promise.all(paths.map((filePath) => statRegularFile(filePath)));\n const identities = new Map(segments.map((entry) => [entry.filePath, entry.identity]));\n if (\n paths.every((filePath, index) => {\n const entry = current[index];\n return (\n (entry.missing ? undefined : fileIdentity(entry.stat)) === identities.get(filePath)\n );\n })\n ) {\n return segments;\n }\n } catch (error) {\n if (!retryableSnapshotError(error)) {\n await this.closeSnapshot(segments);\n throw error;\n }\n }\n await this.closeSnapshot(segments);\n await delay(5, undefined, { signal });\n }\n }\n\n private async openPresentSegments(segments: OpenSegment[]): Promise<string[]> {\n const paths = this.paths();\n const present = await Promise.all(paths.map((filePath) => statRegularFile(filePath)));\n if (present.every((entry) => entry.missing)) {\n return paths;\n }\n const directory = await root(path.dirname(paths[0]));\n const results = await Promise.allSettled(\n paths\n .filter((_, index) => !present[index].missing)\n .map(async (filePath) => {\n const opened = await directory.open(path.basename(filePath), {\n symlinks: \"reject\",\n nonBlockingRead: true,\n });\n return { filePath, opened, identity: fileIdentity(opened.stat) };\n }),\n );\n let failure: unknown;\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n segments.push(result.value);\n } else {\n failure ??= result.reason;\n }\n }\n if (failure) {\n throw failure;\n }\n return paths;\n }\n\n private async closeSnapshot(segments: OpenSegment[]): Promise<void> {\n await Promise.all(segments.map(({ opened }) => opened[Symbol.asyncDispose]()));\n }\n\n async readAcpMessages(): Promise<AcpJsonRpcMessage[]> {\n const segments = await this.openSnapshot();\n const messages: AcpJsonRpcMessage[] = [];\n try {\n for (const { opened } of segments) {\n const payload = await opened.handle.readFile(\"utf8\");\n for (const line of payload.split(\"\\n\")) {\n try {\n const value: unknown = JSON.parse(line);\n if (isAcpJsonRpcMessage(value)) {\n messages.push(value);\n }\n } catch {\n // Preserve the existing ACP-only snapshot tolerance for malformed lines.\n }\n }\n }\n return messages;\n } finally {\n await this.closeSnapshot(segments);\n }\n }\n\n async readTail(): Promise<{\n sequence: number;\n messageSequence?: number;\n requestId: string | null;\n activeSize: number;\n activeAnchored: boolean;\n activePartial: boolean;\n }> {\n const segments = await this.openSnapshot();\n let tail = emptySegment();\n let active = emptySegment();\n try {\n // A segment anchor makes recovery independent of the rest of retained history.\n for (const segment of segments.toReversed()) {\n const state = emptySegment();\n await this.readSegment(segment.opened.handle, segment.opened.stat.size, state, undefined);\n if (segment.filePath === sessionEventActivePath(this.record.acpxRecordId)) {\n active = state;\n }\n if (state.firstSequence !== undefined) {\n tail = state;\n break;\n }\n }\n return {\n sequence: tail.sequence,\n messageSequence: tail.firstSequence === undefined ? undefined : tail.messageSequence,\n requestId: tail.requestId,\n activeSize: active.offset,\n activeAnchored: active.firstSequence !== undefined,\n activePartial: active.pending.length > 0,\n };\n } finally {\n await this.closeSnapshot(segments);\n }\n }\n\n async read(\n signal?: AbortSignal,\n options?: JournalReadOptions,\n ): Promise<{\n events: JournalEvent[];\n hasMore: boolean;\n firstSequence?: number;\n sequence: number;\n messageSequence: number;\n requestId: string | null;\n activeSize: number;\n activeAnchored: boolean;\n activePartial: boolean;\n }> {\n const page = createJournalPage(options);\n const segments = await this.openSnapshot(signal);\n let hasMore = false;\n let firstSequence: number | undefined;\n let tail = emptySegment();\n let active = emptySegment();\n try {\n for (const segment of segments) {\n const state = this.states.get(segment.identity) ?? emptySegment();\n await this.readSegment(\n segment.opened.handle,\n segment.opened.stat.size,\n state,\n page,\n signal,\n );\n this.states.set(segment.identity, state);\n if (state.firstSequence !== undefined) {\n if (firstSequence === undefined) {\n firstSequence = state.firstSequence;\n } else if (state.firstSequence !== tail.sequence) {\n corrupt(\"Session journal segments are not contiguous\");\n }\n tail = state;\n }\n if (segment.filePath === sessionEventActivePath(this.record.acpxRecordId)) {\n active = state;\n }\n if (pageFull(page)) {\n hasMore = true;\n break;\n }\n }\n this.pruneStates(segments);\n return {\n events: page.events,\n hasMore,\n firstSequence,\n sequence: tail.sequence,\n messageSequence: tail.messageSequence,\n requestId: tail.requestId,\n activeSize: active.offset,\n activeAnchored: active.firstSequence !== undefined,\n activePartial: active.pending.length > 0,\n };\n } finally {\n await this.closeSnapshot(segments);\n }\n }\n\n private pruneStates(segments: OpenSegment[]): void {\n const retained = new Set(segments.map((entry) => entry.identity));\n for (const identity of this.states.keys()) {\n if (!retained.has(identity)) {\n this.states.delete(identity);\n }\n }\n }\n\n private async readSegment(\n handle: FileHandle,\n size: number,\n state: SegmentState,\n page: JournalPage | undefined,\n signal?: AbortSignal,\n ): Promise<void> {\n if (size < state.offset) {\n corrupt(\"Session journal was truncated while watching\");\n }\n const buffer = Buffer.alloc(Math.min(64 * 1024, size - state.offset));\n for (;;) {\n signal?.throwIfAborted();\n this.consumePending(state, page);\n if (pageFull(page) || state.offset >= size) {\n return;\n }\n const { bytesRead } = await handle.read(\n buffer,\n 0,\n Math.min(buffer.length, size - state.offset),\n state.offset,\n );\n if (bytesRead === 0) {\n corrupt(\"Session journal changed while reading\");\n }\n state.offset += bytesRead;\n state.pending = Buffer.concat([state.pending, buffer.subarray(0, bytesRead)]);\n }\n }\n\n private consumePending(state: SegmentState, page: JournalPage | undefined): void {\n const pending = state.pending;\n let start = 0;\n for (let end = pending.indexOf(10); end >= 0; end = pending.indexOf(10, start)) {\n this.consumeLine(pending.subarray(start, end).toString(\"utf8\"), state, page, end - start + 1);\n start = end + 1;\n if (pageFull(page)) {\n break;\n }\n }\n state.pending = Buffer.from(pending.subarray(start));\n }\n\n private consumeLine(\n line: string,\n state: SegmentState,\n page: JournalPage | undefined,\n bytes: number,\n ): void {\n const entry = decodeJournalLine(line, state.firstSequence !== undefined);\n if (!entry) {\n return;\n }\n if (entry.type === \"marker\") {\n this.consumeMarker(entry.marker, state, page, bytes);\n return;\n }\n if (state.firstSequence === undefined) {\n return;\n }\n this.advance(state);\n state.messageSequence += 1;\n eventSink(page, state.sequence, bytes)?.push({\n ...this.eventPosition(state),\n type: \"message\",\n requestId: state.requestId,\n message: entry.message,\n });\n }\n\n private advance(state: SegmentState): void {\n state.sequence += 1;\n if (!Number.isSafeInteger(state.sequence)) {\n corrupt(\"Session journal sequence exceeds its supported range\");\n }\n }\n\n private eventPosition(state: SegmentState): { sequence: number; cursor: string } {\n return {\n sequence: state.sequence,\n cursor: sessionWatchCursor(this.record.acpxRecordId, state.sequence),\n };\n }\n\n private consumeMarker(\n marker: SessionJournalMarker,\n state: SegmentState,\n page: JournalPage | undefined,\n bytes: number,\n ): void {\n if (marker.type === \"segment\") {\n this.acceptAnchor(marker, state);\n return;\n }\n if (state.firstSequence === undefined) {\n corrupt(\"Session journal lifecycle record has no segment anchor\");\n }\n this.advance(state);\n if (marker.type === \"turn_started\") {\n state.requestId = marker.request_id;\n eventSink(page, state.sequence, bytes)?.push({\n ...this.eventPosition(state),\n type: \"turn_started\",\n requestId: state.requestId,\n });\n } else {\n if (state.requestId !== marker.request_id) {\n corrupt(\"Session journal result does not match the active request\");\n }\n eventSink(page, state.sequence, bytes)?.push({\n ...this.eventPosition(state),\n type: \"turn_result\",\n requestId: state.requestId,\n result: marker.result,\n });\n state.requestId = null;\n }\n }\n\n private acceptAnchor(\n anchor: Extract<SessionJournalMarker, { type: \"segment\" }>,\n state: SegmentState,\n ): void {\n if (state.firstSequence !== undefined || anchor.record_id !== this.record.acpxRecordId) {\n corrupt(\"Invalid session journal segment anchor\");\n }\n state.firstSequence = anchor.sequence;\n state.sequence = anchor.sequence;\n state.messageSequence = anchor.message_sequence;\n state.requestId = anchor.request_id;\n }\n}\n\nfunction decodeJournalLine(\n line: string,\n anchored: boolean,\n):\n | { type: \"message\"; message: AcpJsonRpcMessage }\n | { type: \"marker\"; marker: SessionJournalMarker }\n | undefined {\n let value: unknown;\n try {\n value = JSON.parse(line);\n } catch {\n if (anchored) {\n corrupt(\"Invalid complete line in session journal\");\n }\n return undefined;\n }\n if (isAcpJsonRpcMessage(value)) {\n return { type: \"message\", message: value };\n }\n const marker = markerSchema.safeParse(value);\n if (marker.success) {\n return { type: \"marker\", marker: marker.data };\n }\n if (anchored || hasJournalSchema(value)) {\n corrupt(\"Invalid record in session journal\");\n }\n return undefined;\n}\n\nfunction hasJournalSchema(value: unknown): boolean {\n return value !== null && typeof value === \"object\" && \"schema\" in value;\n}\n\ntype WatchSessionOptions = {\n record: SessionRecord | Promise<SessionRecord>;\n cursor?: string;\n signal?: AbortSignal;\n continueWatching?: (record: SessionRecord, pendingRequestId: string | null) => Promise<boolean>;\n};\n\nexport function watchSession(options: WatchSessionOptions): AsyncIterable<SessionWatchEvent> {\n return {\n [Symbol.asyncIterator]() {\n const stopped = new AbortController();\n const signal = options.signal\n ? AbortSignal.any([options.signal, stopped.signal])\n : stopped.signal;\n const iterator = iterateSession({ ...options, signal });\n return {\n next: () => iterator.next(),\n return: async () => {\n stopped.abort();\n return await iterator.return();\n },\n };\n },\n };\n}\n\nasync function* iterateSession(\n options: WatchSessionOptions & { signal: AbortSignal },\n): AsyncGenerator<SessionWatchEvent, void> {\n const { signal } = options;\n if (signal.aborted) {\n return;\n }\n const record = await settleUnlessAborted(Promise.resolve(options.record), signal);\n if (!record) {\n return;\n }\n yield* iterateJournal(record, options);\n}\n\nasync function* iterateJournal(\n record: SessionRecord,\n options: WatchSessionOptions & { signal: AbortSignal },\n): AsyncGenerator<SessionWatchEvent, void> {\n const { signal } = options;\n let after = options.cursor === undefined ? -1 : parseCursor(record.acpxRecordId, options.cursor);\n const reader = new SessionJournalReader(record);\n let first = true;\n for (;;) {\n if (signal.aborted) {\n return;\n }\n const snapshot = await settleUnlessAborted(\n reader.read(signal, { after, maxBytes: WATCH_PAGE_BYTES }),\n signal,\n );\n if (!snapshot) {\n return;\n }\n assertRetainedCursor(after, snapshot, first);\n first = false;\n for (const { sequence, ...event } of snapshot.events) {\n if (signal.aborted) {\n return;\n }\n after = sequence;\n yield event;\n }\n if (!(await continueAfterPage(record, snapshot, options))) {\n return;\n }\n }\n}\n\nasync function continueAfterPage(\n record: SessionRecord,\n snapshot: { hasMore: boolean; requestId: string | null },\n options: WatchSessionOptions & { signal: AbortSignal },\n): Promise<boolean> {\n if (!snapshot.hasMore && options.continueWatching) {\n const keep = await settleUnlessAborted(\n options.continueWatching(record, snapshot.requestId),\n options.signal,\n );\n if (!keep) {\n return false;\n }\n }\n await settleUnlessAborted(\n delay(snapshot.hasMore ? 0 : 100, undefined, { signal: options.signal }),\n options.signal,\n );\n return !options.signal.aborted;\n}\n\nfunction assertRetainedCursor(\n after: number,\n snapshot: { firstSequence?: number; sequence: number },\n first: boolean,\n): void {\n if (after < 0) {\n return;\n }\n if (after > snapshot.sequence) {\n throw new SessionWatchError(\n first ? \"WATCH_CURSOR_FUTURE\" : \"WATCH_CURSOR_EXPIRED\",\n \"Cursor is beyond the available session journal\",\n );\n }\n if (snapshot.firstSequence !== undefined && after < snapshot.firstSequence) {\n throw new SessionWatchError(\n \"WATCH_CURSOR_EXPIRED\",\n \"Cursor is older than retained session history\",\n );\n }\n}\n\nasync function settleUnlessAborted<T>(\n operation: Promise<T>,\n signal?: AbortSignal,\n): Promise<T | undefined> {\n try {\n return await operation;\n } catch (error) {\n if (signal?.aborted) {\n return undefined;\n }\n throw error;\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 { normalizeAgentSessionId } from \"../../acp/agent-session-id.js\";\nimport type { SessionRecord } from \"../../types.js\";\nimport { SESSION_RECORD_SCHEMA } from \"../../types.js\";\n\nexport function serializeSessionRecordForDisk(record: SessionRecord): Record<string, unknown> {\n return {\n schema: SESSION_RECORD_SCHEMA,\n acpx_record_id: record.acpxRecordId,\n acp_session_id: record.acpSessionId,\n agent_session_id: normalizeAgentSessionId(record.agentSessionId),\n agent_command: record.agentCommand,\n agent_argv: record.agentArgv,\n cwd: record.cwd,\n name: record.name,\n created_at: record.createdAt,\n last_used_at: record.lastUsedAt,\n last_seq: record.lastSeq,\n last_request_id: record.lastRequestId,\n event_log: record.eventLog,\n closed: record.closed,\n closed_at: record.closedAt,\n pid: record.pid,\n agent_started_at: record.agentStartedAt,\n last_prompt_at: record.lastPromptAt,\n last_agent_exit_code: record.lastAgentExitCode,\n last_agent_exit_signal: record.lastAgentExitSignal,\n last_agent_exit_at: record.lastAgentExitAt,\n last_agent_disconnect_reason: record.lastAgentDisconnectReason,\n protocol_version: record.protocolVersion,\n agent_capabilities: record.agentCapabilities,\n title: record.title,\n messages: record.messages,\n updated_at: record.updated_at,\n cumulative_token_usage: record.cumulative_token_usage,\n cumulative_cost: record.cumulative_cost,\n request_token_usage: record.request_token_usage,\n acpx: record.acpx,\n imported_from: record.importedFrom\n ? {\n record_id: record.importedFrom.recordId,\n cwd_original: record.importedFrom.cwdOriginal,\n exported_by: record.importedFrom.exportedBy,\n exported_at: record.importedFrom.exportedAt,\n }\n : undefined,\n };\n}\n","import { AGENT_ARGV_REGISTRY, AGENT_REGISTRY, BUILT_IN_AGENT_PACKAGES } from \"../agent-registry.js\";\n\nconst LEGACY_AGENT_COMMANDS: Record<string, string[]> = {\n pi: [\"npx pi-acp\", \"npx pi-acp@^0.0.22\", \"npx pi-acp@^0.0.26\"],\n codex: [\n \"npx @zed-industries/codex-acp\",\n \"npx @zed-industries/codex-acp@^0.9.5\",\n \"npx @zed-industries/codex-acp@^0.10.0\",\n \"npx @zed-industries/codex-acp@^0.11.1\",\n \"npx @zed-industries/codex-acp@^0.12.0\",\n \"npx -y @agentclientprotocol/codex-acp@^0.0.44\",\n \"npx -y @agentclientprotocol/codex-acp@^1.1.4\",\n ],\n claude: [\n \"npx @zed-industries/claude-agent-acp\",\n \"npx -y @zed-industries/claude-agent-acp\",\n \"npx -y @zed-industries/claude-agent-acp@^0.21.0\",\n \"npx -y @zed-industries/claude-agent-acp@^0.23.1\",\n \"npx -y @zed-industries/claude-agent-acp@^0.24.2\",\n \"npx -y @zed-industries/claude-agent-acp@^0.25.0\",\n \"npx -y @zed-industries/claude-agent-acp@^0.31.0\",\n \"npx -y @agentclientprotocol/claude-agent-acp@^0.36.1\",\n \"npx -y @agentclientprotocol/claude-agent-acp@^0.37.0\",\n \"npm exec @agentclientprotocol/claude-agent-acp@^0.36.1\",\n \"npm exec @agentclientprotocol/claude-agent-acp@^0.37.0\",\n ],\n gemini: [\"gemini\", \"gemini --experimental-acp\"],\n kiro: [\"kiro-cli acp\"],\n mux: [\"npx -y mux@^0.27.0 acp\"],\n opencode: [\"npx opencode-ai\"],\n};\n\nfunction currentArgv(name: string): string[] | undefined {\n const argv = AGENT_ARGV_REGISTRY[name];\n return argv ? [...argv] : undefined;\n}\n\nexport function resolveAgentArgvForCommand(agentCommand: string): string[] | undefined {\n for (const [name, command] of Object.entries(AGENT_REGISTRY)) {\n if (command === agentCommand) {\n return currentArgv(name);\n }\n }\n for (const [name, spec] of Object.entries(BUILT_IN_AGENT_PACKAGES)) {\n const legacyCommands: readonly string[] = spec.legacyFallbackCommands ?? [];\n if (legacyCommands.includes(agentCommand)) {\n return currentArgv(name);\n }\n }\n for (const [name, commands] of Object.entries(LEGACY_AGENT_COMMANDS)) {\n if (commands.includes(agentCommand)) {\n return currentArgv(name);\n }\n }\n return undefined;\n}\n","import { normalizeAgentSessionId } from \"../../acp/agent-session-id.js\";\nimport { resolveAgentArgvForCommand } from \"../../acp/builtin-command-migration.js\";\nimport 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\";\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 parseOptionalAgentArgv(value: unknown): string[] | undefined {\n return isStringArray(value) && value.length > 0 && value[0]?.length > 0 ? value : undefined;\n}\n\nfunction parsePersistedAgentArgv(record: Record<string, unknown>): string[] | undefined {\n return (\n parseOptionalAgentArgv(record.agent_argv) ??\n (typeof record.agent_command === \"string\"\n ? resolveAgentArgvForCommand(record.agent_command)\n : undefined)\n );\n}\n\nfunction hasModelConfigOption(options: unknown): boolean {\n if (!Array.isArray(options)) {\n return false;\n }\n return options.some((entry) => {\n const option = asRecord(entry);\n return option?.category === \"model\" || option?.id === \"model\";\n });\n}\n\nfunction parseConfigOptions(raw: unknown): SessionAcpxState[\"config_options\"] | undefined {\n if (!Array.isArray(raw) || !raw.every((entry) => asRecord(entry) !== undefined)) {\n return undefined;\n }\n return raw as SessionAcpxState[\"config_options\"];\n}\n\nfunction parseAvailableCommand(\n raw: unknown,\n): NonNullable<SessionAcpxState[\"available_commands\"]>[number] | undefined {\n if (typeof raw === \"string\") {\n const name = raw.trim();\n return name ? { name } : undefined;\n }\n const record = asRecord(raw);\n if (!record) {\n return undefined;\n }\n const name = parseNonEmptyString(record.name);\n if (!name) {\n return undefined;\n }\n const description = parseNonEmptyString(record.description);\n return {\n name,\n ...(description ? { description } : {}),\n ...(typeof record.has_input === \"boolean\" ? { has_input: record.has_input } : {}),\n };\n}\n\nfunction parseAvailableCommands(raw: unknown): SessionAcpxState[\"available_commands\"] | undefined {\n if (!Array.isArray(raw)) {\n return undefined;\n }\n const commands = raw\n .map((entry) => parseAvailableCommand(entry))\n .filter(\n (entry): entry is NonNullable<SessionAcpxState[\"available_commands\"]>[number] =>\n entry !== undefined,\n );\n return commands.length > 0 ? commands : undefined;\n}\n\nfunction parseNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\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 \"thought_tokens\",\n \"total_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 parseUsageCost(raw: unknown): SessionConversation[\"cumulative_cost\"] | null | undefined {\n if (raw === undefined || raw === null) {\n return undefined;\n }\n const record = asRecord(raw);\n if (!record) {\n return null;\n }\n return parseUsageCostRecord(record);\n}\n\nfunction parseUsageCostRecord(\n record: Record<string, unknown>,\n): SessionConversation[\"cumulative_cost\"] | null | undefined {\n const amount = parseCostAmount(record.amount);\n const currency = parseCostCurrency(record.currency);\n if (amount === null || currency === null) {\n return null;\n }\n const cost: NonNullable<SessionConversation[\"cumulative_cost\"]> = {\n ...(amount !== undefined ? { amount } : {}),\n ...(currency !== undefined ? { currency } : {}),\n };\n return Object.keys(cost).length > 0 ? cost : undefined;\n}\n\nfunction parseCostAmount(value: unknown): number | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n return isNonNegativeFiniteNumber(value) ? value : null;\n}\n\nfunction parseCostCurrency(value: unknown): string | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n return null;\n }\n const currency = value.trim();\n return currency.length > 0 ? currency : undefined;\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 cumulativeCost = parseUsageCost(record.cumulative_cost);\n const requestTokenUsage = parseRequestTokenUsage(record.request_token_usage);\n if (cumulativeTokenUsage === null || cumulativeCost === 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 cumulative_cost: cumulativeCost,\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 if (record.reset_on_next_ensure === true) {\n state.reset_on_next_ensure = true;\n }\n assignStringState(state, \"current_mode_id\", record.current_mode_id);\n assignStringState(state, \"desired_mode_id\", record.desired_mode_id);\n\n const desiredConfigOptions = parseStringMap(record.desired_config_options);\n if (desiredConfigOptions) {\n state.desired_config_options = desiredConfigOptions;\n }\n\n const modelNames = parseStringMap(record.available_model_names, true);\n if (modelNames) {\n state.available_model_names = modelNames;\n }\n\n assignParsedModelState(state, record);\n\n const availableCommands = parseAvailableCommands(record.available_commands);\n if (availableCommands) {\n state.available_commands = availableCommands;\n }\n\n assignParsedSessionOptions(state, record.session_options);\n\n return state;\n}\n\nfunction assignParsedModelState(state: SessionAcpxState, record: Record<string, unknown>): void {\n assignStringState(state, \"current_model_id\", record.current_model_id);\n if (isStringArray(record.available_models)) {\n state.available_models = [...record.available_models];\n }\n if (record.model_control === \"config_option\" || record.model_control === \"legacy_set_model\") {\n state.model_control = record.model_control;\n }\n const configOptions = parseConfigOptions(record.config_options);\n if (configOptions) {\n state.config_options = configOptions;\n }\n if (state.model_control === undefined && state.available_models !== undefined) {\n state.model_control = hasModelConfigOption(state.config_options)\n ? \"config_option\"\n : \"legacy_set_model\";\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 parseStringMap(raw: unknown, preserveEmpty = false): Record<string, string> | undefined {\n const record = asRecord(raw);\n if (!record) {\n return undefined;\n }\n const parsed = Object.fromEntries(\n Object.entries(record).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n return Object.keys(parsed).length > 0 || preserveEmpty ? parsed : undefined;\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 if (typeof sessionOptions.model === \"string\") {\n parsedSessionOptions.model = sessionOptions.model;\n }\n if (isStringArray(sessionOptions.allowed_tools)) {\n parsedSessionOptions.allowed_tools = [...sessionOptions.allowed_tools];\n }\n if (isPositiveInteger(sessionOptions.max_turns)) {\n parsedSessionOptions.max_turns = sessionOptions.max_turns;\n }\n assignSessionOptionSystemPrompt(parsedSessionOptions, sessionOptions.system_prompt);\n const env = parseStringMap(sessionOptions.env);\n if (env) {\n parsedSessionOptions.env = env;\n }\n\n if (Object.keys(parsedSessionOptions).length > 0) {\n state.session_options = parsedSessionOptions;\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 return isPositiveInteger(value) ? value : null;\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: normalizeAgentSessionId(record.agent_session_id),\n agentCommand: record.agent_command,\n agentArgv: parsePersistedAgentArgv(record),\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 cumulative_cost: conversation.cumulative_cost,\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","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([\n \"request_token_usage\",\n \"messages.Agent.tool_results\",\n \"acpx.session_options.env\",\n \"acpx.available_model_names\",\n]);\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 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) && !ZED_TAG_KEYS.has(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 { writePrivateJsonFile } from \"../../state-files.js\";\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 await writePrivateJsonFile(filePath, {\n schema: SESSION_INDEX_SCHEMA,\n files: index.files.toSorted(),\n entries: index.entries.toSorted((a, b) => b.lastUsedAt.localeCompare(a.lastUsedAt)),\n });\n}\n\nexport async function rebuildSessionIndex(sessionDir: string): Promise<SessionIndex> {\n const index = await scanSessionIndex(sessionDir);\n await writeSessionIndex(sessionDir, index);\n return index;\n}\n\nexport async function scanSessionIndex(sessionDir: string): Promise<SessionIndex> {\n const files = await listSessionFiles(sessionDir).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n });\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 records during discovery and cache rebuilding.\n }\n }\n\n return {\n schema: SESSION_INDEX_SCHEMA,\n files,\n entries: indexEntries.toSorted((a, b) => b.lastUsedAt.localeCompare(a.lastUsedAt)),\n };\n}\n\nexport async function loadOrRebuildSessionIndex(sessionDir: string): Promise<SessionIndex> {\n const files = await listSessionFiles(sessionDir);\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\nasync function listSessionFiles(sessionDir: string): Promise<string[]> {\n return (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}\n","import { statSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\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 { writePrivateJsonFile } from \"../../state-files.js\";\nimport type { SessionRecord } from \"../../types.js\";\nimport { safeSessionId, sessionBaseDir } from \"../event-log.js\";\nimport {\n loadOrRebuildSessionIndex,\n rebuildSessionIndex,\n scanSessionIndex,\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 readOnly?: 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 = safeSessionId(acpxRecordId);\n return path.join(sessionBaseDir(), `${safeId}.json`);\n}\n\nasync function ensureSessionDir(): Promise<void> {\n await fs.mkdir(sessionBaseDir(), { recursive: true, mode: 0o700 });\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(readOnly = false): Promise<SessionIndexEntry[]> {\n if (!readOnly) {\n await ensureSessionDir();\n }\n const index = await measurePerf(\"session.index_load\", async () => {\n const load = readOnly ? scanSessionIndex : loadOrRebuildSessionIndex;\n return await load(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 const persisted = serializeSessionRecordForDisk(record);\n assertPersistedKeyPolicy(persisted);\n\n const file = sessionFilePath(record.acpxRecordId);\n await writePrivateJsonFile(file, persisted);\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 try {\n const directRecord = await measurePerf(\n \"session.resolve_direct\",\n async () => await readSessionRecord(sessionId),\n );\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\n/** Reads a canonical record without creating directories or rebuilding the lookup index. */\nexport async function readSessionRecord(sessionId: string): Promise<SessionRecord | undefined> {\n let payload: string;\n try {\n payload = await fs.readFile(sessionFilePath(sessionId), \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n try {\n return parseSessionRecord(JSON.parse(payload)) ?? undefined;\n } catch {\n return undefined;\n }\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(options.readOnly);\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\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 = safeSessionId(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","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 { createHash } from \"node:crypto\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nfunction shortHash(value: string, length: number): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, length);\n}\n\nexport function queueKeyForSession(sessionId: string): string {\n return shortHash(sessionId, 24);\n}\n\nexport function queueBaseDir(homeDir: string = os.homedir()): string {\n return path.join(homeDir, \".acpx\", \"queues\");\n}\n\nexport function queueSocketBaseDir(homeDir: string = os.homedir()): string | undefined {\n if (process.platform === \"win32\") {\n return undefined;\n }\n return path.join(\"/tmp\", `acpx-${shortHash(homeDir, 10)}`);\n}\n\nexport function queueLockFilePath(sessionId: string, homeDir: string = os.homedir()): string {\n return path.join(queueBaseDir(homeDir), `${queueKeyForSession(sessionId)}.lock`);\n}\n\nexport function queueSocketPath(sessionId: string, homeDir: string = os.homedir()): string {\n const key = queueKeyForSession(sessionId);\n if (process.platform === \"win32\") {\n return `\\\\\\\\.\\\\pipe\\\\acpx-${key}`;\n }\n return path.join(queueSocketBaseDir(homeDir) ?? \"/tmp\", `${key}.sock`);\n}\n","import { randomInt } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { withTempFile } from \"@openclaw/fs-safe/advanced\";\nimport { isHardlinkFallbackError } from \"@openclaw/fs-safe/durability\";\nimport { isProcessAlive } from \"../../process-liveness.js\";\nimport { queueBaseDir, queueLockFilePath, queueSocketBaseDir, queueSocketPath } from \"./paths.js\";\n\nexport { isProcessAlive } from \"../../process-liveness.js\";\n\n// Budget for graceful SIGTERM shutdown of a queue-owner process.\n// Allow the client's eight-second descendant cleanup budget plus cancellation\n// and event-loop headroom before forcibly terminating the owner itself.\nconst PROCESS_SIGTERM_GRACE_MS = process.platform === \"win32\" ? 4_000 : 12_000;\n// After SIGKILL the OS terminates the process almost immediately; 1 500 ms is generous.\nconst PROCESS_SIGKILL_GRACE_MS = 1_500;\nconst PROCESS_POLL_MS = 50;\nconst QUEUE_OWNER_STALE_HEARTBEAT_MS = 15_000;\n\nexport type QueueOwnerRecord = {\n pid: number;\n sessionId: string;\n socketPath: string;\n createdAt: string;\n heartbeatAt: string;\n ownerGeneration: number;\n queueDepth: number;\n sharedRuntime?: boolean;\n sessionWatch?: boolean;\n mcpConfigPath?: string;\n mcpConfigFingerprint?: string;\n};\n\ntype QueueOwnerIdentity = Pick<QueueOwnerRecord, \"pid\" | \"sessionId\" | \"ownerGeneration\">;\n\nexport type QueueOwnerLease = QueueOwnerIdentity & {\n lockPath: string;\n socketPath: string;\n createdAt: string;\n mcpConfigPath?: string;\n mcpConfigFingerprint?: string;\n updates: Promise<void>;\n released: boolean;\n};\n\nexport type QueueOwnerStatus = {\n pid: number;\n socketPath: string;\n heartbeatAt: string;\n ownerGeneration: number;\n queueDepth: number;\n alive: boolean;\n stale: boolean;\n};\n\nfunction parseQueueOwnerRecord(raw: unknown): QueueOwnerRecord | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n const record = raw as Record<string, unknown>;\n\n if (!hasValidQueueOwnerRecordFields(record)) {\n return null;\n }\n\n return {\n pid: record.pid,\n sessionId: record.sessionId,\n socketPath: record.socketPath,\n createdAt: record.createdAt,\n heartbeatAt: record.heartbeatAt,\n ownerGeneration: record.ownerGeneration,\n queueDepth: record.queueDepth,\n ...(record.sharedRuntime === true ? { sharedRuntime: true } : {}),\n ...(record.sessionWatch === true ? { sessionWatch: true } : {}),\n ...(typeof record.mcpConfigPath === \"string\" ? { mcpConfigPath: record.mcpConfigPath } : {}),\n ...(typeof record.mcpConfigFingerprint === \"string\"\n ? { mcpConfigFingerprint: record.mcpConfigFingerprint }\n : {}),\n };\n}\n\nfunction hasValidQueueOwnerRecordFields(\n record: Record<string, unknown>,\n): record is Record<string, unknown> &\n Pick<\n QueueOwnerRecord,\n | \"pid\"\n | \"sessionId\"\n | \"socketPath\"\n | \"createdAt\"\n | \"heartbeatAt\"\n | \"ownerGeneration\"\n | \"queueDepth\"\n > {\n return (\n !Array.isArray(record) &&\n isPositiveInteger(record.pid) &&\n typeof record.sessionId === \"string\" &&\n typeof record.socketPath === \"string\" &&\n typeof record.createdAt === \"string\" &&\n typeof record.heartbeatAt === \"string\" &&\n isPositiveInteger(record.ownerGeneration) &&\n isNonNegativeInteger(record.queueDepth)\n );\n}\n\nfunction isPositiveInteger(value: unknown): value is number {\n return Number.isInteger(value) && (value as number) > 0;\n}\n\nfunction isNonNegativeInteger(value: unknown): value is number {\n return Number.isInteger(value) && (value as number) >= 0;\n}\n\nfunction createOwnerGeneration(): number {\n return randomInt(1, 2 ** 48);\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction isQueueOwnerHeartbeatStale(owner: QueueOwnerRecord): boolean {\n const heartbeatMs = Date.parse(owner.heartbeatAt);\n if (!Number.isFinite(heartbeatMs)) {\n return true;\n }\n return Date.now() - heartbeatMs > QUEUE_OWNER_STALE_HEARTBEAT_MS;\n}\n\nasync function ensureQueueDir(): Promise<void> {\n const baseDir = queueBaseDir();\n try {\n await fs.mkdir(baseDir, { recursive: true, mode: 0o700 });\n await fs.chmod(baseDir, 0o700);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to prepare queue directory ${baseDir}: ${message}`, {\n cause: error,\n });\n }\n const socketDir = queueSocketBaseDir();\n if (socketDir) {\n try {\n await fs.mkdir(socketDir, { recursive: true, mode: 0o700 });\n await fs.chmod(socketDir, 0o700);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to prepare queue socket directory ${socketDir}: ${message}`, {\n cause: error,\n });\n }\n }\n}\n\nasync function removeSocketFile(socketPath: string): Promise<void> {\n if (process.platform === \"win32\") {\n return;\n }\n\n try {\n await fs.unlink(socketPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nasync function waitForProcessExit(pid: number, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + Math.max(0, timeoutMs);\n while (Date.now() <= deadline) {\n if (!isProcessAlive(pid)) {\n return true;\n }\n await waitMs(PROCESS_POLL_MS);\n }\n\n return !isProcessAlive(pid);\n}\n\nasync function cleanupQueueOwnerFiles(\n sessionId: string,\n socketPath: string,\n isCurrent: () => Promise<boolean>,\n): Promise<void> {\n if (!(await isCurrent())) {\n return;\n }\n await removeSocketFile(socketPath).catch(() => {\n // ignore stale socket cleanup failures\n });\n\n if (!(await isCurrent())) {\n return;\n }\n await fs.unlink(queueLockFilePath(sessionId)).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n}\n\nasync function ownsQueueLease(owner: QueueOwnerIdentity, requireStale = false): Promise<boolean> {\n const current = await readQueueOwnerRecord(owner.sessionId);\n return (\n current?.pid === owner.pid &&\n current.ownerGeneration === owner.ownerGeneration &&\n current.sessionId === owner.sessionId &&\n (!requireStale || !ownerIsAlive(current) || isQueueOwnerHeartbeatStale(current))\n );\n}\n\nfunction ownerIsAlive(owner: QueueOwnerRecord): boolean {\n return owner.pid === process.pid || isProcessAlive(owner.pid);\n}\n\nexport async function readQueueOwnerRecord(\n sessionId: string,\n): Promise<QueueOwnerRecord | undefined> {\n const lockPath = queueLockFilePath(sessionId);\n try {\n const payload = await fs.readFile(lockPath, \"utf8\");\n const parsed = parseQueueOwnerRecord(JSON.parse(payload));\n return parsed?.sessionId === sessionId ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function terminateProcess(\n pid: number,\n beforeSignal?: (signal: NodeJS.Signals) => Promise<boolean>,\n): Promise<boolean> {\n if (!isProcessAlive(pid)) {\n return false;\n }\n for (const [signal, graceMs] of [\n [\"SIGTERM\", PROCESS_SIGTERM_GRACE_MS],\n [\"SIGKILL\", PROCESS_SIGKILL_GRACE_MS],\n ] as const) {\n if (beforeSignal && !(await beforeSignal(signal))) {\n return false;\n }\n try {\n process.kill(pid, signal);\n } catch {\n return false;\n }\n if (await waitForProcessExit(pid, graceMs)) {\n return true;\n }\n }\n return false;\n}\n\nexport async function resolveUsableQueueOwner(\n sessionId: string,\n owner: QueueOwnerRecord,\n): Promise<QueueOwnerRecord | undefined> {\n if (ownerIsAlive(owner) && !isQueueOwnerHeartbeatStale(owner)) {\n return owner;\n }\n\n await terminateQueueOwnerForSession(sessionId, owner, true);\n const current = await readQueueOwnerRecord(sessionId);\n return current?.pid === owner.pid &&\n current.ownerGeneration === owner.ownerGeneration &&\n ownerIsAlive(current) &&\n !isQueueOwnerHeartbeatStale(current)\n ? current\n : undefined;\n}\n\nexport async function readQueueOwnerStatus(\n sessionId: string,\n): Promise<QueueOwnerStatus | undefined> {\n const observed = await readQueueOwnerRecord(sessionId);\n if (!observed) {\n return undefined;\n }\n\n const owner = await resolveUsableQueueOwner(sessionId, observed);\n if (!owner) {\n return undefined;\n }\n\n return {\n pid: owner.pid,\n socketPath: owner.socketPath,\n heartbeatAt: owner.heartbeatAt,\n ownerGeneration: owner.ownerGeneration,\n queueDepth: owner.queueDepth,\n alive: true,\n stale: isQueueOwnerHeartbeatStale(owner),\n };\n}\n\nexport async function tryAcquireQueueOwnerLease(\n sessionId: string,\n mcpConfigOrNowIsoFactory?:\n | string\n | {\n path?: string;\n fingerprint?: string;\n }\n | (() => string),\n nowIsoFactory: () => string = nowIso,\n): Promise<QueueOwnerLease | undefined> {\n const { mcpConfigPath, clock } = resolveLeaseArguments(mcpConfigOrNowIsoFactory, nowIsoFactory);\n const mcpConfigFingerprint = readMcpConfigFingerprint(mcpConfigOrNowIsoFactory);\n const mcpConfigMetadata = createMcpConfigMetadata(mcpConfigPath, mcpConfigFingerprint);\n await ensureQueueDir();\n const lockPath = queueLockFilePath(sessionId);\n const socketPath = queueSocketPath(sessionId);\n const createdAt = clock();\n const ownerGeneration = createOwnerGeneration();\n const lease: QueueOwnerLease = {\n pid: process.pid,\n sessionId,\n lockPath,\n socketPath,\n createdAt,\n ownerGeneration,\n ...mcpConfigMetadata,\n updates: Promise.resolve(),\n released: false,\n };\n\n try {\n await stageQueueOwnerRecord(\n lease,\n 0,\n () => createdAt,\n async (tempPath, payload) => {\n try {\n await fs.link(tempPath, lockPath);\n } catch (error) {\n if (!isHardlinkFallbackError(error)) {\n throw error;\n }\n // Some volumes cannot hardlink. Preserve exclusive reservation there;\n // collision recovery leaves incomplete, recent reservations alone.\n await fs.writeFile(lockPath, payload, { encoding: \"utf8\", flag: \"wx\", mode: 0o600 });\n }\n },\n );\n await removeSocketFile(socketPath).catch(() => {\n // best-effort stale socket cleanup after ownership is acquired\n });\n return lease;\n } catch (error) {\n return await handleLeaseCollision(sessionId, error);\n }\n}\n\nfunction readMcpConfigFingerprint(\n mcpConfigOrNowIsoFactory:\n | string\n | {\n path?: string;\n fingerprint?: string;\n }\n | (() => string)\n | undefined,\n): string | undefined {\n return typeof mcpConfigOrNowIsoFactory === \"object\"\n ? mcpConfigOrNowIsoFactory?.fingerprint\n : undefined;\n}\n\nfunction createMcpConfigMetadata(\n mcpConfigPath: string | undefined,\n mcpConfigFingerprint: string | undefined,\n): { mcpConfigPath?: string; mcpConfigFingerprint?: string } {\n return {\n ...(mcpConfigPath ? { mcpConfigPath } : {}),\n ...(mcpConfigFingerprint ? { mcpConfigFingerprint } : {}),\n };\n}\n\nasync function handleLeaseCollision(sessionId: string, error: unknown): Promise<undefined> {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n\n const owner = await readQueueOwnerRecord(sessionId);\n if (!owner) {\n await cleanupAbandonedReservation(sessionId);\n return undefined;\n }\n\n await resolveUsableQueueOwner(sessionId, owner);\n return undefined;\n}\n\nasync function cleanupAbandonedReservation(sessionId: string): Promise<void> {\n const lockPath = queueLockFilePath(sessionId);\n try {\n const observed = await fs.lstat(lockPath, { bigint: true });\n if (\n !observed.isFile() ||\n Date.now() - Number(observed.mtimeMs) <= QUEUE_OWNER_STALE_HEARTBEAT_MS\n ) {\n return;\n }\n const raw = await fs.readFile(lockPath, \"utf8\");\n if (await readQueueOwnerRecord(sessionId)) {\n return;\n }\n await cleanupQueueOwnerFiles(sessionId, queueSocketPath(sessionId), async () => {\n const current = await fs.lstat(lockPath, { bigint: true });\n return (\n current.isFile() &&\n current.dev === observed.dev &&\n current.ino === observed.ino &&\n current.mtimeNs === observed.mtimeNs &&\n (await fs.readFile(lockPath, \"utf8\")) === raw\n );\n });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nfunction resolveLeaseArguments(\n mcpConfigOrNowIsoFactory:\n | string\n | {\n path?: string;\n fingerprint?: string;\n }\n | (() => string)\n | undefined,\n nowIsoFactory: () => string,\n): { mcpConfigPath: string | undefined; clock: () => string } {\n if (typeof mcpConfigOrNowIsoFactory === \"string\") {\n return { mcpConfigPath: mcpConfigOrNowIsoFactory, clock: nowIsoFactory };\n }\n if (typeof mcpConfigOrNowIsoFactory === \"function\") {\n return { mcpConfigPath: undefined, clock: mcpConfigOrNowIsoFactory };\n }\n if (mcpConfigOrNowIsoFactory) {\n return { mcpConfigPath: mcpConfigOrNowIsoFactory.path, clock: nowIsoFactory };\n }\n return { mcpConfigPath: undefined, clock: nowIsoFactory };\n}\n\nexport function refreshQueueOwnerLease(\n lease: QueueOwnerLease,\n options: {\n queueDepth: number;\n },\n nowIsoFactory: () => string = nowIso,\n): Promise<void> {\n if (lease.released) {\n return Promise.resolve();\n }\n const update = lease.updates.then(async () => {\n await stageQueueOwnerRecord(lease, options.queueDepth, nowIsoFactory, async (tempPath) => {\n if (await ownsQueueLease(lease)) {\n await fs.rename(tempPath, lease.lockPath);\n }\n });\n });\n lease.updates = update.catch(() => {});\n return update;\n}\n\nasync function stageQueueOwnerRecord(\n lease: QueueOwnerLease,\n queueDepth: number,\n clock: () => string,\n publish: (tempPath: string, payload: string) => Promise<void>,\n): Promise<void> {\n const payload = JSON.stringify(\n {\n pid: process.pid,\n sessionId: lease.sessionId,\n socketPath: lease.socketPath,\n createdAt: lease.createdAt,\n heartbeatAt: clock(),\n ownerGeneration: lease.ownerGeneration,\n queueDepth: Math.max(0, Math.round(queueDepth)),\n sharedRuntime: true,\n sessionWatch: true,\n ...(lease.mcpConfigPath ? { mcpConfigPath: lease.mcpConfigPath } : {}),\n ...(lease.mcpConfigFingerprint ? { mcpConfigFingerprint: lease.mcpConfigFingerprint } : {}),\n },\n null,\n 2,\n );\n await withTempFile(\n { rootDir: path.dirname(lease.lockPath), prefix: \"owner\", fileName: \"lease\" },\n async (tempPath) => {\n await fs.writeFile(tempPath, `${payload}\\n`, { encoding: \"utf8\", flag: \"wx\", mode: 0o600 });\n await publish(tempPath, `${payload}\\n`);\n },\n );\n}\n\nexport async function releaseQueueOwnerLease(lease: QueueOwnerLease): Promise<void> {\n lease.released = true;\n await lease.updates;\n await cleanupQueueOwnerFiles(lease.sessionId, lease.socketPath, () => ownsQueueLease(lease));\n}\n\nexport async function terminateQueueOwnerForSession(\n sessionId: string,\n expectedOwner?: QueueOwnerRecord,\n requireStale = false,\n): Promise<void> {\n const owner = expectedOwner ?? (await readQueueOwnerRecord(sessionId));\n if (!owner || owner.sessionId !== sessionId) {\n return;\n }\n\n if (ownerIsAlive(owner)) {\n // A final queued heartbeat must not undo retirement after SIGTERM.\n await terminateProcess(owner.pid, (signal) =>\n ownsQueueLease(owner, requireStale && signal === \"SIGTERM\"),\n );\n }\n if (ownerIsAlive(owner)) {\n return;\n }\n await cleanupQueueOwnerFiles(sessionId, owner.socketPath, () => ownsQueueLease(owner));\n}\n\nexport async function waitMs(ms: number): Promise<void> {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","import net from \"node:net\";\nimport { measurePerf } from \"../../perf-metrics.js\";\nimport { type QueueOwnerRecord, waitMs } from \"./lease-store.js\";\n\nconst QUEUE_CONNECT_ATTEMPTS = 40;\nexport const QUEUE_CONNECT_RETRY_MS = 50;\nexport const SOCKET_CONNECTION_TIMEOUT_MS = 5000;\n\nfunction shouldRetryQueueConnect(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException).code;\n return code === \"ENOENT\" || code === \"ECONNREFUSED\";\n}\n\nasync function connectToSocket(\n socketPath: string,\n timeoutMs = SOCKET_CONNECTION_TIMEOUT_MS,\n): Promise<net.Socket> {\n return await new Promise<net.Socket>((resolve, reject) => {\n const socket = net.createConnection(socketPath);\n let settled = false;\n\n const timeout = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n socket.destroy();\n reject(new Error(`Connection to ${socketPath} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n const onConnect = () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n socket.off(\"error\", onError);\n resolve(socket);\n };\n const onError = (error: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n socket.off(\"connect\", onConnect);\n reject(error);\n };\n\n socket.once(\"connect\", onConnect);\n socket.once(\"error\", onError);\n });\n}\n\nexport async function connectToQueueOwner(\n owner: QueueOwnerRecord,\n maxAttempts = QUEUE_CONNECT_ATTEMPTS,\n): Promise<net.Socket | undefined> {\n const attempts = Math.max(1, Math.trunc(maxAttempts));\n for (let attempt = 0; attempt < attempts; attempt += 1) {\n try {\n return await measurePerf(\n \"queue.connect\",\n async () => await connectToSocket(owner.socketPath),\n );\n } catch (error) {\n if (!shouldRetryQueueConnect(error)) {\n throw error;\n }\n await waitMs(QUEUE_CONNECT_RETRY_MS);\n }\n }\n\n return undefined;\n}\n","import { connectToQueueOwner } from \"./ipc-transport.js\";\nimport { readQueueOwnerRecord, readQueueOwnerStatus } from \"./lease-store.js\";\n\nexport type QueueOwnerHealth = {\n sessionId: string;\n hasLease: boolean;\n healthy: boolean;\n socketReachable: boolean;\n pidAlive: boolean;\n pid?: number;\n socketPath?: string;\n ownerGeneration?: number;\n queueDepth?: number;\n};\n\nexport async function probeQueueOwnerHealth(sessionId: string): Promise<QueueOwnerHealth> {\n const ownerRecord = await readQueueOwnerRecord(sessionId);\n if (!ownerRecord) {\n return {\n sessionId,\n hasLease: false,\n healthy: false,\n socketReachable: false,\n pidAlive: false,\n };\n }\n\n const owner = await readQueueOwnerStatus(sessionId);\n if (!owner) {\n return {\n sessionId,\n hasLease: false,\n healthy: false,\n socketReachable: false,\n pidAlive: false,\n };\n }\n\n const pidAlive = owner.alive;\n let socketReachable = false;\n try {\n const socket = await connectToQueueOwner(ownerRecord, 2);\n if (socket) {\n socketReachable = true;\n if (!socket.destroyed) {\n socket.end();\n }\n }\n } catch {\n socketReachable = false;\n }\n\n return {\n sessionId,\n hasLease: true,\n healthy: socketReachable,\n socketReachable,\n pidAlive,\n pid: owner.pid,\n socketPath: owner.socketPath,\n ownerGeneration: owner.ownerGeneration,\n queueDepth: owner.queueDepth,\n };\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { toAcpErrorPayload } from \"../../acp/error-shapes.js\";\nimport { isAcpJsonRpcMessage } from \"../../acp/jsonrpc.js\";\nimport { isPromptInput, textPrompt } from \"../../prompt-content.js\";\nimport {\n OUTPUT_ERROR_CODES,\n OUTPUT_ERROR_ORIGINS,\n type AcpClientOptions,\n type OutputErrorAcpPayload,\n type OutputErrorCode,\n type OutputErrorOrigin,\n type PermissionEscalationEvent,\n type PermissionPolicy,\n} from \"../../types.js\";\nimport type {\n AcpJsonRpcMessage,\n NonInteractivePermissionPolicy,\n PermissionMode,\n PromptInput,\n SessionResumePolicy,\n SessionSendResult,\n} from \"../../types.js\";\n\ntype QueueSessionOptions = NonNullable<AcpClientOptions[\"sessionOptions\"]>;\n\nexport type QueueSubmitRequest = {\n type: \"submit_prompt\";\n requestId: string;\n ownerGeneration?: number;\n message: string;\n prompt?: PromptInput;\n permissionMode: PermissionMode;\n resumePolicy?: SessionResumePolicy;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n promptRetries?: number;\n waitForCompletion: boolean;\n reportPromptStarted?: boolean;\n sessionOptions?: QueueSessionOptions;\n};\n\nexport type QueueCancelRequest = {\n type: \"cancel_prompt\";\n requestId: string;\n ownerGeneration?: number;\n targetRequestId?: string;\n};\n\nexport type QueueSetModeRequest = {\n type: \"set_mode\";\n requestId: string;\n ownerGeneration?: number;\n modeId: string;\n timeoutMs?: number;\n};\n\nexport type QueueSetModelRequest = {\n type: \"set_model\";\n requestId: string;\n ownerGeneration?: number;\n modelId: string;\n timeoutMs?: number;\n};\n\nexport type QueueSetConfigOptionRequest = {\n type: \"set_config_option\";\n requestId: string;\n ownerGeneration?: number;\n configId: string;\n value: string;\n timeoutMs?: number;\n};\n\nexport type QueueCloseSessionRequest = {\n type: \"close_session\";\n requestId: string;\n ownerGeneration?: number;\n timeoutMs?: number;\n};\n\nexport type QueueRequest =\n | QueueSubmitRequest\n | QueueCancelRequest\n | QueueSetModeRequest\n | QueueSetModelRequest\n | QueueSetConfigOptionRequest\n | QueueCloseSessionRequest;\n\nexport type QueueOwnerAcceptedMessage = {\n type: \"accepted\" | \"prompt_started\";\n requestId: string;\n ownerGeneration?: number;\n};\n\nexport type QueueOwnerEventMessage = {\n type: \"event\";\n requestId: string;\n ownerGeneration?: number;\n message: AcpJsonRpcMessage;\n};\n\nexport type QueueOwnerPermissionEscalationMessage = {\n type: \"permission_escalation\";\n requestId: string;\n ownerGeneration?: number;\n event: PermissionEscalationEvent;\n};\n\nexport type QueueOwnerResultMessage = {\n type: \"result\";\n requestId: string;\n ownerGeneration?: number;\n result: SessionSendResult;\n};\n\nexport type QueueOwnerCancelResultMessage = {\n type: \"cancel_result\";\n requestId: string;\n ownerGeneration?: number;\n cancelled: boolean;\n};\n\nexport type QueueOwnerSetModeResultMessage = {\n type: \"set_mode_result\";\n requestId: string;\n ownerGeneration?: number;\n modeId: string;\n};\n\nexport type QueueOwnerSetModelResultMessage = {\n type: \"set_model_result\";\n requestId: string;\n ownerGeneration?: number;\n modelId: string;\n response?: SetSessionConfigOptionResponse;\n};\n\nexport type QueueOwnerSetConfigOptionResultMessage = {\n type: \"set_config_option_result\";\n requestId: string;\n ownerGeneration?: number;\n response: SetSessionConfigOptionResponse;\n};\n\nexport type QueueOwnerCloseSessionResultMessage = {\n type: \"close_session_result\";\n requestId: string;\n ownerGeneration?: number;\n closed: boolean;\n};\n\nexport type QueueOwnerErrorMessage = {\n type: \"error\";\n requestId: string;\n ownerGeneration?: number;\n code?: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n outputAlreadyEmitted?: boolean;\n};\n\nexport type QueueOwnerMessage =\n | QueueOwnerAcceptedMessage\n | QueueOwnerEventMessage\n | QueueOwnerPermissionEscalationMessage\n | QueueOwnerResultMessage\n | QueueOwnerCancelResultMessage\n | QueueOwnerSetModeResultMessage\n | QueueOwnerSetModelResultMessage\n | QueueOwnerSetConfigOptionResultMessage\n | QueueOwnerCloseSessionResultMessage\n | QueueOwnerErrorMessage;\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 isPermissionMode(value: unknown): value is PermissionMode {\n return value === \"approve-all\" || value === \"approve-reads\" || value === \"deny-all\";\n}\n\nfunction isSessionResumePolicy(value: unknown): value is SessionResumePolicy {\n return value === \"allow-new\" || value === \"same-session-only\";\n}\n\nfunction isNonInteractivePermissionPolicy(value: unknown): value is NonInteractivePermissionPolicy {\n return value === \"deny\" || value === \"fail\";\n}\n\nfunction isPermissionPolicy(value: unknown): value is PermissionPolicy {\n const record = asRecord(value);\n if (!record) {\n return false;\n }\n return hasValidPermissionRuleLists(record) && hasValidPermissionDefaultAction(record);\n}\n\nfunction hasValidPermissionRuleLists(record: Record<string, unknown>): boolean {\n const stringListKeys = [\"autoApprove\", \"autoDeny\", \"escalate\"] as const;\n for (const key of stringListKeys) {\n if (!isOptionalStringList(record[key])) {\n return false;\n }\n }\n return true;\n}\n\nfunction isOptionalStringList(value: unknown): boolean {\n return value == null || (Array.isArray(value) && value.every((item) => typeof item === \"string\"));\n}\n\nfunction hasValidPermissionDefaultAction(record: Record<string, unknown>): boolean {\n return (\n record.defaultAction == null ||\n record.defaultAction === \"approve\" ||\n record.defaultAction === \"deny\" ||\n record.defaultAction === \"escalate\"\n );\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 isPermissionEscalationEvent(value: unknown): value is PermissionEscalationEvent {\n const event = asRecord(value);\n return (\n !!event &&\n hasRequiredPermissionEscalationFields(event) &&\n hasOptionalStringFields(event, [\"toolName\", \"toolKind\", \"matchedRule\"])\n );\n}\n\nfunction hasRequiredPermissionEscalationFields(event: Record<string, unknown>): boolean {\n return (\n event.type === \"permission_escalation\" &&\n typeof event.sessionId === \"string\" &&\n typeof event.toolCallId === \"string\" &&\n typeof event.toolTitle === \"string\" &&\n event.action === \"escalate\" &&\n typeof event.message === \"string\" &&\n typeof event.timestamp === \"string\"\n );\n}\n\nfunction hasOptionalStringFields(\n record: Record<string, unknown>,\n keys: readonly string[],\n): boolean {\n return keys.every((key) => record[key] == null || typeof record[key] === \"string\");\n}\n\nfunction parseSessionOptions(value: unknown): QueueSessionOptions | null | undefined {\n if (value == null) {\n return undefined;\n }\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const sessionOptions: QueueSessionOptions = {};\n if (!assignSessionModel(sessionOptions, record.model)) {\n return null;\n }\n if (!assignSessionAllowedTools(sessionOptions, record.allowedTools)) {\n return null;\n }\n if (!assignSessionMaxTurns(sessionOptions, record.maxTurns)) {\n return null;\n }\n if (!assignSessionSystemPrompt(sessionOptions, record.systemPrompt)) {\n return null;\n }\n if (!assignSessionEnv(sessionOptions, record.env)) {\n return null;\n }\n\n return sessionOptions;\n}\n\nfunction assignSessionModel(options: QueueSessionOptions, value: unknown): boolean {\n if (value == null) {\n return true;\n }\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return false;\n }\n options.model = value;\n return true;\n}\n\nfunction assignSessionAllowedTools(options: QueueSessionOptions, value: unknown): boolean {\n if (value == null) {\n return true;\n }\n if (!Array.isArray(value) || value.some((tool) => typeof tool !== \"string\")) {\n return false;\n }\n options.allowedTools = value;\n return true;\n}\n\nfunction assignSessionMaxTurns(options: QueueSessionOptions, value: unknown): boolean {\n if (value == null) {\n return true;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return false;\n }\n options.maxTurns = Math.max(1, Math.round(value));\n return true;\n}\n\nfunction assignSessionSystemPrompt(options: QueueSessionOptions, value: unknown): boolean {\n if (value == null) {\n return true;\n }\n if (typeof value === \"string\") {\n options.systemPrompt = value;\n return true;\n }\n const systemPrompt = asRecord(value);\n if (!systemPrompt || typeof systemPrompt.append !== \"string\") {\n return false;\n }\n options.systemPrompt = { append: systemPrompt.append };\n return true;\n}\n\nfunction assignSessionEnv(options: QueueSessionOptions, value: unknown): boolean {\n if (value == null) {\n return true;\n }\n const env = asRecord(value);\n if (!env) {\n return false;\n }\n const entries = Object.entries(env);\n if (entries.some(([, entryValue]) => typeof entryValue !== \"string\")) {\n return false;\n }\n options.env = Object.fromEntries(entries) as Record<string, string>;\n return true;\n}\n\nfunction parseOwnerGeneration(value: unknown): number | undefined | null {\n if (value == null) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isInteger(value) || value <= 0) {\n return null;\n }\n return value;\n}\n\nfunction parseNonNegativeInteger(value: unknown): number | undefined | null {\n if (value == null) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n return null;\n }\n return Math.round(value);\n}\n\nexport function parseQueueRequest(raw: unknown): QueueRequest | null {\n const request = asRecord(raw);\n if (!request || typeof request.type !== \"string\" || typeof request.requestId !== \"string\") {\n return null;\n }\n\n const ownerGeneration = parseOwnerGeneration(request.ownerGeneration);\n if (ownerGeneration === null) {\n return null;\n }\n\n return parseTypedQueueRequest(\n request,\n parseQueueRequestContext(request.requestId, ownerGeneration, request.timeoutMs),\n );\n}\n\ntype QueueRequestContext = {\n requestId: string;\n ownerGeneration: number | undefined;\n timeoutMs: number | undefined;\n};\n\nfunction parseQueueRequestContext(\n requestId: string,\n ownerGeneration: number | undefined,\n timeoutRaw: unknown,\n): QueueRequestContext {\n return {\n requestId,\n ownerGeneration,\n timeoutMs: parsePositiveTimeout(timeoutRaw),\n };\n}\n\nfunction parsePositiveTimeout(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return undefined;\n }\n return Math.round(value);\n}\n\nfunction parseTypedQueueRequest(\n request: Record<string, unknown>,\n context: QueueRequestContext,\n): QueueRequest | null {\n switch (request.type) {\n case \"submit_prompt\":\n return parseSubmitRequest(request, context);\n case \"cancel_prompt\":\n return parseCancelRequest(request, context);\n case \"close_session\":\n return { type: \"close_session\", ...context };\n case \"set_mode\":\n return parseStringFieldRequest(request, context, \"set_mode\", \"modeId\");\n case \"set_model\":\n return parseStringFieldRequest(request, context, \"set_model\", \"modelId\");\n case \"set_config_option\":\n return parseSetConfigOptionRequest(request, context);\n default:\n return null;\n }\n}\n\nfunction parseCancelRequest(\n request: Record<string, unknown>,\n context: QueueRequestContext,\n): QueueCancelRequest | null {\n if (request.targetRequestId != null && !parseNonEmptyString(request.targetRequestId)) {\n return null;\n }\n return {\n type: \"cancel_prompt\",\n requestId: context.requestId,\n ownerGeneration: context.ownerGeneration,\n ...(typeof request.targetRequestId === \"string\"\n ? { targetRequestId: request.targetRequestId }\n : {}),\n };\n}\n\nfunction parseSubmitRequest(\n request: Record<string, unknown>,\n context: QueueRequestContext,\n): QueueSubmitRequest | null {\n const parsed = parseSubmitRequestFields(request);\n if (!parsed) {\n return null;\n }\n\n return {\n ...parsed,\n type: \"submit_prompt\",\n requestId: context.requestId,\n ownerGeneration: context.ownerGeneration,\n prompt: parsed.prompt ?? textPrompt(parsed.message),\n timeoutMs: context.timeoutMs,\n };\n}\n\ntype ParsedSubmitRequestFields = Pick<\n QueueSubmitRequest,\n | \"message\"\n | \"prompt\"\n | \"permissionMode\"\n | \"resumePolicy\"\n | \"nonInteractivePermissions\"\n | \"permissionPolicy\"\n | \"suppressSdkConsoleErrors\"\n | \"promptRetries\"\n | \"waitForCompletion\"\n | \"reportPromptStarted\"\n | \"sessionOptions\"\n>;\n\nfunction parseSubmitRequestFields(\n request: Record<string, unknown>,\n): ParsedSubmitRequestFields | null {\n const parsed = {\n message: typeof request.message === \"string\" ? request.message : null,\n prompt: parseOptionalValue(request.prompt, isPromptInput),\n permissionMode: parseRequiredValue(request.permissionMode, isPermissionMode),\n resumePolicy: parseOptionalValue(request.resumePolicy, isSessionResumePolicy),\n nonInteractivePermissions: parseOptionalValue(\n request.nonInteractivePermissions,\n isNonInteractivePermissionPolicy,\n ),\n permissionPolicy: parseOptionalValue(request.permissionPolicy, isPermissionPolicy),\n suppressSdkConsoleErrors: parseOptionalBoolean(request.suppressSdkConsoleErrors),\n promptRetries: parseNonNegativeInteger(request.promptRetries),\n waitForCompletion:\n typeof request.waitForCompletion === \"boolean\" ? request.waitForCompletion : null,\n reportPromptStarted: parseOptionalBoolean(request.reportPromptStarted),\n sessionOptions: parseSessionOptions(request.sessionOptions),\n };\n if (Object.values(parsed).some((value) => value === null)) {\n return null;\n }\n for (const key of [\n \"resumePolicy\",\n \"permissionPolicy\",\n \"suppressSdkConsoleErrors\",\n \"promptRetries\",\n \"reportPromptStarted\",\n \"sessionOptions\",\n ] as const) {\n if (parsed[key] === undefined) {\n delete parsed[key];\n }\n }\n return parsed as ParsedSubmitRequestFields;\n}\n\nfunction parseOptionalValue<T>(\n value: unknown,\n guard: (value: unknown) => value is T,\n): T | undefined | null {\n if (value == null) {\n return undefined;\n }\n return guard(value) ? value : null;\n}\n\nfunction parseRequiredValue<T>(value: unknown, guard: (value: unknown) => value is T): T | null {\n return guard(value) ? value : null;\n}\n\nfunction parseOptionalBoolean(value: unknown): boolean | undefined | null {\n if (value == null) {\n return undefined;\n }\n return typeof value === \"boolean\" ? value : null;\n}\n\nfunction parseStringFieldRequest<TType extends \"set_mode\" | \"set_model\">(\n request: Record<string, unknown>,\n context: QueueRequestContext,\n type: TType,\n field: \"modeId\" | \"modelId\",\n): Extract<QueueRequest, { type: TType }> | null {\n const value = parseNonEmptyString(request[field]);\n if (!value) {\n return null;\n }\n return { type, ...context, [field]: value } as Extract<QueueRequest, { type: TType }>;\n}\n\nfunction parseSetConfigOptionRequest(\n request: Record<string, unknown>,\n context: QueueRequestContext,\n): QueueSetConfigOptionRequest | null {\n const configId = parseNonEmptyString(request.configId);\n const value = parseNonEmptyString(request.value);\n if (!configId || !value) {\n return null;\n }\n return { type: \"set_config_option\", ...context, configId, value };\n}\n\nfunction parseNonEmptyString(value: unknown): string | null {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return null;\n }\n return value;\n}\n\nfunction parseSessionSendResult(raw: unknown): SessionSendResult | null {\n const result = asRecord(raw);\n if (!result || !hasValidSessionSendResultCore(result)) {\n return null;\n }\n\n const permissionStats = asRecord(result.permissionStats);\n const record = asRecord(result.record);\n if (!permissionStats || !record) {\n return null;\n }\n\n if (!hasValidPermissionStats(permissionStats)) {\n return null;\n }\n\n if (!hasValidSessionRecordShape(record)) {\n return null;\n }\n\n return result as SessionSendResult;\n}\n\nfunction hasValidSessionSendResultCore(result: Record<string, unknown>): boolean {\n return (\n typeof result.stopReason === \"string\" &&\n typeof result.sessionId === \"string\" &&\n typeof result.resumed === \"boolean\" &&\n (result._meta === undefined || result._meta === null || asRecord(result._meta) !== undefined)\n );\n}\n\nfunction hasValidPermissionStats(permissionStats: Record<string, unknown>): boolean {\n return [\"requested\", \"approved\", \"denied\", \"cancelled\"].every(\n (key) => typeof permissionStats[key] === \"number\",\n );\n}\n\nfunction hasValidSessionRecordShape(record: Record<string, unknown>): boolean {\n return (\n hasStringFields(record, [\n \"acpxRecordId\",\n \"acpSessionId\",\n \"agentCommand\",\n \"cwd\",\n \"createdAt\",\n \"lastUsedAt\",\n \"updated_at\",\n ]) &&\n Array.isArray(record.messages) &&\n typeof record.lastSeq === \"number\" &&\n Number.isInteger(record.lastSeq) &&\n !!record.eventLog &&\n typeof record.eventLog === \"object\"\n );\n}\n\nfunction hasStringFields(record: Record<string, unknown>, keys: readonly string[]): boolean {\n return keys.every((key) => typeof record[key] === \"string\");\n}\n\nexport function parseQueueOwnerMessage(raw: unknown): QueueOwnerMessage | null {\n const message = asRecord(raw);\n if (!message || typeof message.type !== \"string\" || typeof message.requestId !== \"string\") {\n return null;\n }\n const ownerGeneration = parseOwnerGeneration(message.ownerGeneration);\n if (ownerGeneration === null) {\n return null;\n }\n\n return parseTypedQueueOwnerMessage(message as TypedQueueOwnerRecord, {\n requestId: message.requestId,\n ownerGeneration,\n });\n}\n\ntype QueueOwnerMessageContext = {\n requestId: string;\n ownerGeneration: number | undefined;\n};\n\ntype TypedQueueOwnerRecord = Record<string, unknown> & { type: string };\n\nfunction parseTypedQueueOwnerMessage(\n message: TypedQueueOwnerRecord,\n context: QueueOwnerMessageContext,\n): QueueOwnerMessage | null {\n const parser = queueOwnerMessageParser(message.type);\n return parser ? parser(message, context) : null;\n}\n\ntype QueueOwnerMessageParser = (\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n) => QueueOwnerMessage | null;\n\nconst QUEUE_OWNER_MESSAGE_PARSERS: Record<string, QueueOwnerMessageParser> = {\n accepted: (_message, context) => ({ type: \"accepted\", ...context }),\n prompt_started: (_message, context) => ({ type: \"prompt_started\", ...context }),\n event: parseEventOwnerMessage,\n permission_escalation: parsePermissionEscalationOwnerMessage,\n result: parseResultOwnerMessage,\n cancel_result: (message, context) =>\n parseBooleanResultOwnerMessage(message, context, \"cancel_result\", \"cancelled\"),\n close_session_result: (message, context) =>\n parseBooleanResultOwnerMessage(message, context, \"close_session_result\", \"closed\"),\n set_mode_result: (message, context) =>\n parseStringResultOwnerMessage(message, context, \"set_mode_result\", \"modeId\"),\n set_model_result: parseSetModelOwnerMessage,\n set_config_option_result: parseSetConfigOptionOwnerMessage,\n error: parseErrorOwnerMessage,\n};\n\nfunction queueOwnerMessageParser(type: string): QueueOwnerMessageParser | undefined {\n return Object.hasOwn(QUEUE_OWNER_MESSAGE_PARSERS, type)\n ? QUEUE_OWNER_MESSAGE_PARSERS[type]\n : undefined;\n}\n\nfunction parseEventOwnerMessage(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n): QueueOwnerEventMessage | null {\n if (!isAcpJsonRpcMessage(message.message)) {\n return null;\n }\n return { type: \"event\", ...context, message: message.message };\n}\n\nfunction parsePermissionEscalationOwnerMessage(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n): QueueOwnerPermissionEscalationMessage | null {\n if (!isPermissionEscalationEvent(message.event)) {\n return null;\n }\n return { type: \"permission_escalation\", ...context, event: message.event };\n}\n\nfunction parseResultOwnerMessage(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n): QueueOwnerResultMessage | null {\n const result = parseSessionSendResult(message.result);\n if (!result) {\n return null;\n }\n return { type: \"result\", ...context, result };\n}\n\nfunction parseBooleanResultOwnerMessage<TType extends \"cancel_result\" | \"close_session_result\">(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n type: TType,\n field: \"cancelled\" | \"closed\",\n): Extract<QueueOwnerMessage, { type: TType }> | null {\n if (typeof message[field] !== \"boolean\") {\n return null;\n }\n return { type, ...context, [field]: message[field] } as Extract<\n QueueOwnerMessage,\n { type: TType }\n >;\n}\n\nfunction parseStringResultOwnerMessage<TType extends \"set_mode_result\" | \"set_model_result\">(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n type: TType,\n field: \"modeId\" | \"modelId\",\n): Extract<QueueOwnerMessage, { type: TType }> | null {\n if (typeof message[field] !== \"string\") {\n return null;\n }\n return { type, ...context, [field]: message[field] } as Extract<\n QueueOwnerMessage,\n { type: TType }\n >;\n}\n\nfunction parseSetModelOwnerMessage(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n): QueueOwnerSetModelResultMessage | null {\n if (typeof message.modelId !== \"string\") {\n return null;\n }\n const response = asRecord(message.response);\n if (message.response !== undefined && (!response || !Array.isArray(response.configOptions))) {\n return null;\n }\n return {\n type: \"set_model_result\",\n ...context,\n modelId: message.modelId,\n ...(response ? { response: response as SetSessionConfigOptionResponse } : {}),\n };\n}\n\nfunction parseSetConfigOptionOwnerMessage(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n): QueueOwnerSetConfigOptionResultMessage | null {\n const response = asRecord(message.response);\n if (!response || !Array.isArray(response.configOptions)) {\n return null;\n }\n return {\n type: \"set_config_option_result\",\n ...context,\n response: response as SetSessionConfigOptionResponse,\n };\n}\n\nfunction parseErrorOwnerMessage(\n message: Record<string, unknown>,\n context: QueueOwnerMessageContext,\n): QueueOwnerErrorMessage | null {\n if (!isValidOwnerErrorCore(message)) {\n return null;\n }\n\n const outputAlreadyEmitted =\n typeof message.outputAlreadyEmitted === \"boolean\" ? message.outputAlreadyEmitted : undefined;\n\n return {\n type: \"error\",\n ...context,\n code: message.code,\n detailCode: parseNonEmptyString(message.detailCode) ?? undefined,\n origin: message.origin,\n message: message.message,\n retryable: typeof message.retryable === \"boolean\" ? message.retryable : undefined,\n acp: toAcpErrorPayload(message.acp),\n ...(outputAlreadyEmitted === undefined ? {} : { outputAlreadyEmitted }),\n };\n}\n\nfunction isValidOwnerErrorCore(message: Record<string, unknown>): message is Record<\n string,\n unknown\n> & {\n code: OutputErrorCode;\n origin: OutputErrorOrigin;\n message: string;\n} {\n return (\n typeof message.message === \"string\" &&\n isOutputErrorCode(message.code) &&\n isOutputErrorOrigin(message.origin)\n );\n}\n","import { QueueProtocolError } from \"../../errors.js\";\n\nexport function queueRequestByteLimit(\n raw = process.env.ACPX_QUEUE_MAX_REQUEST_BYTES,\n): number | undefined {\n if (raw === undefined || raw.trim() === \"\") {\n return undefined;\n }\n const limit = Number(raw);\n if (!Number.isSafeInteger(limit) || limit < 0 || !/^\\d+$/.test(raw.trim())) {\n throw new Error(\n \"ACPX_QUEUE_MAX_REQUEST_BYTES must be a non-negative safe integer; zero is unlimited\",\n );\n }\n return limit || undefined;\n}\n\nexport function queueRequestExceedsLimit(line: string, limit: number | undefined): boolean {\n return limit !== undefined && Buffer.byteLength(line, \"utf8\") > limit;\n}\n\nexport function assertQueueRequestSize(line: string): void {\n const limit = queueRequestByteLimit();\n if (queueRequestExceedsLimit(line, limit)) {\n throw new QueueProtocolError(\n `Queue request exceeded ACPX_QUEUE_MAX_REQUEST_BYTES (${limit} bytes); raise or unset the limit`,\n {\n detailCode: \"QUEUE_REQUEST_TOO_LARGE\",\n origin: \"queue\",\n retryable: false,\n },\n );\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { QueueConnectionError, QueueProtocolError } from \"../../errors.js\";\nimport type {\n AcpClientOptions,\n NonInteractivePermissionPolicy,\n OutputErrorEmissionPolicy,\n OutputFormatter,\n PermissionMode,\n PermissionPolicy,\n PromptInput,\n SessionResumePolicy,\n SessionEnqueueResult,\n SessionSendOutcome,\n} from \"../../types.js\";\nimport { probeQueueOwnerHealth, type QueueOwnerHealth } from \"./ipc-health.js\";\nimport { connectToQueueOwner } from \"./ipc-transport.js\";\nimport {\n resolveUsableQueueOwner,\n type QueueOwnerRecord,\n readQueueOwnerRecord,\n} from \"./lease-store.js\";\nimport {\n parseQueueOwnerMessage,\n type QueueCancelRequest,\n type QueueCloseSessionRequest,\n type QueueOwnerCancelResultMessage,\n type QueueOwnerCloseSessionResultMessage,\n type QueueOwnerMessage,\n type QueueOwnerSetConfigOptionResultMessage,\n type QueueOwnerSetModelResultMessage,\n type QueueOwnerSetModeResultMessage,\n type QueueRequest,\n type QueueSetConfigOptionRequest,\n type QueueSetModelRequest,\n type QueueSetModeRequest,\n type QueueSubmitRequest,\n} from \"./messages.js\";\nimport { assertQueueRequestSize } from \"./request-limit.js\";\n\nexport { QUEUE_CONNECT_RETRY_MS } from \"./ipc-transport.js\";\nexport const MAX_MESSAGE_BUFFER_SIZE = 10 * 1024 * 1024;\nexport {\n isProcessAlive,\n releaseQueueOwnerLease,\n terminateProcess,\n terminateQueueOwnerForSession,\n tryAcquireQueueOwnerLease,\n waitMs,\n} from \"./lease-store.js\";\nexport type { QueueOwnerLease } from \"./lease-store.js\";\n\nexport { probeQueueOwnerHealth };\nexport type { QueueOwnerHealth };\nexport type { QueueOwnerMessage, QueueSubmitRequest } from \"./messages.js\";\nexport type { QueueOwnerControlHandlers, QueueTask } from \"./ipc-server.js\";\nexport { SessionQueueOwner } from \"./ipc-server.js\";\n\nfunction assertOwnerGeneration(\n owner: QueueOwnerRecord,\n message: QueueOwnerMessage,\n): QueueOwnerMessage {\n if (\n owner.ownerGeneration !== undefined &&\n message.ownerGeneration !== undefined &&\n message.ownerGeneration !== owner.ownerGeneration\n ) {\n throw new QueueProtocolError(\"Queue owner returned mismatched generation\", {\n detailCode: \"QUEUE_OWNER_GENERATION_MISMATCH\",\n origin: \"queue\",\n retryable: true,\n });\n }\n return message;\n}\n\ntype QueueOwnerRequestState = {\n acknowledged: boolean;\n};\n\ntype QueueOwnerRequestControls<TResult> = {\n state: QueueOwnerRequestState;\n resolve: (result: TResult) => void;\n reject: (error: unknown) => void;\n};\n\nfunction queueConnectionErrorFromOwner(\n message: Extract<QueueOwnerMessage, { type: \"error\" }>,\n outputAlreadyEmitted: boolean,\n): QueueConnectionError {\n return new QueueConnectionError(message.message, {\n outputCode: message.code,\n detailCode: message.detailCode,\n origin: message.origin ?? \"queue\",\n retryable: message.retryable,\n acp: message.acp,\n ...(outputAlreadyEmitted ? { outputAlreadyEmitted: true } : {}),\n });\n}\n\nfunction makeMalformedQueueMessageError(): QueueProtocolError {\n return new QueueProtocolError(\"Queue owner sent malformed message\", {\n detailCode: \"QUEUE_PROTOCOL_MALFORMED_MESSAGE\",\n origin: \"queue\",\n retryable: true,\n });\n}\n\nfunction notifyObserver(notify: (() => void) | undefined): void {\n try {\n notify?.();\n } catch {\n // A disconnected or throwing observer does not change the admitted operation.\n }\n}\n\nfunction uncertainQueueOutcome(error: unknown): QueueConnectionError | QueueProtocolError {\n const message = error instanceof Error ? error.message : \"Queue request failed\";\n const options = {\n detailCode:\n error instanceof QueueProtocolError ? error.detailCode : \"QUEUE_SUBMISSION_OUTCOME_UNKNOWN\",\n origin: \"queue\" as const,\n retryable: false,\n };\n const ErrorType = error instanceof QueueProtocolError ? QueueProtocolError : QueueConnectionError;\n return new ErrorType(\n `${message}; request outcome is unknown. Do not automatically resubmit.`,\n options,\n );\n}\n\nfunction emitQueueOwnerError(\n formatter: OutputFormatter,\n policy: OutputErrorEmissionPolicy | undefined,\n sessionId: string,\n message: Extract<QueueOwnerMessage, { type: \"error\" }>,\n): QueueConnectionError {\n notifyObserver(() => formatter.setContext({ sessionId }));\n const queueErrorAlreadyEmitted = policy?.queueErrorAlreadyEmitted ?? true;\n const shouldEmitInFormatter = message.outputAlreadyEmitted !== true || !queueErrorAlreadyEmitted;\n if (shouldEmitInFormatter) {\n notifyObserver(() =>\n formatter.onError({\n code: message.code ?? \"RUNTIME\",\n detailCode: message.detailCode,\n origin: message.origin ?? \"queue\",\n message: message.message,\n retryable: message.retryable,\n acp: message.acp,\n }),\n );\n notifyObserver(() => formatter.flush());\n }\n // Mark formatter output as emitted even in quiet mode, so the CLI error\n // handler does not print the same failure again.\n return queueConnectionErrorFromOwner(message, queueErrorAlreadyEmitted || shouldEmitInFormatter);\n}\n\nfunction parseQueueOwnerResponseLine(\n owner: QueueOwnerRecord,\n requestId: string,\n line: string,\n): QueueOwnerMessage {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n throw new QueueProtocolError(\"Queue owner sent invalid JSON payload\", {\n detailCode: \"QUEUE_PROTOCOL_INVALID_JSON\",\n origin: \"queue\",\n retryable: true,\n });\n }\n\n const parsedMessage = parseQueueOwnerMessage(parsed);\n if (!parsedMessage) {\n throw makeMalformedQueueMessageError();\n }\n\n const message = assertOwnerGeneration(owner, parsedMessage);\n if (message.requestId !== requestId) {\n throw makeMalformedQueueMessageError();\n }\n\n return message;\n}\n\nasync function runQueueOwnerRequest<TResult>(options: {\n owner: QueueOwnerRecord;\n request: QueueRequest;\n signal?: AbortSignal;\n onAccepted?: (controls: QueueOwnerRequestControls<TResult>) => void;\n onMessage: (message: QueueOwnerMessage, controls: QueueOwnerRequestControls<TResult>) => void;\n onClose: (controls: QueueOwnerRequestControls<TResult>) => void;\n}): Promise<TResult | undefined> {\n options.signal?.throwIfAborted();\n const requestLine = JSON.stringify(options.request);\n assertQueueRequestSize(requestLine);\n const socket = await connectToQueueOwner(options.owner);\n if (!socket) {\n options.signal?.throwIfAborted();\n return undefined;\n }\n\n socket.setEncoding(\"utf8\");\n\n return await new Promise<TResult>((resolve, reject) => {\n let settled = false;\n let buffer = \"\";\n const state: QueueOwnerRequestState = {\n acknowledged: false,\n };\n\n const finishResolve = (result: TResult) => {\n if (settled) {\n return;\n }\n settled = true;\n options.signal?.removeEventListener(\"abort\", onAbort);\n socket.removeAllListeners();\n if (!socket.destroyed) {\n socket.end();\n }\n resolve(result);\n };\n\n const finishReject = (error: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n options.signal?.removeEventListener(\"abort\", onAbort);\n socket.removeAllListeners();\n if (!socket.destroyed) {\n socket.destroy();\n }\n reject(error);\n };\n\n const onAbort = () => finishReject(options.signal?.reason);\n\n const controls: QueueOwnerRequestControls<TResult> = {\n state,\n resolve: finishResolve,\n reject: finishReject,\n };\n\n const processLine = (line: string): void => {\n let message: QueueOwnerMessage;\n try {\n message = parseQueueOwnerResponseLine(options.owner, options.request.requestId, line);\n } catch (error) {\n finishReject(uncertainQueueOutcome(error));\n return;\n }\n\n if (message.type === \"accepted\") {\n state.acknowledged = true;\n notifyObserver(() => options.onAccepted?.(controls));\n return;\n }\n\n try {\n options.onMessage(message, controls);\n } catch (error) {\n finishReject(uncertainQueueOutcome(error));\n }\n };\n\n socket.on(\"data\", (chunk: string) => {\n buffer += chunk;\n\n if (buffer.length > MAX_MESSAGE_BUFFER_SIZE) {\n socket.destroy();\n finishReject(\n uncertainQueueOutcome(\n new Error(`Message buffer exceeded ${MAX_MESSAGE_BUFFER_SIZE} bytes`),\n ),\n );\n return;\n }\n\n let index = buffer.indexOf(\"\\n\");\n while (index >= 0) {\n if (settled) {\n return;\n }\n const line = buffer.slice(0, index).trim();\n buffer = buffer.slice(index + 1);\n\n if (line.length > 0) {\n processLine(line);\n }\n\n index = buffer.indexOf(\"\\n\");\n }\n });\n\n socket.once(\"error\", (error: Error) => {\n finishReject(uncertainQueueOutcome(error));\n });\n\n socket.once(\"close\", () => {\n if (settled) {\n return;\n }\n options.onClose(controls);\n });\n\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted) {\n onAbort();\n return;\n }\n try {\n socket.write(`${requestLine}\\n`);\n } catch (error) {\n finishReject(uncertainQueueOutcome(error));\n }\n });\n}\n\nexport type SubmitToQueueOwnerOptions = {\n sessionId: string;\n requestId?: string;\n requireSharedRuntime?: boolean;\n signal?: AbortSignal;\n message: string;\n prompt?: PromptInput;\n mcpConfigPath?: string;\n mcpConfigFingerprint?: string;\n permissionMode: PermissionMode;\n resumePolicy?: SessionResumePolicy;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n permissionPolicy?: PermissionPolicy;\n outputFormatter: OutputFormatter;\n errorEmissionPolicy?: OutputErrorEmissionPolicy;\n timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n promptRetries?: number;\n waitForCompletion: boolean;\n verbose?: boolean;\n sessionOptions?: NonNullable<AcpClientOptions[\"sessionOptions\"]>;\n /** Fires when the queue owner acknowledges the request (IPC accept), before completion. */\n onQueueAccepted?: () => void;\n /** Fires only when the owner writes the underlying ACP prompt request. */\n onPromptStarted?: () => void;\n};\n\nfunction missingQueueAckError(): QueueConnectionError {\n return new QueueConnectionError(\"Queue owner did not acknowledge request; outcome unknown\", {\n detailCode: \"QUEUE_ACK_MISSING\",\n origin: \"queue\",\n retryable: false,\n });\n}\n\nfunction unexpectedQueueResponseError(): QueueProtocolError {\n return new QueueProtocolError(\"Queue owner returned unexpected response; outcome unknown\", {\n detailCode: \"QUEUE_PROTOCOL_UNEXPECTED_RESPONSE\",\n origin: \"queue\",\n retryable: false,\n });\n}\n\nfunction handleAcknowledgedSubmitMessage(\n message: QueueOwnerMessage,\n controls: QueueOwnerRequestControls<SessionSendOutcome>,\n formatter: OutputFormatter,\n): void {\n if (message.type === \"event\") {\n notifyObserver(() => formatter.onAcpMessage(message.message));\n return;\n }\n if (message.type === \"permission_escalation\") {\n notifyObserver(() => formatter.onPermissionEscalation(message.event));\n return;\n }\n if (message.type === \"result\") {\n notifyObserver(() => formatter.flush());\n controls.resolve(message.result);\n return;\n }\n controls.reject(unexpectedQueueResponseError());\n}\n\nfunction handleSubmitQueueOwnerMessage(\n message: QueueOwnerMessage,\n controls: QueueOwnerRequestControls<SessionSendOutcome>,\n options: SubmitToQueueOwnerOptions,\n): void {\n if (message.type === \"error\") {\n controls.reject(\n emitQueueOwnerError(\n options.outputFormatter,\n options.errorEmissionPolicy,\n options.sessionId,\n message,\n ),\n );\n return;\n }\n if (!controls.state.acknowledged) {\n controls.reject(missingQueueAckError());\n return;\n }\n if (message.type === \"prompt_started\") {\n notifyObserver(options.onPromptStarted);\n return;\n }\n handleAcknowledgedSubmitMessage(message, controls, options.outputFormatter);\n}\n\nasync function submitToQueueOwner(\n owner: QueueOwnerRecord,\n options: SubmitToQueueOwnerOptions,\n): Promise<SessionSendOutcome | undefined> {\n const requestId = options.requestId ?? randomUUID();\n const request: QueueSubmitRequest = {\n type: \"submit_prompt\",\n requestId,\n ownerGeneration: owner.ownerGeneration,\n message: options.message,\n prompt: options.prompt,\n permissionMode: options.permissionMode,\n resumePolicy: options.resumePolicy,\n nonInteractivePermissions: options.nonInteractivePermissions,\n permissionPolicy: options.permissionPolicy,\n timeoutMs: options.timeoutMs,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n promptRetries: options.promptRetries ?? 0,\n waitForCompletion: options.waitForCompletion,\n ...(options.onPromptStarted ? { reportPromptStarted: true } : {}),\n sessionOptions: options.sessionOptions,\n };\n\n notifyObserver(() =>\n options.outputFormatter.setContext({\n sessionId: options.sessionId,\n }),\n );\n\n return await runQueueOwnerRequest<SessionSendOutcome>({\n owner,\n request,\n signal: options.signal,\n onAccepted: ({ resolve }) => {\n notifyObserver(options.onQueueAccepted);\n notifyObserver(() =>\n options.outputFormatter.setContext({\n sessionId: options.sessionId,\n }),\n );\n if (!options.waitForCompletion) {\n const queued: SessionEnqueueResult = {\n queued: true,\n sessionId: options.sessionId,\n requestId,\n };\n resolve(queued);\n }\n },\n onMessage: (message, controls) => {\n handleSubmitQueueOwnerMessage(message, controls, options);\n },\n onClose: ({ state, resolve, reject }) => {\n if (!state.acknowledged) {\n reject(\n new QueueConnectionError(\n \"Queue owner disconnected before acknowledging request; outcome unknown\",\n {\n detailCode: \"QUEUE_DISCONNECTED_BEFORE_ACK\",\n origin: \"queue\",\n retryable: false,\n },\n ),\n );\n return;\n }\n\n if (!options.waitForCompletion) {\n const queued: SessionEnqueueResult = {\n queued: true,\n sessionId: options.sessionId,\n requestId,\n };\n resolve(queued);\n return;\n }\n\n reject(\n new QueueConnectionError(\n \"Queue owner disconnected before prompt completion; outcome unknown\",\n {\n detailCode: \"QUEUE_DISCONNECTED_BEFORE_COMPLETION\",\n origin: \"queue\",\n retryable: false,\n },\n ),\n );\n },\n });\n}\n\nasync function submitControlToQueueOwner<TResponse extends QueueOwnerMessage>(\n owner: QueueOwnerRecord,\n request: QueueRequest,\n isExpectedResponse: (message: QueueOwnerMessage) => message is TResponse,\n): Promise<TResponse | undefined> {\n return await runQueueOwnerRequest<TResponse>({\n owner,\n request,\n onMessage: (message, { state, resolve, reject }) => {\n if (message.type === \"error\") {\n reject(queueConnectionErrorFromOwner(message, false));\n return;\n }\n\n if (!state.acknowledged) {\n reject(missingQueueAckError());\n return;\n }\n\n if (!isExpectedResponse(message)) {\n reject(unexpectedQueueResponseError());\n return;\n }\n\n resolve(message);\n },\n onClose: ({ state, reject }) => {\n if (!state.acknowledged) {\n reject(\n new QueueConnectionError(\n \"Queue owner disconnected before acknowledging request; outcome unknown\",\n {\n detailCode: \"QUEUE_DISCONNECTED_BEFORE_ACK\",\n origin: \"queue\",\n retryable: false,\n },\n ),\n );\n return;\n }\n\n reject(\n new QueueConnectionError(\"Queue owner disconnected before responding; outcome unknown\", {\n detailCode: \"QUEUE_DISCONNECTED_BEFORE_COMPLETION\",\n origin: \"queue\",\n retryable: false,\n }),\n );\n },\n });\n}\n\nasync function submitCancelToQueueOwner(\n owner: QueueOwnerRecord,\n targetRequestId?: string,\n): Promise<boolean | undefined> {\n if (targetRequestId !== undefined) {\n assertSharedRuntimeOwner(owner);\n }\n const request: QueueCancelRequest = {\n type: \"cancel_prompt\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n ...(targetRequestId !== undefined ? { targetRequestId } : {}),\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerCancelResultMessage => message.type === \"cancel_result\",\n );\n return response?.cancelled;\n}\n\nasync function submitSetModeToQueueOwner(\n owner: QueueOwnerRecord,\n modeId: string,\n timeoutMs?: number,\n): Promise<boolean | undefined> {\n const request: QueueSetModeRequest = {\n type: \"set_mode\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n modeId,\n timeoutMs,\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerSetModeResultMessage => message.type === \"set_mode_result\",\n );\n return response ? true : undefined;\n}\n\nasync function submitSetModelToQueueOwner(\n owner: QueueOwnerRecord,\n modelId: string,\n timeoutMs?: number,\n): Promise<QueueOwnerSetModelResultMessage | undefined> {\n const request: QueueSetModelRequest = {\n type: \"set_model\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n modelId,\n timeoutMs,\n };\n return await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerSetModelResultMessage => message.type === \"set_model_result\",\n );\n}\n\nasync function submitSetConfigOptionToQueueOwner(\n owner: QueueOwnerRecord,\n configId: string,\n value: string,\n timeoutMs?: number,\n): Promise<SetSessionConfigOptionResponse | undefined> {\n const request: QueueSetConfigOptionRequest = {\n type: \"set_config_option\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n configId,\n value,\n timeoutMs,\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerSetConfigOptionResultMessage =>\n message.type === \"set_config_option_result\",\n );\n return response?.response;\n}\n\nasync function submitCloseSessionToQueueOwner(\n owner: QueueOwnerRecord,\n timeoutMs?: number,\n): Promise<boolean | undefined> {\n const request: QueueCloseSessionRequest = {\n type: \"close_session\",\n requestId: randomUUID(),\n ownerGeneration: owner.ownerGeneration,\n timeoutMs,\n };\n const response = await submitControlToQueueOwner(\n owner,\n request,\n (message): message is QueueOwnerCloseSessionResultMessage =>\n message.type === \"close_session_result\",\n );\n return response?.closed;\n}\n\nfunction queueOwnerMcpConfigMatches(\n owner: QueueOwnerRecord,\n options: SubmitToQueueOwnerOptions,\n): boolean {\n return (\n owner.mcpConfigPath === options.mcpConfigPath &&\n owner.mcpConfigFingerprint === options.mcpConfigFingerprint\n );\n}\n\nfunction assertQueueOwnerMcpConfigMatches(\n owner: QueueOwnerRecord,\n options: SubmitToQueueOwnerOptions,\n): void {\n if (queueOwnerMcpConfigMatches(owner, options)) {\n return;\n }\n throw new QueueConnectionError(\n \"Session queue owner uses a different MCP config; close the session before retrying\",\n {\n detailCode: \"QUEUE_MCP_CONFIG_CONFLICT\",\n origin: \"queue\",\n retryable: false,\n },\n );\n}\n\nfunction assertSharedRuntimeOwner(owner: QueueOwnerRecord): void {\n if (owner.sharedRuntime === true) {\n return;\n }\n throw new QueueConnectionError(\n \"The running queue owner predates shared runtime support. Wait for its idle expiry or close the session before retrying.\",\n { detailCode: \"QUEUE_SHARED_RUNTIME_UNSUPPORTED\", origin: \"queue\", retryable: false },\n );\n}\n\nexport async function trySubmitToRunningOwner(\n options: SubmitToQueueOwnerOptions,\n): Promise<SessionSendOutcome | undefined> {\n options.signal?.throwIfAborted();\n const observed = await readQueueOwnerRecord(options.sessionId);\n if (!observed) {\n return undefined;\n }\n const owner = await resolveUsableQueueOwner(options.sessionId, observed);\n if (!owner) {\n return undefined;\n }\n if (options.requireSharedRuntime) {\n assertSharedRuntimeOwner(owner);\n }\n assertQueueOwnerMcpConfigMatches(owner, options);\n\n const submitted = await submitToQueueOwner(owner, options);\n if (submitted) {\n if (options.verbose) {\n process.stderr.write(\n `[acpx] queued prompt on active owner pid ${owner.pid} for session ${options.sessionId}\\n`,\n );\n }\n return submitted;\n }\n\n const health = await probeQueueOwnerHealth(options.sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n\n throw new QueueConnectionError(\n \"Session queue owner is running but not accepting queue requests\",\n {\n detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\",\n origin: \"queue\",\n retryable: true,\n },\n );\n}\n\nasync function tryControlOnRunningOwner<T>(options: {\n sessionId: string;\n verbose?: boolean;\n requestName: string;\n logPrefix: string;\n submit: (owner: QueueOwnerRecord) => Promise<T | undefined>;\n}): Promise<T | undefined> {\n const owner = await readQueueOwnerRecord(options.sessionId);\n if (!owner) {\n return undefined;\n }\n const response = await options.submit(owner);\n if (response !== undefined) {\n if (options.verbose) {\n process.stderr.write(`${options.logPrefix} ${owner.pid} for session ${options.sessionId}\\n`);\n }\n return response;\n }\n const health = await probeQueueOwnerHealth(options.sessionId);\n if (!health.hasLease) {\n return undefined;\n }\n throw new QueueConnectionError(\n `Session queue owner is running but not accepting ${options.requestName} requests`,\n { detailCode: \"QUEUE_NOT_ACCEPTING_REQUESTS\", origin: \"queue\", retryable: true },\n );\n}\n\nexport async function tryCloseSessionOnRunningOwner(options: {\n sessionId: string;\n timeoutMs?: number;\n verbose?: boolean;\n}): Promise<boolean | undefined> {\n return await tryControlOnRunningOwner({\n sessionId: options.sessionId,\n verbose: options.verbose,\n requestName: \"close_session\",\n logPrefix: \"[acpx] requested session/close on active owner pid\",\n submit: (owner) => submitCloseSessionToQueueOwner(owner, options.timeoutMs),\n });\n}\n\nexport async function tryCancelOnRunningOwner(options: {\n sessionId: string;\n verbose?: boolean;\n targetRequestId?: string;\n}): Promise<boolean | undefined> {\n return await tryControlOnRunningOwner({\n sessionId: options.sessionId,\n verbose: options.verbose,\n requestName: \"cancel\",\n logPrefix: \"[acpx] requested cancel on active owner pid\",\n submit: (owner) => submitCancelToQueueOwner(owner, options.targetRequestId),\n });\n}\n\nexport async function trySetModeOnRunningOwner(\n sessionId: string,\n modeId: string,\n timeoutMs: number | undefined,\n verbose: boolean | undefined,\n): Promise<boolean | undefined> {\n return await tryControlOnRunningOwner({\n sessionId,\n verbose,\n requestName: \"set_mode\",\n logPrefix: \"[acpx] requested session/set_mode on owner pid\",\n submit: (owner) => submitSetModeToQueueOwner(owner, modeId, timeoutMs),\n });\n}\n\nexport async function trySetModelOnRunningOwner(\n sessionId: string,\n modelId: string,\n timeoutMs: number | undefined,\n verbose: boolean | undefined,\n): Promise<QueueOwnerSetModelResultMessage | undefined> {\n return await tryControlOnRunningOwner({\n sessionId,\n verbose,\n requestName: \"set_model\",\n logPrefix: \"[acpx] requested a model config update on owner pid\",\n submit: (owner) => submitSetModelToQueueOwner(owner, modelId, timeoutMs),\n });\n}\n\nexport async function trySetConfigOptionOnRunningOwner(\n sessionId: string,\n configId: string,\n value: string,\n timeoutMs: number | undefined,\n verbose: boolean | undefined,\n): Promise<SetSessionConfigOptionResponse | undefined> {\n return await tryControlOnRunningOwner({\n sessionId,\n verbose,\n requestName: \"set_config_option\",\n logPrefix: \"[acpx] requested session/set_config_option on owner pid\",\n submit: (owner) => submitSetConfigOptionToQueueOwner(owner, configId, value, timeoutMs),\n });\n}\n"],"mappings":"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"}