acpx 0.19.0 → 0.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/{agent-registry-Ct2yWPW7.js → agent-registry-DWlx5BQ4.js} +3 -2
  2. package/dist/agent-registry-DWlx5BQ4.js.map +1 -0
  3. package/dist/agent-registry.js +1 -1
  4. package/dist/{cli-Bmki9cj5.js → cli-D-s_eTUy.js} +5 -5
  5. package/dist/{cli-Bmki9cj5.js.map → cli-D-s_eTUy.js.map} +1 -1
  6. package/dist/cli.js +31 -15
  7. package/dist/cli.js.map +1 -1
  8. package/dist/{client-DzaUKazo.d.ts → client-BchvQRpz.d.ts} +8 -1
  9. package/dist/client-BchvQRpz.d.ts.map +1 -0
  10. package/dist/{flows--Ewxn_fQ.js → flows-DdxEaeZo.js} +33 -20
  11. package/dist/flows-DdxEaeZo.js.map +1 -0
  12. package/dist/flows.d.ts +2 -1
  13. package/dist/flows.d.ts.map +1 -1
  14. package/dist/flows.js +1 -1
  15. package/dist/{invocation-options-DRzxHZmr.js → invocation-options-HjxSBsK0.js} +5 -5
  16. package/dist/{invocation-options-DRzxHZmr.js.map → invocation-options-HjxSBsK0.js.map} +1 -1
  17. package/dist/{ipc-fMgj5vrO.js → ipc-D0ZMQ0q9.js} +1393 -86
  18. package/dist/ipc-D0ZMQ0q9.js.map +1 -0
  19. package/dist/{output-D6kDs8BN.js → output-GQnhkJMU.js} +20 -12
  20. package/dist/output-GQnhkJMU.js.map +1 -0
  21. package/dist/{queue-owner-runtime-CLwjMYNL.js → queue-owner-runtime-W0lly6ap.js} +344 -777
  22. package/dist/queue-owner-runtime-W0lly6ap.js.map +1 -0
  23. package/dist/runtime.d.ts +1 -1
  24. package/dist/runtime.d.ts.map +1 -1
  25. package/dist/runtime.js +5 -5
  26. package/dist/runtime.js.map +1 -1
  27. package/dist/{session-watch-BfdIo-n4.js → session-watch-_8yxQ6ba.js} +4 -4
  28. package/dist/{session-watch-BfdIo-n4.js.map → session-watch-_8yxQ6ba.js.map} +1 -1
  29. package/dist/watch-C0mwpJcN.js +85 -0
  30. package/dist/watch-C0mwpJcN.js.map +1 -0
  31. package/package.json +1 -1
  32. package/skills/acpx/SKILL.md +2 -0
  33. package/dist/agent-registry-Ct2yWPW7.js.map +0 -1
  34. package/dist/client-DzaUKazo.d.ts.map +0 -1
  35. package/dist/flows--Ewxn_fQ.js.map +0 -1
  36. package/dist/ipc-fMgj5vrO.js.map +0 -1
  37. package/dist/output-D6kDs8BN.js.map +0 -1
  38. package/dist/queue-owner-runtime-CLwjMYNL.js.map +0 -1
  39. package/dist/watch-DH-zXQH2.js +0 -32
  40. package/dist/watch-DH-zXQH2.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"ipc-fMgj5vrO.js","names":["asRecord","fs","asRecord","delay","asRecord","parseNonEmptyString","hasStringFields","isPositiveInteger","fs","fs","asRecord","IDENTITY_QUERY_TIMEOUT_MS","fs","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/discovery.ts","../src/session/persistence/repository.ts","../src/prompt-content.ts","../src/process-identity.ts","../src/session/lock-owner.ts","../src/session/queue/paths.ts","../src/session/queue/lease-mutation.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(message = \"Permission prompt unavailable in non-interactive mode\") {\n super(message);\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 \"EXEC_DISABLED\",\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\nexport function isProcessDefinitelyDead(pid: number | undefined): boolean {\n if (!pid || !Number.isSafeInteger(pid) || pid <= 0 || pid === process.pid) {\n return false;\n }\n try {\n process.kill(pid, 0);\n return false;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"ESRCH\";\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\nfunction sessionUpdateHasRequiredFields(update: Record<string, unknown>): boolean {\n const kind = update.sessionUpdate;\n if (typeof kind !== \"string\") {\n return false;\n }\n if (\n kind === \"agent_message_chunk\" ||\n kind === \"agent_thought_chunk\" ||\n kind === \"user_message_chunk\"\n ) {\n return isChunkContent(update.content);\n }\n if (kind === \"plan\") {\n return Array.isArray(update.entries) && update.entries.every(isPlanEntry);\n }\n return true;\n}\n\nfunction isChunkContent(value: unknown): boolean {\n const content = asRecord(value);\n return (\n content !== null &&\n typeof content.type === \"string\" &&\n (content.type !== \"text\" || typeof content.text === \"string\")\n );\n}\n\nfunction isPlanEntry(value: unknown): boolean {\n const entry = asRecord(value);\n return entry !== null && typeof entry.status === \"string\" && typeof entry.content === \"string\";\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 || !sessionUpdateHasRequiredFields(update)) {\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 type { SessionRecord } from \"../../types.js\";\nimport { safeSessionId } from \"../event-log.js\";\nimport { parseSessionRecord } from \"./parse.js\";\n\nconst DISCOVERY_BATCH_SIZE = 4;\n\n/** Select and return the same canonical snapshot; cached metadata cannot exclude records. */\nexport async function* scanSessionRecords(sessionDir: string): AsyncGenerator<SessionRecord> {\n const entries = await fs.readdir(sessionDir, { withFileTypes: true }).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n });\n const files = entries\n .filter(\n (entry) => entry.isFile() && entry.name.endsWith(\".json\") && entry.name !== \"index.json\",\n )\n .map((entry) => entry.name)\n .toSorted();\n for (let offset = 0; offset < files.length; offset += DISCOVERY_BATCH_SIZE) {\n const records = await Promise.all(\n files\n .slice(offset, offset + DISCOVERY_BATCH_SIZE)\n .map((file) => readRecord(path.join(sessionDir, file))),\n );\n for (const record of records) {\n if (record) {\n yield record;\n }\n }\n }\n}\n\nasync function readRecord(file: string): Promise<SessionRecord | undefined> {\n try {\n const payload = await fs.readFile(file, \"utf8\");\n const record = parseSessionRecord(JSON.parse(payload));\n return record && path.basename(file) === `${safeSessionId(record.acpxRecordId)}.json`\n ? record\n : undefined;\n } catch {\n // A corrupt or concurrently removed record must not hide other matches.\n return undefined;\n }\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 { scanSessionRecords } from \"./discovery.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* sessionRecords(readOnly = false): AsyncGenerator<SessionRecord> {\n if (!readOnly) {\n await ensureSessionDir();\n }\n yield* scanSessionRecords(sessionBaseDir());\n}\n\nfunction matchesSession(\n session: SessionRecord,\n agentCommand: string,\n normalizedName: string | undefined,\n includeClosed = false,\n): boolean {\n if (session.agentCommand !== agentCommand) {\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\nfunction isNewer(record: SessionRecord, previous: SessionRecord | undefined): boolean {\n return !previous || record.lastUsedAt.localeCompare(previous.lastUsedAt) > 0;\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}\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?.acpxRecordId === sessionId) {\n return directRecord;\n }\n } catch {\n // Fall back to canonical discovery.\n }\n\n const { exactRecords, suffixRecords } = await findSessionIdMatches(sessionId);\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 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\nasync function findSessionIdMatches(\n sessionId: string,\n): Promise<{ exactRecords: SessionRecord[]; suffixRecords: SessionRecord[] }> {\n const exactRecords: SessionRecord[] = [];\n const suffixRecords: SessionRecord[] = [];\n for await (const record of sessionRecords()) {\n if (record.acpxRecordId === sessionId || record.acpSessionId === sessionId) {\n retainMatch(exactRecords, record);\n }\n if (record.acpxRecordId.endsWith(sessionId) || record.acpSessionId.endsWith(sessionId)) {\n retainMatch(suffixRecords, record);\n }\n }\n return { exactRecords, suffixRecords };\n}\n\nfunction retainMatch(matches: SessionRecord[], record: SessionRecord): void {\n if (matches.length < 2) {\n matches.push(record);\n }\n}\n\n/** Reads one canonical record without creating directories or scanning other sessions. */\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 const record = parseSessionRecord(JSON.parse(payload));\n return record?.acpxRecordId === sessionId ? record : 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 return await collectSessionRecords();\n}\n\nexport async function listSessionsForAgent(agentCommand: string): Promise<SessionRecord[]> {\n return await collectSessionRecords(agentCommand);\n}\n\nasync function collectSessionRecords(agentCommand?: string): Promise<SessionRecord[]> {\n const records: SessionRecord[] = [];\n for await (const record of sessionRecords()) {\n if (agentCommand === undefined || record.agentCommand === agentCommand) {\n records.push(record);\n }\n }\n return records.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 let match: SessionRecord | undefined;\n for await (const record of sessionRecords(options.readOnly)) {\n if (\n record.cwd === normalizedCwd &&\n matchesSession(record, options.agentCommand, normalizedName, options.includeClosed) &&\n isNewer(record, match)\n ) {\n match = record;\n }\n }\n return match;\n}\n\nexport async function findSessionByDirectoryWalk(\n options: FindSessionByDirectoryWalkOptions,\n): Promise<SessionRecord | undefined> {\n const normalizedName = normalizeName(options.name);\n const directories = walkDirectories(options);\n let match: SessionRecord | undefined;\n let distance = Infinity;\n for await (const record of sessionRecords()) {\n const candidateDistance = directories.get(record.cwd);\n if (\n candidateDistance !== undefined &&\n matchesSession(record, options.agentCommand, normalizedName) &&\n (candidateDistance < distance || (candidateDistance === distance && isNewer(record, match)))\n ) {\n match = record;\n distance = candidateDistance;\n }\n }\n return match;\n}\n\nfunction walkDirectories(options: FindSessionByDirectoryWalkOptions): Map<string, number> {\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 directories = new Map<string, number>();\n const walkRoot = path.parse(normalizedStart).root;\n let current: string | undefined = normalizedStart;\n while (current) {\n directories.set(current, directories.size);\n current = nextWalkParent(current, walkBoundary, walkRoot);\n }\n return directories;\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 const segmentPrefix = `${safeId}.stream.`;\n return (\n fileName === `${safeId}.stream.ndjson` ||\n fileName === `${safeId}.stream.lock` ||\n (fileName.startsWith(segmentPrefix) &&\n /^\\d+\\.ndjson$/.test(fileName.slice(segmentPrefix.length)))\n );\n}\n\nexport async function pruneSessions(options: PruneOptions = {}): Promise<PruneResult> {\n const cutoff =\n options.before ??\n (options.olderThanMs != null ? new Date(Date.now() - options.olderThanMs) : undefined);\n\n const records = await loadPrunableRecords(cutoff, options.agentCommand);\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 return { pruned: records, bytesFreed, dryRun: false };\n}\n\nfunction isPruneCandidate(\n record: Pick<SessionRecord, \"closed\" | \"agentCommand\">,\n agentCommand: string | undefined,\n): boolean {\n return record.closed === true && (!agentCommand || record.agentCommand === agentCommand);\n}\n\nasync function loadPrunableRecords(\n cutoff: Date | undefined,\n agentCommand: string | undefined,\n): Promise<SessionRecord[]> {\n const records: SessionRecord[] = [];\n const cutoffIso = cutoff?.toISOString();\n for await (const record of sessionRecords()) {\n if (isPruneCandidate(record, agentCommand) && isBeforeCutoff(record, cutoffIso)) {\n records.push(record);\n }\n }\n return records.toSorted((a, b) => b.lastUsedAt.localeCompare(a.lastUsedAt));\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 == null || typeof record.title === \"string\") &&\n 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 typeof record.text === \"string\" || typeof record.blob === \"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 != null && typeof record.title !== \"string\") {\n return `prompt[${index}] resource_link block title must be a string or null when present`;\n }\n if (typeof record.name !== \"string\") {\n return `prompt[${index}] resource_link block must include a string name`;\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 a string text or blob field`;\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 path from \"node:path\";\nimport { runTimedExecFile } from \"./acp/client-process.js\";\nimport { isProcessDefinitelyDead } from \"./process-liveness.js\";\n\ntype TimestampIdentity = {\n kind: \"posix-lstart\" | \"windows-creation\";\n value: string;\n};\n\ntype LinuxProcessScope = {\n bootId: string;\n pidNamespace: string;\n timeNamespace: string;\n};\n\ntype LinuxProcessIdentity = LinuxProcessScope & { kind: \"linux-proc\"; startTicks: string };\n\nexport type ProcessBirthIdentity = TimestampIdentity | LinuxProcessIdentity;\nexport type ProcessIdentityComparison = \"matching\" | \"different\" | \"unknown\";\nexport type ProcessIncarnation = \"matching\" | \"gone\" | \"unknown\";\n\nexport type ProcessIdentityProbe =\n | { state: \"alive\"; identity: ProcessBirthIdentity }\n | { state: \"dead\" }\n | { state: \"unknown\" };\n\nexport type ProcessTableEntry = {\n pid: number;\n parentPid: number;\n groupPid: number;\n birth: string;\n};\n\nconst IDENTITY_QUERY_TIMEOUT_MS = 2_000;\n// A single builtin-only helper bounds proc I/O without leaving uncancellable\n// readlink work in the caller after timeout. Its scope must match the observer,\n// including when a parent configured a different time namespace for children.\nconst LINUX_PROCESS_QUERY = `\n const fs = require('node:fs/promises');\n const [targetPid, observerPid] = process.argv.slice(1);\n if (process.ppid !== Number(observerPid)) process.exit(1);\n const timeNamespace = (pid) => fs.readlink('/proc/' + pid + '/ns/time').catch((error) => {\n if (error.code === 'ENOENT') return 'unsupported';\n throw error;\n });\n Promise.all([\n fs.readFile('/proc/sys/kernel/random/boot_id', 'utf8'),\n fs.readlink('/proc/self/ns/pid'),\n timeNamespace('self'),\n fs.readlink('/proc/' + observerPid + '/ns/pid'),\n timeNamespace(observerPid),\n fs.readFile('/proc/self/stat', 'utf8'),\n fs.readFile('/proc/' + targetPid + '/stat', 'utf8').catch(() => null),\n ]).then(([bootId, pidNamespace, timeNamespace, observerPidNamespace,\n observerTimeNamespace, selfStat, targetStat]) => {\n process.stdout.write(JSON.stringify({bootId: bootId.trim(), pidNamespace,\n timeNamespace, observerPidNamespace, observerTimeNamespace,\n helperPid: process.pid, selfStat, targetStat}));\n }).catch(() => { process.exitCode = 1; });\n`;\nconst POSIX_MONTHS = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\nlet ownIdentity: ProcessBirthIdentity | undefined;\nlet ownIdentityPending: Promise<ProcessBirthIdentity | undefined> | undefined;\n\nexport function parseProcessBirthIdentity(raw: unknown): ProcessBirthIdentity | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return undefined;\n }\n const identity = raw as Record<string, unknown>;\n if (identity.kind === \"linux-proc\") {\n return parseLinuxIdentity(identity);\n }\n if (identity.kind !== \"posix-lstart\" && identity.kind !== \"windows-creation\") {\n return undefined;\n }\n if (!isCanonicalBirth(identity.value, identity.kind)) {\n return undefined;\n }\n return { kind: identity.kind, value: identity.value };\n}\n\nfunction isCanonicalBirth(value: unknown, kind: TimestampIdentity[\"kind\"]): value is string {\n if (\n typeof value !== \"string\" ||\n !/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3,7}Z$/.test(value) ||\n !Number.isFinite(Date.parse(value))\n ) {\n return false;\n }\n const canonical = new Date(value).toISOString();\n return (\n canonical.slice(0, 19) === value.slice(0, 19) &&\n (kind === \"posix-lstart\"\n ? value === canonical && value.endsWith(\".000Z\")\n : /\\.\\d{7}Z$/.test(value))\n );\n}\n\nfunction parseLinuxScope(raw: Record<string, unknown>): LinuxProcessScope | undefined {\n const { bootId, pidNamespace, timeNamespace } = raw;\n if (\n typeof bootId !== \"string\" ||\n !/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/.test(bootId) ||\n typeof pidNamespace !== \"string\" ||\n !/^pid:\\[[1-9]\\d*\\]$/.test(pidNamespace) ||\n !isTimeNamespace(timeNamespace)\n ) {\n return undefined;\n }\n return { bootId, pidNamespace, timeNamespace };\n}\n\nfunction isTimeNamespace(value: unknown): value is string {\n // Kernels without CONFIG_TIME_NS have no /proc/PID/ns/time entry. The helper\n // recognizes only ENOENT, not denied access, as this explicit shared scope.\n return (\n typeof value === \"string\" && (value === \"unsupported\" || /^time:\\[[1-9]\\d*\\]$/.test(value))\n );\n}\n\nfunction isStartTicks(value: unknown): value is string {\n return typeof value === \"string\" && /^(?:0|[1-9]\\d*)$/.test(value);\n}\n\nfunction parseLinuxIdentity(raw: Record<string, unknown>): LinuxProcessIdentity | undefined {\n const scope = parseLinuxScope(raw);\n if (!scope || !isStartTicks(raw.startTicks)) {\n return undefined;\n }\n return { kind: \"linux-proc\", ...scope, startTicks: raw.startTicks };\n}\n\nfunction compareLinuxScope(\n expected: LinuxProcessScope,\n observed: LinuxProcessScope,\n): ProcessIdentityComparison {\n // Queue homes are local to one machine. A prior boot cannot retain a live\n // owner; a different namespace in this boot cannot establish its absence.\n if (expected.bootId !== observed.bootId) {\n return \"different\";\n }\n if (\n expected.pidNamespace !== observed.pidNamespace ||\n expected.timeNamespace !== observed.timeNamespace\n ) {\n return \"unknown\";\n }\n return \"matching\";\n}\n\nfunction compareLinuxIdentity(\n expected: LinuxProcessIdentity,\n observed: LinuxProcessIdentity,\n): ProcessIdentityComparison {\n const scope = compareLinuxScope(expected, observed);\n return scope === \"matching\"\n ? expected.startTicks === observed.startTicks\n ? \"matching\"\n : \"different\"\n : scope;\n}\n\nexport function compareProcessBirthIdentity(\n expected: ProcessBirthIdentity | undefined,\n observed: ProcessBirthIdentity,\n): ProcessIdentityComparison {\n if (!expected || expected.kind !== observed.kind) {\n return \"unknown\";\n }\n if (expected.kind === \"linux-proc\" && observed.kind === \"linux-proc\") {\n return compareLinuxIdentity(expected, observed);\n }\n if (\"value\" in expected && \"value\" in observed) {\n return expected.value === observed.value ? \"matching\" : \"different\";\n }\n return \"unknown\";\n}\n\nfunction parseLinuxStat(raw: unknown): { pid: number; startTicks: string } | undefined {\n if (typeof raw !== \"string\") {\n return undefined;\n }\n const prefix = /^(\\d+) \\(/.exec(raw);\n const close = raw.lastIndexOf(\")\");\n if (!prefix || close < 0) {\n return undefined;\n }\n const pid = Number(prefix[1]);\n // comm may contain spaces, newlines and ')'; field 22 follows its final ')'.\n const fields = raw\n .slice(close + 2)\n .trim()\n .split(/\\s+/u);\n const startTicks = fields[19];\n if (!isPositivePid(pid) || !isStartTicks(startTicks) || !/^[RSDTtKWPI]$/.test(fields[0] ?? \"\")) {\n return undefined;\n }\n return { pid, startTicks };\n}\n\nasync function readLinuxObservation(\n pid: number,\n timeoutMs: number,\n): Promise<{ scope: LinuxProcessScope; identity?: LinuxProcessIdentity } | undefined> {\n const output = await runTimedExecFile(\n process.execPath,\n [\"--input-type=commonjs\", \"-e\", LINUX_PROCESS_QUERY, String(pid), String(process.pid)],\n { timeoutMs, maxBufferBytes: 8_192, env: { ...process.env, NODE_OPTIONS: \"\" } },\n );\n const raw = JSON.parse(output) as Record<string, unknown>;\n const scope = parseLinuxScope(raw);\n const self = parseLinuxStat(raw.selfStat);\n if (\n !scope ||\n !self ||\n self.pid !== raw.helperPid ||\n scope.pidNamespace !== raw.observerPidNamespace ||\n scope.timeNamespace !== raw.observerTimeNamespace\n ) {\n return undefined;\n }\n const target = parseLinuxStat(raw.targetStat);\n return {\n scope,\n ...(target?.pid === pid\n ? { identity: { kind: \"linux-proc\", ...scope, startTicks: target.startTicks } as const }\n : {}),\n };\n}\n\nfunction isPositivePid(pid: number): boolean {\n return Number.isSafeInteger(pid) && pid > 0;\n}\n\nfunction windowsPowerShellPath(): string {\n const systemRoot = process.env.SystemRoot;\n if (!systemRoot || !path.win32.isAbsolute(systemRoot)) {\n throw new Error(\"Windows system directory is unavailable\");\n }\n // A bare executable name searches the project directory before PATH on Windows.\n return path.win32.join(systemRoot, \"System32\", \"WindowsPowerShell\", \"v1.0\", \"powershell.exe\");\n}\n\nfunction windowsProcessQuery(pid: number | undefined): string {\n const filter = pid === undefined ? \"\" : ` -Filter 'ProcessId = ${pid}'`;\n return [\n \"$ErrorActionPreference = 'Stop'\",\n `Get-CimInstance -ClassName Win32_Process -Property ProcessId,ParentProcessId,CreationDate${filter} | ForEach-Object {`,\n \"if ($null -ne $_.CreationDate) {\",\n \"'{0} {1} 0 S {2}' -f $_.ProcessId,$_.ParentProcessId,$_.CreationDate.ToUniversalTime().ToString('o')\",\n \"}\",\n \"}\",\n ].join(\"\\n\");\n}\n\nfunction posixBirth(value: string): string | undefined {\n const match = /^\\w{3}\\s+(\\w{3})\\s+(\\d{1,2})\\s+(\\d{2}):(\\d{2}):(\\d{2})\\s+(\\d{4})$/.exec(value);\n if (!match) {\n return undefined;\n }\n const month = POSIX_MONTHS.indexOf(match[1]);\n if (month < 0) {\n return undefined;\n }\n // lstart has one-second precision. Explicit UTC conversion keeps identities\n // stable across callers' timezones and descendant group-exit comparisons.\n const valueUtc = `${match[6]}-${String(month + 1).padStart(2, \"0\")}-${match[2].padStart(2, \"0\")}T${match[3]}:${match[4]}:${match[5]}.000Z`;\n return isCanonicalBirth(valueUtc, \"posix-lstart\") ? valueUtc : undefined;\n}\n\nfunction parseProcessTable(output: string): Map<number, ProcessTableEntry> {\n const table = new Map<number, ProcessTableEntry>();\n for (const line of output.split(\"\\n\")) {\n const match = /^\\s*(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\S+)\\s+(.+?)\\s*$/.exec(line);\n if (!match || match[4].startsWith(\"Z\")) {\n continue;\n }\n const pid = Number(match[1]);\n const birth = processTableBirth(match[5]);\n if (Number.isSafeInteger(pid) && pid > 0 && birth) {\n table.set(pid, { pid, parentPid: Number(match[2]), groupPid: Number(match[3]), birth });\n }\n }\n return table;\n}\n\nfunction processTableBirth(value: string): string | undefined {\n if (process.platform !== \"win32\") {\n return posixBirth(value);\n }\n return isCanonicalBirth(value, \"windows-creation\") ? value : undefined;\n}\n\nexport async function readProcessTable(\n timeoutMs: number,\n pid?: number,\n): Promise<Map<number, ProcessTableEntry>> {\n if (pid !== undefined && (!Number.isSafeInteger(pid) || pid <= 0)) {\n throw new Error(\"Process identity requires a positive PID\");\n }\n if (process.platform === \"win32\") {\n const output = await runTimedExecFile(\n windowsPowerShellPath(),\n [\"-NoLogo\", \"-NoProfile\", \"-NonInteractive\", \"-Command\", windowsProcessQuery(pid)],\n { timeoutMs, windowsHide: true },\n );\n return parseProcessTable(output);\n }\n const selection = pid === undefined ? [\"-e\"] : [\"-p\", String(pid)];\n const output = await runTimedExecFile(\n \"ps\",\n [...selection, \"-o\", \"pid=,ppid=,pgid=,stat=,lstart=\"],\n {\n timeoutMs,\n env: { ...process.env, LC_ALL: \"C\", TZ: \"UTC\" },\n },\n );\n return parseProcessTable(output);\n}\n\nexport async function probeProcessIdentity(\n pid: number,\n timeoutMs = IDENTITY_QUERY_TIMEOUT_MS,\n): Promise<ProcessIdentityProbe> {\n if (!isPositivePid(pid)) {\n return { state: \"unknown\" };\n }\n if (isProcessDefinitelyDead(pid)) {\n return { state: \"dead\" };\n }\n try {\n const identity = await readNativeIdentity(pid, timeoutMs);\n if (identity) {\n return {\n state: \"alive\",\n identity,\n };\n }\n } catch {\n // Query failure and missing rows are not proof that a PID is safe to reclaim.\n }\n return { state: isProcessDefinitelyDead(pid) ? \"dead\" : \"unknown\" };\n}\n\nasync function readNativeIdentity(\n pid: number,\n timeoutMs: number,\n): Promise<ProcessBirthIdentity | undefined> {\n if (process.platform === \"linux\") {\n return (await readLinuxObservation(pid, timeoutMs))?.identity;\n }\n const entry = (await readProcessTable(timeoutMs, pid)).get(pid);\n return entry ? processBirthIdentity(entry.birth) : undefined;\n}\n\nfunction processBirthIdentity(value: string): TimestampIdentity {\n return { kind: process.platform === \"win32\" ? \"windows-creation\" : \"posix-lstart\", value };\n}\n\nfunction nativeIdentityKind(): ProcessBirthIdentity[\"kind\"] {\n if (process.platform === \"linux\") {\n return \"linux-proc\";\n }\n return process.platform === \"win32\" ? \"windows-creation\" : \"posix-lstart\";\n}\n\nfunction comparisonToIncarnation(comparison: ProcessIdentityComparison): ProcessIncarnation {\n return comparison === \"different\" ? \"gone\" : comparison;\n}\n\nasync function observeLinuxIncarnation(\n pid: number,\n expected: LinuxProcessIdentity,\n timeoutMs: number,\n): Promise<ProcessIncarnation> {\n const observed = await readLinuxObservation(pid, timeoutMs).catch(() => undefined);\n if (!observed) {\n return \"unknown\";\n }\n const scope = compareLinuxScope(expected, observed.scope);\n if (scope !== \"matching\") {\n return comparisonToIncarnation(scope);\n }\n // A PID missing in this namespace says nothing about an owner in another one.\n // Only accept numeric-PID death after validating the stored observer scope.\n if (isProcessDefinitelyDead(pid)) {\n return \"gone\";\n }\n return observed.identity\n ? comparisonToIncarnation(compareProcessBirthIdentity(expected, observed.identity))\n : \"unknown\";\n}\n\nexport async function observeProcessIncarnation(\n pid: number,\n expected?: ProcessBirthIdentity,\n timeoutMs = IDENTITY_QUERY_TIMEOUT_MS,\n): Promise<ProcessIncarnation> {\n if (!isPositivePid(pid)) {\n return \"unknown\";\n }\n if (expected?.kind === \"linux-proc\") {\n return process.platform === \"linux\"\n ? await observeLinuxIncarnation(pid, expected, timeoutMs)\n : \"unknown\";\n }\n if (expected && expected.kind !== nativeIdentityKind()) {\n return \"unknown\";\n }\n return await observeTimestampIncarnation(pid, expected, timeoutMs);\n}\n\nasync function observeTimestampIncarnation(\n pid: number,\n expected: TimestampIdentity | undefined,\n timeoutMs: number,\n): Promise<ProcessIncarnation> {\n if (isProcessDefinitelyDead(pid)) {\n return \"gone\";\n }\n if (!expected) {\n return \"unknown\";\n }\n const observed = await probeProcessIdentity(pid, timeoutMs);\n if (observed.state === \"dead\") {\n return \"gone\";\n }\n return observed.state === \"alive\"\n ? comparisonToIncarnation(compareProcessBirthIdentity(expected, observed.identity))\n : \"unknown\";\n}\n\nexport async function getOwnProcessIdentity(): Promise<ProcessBirthIdentity | undefined> {\n if (ownIdentity) {\n return ownIdentity;\n }\n // Concurrent lease/guard publication can share self discovery. Foreign-PID\n // probes remain fresh because their result may authorize destructive recovery.\n ownIdentityPending ??= probeProcessIdentity(process.pid)\n .then((probe) => {\n if (probe.state === \"alive\") {\n ownIdentity = probe.identity;\n }\n return ownIdentity;\n })\n .finally(() => {\n ownIdentityPending = undefined;\n });\n return await ownIdentityPending;\n}\n","import {\n compareProcessBirthIdentity,\n getOwnProcessIdentity,\n observeProcessIncarnation,\n parseProcessBirthIdentity,\n type ProcessBirthIdentity,\n} from \"../process-identity.js\";\n\nconst OBSERVATION_REUSE_MS = 1_000;\nconst IDENTITY_QUERY_TIMEOUT_MS = 1_000;\n\n// The receipt's presence means discovery already ran, including an unavailable birth.\nexport type CapturedProcessIdentity = { processIdentity?: ProcessBirthIdentity };\n\nexport type LockOwner = {\n payload: { pid: number; processIdentity?: ProcessBirthIdentity };\n hasExited(payload: unknown, fresh?: boolean, signal?: AbortSignal): Promise<boolean>;\n};\n\ntype PreservedOwner = { pid: number; identity: ProcessBirthIdentity; checkedAt: number };\n\nexport function lockOwnerPid(value: unknown): number | undefined {\n if (!value || typeof value !== \"object\" || !(\"pid\" in value)) {\n return undefined;\n }\n const pid = value.pid;\n return typeof pid === \"number\" && Number.isSafeInteger(pid) && pid > 0 ? pid : undefined;\n}\n\nfunction canReuseObservation(\n preserved: PreservedOwner | undefined,\n pid: number,\n identity: ProcessBirthIdentity,\n fresh?: boolean,\n): boolean {\n return (\n !fresh &&\n preserved?.pid === pid &&\n compareProcessBirthIdentity(preserved.identity, identity) === \"matching\" &&\n performance.now() - preserved.checkedAt < OBSERVATION_REUSE_MS\n );\n}\n\nexport async function createLockOwner(\n options: { signal?: AbortSignal; capturedIdentity?: CapturedProcessIdentity } = {},\n): Promise<LockOwner> {\n const { signal, capturedIdentity } = options;\n signal?.throwIfAborted();\n const processIdentity =\n capturedIdentity === undefined\n ? await getOwnProcessIdentity()\n : capturedIdentity.processIdentity;\n signal?.throwIfAborted();\n let preserved: PreservedOwner | undefined;\n return {\n payload: { pid: process.pid, processIdentity },\n async hasExited(payload, fresh, signal) {\n signal?.throwIfAborted();\n const pid = lockOwnerPid(payload);\n if (!pid) {\n return false;\n }\n const identity = parseProcessBirthIdentity(\n (payload as { processIdentity?: unknown }).processIdentity,\n );\n // fs-safe retries every few milliseconds. Reuse only custody-preserving\n // observations within this acquisition, never a destructive decision.\n if (identity && canReuseObservation(preserved, pid, identity, fresh)) {\n return false;\n }\n // The canonical observer validates Linux scope before accepting even ESRCH.\n const incarnation = await observeProcessIncarnation(pid, identity, IDENTITY_QUERY_TIMEOUT_MS);\n signal?.throwIfAborted();\n if (identity && incarnation !== \"gone\") {\n preserved = { pid, identity, checkedAt: performance.now() };\n }\n return incarnation === \"gone\";\n },\n };\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 fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { acquireFileLock, type FileLockHandle } from \"@openclaw/fs-safe/file-lock\";\nimport { QueueConnectionError } from \"../../errors.js\";\nimport { createLockOwner, type CapturedProcessIdentity, type LockOwner } from \"../lock-owner.js\";\nimport { queueLockFilePath } from \"./paths.js\";\n\nconst GUARD_WAIT_MS = 2_000;\n\ntype QueueLeaseIdentity = {\n pid: number;\n sessionId: string;\n ownerGeneration: number;\n};\n\nexport type QueueLeaseReservation = QueueLeaseIdentity & { published: boolean };\n\ntype QueueLeaseMutationOptions = {\n reservation?: QueueLeaseReservation;\n capturedIdentity?: CapturedProcessIdentity;\n};\n\ntype FailedSettlement = {\n guard: FileLockHandle;\n owner: LockOwner;\n reservation?: QueueLeaseIdentity;\n};\n\ntype LocalMutationState = {\n tail: Promise<void>;\n failed?: FailedSettlement;\n};\n\n// Local sequencing prevents another caller helping settlement before the mutation ends.\nconst localMutations = new Map<string, LocalMutationState>();\n\nexport class QueueLeaseGuardSettlementError extends QueueConnectionError {\n constructor(errors: unknown[]) {\n super(\"Queue lease guard settlement failed; cleanup remains retryable\", {\n detailCode: \"QUEUE_LEASE_GUARD_SETTLEMENT_FAILED\",\n origin: \"queue\",\n retryable: false,\n cause: new AggregateError(errors, \"Queue lease mutation and settlement errors\"),\n });\n }\n}\n\nasync function canonicalLeasePath(sessionId: string): Promise<string> {\n const requested = queueLockFilePath(sessionId);\n try {\n return path.join(await fs.realpath(path.dirname(requested)), path.basename(requested));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return path.resolve(requested);\n }\n throw error;\n }\n}\n\nasync function acquireGuard(lockPath: string, owner: LockOwner): Promise<FileLockHandle> {\n return await acquireFileLock(lockPath, {\n managerKey: \"acpx.queue-lease-mutation\",\n lockPath: `${lockPath}.guard`,\n staleMs: Infinity,\n timeoutMs: GUARD_WAIT_MS,\n retry: { minTimeout: 5, maxTimeout: 15, factor: 1, randomize: false },\n staleRecovery: \"remove-if-unchanged\",\n payload: () => owner.payload,\n shouldReclaim: ({ payload }) => owner.hasExited(payload),\n shouldRemoveStaleLock: ({ payload }) => owner.hasExited(payload, true),\n });\n}\n\nfunction matchesReservation(value: unknown, expected: QueueLeaseIdentity): boolean {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const record = value as Record<string, unknown>;\n return (\n record.pid === expected.pid &&\n record.sessionId === expected.sessionId &&\n record.ownerGeneration === expected.ownerGeneration\n );\n}\n\nasync function rollbackReservation(lockPath: string, expected: QueueLeaseIdentity): Promise<void> {\n try {\n if (!(await fs.lstat(lockPath)).isFile()) {\n return;\n }\n const raw = await fs.readFile(lockPath, \"utf8\");\n let value: unknown;\n try {\n value = JSON.parse(raw) as unknown;\n } catch {\n return;\n }\n if (matchesReservation(value, expected)) {\n await fs.unlink(lockPath);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nasync function settleReceipt(lockPath: string, receipt: FailedSettlement): Promise<void> {\n if (receipt.reservation) {\n if (!(await receipt.guard.verifyStillHeld())) {\n await receipt.guard.release();\n receipt.guard = await acquireGuard(lockPath, receipt.owner);\n }\n await rollbackReservation(lockPath, receipt.reservation);\n receipt.reservation = undefined;\n }\n await receipt.guard.release();\n}\n\nasync function settleFailedGuard(lockPath: string, state: LocalMutationState): Promise<void> {\n const failed = state.failed;\n if (!failed) {\n return;\n }\n try {\n await settleReceipt(lockPath, failed);\n if (state.failed === failed) {\n state.failed = undefined;\n }\n } catch (error) {\n throw new QueueLeaseGuardSettlementError([error]);\n }\n}\n\nasync function locallySerialized<T>(\n lockPath: string,\n run: (state: LocalMutationState) => Promise<T>,\n): Promise<T> {\n let state = localMutations.get(lockPath);\n if (!state) {\n state = { tail: Promise.resolve() };\n localMutations.set(lockPath, state);\n }\n const current = state;\n const operation = current.tail.then(async () => await run(current));\n const tail = operation.then(\n () => {},\n () => {},\n );\n current.tail = tail;\n try {\n return await operation;\n } finally {\n if (current.tail === tail && !current.failed && localMutations.get(lockPath) === current) {\n localMutations.delete(lockPath);\n }\n }\n}\n\nexport async function settlePendingQueueLeaseGuard(sessionId: string): Promise<void> {\n if (localMutations.size === 0) {\n return;\n }\n const lockPath = await canonicalLeasePath(sessionId);\n if (!localMutations.has(lockPath)) {\n return;\n }\n await locallySerialized(lockPath, async (state) => await settleFailedGuard(lockPath, state));\n}\n\nexport async function withQueueLeaseMutation<T>(\n sessionId: string,\n mutate: () => Promise<T>,\n options: QueueLeaseMutationOptions = {},\n): Promise<T> {\n const { reservation, capturedIdentity } = options;\n await fs.mkdir(path.dirname(queueLockFilePath(sessionId)), { recursive: true, mode: 0o700 });\n const lockPath = await canonicalLeasePath(sessionId);\n const expected = reservation\n ? {\n pid: reservation.pid,\n sessionId: reservation.sessionId,\n ownerGeneration: reservation.ownerGeneration,\n }\n : undefined;\n const publishedReservation = () => (reservation?.published ? expected : undefined);\n return await locallySerialized(lockPath, async (state) => {\n await settleFailedGuard(lockPath, state);\n const owner = await createLockOwner({ capturedIdentity });\n const guard = await acquireGuard(lockPath, owner);\n let outcome: { ok: true; value: T } | { ok: false; error: unknown };\n try {\n outcome = { ok: true, value: await mutate() };\n } catch (error) {\n outcome = { ok: false, error };\n }\n const published = publishedReservation();\n const receipt: FailedSettlement = {\n guard,\n owner,\n reservation: outcome.ok ? undefined : published,\n };\n try {\n await settleReceipt(lockPath, receipt);\n } catch (error) {\n // A successful publication is still unadmitted when final guard release fails.\n if (outcome.ok) {\n receipt.reservation = published;\n }\n state.failed = receipt;\n throw new QueueLeaseGuardSettlementError(outcome.ok ? [error] : [outcome.error, error]);\n }\n if (!outcome.ok) {\n throw outcome.error;\n }\n return outcome.value;\n });\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 { runTimedExecFile } from \"../../acp/client-process.js\";\nimport { QueueConnectionError } from \"../../errors.js\";\nimport {\n getOwnProcessIdentity,\n observeProcessIncarnation,\n parseProcessBirthIdentity,\n type ProcessBirthIdentity,\n} from \"../../process-identity.js\";\nimport { isProcessAlive, isProcessDefinitelyDead } from \"../../process-liveness.js\";\nimport type { CapturedProcessIdentity } from \"../lock-owner.js\";\nimport { settlePendingQueueLeaseGuard, withQueueLeaseMutation } from \"./lease-mutation.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 processIdentity?: ProcessBirthIdentity;\n queueDepth: number;\n sharedRuntime?: boolean;\n sessionWatch?: boolean;\n persistsControlState?: 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 processIdentity?: ProcessBirthIdentity;\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 // An absent or invalid birth identity makes retirement unverified, not the\n // entire lease malformed: collision recovery must preserve its custody.\n const processIdentity = parseProcessBirthIdentity(record.processIdentity);\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 ...(processIdentity ? { processIdentity } : {}),\n ...parseQueueOwnerCapabilities(record),\n ...(typeof record.mcpConfigPath === \"string\" ? { mcpConfigPath: record.mcpConfigPath } : {}),\n ...(typeof record.mcpConfigFingerprint === \"string\"\n ? { mcpConfigFingerprint: record.mcpConfigFingerprint }\n : {}),\n };\n}\n\nfunction parseQueueOwnerCapabilities(\n record: Record<string, unknown>,\n): Pick<QueueOwnerRecord, \"sharedRuntime\" | \"sessionWatch\" | \"persistsControlState\"> {\n return {\n ...(record.sharedRuntime === true ? { sharedRuntime: true } : {}),\n ...(record.sessionWatch === true ? { sessionWatch: true } : {}),\n ...(record.persistsControlState === true ? { persistsControlState: true } : {}),\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(\n pid: number,\n timeoutMs: number,\n hasExited: (pid: number) => boolean,\n): Promise<boolean> {\n const deadline = Date.now() + Math.max(0, timeoutMs);\n while (Date.now() <= deadline) {\n if (hasExited(pid)) {\n return true;\n }\n await waitMs(PROCESS_POLL_MS);\n }\n\n return hasExited(pid);\n}\n\nasync function cleanupQueueOwnerFiles(\n sessionId: string,\n socketPath: string,\n isCurrent: () => Promise<boolean>,\n capturedIdentity?: CapturedProcessIdentity,\n): Promise<void> {\n // Only a local lease supplies this receipt; a foreign owner's birth cannot\n // identify the current guard writer, even when both use the same numeric PID.\n await withQueueLeaseMutation(\n sessionId,\n async () => {\n await cleanupGuardedQueueOwnerFiles(sessionId, socketPath, isCurrent);\n },\n { capturedIdentity },\n );\n}\n\nasync function cleanupGuardedQueueOwnerFiles(\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): Promise<boolean> {\n const current = await readQueueOwnerRecord(owner.sessionId);\n return matchesQueueOwner(current, owner);\n}\n\nfunction matchesQueueOwner(\n current: QueueOwnerRecord | undefined,\n expected: QueueOwnerIdentity,\n): current is QueueOwnerRecord {\n return (\n current?.sessionId === expected.sessionId &&\n current.pid === expected.pid &&\n current.ownerGeneration === expected.ownerGeneration\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 return await terminateWithDispatch(\n pid,\n async (signal) => {\n if (beforeSignal && !(await beforeSignal(signal))) {\n return false;\n }\n return dispatchSignal(pid, signal);\n },\n (target) => !isProcessAlive(target),\n );\n}\n\nfunction dispatchSignal(pid: number, signal: NodeJS.Signals): boolean {\n try {\n process.kill(pid, signal);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function dispatchQueueOwnerSignal(pid: number, signal: NodeJS.Signals): Promise<boolean> {\n if (process.platform !== \"win32\") {\n return dispatchSignal(pid, signal);\n }\n // Windows SIGTERM bypasses the owner's shutdown handler. Retire its tree\n // before losing the parent; a failed helper must not authorize lease cleanup.\n const systemRoot = process.env.SystemRoot;\n if (!systemRoot || !path.win32.isAbsolute(systemRoot)) {\n throw new Error(\"Windows queue-owner cleanup requires an absolute SystemRoot directory\");\n }\n // Do not let the working directory supply an executable named taskkill.\n const taskkill = path.win32.join(systemRoot, \"System32\", \"taskkill.exe\");\n await runTimedExecFile(taskkill, [\"/pid\", String(pid), \"/T\", \"/F\"], {\n timeoutMs: PROCESS_SIGTERM_GRACE_MS,\n windowsHide: true,\n });\n return true;\n}\n\nasync function terminateWithDispatch(\n pid: number,\n dispatch: (signal: NodeJS.Signals) => Promise<boolean>,\n hasExited: (pid: number) => boolean,\n): Promise<boolean> {\n for (const [signal, graceMs] of [\n [\"SIGTERM\", PROCESS_SIGTERM_GRACE_MS],\n [\"SIGKILL\", PROCESS_SIGKILL_GRACE_MS],\n ] as const) {\n if (!(await dispatch(signal))) {\n return false;\n }\n if (await waitForProcessExit(pid, graceMs, hasExited)) {\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 await settlePendingQueueLeaseGuard(sessionId);\n const observed = await readQueueOwnerRecord(sessionId);\n if (!matchesQueueOwner(observed, owner)) {\n return undefined;\n }\n if (ownerIsAlive(observed) && !isQueueOwnerHeartbeatStale(observed)) {\n return observed;\n }\n\n await terminateQueueOwnerForSession(sessionId, observed, true);\n const current = await readQueueOwnerRecord(sessionId);\n return matchesQueueOwner(current, observed) &&\n ownerIsAlive(current) &&\n !isQueueOwnerHeartbeatStale(current)\n ? current\n : undefined;\n}\n\nexport async function readQueueOwnerStatus(\n sessionId: string,\n): Promise<QueueOwnerStatus | undefined> {\n await settlePendingQueueLeaseGuard(sessionId);\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 const processIdentity = await getOwnProcessIdentity();\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 ...(processIdentity ? { processIdentity } : {}),\n ...mcpConfigMetadata,\n updates: Promise.resolve(),\n released: false,\n };\n const reservation = { pid: lease.pid, sessionId, ownerGeneration, published: false };\n\n try {\n return await withQueueLeaseMutation(\n sessionId,\n async () => {\n await stageQueueOwnerRecord(lease, 0, clock, 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 reservation.published = true;\n });\n await removeSocketFile(socketPath).catch(() => {\n // best-effort stale socket cleanup after ownership is acquired\n });\n return lease;\n },\n { reservation, capturedIdentity: lease },\n );\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 await withQueueLeaseMutation(sessionId, async () => {\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 cleanupGuardedQueueOwnerFiles(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}\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 withQueueLeaseMutation(\n lease.sessionId,\n async () => {\n if (!(await ownsQueueLease(lease))) {\n return;\n }\n await stageQueueOwnerRecord(lease, options.queueDepth, nowIsoFactory, async (tempPath) => {\n await fs.rename(tempPath, lease.lockPath);\n });\n },\n { capturedIdentity: lease },\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 ...(lease.processIdentity ? { processIdentity: lease.processIdentity } : {}),\n queueDepth: Math.max(0, Math.round(queueDepth)),\n sharedRuntime: true,\n sessionWatch: true,\n persistsControlState: 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(\n lease.sessionId,\n lease.socketPath,\n () => ownsQueueLease(lease),\n lease,\n );\n}\n\nfunction unverifiedQueueOwnerError(owner: QueueOwnerRecord): QueueConnectionError {\n return new QueueConnectionError(\n `Cannot safely retire queue owner pid ${owner.pid}: its process birth identity is unverified. Its lease was retained. Retry from the same local process namespace with process-query access, or let the owner finish normal shutdown or idle expiry.`,\n { detailCode: \"QUEUE_OWNER_IDENTITY_UNVERIFIED\", origin: \"queue\", retryable: true },\n );\n}\n\ntype QueueOwnerRetirement = { gone: boolean; unverified: boolean; leaseReleased: boolean };\n\nasync function dispatchVerifiedQueueOwnerSignal(\n owner: QueueOwnerRecord,\n signal: NodeJS.Signals,\n requireStale: boolean,\n retirement: QueueOwnerRetirement,\n): Promise<boolean> {\n return await withQueueLeaseMutation(owner.sessionId, async () => {\n const current = await readQueueOwnerRecord(owner.sessionId);\n retirement.leaseReleased = current?.pid !== owner.pid;\n if (\n !matchesQueueOwner(current, owner) ||\n (requireStale && signal === \"SIGTERM\" && !isQueueOwnerHeartbeatStale(current))\n ) {\n return false;\n }\n // Generation protects the lease; a fresh OS birth protects the PID. The\n // same numeric PID can belong to an unrelated process after an owner crash.\n const identity = await observeProcessIncarnation(current.pid, current.processIdentity);\n if (identity !== \"matching\") {\n retirement.gone = identity === \"gone\";\n retirement.unverified = identity === \"unknown\";\n return false;\n }\n return await dispatchQueueOwnerSignal(owner.pid, signal);\n });\n}\n\nasync function retireQueueOwner(owner: QueueOwnerRecord, requireStale: boolean): Promise<boolean> {\n const deadline = performance.now() + PROCESS_SIGTERM_GRACE_MS + PROCESS_SIGKILL_GRACE_MS;\n const retirement: QueueOwnerRetirement = { gone: false, unverified: false, leaseReleased: false };\n await terminateWithDispatch(\n owner.pid,\n (signal) => dispatchVerifiedQueueOwnerSignal(owner, signal, requireStale, retirement),\n isProcessDefinitelyDead,\n );\n if (retirement.unverified && requireStale) {\n throw unverifiedQueueOwnerError(owner);\n }\n if (retirement.leaseReleased || retirement.unverified) {\n // A released lease may belong to a successor; legacy owners may also finish\n // cooperative shutdown. Neither state permits signaling a remembered PID.\n await waitForProcessExit(\n owner.pid,\n Math.max(0, deadline - performance.now()),\n isProcessDefinitelyDead,\n );\n }\n // Numeric exit is only a waiting hint. Revalidate the expected scope before\n // cleanup: a locally absent PID can still name a foreign namespace's owner.\n const gone =\n retirement.gone ||\n (await observeProcessIncarnation(owner.pid, owner.processIdentity)) === \"gone\";\n if (retirement.unverified && !gone) {\n throw unverifiedQueueOwnerError(owner);\n }\n return gone;\n}\n\nexport async function terminateQueueOwnerForSession(\n sessionId: string,\n expectedOwner?: QueueOwnerRecord,\n requireStale = false,\n): Promise<void> {\n await settlePendingQueueLeaseGuard(sessionId);\n const owner = expectedOwner ?? (await readQueueOwnerRecord(sessionId));\n if (!owner || owner.sessionId !== sessionId || owner.pid === process.pid) {\n return;\n }\n\n if (!(await retireQueueOwner(owner, requireStale))) {\n return;\n }\n // Once this incarnation is confirmed gone it cannot return. Recheck the lease\n // generation during file cleanup; never signal a replacement occupying its PID.\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 { settlePendingQueueLeaseGuard } from \"./lease-mutation.js\";\nimport {\n readQueueOwnerRecord,\n resolveUsableQueueOwner,\n type QueueOwnerRecord,\n} 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\nasync function isStillCurrent(owner: QueueOwnerRecord): Promise<boolean> {\n const current = await readQueueOwnerRecord(owner.sessionId);\n return current?.pid === owner.pid && current.ownerGeneration === owner.ownerGeneration;\n}\n\nexport async function probeQueueOwnerHealth(sessionId: string): Promise<QueueOwnerHealth> {\n await settlePendingQueueLeaseGuard(sessionId);\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 resolveUsableQueueOwner(sessionId, ownerRecord);\n if (!owner) {\n return {\n sessionId,\n hasLease: false,\n healthy: false,\n socketReachable: false,\n pidAlive: false,\n };\n }\n\n let socketReachable = false;\n try {\n const socket = await connectToQueueOwner(owner, 2);\n if (socket) {\n socketReachable = true;\n if (!socket.destroyed) {\n socket.end();\n }\n }\n } catch {\n socketReachable = false;\n }\n\n if (!(await isStillCurrent(owner))) {\n return { sessionId, hasLease: false, healthy: false, socketReachable: false, pidAlive: false };\n }\n\n return {\n sessionId,\n hasLease: true,\n healthy: socketReachable,\n socketReachable,\n pidAlive: true,\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 /**\n * Last chance to refuse the request, invoked immediately before the socket\n * write. A throw means nothing was sent. It is never consulted afterwards, so\n * a dispatched request still settles its response.\n */\n assertDispatch?: () => void;\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 options.assertDispatch?.();\n } catch (error) {\n finishReject(error);\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 assertDispatch?: () => void,\n): Promise<TResponse | undefined> {\n return await runQueueOwnerRequest<TResponse>({\n owner,\n request,\n assertDispatch,\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 assertDispatch?: () => void,\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 assertDispatch,\n );\n return response ? true : undefined;\n}\n\nasync function submitSetModelToQueueOwner(\n owner: QueueOwnerRecord,\n modelId: string,\n timeoutMs?: number,\n assertDispatch?: () => void,\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 assertDispatch,\n );\n}\n\nasync function submitSetConfigOptionToQueueOwner(\n owner: QueueOwnerRecord,\n configId: string,\n value: string,\n timeoutMs?: number,\n assertDispatch?: () => void,\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 assertDispatch,\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 onOwnerSelected?: (owner: QueueOwnerRecord) => void;\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) => {\n // Retain the selected generation even if close fails or has no response;\n // looking it up after shutdown could miss this owner or select its successor.\n options.onOwnerSelected?.(owner);\n return submitCloseSessionToQueueOwner(owner, options.timeoutMs);\n },\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\ntype OwnerControlResult<T> = {\n value: T;\n persistsControlState: boolean;\n};\n\nasync function withOwnerControlPersistence<T>(\n owner: QueueOwnerRecord,\n operation: Promise<T | undefined>,\n): Promise<OwnerControlResult<T> | undefined> {\n const persistsControlState = owner.persistsControlState === true;\n const value = await operation;\n return value === undefined ? undefined : { value, persistsControlState };\n}\n\nexport async function trySetModeOnRunningOwner(\n sessionId: string,\n modeId: string,\n timeoutMs: number | undefined,\n verbose: boolean | undefined,\n assertDispatch?: () => void,\n): Promise<OwnerControlResult<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) =>\n withOwnerControlPersistence(\n owner,\n submitSetModeToQueueOwner(owner, modeId, timeoutMs, assertDispatch),\n ),\n });\n}\n\nexport async function trySetModelOnRunningOwner(\n sessionId: string,\n modelId: string,\n timeoutMs: number | undefined,\n verbose: boolean | undefined,\n assertDispatch?: () => void,\n): Promise<OwnerControlResult<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) =>\n withOwnerControlPersistence(\n owner,\n submitSetModelToQueueOwner(owner, modelId, timeoutMs, assertDispatch),\n ),\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 assertDispatch?: () => void,\n): Promise<OwnerControlResult<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) =>\n withOwnerControlPersistence(\n owner,\n submitSetConfigOptionToQueueOwner(owner, configId, value, timeoutMs, assertDispatch),\n ),\n });\n}\n"],"mappings":"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"}