acpx 0.5.0 → 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-CLRrs6eQ.js → cli-ChWsO-bb.js} +4 -4
- package/dist/{cli-CLRrs6eQ.js.map → cli-ChWsO-bb.js.map} +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +11 -12
- package/dist/cli.js.map +1 -1
- package/dist/{client-DLTWuu4w.d.ts → client-D-4_aZf2.d.ts} +7 -2
- package/dist/client-D-4_aZf2.d.ts.map +1 -0
- package/dist/{flags-BmubjvOw.js → flags-ceSqz2T6.js} +4 -4
- package/dist/{flags-BmubjvOw.js.map → flags-ceSqz2T6.js.map} +1 -1
- package/dist/{flows-CR7xCmkR.js → flows-_KmnuUXd.js} +5 -5
- package/dist/{flows-CR7xCmkR.js.map → flows-_KmnuUXd.js.map} +1 -1
- package/dist/flows.d.ts +1 -1
- package/dist/flows.js +1 -1
- package/dist/{ipc-DN6M4Ui9.js → ipc-BM335WFg.js} +3 -3
- package/dist/{ipc-DN6M4Ui9.js.map → ipc-BM335WFg.js.map} +1 -1
- package/dist/{jsonrpc-M3y-qzy8.js → jsonrpc-DSxh2w5R.js} +1 -1
- package/dist/{jsonrpc-M3y-qzy8.js.map → jsonrpc-DSxh2w5R.js.map} +1 -1
- package/dist/{output-Di0M9Et8.js → output-C4QhjpM6.js} +2 -2
- package/dist/{output-Di0M9Et8.js.map → output-C4QhjpM6.js.map} +1 -1
- package/dist/{perf-metrics-D9QC81lB.js → perf-metrics-D0um6IR6.js} +22 -2
- package/dist/perf-metrics-D0um6IR6.js.map +1 -0
- package/dist/{prompt-turn-Bt8T3SRR.js → prompt-turn-CXMtXBl-.js} +266 -28
- package/dist/prompt-turn-CXMtXBl-.js.map +1 -0
- package/dist/{render-BL5ynRkN.js → render-Br-kVPK_.js} +3 -3
- package/dist/{render-BL5ynRkN.js.map → render-Br-kVPK_.js.map} +1 -1
- package/dist/runtime.d.ts +9 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +45 -5
- package/dist/runtime.js.map +1 -1
- package/dist/{session-BbN0SBgf.js → session-BtwAKtJ3.js} +5 -5
- package/dist/{session-BbN0SBgf.js.map → session-BtwAKtJ3.js.map} +1 -1
- package/dist/{types-DXxLBQc3.d.ts → types-yxf-gcOE.d.ts} +2 -1
- package/dist/{types-DXxLBQc3.d.ts.map → types-yxf-gcOE.d.ts.map} +1 -1
- package/package.json +1 -1
- package/dist/agent-registry-DGw0-3Tc.js +0 -54
- package/dist/agent-registry-DGw0-3Tc.js.map +0 -1
- package/dist/client-DLTWuu4w.d.ts.map +0 -1
- package/dist/perf-metrics-D9QC81lB.js.map +0 -1
- package/dist/prompt-turn-Bt8T3SRR.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
|
|
2
|
-
import { u as normalizeRuntimeSessionId } from "./perf-metrics-
|
|
3
|
-
import { s as probeQueueOwnerHealth } from "./ipc-
|
|
2
|
+
import { u as normalizeRuntimeSessionId } from "./perf-metrics-D0um6IR6.js";
|
|
3
|
+
import { s as probeQueueOwnerHealth } from "./ipc-BM335WFg.js";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
//#region src/cli/output/json-output.ts
|
|
6
6
|
function emitJsonResult(format, payload) {
|
|
@@ -137,4 +137,4 @@ function agentSessionIdPayload(agentSessionId) {
|
|
|
137
137
|
//#endregion
|
|
138
138
|
export { emitJsonResult as i, formatPromptSessionBannerLine as n, render_exports as r, agentSessionIdPayload as t };
|
|
139
139
|
|
|
140
|
-
//# sourceMappingURL=render-
|
|
140
|
+
//# sourceMappingURL=render-Br-kVPK_.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-
|
|
1
|
+
{"version":3,"file":"render-Br-kVPK_.js","names":[],"sources":["../src/cli/output/json-output.ts","../src/cli/output/render.ts"],"sourcesContent":["import type { OutputFormat } from \"../../types.js\";\n\nexport function emitJsonResult(format: OutputFormat, payload: unknown): boolean {\n if (format !== \"json\") {\n return false;\n }\n process.stdout.write(`${JSON.stringify(payload)}\\n`);\n return true;\n}\n","import path from \"node:path\";\nimport { normalizeRuntimeSessionId } from \"../../session/runtime-session-id.js\";\nimport type { OutputFormat, SessionRecord } from \"../../types.js\";\nimport { probeQueueOwnerHealth } from \"../queue/ipc.js\";\nimport { emitJsonResult } from \"./json-output.js\";\n\nfunction formatSessionLabel(record: SessionRecord): string {\n return record.name ?? \"cwd\";\n}\n\nfunction formatRoutedFrom(sessionCwd: string, currentCwd: string): string | undefined {\n const relative = path.relative(sessionCwd, currentCwd);\n if (!relative || relative === \".\") {\n return undefined;\n }\n return relative.startsWith(\".\") ? relative : `.${path.sep}${relative}`;\n}\n\ntype SessionConnectionStatus = \"connected\" | \"needs reconnect\";\n\nasync function resolveSessionConnectionStatus(\n record: SessionRecord,\n): Promise<SessionConnectionStatus> {\n const health = await probeQueueOwnerHealth(record.acpxRecordId);\n return health.healthy ? \"connected\" : \"needs reconnect\";\n}\n\nexport function printSessionsByFormat(sessions: SessionRecord[], format: OutputFormat): void {\n if (format === \"json\") {\n process.stdout.write(`${JSON.stringify(sessions)}\\n`);\n return;\n }\n\n if (format === \"quiet\") {\n for (const session of sessions) {\n const closedMarker = session.closed ? \" [closed]\" : \"\";\n process.stdout.write(`${session.acpxRecordId}${closedMarker}\\n`);\n }\n return;\n }\n\n if (sessions.length === 0) {\n process.stdout.write(\"No sessions\\n\");\n return;\n }\n\n for (const session of sessions) {\n const closedMarker = session.closed ? \" [closed]\" : \"\";\n process.stdout.write(\n `${session.acpxRecordId}${closedMarker}\\t${session.name ?? \"-\"}\\t${session.cwd}\\t${session.lastUsedAt}\\n`,\n );\n }\n}\n\nexport function printClosedSessionByFormat(record: SessionRecord, format: OutputFormat): void {\n if (\n emitJsonResult(format, {\n action: \"session_closed\",\n acpxRecordId: record.acpxRecordId,\n acpxSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n })\n ) {\n return;\n }\n\n if (format === \"quiet\") {\n return;\n }\n\n process.stdout.write(`${record.acpxRecordId}\\n`);\n}\n\nexport function printNewSessionByFormat(\n record: SessionRecord,\n replaced: SessionRecord | undefined,\n format: OutputFormat,\n): void {\n if (\n emitJsonResult(format, {\n action: \"session_ensured\",\n created: true,\n acpxRecordId: record.acpxRecordId,\n acpxSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n name: record.name,\n replacedSessionId: replaced?.acpxRecordId,\n })\n ) {\n return;\n }\n\n if (format === \"quiet\") {\n process.stdout.write(`${record.acpxRecordId}\\n`);\n return;\n }\n\n if (replaced) {\n process.stdout.write(`${record.acpxRecordId}\\t(replaced ${replaced.acpxRecordId})\\n`);\n return;\n }\n\n process.stdout.write(`${record.acpxRecordId}\\n`);\n}\n\nexport function printEnsuredSessionByFormat(\n record: SessionRecord,\n created: boolean,\n format: OutputFormat,\n): void {\n if (\n emitJsonResult(format, {\n action: \"session_ensured\",\n created,\n acpxRecordId: record.acpxRecordId,\n acpxSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n name: record.name,\n })\n ) {\n return;\n }\n\n if (format === \"quiet\") {\n process.stdout.write(`${record.acpxRecordId}\\n`);\n return;\n }\n\n const action = created ? \"created\" : \"existing\";\n process.stdout.write(`${record.acpxRecordId}\\t(${action})\\n`);\n}\n\nexport function printQueuedPromptByFormat(\n result: {\n sessionId: string;\n requestId: string;\n },\n format: OutputFormat,\n): void {\n if (\n emitJsonResult(format, {\n action: \"prompt_queued\",\n acpxRecordId: result.sessionId,\n requestId: result.requestId,\n })\n ) {\n return;\n }\n\n if (format === \"quiet\") {\n return;\n }\n\n process.stdout.write(`[queued] ${result.requestId}\\n`);\n}\n\nexport function formatPromptSessionBannerLine(\n record: SessionRecord,\n currentCwd: string,\n connectionStatus: SessionConnectionStatus = \"needs reconnect\",\n): string {\n const label = formatSessionLabel(record);\n const normalizedSessionCwd = path.resolve(record.cwd);\n const normalizedCurrentCwd = path.resolve(currentCwd);\n const routedFrom =\n normalizedSessionCwd === normalizedCurrentCwd\n ? undefined\n : formatRoutedFrom(normalizedSessionCwd, normalizedCurrentCwd);\n const status = connectionStatus;\n\n if (routedFrom) {\n return `[acpx] session ${label} (${record.acpxRecordId}) · ${normalizedSessionCwd} (routed from ${routedFrom}) · agent ${status}`;\n }\n\n return `[acpx] session ${label} (${record.acpxRecordId}) · ${normalizedSessionCwd} · agent ${status}`;\n}\n\nexport async function printPromptSessionBanner(\n record: SessionRecord,\n currentCwd: string,\n format: OutputFormat,\n jsonStrict = false,\n): Promise<void> {\n if (format === \"quiet\" || (jsonStrict && format === \"json\")) {\n return;\n }\n\n const status = await resolveSessionConnectionStatus(record);\n process.stderr.write(`${formatPromptSessionBannerLine(record, currentCwd, status)}\\n`);\n}\n\nexport function printCreatedSessionBanner(\n record: SessionRecord,\n agentName: string,\n format: OutputFormat,\n jsonStrict = false,\n): void {\n if (format === \"quiet\" || (jsonStrict && format === \"json\")) {\n return;\n }\n\n const label = formatSessionLabel(record);\n process.stderr.write(`[acpx] created session ${label} (${record.acpxRecordId})\\n`);\n process.stderr.write(`[acpx] agent: ${agentName}\\n`);\n process.stderr.write(`[acpx] cwd: ${record.cwd}\\n`);\n}\n\nexport function agentSessionIdPayload(agentSessionId: string | undefined): {\n agentSessionId?: string;\n} {\n const normalized = normalizeRuntimeSessionId(agentSessionId);\n if (!normalized) {\n return {};\n }\n\n return { agentSessionId: normalized };\n}\n"],"mappings":"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"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { a as PermissionMode, i as NonInteractivePermissionPolicy, r as McpServer, s as SessionRecord } from "./types-
|
|
2
|
-
import { t as AcpClient } from "./client-
|
|
1
|
+
import { a as PermissionMode, i as NonInteractivePermissionPolicy, r as McpServer, s as SessionRecord } from "./types-yxf-gcOE.js";
|
|
2
|
+
import { t as AcpClient } from "./client-D-4_aZf2.js";
|
|
3
|
+
import fs from "node:fs";
|
|
3
4
|
|
|
4
5
|
//#region src/runtime/public/contract.d.ts
|
|
5
6
|
type AcpRuntimePromptMode = "prompt" | "steer";
|
|
@@ -107,6 +108,7 @@ interface AcpRuntime {
|
|
|
107
108
|
close(input: {
|
|
108
109
|
handle: AcpRuntimeHandle;
|
|
109
110
|
reason: string;
|
|
111
|
+
discardPersistentState?: boolean;
|
|
110
112
|
}): Promise<void>;
|
|
111
113
|
}
|
|
112
114
|
type AcpSessionRecord = SessionRecord;
|
|
@@ -168,7 +170,10 @@ declare class AcpRuntimeManager {
|
|
|
168
170
|
setMode(handle: AcpRuntimeHandle, mode: string, sessionMode?: "persistent" | "oneshot"): Promise<void>;
|
|
169
171
|
setConfigOption(handle: AcpRuntimeHandle, key: string, value: string, sessionMode?: "persistent" | "oneshot"): Promise<void>;
|
|
170
172
|
cancel(handle: AcpRuntimeHandle): Promise<void>;
|
|
171
|
-
close(handle: AcpRuntimeHandle
|
|
173
|
+
close(handle: AcpRuntimeHandle, options?: {
|
|
174
|
+
discardPersistentState?: boolean;
|
|
175
|
+
}): Promise<void>;
|
|
176
|
+
private closeBackendSession;
|
|
172
177
|
private requireRecord;
|
|
173
178
|
}
|
|
174
179
|
//#endregion
|
|
@@ -252,6 +257,7 @@ declare class AcpxRuntime implements AcpxRuntimeLike {
|
|
|
252
257
|
close(input: {
|
|
253
258
|
handle: AcpRuntimeHandle;
|
|
254
259
|
reason: string;
|
|
260
|
+
discardPersistentState?: boolean;
|
|
255
261
|
}): Promise<void>;
|
|
256
262
|
private getManager;
|
|
257
263
|
private runProbe;
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","names":[],"sources":["../src/runtime/public/contract.ts","../src/agent-registry.ts","../src/runtime/engine/manager.ts","../src/runtime/public/file-session-store.ts","../src/runtime/public/errors.ts","../src/runtime/public/shared.ts","../src/runtime/public/handle-state.ts","../src/runtime.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","names":[],"sources":["../src/runtime/public/contract.ts","../src/agent-registry.ts","../src/runtime/engine/manager.ts","../src/runtime/public/file-session-store.ts","../src/runtime/public/errors.ts","../src/runtime/public/shared.ts","../src/runtime/public/handle-state.ts","../src/runtime.ts"],"mappings":"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"}
|
package/dist/runtime.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { g as textPrompt, x as normalizeOutputError } from "./perf-metrics-
|
|
2
|
-
import {
|
|
3
|
-
import { B as serializeSessionRecordForDisk, M as parseSessionRecord, P as defaultSessionEventLog, _ as recordSessionUpdate, a as applyConversation, f as cloneSessionAcpxState, g as recordPromptSubmission, h as recordClientOperation, i as connectAndLoadSession, l as setDesiredModeId, m as createSessionConversation, n as withConnectedSession, o as applyLifecycleSnapshotToRecord, p as cloneSessionConversation, s as reconcileAgentSessionId, t as runPromptTurn, v as trimConversationForRuntime, y as AcpClient, z as assertPersistedKeyPolicy } from "./prompt-turn-Bt8T3SRR.js";
|
|
1
|
+
import { C as isAcpResourceNotFoundError, S as extractAcpError, g as textPrompt, x as normalizeOutputError } from "./perf-metrics-D0um6IR6.js";
|
|
2
|
+
import { B as serializeSessionRecordForDisk, G as DEFAULT_AGENT_NAME, J as resolveAgentCommand, K as listBuiltInAgents, M as parseSessionRecord, P as defaultSessionEventLog, W as withTimeout, _ as recordSessionUpdate, a as applyConversation, f as cloneSessionAcpxState, g as recordPromptSubmission, h as recordClientOperation, i as connectAndLoadSession, l as setDesiredModeId, m as createSessionConversation, n as withConnectedSession, o as applyLifecycleSnapshotToRecord, p as cloneSessionConversation, s as reconcileAgentSessionId, t as runPromptTurn, v as trimConversationForRuntime, y as AcpClient, z as assertPersistedKeyPolicy } from "./prompt-turn-CXMtXBl-.js";
|
|
4
3
|
import path from "node:path";
|
|
5
4
|
import fs from "node:fs/promises";
|
|
6
5
|
import { randomUUID } from "node:crypto";
|
|
@@ -253,6 +252,7 @@ function parsePromptEventLine(line) {
|
|
|
253
252
|
//#endregion
|
|
254
253
|
//#region src/runtime/engine/reuse-policy.ts
|
|
255
254
|
function shouldReuseExistingRecord(record, params) {
|
|
255
|
+
if (record.acpx?.reset_on_next_ensure === true) return false;
|
|
256
256
|
if (path.resolve(record.cwd) !== path.resolve(params.cwd)) return false;
|
|
257
257
|
if (record.agentCommand !== params.agentCommand) return false;
|
|
258
258
|
if (params.resumeSessionId && record.acpSessionId !== params.resumeSessionId) return false;
|
|
@@ -308,6 +308,14 @@ var AsyncEventQueue = class {
|
|
|
308
308
|
function isoNow() {
|
|
309
309
|
return (/* @__PURE__ */ new Date()).toISOString();
|
|
310
310
|
}
|
|
311
|
+
function isUnsupportedSessionCloseError(error) {
|
|
312
|
+
const acp = extractAcpError(error);
|
|
313
|
+
if (!acp) return false;
|
|
314
|
+
if (acp.code === -32601 || acp.code === -32602) return true;
|
|
315
|
+
if (acp.code !== -32603 || !acp.data || typeof acp.data !== "object") return false;
|
|
316
|
+
const details = acp.data.details;
|
|
317
|
+
return typeof details === "string" && details.toLowerCase().includes("invalid params");
|
|
318
|
+
}
|
|
311
319
|
function toPromptInput(text, attachments) {
|
|
312
320
|
if (!attachments || attachments.length === 0) return text;
|
|
313
321
|
const blocks = [];
|
|
@@ -673,13 +681,45 @@ var AcpRuntimeManager = class {
|
|
|
673
681
|
async cancel(handle) {
|
|
674
682
|
await this.activeControllers.get(handle.acpxRecordId ?? handle.sessionKey)?.requestCancelActivePrompt();
|
|
675
683
|
}
|
|
676
|
-
async close(handle) {
|
|
684
|
+
async close(handle, options = {}) {
|
|
677
685
|
const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);
|
|
678
686
|
await this.cancel(handle);
|
|
687
|
+
if (options.discardPersistentState) {
|
|
688
|
+
await this.closeBackendSession(record);
|
|
689
|
+
record.acpx = {
|
|
690
|
+
...record.acpx,
|
|
691
|
+
reset_on_next_ensure: true
|
|
692
|
+
};
|
|
693
|
+
}
|
|
679
694
|
record.closed = true;
|
|
680
695
|
record.closedAt = isoNow();
|
|
681
696
|
await this.options.sessionStore.save(record);
|
|
682
697
|
}
|
|
698
|
+
async closeBackendSession(record) {
|
|
699
|
+
const pendingClient = this.pendingPersistentClients.get(record.acpxRecordId);
|
|
700
|
+
if (pendingClient) this.pendingPersistentClients.delete(record.acpxRecordId);
|
|
701
|
+
const reusablePendingClient = pendingClient?.hasReusableSession(record.acpSessionId) === true ? pendingClient : void 0;
|
|
702
|
+
if (pendingClient && !reusablePendingClient) await pendingClient.close().catch(() => {});
|
|
703
|
+
const client = reusablePendingClient ?? this.createClient({
|
|
704
|
+
agentCommand: record.agentCommand,
|
|
705
|
+
cwd: record.cwd,
|
|
706
|
+
mcpServers: [...this.options.mcpServers ?? []],
|
|
707
|
+
permissionMode: this.options.permissionMode,
|
|
708
|
+
nonInteractivePermissions: this.options.nonInteractivePermissions,
|
|
709
|
+
verbose: this.options.verbose
|
|
710
|
+
});
|
|
711
|
+
try {
|
|
712
|
+
if (!reusablePendingClient) await withTimeout(client.start(), this.options.timeoutMs);
|
|
713
|
+
if (!client.supportsCloseSession()) throw new AcpRuntimeError("ACP_BACKEND_UNSUPPORTED_CONTROL", `Agent does not support session/close for ${record.acpxRecordId}.`);
|
|
714
|
+
await withTimeout(client.closeSession(record.acpSessionId), this.options.timeoutMs);
|
|
715
|
+
} catch (error) {
|
|
716
|
+
if (isUnsupportedSessionCloseError(error)) throw new AcpRuntimeError("ACP_BACKEND_UNSUPPORTED_CONTROL", `Agent does not support session/close for ${record.acpxRecordId}.`, { cause: error });
|
|
717
|
+
if (isAcpResourceNotFoundError(error)) return;
|
|
718
|
+
throw error;
|
|
719
|
+
} finally {
|
|
720
|
+
await client.close().catch(() => {});
|
|
721
|
+
}
|
|
722
|
+
}
|
|
683
723
|
async requireRecord(sessionId) {
|
|
684
724
|
const record = await this.options.sessionStore.load(sessionId);
|
|
685
725
|
if (!record) throw new Error(`ACP session not found: ${sessionId}`);
|
|
@@ -938,7 +978,7 @@ var AcpxRuntime = class {
|
|
|
938
978
|
await (await this.getManager()).close({
|
|
939
979
|
...input.handle,
|
|
940
980
|
acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey
|
|
941
|
-
});
|
|
981
|
+
}, { discardPersistentState: input.discardPersistentState });
|
|
942
982
|
}
|
|
943
983
|
async getManager() {
|
|
944
984
|
if (this.manager) return this.manager;
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","names":[],"sources":["../src/runtime/public/errors.ts","../src/runtime/public/shared.ts","../src/runtime/public/events.ts","../src/runtime/engine/reuse-policy.ts","../src/runtime/engine/manager.ts","../src/runtime/public/file-session-store.ts","../src/runtime/public/handle-state.ts","../src/runtime/public/probe.ts","../src/runtime.ts"],"sourcesContent":["export const ACP_ERROR_CODES = [\n \"ACP_BACKEND_MISSING\",\n \"ACP_BACKEND_UNAVAILABLE\",\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n \"ACP_DISPATCH_DISABLED\",\n \"ACP_INVALID_RUNTIME_OPTION\",\n \"ACP_SESSION_INIT_FAILED\",\n \"ACP_TURN_FAILED\",\n] as const;\n\nexport type AcpRuntimeErrorCode = (typeof ACP_ERROR_CODES)[number];\n\nexport class AcpRuntimeError extends Error {\n readonly code: AcpRuntimeErrorCode;\n override readonly cause?: unknown;\n\n constructor(code: AcpRuntimeErrorCode, message: string, options?: { cause?: unknown }) {\n super(message);\n this.name = \"AcpRuntimeError\";\n this.code = code;\n this.cause = options?.cause;\n }\n}\n\nexport function isAcpRuntimeError(value: unknown): value is AcpRuntimeError {\n return value instanceof AcpRuntimeError;\n}\n","export type AcpxHandleState = {\n name: string;\n agent: string;\n cwd: string;\n mode: \"persistent\" | \"oneshot\";\n acpxRecordId?: string;\n backendSessionId?: string;\n agentSessionId?: string;\n};\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function asTrimmedString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nexport function asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function asOptionalString(value: unknown): string | undefined {\n const text = asTrimmedString(value);\n return text || undefined;\n}\n\nexport function asOptionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function deriveAgentFromSessionKey(sessionKey: string, fallbackAgent: string): string {\n const match = sessionKey.match(/^agent:([^:]+):/i);\n const candidate = match?.[1] ? asTrimmedString(match[1]) : \"\";\n return candidate || fallbackAgent;\n}\n","import type { AcpRuntimeEvent, AcpSessionUpdateTag } from \"./contract.js\";\nimport {\n asOptionalBoolean,\n asOptionalString,\n asString,\n asTrimmedString,\n isRecord,\n} from \"./shared.js\";\n\nfunction safeParseJsonObject(line: string): Record<string, unknown> | null {\n try {\n const parsed = JSON.parse(line) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction asOptionalFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction resolveStructuredPromptPayload(parsed: Record<string, unknown>): {\n type: string;\n payload: Record<string, unknown>;\n tag?: AcpSessionUpdateTag;\n} {\n const method = asTrimmedString(parsed.method);\n if (method === \"session/update\") {\n const params = parsed.params;\n if (isRecord(params) && isRecord(params.update)) {\n const update = params.update;\n const tag = asOptionalString(update.sessionUpdate) as AcpSessionUpdateTag | undefined;\n return {\n type: tag ?? \"\",\n payload: update,\n ...(tag ? { tag } : {}),\n };\n }\n }\n\n const sessionUpdate = asOptionalString(parsed.sessionUpdate) as AcpSessionUpdateTag | undefined;\n if (sessionUpdate) {\n return {\n type: sessionUpdate,\n payload: parsed,\n tag: sessionUpdate,\n };\n }\n\n const type = asTrimmedString(parsed.type);\n const tag = asOptionalString(parsed.tag) as AcpSessionUpdateTag | undefined;\n return {\n type,\n payload: parsed,\n ...(tag ? { tag } : {}),\n };\n}\n\nfunction resolveStatusTextForTag(params: {\n tag: AcpSessionUpdateTag;\n payload: Record<string, unknown>;\n}): string | null {\n const { tag, payload } = params;\n if (tag === \"available_commands_update\") {\n const commands = Array.isArray(payload.availableCommands) ? payload.availableCommands : [];\n return commands.length > 0\n ? `available commands updated (${commands.length})`\n : \"available commands updated\";\n }\n if (tag === \"current_mode_update\") {\n const mode =\n asTrimmedString(payload.currentModeId) ||\n asTrimmedString(payload.modeId) ||\n asTrimmedString(payload.mode);\n return mode ? `mode updated: ${mode}` : \"mode updated\";\n }\n if (tag === \"config_option_update\") {\n const id = asTrimmedString(payload.id) || asTrimmedString(payload.configOptionId);\n const value =\n asTrimmedString(payload.currentValue) ||\n asTrimmedString(payload.value) ||\n asTrimmedString(payload.optionValue);\n if (id && value) {\n return `config updated: ${id}=${value}`;\n }\n if (id) {\n return `config updated: ${id}`;\n }\n return \"config updated\";\n }\n if (tag === \"session_info_update\") {\n return (\n asTrimmedString(payload.summary) || asTrimmedString(payload.message) || \"session updated\"\n );\n }\n if (tag === \"plan\") {\n const entries = Array.isArray(payload.entries) ? payload.entries : [];\n const first = entries.find((entry) => isRecord(entry));\n const content = asTrimmedString(first?.content);\n return content ? `plan: ${content}` : null;\n }\n return null;\n}\n\nfunction resolveTextChunk(params: {\n payload: Record<string, unknown>;\n stream: \"output\" | \"thought\";\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\n const contentRaw = params.payload.content;\n if (isRecord(contentRaw)) {\n const contentType = asTrimmedString(contentRaw.type);\n if (contentType && contentType !== \"text\") {\n return null;\n }\n const text = asString(contentRaw.text);\n if (text && text.length > 0) {\n return {\n type: \"text_delta\",\n text,\n stream: params.stream,\n tag: params.tag,\n };\n }\n }\n const text = asString(params.payload.text);\n if (!text || text.length === 0) {\n return null;\n }\n return {\n type: \"text_delta\",\n text,\n stream: params.stream,\n tag: params.tag,\n };\n}\n\nfunction createTextDeltaEvent(params: {\n content: string | null | undefined;\n stream: \"output\" | \"thought\";\n tag?: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\n if (params.content == null || params.content.length === 0) {\n return null;\n }\n return {\n type: \"text_delta\",\n text: params.content,\n stream: params.stream,\n ...(params.tag ? { tag: params.tag } : {}),\n };\n}\n\nfunction createToolCallEvent(params: {\n payload: Record<string, unknown>;\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent {\n const title = asTrimmedString(params.payload.title) || \"tool call\";\n const status = asTrimmedString(params.payload.status);\n const toolCallId = asOptionalString(params.payload.toolCallId);\n return {\n type: \"tool_call\",\n text: status ? `${title} (${status})` : title,\n tag: params.tag,\n ...(toolCallId ? { toolCallId } : {}),\n ...(status ? { status } : {}),\n title,\n };\n}\n\nexport function parsePromptEventLine(line: string): AcpRuntimeEvent | null {\n const trimmed = line.trim();\n if (!trimmed) {\n return null;\n }\n const parsed = safeParseJsonObject(trimmed);\n if (!parsed) {\n return {\n type: \"status\",\n text: trimmed,\n };\n }\n\n const structured = resolveStructuredPromptPayload(parsed);\n const type = structured.type;\n const payload = structured.payload;\n const tag = structured.tag;\n\n switch (type) {\n case \"text\":\n return createTextDeltaEvent({\n content: asString(payload.content),\n stream: \"output\",\n tag,\n });\n case \"thought\":\n return createTextDeltaEvent({\n content: asString(payload.content),\n stream: \"thought\",\n tag,\n });\n case \"tool_call\":\n return createToolCallEvent({\n payload,\n tag: tag ?? \"tool_call\",\n });\n case \"tool_call_update\":\n return createToolCallEvent({\n payload,\n tag: tag ?? \"tool_call_update\",\n });\n case \"agent_message_chunk\":\n return resolveTextChunk({\n payload,\n stream: \"output\",\n tag: \"agent_message_chunk\",\n });\n case \"agent_thought_chunk\":\n return resolveTextChunk({\n payload,\n stream: \"thought\",\n tag: \"agent_thought_chunk\",\n });\n case \"usage_update\": {\n const used = asOptionalFiniteNumber(payload.used);\n const size = asOptionalFiniteNumber(payload.size);\n const text =\n used != null && size != null ? `usage updated: ${used}/${size}` : \"usage updated\";\n return {\n type: \"status\",\n text,\n tag: \"usage_update\",\n ...(used != null ? { used } : {}),\n ...(size != null ? { size } : {}),\n };\n }\n case \"available_commands_update\":\n case \"current_mode_update\":\n case \"config_option_update\":\n case \"session_info_update\":\n case \"plan\": {\n const text = resolveStatusTextForTag({\n tag: type as AcpSessionUpdateTag,\n payload,\n });\n if (!text) {\n return null;\n }\n return {\n type: \"status\",\n text,\n tag: type as AcpSessionUpdateTag,\n };\n }\n case \"client_operation\": {\n const method = asTrimmedString(payload.method) || \"operation\";\n const status = asTrimmedString(payload.status);\n const summary = asTrimmedString(payload.summary);\n const text = [method, status, summary].filter(Boolean).join(\" \");\n if (!text) {\n return null;\n }\n return { type: \"status\", text, ...(tag ? { tag } : {}) };\n }\n case \"update\": {\n const update = asTrimmedString(payload.update);\n if (!update) {\n return null;\n }\n return { type: \"status\", text: update, ...(tag ? { tag } : {}) };\n }\n case \"done\":\n return {\n type: \"done\",\n stopReason: asOptionalString(payload.stopReason),\n };\n case \"error\": {\n const message = asTrimmedString(payload.message) || \"acpx runtime error\";\n return {\n type: \"error\",\n message,\n code: asOptionalString(payload.code),\n retryable: asOptionalBoolean(payload.retryable),\n };\n }\n default:\n return null;\n }\n}\n","import path from \"node:path\";\nimport type { SessionRecord } from \"../../types.js\";\n\nexport function shouldReuseExistingRecord(\n record: Pick<SessionRecord, \"cwd\" | \"agentCommand\" | \"acpSessionId\">,\n params: {\n cwd: string;\n agentCommand: string;\n resumeSessionId?: string;\n },\n): boolean {\n if (path.resolve(record.cwd) !== path.resolve(params.cwd)) {\n return false;\n }\n if (record.agentCommand !== params.agentCommand) {\n return false;\n }\n if (params.resumeSessionId && record.acpSessionId !== params.resumeSessionId) {\n return false;\n }\n return true;\n}\n","import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { AcpClient } from \"../../acp/client.js\";\nimport { normalizeOutputError } from \"../../acp/error-normalization.js\";\nimport { textPrompt, type PromptInput } from \"../../prompt-content.js\";\nimport {\n cloneSessionAcpxState,\n cloneSessionConversation,\n createSessionConversation,\n recordClientOperation,\n recordPromptSubmission,\n recordSessionUpdate,\n trimConversationForRuntime,\n} from \"../../session/conversation-model.js\";\nimport { defaultSessionEventLog } from \"../../session/event-log.js\";\nimport { setDesiredModeId } from \"../../session/mode-preference.js\";\nimport type { ClientOperation, SessionRecord, SessionResumePolicy } from \"../../types.js\";\nimport type {\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeStatus,\n AcpRuntimeTurnAttachment,\n} from \"../public/contract.js\";\nimport { AcpRuntimeError } from \"../public/errors.js\";\nimport { parsePromptEventLine } from \"../public/events.js\";\nimport { withConnectedSession } from \"./connected-session.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\n reconcileAgentSessionId,\n} from \"./lifecycle.js\";\nimport { runPromptTurn } from \"./prompt-turn.js\";\nimport { connectAndLoadSession } from \"./reconnect.js\";\nimport { shouldReuseExistingRecord } from \"./reuse-policy.js\";\n\nexport type AcpRuntimeManagerDeps = {\n clientFactory?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n};\n\ntype ActiveSessionController = {\n hasActivePrompt: () => boolean;\n requestCancelActivePrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string) => Promise<void>;\n setSessionModel: (modelId: string) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => ReturnType<AcpClient[\"setSessionConfigOption\"]>;\n};\n\ntype Deferred<T> = {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n};\n\nfunction createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nclass AsyncEventQueue {\n private readonly items: AcpRuntimeEvent[] = [];\n private readonly waits: Deferred<AcpRuntimeEvent | null>[] = [];\n private closed = false;\n\n push(item: AcpRuntimeEvent): void {\n if (this.closed) {\n return;\n }\n const waiter = this.waits.shift();\n if (waiter) {\n waiter.resolve(item);\n return;\n }\n this.items.push(item);\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const waiter of this.waits.splice(0)) {\n waiter.resolve(null);\n }\n }\n\n async next(): Promise<AcpRuntimeEvent | null> {\n if (this.items.length > 0) {\n return this.items.shift() ?? null;\n }\n if (this.closed) {\n return null;\n }\n const waiter = createDeferred<AcpRuntimeEvent | null>();\n this.waits.push(waiter);\n return await waiter.promise;\n }\n\n async *iterate(): AsyncIterable<AcpRuntimeEvent> {\n while (true) {\n const next = await this.next();\n if (!next) {\n return;\n }\n yield next;\n }\n }\n}\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\nfunction toPromptInput(\n text: string,\n attachments?: AcpRuntimeTurnAttachment[],\n): PromptInput | string {\n if (!attachments || attachments.length === 0) {\n return text;\n }\n const blocks: Array<\n { type: \"text\"; text: string } | { type: \"image\"; mimeType: string; data: string }\n > = [];\n if (text) {\n blocks.push({ type: \"text\", text });\n }\n for (const attachment of attachments) {\n if (!attachment.mediaType.startsWith(\"image/\")) {\n throw new AcpRuntimeError(\n \"ACP_TURN_FAILED\",\n `Unsupported ACP runtime attachment media type: ${attachment.mediaType}`,\n );\n }\n blocks.push({\n type: \"image\",\n mimeType: attachment.mediaType,\n data: attachment.data,\n });\n }\n return blocks.length > 0 ? blocks : textPrompt(text);\n}\n\nfunction createInitialRecord(params: {\n recordId: string;\n sessionName: string;\n sessionId: string;\n agentCommand: string;\n cwd: string;\n agentSessionId?: string;\n}): SessionRecord {\n const now = isoNow();\n return {\n schema: \"acpx.session.v1\",\n acpxRecordId: params.recordId,\n acpSessionId: params.sessionId,\n agentSessionId: params.agentSessionId,\n agentCommand: params.agentCommand,\n cwd: params.cwd,\n name: params.sessionName,\n createdAt: now,\n lastUsedAt: now,\n lastSeq: 0,\n eventLog: defaultSessionEventLog(params.recordId),\n closed: false,\n closedAt: undefined,\n ...createSessionConversation(now),\n acpx: {},\n };\n}\n\nfunction createRecordId(sessionKey: string, mode: \"persistent\" | \"oneshot\"): string {\n if (mode === \"persistent\") {\n return sessionKey;\n }\n return `${sessionKey}:oneshot:${randomUUID()}`;\n}\n\nfunction resumePolicyForSessionMode(mode: \"persistent\" | \"oneshot\"): SessionResumePolicy {\n return mode === \"persistent\" ? \"same-session-only\" : \"allow-new\";\n}\n\nfunction statusSummary(record: SessionRecord): string {\n const parts = [\n `session=${record.acpxRecordId}`,\n `backendSessionId=${record.acpSessionId}`,\n record.agentSessionId ? `agentSessionId=${record.agentSessionId}` : null,\n record.pid != null ? `pid=${record.pid}` : null,\n record.closed ? \"closed\" : \"open\",\n ].filter(Boolean);\n return parts.join(\" \");\n}\n\nexport class AcpRuntimeManager {\n private readonly activeControllers = new Map<string, ActiveSessionController>();\n private readonly pendingPersistentClients = new Map<string, AcpClient>();\n\n constructor(\n private readonly options: AcpRuntimeOptions,\n private readonly deps: AcpRuntimeManagerDeps = {},\n ) {}\n\n private createClient(options: ConstructorParameters<typeof AcpClient>[0]): AcpClient {\n return this.deps.clientFactory?.(options) ?? new AcpClient(options);\n }\n\n async ensureSession(input: {\n sessionKey: string;\n agent: string;\n mode: \"persistent\" | \"oneshot\";\n cwd?: string;\n resumeSessionId?: string;\n }): Promise<SessionRecord> {\n const cwd = path.resolve(input.cwd?.trim() || this.options.cwd);\n const agentCommand = this.options.agentRegistry.resolve(input.agent);\n const existing = await this.options.sessionStore.load(input.sessionKey);\n if (\n input.mode === \"persistent\" &&\n existing &&\n shouldReuseExistingRecord(existing, {\n cwd,\n agentCommand,\n resumeSessionId: input.resumeSessionId,\n })\n ) {\n existing.closed = false;\n existing.closedAt = undefined;\n await this.options.sessionStore.save(existing);\n return existing;\n }\n\n const client = this.createClient({\n agentCommand,\n cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n });\n let keepClientOpen = false;\n\n try {\n await client.start();\n let sessionId: string;\n let agentSessionId: string | undefined;\n if (input.resumeSessionId) {\n const loaded = await client.loadSession(input.resumeSessionId, cwd);\n sessionId = input.resumeSessionId;\n agentSessionId = loaded.agentSessionId;\n } else {\n const created = await client.createSession(cwd);\n sessionId = created.sessionId;\n agentSessionId = created.agentSessionId;\n }\n const record = createInitialRecord({\n recordId: createRecordId(input.sessionKey, input.mode),\n sessionName: input.sessionKey,\n sessionId,\n agentCommand,\n cwd,\n agentSessionId,\n });\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(record);\n if (input.mode === \"persistent\") {\n const previousClient = this.pendingPersistentClients.get(record.acpxRecordId);\n this.pendingPersistentClients.set(record.acpxRecordId, client);\n keepClientOpen = true;\n await previousClient?.close().catch(() => {});\n }\n return record;\n } finally {\n if (!keepClientOpen) {\n await client.close();\n }\n }\n }\n\n async *runTurn(input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n }): AsyncIterable<AcpRuntimeEvent> {\n const record = await this.requireRecord(input.handle.acpxRecordId ?? input.handle.sessionKey);\n const conversation = cloneSessionConversation(record);\n let acpxState = cloneSessionAcpxState(record.acpx);\n const promptInput = toPromptInput(input.text, input.attachments);\n const promptMessageId = recordPromptSubmission(conversation, promptInput, isoNow());\n trimConversationForRuntime(conversation);\n\n const queue = new AsyncEventQueue();\n let pendingClient = this.pendingPersistentClients.get(record.acpxRecordId);\n if (pendingClient) {\n this.pendingPersistentClients.delete(record.acpxRecordId);\n if (!pendingClient.hasReusableSession(record.acpSessionId)) {\n await pendingClient.close().catch(() => {});\n pendingClient = undefined;\n }\n }\n const client =\n pendingClient ??\n this.createClient({\n agentCommand: record.agentCommand,\n cwd: record.cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n });\n let activeSessionId = record.acpSessionId;\n let sawDone = false;\n let pendingCancel = false;\n let turnActive = true;\n const sessionReady = createDeferred<void>();\n void sessionReady.promise.catch(() => {});\n\n const applyPendingCancel = async (): Promise<boolean> => {\n if (!pendingCancel || !client.hasActivePrompt()) {\n return false;\n }\n const cancelled = await client.requestCancelActivePrompt();\n if (cancelled) {\n pendingCancel = false;\n }\n return cancelled;\n };\n\n const activeController: ActiveSessionController = {\n hasActivePrompt: () => client.hasActivePrompt(),\n requestCancelActivePrompt: async () => {\n if (client.hasActivePrompt()) {\n return await client.requestCancelActivePrompt();\n }\n if (!turnActive) {\n return false;\n }\n pendingCancel = true;\n return true;\n },\n setSessionMode: async (modeId: string) => {\n if (!client.hasActivePrompt()) {\n await sessionReady.promise;\n }\n await client.setSessionMode(activeSessionId, modeId);\n },\n setSessionModel: async (modelId: string) => {\n if (!client.hasActivePrompt()) {\n await sessionReady.promise;\n }\n await client.setSessionModel(activeSessionId, modelId);\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n if (!client.hasActivePrompt()) {\n await sessionReady.promise;\n }\n return await client.setSessionConfigOption(activeSessionId, configId, value);\n },\n };\n\n const emitParsed = (payload: Record<string, unknown>): void => {\n const parsed = parsePromptEventLine(JSON.stringify(payload));\n if (!parsed) {\n return;\n }\n if (parsed.type === \"done\") {\n sawDone = true;\n }\n queue.push(parsed);\n };\n\n const abortHandler = () => {\n void activeController.requestCancelActivePrompt();\n };\n if (input.signal) {\n if (input.signal.aborted) {\n queue.close();\n return;\n }\n input.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n this.activeControllers.set(record.acpxRecordId, activeController);\n\n void (async () => {\n try {\n client.setEventHandlers({\n onSessionUpdate: (notification) => {\n acpxState = recordSessionUpdate(conversation, acpxState, notification);\n trimConversationForRuntime(conversation);\n emitParsed({\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: notification,\n });\n },\n onClientOperation: (operation: ClientOperation) => {\n acpxState = recordClientOperation(conversation, acpxState, operation);\n trimConversationForRuntime(conversation);\n emitParsed({\n type: \"client_operation\",\n ...operation,\n });\n },\n });\n\n const { sessionId, resumed, loadError } = pendingClient\n ? {\n sessionId: record.acpSessionId,\n resumed: false,\n loadError: undefined,\n }\n : await connectAndLoadSession({\n client,\n record,\n resumePolicy: resumePolicyForSessionMode(input.sessionMode),\n timeoutMs: this.options.timeoutMs,\n activeController,\n onClientAvailable: (controller) => {\n this.activeControllers.set(record.acpxRecordId, controller);\n },\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionIdValue) => {\n activeSessionId = sessionIdValue;\n },\n });\n sessionReady.resolve();\n\n record.lastRequestId = input.requestId;\n record.lastPromptAt = isoNow();\n record.closed = false;\n record.closedAt = undefined;\n record.lastUsedAt = isoNow();\n if (resumed || loadError) {\n emitParsed({\n type: \"status\",\n text: loadError ? `load fallback: ${loadError}` : \"session resumed\",\n });\n }\n\n if (pendingCancel || input.signal?.aborted) {\n pendingCancel = false;\n if (!sawDone) {\n queue.push({\n type: \"done\",\n stopReason: \"cancelled\",\n });\n }\n return;\n }\n\n await applyPendingCancel();\n const response = await runPromptTurn({\n client,\n sessionId,\n prompt: promptInput,\n timeoutMs: input.timeoutMs ?? this.options.timeoutMs,\n conversation,\n promptMessageId,\n });\n\n record.acpSessionId = activeSessionId;\n reconcileAgentSessionId(record, record.agentSessionId);\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n record.acpx = acpxState;\n applyConversation(record, conversation);\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(record);\n\n if (!sawDone) {\n queue.push({\n type: \"done\",\n stopReason: response.stopReason,\n });\n }\n } catch (error) {\n sessionReady.reject(error);\n const normalized = normalizeOutputError(error, { origin: \"runtime\" });\n queue.push({\n type: \"error\",\n message: normalized.message,\n code: normalized.code,\n retryable: normalized.retryable,\n });\n } finally {\n turnActive = false;\n if (input.signal) {\n input.signal.removeEventListener(\"abort\", abortHandler);\n }\n this.activeControllers.delete(record.acpxRecordId);\n client.clearEventHandlers();\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n record.acpx = acpxState;\n applyConversation(record, conversation);\n record.lastUsedAt = isoNow();\n await this.options.sessionStore.save(record).catch(() => {});\n await client.close().catch(() => {});\n queue.close();\n }\n })();\n\n yield* queue.iterate();\n }\n\n async getStatus(handle: AcpRuntimeHandle): Promise<AcpRuntimeStatus> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n return {\n summary: statusSummary(record),\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n details: {\n cwd: record.cwd,\n lastUsedAt: record.lastUsedAt,\n closed: record.closed === true,\n },\n };\n }\n\n async setMode(\n handle: AcpRuntimeHandle,\n mode: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n const controller = this.activeControllers.get(record.acpxRecordId);\n let targetRecord = record;\n if (controller) {\n await controller.setSessionMode(mode);\n } else {\n const result = await withConnectedSession({\n sessionRecordId: record.acpxRecordId,\n loadRecord: async (sessionRecordId) => await this.requireRecord(sessionRecordId),\n saveRecord: async (connectedRecord) =>\n await this.options.sessionStore.save(connectedRecord),\n createClient: (options) => this.createClient(options),\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n timeoutMs: this.options.timeoutMs,\n resumePolicy: resumePolicyForSessionMode(sessionMode),\n run: async ({ client, sessionId }) => {\n await client.setSessionMode(sessionId, mode);\n },\n });\n targetRecord = result.record;\n }\n setDesiredModeId(targetRecord, mode);\n await this.options.sessionStore.save(targetRecord);\n }\n\n async setConfigOption(\n handle: AcpRuntimeHandle,\n key: string,\n value: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n const controller = this.activeControllers.get(record.acpxRecordId);\n let targetRecord = record;\n if (controller) {\n await controller.setSessionConfigOption(key, value);\n } else {\n const result = await withConnectedSession({\n sessionRecordId: record.acpxRecordId,\n loadRecord: async (sessionRecordId) => await this.requireRecord(sessionRecordId),\n saveRecord: async (connectedRecord) =>\n await this.options.sessionStore.save(connectedRecord),\n createClient: (options) => this.createClient(options),\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n timeoutMs: this.options.timeoutMs,\n resumePolicy: resumePolicyForSessionMode(sessionMode),\n run: async ({ client, sessionId, record: connectedRecord }) => {\n await client.setSessionConfigOption(sessionId, key, value);\n if (key === \"mode\") {\n setDesiredModeId(connectedRecord, value);\n }\n },\n });\n targetRecord = result.record;\n }\n if (key === \"mode\") {\n setDesiredModeId(targetRecord, value);\n }\n await this.options.sessionStore.save(targetRecord);\n }\n\n async cancel(handle: AcpRuntimeHandle): Promise<void> {\n const controller = this.activeControllers.get(handle.acpxRecordId ?? handle.sessionKey);\n await controller?.requestCancelActivePrompt();\n }\n\n async close(handle: AcpRuntimeHandle): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n await this.cancel(handle);\n record.closed = true;\n record.closedAt = isoNow();\n await this.options.sessionStore.save(record);\n }\n\n private async requireRecord(sessionId: string): Promise<SessionRecord> {\n const record = await this.options.sessionStore.load(sessionId);\n if (!record) {\n throw new Error(`ACP session not found: ${sessionId}`);\n }\n return record;\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { assertPersistedKeyPolicy } from \"../../persisted-key-policy.js\";\nimport { parseSessionRecord } from \"../../session/persistence/parse.js\";\nimport { serializeSessionRecordForDisk } from \"../../session/persistence/serialize.js\";\nimport type { AcpFileSessionStoreOptions, AcpSessionRecord, AcpSessionStore } from \"./contract.js\";\n\nfunction safeSessionId(sessionId: string): string {\n return encodeURIComponent(sessionId);\n}\n\nclass FileSessionStore implements AcpSessionStore {\n constructor(private readonly stateDir: string) {}\n\n private get sessionDir(): string {\n return path.join(this.stateDir, \"sessions\");\n }\n\n private filePath(sessionId: string): string {\n return path.join(this.sessionDir, `${safeSessionId(sessionId)}.json`);\n }\n\n private async ensureDir(): Promise<void> {\n await fs.mkdir(this.sessionDir, { recursive: true });\n }\n\n async load(sessionId: string): Promise<AcpSessionRecord | undefined> {\n await this.ensureDir();\n try {\n const payload = await fs.readFile(this.filePath(sessionId), \"utf8\");\n return parseSessionRecord(JSON.parse(payload)) ?? undefined;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n }\n\n async save(record: AcpSessionRecord): Promise<void> {\n await this.ensureDir();\n const persisted = serializeSessionRecordForDisk(record);\n assertPersistedKeyPolicy(persisted);\n\n const file = this.filePath(record.acpxRecordId);\n const tempFile = `${file}.${process.pid}.${Date.now()}.tmp`;\n const payload = JSON.stringify(persisted, null, 2);\n await fs.writeFile(tempFile, `${payload}\\n`, \"utf8\");\n await fs.rename(tempFile, file);\n }\n}\n\nexport function createFileSessionStore(options: AcpFileSessionStoreOptions): AcpSessionStore {\n return new FileSessionStore(path.resolve(options.stateDir));\n}\n","import type { AcpRuntimeHandle } from \"./contract.js\";\nimport type { AcpxHandleState } from \"./shared.js\";\nimport { asOptionalString } from \"./shared.js\";\n\nconst ACPX_RUNTIME_HANDLE_PREFIX = \"acpx:v2:\";\n\nexport function encodeAcpxRuntimeHandleState(state: AcpxHandleState): string {\n const payload = Buffer.from(JSON.stringify(state), \"utf8\").toString(\"base64url\");\n return `${ACPX_RUNTIME_HANDLE_PREFIX}${payload}`;\n}\n\nexport function decodeAcpxRuntimeHandleState(runtimeSessionName: string): AcpxHandleState | null {\n const trimmed = runtimeSessionName.trim();\n if (!trimmed.startsWith(ACPX_RUNTIME_HANDLE_PREFIX)) {\n return null;\n }\n try {\n const raw = Buffer.from(trimmed.slice(ACPX_RUNTIME_HANDLE_PREFIX.length), \"base64url\").toString(\n \"utf8\",\n );\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const name = asOptionalString(parsed.name);\n const agent = asOptionalString(parsed.agent);\n const cwd = asOptionalString(parsed.cwd);\n const mode = asOptionalString(parsed.mode);\n if (!name || !agent || !cwd || (mode !== \"persistent\" && mode !== \"oneshot\")) {\n return null;\n }\n return {\n name,\n agent,\n cwd,\n mode,\n acpxRecordId: asOptionalString(parsed.acpxRecordId),\n backendSessionId: asOptionalString(parsed.backendSessionId),\n agentSessionId: asOptionalString(parsed.agentSessionId),\n };\n } catch {\n return null;\n }\n}\n\nexport function writeHandleState(handle: AcpRuntimeHandle, state: AcpxHandleState): void {\n handle.runtimeSessionName = encodeAcpxRuntimeHandleState(state);\n handle.cwd = state.cwd;\n handle.acpxRecordId = state.acpxRecordId;\n handle.backendSessionId = state.backendSessionId;\n handle.agentSessionId = state.agentSessionId;\n}\n","import { AcpClient } from \"../../acp/client.js\";\nimport { DEFAULT_AGENT_NAME } from \"../../agent-registry.js\";\nimport type { AcpRuntimeOptions } from \"./contract.js\";\n\nexport type RuntimeHealthReport = {\n ok: boolean;\n message: string;\n details?: string[];\n};\n\nexport type ProbeRuntimeDeps = {\n clientFactory?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n};\n\nexport async function probeRuntime(\n options: AcpRuntimeOptions,\n deps: ProbeRuntimeDeps = {},\n): Promise<RuntimeHealthReport> {\n const agentName = options.probeAgent?.trim() || DEFAULT_AGENT_NAME;\n const agentCommand = options.agentRegistry.resolve(agentName);\n const client =\n deps.clientFactory?.({\n agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n verbose: options.verbose,\n }) ??\n new AcpClient({\n agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n verbose: options.verbose,\n });\n\n try {\n await client.start();\n return {\n ok: true,\n message: \"embedded ACP runtime ready\",\n details: [\n `agent=${agentName}`,\n `command=${agentCommand}`,\n `cwd=${options.cwd}`,\n ...(client.initializeResult?.protocolVersion\n ? [`protocolVersion=${client.initializeResult.protocolVersion}`]\n : []),\n ],\n };\n } catch (error) {\n return {\n ok: false,\n message: \"embedded ACP runtime probe failed\",\n details: [\n `agent=${agentName}`,\n `command=${agentCommand}`,\n `cwd=${options.cwd}`,\n error instanceof Error ? error.message : String(error),\n ],\n };\n } finally {\n await client.close().catch(() => {});\n }\n}\n","import { DEFAULT_AGENT_NAME, listBuiltInAgents, resolveAgentCommand } from \"./agent-registry.js\";\nimport { AcpRuntimeManager } from \"./runtime/engine/manager.js\";\nimport type {\n AcpAgentRegistry,\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimeStatus,\n AcpSessionStore,\n} from \"./runtime/public/contract.js\";\nimport { AcpRuntimeError } from \"./runtime/public/errors.js\";\nimport { createFileSessionStore } from \"./runtime/public/file-session-store.js\";\nimport { decodeAcpxRuntimeHandleState, writeHandleState } from \"./runtime/public/handle-state.js\";\nimport { probeRuntime } from \"./runtime/public/probe.js\";\nimport { deriveAgentFromSessionKey, type AcpxHandleState } from \"./runtime/public/shared.js\";\n\nexport { DEFAULT_AGENT_NAME, createFileSessionStore };\nexport { AcpRuntimeError, isAcpRuntimeError } from \"./runtime/public/errors.js\";\nexport type { AcpRuntimeErrorCode } from \"./runtime/public/errors.js\";\nexport {\n decodeAcpxRuntimeHandleState,\n encodeAcpxRuntimeHandleState,\n} from \"./runtime/public/handle-state.js\";\nexport type {\n AcpAgentRegistry,\n AcpFileSessionStoreOptions,\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeSessionMode,\n AcpRuntimeStatus,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurnInput,\n AcpSessionRecord,\n AcpSessionStore,\n AcpSessionUpdateTag,\n} from \"./runtime/public/contract.js\";\n\nexport const ACPX_BACKEND_ID = \"acpx\";\n\nconst ACPX_CAPABILITIES: AcpRuntimeCapabilities = {\n controls: [\"session/set_mode\", \"session/set_config_option\", \"session/status\"],\n};\n\ntype AcpxRuntimeLike = AcpRuntime & {\n probeAvailability(): Promise<void>;\n isHealthy(): boolean;\n doctor(): Promise<AcpRuntimeDoctorReport>;\n};\n\nexport function createAgentRegistry(params?: {\n overrides?: Record<string, string>;\n}): AcpAgentRegistry {\n return {\n resolve(agentName: string) {\n return resolveAgentCommand(agentName, params?.overrides);\n },\n list() {\n return listBuiltInAgents(params?.overrides);\n },\n };\n}\n\nexport class AcpxRuntime implements AcpxRuntimeLike {\n private healthy = false;\n private manager: AcpRuntimeManager | null = null;\n private managerPromise: Promise<AcpRuntimeManager> | null = null;\n\n constructor(\n private readonly options: AcpRuntimeOptions,\n private readonly testOptions?: {\n managerFactory?: (options: AcpRuntimeOptions) => AcpRuntimeManager;\n probeRunner?: (options: AcpRuntimeOptions) => Promise<{\n ok: boolean;\n message: string;\n details?: string[];\n }>;\n },\n ) {}\n\n isHealthy(): boolean {\n return this.healthy;\n }\n\n async probeAvailability(): Promise<void> {\n const report = await this.runProbe();\n this.healthy = report.ok;\n }\n\n async doctor(): Promise<AcpRuntimeDoctorReport> {\n const report = await this.runProbe();\n this.healthy = report.ok;\n return {\n ok: report.ok,\n code: report.ok ? undefined : \"ACP_BACKEND_UNAVAILABLE\",\n message: report.message,\n details: report.details,\n };\n }\n\n async ensureSession(input: AcpRuntimeEnsureInput): Promise<AcpRuntimeHandle> {\n const sessionName = input.sessionKey.trim();\n if (!sessionName) {\n throw new AcpRuntimeError(\"ACP_SESSION_INIT_FAILED\", \"ACP session key is required.\");\n }\n const agent = input.agent.trim();\n if (!agent) {\n throw new AcpRuntimeError(\"ACP_SESSION_INIT_FAILED\", \"ACP agent id is required.\");\n }\n\n const manager = await this.getManager();\n const record = await manager.ensureSession({\n sessionKey: sessionName,\n agent,\n mode: input.mode,\n cwd: input.cwd ?? this.options.cwd,\n resumeSessionId: input.resumeSessionId,\n });\n\n const handle: AcpRuntimeHandle = {\n sessionKey: input.sessionKey,\n backend: ACPX_BACKEND_ID,\n runtimeSessionName: \"\",\n cwd: record.cwd,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n };\n writeHandleState(handle, {\n name: sessionName,\n agent,\n cwd: record.cwd,\n mode: input.mode,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n });\n return handle;\n }\n\n async *runTurn(\n input: import(\"./runtime/public/contract.js\").AcpRuntimeTurnInput,\n ): AsyncIterable<import(\"./runtime/public/contract.js\").AcpRuntimeEvent> {\n const state = this.resolveHandleState(input.handle);\n const manager = await this.getManager();\n yield* manager.runTurn({\n handle: {\n ...input.handle,\n acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey,\n },\n text: input.text,\n attachments: input.attachments,\n mode: input.mode,\n sessionMode: state.mode,\n requestId: input.requestId,\n timeoutMs: input.timeoutMs,\n signal: input.signal,\n });\n }\n\n getCapabilities(): AcpRuntimeCapabilities {\n return ACPX_CAPABILITIES;\n }\n\n async getStatus(input: {\n handle: AcpRuntimeHandle;\n signal?: AbortSignal;\n }): Promise<AcpRuntimeStatus> {\n const state = this.resolveHandleState(input.handle);\n const manager = await this.getManager();\n return await manager.getStatus({\n ...input.handle,\n acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey,\n });\n }\n\n async setMode(input: { handle: AcpRuntimeHandle; mode: string }): Promise<void> {\n const state = this.resolveHandleState(input.handle);\n const manager = await this.getManager();\n await manager.setMode(\n {\n ...input.handle,\n acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey,\n },\n input.mode,\n state.mode,\n );\n }\n\n async setConfigOption(input: {\n handle: AcpRuntimeHandle;\n key: string;\n value: string;\n }): Promise<void> {\n const state = this.resolveHandleState(input.handle);\n const manager = await this.getManager();\n await manager.setConfigOption(\n {\n ...input.handle,\n acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey,\n },\n input.key,\n input.value,\n state.mode,\n );\n }\n\n async cancel(input: { handle: AcpRuntimeHandle; reason?: string }): Promise<void> {\n const state = this.resolveHandleState(input.handle);\n const manager = await this.getManager();\n await manager.cancel({\n ...input.handle,\n acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey,\n });\n }\n\n async close(input: { handle: AcpRuntimeHandle; reason: string }): Promise<void> {\n const state = this.resolveHandleState(input.handle);\n const manager = await this.getManager();\n await manager.close({\n ...input.handle,\n acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey,\n });\n }\n\n private async getManager(): Promise<AcpRuntimeManager> {\n if (this.manager) {\n return this.manager;\n }\n if (!this.managerPromise) {\n this.managerPromise = Promise.resolve(\n this.testOptions?.managerFactory?.(this.options) ?? new AcpRuntimeManager(this.options),\n ).then((manager) => {\n this.manager = manager;\n return manager;\n });\n }\n return await this.managerPromise;\n }\n\n private async runProbe() {\n return await (this.testOptions?.probeRunner?.(this.options) ?? probeRuntime(this.options));\n }\n\n private resolveHandleState(handle: AcpRuntimeHandle): AcpxHandleState {\n const decoded = decodeAcpxRuntimeHandleState(handle.runtimeSessionName);\n if (decoded) {\n return {\n ...decoded,\n acpxRecordId: decoded.acpxRecordId ?? handle.acpxRecordId,\n backendSessionId: decoded.backendSessionId ?? handle.backendSessionId,\n agentSessionId: decoded.agentSessionId ?? handle.agentSessionId,\n };\n }\n\n const runtimeSessionName = handle.runtimeSessionName.trim();\n if (!runtimeSessionName) {\n throw new AcpRuntimeError(\n \"ACP_SESSION_INIT_FAILED\",\n \"Invalid embedded ACP runtime handle: runtimeSessionName is missing.\",\n );\n }\n\n return {\n name: runtimeSessionName,\n agent: deriveAgentFromSessionKey(handle.sessionKey, DEFAULT_AGENT_NAME),\n cwd: handle.cwd ?? this.options.cwd,\n mode: \"persistent\",\n acpxRecordId: handle.acpxRecordId,\n backendSessionId: handle.backendSessionId,\n agentSessionId: handle.agentSessionId,\n };\n }\n}\n\nexport function createAcpRuntime(options: AcpRuntimeOptions): AcpxRuntime {\n return new AcpxRuntime(options);\n}\n\nexport function createRuntimeStore(options: { stateDir: string }): AcpSessionStore {\n return createFileSessionStore(options);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.js","names":[],"sources":["../src/runtime/public/errors.ts","../src/runtime/public/shared.ts","../src/runtime/public/events.ts","../src/runtime/engine/reuse-policy.ts","../src/runtime/engine/manager.ts","../src/runtime/public/file-session-store.ts","../src/runtime/public/handle-state.ts","../src/runtime/public/probe.ts","../src/runtime.ts"],"sourcesContent":["export const ACP_ERROR_CODES = [\n \"ACP_BACKEND_MISSING\",\n \"ACP_BACKEND_UNAVAILABLE\",\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n \"ACP_DISPATCH_DISABLED\",\n \"ACP_INVALID_RUNTIME_OPTION\",\n \"ACP_SESSION_INIT_FAILED\",\n \"ACP_TURN_FAILED\",\n] as const;\n\nexport type AcpRuntimeErrorCode = (typeof ACP_ERROR_CODES)[number];\n\nexport class AcpRuntimeError extends Error {\n readonly code: AcpRuntimeErrorCode;\n override readonly cause?: unknown;\n\n constructor(code: AcpRuntimeErrorCode, message: string, options?: { cause?: unknown }) {\n super(message);\n this.name = \"AcpRuntimeError\";\n this.code = code;\n this.cause = options?.cause;\n }\n}\n\nexport function isAcpRuntimeError(value: unknown): value is AcpRuntimeError {\n return value instanceof AcpRuntimeError;\n}\n","export type AcpxHandleState = {\n name: string;\n agent: string;\n cwd: string;\n mode: \"persistent\" | \"oneshot\";\n acpxRecordId?: string;\n backendSessionId?: string;\n agentSessionId?: string;\n};\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function asTrimmedString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nexport function asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function asOptionalString(value: unknown): string | undefined {\n const text = asTrimmedString(value);\n return text || undefined;\n}\n\nexport function asOptionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function deriveAgentFromSessionKey(sessionKey: string, fallbackAgent: string): string {\n const match = sessionKey.match(/^agent:([^:]+):/i);\n const candidate = match?.[1] ? asTrimmedString(match[1]) : \"\";\n return candidate || fallbackAgent;\n}\n","import type { AcpRuntimeEvent, AcpSessionUpdateTag } from \"./contract.js\";\nimport {\n asOptionalBoolean,\n asOptionalString,\n asString,\n asTrimmedString,\n isRecord,\n} from \"./shared.js\";\n\nfunction safeParseJsonObject(line: string): Record<string, unknown> | null {\n try {\n const parsed = JSON.parse(line) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction asOptionalFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction resolveStructuredPromptPayload(parsed: Record<string, unknown>): {\n type: string;\n payload: Record<string, unknown>;\n tag?: AcpSessionUpdateTag;\n} {\n const method = asTrimmedString(parsed.method);\n if (method === \"session/update\") {\n const params = parsed.params;\n if (isRecord(params) && isRecord(params.update)) {\n const update = params.update;\n const tag = asOptionalString(update.sessionUpdate) as AcpSessionUpdateTag | undefined;\n return {\n type: tag ?? \"\",\n payload: update,\n ...(tag ? { tag } : {}),\n };\n }\n }\n\n const sessionUpdate = asOptionalString(parsed.sessionUpdate) as AcpSessionUpdateTag | undefined;\n if (sessionUpdate) {\n return {\n type: sessionUpdate,\n payload: parsed,\n tag: sessionUpdate,\n };\n }\n\n const type = asTrimmedString(parsed.type);\n const tag = asOptionalString(parsed.tag) as AcpSessionUpdateTag | undefined;\n return {\n type,\n payload: parsed,\n ...(tag ? { tag } : {}),\n };\n}\n\nfunction resolveStatusTextForTag(params: {\n tag: AcpSessionUpdateTag;\n payload: Record<string, unknown>;\n}): string | null {\n const { tag, payload } = params;\n if (tag === \"available_commands_update\") {\n const commands = Array.isArray(payload.availableCommands) ? payload.availableCommands : [];\n return commands.length > 0\n ? `available commands updated (${commands.length})`\n : \"available commands updated\";\n }\n if (tag === \"current_mode_update\") {\n const mode =\n asTrimmedString(payload.currentModeId) ||\n asTrimmedString(payload.modeId) ||\n asTrimmedString(payload.mode);\n return mode ? `mode updated: ${mode}` : \"mode updated\";\n }\n if (tag === \"config_option_update\") {\n const id = asTrimmedString(payload.id) || asTrimmedString(payload.configOptionId);\n const value =\n asTrimmedString(payload.currentValue) ||\n asTrimmedString(payload.value) ||\n asTrimmedString(payload.optionValue);\n if (id && value) {\n return `config updated: ${id}=${value}`;\n }\n if (id) {\n return `config updated: ${id}`;\n }\n return \"config updated\";\n }\n if (tag === \"session_info_update\") {\n return (\n asTrimmedString(payload.summary) || asTrimmedString(payload.message) || \"session updated\"\n );\n }\n if (tag === \"plan\") {\n const entries = Array.isArray(payload.entries) ? payload.entries : [];\n const first = entries.find((entry) => isRecord(entry));\n const content = asTrimmedString(first?.content);\n return content ? `plan: ${content}` : null;\n }\n return null;\n}\n\nfunction resolveTextChunk(params: {\n payload: Record<string, unknown>;\n stream: \"output\" | \"thought\";\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\n const contentRaw = params.payload.content;\n if (isRecord(contentRaw)) {\n const contentType = asTrimmedString(contentRaw.type);\n if (contentType && contentType !== \"text\") {\n return null;\n }\n const text = asString(contentRaw.text);\n if (text && text.length > 0) {\n return {\n type: \"text_delta\",\n text,\n stream: params.stream,\n tag: params.tag,\n };\n }\n }\n const text = asString(params.payload.text);\n if (!text || text.length === 0) {\n return null;\n }\n return {\n type: \"text_delta\",\n text,\n stream: params.stream,\n tag: params.tag,\n };\n}\n\nfunction createTextDeltaEvent(params: {\n content: string | null | undefined;\n stream: \"output\" | \"thought\";\n tag?: AcpSessionUpdateTag;\n}): AcpRuntimeEvent | null {\n if (params.content == null || params.content.length === 0) {\n return null;\n }\n return {\n type: \"text_delta\",\n text: params.content,\n stream: params.stream,\n ...(params.tag ? { tag: params.tag } : {}),\n };\n}\n\nfunction createToolCallEvent(params: {\n payload: Record<string, unknown>;\n tag: AcpSessionUpdateTag;\n}): AcpRuntimeEvent {\n const title = asTrimmedString(params.payload.title) || \"tool call\";\n const status = asTrimmedString(params.payload.status);\n const toolCallId = asOptionalString(params.payload.toolCallId);\n return {\n type: \"tool_call\",\n text: status ? `${title} (${status})` : title,\n tag: params.tag,\n ...(toolCallId ? { toolCallId } : {}),\n ...(status ? { status } : {}),\n title,\n };\n}\n\nexport function parsePromptEventLine(line: string): AcpRuntimeEvent | null {\n const trimmed = line.trim();\n if (!trimmed) {\n return null;\n }\n const parsed = safeParseJsonObject(trimmed);\n if (!parsed) {\n return {\n type: \"status\",\n text: trimmed,\n };\n }\n\n const structured = resolveStructuredPromptPayload(parsed);\n const type = structured.type;\n const payload = structured.payload;\n const tag = structured.tag;\n\n switch (type) {\n case \"text\":\n return createTextDeltaEvent({\n content: asString(payload.content),\n stream: \"output\",\n tag,\n });\n case \"thought\":\n return createTextDeltaEvent({\n content: asString(payload.content),\n stream: \"thought\",\n tag,\n });\n case \"tool_call\":\n return createToolCallEvent({\n payload,\n tag: tag ?? \"tool_call\",\n });\n case \"tool_call_update\":\n return createToolCallEvent({\n payload,\n tag: tag ?? \"tool_call_update\",\n });\n case \"agent_message_chunk\":\n return resolveTextChunk({\n payload,\n stream: \"output\",\n tag: \"agent_message_chunk\",\n });\n case \"agent_thought_chunk\":\n return resolveTextChunk({\n payload,\n stream: \"thought\",\n tag: \"agent_thought_chunk\",\n });\n case \"usage_update\": {\n const used = asOptionalFiniteNumber(payload.used);\n const size = asOptionalFiniteNumber(payload.size);\n const text =\n used != null && size != null ? `usage updated: ${used}/${size}` : \"usage updated\";\n return {\n type: \"status\",\n text,\n tag: \"usage_update\",\n ...(used != null ? { used } : {}),\n ...(size != null ? { size } : {}),\n };\n }\n case \"available_commands_update\":\n case \"current_mode_update\":\n case \"config_option_update\":\n case \"session_info_update\":\n case \"plan\": {\n const text = resolveStatusTextForTag({\n tag: type as AcpSessionUpdateTag,\n payload,\n });\n if (!text) {\n return null;\n }\n return {\n type: \"status\",\n text,\n tag: type as AcpSessionUpdateTag,\n };\n }\n case \"client_operation\": {\n const method = asTrimmedString(payload.method) || \"operation\";\n const status = asTrimmedString(payload.status);\n const summary = asTrimmedString(payload.summary);\n const text = [method, status, summary].filter(Boolean).join(\" \");\n if (!text) {\n return null;\n }\n return { type: \"status\", text, ...(tag ? { tag } : {}) };\n }\n case \"update\": {\n const update = asTrimmedString(payload.update);\n if (!update) {\n return null;\n }\n return { type: \"status\", text: update, ...(tag ? { tag } : {}) };\n }\n case \"done\":\n return {\n type: \"done\",\n stopReason: asOptionalString(payload.stopReason),\n };\n case \"error\": {\n const message = asTrimmedString(payload.message) || \"acpx runtime error\";\n return {\n type: \"error\",\n message,\n code: asOptionalString(payload.code),\n retryable: asOptionalBoolean(payload.retryable),\n };\n }\n default:\n return null;\n }\n}\n","import path from \"node:path\";\nimport type { SessionRecord } from \"../../types.js\";\n\nexport function shouldReuseExistingRecord(\n record: Pick<SessionRecord, \"cwd\" | \"agentCommand\" | \"acpSessionId\" | \"acpx\">,\n params: {\n cwd: string;\n agentCommand: string;\n resumeSessionId?: string;\n },\n): boolean {\n if (record.acpx?.reset_on_next_ensure === true) {\n return false;\n }\n if (path.resolve(record.cwd) !== path.resolve(params.cwd)) {\n return false;\n }\n if (record.agentCommand !== params.agentCommand) {\n return false;\n }\n if (params.resumeSessionId && record.acpSessionId !== params.resumeSessionId) {\n return false;\n }\n return true;\n}\n","import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { AcpClient } from \"../../acp/client.js\";\nimport { normalizeOutputError } from \"../../acp/error-normalization.js\";\nimport { extractAcpError, isAcpResourceNotFoundError } from \"../../acp/error-shapes.js\";\nimport { withTimeout } from \"../../async-control.js\";\nimport { textPrompt, type PromptInput } from \"../../prompt-content.js\";\nimport {\n cloneSessionAcpxState,\n cloneSessionConversation,\n createSessionConversation,\n recordClientOperation,\n recordPromptSubmission,\n recordSessionUpdate,\n trimConversationForRuntime,\n} from \"../../session/conversation-model.js\";\nimport { defaultSessionEventLog } from \"../../session/event-log.js\";\nimport { setDesiredModeId } from \"../../session/mode-preference.js\";\nimport type { ClientOperation, SessionRecord, SessionResumePolicy } from \"../../types.js\";\nimport type {\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeStatus,\n AcpRuntimeTurnAttachment,\n} from \"../public/contract.js\";\nimport { AcpRuntimeError } from \"../public/errors.js\";\nimport { parsePromptEventLine } from \"../public/events.js\";\nimport { withConnectedSession } from \"./connected-session.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\n reconcileAgentSessionId,\n} from \"./lifecycle.js\";\nimport { runPromptTurn } from \"./prompt-turn.js\";\nimport { connectAndLoadSession } from \"./reconnect.js\";\nimport { shouldReuseExistingRecord } from \"./reuse-policy.js\";\n\nexport type AcpRuntimeManagerDeps = {\n clientFactory?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n};\n\ntype ActiveSessionController = {\n hasActivePrompt: () => boolean;\n requestCancelActivePrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string) => Promise<void>;\n setSessionModel: (modelId: string) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => ReturnType<AcpClient[\"setSessionConfigOption\"]>;\n};\n\ntype Deferred<T> = {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n};\n\nfunction createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nclass AsyncEventQueue {\n private readonly items: AcpRuntimeEvent[] = [];\n private readonly waits: Deferred<AcpRuntimeEvent | null>[] = [];\n private closed = false;\n\n push(item: AcpRuntimeEvent): void {\n if (this.closed) {\n return;\n }\n const waiter = this.waits.shift();\n if (waiter) {\n waiter.resolve(item);\n return;\n }\n this.items.push(item);\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const waiter of this.waits.splice(0)) {\n waiter.resolve(null);\n }\n }\n\n async next(): Promise<AcpRuntimeEvent | null> {\n if (this.items.length > 0) {\n return this.items.shift() ?? null;\n }\n if (this.closed) {\n return null;\n }\n const waiter = createDeferred<AcpRuntimeEvent | null>();\n this.waits.push(waiter);\n return await waiter.promise;\n }\n\n async *iterate(): AsyncIterable<AcpRuntimeEvent> {\n while (true) {\n const next = await this.next();\n if (!next) {\n return;\n }\n yield next;\n }\n }\n}\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\nfunction isUnsupportedSessionCloseError(error: unknown): boolean {\n const acp = extractAcpError(error);\n if (!acp) {\n return false;\n }\n if (acp.code === -32601 || acp.code === -32602) {\n return true;\n }\n if (acp.code !== -32603 || !acp.data || typeof acp.data !== \"object\") {\n return false;\n }\n const details = (acp.data as { details?: unknown }).details;\n return typeof details === \"string\" && details.toLowerCase().includes(\"invalid params\");\n}\n\nfunction toPromptInput(\n text: string,\n attachments?: AcpRuntimeTurnAttachment[],\n): PromptInput | string {\n if (!attachments || attachments.length === 0) {\n return text;\n }\n const blocks: Array<\n { type: \"text\"; text: string } | { type: \"image\"; mimeType: string; data: string }\n > = [];\n if (text) {\n blocks.push({ type: \"text\", text });\n }\n for (const attachment of attachments) {\n if (!attachment.mediaType.startsWith(\"image/\")) {\n throw new AcpRuntimeError(\n \"ACP_TURN_FAILED\",\n `Unsupported ACP runtime attachment media type: ${attachment.mediaType}`,\n );\n }\n blocks.push({\n type: \"image\",\n mimeType: attachment.mediaType,\n data: attachment.data,\n });\n }\n return blocks.length > 0 ? blocks : textPrompt(text);\n}\n\nfunction createInitialRecord(params: {\n recordId: string;\n sessionName: string;\n sessionId: string;\n agentCommand: string;\n cwd: string;\n agentSessionId?: string;\n}): SessionRecord {\n const now = isoNow();\n return {\n schema: \"acpx.session.v1\",\n acpxRecordId: params.recordId,\n acpSessionId: params.sessionId,\n agentSessionId: params.agentSessionId,\n agentCommand: params.agentCommand,\n cwd: params.cwd,\n name: params.sessionName,\n createdAt: now,\n lastUsedAt: now,\n lastSeq: 0,\n eventLog: defaultSessionEventLog(params.recordId),\n closed: false,\n closedAt: undefined,\n ...createSessionConversation(now),\n acpx: {},\n };\n}\n\nfunction createRecordId(sessionKey: string, mode: \"persistent\" | \"oneshot\"): string {\n if (mode === \"persistent\") {\n return sessionKey;\n }\n return `${sessionKey}:oneshot:${randomUUID()}`;\n}\n\nfunction resumePolicyForSessionMode(mode: \"persistent\" | \"oneshot\"): SessionResumePolicy {\n return mode === \"persistent\" ? \"same-session-only\" : \"allow-new\";\n}\n\nfunction statusSummary(record: SessionRecord): string {\n const parts = [\n `session=${record.acpxRecordId}`,\n `backendSessionId=${record.acpSessionId}`,\n record.agentSessionId ? `agentSessionId=${record.agentSessionId}` : null,\n record.pid != null ? `pid=${record.pid}` : null,\n record.closed ? \"closed\" : \"open\",\n ].filter(Boolean);\n return parts.join(\" \");\n}\n\nexport class AcpRuntimeManager {\n private readonly activeControllers = new Map<string, ActiveSessionController>();\n private readonly pendingPersistentClients = new Map<string, AcpClient>();\n\n constructor(\n private readonly options: AcpRuntimeOptions,\n private readonly deps: AcpRuntimeManagerDeps = {},\n ) {}\n\n private createClient(options: ConstructorParameters<typeof AcpClient>[0]): AcpClient {\n return this.deps.clientFactory?.(options) ?? new AcpClient(options);\n }\n\n async ensureSession(input: {\n sessionKey: string;\n agent: string;\n mode: \"persistent\" | \"oneshot\";\n cwd?: string;\n resumeSessionId?: string;\n }): Promise<SessionRecord> {\n const cwd = path.resolve(input.cwd?.trim() || this.options.cwd);\n const agentCommand = this.options.agentRegistry.resolve(input.agent);\n const existing = await this.options.sessionStore.load(input.sessionKey);\n if (\n input.mode === \"persistent\" &&\n existing &&\n shouldReuseExistingRecord(existing, {\n cwd,\n agentCommand,\n resumeSessionId: input.resumeSessionId,\n })\n ) {\n existing.closed = false;\n existing.closedAt = undefined;\n await this.options.sessionStore.save(existing);\n return existing;\n }\n\n const client = this.createClient({\n agentCommand,\n cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n });\n let keepClientOpen = false;\n\n try {\n await client.start();\n let sessionId: string;\n let agentSessionId: string | undefined;\n if (input.resumeSessionId) {\n const loaded = await client.loadSession(input.resumeSessionId, cwd);\n sessionId = input.resumeSessionId;\n agentSessionId = loaded.agentSessionId;\n } else {\n const created = await client.createSession(cwd);\n sessionId = created.sessionId;\n agentSessionId = created.agentSessionId;\n }\n const record = createInitialRecord({\n recordId: createRecordId(input.sessionKey, input.mode),\n sessionName: input.sessionKey,\n sessionId,\n agentCommand,\n cwd,\n agentSessionId,\n });\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(record);\n if (input.mode === \"persistent\") {\n const previousClient = this.pendingPersistentClients.get(record.acpxRecordId);\n this.pendingPersistentClients.set(record.acpxRecordId, client);\n keepClientOpen = true;\n await previousClient?.close().catch(() => {});\n }\n return record;\n } finally {\n if (!keepClientOpen) {\n await client.close();\n }\n }\n }\n\n async *runTurn(input: {\n handle: AcpRuntimeHandle;\n text: string;\n attachments?: AcpRuntimeTurnAttachment[];\n mode: AcpRuntimePromptMode;\n sessionMode: \"persistent\" | \"oneshot\";\n requestId: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n }): AsyncIterable<AcpRuntimeEvent> {\n const record = await this.requireRecord(input.handle.acpxRecordId ?? input.handle.sessionKey);\n const conversation = cloneSessionConversation(record);\n let acpxState = cloneSessionAcpxState(record.acpx);\n const promptInput = toPromptInput(input.text, input.attachments);\n const promptMessageId = recordPromptSubmission(conversation, promptInput, isoNow());\n trimConversationForRuntime(conversation);\n\n const queue = new AsyncEventQueue();\n let pendingClient = this.pendingPersistentClients.get(record.acpxRecordId);\n if (pendingClient) {\n this.pendingPersistentClients.delete(record.acpxRecordId);\n if (!pendingClient.hasReusableSession(record.acpSessionId)) {\n await pendingClient.close().catch(() => {});\n pendingClient = undefined;\n }\n }\n const client =\n pendingClient ??\n this.createClient({\n agentCommand: record.agentCommand,\n cwd: record.cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n });\n let activeSessionId = record.acpSessionId;\n let sawDone = false;\n let pendingCancel = false;\n let turnActive = true;\n const sessionReady = createDeferred<void>();\n void sessionReady.promise.catch(() => {});\n\n const applyPendingCancel = async (): Promise<boolean> => {\n if (!pendingCancel || !client.hasActivePrompt()) {\n return false;\n }\n const cancelled = await client.requestCancelActivePrompt();\n if (cancelled) {\n pendingCancel = false;\n }\n return cancelled;\n };\n\n const activeController: ActiveSessionController = {\n hasActivePrompt: () => client.hasActivePrompt(),\n requestCancelActivePrompt: async () => {\n if (client.hasActivePrompt()) {\n return await client.requestCancelActivePrompt();\n }\n if (!turnActive) {\n return false;\n }\n pendingCancel = true;\n return true;\n },\n setSessionMode: async (modeId: string) => {\n if (!client.hasActivePrompt()) {\n await sessionReady.promise;\n }\n await client.setSessionMode(activeSessionId, modeId);\n },\n setSessionModel: async (modelId: string) => {\n if (!client.hasActivePrompt()) {\n await sessionReady.promise;\n }\n await client.setSessionModel(activeSessionId, modelId);\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n if (!client.hasActivePrompt()) {\n await sessionReady.promise;\n }\n return await client.setSessionConfigOption(activeSessionId, configId, value);\n },\n };\n\n const emitParsed = (payload: Record<string, unknown>): void => {\n const parsed = parsePromptEventLine(JSON.stringify(payload));\n if (!parsed) {\n return;\n }\n if (parsed.type === \"done\") {\n sawDone = true;\n }\n queue.push(parsed);\n };\n\n const abortHandler = () => {\n void activeController.requestCancelActivePrompt();\n };\n if (input.signal) {\n if (input.signal.aborted) {\n queue.close();\n return;\n }\n input.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n this.activeControllers.set(record.acpxRecordId, activeController);\n\n void (async () => {\n try {\n client.setEventHandlers({\n onSessionUpdate: (notification) => {\n acpxState = recordSessionUpdate(conversation, acpxState, notification);\n trimConversationForRuntime(conversation);\n emitParsed({\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: notification,\n });\n },\n onClientOperation: (operation: ClientOperation) => {\n acpxState = recordClientOperation(conversation, acpxState, operation);\n trimConversationForRuntime(conversation);\n emitParsed({\n type: \"client_operation\",\n ...operation,\n });\n },\n });\n\n const { sessionId, resumed, loadError } = pendingClient\n ? {\n sessionId: record.acpSessionId,\n resumed: false,\n loadError: undefined,\n }\n : await connectAndLoadSession({\n client,\n record,\n resumePolicy: resumePolicyForSessionMode(input.sessionMode),\n timeoutMs: this.options.timeoutMs,\n activeController,\n onClientAvailable: (controller) => {\n this.activeControllers.set(record.acpxRecordId, controller);\n },\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionIdValue) => {\n activeSessionId = sessionIdValue;\n },\n });\n sessionReady.resolve();\n\n record.lastRequestId = input.requestId;\n record.lastPromptAt = isoNow();\n record.closed = false;\n record.closedAt = undefined;\n record.lastUsedAt = isoNow();\n if (resumed || loadError) {\n emitParsed({\n type: \"status\",\n text: loadError ? `load fallback: ${loadError}` : \"session resumed\",\n });\n }\n\n if (pendingCancel || input.signal?.aborted) {\n pendingCancel = false;\n if (!sawDone) {\n queue.push({\n type: \"done\",\n stopReason: \"cancelled\",\n });\n }\n return;\n }\n\n await applyPendingCancel();\n const response = await runPromptTurn({\n client,\n sessionId,\n prompt: promptInput,\n timeoutMs: input.timeoutMs ?? this.options.timeoutMs,\n conversation,\n promptMessageId,\n });\n\n record.acpSessionId = activeSessionId;\n reconcileAgentSessionId(record, record.agentSessionId);\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n record.acpx = acpxState;\n applyConversation(record, conversation);\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n await this.options.sessionStore.save(record);\n\n if (!sawDone) {\n queue.push({\n type: \"done\",\n stopReason: response.stopReason,\n });\n }\n } catch (error) {\n sessionReady.reject(error);\n const normalized = normalizeOutputError(error, { origin: \"runtime\" });\n queue.push({\n type: \"error\",\n message: normalized.message,\n code: normalized.code,\n retryable: normalized.retryable,\n });\n } finally {\n turnActive = false;\n if (input.signal) {\n input.signal.removeEventListener(\"abort\", abortHandler);\n }\n this.activeControllers.delete(record.acpxRecordId);\n client.clearEventHandlers();\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n record.acpx = acpxState;\n applyConversation(record, conversation);\n record.lastUsedAt = isoNow();\n await this.options.sessionStore.save(record).catch(() => {});\n await client.close().catch(() => {});\n queue.close();\n }\n })();\n\n yield* queue.iterate();\n }\n\n async getStatus(handle: AcpRuntimeHandle): Promise<AcpRuntimeStatus> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n return {\n summary: statusSummary(record),\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n details: {\n cwd: record.cwd,\n lastUsedAt: record.lastUsedAt,\n closed: record.closed === true,\n },\n };\n }\n\n async setMode(\n handle: AcpRuntimeHandle,\n mode: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n const controller = this.activeControllers.get(record.acpxRecordId);\n let targetRecord = record;\n if (controller) {\n await controller.setSessionMode(mode);\n } else {\n const result = await withConnectedSession({\n sessionRecordId: record.acpxRecordId,\n loadRecord: async (sessionRecordId) => await this.requireRecord(sessionRecordId),\n saveRecord: async (connectedRecord) =>\n await this.options.sessionStore.save(connectedRecord),\n createClient: (options) => this.createClient(options),\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n timeoutMs: this.options.timeoutMs,\n resumePolicy: resumePolicyForSessionMode(sessionMode),\n run: async ({ client, sessionId }) => {\n await client.setSessionMode(sessionId, mode);\n },\n });\n targetRecord = result.record;\n }\n setDesiredModeId(targetRecord, mode);\n await this.options.sessionStore.save(targetRecord);\n }\n\n async setConfigOption(\n handle: AcpRuntimeHandle,\n key: string,\n value: string,\n sessionMode: \"persistent\" | \"oneshot\" = \"persistent\",\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n const controller = this.activeControllers.get(record.acpxRecordId);\n let targetRecord = record;\n if (controller) {\n await controller.setSessionConfigOption(key, value);\n } else {\n const result = await withConnectedSession({\n sessionRecordId: record.acpxRecordId,\n loadRecord: async (sessionRecordId) => await this.requireRecord(sessionRecordId),\n saveRecord: async (connectedRecord) =>\n await this.options.sessionStore.save(connectedRecord),\n createClient: (options) => this.createClient(options),\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n timeoutMs: this.options.timeoutMs,\n resumePolicy: resumePolicyForSessionMode(sessionMode),\n run: async ({ client, sessionId, record: connectedRecord }) => {\n await client.setSessionConfigOption(sessionId, key, value);\n if (key === \"mode\") {\n setDesiredModeId(connectedRecord, value);\n }\n },\n });\n targetRecord = result.record;\n }\n if (key === \"mode\") {\n setDesiredModeId(targetRecord, value);\n }\n await this.options.sessionStore.save(targetRecord);\n }\n\n async cancel(handle: AcpRuntimeHandle): Promise<void> {\n const controller = this.activeControllers.get(handle.acpxRecordId ?? handle.sessionKey);\n await controller?.requestCancelActivePrompt();\n }\n\n async close(\n handle: AcpRuntimeHandle,\n options: { discardPersistentState?: boolean } = {},\n ): Promise<void> {\n const record = await this.requireRecord(handle.acpxRecordId ?? handle.sessionKey);\n await this.cancel(handle);\n if (options.discardPersistentState) {\n await this.closeBackendSession(record);\n record.acpx = {\n ...record.acpx,\n reset_on_next_ensure: true,\n };\n }\n record.closed = true;\n record.closedAt = isoNow();\n await this.options.sessionStore.save(record);\n }\n\n private async closeBackendSession(record: SessionRecord): Promise<void> {\n const pendingClient = this.pendingPersistentClients.get(record.acpxRecordId);\n if (pendingClient) {\n this.pendingPersistentClients.delete(record.acpxRecordId);\n }\n const reusablePendingClient =\n pendingClient?.hasReusableSession(record.acpSessionId) === true ? pendingClient : undefined;\n if (pendingClient && !reusablePendingClient) {\n await pendingClient.close().catch(() => {});\n }\n\n const client =\n reusablePendingClient ??\n this.createClient({\n agentCommand: record.agentCommand,\n cwd: record.cwd,\n mcpServers: [...(this.options.mcpServers ?? [])],\n permissionMode: this.options.permissionMode,\n nonInteractivePermissions: this.options.nonInteractivePermissions,\n verbose: this.options.verbose,\n });\n\n try {\n if (!reusablePendingClient) {\n await withTimeout(client.start(), this.options.timeoutMs);\n }\n if (!client.supportsCloseSession()) {\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `Agent does not support session/close for ${record.acpxRecordId}.`,\n );\n }\n await withTimeout(client.closeSession(record.acpSessionId), this.options.timeoutMs);\n } catch (error) {\n if (isUnsupportedSessionCloseError(error)) {\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `Agent does not support session/close for ${record.acpxRecordId}.`,\n { cause: error },\n );\n }\n if (isAcpResourceNotFoundError(error)) {\n return;\n }\n throw error;\n } finally {\n await client.close().catch(() => {});\n }\n }\n\n private async requireRecord(sessionId: string): Promise<SessionRecord> {\n const record = await this.options.sessionStore.load(sessionId);\n if (!record) {\n throw new Error(`ACP session not found: ${sessionId}`);\n }\n return record;\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { assertPersistedKeyPolicy } from \"../../persisted-key-policy.js\";\nimport { parseSessionRecord } from \"../../session/persistence/parse.js\";\nimport { serializeSessionRecordForDisk } from \"../../session/persistence/serialize.js\";\nimport type { AcpFileSessionStoreOptions, AcpSessionRecord, AcpSessionStore } from \"./contract.js\";\n\nfunction safeSessionId(sessionId: string): string {\n return encodeURIComponent(sessionId);\n}\n\nclass FileSessionStore implements AcpSessionStore {\n constructor(private readonly stateDir: string) {}\n\n private get sessionDir(): string {\n return path.join(this.stateDir, \"sessions\");\n }\n\n private filePath(sessionId: string): string {\n return path.join(this.sessionDir, `${safeSessionId(sessionId)}.json`);\n }\n\n private async ensureDir(): Promise<void> {\n await fs.mkdir(this.sessionDir, { recursive: true });\n }\n\n async load(sessionId: string): Promise<AcpSessionRecord | undefined> {\n await this.ensureDir();\n try {\n const payload = await fs.readFile(this.filePath(sessionId), \"utf8\");\n return parseSessionRecord(JSON.parse(payload)) ?? undefined;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n }\n\n async save(record: AcpSessionRecord): Promise<void> {\n await this.ensureDir();\n const persisted = serializeSessionRecordForDisk(record);\n assertPersistedKeyPolicy(persisted);\n\n const file = this.filePath(record.acpxRecordId);\n const tempFile = `${file}.${process.pid}.${Date.now()}.tmp`;\n const payload = JSON.stringify(persisted, null, 2);\n await fs.writeFile(tempFile, `${payload}\\n`, \"utf8\");\n await fs.rename(tempFile, file);\n }\n}\n\nexport function createFileSessionStore(options: AcpFileSessionStoreOptions): AcpSessionStore {\n return new FileSessionStore(path.resolve(options.stateDir));\n}\n","import type { AcpRuntimeHandle } from \"./contract.js\";\nimport type { AcpxHandleState } from \"./shared.js\";\nimport { asOptionalString } from \"./shared.js\";\n\nconst ACPX_RUNTIME_HANDLE_PREFIX = \"acpx:v2:\";\n\nexport function encodeAcpxRuntimeHandleState(state: AcpxHandleState): string {\n const payload = Buffer.from(JSON.stringify(state), \"utf8\").toString(\"base64url\");\n return `${ACPX_RUNTIME_HANDLE_PREFIX}${payload}`;\n}\n\nexport function decodeAcpxRuntimeHandleState(runtimeSessionName: string): AcpxHandleState | null {\n const trimmed = runtimeSessionName.trim();\n if (!trimmed.startsWith(ACPX_RUNTIME_HANDLE_PREFIX)) {\n return null;\n }\n try {\n const raw = Buffer.from(trimmed.slice(ACPX_RUNTIME_HANDLE_PREFIX.length), \"base64url\").toString(\n \"utf8\",\n );\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const name = asOptionalString(parsed.name);\n const agent = asOptionalString(parsed.agent);\n const cwd = asOptionalString(parsed.cwd);\n const mode = asOptionalString(parsed.mode);\n if (!name || !agent || !cwd || (mode !== \"persistent\" && mode !== \"oneshot\")) {\n return null;\n }\n return {\n name,\n agent,\n cwd,\n mode,\n acpxRecordId: asOptionalString(parsed.acpxRecordId),\n backendSessionId: asOptionalString(parsed.backendSessionId),\n agentSessionId: asOptionalString(parsed.agentSessionId),\n };\n } catch {\n return null;\n }\n}\n\nexport function writeHandleState(handle: AcpRuntimeHandle, state: AcpxHandleState): void {\n handle.runtimeSessionName = encodeAcpxRuntimeHandleState(state);\n handle.cwd = state.cwd;\n handle.acpxRecordId = state.acpxRecordId;\n handle.backendSessionId = state.backendSessionId;\n handle.agentSessionId = state.agentSessionId;\n}\n","import { AcpClient } from \"../../acp/client.js\";\nimport { DEFAULT_AGENT_NAME } from \"../../agent-registry.js\";\nimport type { AcpRuntimeOptions } from \"./contract.js\";\n\nexport type RuntimeHealthReport = {\n ok: boolean;\n message: string;\n details?: string[];\n};\n\nexport type ProbeRuntimeDeps = {\n clientFactory?: (options: ConstructorParameters<typeof AcpClient>[0]) => AcpClient;\n};\n\nexport async function probeRuntime(\n options: AcpRuntimeOptions,\n deps: ProbeRuntimeDeps = {},\n): Promise<RuntimeHealthReport> {\n const agentName = options.probeAgent?.trim() || DEFAULT_AGENT_NAME;\n const agentCommand = options.agentRegistry.resolve(agentName);\n const client =\n deps.clientFactory?.({\n agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n verbose: options.verbose,\n }) ??\n new AcpClient({\n agentCommand,\n cwd: options.cwd,\n mcpServers: [...(options.mcpServers ?? [])],\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n verbose: options.verbose,\n });\n\n try {\n await client.start();\n return {\n ok: true,\n message: \"embedded ACP runtime ready\",\n details: [\n `agent=${agentName}`,\n `command=${agentCommand}`,\n `cwd=${options.cwd}`,\n ...(client.initializeResult?.protocolVersion\n ? [`protocolVersion=${client.initializeResult.protocolVersion}`]\n : []),\n ],\n };\n } catch (error) {\n return {\n ok: false,\n message: \"embedded ACP runtime probe failed\",\n details: [\n `agent=${agentName}`,\n `command=${agentCommand}`,\n `cwd=${options.cwd}`,\n error instanceof Error ? error.message : String(error),\n ],\n };\n } finally {\n await client.close().catch(() => {});\n }\n}\n","import { DEFAULT_AGENT_NAME, listBuiltInAgents, resolveAgentCommand } from \"./agent-registry.js\";\nimport { AcpRuntimeManager } from \"./runtime/engine/manager.js\";\nimport type {\n AcpAgentRegistry,\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimeStatus,\n AcpSessionStore,\n} from \"./runtime/public/contract.js\";\nimport { AcpRuntimeError } from \"./runtime/public/errors.js\";\nimport { createFileSessionStore } from \"./runtime/public/file-session-store.js\";\nimport { decodeAcpxRuntimeHandleState, writeHandleState } from \"./runtime/public/handle-state.js\";\nimport { probeRuntime } from \"./runtime/public/probe.js\";\nimport { deriveAgentFromSessionKey, type AcpxHandleState } from \"./runtime/public/shared.js\";\n\nexport { DEFAULT_AGENT_NAME, createFileSessionStore };\nexport { AcpRuntimeError, isAcpRuntimeError } from \"./runtime/public/errors.js\";\nexport type { AcpRuntimeErrorCode } from \"./runtime/public/errors.js\";\nexport {\n decodeAcpxRuntimeHandleState,\n encodeAcpxRuntimeHandleState,\n} from \"./runtime/public/handle-state.js\";\nexport type {\n AcpAgentRegistry,\n AcpFileSessionStoreOptions,\n AcpRuntime,\n AcpRuntimeCapabilities,\n AcpRuntimeDoctorReport,\n AcpRuntimeEnsureInput,\n AcpRuntimeEvent,\n AcpRuntimeHandle,\n AcpRuntimeOptions,\n AcpRuntimePromptMode,\n AcpRuntimeSessionMode,\n AcpRuntimeStatus,\n AcpRuntimeTurnAttachment,\n AcpRuntimeTurnInput,\n AcpSessionRecord,\n AcpSessionStore,\n AcpSessionUpdateTag,\n} from \"./runtime/public/contract.js\";\n\nexport const ACPX_BACKEND_ID = \"acpx\";\n\nconst ACPX_CAPABILITIES: AcpRuntimeCapabilities = {\n controls: [\"session/set_mode\", \"session/set_config_option\", \"session/status\"],\n};\n\ntype AcpxRuntimeLike = AcpRuntime & {\n probeAvailability(): Promise<void>;\n isHealthy(): boolean;\n doctor(): Promise<AcpRuntimeDoctorReport>;\n};\n\nexport function createAgentRegistry(params?: {\n overrides?: Record<string, string>;\n}): AcpAgentRegistry {\n return {\n resolve(agentName: string) {\n return resolveAgentCommand(agentName, params?.overrides);\n },\n list() {\n return listBuiltInAgents(params?.overrides);\n },\n };\n}\n\nexport class AcpxRuntime implements AcpxRuntimeLike {\n private healthy = false;\n private manager: AcpRuntimeManager | null = null;\n private managerPromise: Promise<AcpRuntimeManager> | null = null;\n\n constructor(\n private readonly options: AcpRuntimeOptions,\n private readonly testOptions?: {\n managerFactory?: (options: AcpRuntimeOptions) => AcpRuntimeManager;\n probeRunner?: (options: AcpRuntimeOptions) => Promise<{\n ok: boolean;\n message: string;\n details?: string[];\n }>;\n },\n ) {}\n\n isHealthy(): boolean {\n return this.healthy;\n }\n\n async probeAvailability(): Promise<void> {\n const report = await this.runProbe();\n this.healthy = report.ok;\n }\n\n async doctor(): Promise<AcpRuntimeDoctorReport> {\n const report = await this.runProbe();\n this.healthy = report.ok;\n return {\n ok: report.ok,\n code: report.ok ? undefined : \"ACP_BACKEND_UNAVAILABLE\",\n message: report.message,\n details: report.details,\n };\n }\n\n async ensureSession(input: AcpRuntimeEnsureInput): Promise<AcpRuntimeHandle> {\n const sessionName = input.sessionKey.trim();\n if (!sessionName) {\n throw new AcpRuntimeError(\"ACP_SESSION_INIT_FAILED\", \"ACP session key is required.\");\n }\n const agent = input.agent.trim();\n if (!agent) {\n throw new AcpRuntimeError(\"ACP_SESSION_INIT_FAILED\", \"ACP agent id is required.\");\n }\n\n const manager = await this.getManager();\n const record = await manager.ensureSession({\n sessionKey: sessionName,\n agent,\n mode: input.mode,\n cwd: input.cwd ?? this.options.cwd,\n resumeSessionId: input.resumeSessionId,\n });\n\n const handle: AcpRuntimeHandle = {\n sessionKey: input.sessionKey,\n backend: ACPX_BACKEND_ID,\n runtimeSessionName: \"\",\n cwd: record.cwd,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n };\n writeHandleState(handle, {\n name: sessionName,\n agent,\n cwd: record.cwd,\n mode: input.mode,\n acpxRecordId: record.acpxRecordId,\n backendSessionId: record.acpSessionId,\n agentSessionId: record.agentSessionId,\n });\n return handle;\n }\n\n async *runTurn(\n input: import(\"./runtime/public/contract.js\").AcpRuntimeTurnInput,\n ): AsyncIterable<import(\"./runtime/public/contract.js\").AcpRuntimeEvent> {\n const state = this.resolveHandleState(input.handle);\n const manager = await this.getManager();\n yield* manager.runTurn({\n handle: {\n ...input.handle,\n acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey,\n },\n text: input.text,\n attachments: input.attachments,\n mode: input.mode,\n sessionMode: state.mode,\n requestId: input.requestId,\n timeoutMs: input.timeoutMs,\n signal: input.signal,\n });\n }\n\n getCapabilities(): AcpRuntimeCapabilities {\n return ACPX_CAPABILITIES;\n }\n\n async getStatus(input: {\n handle: AcpRuntimeHandle;\n signal?: AbortSignal;\n }): Promise<AcpRuntimeStatus> {\n const state = this.resolveHandleState(input.handle);\n const manager = await this.getManager();\n return await manager.getStatus({\n ...input.handle,\n acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey,\n });\n }\n\n async setMode(input: { handle: AcpRuntimeHandle; mode: string }): Promise<void> {\n const state = this.resolveHandleState(input.handle);\n const manager = await this.getManager();\n await manager.setMode(\n {\n ...input.handle,\n acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey,\n },\n input.mode,\n state.mode,\n );\n }\n\n async setConfigOption(input: {\n handle: AcpRuntimeHandle;\n key: string;\n value: string;\n }): Promise<void> {\n const state = this.resolveHandleState(input.handle);\n const manager = await this.getManager();\n await manager.setConfigOption(\n {\n ...input.handle,\n acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey,\n },\n input.key,\n input.value,\n state.mode,\n );\n }\n\n async cancel(input: { handle: AcpRuntimeHandle; reason?: string }): Promise<void> {\n const state = this.resolveHandleState(input.handle);\n const manager = await this.getManager();\n await manager.cancel({\n ...input.handle,\n acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey,\n });\n }\n\n async close(input: {\n handle: AcpRuntimeHandle;\n reason: string;\n discardPersistentState?: boolean;\n }): Promise<void> {\n const state = this.resolveHandleState(input.handle);\n const manager = await this.getManager();\n await manager.close(\n {\n ...input.handle,\n acpxRecordId: state.acpxRecordId ?? input.handle.acpxRecordId ?? input.handle.sessionKey,\n },\n {\n discardPersistentState: input.discardPersistentState,\n },\n );\n }\n\n private async getManager(): Promise<AcpRuntimeManager> {\n if (this.manager) {\n return this.manager;\n }\n if (!this.managerPromise) {\n this.managerPromise = Promise.resolve(\n this.testOptions?.managerFactory?.(this.options) ?? new AcpRuntimeManager(this.options),\n ).then((manager) => {\n this.manager = manager;\n return manager;\n });\n }\n return await this.managerPromise;\n }\n\n private async runProbe() {\n return await (this.testOptions?.probeRunner?.(this.options) ?? probeRuntime(this.options));\n }\n\n private resolveHandleState(handle: AcpRuntimeHandle): AcpxHandleState {\n const decoded = decodeAcpxRuntimeHandleState(handle.runtimeSessionName);\n if (decoded) {\n return {\n ...decoded,\n acpxRecordId: decoded.acpxRecordId ?? handle.acpxRecordId,\n backendSessionId: decoded.backendSessionId ?? handle.backendSessionId,\n agentSessionId: decoded.agentSessionId ?? handle.agentSessionId,\n };\n }\n\n const runtimeSessionName = handle.runtimeSessionName.trim();\n if (!runtimeSessionName) {\n throw new AcpRuntimeError(\n \"ACP_SESSION_INIT_FAILED\",\n \"Invalid embedded ACP runtime handle: runtimeSessionName is missing.\",\n );\n }\n\n return {\n name: runtimeSessionName,\n agent: deriveAgentFromSessionKey(handle.sessionKey, DEFAULT_AGENT_NAME),\n cwd: handle.cwd ?? this.options.cwd,\n mode: \"persistent\",\n acpxRecordId: handle.acpxRecordId,\n backendSessionId: handle.backendSessionId,\n agentSessionId: handle.agentSessionId,\n };\n }\n}\n\nexport function createAcpRuntime(options: AcpRuntimeOptions): AcpxRuntime {\n return new AcpxRuntime(options);\n}\n\nexport function createRuntimeStore(options: { stateDir: string }): AcpSessionStore {\n return createFileSessionStore(options);\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
|
|
2
|
-
import {
|
|
3
|
-
import { A as resolveSessionRecord, C as findGitRepositoryRoot, D as listSessions, E as isoNow, F as sessionBaseDir, H as TimeoutError, I as sessionEventActivePath, L as sessionEventLockPath, O as listSessionsForAgent, P as defaultSessionEventLog, R as sessionEventSegmentPath, S as absolutePath, T as findSessionByDirectoryWalk, U as withInterrupt, V as InterruptedError, W as withTimeout, _ as recordSessionUpdate, a as applyConversation, c as setCurrentModelId, d as syncAdvertisedModelState, f as cloneSessionAcpxState, g as recordPromptSubmission, h as recordClientOperation, i as connectAndLoadSession, j as writeSessionRecord, k as normalizeName, l as setDesiredModeId, m as createSessionConversation, n as withConnectedSession, o as applyLifecycleSnapshotToRecord, p as cloneSessionConversation, r as sessionOptionsFromRecord, t as runPromptTurn, u as setDesiredModelId, v as trimConversationForRuntime, w as findSession, y as AcpClient } from "./prompt-turn-
|
|
4
|
-
import { n as isAcpJsonRpcMessage } from "./jsonrpc-
|
|
5
|
-
import { a as trySubmitToRunningOwner, c as isProcessAlive, d as terminateProcess, f as terminateQueueOwnerForSession, i as trySetModelOnRunningOwner, l as refreshQueueOwnerLease, m as waitMs, n as trySetConfigOptionOnRunningOwner, o as SessionQueueOwner, p as tryAcquireQueueOwnerLease, r as trySetModeOnRunningOwner, t as tryCancelOnRunningOwner, u as releaseQueueOwnerLease } from "./ipc-
|
|
2
|
+
import { V as QueueConnectionError, b as isRetryablePromptError, c as startPerfTimer, g as textPrompt, h as promptToDisplayText, i as measurePerf, n as getPerfMetricsSnapshot, o as resetPerfMetrics, r as incrementPerfCounter, s as setPerfGauge, t as formatPerfMetric, u as normalizeRuntimeSessionId, v as formatErrorMessage, x as normalizeOutputError } from "./perf-metrics-D0um6IR6.js";
|
|
3
|
+
import { A as resolveSessionRecord, C as findGitRepositoryRoot, D as listSessions, E as isoNow, F as sessionBaseDir, H as TimeoutError, I as sessionEventActivePath, L as sessionEventLockPath, O as listSessionsForAgent, P as defaultSessionEventLog, R as sessionEventSegmentPath, S as absolutePath, T as findSessionByDirectoryWalk, U as withInterrupt, V as InterruptedError, W as withTimeout, _ as recordSessionUpdate, a as applyConversation, c as setCurrentModelId, d as syncAdvertisedModelState, f as cloneSessionAcpxState, g as recordPromptSubmission, h as recordClientOperation, i as connectAndLoadSession, j as writeSessionRecord, k as normalizeName, l as setDesiredModeId, m as createSessionConversation, n as withConnectedSession, o as applyLifecycleSnapshotToRecord, p as cloneSessionConversation, r as sessionOptionsFromRecord, t as runPromptTurn, u as setDesiredModelId, v as trimConversationForRuntime, w as findSession, y as AcpClient } from "./prompt-turn-CXMtXBl-.js";
|
|
4
|
+
import { n as isAcpJsonRpcMessage } from "./jsonrpc-DSxh2w5R.js";
|
|
5
|
+
import { a as trySubmitToRunningOwner, c as isProcessAlive, d as terminateProcess, f as terminateQueueOwnerForSession, i as trySetModelOnRunningOwner, l as refreshQueueOwnerLease, m as waitMs, n as trySetConfigOptionOnRunningOwner, o as SessionQueueOwner, p as tryAcquireQueueOwnerLease, r as trySetModeOnRunningOwner, t as tryCancelOnRunningOwner, u as releaseQueueOwnerLease } from "./ipc-BM335WFg.js";
|
|
6
6
|
import fs, { realpathSync } from "node:fs";
|
|
7
7
|
import path from "node:path";
|
|
8
8
|
import fs$1 from "node:fs/promises";
|
|
@@ -1485,4 +1485,4 @@ var session_exports = /* @__PURE__ */ __exportAll({
|
|
|
1485
1485
|
//#endregion
|
|
1486
1486
|
export { buildQueueOwnerArgOverride as a, createSessionWithClient as c, sendSessionDirect as i, cancelSessionPrompt as l, runSessionQueueOwner as n, flushPerfMetricsCapture as o, runOnce as r, installPerfMetricsCapture as s, session_exports as t, DEFAULT_QUEUE_OWNER_TTL_MS as u };
|
|
1487
1487
|
|
|
1488
|
-
//# sourceMappingURL=session-
|
|
1488
|
+
//# sourceMappingURL=session-BtwAKtJ3.js.map
|