acpx 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{cli-DZjj5kij.js → cli-ChWsO-bb.js} +4 -4
- package/dist/{cli-DZjj5kij.js.map → cli-ChWsO-bb.js.map} +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +5 -5
- package/dist/{client-S8QicFBT.d.ts → client-D-4_aZf2.d.ts} +4 -2
- package/dist/client-D-4_aZf2.d.ts.map +1 -0
- package/dist/{flags-W3vEVSiS.js → flags-ceSqz2T6.js} +3 -3
- package/dist/{flags-W3vEVSiS.js.map → flags-ceSqz2T6.js.map} +1 -1
- package/dist/{flows-CLQYpPh7.js → flows-_KmnuUXd.js} +3 -3
- package/dist/{flows-CLQYpPh7.js.map → flows-_KmnuUXd.js.map} +1 -1
- package/dist/flows.d.ts +1 -1
- package/dist/flows.js +1 -1
- package/dist/perf-metrics-D0um6IR6.js.map +1 -1
- package/dist/{prompt-turn-CbSSNHjk.js → prompt-turn-CXMtXBl-.js} +10 -1
- package/dist/prompt-turn-CXMtXBl-.js.map +1 -0
- package/dist/runtime.d.ts +8 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +45 -4
- package/dist/runtime.js.map +1 -1
- package/dist/{session-BiBN0BvM.js → session-BtwAKtJ3.js} +2 -2
- package/dist/{session-BiBN0BvM.js.map → session-BtwAKtJ3.js.map} +1 -1
- package/dist/{types-Cgigsj1X.d.ts → types-yxf-gcOE.d.ts} +2 -1
- package/dist/{types-Cgigsj1X.d.ts.map → types-yxf-gcOE.d.ts.map} +1 -1
- package/package.json +1 -1
- package/dist/client-S8QicFBT.d.ts.map +0 -1
- package/dist/prompt-turn-CbSSNHjk.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-BiBN0BvM.js","names":["fs","applyRequestedModelIfAdvertised","fs","segmentEventPath","activeEventPath","eventsLockPath","recordConversationSessionUpdate","recordConversationClientOperation"],"sources":["../src/cli/session/contracts.ts","../src/cli/session/prompt-runner.ts","../src/cli/session/session-control.ts","../src/cli/session/session-management.ts","../src/perf-metrics-capture.ts","../src/cli/queue/owner-turn-controller.ts","../src/cli/session/queue-owner-process.ts","../src/session/events.ts","../src/cli/session/runtime.ts","../src/cli/session/queue-owner-runtime.ts","../src/session/session.ts"],"sourcesContent":["import type { AcpClient } from \"../../acp/client.js\";\nimport type { SessionAgentOptions } from \"../../runtime/engine/session-options.js\";\nimport type {\n AcpJsonRpcMessage,\n AcpMessageDirection,\n AuthPolicy,\n ClientOperation,\n McpServer,\n NonInteractivePermissionPolicy,\n OutputErrorEmissionPolicy,\n OutputFormatter,\n PermissionMode,\n PromptInput,\n SessionNotification,\n SessionResumePolicy,\n SessionRecord,\n} from \"../../types.js\";\n\ntype TimedRunOptions = {\n timeoutMs?: number;\n};\n\nexport const DEFAULT_QUEUE_OWNER_TTL_MS = 300_000;\n\nexport function normalizeQueueOwnerTtlMs(ttlMs: number | undefined): number {\n if (ttlMs == null) {\n return DEFAULT_QUEUE_OWNER_TTL_MS;\n }\n\n if (!Number.isFinite(ttlMs) || ttlMs < 0) {\n return DEFAULT_QUEUE_OWNER_TTL_MS;\n }\n\n // 0 means keep alive forever (no TTL)\n return Math.round(ttlMs);\n}\n\nexport type RunOnceOptions = {\n agentCommand: string;\n cwd: string;\n prompt: PromptInput;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n outputFormatter: OutputFormatter;\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n sessionOptions?: SessionAgentOptions;\n promptRetries?: number;\n} & TimedRunOptions;\n\nexport type SessionCreateOptions = {\n agentCommand: string;\n cwd: string;\n name?: string;\n resumeSessionId?: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n verbose?: boolean;\n sessionOptions?: SessionAgentOptions;\n} & TimedRunOptions;\n\nexport type SessionSendOptions = {\n sessionId: string;\n prompt: PromptInput;\n resumePolicy?: SessionResumePolicy;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n outputFormatter: OutputFormatter;\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n errorEmissionPolicy?: OutputErrorEmissionPolicy;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n waitForCompletion?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n client?: AcpClient;\n promptRetries?: number;\n} & TimedRunOptions;\n\nexport type SessionEnsureOptions = {\n agentCommand: string;\n cwd: string;\n name?: string;\n resumeSessionId?: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n verbose?: boolean;\n walkBoundary?: string;\n sessionOptions?: SessionAgentOptions;\n} & TimedRunOptions;\n\nexport type SessionCancelOptions = {\n sessionId: string;\n verbose?: boolean;\n};\n\nexport type SessionCancelResult = {\n sessionId: string;\n cancelled: boolean;\n};\n\nexport type SessionSetModeOptions = {\n sessionId: string;\n modeId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n verbose?: boolean;\n} & TimedRunOptions;\n\nexport type SessionSetModelOptions = {\n sessionId: string;\n modelId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n verbose?: boolean;\n} & TimedRunOptions;\n\nexport type SessionSetConfigOptionOptions = {\n sessionId: string;\n configId: string;\n value: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n verbose?: boolean;\n} & TimedRunOptions;\n\nexport type SessionCreateWithClientResult = {\n record: SessionRecord;\n client: AcpClient;\n};\n\nexport type { SessionAgentOptions };\n","import { withTimeout } from \"../../async-control.js\";\nimport {\n withConnectedSession,\n type FullConnectedSessionController,\n} from \"../../runtime/engine/connected-session.js\";\nimport {\n setCurrentModelId,\n setDesiredModeId,\n setDesiredModelId,\n} from \"../../session/mode-preference.js\";\nimport { resolveSessionRecord, writeSessionRecord } from \"../../session/persistence.js\";\nimport type {\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n SessionSetConfigOptionResult,\n SessionSetModelResult,\n SessionSetModeResult,\n} from \"../../types.js\";\nimport type { QueueOwnerActiveSessionController } from \"../queue/owner-turn-controller.js\";\n\nexport type ActiveSessionController = QueueOwnerActiveSessionController;\n\nexport type RunSessionSetModeDirectOptions = {\n sessionRecordId: string;\n modeId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nexport type RunSessionSetConfigOptionDirectOptions = {\n sessionRecordId: string;\n configId: string;\n value: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nexport type RunSessionSetModelDirectOptions = {\n sessionRecordId: string;\n modelId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nexport async function runSessionSetModeDirect(\n options: RunSessionSetModeDirectOptions,\n): Promise<SessionSetModeResult> {\n const result = await withConnectedSession({\n sessionRecordId: options.sessionRecordId,\n loadRecord: resolveSessionRecord,\n saveRecord: writeSessionRecord,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n onClientAvailable: (controller: FullConnectedSessionController) => {\n options.onClientAvailable?.(controller);\n },\n onClientClosed: options.onClientClosed,\n run: async ({ client, sessionId, record }) => {\n await withTimeout(client.setSessionMode(sessionId, options.modeId), options.timeoutMs);\n setDesiredModeId(record, options.modeId);\n },\n });\n\n return {\n record: result.record,\n resumed: result.resumed,\n loadError: result.loadError,\n };\n}\n\nexport async function runSessionSetModelDirect(\n options: RunSessionSetModelDirectOptions,\n): Promise<SessionSetModelResult> {\n const result = await withConnectedSession({\n sessionRecordId: options.sessionRecordId,\n loadRecord: resolveSessionRecord,\n saveRecord: writeSessionRecord,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n onClientAvailable: (controller: FullConnectedSessionController) => {\n options.onClientAvailable?.(controller);\n },\n onClientClosed: options.onClientClosed,\n run: async ({ client, sessionId, record }) => {\n await withTimeout(client.setSessionModel(sessionId, options.modelId), options.timeoutMs);\n setDesiredModelId(record, options.modelId);\n setCurrentModelId(record, options.modelId);\n },\n });\n\n return {\n record: result.record,\n resumed: result.resumed,\n loadError: result.loadError,\n };\n}\n\nexport async function runSessionSetConfigOptionDirect(\n options: RunSessionSetConfigOptionDirectOptions,\n): Promise<SessionSetConfigOptionResult> {\n const result = await withConnectedSession({\n sessionRecordId: options.sessionRecordId,\n loadRecord: resolveSessionRecord,\n saveRecord: writeSessionRecord,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n onClientAvailable: (controller: FullConnectedSessionController) => {\n options.onClientAvailable?.(controller);\n },\n onClientClosed: options.onClientClosed,\n run: async ({ client, sessionId, record }) => {\n const response = await withTimeout(\n client.setSessionConfigOption(sessionId, options.configId, options.value),\n options.timeoutMs,\n );\n if (options.configId === \"mode\") {\n setDesiredModeId(record, options.value);\n }\n return response;\n },\n });\n\n return {\n record: result.record,\n response: result.value,\n resumed: result.resumed,\n loadError: result.loadError,\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n setCurrentModelId,\n setDesiredModeId,\n setDesiredModelId,\n} from \"../../session/mode-preference.js\";\nimport { resolveSessionRecord, writeSessionRecord, isoNow } from \"../../session/persistence.js\";\nimport type {\n SessionRecord,\n SessionSetConfigOptionResult,\n SessionSetModelResult,\n SessionSetModeResult,\n} from \"../../types.js\";\nimport {\n isProcessAlive,\n terminateProcess,\n terminateQueueOwnerForSession,\n tryCancelOnRunningOwner,\n trySetConfigOptionOnRunningOwner,\n trySetModelOnRunningOwner,\n trySetModeOnRunningOwner,\n} from \"../queue/ipc.js\";\nimport type {\n SessionCancelOptions,\n SessionCancelResult,\n SessionSetConfigOptionOptions,\n SessionSetModelOptions,\n SessionSetModeOptions,\n} from \"./contracts.js\";\nimport {\n runSessionSetConfigOptionDirect,\n runSessionSetModelDirect,\n runSessionSetModeDirect,\n} from \"./prompt-runner.js\";\n\nexport async function cancelSessionPrompt(\n options: SessionCancelOptions,\n): Promise<SessionCancelResult> {\n const cancelled = await tryCancelOnRunningOwner(options);\n return {\n sessionId: options.sessionId,\n cancelled: cancelled === true,\n };\n}\n\nexport async function setSessionMode(\n options: SessionSetModeOptions,\n): Promise<SessionSetModeResult> {\n const submittedToOwner = await trySetModeOnRunningOwner(\n options.sessionId,\n options.modeId,\n options.timeoutMs,\n options.verbose,\n );\n if (submittedToOwner) {\n const record = await resolveSessionRecord(options.sessionId);\n setDesiredModeId(record, options.modeId);\n await writeSessionRecord(record);\n return {\n record,\n resumed: false,\n };\n }\n\n return await runSessionSetModeDirect({\n sessionRecordId: options.sessionId,\n modeId: options.modeId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nexport async function setSessionModel(\n options: SessionSetModelOptions,\n): Promise<SessionSetModelResult> {\n const submittedToOwner = await trySetModelOnRunningOwner(\n options.sessionId,\n options.modelId,\n options.timeoutMs,\n options.verbose,\n );\n if (submittedToOwner) {\n const record = await resolveSessionRecord(options.sessionId);\n setDesiredModelId(record, options.modelId);\n setCurrentModelId(record, options.modelId);\n await writeSessionRecord(record);\n return {\n record,\n resumed: false,\n };\n }\n\n return await runSessionSetModelDirect({\n sessionRecordId: options.sessionId,\n modelId: options.modelId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nexport async function setSessionConfigOption(\n options: SessionSetConfigOptionOptions,\n): Promise<SessionSetConfigOptionResult> {\n const ownerResponse = await trySetConfigOptionOnRunningOwner(\n options.sessionId,\n options.configId,\n options.value,\n options.timeoutMs,\n options.verbose,\n );\n if (ownerResponse) {\n const record = await resolveSessionRecord(options.sessionId);\n if (options.configId === \"mode\") {\n setDesiredModeId(record, options.value);\n await writeSessionRecord(record);\n }\n return {\n record,\n response: ownerResponse,\n resumed: false,\n };\n }\n\n return await runSessionSetConfigOptionDirect({\n sessionRecordId: options.sessionId,\n configId: options.configId,\n value: options.value,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nfunction firstAgentCommandToken(command: string): string | undefined {\n const trimmed = command.trim();\n if (!trimmed) {\n return undefined;\n }\n const token = trimmed.split(/\\s+/, 1)[0];\n return token.length > 0 ? token : undefined;\n}\n\nasync function isLikelyMatchingProcess(pid: number, agentCommand: string): Promise<boolean> {\n const expectedToken = firstAgentCommandToken(agentCommand);\n if (!expectedToken) {\n return false;\n }\n\n const procCmdline = `/proc/${pid}/cmdline`;\n try {\n const payload = await fs.readFile(procCmdline, \"utf8\");\n const argv = payload\n .split(\"\\u0000\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n if (argv.length === 0) {\n return false;\n }\n\n const executableBase = path.basename(argv[0]);\n const expectedBase = path.basename(expectedToken);\n return (\n executableBase === expectedBase || argv.some((entry) => path.basename(entry) === expectedBase)\n );\n } catch {\n return true;\n }\n}\n\nexport async function closeSession(sessionId: string): Promise<SessionRecord> {\n const record = await resolveSessionRecord(sessionId);\n await terminateQueueOwnerForSession(record.acpxRecordId);\n\n if (\n record.pid != null &&\n isProcessAlive(record.pid) &&\n (await isLikelyMatchingProcess(record.pid, record.agentCommand))\n ) {\n await terminateProcess(record.pid);\n }\n\n record.pid = undefined;\n record.closed = true;\n record.closedAt = isoNow();\n await writeSessionRecord(record);\n\n return record;\n}\n","import { AcpClient, type SessionCreateResult } from \"../../acp/client.js\";\nimport { formatErrorMessage } from \"../../acp/error-normalization.js\";\nimport { withInterrupt, withTimeout } from \"../../async-control.js\";\nimport { createSessionConversation } from \"../../session/conversation-model.js\";\nimport { defaultSessionEventLog } from \"../../session/event-log.js\";\nimport { setCurrentModelId, syncAdvertisedModelState } from \"../../session/mode-preference.js\";\nimport {\n absolutePath,\n findGitRepositoryRoot,\n findSessionByDirectoryWalk,\n isoNow,\n normalizeName,\n writeSessionRecord,\n} from \"../../session/persistence.js\";\nimport { normalizeRuntimeSessionId } from \"../../session/runtime-session-id.js\";\nimport type { SessionEnsureResult, SessionRecord } from \"../../types.js\";\nimport { DEFAULT_QUEUE_OWNER_TTL_MS } from \"./contracts.js\";\nimport type {\n SessionAgentOptions,\n SessionCreateOptions,\n SessionCreateWithClientResult,\n SessionEnsureOptions,\n} from \"./contracts.js\";\nimport { setSessionModel } from \"./session-control.js\";\n\nfunction persistSessionOptions(\n record: SessionRecord,\n options: SessionAgentOptions | undefined,\n): void {\n const next =\n options &&\n ({\n model: typeof options.model === \"string\" ? options.model : undefined,\n allowed_tools: Array.isArray(options.allowedTools) ? [...options.allowedTools] : undefined,\n max_turns: typeof options.maxTurns === \"number\" ? options.maxTurns : undefined,\n } satisfies NonNullable<NonNullable<SessionRecord[\"acpx\"]>[\"session_options\"]>);\n\n const hasValues = Boolean(\n next &&\n ((typeof next.model === \"string\" && next.model.trim().length > 0) ||\n (Array.isArray(next.allowed_tools) && next.allowed_tools.length > 0) ||\n typeof next.max_turns === \"number\"),\n );\n\n if (hasValues && next) {\n record.acpx = {\n ...record.acpx,\n session_options: next,\n };\n return;\n }\n\n if (!record.acpx) {\n return;\n }\n\n delete record.acpx.session_options;\n}\n\nasync function applyRequestedModelIfAdvertised(params: {\n client: AcpClient;\n sessionId: string;\n requestedModel: string | undefined;\n models: SessionCreateResult[\"models\"];\n timeoutMs?: number;\n}): Promise<boolean> {\n const requestedModel =\n typeof params.requestedModel === \"string\" ? params.requestedModel.trim() : \"\";\n if (!requestedModel || !params.models) {\n return false;\n }\n if (params.models.currentModelId === requestedModel) {\n return true;\n }\n\n await withTimeout(\n params.client.setSessionModel(params.sessionId, requestedModel),\n params.timeoutMs,\n );\n return true;\n}\n\nasync function createSessionRecordWithClient(\n client: AcpClient,\n options: SessionCreateOptions,\n): Promise<SessionRecord> {\n const cwd = absolutePath(options.cwd);\n await withTimeout(client.start(), options.timeoutMs);\n let sessionId: string;\n let agentSessionId: string | undefined;\n let sessionModels: SessionCreateResult[\"models\"];\n let requestedModelApplied = false;\n\n if (options.resumeSessionId) {\n if (!client.supportsLoadSession()) {\n throw new Error(\n `Agent command \"${options.agentCommand}\" does not support session/load; cannot resume session ${options.resumeSessionId}`,\n );\n }\n\n try {\n const loadedSession = await withTimeout(\n client.loadSession(options.resumeSessionId, cwd),\n options.timeoutMs,\n );\n sessionId = options.resumeSessionId;\n agentSessionId = normalizeRuntimeSessionId(loadedSession.agentSessionId);\n sessionModels = loadedSession.models;\n requestedModelApplied = await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: sessionModels,\n timeoutMs: options.timeoutMs,\n });\n } catch (error) {\n throw new Error(\n `Failed to resume ACP session ${options.resumeSessionId}: ${formatErrorMessage(error)}`,\n {\n cause: error,\n },\n );\n }\n } else {\n const createdSession = await withTimeout(client.createSession(cwd), options.timeoutMs);\n sessionId = createdSession.sessionId;\n agentSessionId = normalizeRuntimeSessionId(createdSession.agentSessionId);\n sessionModels = createdSession.models;\n requestedModelApplied = await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: sessionModels,\n timeoutMs: options.timeoutMs,\n });\n }\n\n const lifecycle = client.getAgentLifecycleSnapshot();\n const now = isoNow();\n const record: SessionRecord = {\n schema: \"acpx.session.v1\",\n acpxRecordId: sessionId,\n acpSessionId: sessionId,\n agentSessionId,\n agentCommand: options.agentCommand,\n cwd,\n name: normalizeName(options.name),\n createdAt: now,\n lastUsedAt: now,\n lastSeq: 0,\n lastRequestId: undefined,\n eventLog: defaultSessionEventLog(sessionId),\n closed: false,\n closedAt: undefined,\n pid: lifecycle.pid,\n agentStartedAt: lifecycle.startedAt,\n protocolVersion: client.initializeResult?.protocolVersion,\n agentCapabilities: client.initializeResult?.agentCapabilities,\n ...createSessionConversation(now),\n acpx: {},\n };\n\n persistSessionOptions(record, options.sessionOptions);\n syncAdvertisedModelState(record, sessionModels);\n if (requestedModelApplied) {\n setCurrentModelId(record, options.sessionOptions?.model);\n }\n\n await writeSessionRecord(record);\n return record;\n}\n\nexport async function createSessionWithClient(\n options: SessionCreateOptions,\n): Promise<SessionCreateWithClientResult> {\n const client = new AcpClient({\n agentCommand: options.agentCommand,\n cwd: absolutePath(options.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n verbose: options.verbose,\n sessionOptions: options.sessionOptions,\n });\n\n try {\n const record = await withInterrupt(\n async () => await createSessionRecordWithClient(client, options),\n async () => {\n await client.close();\n },\n );\n\n return {\n record,\n client,\n };\n } catch (error) {\n await client.close();\n throw error;\n }\n}\n\nexport async function createSession(options: SessionCreateOptions): Promise<SessionRecord> {\n const { record, client } = await createSessionWithClient(options);\n try {\n return record;\n } finally {\n await client.close();\n }\n}\n\nexport async function ensureSession(options: SessionEnsureOptions): Promise<SessionEnsureResult> {\n const cwd = absolutePath(options.cwd);\n const gitRoot = findGitRepositoryRoot(cwd);\n const walkBoundary = options.walkBoundary ?? gitRoot ?? cwd;\n const existing = await findSessionByDirectoryWalk({\n agentCommand: options.agentCommand,\n cwd,\n name: options.name,\n boundary: walkBoundary,\n });\n if (existing) {\n const requestedModel = options.sessionOptions?.model;\n if (requestedModel) {\n const result = await setSessionModel({\n sessionId: existing.acpxRecordId,\n modelId: requestedModel,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n return { record: result.record, created: false };\n }\n return {\n record: existing,\n created: false,\n };\n }\n\n const record = await createSession({\n agentCommand: options.agentCommand,\n cwd,\n name: options.name,\n resumeSessionId: options.resumeSessionId,\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n sessionOptions: options.sessionOptions,\n });\n\n return {\n record,\n created: true,\n };\n}\n\nexport { DEFAULT_QUEUE_OWNER_TTL_MS };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { getPerfMetricsSnapshot, resetPerfMetrics } from \"./perf-metrics.js\";\n\nconst PERF_METRICS_FILE_ENV = \"ACPX_PERF_METRICS_FILE\";\n\nlet installed = false;\nlet flushed = false;\nlet captureFilePath: string | undefined;\nlet captureRole = \"cli\";\nlet captureArgv: string[] = [];\nlet captureSequence = 0;\n\ntype CaptureReason = \"checkpoint\" | \"exit\" | \"signal\";\n\nfunction shouldCapture(): boolean {\n return typeof captureFilePath === \"string\" && captureFilePath.trim().length > 0;\n}\n\nfunction buildPayload(reason: CaptureReason): Record<string, unknown> {\n return {\n timestamp: new Date().toISOString(),\n pid: process.pid,\n ppid: process.ppid,\n role: captureRole,\n argv: captureArgv,\n cwd: process.cwd(),\n sequence: captureSequence,\n reason,\n metrics: getPerfMetricsSnapshot(),\n };\n}\n\nfunction writePerfMetricsCapture(reason: CaptureReason, resetAfterWrite: boolean): boolean {\n if (!shouldCapture()) {\n return false;\n }\n\n const payload = buildPayload(reason);\n const metrics = payload.metrics as {\n counters?: Record<string, number>;\n gauges?: Record<string, number>;\n timings?: Record<string, unknown>;\n };\n const hasData =\n Object.keys(metrics.counters ?? {}).length > 0 ||\n Object.keys(metrics.gauges ?? {}).length > 0 ||\n Object.keys(metrics.timings ?? {}).length > 0;\n if (!hasData) {\n return false;\n }\n\n try {\n fs.mkdirSync(path.dirname(captureFilePath!), { recursive: true });\n fs.appendFileSync(captureFilePath!, `${JSON.stringify(payload)}\\n`, \"utf8\");\n captureSequence += 1;\n if (resetAfterWrite) {\n resetPerfMetrics();\n }\n return true;\n } catch {\n // metrics capture is best-effort only\n return false;\n }\n}\n\nexport function checkpointPerfMetricsCapture(): void {\n flushed = false;\n writePerfMetricsCapture(\"checkpoint\", true);\n}\n\nexport function flushPerfMetricsCapture(reason: CaptureReason = \"exit\"): void {\n if (flushed || !shouldCapture()) {\n return;\n }\n flushed = true;\n writePerfMetricsCapture(reason, false);\n}\n\nexport function installPerfMetricsCapture(\n options: {\n argv?: string[];\n role?: string;\n filePath?: string;\n } = {},\n): void {\n captureFilePath = options.filePath ?? process.env[PERF_METRICS_FILE_ENV];\n if (!shouldCapture()) {\n return;\n }\n\n resetPerfMetrics();\n captureRole = options.role ?? captureRole;\n captureArgv = options.argv ?? [];\n captureSequence = 0;\n flushed = false;\n\n if (installed) {\n return;\n }\n installed = true;\n\n process.once(\"exit\", () => {\n flushPerfMetricsCapture(\"exit\");\n });\n for (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n const handler = () => {\n flushPerfMetricsCapture(\"signal\");\n process.removeListener(signal, handler);\n process.kill(process.pid, signal);\n };\n process.once(signal, handler);\n }\n}\n\nexport function perfMetricsCaptureFileFromEnv(\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const value = env[PERF_METRICS_FILE_ENV];\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return undefined;\n }\n return value;\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { QueueConnectionError } from \"../../errors.js\";\n\nexport type QueueOwnerTurnState = \"idle\" | \"starting\" | \"active\" | \"closing\";\n\nexport type QueueOwnerActiveSessionController = {\n hasActivePrompt: () => boolean;\n requestCancelActivePrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string) => Promise<void>;\n setSessionModel: (modelId: string) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\ntype QueueOwnerTurnControllerOptions = {\n withTimeout: <T>(run: () => Promise<T>, timeoutMs?: number) => Promise<T>;\n setSessionModeFallback: (modeId: string, timeoutMs?: number) => Promise<void>;\n setSessionModelFallback: (modelId: string, timeoutMs?: number) => Promise<void>;\n setSessionConfigOptionFallback: (\n configId: string,\n value: string,\n timeoutMs?: number,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\nexport class QueueOwnerTurnController {\n private readonly options: QueueOwnerTurnControllerOptions;\n private state: QueueOwnerTurnState = \"idle\";\n private pendingCancel = false;\n private activeController?: QueueOwnerActiveSessionController;\n\n constructor(options: QueueOwnerTurnControllerOptions) {\n this.options = options;\n }\n\n get lifecycleState(): QueueOwnerTurnState {\n return this.state;\n }\n\n get hasPendingCancel(): boolean {\n return this.pendingCancel;\n }\n\n beginTurn(): void {\n this.state = \"starting\";\n this.pendingCancel = false;\n }\n\n markPromptActive(): void {\n if (this.state === \"starting\" || this.state === \"active\") {\n this.state = \"active\";\n }\n }\n\n endTurn(): void {\n this.state = \"idle\";\n this.pendingCancel = false;\n }\n\n beginClosing(): void {\n this.state = \"closing\";\n this.pendingCancel = false;\n this.activeController = undefined;\n }\n\n setActiveController(controller: QueueOwnerActiveSessionController): void {\n this.activeController = controller;\n }\n\n clearActiveController(): void {\n this.activeController = undefined;\n }\n\n private assertCanHandleControlRequest(): void {\n if (this.state === \"closing\") {\n throw new QueueConnectionError(\"Queue owner is closing\", {\n detailCode: \"QUEUE_OWNER_SHUTTING_DOWN\",\n origin: \"queue\",\n retryable: true,\n });\n }\n }\n\n async requestCancel(): Promise<boolean> {\n const activeController = this.activeController;\n if (activeController?.hasActivePrompt()) {\n const cancelled = await activeController.requestCancelActivePrompt();\n if (cancelled) {\n this.pendingCancel = false;\n }\n return cancelled;\n }\n\n if (this.state === \"starting\" || this.state === \"active\") {\n this.pendingCancel = true;\n return true;\n }\n\n return false;\n }\n\n async applyPendingCancel(): Promise<boolean> {\n const activeController = this.activeController;\n if (!this.pendingCancel || !activeController || !activeController.hasActivePrompt()) {\n return false;\n }\n\n const cancelled = await activeController.requestCancelActivePrompt();\n if (cancelled) {\n this.pendingCancel = false;\n }\n return cancelled;\n }\n\n async setSessionMode(modeId: string, timeoutMs?: number): Promise<void> {\n this.assertCanHandleControlRequest();\n const activeController = this.activeController;\n if (activeController) {\n await this.options.withTimeout(\n async () => await activeController.setSessionMode(modeId),\n timeoutMs,\n );\n return;\n }\n\n await this.options.setSessionModeFallback(modeId, timeoutMs);\n }\n\n async setSessionModel(modelId: string, timeoutMs?: number): Promise<void> {\n this.assertCanHandleControlRequest();\n const activeController = this.activeController;\n if (activeController) {\n await this.options.withTimeout(\n async () => await activeController.setSessionModel(modelId),\n timeoutMs,\n );\n return;\n }\n\n await this.options.setSessionModelFallback(modelId, timeoutMs);\n }\n\n async setSessionConfigOption(\n configId: string,\n value: string,\n timeoutMs?: number,\n ): Promise<SetSessionConfigOptionResponse> {\n this.assertCanHandleControlRequest();\n const activeController = this.activeController;\n if (activeController) {\n return await this.options.withTimeout(\n async () => await activeController.setSessionConfigOption(configId, value),\n timeoutMs,\n );\n }\n\n return await this.options.setSessionConfigOptionFallback(configId, value, timeoutMs);\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { realpathSync } from \"node:fs\";\nimport type {\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n PermissionMode,\n} from \"../../types.js\";\n\nexport type QueueOwnerRuntimeOptions = {\n sessionId: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n promptRetries?: number;\n};\n\ntype SessionSendLike = {\n sessionId: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n promptRetries?: number;\n};\n\nexport function sanitizeQueueOwnerExecArgv(\n execArgv: readonly string[] = process.execArgv,\n): string[] {\n const sanitized: string[] = [];\n for (let index = 0; index < execArgv.length; index += 1) {\n const value = execArgv[index];\n if (value === \"--experimental-test-coverage\" || value === \"--test\") {\n continue;\n }\n if (\n value === \"--test-name-pattern\" ||\n value === \"--test-reporter\" ||\n value === \"--test-reporter-destination\"\n ) {\n index += 1;\n continue;\n }\n if (value.startsWith(\"--test-\")) {\n continue;\n }\n if (\n value === \"--inspect\" ||\n value === \"--inspect-brk\" ||\n value === \"--inspect-port\" ||\n value === \"--inspect-publish-uid\" ||\n value.startsWith(\"--inspect=\") ||\n value.startsWith(\"--inspect-brk=\") ||\n value.startsWith(\"--inspect-port=\") ||\n value.startsWith(\"--inspect-publish-uid=\") ||\n value === \"--debug-port\" ||\n value.startsWith(\"--debug-port=\")\n ) {\n if (\n value === \"--inspect\" ||\n value === \"--inspect-brk\" ||\n value === \"--inspect-port\" ||\n value === \"--inspect-publish-uid\" ||\n value === \"--debug-port\"\n ) {\n index += 1;\n }\n continue;\n }\n sanitized.push(value);\n }\n return sanitized;\n}\n\nexport function buildQueueOwnerArgOverride(\n entryPath: string,\n execArgv: readonly string[] = process.execArgv,\n): string | null {\n const sanitized = sanitizeQueueOwnerExecArgv(execArgv);\n if (sanitized.length === 0) {\n return null;\n }\n return JSON.stringify([...sanitized, entryPath, \"__queue-owner\"]);\n}\n\nexport function resolveQueueOwnerSpawnArgs(argv: readonly string[] = process.argv): string[] {\n const override = process.env.ACPX_QUEUE_OWNER_ARGS;\n if (override) {\n const parsed = JSON.parse(override) as unknown;\n if (\n Array.isArray(parsed) &&\n parsed.length > 0 &&\n parsed.every((value) => typeof value === \"string\" && value.length > 0)\n ) {\n return [...parsed];\n }\n throw new Error(\"acpx self-spawn failed: invalid ACPX_QUEUE_OWNER_ARGS\");\n }\n\n const entry = argv[1];\n if (!entry || entry.trim().length === 0) {\n throw new Error(\"acpx self-spawn failed: missing CLI entry path\");\n }\n const resolvedEntry = realpathSync(entry);\n return [resolvedEntry, \"__queue-owner\"];\n}\n\nexport function queueOwnerRuntimeOptionsFromSend(\n options: SessionSendLike,\n): QueueOwnerRuntimeOptions {\n return {\n sessionId: options.sessionId,\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n ttlMs: options.ttlMs,\n maxQueueDepth: options.maxQueueDepth,\n promptRetries: options.promptRetries,\n };\n}\n\nexport function buildQueueOwnerSpawnOptions(payload: string): {\n detached: true;\n stdio: \"ignore\";\n env: NodeJS.ProcessEnv;\n windowsHide: true;\n} {\n return {\n detached: true,\n stdio: \"ignore\",\n env: {\n ...process.env,\n ACPX_QUEUE_OWNER_PAYLOAD: payload,\n },\n windowsHide: true,\n };\n}\n\nexport function spawnQueueOwnerProcess(options: QueueOwnerRuntimeOptions): void {\n const payload = JSON.stringify(options);\n const child = spawn(\n process.execPath,\n resolveQueueOwnerSpawnArgs(),\n buildQueueOwnerSpawnOptions(payload),\n );\n child.unref();\n}\n","import fs from \"node:fs/promises\";\nimport { isAcpJsonRpcMessage } from \"../acp/jsonrpc.js\";\nimport { isProcessAlive } from \"../cli/queue/lease-store.js\";\nimport { incrementPerfCounter, measurePerf } from \"../perf-metrics.js\";\nimport type { AcpJsonRpcMessage, SessionRecord } from \"../types.js\";\nimport {\n DEFAULT_EVENT_MAX_SEGMENTS,\n DEFAULT_EVENT_SEGMENT_MAX_BYTES,\n sessionBaseDir,\n sessionEventActivePath as activeEventPath,\n sessionEventLockPath as eventsLockPath,\n sessionEventSegmentPath as segmentEventPath,\n} from \"./event-log.js\";\nimport { resolveSessionRecord, writeSessionRecord } from \"./persistence.js\";\n\nconst LOCK_RETRY_MS = 15;\nconst EVENT_LOCK_STALE_MS = 15_000;\n\nasync function ensureSessionDir(): Promise<void> {\n await fs.mkdir(sessionBaseDir(), { recursive: true });\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function statSize(filePath: string): Promise<number> {\n try {\n const stats = await fs.stat(filePath);\n return stats.size;\n } catch {\n return 0;\n }\n}\n\nasync function countExistingSegments(sessionId: string, maxSegments: number): Promise<number> {\n let count = 0;\n\n for (let segment = 1; segment <= maxSegments; segment += 1) {\n if (await pathExists(segmentEventPath(sessionId, segment))) {\n count += 1;\n }\n }\n\n if (await pathExists(activeEventPath(sessionId))) {\n count += 1;\n }\n\n return count;\n}\n\nasync function resolveSessionMaxSegments(sessionId: string): Promise<number> {\n try {\n const record = await resolveSessionRecord(sessionId);\n const configured = record.eventLog.max_segments;\n if (Number.isInteger(configured) && configured > 0) {\n return configured;\n }\n } catch {\n // Fall back to defaults when metadata is unavailable.\n }\n\n return DEFAULT_EVENT_MAX_SEGMENTS;\n}\n\nasync function rotateSegments(sessionId: string, maxSegments: number): Promise<void> {\n const active = activeEventPath(sessionId);\n\n const overflow = segmentEventPath(sessionId, maxSegments);\n await fs.unlink(overflow).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n\n for (let segment = maxSegments - 1; segment >= 1; segment -= 1) {\n const from = segmentEventPath(sessionId, segment);\n const to = segmentEventPath(sessionId, segment + 1);\n if (!(await pathExists(from))) {\n continue;\n }\n await fs.rename(from, to);\n }\n\n if (await pathExists(active)) {\n await fs.rename(active, segmentEventPath(sessionId, 1));\n }\n}\n\ntype LockHandle = {\n filePath: string;\n};\n\ntype EventLockPayload = {\n pid?: number;\n created_at?: string;\n};\n\nfunction parseEventLockPayload(raw: string): EventLockPayload {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {};\n }\n const record = parsed as Record<string, unknown>;\n return {\n pid: typeof record.pid === \"number\" ? record.pid : undefined,\n created_at: typeof record.created_at === \"string\" ? record.created_at : undefined,\n };\n } catch {\n return {};\n }\n}\n\nasync function removeStaleEventLock(lockPath: string): Promise<boolean> {\n try {\n const payload = await fs.readFile(lockPath, \"utf8\");\n const parsed = parseEventLockPayload(payload);\n const createdAtMs = parsed.created_at ? Date.parse(parsed.created_at) : Number.NaN;\n const lockAgeMs = Number.isFinite(createdAtMs)\n ? Date.now() - createdAtMs\n : Number.POSITIVE_INFINITY;\n const pidAlive = isProcessAlive(parsed.pid);\n if (pidAlive && lockAgeMs <= EVENT_LOCK_STALE_MS) {\n return false;\n }\n await fs.unlink(lockPath);\n incrementPerfCounter(\"session.events.stale_lock_recovered\");\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return true;\n }\n return false;\n }\n}\n\nasync function acquireEventsLock(sessionId: string): Promise<LockHandle> {\n await ensureSessionDir();\n const lockPath = eventsLockPath(sessionId);\n const payload = JSON.stringify(\n {\n pid: process.pid,\n created_at: new Date().toISOString(),\n },\n null,\n 2,\n );\n\n for (;;) {\n try {\n await fs.writeFile(lockPath, `${payload}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n return { filePath: lockPath };\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"EEXIST\") {\n throw error;\n }\n const recovered = await removeStaleEventLock(lockPath);\n if (recovered) {\n continue;\n }\n await new Promise<void>((resolve) => {\n setTimeout(resolve, LOCK_RETRY_MS);\n });\n }\n }\n}\n\nasync function releaseEventsLock(lock: LockHandle): Promise<void> {\n await fs.unlink(lock.filePath).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n}\n\ntype SessionEventWriterOptions = {\n maxSegmentBytes?: number;\n maxSegments?: number;\n};\n\ntype AppendOptions = {\n checkpoint?: boolean;\n};\n\nexport class SessionEventWriter {\n private readonly record: SessionRecord;\n private readonly lock: LockHandle;\n private readonly maxSegmentBytes: number;\n private readonly maxSegments: number;\n private activePath: string;\n private activeSizeBytes: number;\n private segmentCount: number;\n private closed = false;\n\n private constructor(\n record: SessionRecord,\n lock: LockHandle,\n options: Required<SessionEventWriterOptions>,\n state: {\n activePath: string;\n activeSizeBytes: number;\n segmentCount: number;\n },\n ) {\n this.record = record;\n this.lock = lock;\n this.maxSegmentBytes = options.maxSegmentBytes;\n this.maxSegments = options.maxSegments;\n this.activePath = state.activePath;\n this.activeSizeBytes = state.activeSizeBytes;\n this.segmentCount = state.segmentCount;\n }\n\n static async open(\n record: SessionRecord,\n options: SessionEventWriterOptions = {},\n ): Promise<SessionEventWriter> {\n const lock = await acquireEventsLock(record.acpxRecordId);\n const maxSegmentBytes =\n options.maxSegmentBytes ??\n record.eventLog.max_segment_bytes ??\n DEFAULT_EVENT_SEGMENT_MAX_BYTES;\n const maxSegments =\n options.maxSegments ?? record.eventLog.max_segments ?? DEFAULT_EVENT_MAX_SEGMENTS;\n const activePath = activeEventPath(record.acpxRecordId);\n const activeSizeBytes = await statSize(activePath);\n const segmentCount =\n Number.isInteger(record.eventLog.segment_count) && record.eventLog.segment_count > 0\n ? record.eventLog.segment_count\n : (await countExistingSegments(record.acpxRecordId, maxSegments)) || 1;\n return new SessionEventWriter(\n record,\n lock,\n {\n maxSegmentBytes,\n maxSegments,\n },\n {\n activePath,\n activeSizeBytes,\n segmentCount,\n },\n );\n }\n\n getRecord(): SessionRecord {\n return this.record;\n }\n\n async appendMessage(message: AcpJsonRpcMessage, options: AppendOptions = {}): Promise<void> {\n await this.appendMessages([message], options);\n }\n\n async appendMessages(messages: AcpJsonRpcMessage[], options: AppendOptions = {}): Promise<void> {\n if (this.closed) {\n throw new Error(\"SessionEventWriter is closed\");\n }\n\n if (messages.length === 0) {\n return;\n }\n\n await ensureSessionDir();\n\n await measurePerf(\"session.events.append_batch\", async () => {\n for (const message of messages) {\n if (!isAcpJsonRpcMessage(message)) {\n throw new Error(\"Attempted to persist invalid ACP JSON-RPC payload\");\n }\n\n const line = `${JSON.stringify(message)}\\n`;\n const lineBytes = Buffer.byteLength(line);\n if (this.activeSizeBytes > 0 && this.activeSizeBytes + lineBytes > this.maxSegmentBytes) {\n await rotateSegments(this.record.acpxRecordId, this.maxSegments);\n this.activePath = activeEventPath(this.record.acpxRecordId);\n this.activeSizeBytes = 0;\n this.segmentCount = Math.min(this.segmentCount + 1, this.maxSegments);\n incrementPerfCounter(\"session.events.rotate\");\n }\n\n await fs.appendFile(this.activePath, line, \"utf8\");\n this.activeSizeBytes += lineBytes;\n\n this.record.lastSeq += 1;\n if (Object.hasOwn(message, \"id\")) {\n const id = (message as { id?: unknown }).id;\n if (typeof id === \"string\" || typeof id === \"number\") {\n this.record.lastRequestId = String(id);\n }\n }\n const writeTs = new Date().toISOString();\n this.record.lastUsedAt = writeTs;\n this.record.eventLog = {\n active_path: this.activePath,\n segment_count: this.segmentCount,\n max_segment_bytes: this.maxSegmentBytes,\n max_segments: this.maxSegments,\n last_write_at: writeTs,\n last_write_error: null,\n };\n }\n });\n\n if (options.checkpoint === true) {\n await writeSessionRecord(this.record);\n }\n }\n\n async checkpoint(): Promise<void> {\n if (this.closed) {\n throw new Error(\"SessionEventWriter is closed\");\n }\n await writeSessionRecord(this.record);\n }\n\n async close(options: AppendOptions = {}): Promise<void> {\n if (this.closed) {\n return;\n }\n\n try {\n if (options.checkpoint !== false) {\n await writeSessionRecord(this.record);\n }\n } finally {\n this.closed = true;\n await releaseEventsLock(this.lock);\n }\n }\n}\n\nexport async function listSessionEvents(sessionId: string): Promise<AcpJsonRpcMessage[]> {\n const maxSegments = await resolveSessionMaxSegments(sessionId);\n const files: string[] = [];\n\n for (let segment = maxSegments; segment >= 1; segment -= 1) {\n const filePath = segmentEventPath(sessionId, segment);\n if (await pathExists(filePath)) {\n files.push(filePath);\n }\n }\n\n const active = activeEventPath(sessionId);\n if (await pathExists(active)) {\n files.push(active);\n }\n\n const events: AcpJsonRpcMessage[] = [];\n for (const filePath of files) {\n const payload = await fs.readFile(filePath, \"utf8\");\n const lines = payload.split(\"\\n\").filter((line) => line.trim().length > 0);\n for (const line of lines) {\n try {\n const parsed = JSON.parse(line);\n if (isAcpJsonRpcMessage(parsed)) {\n events.push(parsed);\n }\n } catch {\n // Skip malformed lines to keep event listing resilient.\n }\n }\n }\n\n return events;\n}\n","import { AcpClient } from \"../../acp/client.js\";\nimport {\n formatErrorMessage,\n isRetryablePromptError,\n normalizeOutputError,\n} from \"../../acp/error-normalization.js\";\nimport { InterruptedError, withInterrupt, withTimeout } from \"../../async-control.js\";\nexport { InterruptedError, TimeoutError } from \"../../async-control.js\";\nimport { formatPerfMetric, measurePerf, startPerfTimer } from \"../../perf-metrics.js\";\nimport { textPrompt } from \"../../prompt-content.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\n} from \"../../runtime/engine/lifecycle.js\";\nimport { runPromptTurn } from \"../../runtime/engine/prompt-turn.js\";\nimport { connectAndLoadSession } from \"../../runtime/engine/reconnect.js\";\nimport { sessionOptionsFromRecord } from \"../../runtime/engine/session-options.js\";\nimport {\n cloneSessionAcpxState,\n cloneSessionConversation,\n recordClientOperation as recordConversationClientOperation,\n recordPromptSubmission,\n recordSessionUpdate as recordConversationSessionUpdate,\n trimConversationForRuntime,\n} from \"../../session/conversation-model.js\";\nimport { SessionEventWriter } from \"../../session/events.js\";\nimport { absolutePath, isoNow, resolveSessionRecord } from \"../../session/persistence.js\";\nimport type {\n AcpJsonRpcMessage,\n AcpMessageDirection,\n AuthPolicy,\n ClientOperation,\n McpServer,\n NonInteractivePermissionPolicy,\n OutputErrorAcpPayload,\n OutputErrorCode,\n OutputErrorOrigin,\n OutputFormatter,\n PermissionMode,\n PromptInput,\n RunPromptResult,\n SessionNotification,\n SessionResumePolicy,\n SessionSendResult,\n} from \"../../types.js\";\nimport { type QueueOwnerMessage, type QueueTask, waitMs } from \"../queue/ipc.js\";\nimport { type QueueOwnerActiveSessionController } from \"../queue/owner-turn-controller.js\";\nimport type { RunOnceOptions, SessionSendOptions } from \"./contracts.js\";\n\nconst INTERRUPT_CANCEL_WAIT_MS = 2_500;\n\ntype RunSessionPromptOptions = {\n sessionRecordId: string;\n prompt: PromptInput;\n resumePolicy?: SessionResumePolicy;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n outputFormatter: OutputFormatter;\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n promptRetries?: number;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n onPromptActive?: () => Promise<void> | void;\n client?: AcpClient;\n};\n\ntype ActiveSessionController = QueueOwnerActiveSessionController;\n\nclass QueueTaskOutputFormatter implements OutputFormatter {\n private readonly requestId: string;\n private readonly send: (message: QueueOwnerMessage) => void;\n\n constructor(task: QueueTask) {\n this.requestId = task.requestId;\n this.send = task.send;\n }\n\n setContext(_context: { sessionId: string }): void {}\n\n onAcpMessage(message: AcpJsonRpcMessage): void {\n this.send({\n type: \"event\",\n requestId: this.requestId,\n message,\n });\n }\n\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 this.send({\n type: \"error\",\n requestId: this.requestId,\n code: params.code,\n detailCode: params.detailCode,\n origin: params.origin,\n message: params.message,\n retryable: params.retryable,\n acp: params.acp,\n });\n }\n\n flush(): void {}\n}\n\nconst DISCARD_OUTPUT_FORMATTER: OutputFormatter = {\n setContext() {},\n onAcpMessage() {},\n onError() {},\n flush() {},\n};\n\nfunction toPromptResult(\n stopReason: RunPromptResult[\"stopReason\"],\n sessionId: string,\n client: AcpClient,\n): RunPromptResult {\n return {\n stopReason,\n sessionId,\n permissionStats: client.getPermissionStats(),\n };\n}\n\nasync function applyRequestedModelIfAdvertised(params: {\n client: AcpClient;\n sessionId: string;\n requestedModel: string | undefined;\n models: import(\"../../acp/client.js\").SessionCreateResult[\"models\"];\n timeoutMs?: number;\n}): Promise<boolean> {\n const requestedModel =\n typeof params.requestedModel === \"string\" ? params.requestedModel.trim() : \"\";\n if (!requestedModel || !params.models) {\n return false;\n }\n if (params.models.currentModelId === requestedModel) {\n return true;\n }\n\n await withTimeout(\n params.client.setSessionModel(params.sessionId, requestedModel),\n params.timeoutMs,\n );\n return true;\n}\n\nfunction jsonRpcIdKey(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return `s:${value}`;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return `n:${value}`;\n }\n return undefined;\n}\n\nfunction extractJsonRpcRequestInfo(\n message: AcpJsonRpcMessage,\n): { idKey: string; method: string } | undefined {\n const candidate = message as { method?: unknown; id?: unknown };\n if (typeof candidate.method !== \"string\") {\n return undefined;\n }\n const idKey = jsonRpcIdKey(candidate.id);\n if (!idKey) {\n return undefined;\n }\n return {\n idKey,\n method: candidate.method,\n };\n}\n\nfunction extractJsonRpcResponseInfo(\n message: AcpJsonRpcMessage,\n): { idKey: string; hasError: boolean } | undefined {\n const candidate = message as { id?: unknown; error?: unknown; result?: unknown };\n const idKey = jsonRpcIdKey(candidate.id);\n if (!idKey) {\n return undefined;\n }\n const hasError = Object.hasOwn(candidate, \"error\");\n const hasResult = Object.hasOwn(candidate, \"result\");\n if (!hasError && !hasResult) {\n return undefined;\n }\n return {\n idKey,\n hasError,\n };\n}\n\nfunction filterRecoverableLoadFallbackOutput(messages: AcpJsonRpcMessage[]): AcpJsonRpcMessage[] {\n const requestMethodById = new Map<string, string>();\n const failedLoadRequestIds = new Set<string>();\n\n for (const message of messages) {\n const request = extractJsonRpcRequestInfo(message);\n if (request) {\n requestMethodById.set(request.idKey, request.method);\n continue;\n }\n\n const response = extractJsonRpcResponseInfo(message);\n if (!response || !response.hasError) {\n continue;\n }\n\n if (requestMethodById.get(response.idKey) === \"session/load\") {\n failedLoadRequestIds.add(response.idKey);\n }\n }\n\n if (failedLoadRequestIds.size === 0) {\n return messages;\n }\n\n return messages.filter((message) => {\n const request = extractJsonRpcRequestInfo(message);\n if (request && request.method === \"session/load\" && failedLoadRequestIds.has(request.idKey)) {\n return false;\n }\n\n const response = extractJsonRpcResponseInfo(message);\n if (response && failedLoadRequestIds.has(response.idKey)) {\n return false;\n }\n\n return true;\n });\n}\n\nfunction emitPromptRetryNotice(params: {\n error: unknown;\n delayMs: number;\n attempt: number;\n maxRetries: number;\n suppressSdkConsoleErrors?: boolean;\n}): void {\n if (params.suppressSdkConsoleErrors) {\n return;\n }\n\n process.stderr.write(\n `[acpx] prompt failed (${formatErrorMessage(params.error)}), retrying in ${params.delayMs}ms ` +\n `(attempt ${params.attempt}/${params.maxRetries})\\n`,\n );\n}\n\nexport async function runQueuedTask(\n sessionRecordId: string,\n task: QueueTask,\n options: {\n sharedClient?: AcpClient;\n verbose?: boolean;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n suppressSdkConsoleErrors?: boolean;\n promptRetries?: number;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n onPromptActive?: () => Promise<void> | void;\n },\n): Promise<void> {\n const outputFormatter = task.waitForCompletion\n ? new QueueTaskOutputFormatter(task)\n : DISCARD_OUTPUT_FORMATTER;\n\n try {\n const result = await runSessionPrompt({\n sessionRecordId,\n mcpServers: options.mcpServers,\n prompt: task.prompt ?? textPrompt(task.message),\n permissionMode: task.permissionMode,\n resumePolicy: task.resumePolicy,\n nonInteractivePermissions:\n task.nonInteractivePermissions ?? options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n outputFormatter,\n timeoutMs: task.timeoutMs,\n suppressSdkConsoleErrors: task.suppressSdkConsoleErrors ?? options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n promptRetries: options.promptRetries,\n onClientAvailable: options.onClientAvailable,\n onClientClosed: options.onClientClosed,\n onPromptActive: options.onPromptActive,\n client: options.sharedClient,\n });\n\n if (task.waitForCompletion) {\n task.send({\n type: \"result\",\n requestId: task.requestId,\n result,\n });\n }\n } catch (error) {\n const normalizedError = normalizeOutputError(error, {\n origin: \"runtime\",\n detailCode: \"QUEUE_RUNTIME_PROMPT_FAILED\",\n });\n const alreadyEmitted =\n (error as { outputAlreadyEmitted?: unknown }).outputAlreadyEmitted === true;\n if (task.waitForCompletion) {\n task.send({\n type: \"error\",\n requestId: task.requestId,\n code: normalizedError.code,\n detailCode: normalizedError.detailCode,\n origin: normalizedError.origin,\n message: normalizedError.message,\n retryable: normalizedError.retryable,\n acp: normalizedError.acp,\n outputAlreadyEmitted: alreadyEmitted,\n });\n }\n\n if (error instanceof InterruptedError) {\n throw error;\n }\n } finally {\n task.close();\n }\n}\n\nasync function runSessionPrompt(options: RunSessionPromptOptions): Promise<SessionSendResult> {\n const stopTotalTimer = startPerfTimer(\"runtime.prompt.total\");\n const output = options.outputFormatter;\n const record = await measurePerf(\"session.resolve_prompt_record\", async () => {\n return await resolveSessionRecord(options.sessionRecordId);\n });\n const conversation = cloneSessionConversation(record);\n let acpxState = cloneSessionAcpxState(record.acpx);\n const promptMessageId = recordPromptSubmission(conversation, options.prompt, isoNow());\n\n output.setContext({\n sessionId: record.acpxRecordId,\n });\n\n const eventWriter = await measurePerf(\"session.events.open\", async () => {\n return await SessionEventWriter.open(record);\n });\n const pendingMessages: AcpJsonRpcMessage[] = [];\n const pendingConnectOutputMessages: AcpJsonRpcMessage[] = [];\n let bufferingConnectOutput = true;\n let promptTurnActive = false;\n let promptTurnHadSideEffects = false;\n let sawAcpMessage = false;\n let eventWriterClosed = false;\n\n const closeEventWriter = async (checkpoint: boolean): Promise<void> => {\n if (eventWriterClosed) {\n return;\n }\n eventWriterClosed = true;\n await eventWriter.close({ checkpoint });\n };\n\n const flushPendingMessages = async (checkpoint = false): Promise<void> => {\n if (pendingMessages.length === 0) {\n return;\n }\n\n const batch = pendingMessages.splice(0, pendingMessages.length);\n await measurePerf(\"session.events.flush_pending\", async () => {\n await eventWriter.appendMessages(batch, { checkpoint });\n });\n };\n\n const ownClient = options.client == null;\n const client =\n options.client ??\n new AcpClient({\n agentCommand: record.agentCommand,\n cwd: absolutePath(record.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n sessionOptions: sessionOptionsFromRecord(record),\n });\n client.updateRuntimeOptions({\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n });\n client.setEventHandlers({\n onAcpMessage: (direction, message) => {\n sawAcpMessage = true;\n pendingMessages.push(message);\n options.onAcpMessage?.(direction, message);\n },\n onAcpOutputMessage: (_direction, message) => {\n if (bufferingConnectOutput) {\n pendingConnectOutputMessages.push(message);\n return;\n }\n output.onAcpMessage(message);\n },\n onSessionUpdate: (notification) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n acpxState = recordConversationSessionUpdate(conversation, acpxState, notification);\n trimConversationForRuntime(conversation);\n options.onSessionUpdate?.(notification);\n },\n onClientOperation: (operation) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n acpxState = recordConversationClientOperation(conversation, acpxState, operation);\n trimConversationForRuntime(conversation);\n options.onClientOperation?.(operation);\n },\n });\n let activeSessionIdForControl = record.acpSessionId;\n let notifiedClientAvailable = false;\n const activeController: ActiveSessionController = {\n hasActivePrompt: () => client.hasActivePrompt(),\n requestCancelActivePrompt: async () => await client.requestCancelActivePrompt(),\n setSessionMode: async (modeId: string) => {\n await client.setSessionMode(activeSessionIdForControl, modeId);\n },\n setSessionModel: async (modelId: string) => {\n await client.setSessionModel(activeSessionIdForControl, modelId);\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n return await client.setSessionConfigOption(activeSessionIdForControl, configId, value);\n },\n };\n\n try {\n return await withInterrupt(\n async () => {\n const connectStartedAt = Date.now();\n const {\n sessionId: activeSessionId,\n resumed,\n loadError,\n } = await measurePerf(\"runtime.connect_and_load\", async () => {\n try {\n return await connectAndLoadSession({\n client,\n record,\n resumePolicy: options.resumePolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n activeController,\n onClientAvailable: (controller) => {\n options.onClientAvailable?.(controller);\n notifiedClientAvailable = true;\n },\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionId) => {\n activeSessionIdForControl = sessionId;\n },\n });\n } catch (error) {\n bufferingConnectOutput = false;\n for (const message of pendingConnectOutputMessages) {\n output.onAcpMessage(message);\n }\n pendingConnectOutputMessages.length = 0;\n throw error;\n }\n });\n bufferingConnectOutput = false;\n const connectOutputMessages =\n loadError == null\n ? pendingConnectOutputMessages\n : filterRecoverableLoadFallbackOutput(pendingConnectOutputMessages);\n for (const message of connectOutputMessages) {\n output.onAcpMessage(message);\n }\n pendingConnectOutputMessages.length = 0;\n if (options.verbose) {\n process.stderr.write(\n `[acpx] ${formatPerfMetric(\"prompt.connect_and_load\", Date.now() - connectStartedAt)}\\n`,\n );\n }\n\n output.setContext({\n sessionId: record.acpxRecordId,\n });\n await flushPendingMessages(false);\n\n const maxRetries = options.promptRetries ?? 0;\n let response;\n promptTurnActive = true;\n for (let attempt = 0; ; attempt++) {\n try {\n const promptStartedAt = Date.now();\n response = await measurePerf(\"runtime.prompt.agent_turn\", async () => {\n return await runPromptTurn({\n client,\n sessionId: activeSessionId,\n prompt: options.prompt,\n timeoutMs: options.timeoutMs,\n conversation,\n promptMessageId,\n onPromptStarted:\n attempt === 0 && options.onPromptActive\n ? async () => {\n try {\n await options.onPromptActive?.();\n } catch (error) {\n if (options.verbose) {\n process.stderr.write(\n \"[acpx] onPromptActive hook failed: \" +\n formatErrorMessage(error) +\n \"\\n\",\n );\n }\n }\n }\n : undefined,\n });\n });\n if (options.verbose) {\n process.stderr.write(\n `[acpx] ${formatPerfMetric(\"prompt.agent_turn\", Date.now() - promptStartedAt)}\\n`,\n );\n }\n break;\n } catch (error) {\n const snapshot = client.getAgentLifecycleSnapshot();\n const agentCrashed = snapshot.lastExit?.unexpectedDuringPrompt === true;\n\n if (\n attempt < maxRetries &&\n !agentCrashed &&\n !promptTurnHadSideEffects &&\n isRetryablePromptError(error)\n ) {\n const delayMs = Math.min(1_000 * 2 ** attempt, 10_000);\n emitPromptRetryNotice({\n error,\n delayMs,\n attempt: attempt + 1,\n maxRetries,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n });\n await waitMs(delayMs);\n if (!promptTurnHadSideEffects) {\n continue;\n }\n }\n\n promptTurnActive = false;\n applyLifecycleSnapshotToRecord(record, snapshot);\n const lastExit = snapshot.lastExit;\n if (lastExit?.unexpectedDuringPrompt && options.verbose) {\n process.stderr.write(\n \"[acpx] agent disconnected during prompt (\" +\n lastExit.reason +\n \", exit=\" +\n lastExit.exitCode +\n \", signal=\" +\n (lastExit.signal ?? \"none\") +\n \")\\n\",\n );\n }\n\n const normalizedError = normalizeOutputError(error, {\n origin: \"runtime\",\n });\n\n await flushPendingMessages(false).catch(() => {\n // best effort while bubbling prompt failure\n });\n\n output.flush();\n\n record.lastUsedAt = isoNow();\n applyConversation(record, conversation);\n record.acpx = acpxState;\n\n const propagated =\n error instanceof Error ? error : new Error(formatErrorMessage(error));\n (propagated as { outputAlreadyEmitted?: boolean }).outputAlreadyEmitted = sawAcpMessage;\n (propagated as { normalizedOutputError?: unknown }).normalizedOutputError =\n normalizedError;\n throw propagated;\n }\n }\n promptTurnActive = false;\n\n await flushPendingMessages(false);\n output.flush();\n\n const now = isoNow();\n record.lastUsedAt = now;\n record.closed = false;\n record.closedAt = undefined;\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n applyConversation(record, conversation);\n record.acpx = acpxState;\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n stopTotalTimer();\n\n return {\n ...toPromptResult(response.stopReason, record.acpxRecordId, client),\n record,\n resumed,\n loadError,\n };\n },\n async () => {\n await client.cancelActivePrompt(INTERRUPT_CANCEL_WAIT_MS);\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n record.lastUsedAt = isoNow();\n applyConversation(record, conversation);\n record.acpx = acpxState;\n await flushPendingMessages(false).catch(() => {\n // best effort while process is being interrupted\n });\n if (ownClient) {\n await client.close();\n }\n },\n );\n } finally {\n if (options.verbose) {\n process.stderr.write(`[acpx] ${formatPerfMetric(\"prompt.total\", stopTotalTimer())}\\n`);\n } else {\n stopTotalTimer();\n }\n if (notifiedClientAvailable) {\n options.onClientClosed?.();\n }\n client.clearEventHandlers();\n if (ownClient) {\n await client.close();\n }\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n applyConversation(record, conversation);\n record.acpx = acpxState;\n await flushPendingMessages(false).catch(() => {\n // best effort on close\n });\n await closeEventWriter(true).catch(() => {\n // best effort on close\n });\n }\n}\n\nexport async function runOnce(options: RunOnceOptions): Promise<RunPromptResult> {\n const output = options.outputFormatter;\n let promptTurnActive = false;\n let promptTurnHadSideEffects = false;\n const client = new AcpClient({\n agentCommand: options.agentCommand,\n cwd: absolutePath(options.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n onAcpMessage: options.onAcpMessage,\n onAcpOutputMessage: (_direction, message) => output.onAcpMessage(message),\n onSessionUpdate: (notification) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n options.onSessionUpdate?.(notification);\n },\n onClientOperation: (operation) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n options.onClientOperation?.(operation);\n },\n sessionOptions: options.sessionOptions,\n });\n\n try {\n return await withInterrupt(\n async () => {\n await measurePerf(\"runtime.exec.start\", async () => {\n await withTimeout(client.start(), options.timeoutMs);\n });\n const createdSession = await measurePerf(\"runtime.exec.create_session\", async () => {\n return await withTimeout(\n client.createSession(absolutePath(options.cwd)),\n options.timeoutMs,\n );\n });\n const sessionId = createdSession.sessionId;\n await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: createdSession.models,\n timeoutMs: options.timeoutMs,\n });\n\n output.setContext({\n sessionId,\n });\n\n const maxRetries = options.promptRetries ?? 0;\n let response;\n promptTurnActive = true;\n for (let attempt = 0; ; attempt++) {\n try {\n response = await measurePerf(\"runtime.exec.prompt\", async () => {\n return await withTimeout(client.prompt(sessionId, options.prompt), options.timeoutMs);\n });\n break;\n } catch (error) {\n if (\n attempt < maxRetries &&\n !promptTurnHadSideEffects &&\n isRetryablePromptError(error)\n ) {\n const delayMs = Math.min(1_000 * 2 ** attempt, 10_000);\n emitPromptRetryNotice({\n error,\n delayMs,\n attempt: attempt + 1,\n maxRetries,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n });\n await waitMs(delayMs);\n if (!promptTurnHadSideEffects) {\n continue;\n }\n }\n promptTurnActive = false;\n throw error;\n }\n }\n promptTurnActive = false;\n output.flush();\n return toPromptResult(response.stopReason, sessionId, client);\n },\n async () => {\n await client.cancelActivePrompt(INTERRUPT_CANCEL_WAIT_MS);\n await client.close();\n },\n );\n } finally {\n await client.close();\n }\n}\n\nexport async function sendSessionDirect(options: SessionSendOptions): Promise<SessionSendResult> {\n return await runSessionPrompt({\n sessionRecordId: options.sessionId,\n prompt: options.prompt,\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n resumePolicy: options.resumePolicy,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n outputFormatter: options.outputFormatter,\n onAcpMessage: options.onAcpMessage,\n onSessionUpdate: options.onSessionUpdate,\n onClientOperation: options.onClientOperation,\n timeoutMs: options.timeoutMs,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n client: options.client,\n });\n}\n","import { AcpClient } from \"../../acp/client.js\";\nimport { formatErrorMessage } from \"../../acp/error-normalization.js\";\nimport { withTimeout } from \"../../async-control.js\";\nimport { checkpointPerfMetricsCapture } from \"../../perf-metrics-capture.js\";\nimport { setPerfGauge } from \"../../perf-metrics.js\";\nimport { promptToDisplayText } from \"../../prompt-content.js\";\nimport { applyLifecycleSnapshotToRecord } from \"../../runtime/engine/lifecycle.js\";\nimport { sessionOptionsFromRecord } from \"../../runtime/engine/session-options.js\";\nimport {\n absolutePath,\n resolveSessionRecord,\n writeSessionRecord,\n} from \"../../session/persistence.js\";\nimport type { SessionSendOutcome } from \"../../types.js\";\nimport {\n QUEUE_CONNECT_RETRY_MS,\n SessionQueueOwner,\n releaseQueueOwnerLease,\n tryAcquireQueueOwnerLease,\n trySubmitToRunningOwner,\n waitMs,\n} from \"../queue/ipc.js\";\nimport { refreshQueueOwnerLease } from \"../queue/lease-store.js\";\nimport { QueueOwnerTurnController } from \"../queue/owner-turn-controller.js\";\nimport {\n DEFAULT_QUEUE_OWNER_TTL_MS,\n normalizeQueueOwnerTtlMs,\n type SessionSendOptions,\n} from \"./contracts.js\";\nimport {\n runSessionSetConfigOptionDirect,\n runSessionSetModelDirect,\n runSessionSetModeDirect,\n type ActiveSessionController,\n} from \"./prompt-runner.js\";\nimport type { QueueOwnerRuntimeOptions } from \"./queue-owner-process.js\";\nimport { queueOwnerRuntimeOptionsFromSend, spawnQueueOwnerProcess } from \"./queue-owner-process.js\";\nimport { runQueuedTask } from \"./runtime.js\";\n\nconst QUEUE_OWNER_STARTUP_MAX_ATTEMPTS = 120;\nconst QUEUE_OWNER_HEARTBEAT_INTERVAL_MS = 5_000;\n\nasync function submitToRunningOwner(\n options: SessionSendOptions,\n waitForCompletion: boolean,\n): Promise<SessionSendOutcome | undefined> {\n return await trySubmitToRunningOwner({\n sessionId: options.sessionId,\n message: promptToDisplayText(options.prompt),\n prompt: options.prompt,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n outputFormatter: options.outputFormatter,\n errorEmissionPolicy: options.errorEmissionPolicy,\n timeoutMs: options.timeoutMs,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n waitForCompletion,\n verbose: options.verbose,\n });\n}\n\nexport async function runSessionQueueOwner(options: QueueOwnerRuntimeOptions): Promise<void> {\n const lease = await tryAcquireQueueOwnerLease(options.sessionId);\n if (!lease) {\n return;\n }\n\n const sessionRecord = await resolveSessionRecord(options.sessionId);\n let owner: SessionQueueOwner | undefined;\n let heartbeatTimer: NodeJS.Timeout | undefined;\n const sharedClient = new AcpClient({\n agentCommand: sessionRecord.agentCommand,\n cwd: absolutePath(sessionRecord.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n sessionOptions: sessionOptionsFromRecord(sessionRecord),\n });\n const ttlMs = normalizeQueueOwnerTtlMs(options.ttlMs);\n const maxQueueDepth = Math.max(1, Math.round(options.maxQueueDepth ?? 16));\n const taskPollTimeoutMs = ttlMs === 0 ? undefined : ttlMs;\n const initialTaskPollTimeoutMs =\n taskPollTimeoutMs == null ? undefined : Math.max(taskPollTimeoutMs, 1_000);\n const turnController = new QueueOwnerTurnController({\n withTimeout: async (run, timeoutMs) => await withTimeout(run(), timeoutMs),\n setSessionModeFallback: async (modeId: string, timeoutMs?: number) => {\n await runSessionSetModeDirect({\n sessionRecordId: options.sessionId,\n modeId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs,\n verbose: options.verbose,\n });\n },\n setSessionModelFallback: async (modelId: string, timeoutMs?: number) => {\n await runSessionSetModelDirect({\n sessionRecordId: options.sessionId,\n modelId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs,\n verbose: options.verbose,\n });\n },\n setSessionConfigOptionFallback: async (configId: string, value: string, timeoutMs?: number) => {\n const result = await runSessionSetConfigOptionDirect({\n sessionRecordId: options.sessionId,\n configId,\n value,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs,\n verbose: options.verbose,\n });\n return result.response;\n },\n });\n\n const applyPendingCancel = async (): Promise<boolean> => {\n return await turnController.applyPendingCancel();\n };\n\n const scheduleApplyPendingCancel = (): void => {\n void applyPendingCancel().catch((error) => {\n if (options.verbose) {\n process.stderr.write(\n `[acpx] failed to apply deferred cancel: ${formatErrorMessage(error)}\\n`,\n );\n }\n });\n };\n\n const setActiveController = (controller: ActiveSessionController) => {\n turnController.setActiveController(controller);\n scheduleApplyPendingCancel();\n };\n\n const clearActiveController = () => {\n turnController.clearActiveController();\n };\n\n const runPromptTurn = async <T>(run: () => Promise<T>): Promise<T> => {\n turnController.beginTurn();\n try {\n return await run();\n } finally {\n turnController.endTurn();\n }\n };\n\n try {\n owner = await SessionQueueOwner.start(\n lease,\n {\n cancelPrompt: async () => {\n const accepted = await turnController.requestCancel();\n if (!accepted) {\n return false;\n }\n await applyPendingCancel();\n return true;\n },\n setSessionMode: async (modeId: string, timeoutMs?: number) => {\n await turnController.setSessionMode(modeId, timeoutMs);\n },\n setSessionModel: async (modelId: string, timeoutMs?: number) => {\n await turnController.setSessionModel(modelId, timeoutMs);\n },\n setSessionConfigOption: async (configId: string, value: string, timeoutMs?: number) => {\n return await turnController.setSessionConfigOption(configId, value, timeoutMs);\n },\n },\n {\n maxQueueDepth,\n onQueueDepthChanged: (queueDepth) => {\n setPerfGauge(\"queue.owner.depth\", queueDepth);\n void refreshQueueOwnerLease(lease, { queueDepth }).catch(() => {\n // best effort heartbeat refresh while owner is live\n });\n },\n },\n );\n\n if (options.verbose) {\n process.stderr.write(\n `[acpx] queue owner ready for session ${options.sessionId} (ttlMs=${ttlMs}, maxQueueDepth=${maxQueueDepth})\\n`,\n );\n }\n await refreshQueueOwnerLease(lease, { queueDepth: owner.queueDepth() }).catch(() => {\n // best effort initial heartbeat\n });\n heartbeatTimer = setInterval(() => {\n void refreshQueueOwnerLease(lease, { queueDepth: owner?.queueDepth() ?? 0 }).catch(() => {\n // best effort heartbeat\n });\n }, QUEUE_OWNER_HEARTBEAT_INTERVAL_MS);\n\n let isFirstTask = true;\n while (true) {\n const pollTimeoutMs = isFirstTask ? initialTaskPollTimeoutMs : taskPollTimeoutMs;\n const task = await owner.nextTask(pollTimeoutMs);\n if (!task) {\n break;\n }\n isFirstTask = false;\n\n await runPromptTurn(async () => {\n try {\n await runQueuedTask(options.sessionId, task, {\n sharedClient,\n verbose: options.verbose,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n promptRetries: options.promptRetries,\n onClientAvailable: setActiveController,\n onClientClosed: clearActiveController,\n onPromptActive: async () => {\n turnController.markPromptActive();\n await applyPendingCancel();\n },\n });\n } finally {\n checkpointPerfMetricsCapture();\n }\n });\n }\n } finally {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n }\n turnController.beginClosing();\n if (owner) {\n await owner.close();\n }\n await sharedClient.close().catch(() => {\n // best effort while queue owner is shutting down\n });\n try {\n const record = await resolveSessionRecord(options.sessionId);\n applyLifecycleSnapshotToRecord(record, sharedClient.getAgentLifecycleSnapshot());\n await writeSessionRecord(record);\n } catch {\n // best effort — session may already be cleaned up\n }\n await releaseQueueOwnerLease(lease);\n\n if (options.verbose) {\n process.stderr.write(`[acpx] queue owner stopped for session ${options.sessionId}\\n`);\n }\n }\n}\n\nexport async function sendSession(options: SessionSendOptions): Promise<SessionSendOutcome> {\n const waitForCompletion = options.waitForCompletion !== false;\n\n const queuedToOwner = await submitToRunningOwner(options, waitForCompletion);\n if (queuedToOwner) {\n return queuedToOwner;\n }\n\n spawnQueueOwnerProcess(queueOwnerRuntimeOptionsFromSend(options));\n\n for (let attempt = 0; attempt < QUEUE_OWNER_STARTUP_MAX_ATTEMPTS; attempt += 1) {\n const queued = await submitToRunningOwner(options, waitForCompletion);\n if (queued) {\n return queued;\n }\n await waitMs(QUEUE_CONNECT_RETRY_MS);\n }\n\n throw new Error(`Session queue owner failed to start for session ${options.sessionId}`);\n}\n\nexport type { QueueOwnerRuntimeOptions };\nexport { DEFAULT_QUEUE_OWNER_TTL_MS };\n","export * from \"../cli/session/contracts.js\";\nexport * from \"../cli/session/session-management.js\";\nexport * from \"../cli/session/queue-owner-runtime.js\";\nexport * from \"../cli/session/session-control.js\";\nexport * from \"../cli/session/runtime.js\";\nexport {\n DEFAULT_HISTORY_LIMIT,\n findGitRepositoryRoot,\n findSession,\n findSessionByDirectoryWalk,\n listSessions,\n listSessionsForAgent,\n} from \"./persistence.js\";\nexport { isProcessAlive } from \"../cli/queue/ipc.js\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session-BtwAKtJ3.js","names":["fs","applyRequestedModelIfAdvertised","fs","segmentEventPath","activeEventPath","eventsLockPath","recordConversationSessionUpdate","recordConversationClientOperation"],"sources":["../src/cli/session/contracts.ts","../src/cli/session/prompt-runner.ts","../src/cli/session/session-control.ts","../src/cli/session/session-management.ts","../src/perf-metrics-capture.ts","../src/cli/queue/owner-turn-controller.ts","../src/cli/session/queue-owner-process.ts","../src/session/events.ts","../src/cli/session/runtime.ts","../src/cli/session/queue-owner-runtime.ts","../src/session/session.ts"],"sourcesContent":["import type { AcpClient } from \"../../acp/client.js\";\nimport type { SessionAgentOptions } from \"../../runtime/engine/session-options.js\";\nimport type {\n AcpJsonRpcMessage,\n AcpMessageDirection,\n AuthPolicy,\n ClientOperation,\n McpServer,\n NonInteractivePermissionPolicy,\n OutputErrorEmissionPolicy,\n OutputFormatter,\n PermissionMode,\n PromptInput,\n SessionNotification,\n SessionResumePolicy,\n SessionRecord,\n} from \"../../types.js\";\n\ntype TimedRunOptions = {\n timeoutMs?: number;\n};\n\nexport const DEFAULT_QUEUE_OWNER_TTL_MS = 300_000;\n\nexport function normalizeQueueOwnerTtlMs(ttlMs: number | undefined): number {\n if (ttlMs == null) {\n return DEFAULT_QUEUE_OWNER_TTL_MS;\n }\n\n if (!Number.isFinite(ttlMs) || ttlMs < 0) {\n return DEFAULT_QUEUE_OWNER_TTL_MS;\n }\n\n // 0 means keep alive forever (no TTL)\n return Math.round(ttlMs);\n}\n\nexport type RunOnceOptions = {\n agentCommand: string;\n cwd: string;\n prompt: PromptInput;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n outputFormatter: OutputFormatter;\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n sessionOptions?: SessionAgentOptions;\n promptRetries?: number;\n} & TimedRunOptions;\n\nexport type SessionCreateOptions = {\n agentCommand: string;\n cwd: string;\n name?: string;\n resumeSessionId?: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n verbose?: boolean;\n sessionOptions?: SessionAgentOptions;\n} & TimedRunOptions;\n\nexport type SessionSendOptions = {\n sessionId: string;\n prompt: PromptInput;\n resumePolicy?: SessionResumePolicy;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n outputFormatter: OutputFormatter;\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n errorEmissionPolicy?: OutputErrorEmissionPolicy;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n waitForCompletion?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n client?: AcpClient;\n promptRetries?: number;\n} & TimedRunOptions;\n\nexport type SessionEnsureOptions = {\n agentCommand: string;\n cwd: string;\n name?: string;\n resumeSessionId?: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n verbose?: boolean;\n walkBoundary?: string;\n sessionOptions?: SessionAgentOptions;\n} & TimedRunOptions;\n\nexport type SessionCancelOptions = {\n sessionId: string;\n verbose?: boolean;\n};\n\nexport type SessionCancelResult = {\n sessionId: string;\n cancelled: boolean;\n};\n\nexport type SessionSetModeOptions = {\n sessionId: string;\n modeId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n verbose?: boolean;\n} & TimedRunOptions;\n\nexport type SessionSetModelOptions = {\n sessionId: string;\n modelId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n verbose?: boolean;\n} & TimedRunOptions;\n\nexport type SessionSetConfigOptionOptions = {\n sessionId: string;\n configId: string;\n value: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n verbose?: boolean;\n} & TimedRunOptions;\n\nexport type SessionCreateWithClientResult = {\n record: SessionRecord;\n client: AcpClient;\n};\n\nexport type { SessionAgentOptions };\n","import { withTimeout } from \"../../async-control.js\";\nimport {\n withConnectedSession,\n type FullConnectedSessionController,\n} from \"../../runtime/engine/connected-session.js\";\nimport {\n setCurrentModelId,\n setDesiredModeId,\n setDesiredModelId,\n} from \"../../session/mode-preference.js\";\nimport { resolveSessionRecord, writeSessionRecord } from \"../../session/persistence.js\";\nimport type {\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n SessionSetConfigOptionResult,\n SessionSetModelResult,\n SessionSetModeResult,\n} from \"../../types.js\";\nimport type { QueueOwnerActiveSessionController } from \"../queue/owner-turn-controller.js\";\n\nexport type ActiveSessionController = QueueOwnerActiveSessionController;\n\nexport type RunSessionSetModeDirectOptions = {\n sessionRecordId: string;\n modeId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nexport type RunSessionSetConfigOptionDirectOptions = {\n sessionRecordId: string;\n configId: string;\n value: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nexport type RunSessionSetModelDirectOptions = {\n sessionRecordId: string;\n modelId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nexport async function runSessionSetModeDirect(\n options: RunSessionSetModeDirectOptions,\n): Promise<SessionSetModeResult> {\n const result = await withConnectedSession({\n sessionRecordId: options.sessionRecordId,\n loadRecord: resolveSessionRecord,\n saveRecord: writeSessionRecord,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n onClientAvailable: (controller: FullConnectedSessionController) => {\n options.onClientAvailable?.(controller);\n },\n onClientClosed: options.onClientClosed,\n run: async ({ client, sessionId, record }) => {\n await withTimeout(client.setSessionMode(sessionId, options.modeId), options.timeoutMs);\n setDesiredModeId(record, options.modeId);\n },\n });\n\n return {\n record: result.record,\n resumed: result.resumed,\n loadError: result.loadError,\n };\n}\n\nexport async function runSessionSetModelDirect(\n options: RunSessionSetModelDirectOptions,\n): Promise<SessionSetModelResult> {\n const result = await withConnectedSession({\n sessionRecordId: options.sessionRecordId,\n loadRecord: resolveSessionRecord,\n saveRecord: writeSessionRecord,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n onClientAvailable: (controller: FullConnectedSessionController) => {\n options.onClientAvailable?.(controller);\n },\n onClientClosed: options.onClientClosed,\n run: async ({ client, sessionId, record }) => {\n await withTimeout(client.setSessionModel(sessionId, options.modelId), options.timeoutMs);\n setDesiredModelId(record, options.modelId);\n setCurrentModelId(record, options.modelId);\n },\n });\n\n return {\n record: result.record,\n resumed: result.resumed,\n loadError: result.loadError,\n };\n}\n\nexport async function runSessionSetConfigOptionDirect(\n options: RunSessionSetConfigOptionDirectOptions,\n): Promise<SessionSetConfigOptionResult> {\n const result = await withConnectedSession({\n sessionRecordId: options.sessionRecordId,\n loadRecord: resolveSessionRecord,\n saveRecord: writeSessionRecord,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n onClientAvailable: (controller: FullConnectedSessionController) => {\n options.onClientAvailable?.(controller);\n },\n onClientClosed: options.onClientClosed,\n run: async ({ client, sessionId, record }) => {\n const response = await withTimeout(\n client.setSessionConfigOption(sessionId, options.configId, options.value),\n options.timeoutMs,\n );\n if (options.configId === \"mode\") {\n setDesiredModeId(record, options.value);\n }\n return response;\n },\n });\n\n return {\n record: result.record,\n response: result.value,\n resumed: result.resumed,\n loadError: result.loadError,\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n setCurrentModelId,\n setDesiredModeId,\n setDesiredModelId,\n} from \"../../session/mode-preference.js\";\nimport { resolveSessionRecord, writeSessionRecord, isoNow } from \"../../session/persistence.js\";\nimport type {\n SessionRecord,\n SessionSetConfigOptionResult,\n SessionSetModelResult,\n SessionSetModeResult,\n} from \"../../types.js\";\nimport {\n isProcessAlive,\n terminateProcess,\n terminateQueueOwnerForSession,\n tryCancelOnRunningOwner,\n trySetConfigOptionOnRunningOwner,\n trySetModelOnRunningOwner,\n trySetModeOnRunningOwner,\n} from \"../queue/ipc.js\";\nimport type {\n SessionCancelOptions,\n SessionCancelResult,\n SessionSetConfigOptionOptions,\n SessionSetModelOptions,\n SessionSetModeOptions,\n} from \"./contracts.js\";\nimport {\n runSessionSetConfigOptionDirect,\n runSessionSetModelDirect,\n runSessionSetModeDirect,\n} from \"./prompt-runner.js\";\n\nexport async function cancelSessionPrompt(\n options: SessionCancelOptions,\n): Promise<SessionCancelResult> {\n const cancelled = await tryCancelOnRunningOwner(options);\n return {\n sessionId: options.sessionId,\n cancelled: cancelled === true,\n };\n}\n\nexport async function setSessionMode(\n options: SessionSetModeOptions,\n): Promise<SessionSetModeResult> {\n const submittedToOwner = await trySetModeOnRunningOwner(\n options.sessionId,\n options.modeId,\n options.timeoutMs,\n options.verbose,\n );\n if (submittedToOwner) {\n const record = await resolveSessionRecord(options.sessionId);\n setDesiredModeId(record, options.modeId);\n await writeSessionRecord(record);\n return {\n record,\n resumed: false,\n };\n }\n\n return await runSessionSetModeDirect({\n sessionRecordId: options.sessionId,\n modeId: options.modeId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nexport async function setSessionModel(\n options: SessionSetModelOptions,\n): Promise<SessionSetModelResult> {\n const submittedToOwner = await trySetModelOnRunningOwner(\n options.sessionId,\n options.modelId,\n options.timeoutMs,\n options.verbose,\n );\n if (submittedToOwner) {\n const record = await resolveSessionRecord(options.sessionId);\n setDesiredModelId(record, options.modelId);\n setCurrentModelId(record, options.modelId);\n await writeSessionRecord(record);\n return {\n record,\n resumed: false,\n };\n }\n\n return await runSessionSetModelDirect({\n sessionRecordId: options.sessionId,\n modelId: options.modelId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nexport async function setSessionConfigOption(\n options: SessionSetConfigOptionOptions,\n): Promise<SessionSetConfigOptionResult> {\n const ownerResponse = await trySetConfigOptionOnRunningOwner(\n options.sessionId,\n options.configId,\n options.value,\n options.timeoutMs,\n options.verbose,\n );\n if (ownerResponse) {\n const record = await resolveSessionRecord(options.sessionId);\n if (options.configId === \"mode\") {\n setDesiredModeId(record, options.value);\n await writeSessionRecord(record);\n }\n return {\n record,\n response: ownerResponse,\n resumed: false,\n };\n }\n\n return await runSessionSetConfigOptionDirect({\n sessionRecordId: options.sessionId,\n configId: options.configId,\n value: options.value,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nfunction firstAgentCommandToken(command: string): string | undefined {\n const trimmed = command.trim();\n if (!trimmed) {\n return undefined;\n }\n const token = trimmed.split(/\\s+/, 1)[0];\n return token.length > 0 ? token : undefined;\n}\n\nasync function isLikelyMatchingProcess(pid: number, agentCommand: string): Promise<boolean> {\n const expectedToken = firstAgentCommandToken(agentCommand);\n if (!expectedToken) {\n return false;\n }\n\n const procCmdline = `/proc/${pid}/cmdline`;\n try {\n const payload = await fs.readFile(procCmdline, \"utf8\");\n const argv = payload\n .split(\"\\u0000\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n if (argv.length === 0) {\n return false;\n }\n\n const executableBase = path.basename(argv[0]);\n const expectedBase = path.basename(expectedToken);\n return (\n executableBase === expectedBase || argv.some((entry) => path.basename(entry) === expectedBase)\n );\n } catch {\n return true;\n }\n}\n\nexport async function closeSession(sessionId: string): Promise<SessionRecord> {\n const record = await resolveSessionRecord(sessionId);\n await terminateQueueOwnerForSession(record.acpxRecordId);\n\n if (\n record.pid != null &&\n isProcessAlive(record.pid) &&\n (await isLikelyMatchingProcess(record.pid, record.agentCommand))\n ) {\n await terminateProcess(record.pid);\n }\n\n record.pid = undefined;\n record.closed = true;\n record.closedAt = isoNow();\n await writeSessionRecord(record);\n\n return record;\n}\n","import { AcpClient, type SessionCreateResult } from \"../../acp/client.js\";\nimport { formatErrorMessage } from \"../../acp/error-normalization.js\";\nimport { withInterrupt, withTimeout } from \"../../async-control.js\";\nimport { createSessionConversation } from \"../../session/conversation-model.js\";\nimport { defaultSessionEventLog } from \"../../session/event-log.js\";\nimport { setCurrentModelId, syncAdvertisedModelState } from \"../../session/mode-preference.js\";\nimport {\n absolutePath,\n findGitRepositoryRoot,\n findSessionByDirectoryWalk,\n isoNow,\n normalizeName,\n writeSessionRecord,\n} from \"../../session/persistence.js\";\nimport { normalizeRuntimeSessionId } from \"../../session/runtime-session-id.js\";\nimport type { SessionEnsureResult, SessionRecord } from \"../../types.js\";\nimport { DEFAULT_QUEUE_OWNER_TTL_MS } from \"./contracts.js\";\nimport type {\n SessionAgentOptions,\n SessionCreateOptions,\n SessionCreateWithClientResult,\n SessionEnsureOptions,\n} from \"./contracts.js\";\nimport { setSessionModel } from \"./session-control.js\";\n\nfunction persistSessionOptions(\n record: SessionRecord,\n options: SessionAgentOptions | undefined,\n): void {\n const next =\n options &&\n ({\n model: typeof options.model === \"string\" ? options.model : undefined,\n allowed_tools: Array.isArray(options.allowedTools) ? [...options.allowedTools] : undefined,\n max_turns: typeof options.maxTurns === \"number\" ? options.maxTurns : undefined,\n } satisfies NonNullable<NonNullable<SessionRecord[\"acpx\"]>[\"session_options\"]>);\n\n const hasValues = Boolean(\n next &&\n ((typeof next.model === \"string\" && next.model.trim().length > 0) ||\n (Array.isArray(next.allowed_tools) && next.allowed_tools.length > 0) ||\n typeof next.max_turns === \"number\"),\n );\n\n if (hasValues && next) {\n record.acpx = {\n ...record.acpx,\n session_options: next,\n };\n return;\n }\n\n if (!record.acpx) {\n return;\n }\n\n delete record.acpx.session_options;\n}\n\nasync function applyRequestedModelIfAdvertised(params: {\n client: AcpClient;\n sessionId: string;\n requestedModel: string | undefined;\n models: SessionCreateResult[\"models\"];\n timeoutMs?: number;\n}): Promise<boolean> {\n const requestedModel =\n typeof params.requestedModel === \"string\" ? params.requestedModel.trim() : \"\";\n if (!requestedModel || !params.models) {\n return false;\n }\n if (params.models.currentModelId === requestedModel) {\n return true;\n }\n\n await withTimeout(\n params.client.setSessionModel(params.sessionId, requestedModel),\n params.timeoutMs,\n );\n return true;\n}\n\nasync function createSessionRecordWithClient(\n client: AcpClient,\n options: SessionCreateOptions,\n): Promise<SessionRecord> {\n const cwd = absolutePath(options.cwd);\n await withTimeout(client.start(), options.timeoutMs);\n let sessionId: string;\n let agentSessionId: string | undefined;\n let sessionModels: SessionCreateResult[\"models\"];\n let requestedModelApplied = false;\n\n if (options.resumeSessionId) {\n if (!client.supportsLoadSession()) {\n throw new Error(\n `Agent command \"${options.agentCommand}\" does not support session/load; cannot resume session ${options.resumeSessionId}`,\n );\n }\n\n try {\n const loadedSession = await withTimeout(\n client.loadSession(options.resumeSessionId, cwd),\n options.timeoutMs,\n );\n sessionId = options.resumeSessionId;\n agentSessionId = normalizeRuntimeSessionId(loadedSession.agentSessionId);\n sessionModels = loadedSession.models;\n requestedModelApplied = await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: sessionModels,\n timeoutMs: options.timeoutMs,\n });\n } catch (error) {\n throw new Error(\n `Failed to resume ACP session ${options.resumeSessionId}: ${formatErrorMessage(error)}`,\n {\n cause: error,\n },\n );\n }\n } else {\n const createdSession = await withTimeout(client.createSession(cwd), options.timeoutMs);\n sessionId = createdSession.sessionId;\n agentSessionId = normalizeRuntimeSessionId(createdSession.agentSessionId);\n sessionModels = createdSession.models;\n requestedModelApplied = await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: sessionModels,\n timeoutMs: options.timeoutMs,\n });\n }\n\n const lifecycle = client.getAgentLifecycleSnapshot();\n const now = isoNow();\n const record: SessionRecord = {\n schema: \"acpx.session.v1\",\n acpxRecordId: sessionId,\n acpSessionId: sessionId,\n agentSessionId,\n agentCommand: options.agentCommand,\n cwd,\n name: normalizeName(options.name),\n createdAt: now,\n lastUsedAt: now,\n lastSeq: 0,\n lastRequestId: undefined,\n eventLog: defaultSessionEventLog(sessionId),\n closed: false,\n closedAt: undefined,\n pid: lifecycle.pid,\n agentStartedAt: lifecycle.startedAt,\n protocolVersion: client.initializeResult?.protocolVersion,\n agentCapabilities: client.initializeResult?.agentCapabilities,\n ...createSessionConversation(now),\n acpx: {},\n };\n\n persistSessionOptions(record, options.sessionOptions);\n syncAdvertisedModelState(record, sessionModels);\n if (requestedModelApplied) {\n setCurrentModelId(record, options.sessionOptions?.model);\n }\n\n await writeSessionRecord(record);\n return record;\n}\n\nexport async function createSessionWithClient(\n options: SessionCreateOptions,\n): Promise<SessionCreateWithClientResult> {\n const client = new AcpClient({\n agentCommand: options.agentCommand,\n cwd: absolutePath(options.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n verbose: options.verbose,\n sessionOptions: options.sessionOptions,\n });\n\n try {\n const record = await withInterrupt(\n async () => await createSessionRecordWithClient(client, options),\n async () => {\n await client.close();\n },\n );\n\n return {\n record,\n client,\n };\n } catch (error) {\n await client.close();\n throw error;\n }\n}\n\nexport async function createSession(options: SessionCreateOptions): Promise<SessionRecord> {\n const { record, client } = await createSessionWithClient(options);\n try {\n return record;\n } finally {\n await client.close();\n }\n}\n\nexport async function ensureSession(options: SessionEnsureOptions): Promise<SessionEnsureResult> {\n const cwd = absolutePath(options.cwd);\n const gitRoot = findGitRepositoryRoot(cwd);\n const walkBoundary = options.walkBoundary ?? gitRoot ?? cwd;\n const existing = await findSessionByDirectoryWalk({\n agentCommand: options.agentCommand,\n cwd,\n name: options.name,\n boundary: walkBoundary,\n });\n if (existing) {\n const requestedModel = options.sessionOptions?.model;\n if (requestedModel) {\n const result = await setSessionModel({\n sessionId: existing.acpxRecordId,\n modelId: requestedModel,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n return { record: result.record, created: false };\n }\n return {\n record: existing,\n created: false,\n };\n }\n\n const record = await createSession({\n agentCommand: options.agentCommand,\n cwd,\n name: options.name,\n resumeSessionId: options.resumeSessionId,\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n sessionOptions: options.sessionOptions,\n });\n\n return {\n record,\n created: true,\n };\n}\n\nexport { DEFAULT_QUEUE_OWNER_TTL_MS };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { getPerfMetricsSnapshot, resetPerfMetrics } from \"./perf-metrics.js\";\n\nconst PERF_METRICS_FILE_ENV = \"ACPX_PERF_METRICS_FILE\";\n\nlet installed = false;\nlet flushed = false;\nlet captureFilePath: string | undefined;\nlet captureRole = \"cli\";\nlet captureArgv: string[] = [];\nlet captureSequence = 0;\n\ntype CaptureReason = \"checkpoint\" | \"exit\" | \"signal\";\n\nfunction shouldCapture(): boolean {\n return typeof captureFilePath === \"string\" && captureFilePath.trim().length > 0;\n}\n\nfunction buildPayload(reason: CaptureReason): Record<string, unknown> {\n return {\n timestamp: new Date().toISOString(),\n pid: process.pid,\n ppid: process.ppid,\n role: captureRole,\n argv: captureArgv,\n cwd: process.cwd(),\n sequence: captureSequence,\n reason,\n metrics: getPerfMetricsSnapshot(),\n };\n}\n\nfunction writePerfMetricsCapture(reason: CaptureReason, resetAfterWrite: boolean): boolean {\n if (!shouldCapture()) {\n return false;\n }\n\n const payload = buildPayload(reason);\n const metrics = payload.metrics as {\n counters?: Record<string, number>;\n gauges?: Record<string, number>;\n timings?: Record<string, unknown>;\n };\n const hasData =\n Object.keys(metrics.counters ?? {}).length > 0 ||\n Object.keys(metrics.gauges ?? {}).length > 0 ||\n Object.keys(metrics.timings ?? {}).length > 0;\n if (!hasData) {\n return false;\n }\n\n try {\n fs.mkdirSync(path.dirname(captureFilePath!), { recursive: true });\n fs.appendFileSync(captureFilePath!, `${JSON.stringify(payload)}\\n`, \"utf8\");\n captureSequence += 1;\n if (resetAfterWrite) {\n resetPerfMetrics();\n }\n return true;\n } catch {\n // metrics capture is best-effort only\n return false;\n }\n}\n\nexport function checkpointPerfMetricsCapture(): void {\n flushed = false;\n writePerfMetricsCapture(\"checkpoint\", true);\n}\n\nexport function flushPerfMetricsCapture(reason: CaptureReason = \"exit\"): void {\n if (flushed || !shouldCapture()) {\n return;\n }\n flushed = true;\n writePerfMetricsCapture(reason, false);\n}\n\nexport function installPerfMetricsCapture(\n options: {\n argv?: string[];\n role?: string;\n filePath?: string;\n } = {},\n): void {\n captureFilePath = options.filePath ?? process.env[PERF_METRICS_FILE_ENV];\n if (!shouldCapture()) {\n return;\n }\n\n resetPerfMetrics();\n captureRole = options.role ?? captureRole;\n captureArgv = options.argv ?? [];\n captureSequence = 0;\n flushed = false;\n\n if (installed) {\n return;\n }\n installed = true;\n\n process.once(\"exit\", () => {\n flushPerfMetricsCapture(\"exit\");\n });\n for (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n const handler = () => {\n flushPerfMetricsCapture(\"signal\");\n process.removeListener(signal, handler);\n process.kill(process.pid, signal);\n };\n process.once(signal, handler);\n }\n}\n\nexport function perfMetricsCaptureFileFromEnv(\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const value = env[PERF_METRICS_FILE_ENV];\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return undefined;\n }\n return value;\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { QueueConnectionError } from \"../../errors.js\";\n\nexport type QueueOwnerTurnState = \"idle\" | \"starting\" | \"active\" | \"closing\";\n\nexport type QueueOwnerActiveSessionController = {\n hasActivePrompt: () => boolean;\n requestCancelActivePrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string) => Promise<void>;\n setSessionModel: (modelId: string) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\ntype QueueOwnerTurnControllerOptions = {\n withTimeout: <T>(run: () => Promise<T>, timeoutMs?: number) => Promise<T>;\n setSessionModeFallback: (modeId: string, timeoutMs?: number) => Promise<void>;\n setSessionModelFallback: (modelId: string, timeoutMs?: number) => Promise<void>;\n setSessionConfigOptionFallback: (\n configId: string,\n value: string,\n timeoutMs?: number,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\nexport class QueueOwnerTurnController {\n private readonly options: QueueOwnerTurnControllerOptions;\n private state: QueueOwnerTurnState = \"idle\";\n private pendingCancel = false;\n private activeController?: QueueOwnerActiveSessionController;\n\n constructor(options: QueueOwnerTurnControllerOptions) {\n this.options = options;\n }\n\n get lifecycleState(): QueueOwnerTurnState {\n return this.state;\n }\n\n get hasPendingCancel(): boolean {\n return this.pendingCancel;\n }\n\n beginTurn(): void {\n this.state = \"starting\";\n this.pendingCancel = false;\n }\n\n markPromptActive(): void {\n if (this.state === \"starting\" || this.state === \"active\") {\n this.state = \"active\";\n }\n }\n\n endTurn(): void {\n this.state = \"idle\";\n this.pendingCancel = false;\n }\n\n beginClosing(): void {\n this.state = \"closing\";\n this.pendingCancel = false;\n this.activeController = undefined;\n }\n\n setActiveController(controller: QueueOwnerActiveSessionController): void {\n this.activeController = controller;\n }\n\n clearActiveController(): void {\n this.activeController = undefined;\n }\n\n private assertCanHandleControlRequest(): void {\n if (this.state === \"closing\") {\n throw new QueueConnectionError(\"Queue owner is closing\", {\n detailCode: \"QUEUE_OWNER_SHUTTING_DOWN\",\n origin: \"queue\",\n retryable: true,\n });\n }\n }\n\n async requestCancel(): Promise<boolean> {\n const activeController = this.activeController;\n if (activeController?.hasActivePrompt()) {\n const cancelled = await activeController.requestCancelActivePrompt();\n if (cancelled) {\n this.pendingCancel = false;\n }\n return cancelled;\n }\n\n if (this.state === \"starting\" || this.state === \"active\") {\n this.pendingCancel = true;\n return true;\n }\n\n return false;\n }\n\n async applyPendingCancel(): Promise<boolean> {\n const activeController = this.activeController;\n if (!this.pendingCancel || !activeController || !activeController.hasActivePrompt()) {\n return false;\n }\n\n const cancelled = await activeController.requestCancelActivePrompt();\n if (cancelled) {\n this.pendingCancel = false;\n }\n return cancelled;\n }\n\n async setSessionMode(modeId: string, timeoutMs?: number): Promise<void> {\n this.assertCanHandleControlRequest();\n const activeController = this.activeController;\n if (activeController) {\n await this.options.withTimeout(\n async () => await activeController.setSessionMode(modeId),\n timeoutMs,\n );\n return;\n }\n\n await this.options.setSessionModeFallback(modeId, timeoutMs);\n }\n\n async setSessionModel(modelId: string, timeoutMs?: number): Promise<void> {\n this.assertCanHandleControlRequest();\n const activeController = this.activeController;\n if (activeController) {\n await this.options.withTimeout(\n async () => await activeController.setSessionModel(modelId),\n timeoutMs,\n );\n return;\n }\n\n await this.options.setSessionModelFallback(modelId, timeoutMs);\n }\n\n async setSessionConfigOption(\n configId: string,\n value: string,\n timeoutMs?: number,\n ): Promise<SetSessionConfigOptionResponse> {\n this.assertCanHandleControlRequest();\n const activeController = this.activeController;\n if (activeController) {\n return await this.options.withTimeout(\n async () => await activeController.setSessionConfigOption(configId, value),\n timeoutMs,\n );\n }\n\n return await this.options.setSessionConfigOptionFallback(configId, value, timeoutMs);\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { realpathSync } from \"node:fs\";\nimport type {\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n PermissionMode,\n} from \"../../types.js\";\n\nexport type QueueOwnerRuntimeOptions = {\n sessionId: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n promptRetries?: number;\n};\n\ntype SessionSendLike = {\n sessionId: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n promptRetries?: number;\n};\n\nexport function sanitizeQueueOwnerExecArgv(\n execArgv: readonly string[] = process.execArgv,\n): string[] {\n const sanitized: string[] = [];\n for (let index = 0; index < execArgv.length; index += 1) {\n const value = execArgv[index];\n if (value === \"--experimental-test-coverage\" || value === \"--test\") {\n continue;\n }\n if (\n value === \"--test-name-pattern\" ||\n value === \"--test-reporter\" ||\n value === \"--test-reporter-destination\"\n ) {\n index += 1;\n continue;\n }\n if (value.startsWith(\"--test-\")) {\n continue;\n }\n if (\n value === \"--inspect\" ||\n value === \"--inspect-brk\" ||\n value === \"--inspect-port\" ||\n value === \"--inspect-publish-uid\" ||\n value.startsWith(\"--inspect=\") ||\n value.startsWith(\"--inspect-brk=\") ||\n value.startsWith(\"--inspect-port=\") ||\n value.startsWith(\"--inspect-publish-uid=\") ||\n value === \"--debug-port\" ||\n value.startsWith(\"--debug-port=\")\n ) {\n if (\n value === \"--inspect\" ||\n value === \"--inspect-brk\" ||\n value === \"--inspect-port\" ||\n value === \"--inspect-publish-uid\" ||\n value === \"--debug-port\"\n ) {\n index += 1;\n }\n continue;\n }\n sanitized.push(value);\n }\n return sanitized;\n}\n\nexport function buildQueueOwnerArgOverride(\n entryPath: string,\n execArgv: readonly string[] = process.execArgv,\n): string | null {\n const sanitized = sanitizeQueueOwnerExecArgv(execArgv);\n if (sanitized.length === 0) {\n return null;\n }\n return JSON.stringify([...sanitized, entryPath, \"__queue-owner\"]);\n}\n\nexport function resolveQueueOwnerSpawnArgs(argv: readonly string[] = process.argv): string[] {\n const override = process.env.ACPX_QUEUE_OWNER_ARGS;\n if (override) {\n const parsed = JSON.parse(override) as unknown;\n if (\n Array.isArray(parsed) &&\n parsed.length > 0 &&\n parsed.every((value) => typeof value === \"string\" && value.length > 0)\n ) {\n return [...parsed];\n }\n throw new Error(\"acpx self-spawn failed: invalid ACPX_QUEUE_OWNER_ARGS\");\n }\n\n const entry = argv[1];\n if (!entry || entry.trim().length === 0) {\n throw new Error(\"acpx self-spawn failed: missing CLI entry path\");\n }\n const resolvedEntry = realpathSync(entry);\n return [resolvedEntry, \"__queue-owner\"];\n}\n\nexport function queueOwnerRuntimeOptionsFromSend(\n options: SessionSendLike,\n): QueueOwnerRuntimeOptions {\n return {\n sessionId: options.sessionId,\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n ttlMs: options.ttlMs,\n maxQueueDepth: options.maxQueueDepth,\n promptRetries: options.promptRetries,\n };\n}\n\nexport function buildQueueOwnerSpawnOptions(payload: string): {\n detached: true;\n stdio: \"ignore\";\n env: NodeJS.ProcessEnv;\n windowsHide: true;\n} {\n return {\n detached: true,\n stdio: \"ignore\",\n env: {\n ...process.env,\n ACPX_QUEUE_OWNER_PAYLOAD: payload,\n },\n windowsHide: true,\n };\n}\n\nexport function spawnQueueOwnerProcess(options: QueueOwnerRuntimeOptions): void {\n const payload = JSON.stringify(options);\n const child = spawn(\n process.execPath,\n resolveQueueOwnerSpawnArgs(),\n buildQueueOwnerSpawnOptions(payload),\n );\n child.unref();\n}\n","import fs from \"node:fs/promises\";\nimport { isAcpJsonRpcMessage } from \"../acp/jsonrpc.js\";\nimport { isProcessAlive } from \"../cli/queue/lease-store.js\";\nimport { incrementPerfCounter, measurePerf } from \"../perf-metrics.js\";\nimport type { AcpJsonRpcMessage, SessionRecord } from \"../types.js\";\nimport {\n DEFAULT_EVENT_MAX_SEGMENTS,\n DEFAULT_EVENT_SEGMENT_MAX_BYTES,\n sessionBaseDir,\n sessionEventActivePath as activeEventPath,\n sessionEventLockPath as eventsLockPath,\n sessionEventSegmentPath as segmentEventPath,\n} from \"./event-log.js\";\nimport { resolveSessionRecord, writeSessionRecord } from \"./persistence.js\";\n\nconst LOCK_RETRY_MS = 15;\nconst EVENT_LOCK_STALE_MS = 15_000;\n\nasync function ensureSessionDir(): Promise<void> {\n await fs.mkdir(sessionBaseDir(), { recursive: true });\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function statSize(filePath: string): Promise<number> {\n try {\n const stats = await fs.stat(filePath);\n return stats.size;\n } catch {\n return 0;\n }\n}\n\nasync function countExistingSegments(sessionId: string, maxSegments: number): Promise<number> {\n let count = 0;\n\n for (let segment = 1; segment <= maxSegments; segment += 1) {\n if (await pathExists(segmentEventPath(sessionId, segment))) {\n count += 1;\n }\n }\n\n if (await pathExists(activeEventPath(sessionId))) {\n count += 1;\n }\n\n return count;\n}\n\nasync function resolveSessionMaxSegments(sessionId: string): Promise<number> {\n try {\n const record = await resolveSessionRecord(sessionId);\n const configured = record.eventLog.max_segments;\n if (Number.isInteger(configured) && configured > 0) {\n return configured;\n }\n } catch {\n // Fall back to defaults when metadata is unavailable.\n }\n\n return DEFAULT_EVENT_MAX_SEGMENTS;\n}\n\nasync function rotateSegments(sessionId: string, maxSegments: number): Promise<void> {\n const active = activeEventPath(sessionId);\n\n const overflow = segmentEventPath(sessionId, maxSegments);\n await fs.unlink(overflow).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n\n for (let segment = maxSegments - 1; segment >= 1; segment -= 1) {\n const from = segmentEventPath(sessionId, segment);\n const to = segmentEventPath(sessionId, segment + 1);\n if (!(await pathExists(from))) {\n continue;\n }\n await fs.rename(from, to);\n }\n\n if (await pathExists(active)) {\n await fs.rename(active, segmentEventPath(sessionId, 1));\n }\n}\n\ntype LockHandle = {\n filePath: string;\n};\n\ntype EventLockPayload = {\n pid?: number;\n created_at?: string;\n};\n\nfunction parseEventLockPayload(raw: string): EventLockPayload {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {};\n }\n const record = parsed as Record<string, unknown>;\n return {\n pid: typeof record.pid === \"number\" ? record.pid : undefined,\n created_at: typeof record.created_at === \"string\" ? record.created_at : undefined,\n };\n } catch {\n return {};\n }\n}\n\nasync function removeStaleEventLock(lockPath: string): Promise<boolean> {\n try {\n const payload = await fs.readFile(lockPath, \"utf8\");\n const parsed = parseEventLockPayload(payload);\n const createdAtMs = parsed.created_at ? Date.parse(parsed.created_at) : Number.NaN;\n const lockAgeMs = Number.isFinite(createdAtMs)\n ? Date.now() - createdAtMs\n : Number.POSITIVE_INFINITY;\n const pidAlive = isProcessAlive(parsed.pid);\n if (pidAlive && lockAgeMs <= EVENT_LOCK_STALE_MS) {\n return false;\n }\n await fs.unlink(lockPath);\n incrementPerfCounter(\"session.events.stale_lock_recovered\");\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return true;\n }\n return false;\n }\n}\n\nasync function acquireEventsLock(sessionId: string): Promise<LockHandle> {\n await ensureSessionDir();\n const lockPath = eventsLockPath(sessionId);\n const payload = JSON.stringify(\n {\n pid: process.pid,\n created_at: new Date().toISOString(),\n },\n null,\n 2,\n );\n\n for (;;) {\n try {\n await fs.writeFile(lockPath, `${payload}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n return { filePath: lockPath };\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"EEXIST\") {\n throw error;\n }\n const recovered = await removeStaleEventLock(lockPath);\n if (recovered) {\n continue;\n }\n await new Promise<void>((resolve) => {\n setTimeout(resolve, LOCK_RETRY_MS);\n });\n }\n }\n}\n\nasync function releaseEventsLock(lock: LockHandle): Promise<void> {\n await fs.unlink(lock.filePath).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n}\n\ntype SessionEventWriterOptions = {\n maxSegmentBytes?: number;\n maxSegments?: number;\n};\n\ntype AppendOptions = {\n checkpoint?: boolean;\n};\n\nexport class SessionEventWriter {\n private readonly record: SessionRecord;\n private readonly lock: LockHandle;\n private readonly maxSegmentBytes: number;\n private readonly maxSegments: number;\n private activePath: string;\n private activeSizeBytes: number;\n private segmentCount: number;\n private closed = false;\n\n private constructor(\n record: SessionRecord,\n lock: LockHandle,\n options: Required<SessionEventWriterOptions>,\n state: {\n activePath: string;\n activeSizeBytes: number;\n segmentCount: number;\n },\n ) {\n this.record = record;\n this.lock = lock;\n this.maxSegmentBytes = options.maxSegmentBytes;\n this.maxSegments = options.maxSegments;\n this.activePath = state.activePath;\n this.activeSizeBytes = state.activeSizeBytes;\n this.segmentCount = state.segmentCount;\n }\n\n static async open(\n record: SessionRecord,\n options: SessionEventWriterOptions = {},\n ): Promise<SessionEventWriter> {\n const lock = await acquireEventsLock(record.acpxRecordId);\n const maxSegmentBytes =\n options.maxSegmentBytes ??\n record.eventLog.max_segment_bytes ??\n DEFAULT_EVENT_SEGMENT_MAX_BYTES;\n const maxSegments =\n options.maxSegments ?? record.eventLog.max_segments ?? DEFAULT_EVENT_MAX_SEGMENTS;\n const activePath = activeEventPath(record.acpxRecordId);\n const activeSizeBytes = await statSize(activePath);\n const segmentCount =\n Number.isInteger(record.eventLog.segment_count) && record.eventLog.segment_count > 0\n ? record.eventLog.segment_count\n : (await countExistingSegments(record.acpxRecordId, maxSegments)) || 1;\n return new SessionEventWriter(\n record,\n lock,\n {\n maxSegmentBytes,\n maxSegments,\n },\n {\n activePath,\n activeSizeBytes,\n segmentCount,\n },\n );\n }\n\n getRecord(): SessionRecord {\n return this.record;\n }\n\n async appendMessage(message: AcpJsonRpcMessage, options: AppendOptions = {}): Promise<void> {\n await this.appendMessages([message], options);\n }\n\n async appendMessages(messages: AcpJsonRpcMessage[], options: AppendOptions = {}): Promise<void> {\n if (this.closed) {\n throw new Error(\"SessionEventWriter is closed\");\n }\n\n if (messages.length === 0) {\n return;\n }\n\n await ensureSessionDir();\n\n await measurePerf(\"session.events.append_batch\", async () => {\n for (const message of messages) {\n if (!isAcpJsonRpcMessage(message)) {\n throw new Error(\"Attempted to persist invalid ACP JSON-RPC payload\");\n }\n\n const line = `${JSON.stringify(message)}\\n`;\n const lineBytes = Buffer.byteLength(line);\n if (this.activeSizeBytes > 0 && this.activeSizeBytes + lineBytes > this.maxSegmentBytes) {\n await rotateSegments(this.record.acpxRecordId, this.maxSegments);\n this.activePath = activeEventPath(this.record.acpxRecordId);\n this.activeSizeBytes = 0;\n this.segmentCount = Math.min(this.segmentCount + 1, this.maxSegments);\n incrementPerfCounter(\"session.events.rotate\");\n }\n\n await fs.appendFile(this.activePath, line, \"utf8\");\n this.activeSizeBytes += lineBytes;\n\n this.record.lastSeq += 1;\n if (Object.hasOwn(message, \"id\")) {\n const id = (message as { id?: unknown }).id;\n if (typeof id === \"string\" || typeof id === \"number\") {\n this.record.lastRequestId = String(id);\n }\n }\n const writeTs = new Date().toISOString();\n this.record.lastUsedAt = writeTs;\n this.record.eventLog = {\n active_path: this.activePath,\n segment_count: this.segmentCount,\n max_segment_bytes: this.maxSegmentBytes,\n max_segments: this.maxSegments,\n last_write_at: writeTs,\n last_write_error: null,\n };\n }\n });\n\n if (options.checkpoint === true) {\n await writeSessionRecord(this.record);\n }\n }\n\n async checkpoint(): Promise<void> {\n if (this.closed) {\n throw new Error(\"SessionEventWriter is closed\");\n }\n await writeSessionRecord(this.record);\n }\n\n async close(options: AppendOptions = {}): Promise<void> {\n if (this.closed) {\n return;\n }\n\n try {\n if (options.checkpoint !== false) {\n await writeSessionRecord(this.record);\n }\n } finally {\n this.closed = true;\n await releaseEventsLock(this.lock);\n }\n }\n}\n\nexport async function listSessionEvents(sessionId: string): Promise<AcpJsonRpcMessage[]> {\n const maxSegments = await resolveSessionMaxSegments(sessionId);\n const files: string[] = [];\n\n for (let segment = maxSegments; segment >= 1; segment -= 1) {\n const filePath = segmentEventPath(sessionId, segment);\n if (await pathExists(filePath)) {\n files.push(filePath);\n }\n }\n\n const active = activeEventPath(sessionId);\n if (await pathExists(active)) {\n files.push(active);\n }\n\n const events: AcpJsonRpcMessage[] = [];\n for (const filePath of files) {\n const payload = await fs.readFile(filePath, \"utf8\");\n const lines = payload.split(\"\\n\").filter((line) => line.trim().length > 0);\n for (const line of lines) {\n try {\n const parsed = JSON.parse(line);\n if (isAcpJsonRpcMessage(parsed)) {\n events.push(parsed);\n }\n } catch {\n // Skip malformed lines to keep event listing resilient.\n }\n }\n }\n\n return events;\n}\n","import { AcpClient } from \"../../acp/client.js\";\nimport {\n formatErrorMessage,\n isRetryablePromptError,\n normalizeOutputError,\n} from \"../../acp/error-normalization.js\";\nimport { InterruptedError, withInterrupt, withTimeout } from \"../../async-control.js\";\nexport { InterruptedError, TimeoutError } from \"../../async-control.js\";\nimport { formatPerfMetric, measurePerf, startPerfTimer } from \"../../perf-metrics.js\";\nimport { textPrompt } from \"../../prompt-content.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\n} from \"../../runtime/engine/lifecycle.js\";\nimport { runPromptTurn } from \"../../runtime/engine/prompt-turn.js\";\nimport { connectAndLoadSession } from \"../../runtime/engine/reconnect.js\";\nimport { sessionOptionsFromRecord } from \"../../runtime/engine/session-options.js\";\nimport {\n cloneSessionAcpxState,\n cloneSessionConversation,\n recordClientOperation as recordConversationClientOperation,\n recordPromptSubmission,\n recordSessionUpdate as recordConversationSessionUpdate,\n trimConversationForRuntime,\n} from \"../../session/conversation-model.js\";\nimport { SessionEventWriter } from \"../../session/events.js\";\nimport { absolutePath, isoNow, resolveSessionRecord } from \"../../session/persistence.js\";\nimport type {\n AcpJsonRpcMessage,\n AcpMessageDirection,\n AuthPolicy,\n ClientOperation,\n McpServer,\n NonInteractivePermissionPolicy,\n OutputErrorAcpPayload,\n OutputErrorCode,\n OutputErrorOrigin,\n OutputFormatter,\n PermissionMode,\n PromptInput,\n RunPromptResult,\n SessionNotification,\n SessionResumePolicy,\n SessionSendResult,\n} from \"../../types.js\";\nimport { type QueueOwnerMessage, type QueueTask, waitMs } from \"../queue/ipc.js\";\nimport { type QueueOwnerActiveSessionController } from \"../queue/owner-turn-controller.js\";\nimport type { RunOnceOptions, SessionSendOptions } from \"./contracts.js\";\n\nconst INTERRUPT_CANCEL_WAIT_MS = 2_500;\n\ntype RunSessionPromptOptions = {\n sessionRecordId: string;\n prompt: PromptInput;\n resumePolicy?: SessionResumePolicy;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n outputFormatter: OutputFormatter;\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n promptRetries?: number;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n onPromptActive?: () => Promise<void> | void;\n client?: AcpClient;\n};\n\ntype ActiveSessionController = QueueOwnerActiveSessionController;\n\nclass QueueTaskOutputFormatter implements OutputFormatter {\n private readonly requestId: string;\n private readonly send: (message: QueueOwnerMessage) => void;\n\n constructor(task: QueueTask) {\n this.requestId = task.requestId;\n this.send = task.send;\n }\n\n setContext(_context: { sessionId: string }): void {}\n\n onAcpMessage(message: AcpJsonRpcMessage): void {\n this.send({\n type: \"event\",\n requestId: this.requestId,\n message,\n });\n }\n\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 this.send({\n type: \"error\",\n requestId: this.requestId,\n code: params.code,\n detailCode: params.detailCode,\n origin: params.origin,\n message: params.message,\n retryable: params.retryable,\n acp: params.acp,\n });\n }\n\n flush(): void {}\n}\n\nconst DISCARD_OUTPUT_FORMATTER: OutputFormatter = {\n setContext() {},\n onAcpMessage() {},\n onError() {},\n flush() {},\n};\n\nfunction toPromptResult(\n stopReason: RunPromptResult[\"stopReason\"],\n sessionId: string,\n client: AcpClient,\n): RunPromptResult {\n return {\n stopReason,\n sessionId,\n permissionStats: client.getPermissionStats(),\n };\n}\n\nasync function applyRequestedModelIfAdvertised(params: {\n client: AcpClient;\n sessionId: string;\n requestedModel: string | undefined;\n models: import(\"../../acp/client.js\").SessionCreateResult[\"models\"];\n timeoutMs?: number;\n}): Promise<boolean> {\n const requestedModel =\n typeof params.requestedModel === \"string\" ? params.requestedModel.trim() : \"\";\n if (!requestedModel || !params.models) {\n return false;\n }\n if (params.models.currentModelId === requestedModel) {\n return true;\n }\n\n await withTimeout(\n params.client.setSessionModel(params.sessionId, requestedModel),\n params.timeoutMs,\n );\n return true;\n}\n\nfunction jsonRpcIdKey(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return `s:${value}`;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return `n:${value}`;\n }\n return undefined;\n}\n\nfunction extractJsonRpcRequestInfo(\n message: AcpJsonRpcMessage,\n): { idKey: string; method: string } | undefined {\n const candidate = message as { method?: unknown; id?: unknown };\n if (typeof candidate.method !== \"string\") {\n return undefined;\n }\n const idKey = jsonRpcIdKey(candidate.id);\n if (!idKey) {\n return undefined;\n }\n return {\n idKey,\n method: candidate.method,\n };\n}\n\nfunction extractJsonRpcResponseInfo(\n message: AcpJsonRpcMessage,\n): { idKey: string; hasError: boolean } | undefined {\n const candidate = message as { id?: unknown; error?: unknown; result?: unknown };\n const idKey = jsonRpcIdKey(candidate.id);\n if (!idKey) {\n return undefined;\n }\n const hasError = Object.hasOwn(candidate, \"error\");\n const hasResult = Object.hasOwn(candidate, \"result\");\n if (!hasError && !hasResult) {\n return undefined;\n }\n return {\n idKey,\n hasError,\n };\n}\n\nfunction filterRecoverableLoadFallbackOutput(messages: AcpJsonRpcMessage[]): AcpJsonRpcMessage[] {\n const requestMethodById = new Map<string, string>();\n const failedLoadRequestIds = new Set<string>();\n\n for (const message of messages) {\n const request = extractJsonRpcRequestInfo(message);\n if (request) {\n requestMethodById.set(request.idKey, request.method);\n continue;\n }\n\n const response = extractJsonRpcResponseInfo(message);\n if (!response || !response.hasError) {\n continue;\n }\n\n if (requestMethodById.get(response.idKey) === \"session/load\") {\n failedLoadRequestIds.add(response.idKey);\n }\n }\n\n if (failedLoadRequestIds.size === 0) {\n return messages;\n }\n\n return messages.filter((message) => {\n const request = extractJsonRpcRequestInfo(message);\n if (request && request.method === \"session/load\" && failedLoadRequestIds.has(request.idKey)) {\n return false;\n }\n\n const response = extractJsonRpcResponseInfo(message);\n if (response && failedLoadRequestIds.has(response.idKey)) {\n return false;\n }\n\n return true;\n });\n}\n\nfunction emitPromptRetryNotice(params: {\n error: unknown;\n delayMs: number;\n attempt: number;\n maxRetries: number;\n suppressSdkConsoleErrors?: boolean;\n}): void {\n if (params.suppressSdkConsoleErrors) {\n return;\n }\n\n process.stderr.write(\n `[acpx] prompt failed (${formatErrorMessage(params.error)}), retrying in ${params.delayMs}ms ` +\n `(attempt ${params.attempt}/${params.maxRetries})\\n`,\n );\n}\n\nexport async function runQueuedTask(\n sessionRecordId: string,\n task: QueueTask,\n options: {\n sharedClient?: AcpClient;\n verbose?: boolean;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n suppressSdkConsoleErrors?: boolean;\n promptRetries?: number;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n onPromptActive?: () => Promise<void> | void;\n },\n): Promise<void> {\n const outputFormatter = task.waitForCompletion\n ? new QueueTaskOutputFormatter(task)\n : DISCARD_OUTPUT_FORMATTER;\n\n try {\n const result = await runSessionPrompt({\n sessionRecordId,\n mcpServers: options.mcpServers,\n prompt: task.prompt ?? textPrompt(task.message),\n permissionMode: task.permissionMode,\n resumePolicy: task.resumePolicy,\n nonInteractivePermissions:\n task.nonInteractivePermissions ?? options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n outputFormatter,\n timeoutMs: task.timeoutMs,\n suppressSdkConsoleErrors: task.suppressSdkConsoleErrors ?? options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n promptRetries: options.promptRetries,\n onClientAvailable: options.onClientAvailable,\n onClientClosed: options.onClientClosed,\n onPromptActive: options.onPromptActive,\n client: options.sharedClient,\n });\n\n if (task.waitForCompletion) {\n task.send({\n type: \"result\",\n requestId: task.requestId,\n result,\n });\n }\n } catch (error) {\n const normalizedError = normalizeOutputError(error, {\n origin: \"runtime\",\n detailCode: \"QUEUE_RUNTIME_PROMPT_FAILED\",\n });\n const alreadyEmitted =\n (error as { outputAlreadyEmitted?: unknown }).outputAlreadyEmitted === true;\n if (task.waitForCompletion) {\n task.send({\n type: \"error\",\n requestId: task.requestId,\n code: normalizedError.code,\n detailCode: normalizedError.detailCode,\n origin: normalizedError.origin,\n message: normalizedError.message,\n retryable: normalizedError.retryable,\n acp: normalizedError.acp,\n outputAlreadyEmitted: alreadyEmitted,\n });\n }\n\n if (error instanceof InterruptedError) {\n throw error;\n }\n } finally {\n task.close();\n }\n}\n\nasync function runSessionPrompt(options: RunSessionPromptOptions): Promise<SessionSendResult> {\n const stopTotalTimer = startPerfTimer(\"runtime.prompt.total\");\n const output = options.outputFormatter;\n const record = await measurePerf(\"session.resolve_prompt_record\", async () => {\n return await resolveSessionRecord(options.sessionRecordId);\n });\n const conversation = cloneSessionConversation(record);\n let acpxState = cloneSessionAcpxState(record.acpx);\n const promptMessageId = recordPromptSubmission(conversation, options.prompt, isoNow());\n\n output.setContext({\n sessionId: record.acpxRecordId,\n });\n\n const eventWriter = await measurePerf(\"session.events.open\", async () => {\n return await SessionEventWriter.open(record);\n });\n const pendingMessages: AcpJsonRpcMessage[] = [];\n const pendingConnectOutputMessages: AcpJsonRpcMessage[] = [];\n let bufferingConnectOutput = true;\n let promptTurnActive = false;\n let promptTurnHadSideEffects = false;\n let sawAcpMessage = false;\n let eventWriterClosed = false;\n\n const closeEventWriter = async (checkpoint: boolean): Promise<void> => {\n if (eventWriterClosed) {\n return;\n }\n eventWriterClosed = true;\n await eventWriter.close({ checkpoint });\n };\n\n const flushPendingMessages = async (checkpoint = false): Promise<void> => {\n if (pendingMessages.length === 0) {\n return;\n }\n\n const batch = pendingMessages.splice(0, pendingMessages.length);\n await measurePerf(\"session.events.flush_pending\", async () => {\n await eventWriter.appendMessages(batch, { checkpoint });\n });\n };\n\n const ownClient = options.client == null;\n const client =\n options.client ??\n new AcpClient({\n agentCommand: record.agentCommand,\n cwd: absolutePath(record.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n sessionOptions: sessionOptionsFromRecord(record),\n });\n client.updateRuntimeOptions({\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n });\n client.setEventHandlers({\n onAcpMessage: (direction, message) => {\n sawAcpMessage = true;\n pendingMessages.push(message);\n options.onAcpMessage?.(direction, message);\n },\n onAcpOutputMessage: (_direction, message) => {\n if (bufferingConnectOutput) {\n pendingConnectOutputMessages.push(message);\n return;\n }\n output.onAcpMessage(message);\n },\n onSessionUpdate: (notification) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n acpxState = recordConversationSessionUpdate(conversation, acpxState, notification);\n trimConversationForRuntime(conversation);\n options.onSessionUpdate?.(notification);\n },\n onClientOperation: (operation) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n acpxState = recordConversationClientOperation(conversation, acpxState, operation);\n trimConversationForRuntime(conversation);\n options.onClientOperation?.(operation);\n },\n });\n let activeSessionIdForControl = record.acpSessionId;\n let notifiedClientAvailable = false;\n const activeController: ActiveSessionController = {\n hasActivePrompt: () => client.hasActivePrompt(),\n requestCancelActivePrompt: async () => await client.requestCancelActivePrompt(),\n setSessionMode: async (modeId: string) => {\n await client.setSessionMode(activeSessionIdForControl, modeId);\n },\n setSessionModel: async (modelId: string) => {\n await client.setSessionModel(activeSessionIdForControl, modelId);\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n return await client.setSessionConfigOption(activeSessionIdForControl, configId, value);\n },\n };\n\n try {\n return await withInterrupt(\n async () => {\n const connectStartedAt = Date.now();\n const {\n sessionId: activeSessionId,\n resumed,\n loadError,\n } = await measurePerf(\"runtime.connect_and_load\", async () => {\n try {\n return await connectAndLoadSession({\n client,\n record,\n resumePolicy: options.resumePolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n activeController,\n onClientAvailable: (controller) => {\n options.onClientAvailable?.(controller);\n notifiedClientAvailable = true;\n },\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionId) => {\n activeSessionIdForControl = sessionId;\n },\n });\n } catch (error) {\n bufferingConnectOutput = false;\n for (const message of pendingConnectOutputMessages) {\n output.onAcpMessage(message);\n }\n pendingConnectOutputMessages.length = 0;\n throw error;\n }\n });\n bufferingConnectOutput = false;\n const connectOutputMessages =\n loadError == null\n ? pendingConnectOutputMessages\n : filterRecoverableLoadFallbackOutput(pendingConnectOutputMessages);\n for (const message of connectOutputMessages) {\n output.onAcpMessage(message);\n }\n pendingConnectOutputMessages.length = 0;\n if (options.verbose) {\n process.stderr.write(\n `[acpx] ${formatPerfMetric(\"prompt.connect_and_load\", Date.now() - connectStartedAt)}\\n`,\n );\n }\n\n output.setContext({\n sessionId: record.acpxRecordId,\n });\n await flushPendingMessages(false);\n\n const maxRetries = options.promptRetries ?? 0;\n let response;\n promptTurnActive = true;\n for (let attempt = 0; ; attempt++) {\n try {\n const promptStartedAt = Date.now();\n response = await measurePerf(\"runtime.prompt.agent_turn\", async () => {\n return await runPromptTurn({\n client,\n sessionId: activeSessionId,\n prompt: options.prompt,\n timeoutMs: options.timeoutMs,\n conversation,\n promptMessageId,\n onPromptStarted:\n attempt === 0 && options.onPromptActive\n ? async () => {\n try {\n await options.onPromptActive?.();\n } catch (error) {\n if (options.verbose) {\n process.stderr.write(\n \"[acpx] onPromptActive hook failed: \" +\n formatErrorMessage(error) +\n \"\\n\",\n );\n }\n }\n }\n : undefined,\n });\n });\n if (options.verbose) {\n process.stderr.write(\n `[acpx] ${formatPerfMetric(\"prompt.agent_turn\", Date.now() - promptStartedAt)}\\n`,\n );\n }\n break;\n } catch (error) {\n const snapshot = client.getAgentLifecycleSnapshot();\n const agentCrashed = snapshot.lastExit?.unexpectedDuringPrompt === true;\n\n if (\n attempt < maxRetries &&\n !agentCrashed &&\n !promptTurnHadSideEffects &&\n isRetryablePromptError(error)\n ) {\n const delayMs = Math.min(1_000 * 2 ** attempt, 10_000);\n emitPromptRetryNotice({\n error,\n delayMs,\n attempt: attempt + 1,\n maxRetries,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n });\n await waitMs(delayMs);\n if (!promptTurnHadSideEffects) {\n continue;\n }\n }\n\n promptTurnActive = false;\n applyLifecycleSnapshotToRecord(record, snapshot);\n const lastExit = snapshot.lastExit;\n if (lastExit?.unexpectedDuringPrompt && options.verbose) {\n process.stderr.write(\n \"[acpx] agent disconnected during prompt (\" +\n lastExit.reason +\n \", exit=\" +\n lastExit.exitCode +\n \", signal=\" +\n (lastExit.signal ?? \"none\") +\n \")\\n\",\n );\n }\n\n const normalizedError = normalizeOutputError(error, {\n origin: \"runtime\",\n });\n\n await flushPendingMessages(false).catch(() => {\n // best effort while bubbling prompt failure\n });\n\n output.flush();\n\n record.lastUsedAt = isoNow();\n applyConversation(record, conversation);\n record.acpx = acpxState;\n\n const propagated =\n error instanceof Error ? error : new Error(formatErrorMessage(error));\n (propagated as { outputAlreadyEmitted?: boolean }).outputAlreadyEmitted = sawAcpMessage;\n (propagated as { normalizedOutputError?: unknown }).normalizedOutputError =\n normalizedError;\n throw propagated;\n }\n }\n promptTurnActive = false;\n\n await flushPendingMessages(false);\n output.flush();\n\n const now = isoNow();\n record.lastUsedAt = now;\n record.closed = false;\n record.closedAt = undefined;\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n applyConversation(record, conversation);\n record.acpx = acpxState;\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n stopTotalTimer();\n\n return {\n ...toPromptResult(response.stopReason, record.acpxRecordId, client),\n record,\n resumed,\n loadError,\n };\n },\n async () => {\n await client.cancelActivePrompt(INTERRUPT_CANCEL_WAIT_MS);\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n record.lastUsedAt = isoNow();\n applyConversation(record, conversation);\n record.acpx = acpxState;\n await flushPendingMessages(false).catch(() => {\n // best effort while process is being interrupted\n });\n if (ownClient) {\n await client.close();\n }\n },\n );\n } finally {\n if (options.verbose) {\n process.stderr.write(`[acpx] ${formatPerfMetric(\"prompt.total\", stopTotalTimer())}\\n`);\n } else {\n stopTotalTimer();\n }\n if (notifiedClientAvailable) {\n options.onClientClosed?.();\n }\n client.clearEventHandlers();\n if (ownClient) {\n await client.close();\n }\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n applyConversation(record, conversation);\n record.acpx = acpxState;\n await flushPendingMessages(false).catch(() => {\n // best effort on close\n });\n await closeEventWriter(true).catch(() => {\n // best effort on close\n });\n }\n}\n\nexport async function runOnce(options: RunOnceOptions): Promise<RunPromptResult> {\n const output = options.outputFormatter;\n let promptTurnActive = false;\n let promptTurnHadSideEffects = false;\n const client = new AcpClient({\n agentCommand: options.agentCommand,\n cwd: absolutePath(options.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n onAcpMessage: options.onAcpMessage,\n onAcpOutputMessage: (_direction, message) => output.onAcpMessage(message),\n onSessionUpdate: (notification) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n options.onSessionUpdate?.(notification);\n },\n onClientOperation: (operation) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n options.onClientOperation?.(operation);\n },\n sessionOptions: options.sessionOptions,\n });\n\n try {\n return await withInterrupt(\n async () => {\n await measurePerf(\"runtime.exec.start\", async () => {\n await withTimeout(client.start(), options.timeoutMs);\n });\n const createdSession = await measurePerf(\"runtime.exec.create_session\", async () => {\n return await withTimeout(\n client.createSession(absolutePath(options.cwd)),\n options.timeoutMs,\n );\n });\n const sessionId = createdSession.sessionId;\n await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: createdSession.models,\n timeoutMs: options.timeoutMs,\n });\n\n output.setContext({\n sessionId,\n });\n\n const maxRetries = options.promptRetries ?? 0;\n let response;\n promptTurnActive = true;\n for (let attempt = 0; ; attempt++) {\n try {\n response = await measurePerf(\"runtime.exec.prompt\", async () => {\n return await withTimeout(client.prompt(sessionId, options.prompt), options.timeoutMs);\n });\n break;\n } catch (error) {\n if (\n attempt < maxRetries &&\n !promptTurnHadSideEffects &&\n isRetryablePromptError(error)\n ) {\n const delayMs = Math.min(1_000 * 2 ** attempt, 10_000);\n emitPromptRetryNotice({\n error,\n delayMs,\n attempt: attempt + 1,\n maxRetries,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n });\n await waitMs(delayMs);\n if (!promptTurnHadSideEffects) {\n continue;\n }\n }\n promptTurnActive = false;\n throw error;\n }\n }\n promptTurnActive = false;\n output.flush();\n return toPromptResult(response.stopReason, sessionId, client);\n },\n async () => {\n await client.cancelActivePrompt(INTERRUPT_CANCEL_WAIT_MS);\n await client.close();\n },\n );\n } finally {\n await client.close();\n }\n}\n\nexport async function sendSessionDirect(options: SessionSendOptions): Promise<SessionSendResult> {\n return await runSessionPrompt({\n sessionRecordId: options.sessionId,\n prompt: options.prompt,\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n resumePolicy: options.resumePolicy,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n outputFormatter: options.outputFormatter,\n onAcpMessage: options.onAcpMessage,\n onSessionUpdate: options.onSessionUpdate,\n onClientOperation: options.onClientOperation,\n timeoutMs: options.timeoutMs,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n client: options.client,\n });\n}\n","import { AcpClient } from \"../../acp/client.js\";\nimport { formatErrorMessage } from \"../../acp/error-normalization.js\";\nimport { withTimeout } from \"../../async-control.js\";\nimport { checkpointPerfMetricsCapture } from \"../../perf-metrics-capture.js\";\nimport { setPerfGauge } from \"../../perf-metrics.js\";\nimport { promptToDisplayText } from \"../../prompt-content.js\";\nimport { applyLifecycleSnapshotToRecord } from \"../../runtime/engine/lifecycle.js\";\nimport { sessionOptionsFromRecord } from \"../../runtime/engine/session-options.js\";\nimport {\n absolutePath,\n resolveSessionRecord,\n writeSessionRecord,\n} from \"../../session/persistence.js\";\nimport type { SessionSendOutcome } from \"../../types.js\";\nimport {\n QUEUE_CONNECT_RETRY_MS,\n SessionQueueOwner,\n releaseQueueOwnerLease,\n tryAcquireQueueOwnerLease,\n trySubmitToRunningOwner,\n waitMs,\n} from \"../queue/ipc.js\";\nimport { refreshQueueOwnerLease } from \"../queue/lease-store.js\";\nimport { QueueOwnerTurnController } from \"../queue/owner-turn-controller.js\";\nimport {\n DEFAULT_QUEUE_OWNER_TTL_MS,\n normalizeQueueOwnerTtlMs,\n type SessionSendOptions,\n} from \"./contracts.js\";\nimport {\n runSessionSetConfigOptionDirect,\n runSessionSetModelDirect,\n runSessionSetModeDirect,\n type ActiveSessionController,\n} from \"./prompt-runner.js\";\nimport type { QueueOwnerRuntimeOptions } from \"./queue-owner-process.js\";\nimport { queueOwnerRuntimeOptionsFromSend, spawnQueueOwnerProcess } from \"./queue-owner-process.js\";\nimport { runQueuedTask } from \"./runtime.js\";\n\nconst QUEUE_OWNER_STARTUP_MAX_ATTEMPTS = 120;\nconst QUEUE_OWNER_HEARTBEAT_INTERVAL_MS = 5_000;\n\nasync function submitToRunningOwner(\n options: SessionSendOptions,\n waitForCompletion: boolean,\n): Promise<SessionSendOutcome | undefined> {\n return await trySubmitToRunningOwner({\n sessionId: options.sessionId,\n message: promptToDisplayText(options.prompt),\n prompt: options.prompt,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n outputFormatter: options.outputFormatter,\n errorEmissionPolicy: options.errorEmissionPolicy,\n timeoutMs: options.timeoutMs,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n waitForCompletion,\n verbose: options.verbose,\n });\n}\n\nexport async function runSessionQueueOwner(options: QueueOwnerRuntimeOptions): Promise<void> {\n const lease = await tryAcquireQueueOwnerLease(options.sessionId);\n if (!lease) {\n return;\n }\n\n const sessionRecord = await resolveSessionRecord(options.sessionId);\n let owner: SessionQueueOwner | undefined;\n let heartbeatTimer: NodeJS.Timeout | undefined;\n const sharedClient = new AcpClient({\n agentCommand: sessionRecord.agentCommand,\n cwd: absolutePath(sessionRecord.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n sessionOptions: sessionOptionsFromRecord(sessionRecord),\n });\n const ttlMs = normalizeQueueOwnerTtlMs(options.ttlMs);\n const maxQueueDepth = Math.max(1, Math.round(options.maxQueueDepth ?? 16));\n const taskPollTimeoutMs = ttlMs === 0 ? undefined : ttlMs;\n const initialTaskPollTimeoutMs =\n taskPollTimeoutMs == null ? undefined : Math.max(taskPollTimeoutMs, 1_000);\n const turnController = new QueueOwnerTurnController({\n withTimeout: async (run, timeoutMs) => await withTimeout(run(), timeoutMs),\n setSessionModeFallback: async (modeId: string, timeoutMs?: number) => {\n await runSessionSetModeDirect({\n sessionRecordId: options.sessionId,\n modeId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs,\n verbose: options.verbose,\n });\n },\n setSessionModelFallback: async (modelId: string, timeoutMs?: number) => {\n await runSessionSetModelDirect({\n sessionRecordId: options.sessionId,\n modelId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs,\n verbose: options.verbose,\n });\n },\n setSessionConfigOptionFallback: async (configId: string, value: string, timeoutMs?: number) => {\n const result = await runSessionSetConfigOptionDirect({\n sessionRecordId: options.sessionId,\n configId,\n value,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n timeoutMs,\n verbose: options.verbose,\n });\n return result.response;\n },\n });\n\n const applyPendingCancel = async (): Promise<boolean> => {\n return await turnController.applyPendingCancel();\n };\n\n const scheduleApplyPendingCancel = (): void => {\n void applyPendingCancel().catch((error) => {\n if (options.verbose) {\n process.stderr.write(\n `[acpx] failed to apply deferred cancel: ${formatErrorMessage(error)}\\n`,\n );\n }\n });\n };\n\n const setActiveController = (controller: ActiveSessionController) => {\n turnController.setActiveController(controller);\n scheduleApplyPendingCancel();\n };\n\n const clearActiveController = () => {\n turnController.clearActiveController();\n };\n\n const runPromptTurn = async <T>(run: () => Promise<T>): Promise<T> => {\n turnController.beginTurn();\n try {\n return await run();\n } finally {\n turnController.endTurn();\n }\n };\n\n try {\n owner = await SessionQueueOwner.start(\n lease,\n {\n cancelPrompt: async () => {\n const accepted = await turnController.requestCancel();\n if (!accepted) {\n return false;\n }\n await applyPendingCancel();\n return true;\n },\n setSessionMode: async (modeId: string, timeoutMs?: number) => {\n await turnController.setSessionMode(modeId, timeoutMs);\n },\n setSessionModel: async (modelId: string, timeoutMs?: number) => {\n await turnController.setSessionModel(modelId, timeoutMs);\n },\n setSessionConfigOption: async (configId: string, value: string, timeoutMs?: number) => {\n return await turnController.setSessionConfigOption(configId, value, timeoutMs);\n },\n },\n {\n maxQueueDepth,\n onQueueDepthChanged: (queueDepth) => {\n setPerfGauge(\"queue.owner.depth\", queueDepth);\n void refreshQueueOwnerLease(lease, { queueDepth }).catch(() => {\n // best effort heartbeat refresh while owner is live\n });\n },\n },\n );\n\n if (options.verbose) {\n process.stderr.write(\n `[acpx] queue owner ready for session ${options.sessionId} (ttlMs=${ttlMs}, maxQueueDepth=${maxQueueDepth})\\n`,\n );\n }\n await refreshQueueOwnerLease(lease, { queueDepth: owner.queueDepth() }).catch(() => {\n // best effort initial heartbeat\n });\n heartbeatTimer = setInterval(() => {\n void refreshQueueOwnerLease(lease, { queueDepth: owner?.queueDepth() ?? 0 }).catch(() => {\n // best effort heartbeat\n });\n }, QUEUE_OWNER_HEARTBEAT_INTERVAL_MS);\n\n let isFirstTask = true;\n while (true) {\n const pollTimeoutMs = isFirstTask ? initialTaskPollTimeoutMs : taskPollTimeoutMs;\n const task = await owner.nextTask(pollTimeoutMs);\n if (!task) {\n break;\n }\n isFirstTask = false;\n\n await runPromptTurn(async () => {\n try {\n await runQueuedTask(options.sessionId, task, {\n sharedClient,\n verbose: options.verbose,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n promptRetries: options.promptRetries,\n onClientAvailable: setActiveController,\n onClientClosed: clearActiveController,\n onPromptActive: async () => {\n turnController.markPromptActive();\n await applyPendingCancel();\n },\n });\n } finally {\n checkpointPerfMetricsCapture();\n }\n });\n }\n } finally {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n }\n turnController.beginClosing();\n if (owner) {\n await owner.close();\n }\n await sharedClient.close().catch(() => {\n // best effort while queue owner is shutting down\n });\n try {\n const record = await resolveSessionRecord(options.sessionId);\n applyLifecycleSnapshotToRecord(record, sharedClient.getAgentLifecycleSnapshot());\n await writeSessionRecord(record);\n } catch {\n // best effort — session may already be cleaned up\n }\n await releaseQueueOwnerLease(lease);\n\n if (options.verbose) {\n process.stderr.write(`[acpx] queue owner stopped for session ${options.sessionId}\\n`);\n }\n }\n}\n\nexport async function sendSession(options: SessionSendOptions): Promise<SessionSendOutcome> {\n const waitForCompletion = options.waitForCompletion !== false;\n\n const queuedToOwner = await submitToRunningOwner(options, waitForCompletion);\n if (queuedToOwner) {\n return queuedToOwner;\n }\n\n spawnQueueOwnerProcess(queueOwnerRuntimeOptionsFromSend(options));\n\n for (let attempt = 0; attempt < QUEUE_OWNER_STARTUP_MAX_ATTEMPTS; attempt += 1) {\n const queued = await submitToRunningOwner(options, waitForCompletion);\n if (queued) {\n return queued;\n }\n await waitMs(QUEUE_CONNECT_RETRY_MS);\n }\n\n throw new Error(`Session queue owner failed to start for session ${options.sessionId}`);\n}\n\nexport type { QueueOwnerRuntimeOptions };\nexport { DEFAULT_QUEUE_OWNER_TTL_MS };\n","export * from \"../cli/session/contracts.js\";\nexport * from \"../cli/session/session-management.js\";\nexport * from \"../cli/session/queue-owner-runtime.js\";\nexport * from \"../cli/session/session-control.js\";\nexport * from \"../cli/session/runtime.js\";\nexport {\n DEFAULT_HISTORY_LIMIT,\n findGitRepositoryRoot,\n findSession,\n findSessionByDirectoryWalk,\n listSessions,\n listSessionsForAgent,\n} from \"./persistence.js\";\nexport { isProcessAlive } from \"../cli/queue/ipc.js\";\n"],"mappings":"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"}
|
|
@@ -126,6 +126,7 @@ type SessionTokenUsage = {
|
|
|
126
126
|
cache_read_input_tokens?: number;
|
|
127
127
|
};
|
|
128
128
|
type SessionAcpxState = {
|
|
129
|
+
reset_on_next_ensure?: boolean;
|
|
129
130
|
current_mode_id?: string;
|
|
130
131
|
desired_mode_id?: string;
|
|
131
132
|
current_model_id?: string;
|
|
@@ -171,4 +172,4 @@ type SessionRecord = {
|
|
|
171
172
|
};
|
|
172
173
|
//#endregion
|
|
173
174
|
export { PermissionMode as a, PromptInput as c, NonInteractivePermissionPolicy as i, AuthPolicy as n, PermissionStats as o, McpServer$1 as r, SessionRecord as s, AcpClientOptions as t };
|
|
174
|
-
//# sourceMappingURL=types-
|
|
175
|
+
//# sourceMappingURL=types-yxf-gcOE.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-yxf-gcOE.d.ts","names":[],"sources":["../src/prompt-content.ts","../src/types.ts"],"mappings":"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"}
|