acpx 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/{cli-rGyZlX2p.js → cli-T-Z-9x6a.js} +4 -4
- package/dist/{cli-rGyZlX2p.js.map → cli-T-Z-9x6a.js.map} +1 -1
- package/dist/cli.js +64 -68
- package/dist/cli.js.map +1 -1
- package/dist/{client-2fTFutRH.d.ts → client-COPilhO_.d.ts} +4 -2
- package/dist/client-COPilhO_.d.ts.map +1 -0
- package/dist/{flags-DG-3Vfgg.js → flags-Dj-IXgo9.js} +5 -5
- package/dist/flags-Dj-IXgo9.js.map +1 -0
- package/dist/{flows-gbxyIf6o.js → flows-CF8w1rPI.js} +113 -10
- package/dist/flows-CF8w1rPI.js.map +1 -0
- package/dist/flows.d.ts +16 -1
- package/dist/flows.d.ts.map +1 -1
- package/dist/flows.js +2 -2
- package/dist/{ipc-CkAW8Qvc.js → ipc-ABXlXzGP.js} +53 -15
- package/dist/ipc-ABXlXzGP.js.map +1 -0
- package/dist/{perf-metrics-DvT_gvUh.js → perf-metrics-C2pXfxvR.js} +2 -2
- package/dist/perf-metrics-C2pXfxvR.js.map +1 -0
- package/dist/{prompt-turn-BOoZaDEq.js → prompt-turn-CVPMWdj1.js} +72 -49
- package/dist/prompt-turn-CVPMWdj1.js.map +1 -0
- package/dist/{render-CyodRDtK.js → render-N5YwotCy.js} +3 -3
- package/dist/{render-CyodRDtK.js.map → render-N5YwotCy.js.map} +1 -1
- package/dist/runtime.d.ts +5 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +20 -12
- package/dist/runtime.js.map +1 -1
- package/dist/{session-DcIse8N0.js → session-CDaQe6BH.js} +77 -78
- package/dist/session-CDaQe6BH.js.map +1 -0
- package/package.json +11 -11
- package/skills/acpx/SKILL.md +3 -2
- package/dist/client-2fTFutRH.d.ts.map +0 -1
- package/dist/flags-DG-3Vfgg.js.map +0 -1
- package/dist/flows-gbxyIf6o.js.map +0 -1
- package/dist/ipc-CkAW8Qvc.js.map +0 -1
- package/dist/perf-metrics-DvT_gvUh.js.map +0 -1
- package/dist/prompt-turn-BOoZaDEq.js.map +0 -1
- package/dist/session-DcIse8N0.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
|
|
2
|
-
import {
|
|
3
|
-
import { A as
|
|
2
|
+
import { H 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-C2pXfxvR.js";
|
|
3
|
+
import { A as isoNow, B as sessionBaseDir, C as AcpClient, D as findGitRepositoryRoot, E as absolutePath, F as resolveSessionRecord, H as sessionEventLockPath, I as writeSessionRecord, J as withInterrupt, K as InterruptedError, M as listSessionsForAgent, N as normalizeName, O as findSession, P as pruneSessions, S as trimConversationForRuntime, U as sessionEventSegmentPath, V as sessionEventActivePath, Y as withTimeout, _ as cloneSessionConversation, a as connectAndLoadSession, b as recordPromptSubmission, d as setDesiredConfigOption, f as setDesiredModeId, g as cloneSessionAcpxState, h as applyConfigOptionsToRecord, i as sessionOptionsFromRecord, j as listSessions, k as findSessionByDirectoryWalk, l as assertRequestedModelSupported, m as syncAdvertisedModelState, n as withConnectedSession, o as applyConversation, p as setDesiredModelId, q as TimeoutError, r as mergeSessionOptions, s as applyLifecycleSnapshotToRecord, t as runPromptTurn, u as setCurrentModelId, v as createSessionConversation, x as recordSessionUpdate, y as recordClientOperation, z as defaultSessionEventLog } from "./prompt-turn-CVPMWdj1.js";
|
|
4
4
|
import { n as isAcpJsonRpcMessage } from "./jsonrpc-DSxh2w5R.js";
|
|
5
|
-
import { a as
|
|
5
|
+
import { a as trySetModelOnRunningOwner, d as releaseQueueOwnerLease, f as terminateProcess, h as waitMs, i as trySetModeOnRunningOwner, l as isProcessAlive, m as tryAcquireQueueOwnerLease, n as tryCloseSessionOnRunningOwner, o as trySubmitToRunningOwner, p as terminateQueueOwnerForSession, r as trySetConfigOptionOnRunningOwner, s as SessionQueueOwner, t as tryCancelOnRunningOwner, u as refreshQueueOwnerLease } from "./ipc-ABXlXzGP.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";
|
|
@@ -15,9 +15,25 @@ function normalizeQueueOwnerTtlMs(ttlMs) {
|
|
|
15
15
|
return Math.round(ttlMs);
|
|
16
16
|
}
|
|
17
17
|
//#endregion
|
|
18
|
+
//#region src/cli/session/model-helpers.ts
|
|
19
|
+
async function applyRequestedModelIfAdvertised(params) {
|
|
20
|
+
const requestedModel = typeof params.requestedModel === "string" ? params.requestedModel.trim() : "";
|
|
21
|
+
if (!requestedModel) return false;
|
|
22
|
+
assertRequestedModelSupported({
|
|
23
|
+
requestedModel,
|
|
24
|
+
models: params.models,
|
|
25
|
+
agentCommand: params.agentCommand,
|
|
26
|
+
context: "apply"
|
|
27
|
+
});
|
|
28
|
+
if (!params.models) return false;
|
|
29
|
+
if (params.models.currentModelId === requestedModel) return true;
|
|
30
|
+
await withTimeout(params.client.setSessionModel(params.sessionId, requestedModel), params.timeoutMs);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
18
34
|
//#region src/cli/session/prompt-runner.ts
|
|
19
|
-
|
|
20
|
-
|
|
35
|
+
function buildDirectConnectedSessionOptions(options, run) {
|
|
36
|
+
return {
|
|
21
37
|
sessionRecordId: options.sessionRecordId,
|
|
22
38
|
loadRecord: resolveSessionRecord,
|
|
23
39
|
saveRecord: writeSessionRecord,
|
|
@@ -32,68 +48,36 @@ async function runSessionSetModeDirect(options) {
|
|
|
32
48
|
options.onClientAvailable?.(controller);
|
|
33
49
|
},
|
|
34
50
|
onClientClosed: options.onClientClosed,
|
|
35
|
-
run
|
|
36
|
-
await withTimeout(client.setSessionMode(sessionId, options.modeId), options.timeoutMs);
|
|
37
|
-
setDesiredModeId(record, options.modeId);
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
return {
|
|
41
|
-
record: result.record,
|
|
42
|
-
resumed: result.resumed,
|
|
43
|
-
loadError: result.loadError
|
|
51
|
+
run
|
|
44
52
|
};
|
|
45
53
|
}
|
|
46
|
-
|
|
47
|
-
const result = await withConnectedSession({
|
|
48
|
-
sessionRecordId: options.sessionRecordId,
|
|
49
|
-
loadRecord: resolveSessionRecord,
|
|
50
|
-
saveRecord: writeSessionRecord,
|
|
51
|
-
mcpServers: options.mcpServers,
|
|
52
|
-
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
53
|
-
authCredentials: options.authCredentials,
|
|
54
|
-
authPolicy: options.authPolicy,
|
|
55
|
-
terminal: options.terminal,
|
|
56
|
-
timeoutMs: options.timeoutMs,
|
|
57
|
-
verbose: options.verbose,
|
|
58
|
-
onClientAvailable: (controller) => {
|
|
59
|
-
options.onClientAvailable?.(controller);
|
|
60
|
-
},
|
|
61
|
-
onClientClosed: options.onClientClosed,
|
|
62
|
-
run: async ({ client, sessionId, record }) => {
|
|
63
|
-
await withTimeout(client.setSessionModel(sessionId, options.modelId), options.timeoutMs);
|
|
64
|
-
setDesiredModelId(record, options.modelId);
|
|
65
|
-
setCurrentModelId(record, options.modelId);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
54
|
+
function toSessionMutationResult(result) {
|
|
68
55
|
return {
|
|
69
56
|
record: result.record,
|
|
70
57
|
resumed: result.resumed,
|
|
71
58
|
loadError: result.loadError
|
|
72
59
|
};
|
|
73
60
|
}
|
|
61
|
+
async function runSessionSetModeDirect(options) {
|
|
62
|
+
return toSessionMutationResult(await withConnectedSession(buildDirectConnectedSessionOptions(options, async ({ client, sessionId, record }) => {
|
|
63
|
+
await withTimeout(client.setSessionMode(sessionId, options.modeId), options.timeoutMs);
|
|
64
|
+
setDesiredModeId(record, options.modeId);
|
|
65
|
+
})));
|
|
66
|
+
}
|
|
67
|
+
async function runSessionSetModelDirect(options) {
|
|
68
|
+
return toSessionMutationResult(await withConnectedSession(buildDirectConnectedSessionOptions(options, async ({ client, sessionId, record }) => {
|
|
69
|
+
await withTimeout(client.setSessionModel(sessionId, options.modelId), options.timeoutMs);
|
|
70
|
+
setDesiredModelId(record, options.modelId);
|
|
71
|
+
setCurrentModelId(record, options.modelId);
|
|
72
|
+
})));
|
|
73
|
+
}
|
|
74
74
|
async function runSessionSetConfigOptionDirect(options) {
|
|
75
|
-
const result = await withConnectedSession({
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
authCredentials: options.authCredentials,
|
|
82
|
-
authPolicy: options.authPolicy,
|
|
83
|
-
terminal: options.terminal,
|
|
84
|
-
timeoutMs: options.timeoutMs,
|
|
85
|
-
verbose: options.verbose,
|
|
86
|
-
onClientAvailable: (controller) => {
|
|
87
|
-
options.onClientAvailable?.(controller);
|
|
88
|
-
},
|
|
89
|
-
onClientClosed: options.onClientClosed,
|
|
90
|
-
run: async ({ client, sessionId, record }) => {
|
|
91
|
-
const response = await withTimeout(client.setSessionConfigOption(sessionId, options.configId, options.value), options.timeoutMs);
|
|
92
|
-
if (options.configId === "mode") setDesiredModeId(record, options.value);
|
|
93
|
-
else setDesiredConfigOption(record, options.configId, options.value);
|
|
94
|
-
return response;
|
|
95
|
-
}
|
|
96
|
-
});
|
|
75
|
+
const result = await withConnectedSession(buildDirectConnectedSessionOptions(options, async ({ client, sessionId, record }) => {
|
|
76
|
+
const response = await withTimeout(client.setSessionConfigOption(sessionId, options.configId, options.value), options.timeoutMs);
|
|
77
|
+
if (options.configId === "mode") setDesiredModeId(record, options.value);
|
|
78
|
+
else setDesiredConfigOption(record, options.configId, options.value);
|
|
79
|
+
return response;
|
|
80
|
+
}));
|
|
97
81
|
return {
|
|
98
82
|
record: result.record,
|
|
99
83
|
response: result.value,
|
|
@@ -203,6 +187,7 @@ async function isLikelyMatchingProcess(pid, agentCommand) {
|
|
|
203
187
|
}
|
|
204
188
|
async function closeSession(sessionId) {
|
|
205
189
|
const record = await resolveSessionRecord(sessionId);
|
|
190
|
+
await tryCloseSessionOnRunningOwner({ sessionId: record.acpxRecordId }).catch(() => {});
|
|
206
191
|
await terminateQueueOwnerForSession(record.acpxRecordId);
|
|
207
192
|
if (record.pid != null && isProcessAlive(record.pid) && await isLikelyMatchingProcess(record.pid, record.agentCommand)) await terminateProcess(record.pid);
|
|
208
193
|
record.pid = void 0;
|
|
@@ -232,18 +217,12 @@ function persistSessionOptions(record, options) {
|
|
|
232
217
|
if (!record.acpx) return;
|
|
233
218
|
delete record.acpx.session_options;
|
|
234
219
|
}
|
|
235
|
-
async function applyRequestedModelIfAdvertised$1(params) {
|
|
236
|
-
const requestedModel = typeof params.requestedModel === "string" ? params.requestedModel.trim() : "";
|
|
237
|
-
if (!requestedModel || !params.models) return false;
|
|
238
|
-
if (params.models.currentModelId === requestedModel) return true;
|
|
239
|
-
await withTimeout(params.client.setSessionModel(params.sessionId, requestedModel), params.timeoutMs);
|
|
240
|
-
return true;
|
|
241
|
-
}
|
|
242
220
|
async function createSessionRecordWithClient(client, options) {
|
|
243
221
|
const cwd = absolutePath(options.cwd);
|
|
244
222
|
await withTimeout(client.start(), options.timeoutMs);
|
|
245
223
|
let sessionId;
|
|
246
224
|
let agentSessionId;
|
|
225
|
+
let sessionResult;
|
|
247
226
|
let sessionModels;
|
|
248
227
|
let requestedModelApplied = false;
|
|
249
228
|
if (options.resumeSessionId) {
|
|
@@ -252,12 +231,14 @@ async function createSessionRecordWithClient(client, options) {
|
|
|
252
231
|
const loadedSession = await withTimeout(client.loadSession(options.resumeSessionId, cwd), options.timeoutMs);
|
|
253
232
|
sessionId = options.resumeSessionId;
|
|
254
233
|
agentSessionId = normalizeRuntimeSessionId(loadedSession.agentSessionId);
|
|
234
|
+
sessionResult = loadedSession;
|
|
255
235
|
sessionModels = loadedSession.models;
|
|
256
|
-
requestedModelApplied = await applyRequestedModelIfAdvertised
|
|
236
|
+
requestedModelApplied = await applyRequestedModelIfAdvertised({
|
|
257
237
|
client,
|
|
258
238
|
sessionId,
|
|
259
239
|
requestedModel: options.sessionOptions?.model,
|
|
260
240
|
models: sessionModels,
|
|
241
|
+
agentCommand: options.agentCommand,
|
|
261
242
|
timeoutMs: options.timeoutMs
|
|
262
243
|
});
|
|
263
244
|
} catch (error) {
|
|
@@ -267,12 +248,14 @@ async function createSessionRecordWithClient(client, options) {
|
|
|
267
248
|
const createdSession = await withTimeout(client.createSession(cwd), options.timeoutMs);
|
|
268
249
|
sessionId = createdSession.sessionId;
|
|
269
250
|
agentSessionId = normalizeRuntimeSessionId(createdSession.agentSessionId);
|
|
251
|
+
sessionResult = createdSession;
|
|
270
252
|
sessionModels = createdSession.models;
|
|
271
|
-
requestedModelApplied = await applyRequestedModelIfAdvertised
|
|
253
|
+
requestedModelApplied = await applyRequestedModelIfAdvertised({
|
|
272
254
|
client,
|
|
273
255
|
sessionId,
|
|
274
256
|
requestedModel: options.sessionOptions?.model,
|
|
275
257
|
models: sessionModels,
|
|
258
|
+
agentCommand: options.agentCommand,
|
|
276
259
|
timeoutMs: options.timeoutMs
|
|
277
260
|
});
|
|
278
261
|
}
|
|
@@ -301,6 +284,7 @@ async function createSessionRecordWithClient(client, options) {
|
|
|
301
284
|
acpx: {}
|
|
302
285
|
};
|
|
303
286
|
persistSessionOptions(record, options.sessionOptions);
|
|
287
|
+
applyConfigOptionsToRecord(record, sessionResult);
|
|
304
288
|
syncAdvertisedModelState(record, sessionModels);
|
|
305
289
|
if (requestedModelApplied) setCurrentModelId(record, options.sessionOptions?.model);
|
|
306
290
|
await writeSessionRecord(record);
|
|
@@ -853,17 +837,24 @@ function toPromptResult(stopReason, sessionId, client) {
|
|
|
853
837
|
permissionStats: client.getPermissionStats()
|
|
854
838
|
};
|
|
855
839
|
}
|
|
856
|
-
async function applyRequestedModelIfAdvertised(params) {
|
|
857
|
-
const requestedModel = typeof params.requestedModel === "string" ? params.requestedModel.trim() : "";
|
|
858
|
-
if (!requestedModel || !params.models) return false;
|
|
859
|
-
if (params.models.currentModelId === requestedModel) return true;
|
|
860
|
-
await withTimeout(params.client.setSessionModel(params.sessionId, requestedModel), params.timeoutMs);
|
|
861
|
-
return true;
|
|
862
|
-
}
|
|
863
840
|
async function applyPromptModelIfAdvertised(params) {
|
|
864
841
|
const requestedModel = typeof params.requestedModel === "string" ? params.requestedModel.trim() : "";
|
|
865
|
-
if (!requestedModel
|
|
866
|
-
|
|
842
|
+
if (!requestedModel) return;
|
|
843
|
+
const availableModels = params.record.acpx?.available_models;
|
|
844
|
+
assertRequestedModelSupported({
|
|
845
|
+
requestedModel,
|
|
846
|
+
models: Array.isArray(availableModels) ? {
|
|
847
|
+
currentModelId: params.record.acpx?.current_model_id ?? "",
|
|
848
|
+
availableModels: availableModels.map((modelId) => ({
|
|
849
|
+
modelId,
|
|
850
|
+
name: modelId
|
|
851
|
+
}))
|
|
852
|
+
} : void 0,
|
|
853
|
+
agentCommand: params.record.agentCommand,
|
|
854
|
+
context: "apply"
|
|
855
|
+
});
|
|
856
|
+
if (!Array.isArray(availableModels)) return;
|
|
857
|
+
if (params.record.acpx?.current_model_id === requestedModel) {
|
|
867
858
|
setDesiredModelId(params.record, requestedModel);
|
|
868
859
|
return;
|
|
869
860
|
}
|
|
@@ -1006,7 +997,7 @@ async function runSessionPrompt(options) {
|
|
|
1006
997
|
};
|
|
1007
998
|
const flushPendingMessages = async (checkpoint = false) => {
|
|
1008
999
|
if (pendingMessages.length === 0) return;
|
|
1009
|
-
const batch = pendingMessages.splice(0
|
|
1000
|
+
const batch = pendingMessages.splice(0);
|
|
1010
1001
|
await measurePerf("session.events.flush_pending", async () => {
|
|
1011
1002
|
await eventWriter.appendMessages(batch, { checkpoint });
|
|
1012
1003
|
});
|
|
@@ -1252,6 +1243,7 @@ async function runOnce(options) {
|
|
|
1252
1243
|
sessionId,
|
|
1253
1244
|
requestedModel: options.sessionOptions?.model,
|
|
1254
1245
|
models: createdSession.models,
|
|
1246
|
+
agentCommand: options.agentCommand,
|
|
1255
1247
|
timeoutMs: options.timeoutMs
|
|
1256
1248
|
});
|
|
1257
1249
|
output.setContext({ sessionId });
|
|
@@ -1412,6 +1404,12 @@ async function runSessionQueueOwner(options) {
|
|
|
1412
1404
|
const clearActiveController = () => {
|
|
1413
1405
|
turnController.clearActiveController();
|
|
1414
1406
|
};
|
|
1407
|
+
const closeActiveBackendSession = async (timeoutMs) => {
|
|
1408
|
+
const latestRecord = await resolveSessionRecord(options.sessionId);
|
|
1409
|
+
if (!sharedClient.supportsCloseSession()) return false;
|
|
1410
|
+
await withTimeout(sharedClient.closeSession(latestRecord.acpSessionId), timeoutMs);
|
|
1411
|
+
return true;
|
|
1412
|
+
};
|
|
1415
1413
|
const runPromptTurn = async (run) => {
|
|
1416
1414
|
turnController.beginTurn();
|
|
1417
1415
|
try {
|
|
@@ -1427,6 +1425,7 @@ async function runSessionQueueOwner(options) {
|
|
|
1427
1425
|
await applyPendingCancel();
|
|
1428
1426
|
return true;
|
|
1429
1427
|
},
|
|
1428
|
+
closeSession: async (timeoutMs) => await closeActiveBackendSession(timeoutMs),
|
|
1430
1429
|
setSessionMode: async (modeId, timeoutMs) => {
|
|
1431
1430
|
await turnController.setSessionMode(modeId, timeoutMs);
|
|
1432
1431
|
},
|
|
@@ -1536,4 +1535,4 @@ var session_exports = /* @__PURE__ */ __exportAll({
|
|
|
1536
1535
|
//#endregion
|
|
1537
1536
|
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 };
|
|
1538
1537
|
|
|
1539
|
-
//# sourceMappingURL=session-
|
|
1538
|
+
//# sourceMappingURL=session-CDaQe6BH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-CDaQe6BH.js","names":["fs","fs","segmentEventPath","activeEventPath","eventsLockPath","recordConversationSessionUpdate","recordConversationClientOperation"],"sources":["../src/cli/session/contracts.ts","../src/cli/session/model-helpers.ts","../src/cli/session/prompt-runner.ts","../src/cli/session/session-control.ts","../src/cli/session/session-management.ts","../src/perf-metrics-capture.ts","../src/cli/queue/owner-turn-controller.ts","../src/cli/session/queue-owner-process.ts","../src/session/events.ts","../src/cli/session/runtime.ts","../src/cli/session/queue-owner-runtime.ts","../src/session/session.ts"],"sourcesContent":["import type { AcpClient } from \"../../acp/client.js\";\nimport type { SessionAgentOptions } from \"../../runtime/engine/session-options.js\";\nimport type {\n AcpJsonRpcMessage,\n AcpMessageDirection,\n AuthPolicy,\n ClientOperation,\n McpServer,\n NonInteractivePermissionPolicy,\n OutputErrorEmissionPolicy,\n OutputFormatter,\n PermissionMode,\n PromptInput,\n SessionNotification,\n SessionResumePolicy,\n SessionRecord,\n} from \"../../types.js\";\n\ntype TimedRunOptions = {\n timeoutMs?: number;\n};\n\nexport const DEFAULT_QUEUE_OWNER_TTL_MS = 300_000;\n\nexport function normalizeQueueOwnerTtlMs(ttlMs: number | undefined): number {\n if (ttlMs == null) {\n return DEFAULT_QUEUE_OWNER_TTL_MS;\n }\n\n if (!Number.isFinite(ttlMs) || ttlMs < 0) {\n return DEFAULT_QUEUE_OWNER_TTL_MS;\n }\n\n // 0 means keep alive forever (no TTL)\n return Math.round(ttlMs);\n}\n\nexport type RunOnceOptions = {\n agentCommand: string;\n cwd: string;\n prompt: PromptInput;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n outputFormatter: OutputFormatter;\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n sessionOptions?: SessionAgentOptions;\n promptRetries?: number;\n} & TimedRunOptions;\n\nexport type SessionCreateOptions = {\n agentCommand: string;\n cwd: string;\n name?: string;\n resumeSessionId?: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n verbose?: boolean;\n sessionOptions?: SessionAgentOptions;\n} & TimedRunOptions;\n\nexport type SessionSendOptions = {\n sessionId: string;\n prompt: PromptInput;\n resumePolicy?: SessionResumePolicy;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n outputFormatter: OutputFormatter;\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n errorEmissionPolicy?: OutputErrorEmissionPolicy;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n waitForCompletion?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n client?: AcpClient;\n promptRetries?: number;\n sessionOptions?: SessionAgentOptions;\n} & TimedRunOptions;\n\nexport type SessionEnsureOptions = {\n agentCommand: string;\n cwd: string;\n name?: string;\n resumeSessionId?: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n verbose?: boolean;\n walkBoundary?: string;\n sessionOptions?: SessionAgentOptions;\n} & TimedRunOptions;\n\nexport type SessionCancelOptions = {\n sessionId: string;\n verbose?: boolean;\n};\n\nexport type SessionCancelResult = {\n sessionId: string;\n cancelled: boolean;\n};\n\nexport type SessionSetModeOptions = {\n sessionId: string;\n modeId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n verbose?: boolean;\n} & TimedRunOptions;\n\nexport type SessionSetModelOptions = {\n sessionId: string;\n modelId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n verbose?: boolean;\n} & TimedRunOptions;\n\nexport type SessionSetConfigOptionOptions = {\n sessionId: string;\n configId: string;\n value: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n verbose?: boolean;\n} & TimedRunOptions;\n\nexport type SessionCreateWithClientResult = {\n record: SessionRecord;\n client: AcpClient;\n};\n\nexport type { SessionAgentOptions };\n","import type { AcpClient, SessionCreateResult } from \"../../acp/client.js\";\nimport { assertRequestedModelSupported } from \"../../acp/model-support.js\";\nimport { withTimeout } from \"../../async-control.js\";\n\nexport async function applyRequestedModelIfAdvertised(params: {\n client: AcpClient;\n sessionId: string;\n requestedModel: string | undefined;\n models: SessionCreateResult[\"models\"];\n agentCommand?: string;\n timeoutMs?: number;\n}): Promise<boolean> {\n const requestedModel =\n typeof params.requestedModel === \"string\" ? params.requestedModel.trim() : \"\";\n if (!requestedModel) {\n return false;\n }\n assertRequestedModelSupported({\n requestedModel,\n models: params.models,\n agentCommand: params.agentCommand,\n context: \"apply\",\n });\n if (!params.models) {\n return false;\n }\n if (params.models.currentModelId === requestedModel) {\n return true;\n }\n\n await withTimeout(\n params.client.setSessionModel(params.sessionId, requestedModel),\n params.timeoutMs,\n );\n return true;\n}\n","import { withTimeout } from \"../../async-control.js\";\nimport {\n withConnectedSession,\n type FullConnectedSessionController,\n type WithConnectedSessionOptions,\n type WithConnectedSessionResult,\n} from \"../../runtime/engine/connected-session.js\";\nimport {\n setCurrentModelId,\n setDesiredConfigOption,\n setDesiredModeId,\n setDesiredModelId,\n} from \"../../session/mode-preference.js\";\nimport { resolveSessionRecord, writeSessionRecord } from \"../../session/persistence.js\";\nimport type {\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n SessionSetConfigOptionResult,\n SessionSetModelResult,\n SessionSetModeResult,\n} from \"../../types.js\";\nimport type { QueueOwnerActiveSessionController } from \"../queue/owner-turn-controller.js\";\n\nexport type ActiveSessionController = QueueOwnerActiveSessionController;\n\nexport type RunSessionSetModeDirectOptions = {\n sessionRecordId: string;\n modeId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nexport type RunSessionSetConfigOptionDirectOptions = {\n sessionRecordId: string;\n configId: string;\n value: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nexport type RunSessionSetModelDirectOptions = {\n sessionRecordId: string;\n modelId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\ntype DirectConnectedSessionOptions = {\n sessionRecordId: string;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n timeoutMs?: number;\n verbose?: boolean;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n};\n\nfunction buildDirectConnectedSessionOptions<T>(\n options: DirectConnectedSessionOptions,\n run: WithConnectedSessionOptions<T>[\"run\"],\n): WithConnectedSessionOptions<T> {\n return {\n sessionRecordId: options.sessionRecordId,\n loadRecord: resolveSessionRecord,\n saveRecord: writeSessionRecord,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n onClientAvailable: (controller: FullConnectedSessionController) => {\n options.onClientAvailable?.(controller);\n },\n onClientClosed: options.onClientClosed,\n run,\n };\n}\n\nfunction toSessionMutationResult(\n result: Pick<WithConnectedSessionResult<unknown>, \"record\" | \"resumed\" | \"loadError\">,\n): Pick<SessionSetModeResult, \"record\" | \"resumed\" | \"loadError\"> {\n return {\n record: result.record,\n resumed: result.resumed,\n loadError: result.loadError,\n };\n}\n\nexport async function runSessionSetModeDirect(\n options: RunSessionSetModeDirectOptions,\n): Promise<SessionSetModeResult> {\n const result = await withConnectedSession(\n buildDirectConnectedSessionOptions(options, async ({ client, sessionId, record }) => {\n await withTimeout(client.setSessionMode(sessionId, options.modeId), options.timeoutMs);\n setDesiredModeId(record, options.modeId);\n }),\n );\n\n return toSessionMutationResult(result);\n}\n\nexport async function runSessionSetModelDirect(\n options: RunSessionSetModelDirectOptions,\n): Promise<SessionSetModelResult> {\n const result = await withConnectedSession(\n buildDirectConnectedSessionOptions(options, async ({ client, sessionId, record }) => {\n await withTimeout(client.setSessionModel(sessionId, options.modelId), options.timeoutMs);\n setDesiredModelId(record, options.modelId);\n setCurrentModelId(record, options.modelId);\n }),\n );\n\n return toSessionMutationResult(result);\n}\n\nexport async function runSessionSetConfigOptionDirect(\n options: RunSessionSetConfigOptionDirectOptions,\n): Promise<SessionSetConfigOptionResult> {\n const result = await withConnectedSession(\n buildDirectConnectedSessionOptions(options, async ({ client, sessionId, record }) => {\n const response = await withTimeout(\n client.setSessionConfigOption(sessionId, options.configId, options.value),\n options.timeoutMs,\n );\n if (options.configId === \"mode\") {\n setDesiredModeId(record, options.value);\n } else {\n setDesiredConfigOption(record, options.configId, options.value);\n }\n return response;\n }),\n );\n\n return {\n record: result.record,\n response: result.value,\n resumed: result.resumed,\n loadError: result.loadError,\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n setCurrentModelId,\n setDesiredConfigOption,\n setDesiredModeId,\n setDesiredModelId,\n} from \"../../session/mode-preference.js\";\nimport { resolveSessionRecord, writeSessionRecord, isoNow } from \"../../session/persistence.js\";\nimport type {\n SessionRecord,\n SessionSetConfigOptionResult,\n SessionSetModelResult,\n SessionSetModeResult,\n} from \"../../types.js\";\nimport {\n isProcessAlive,\n terminateProcess,\n terminateQueueOwnerForSession,\n tryCancelOnRunningOwner,\n tryCloseSessionOnRunningOwner,\n trySetConfigOptionOnRunningOwner,\n trySetModelOnRunningOwner,\n trySetModeOnRunningOwner,\n} from \"../queue/ipc.js\";\nimport type {\n SessionCancelOptions,\n SessionCancelResult,\n SessionSetConfigOptionOptions,\n SessionSetModelOptions,\n SessionSetModeOptions,\n} from \"./contracts.js\";\nimport {\n runSessionSetConfigOptionDirect,\n runSessionSetModelDirect,\n runSessionSetModeDirect,\n} from \"./prompt-runner.js\";\n\nexport async function cancelSessionPrompt(\n options: SessionCancelOptions,\n): Promise<SessionCancelResult> {\n const cancelled = await tryCancelOnRunningOwner(options);\n return {\n sessionId: options.sessionId,\n cancelled: cancelled === true,\n };\n}\n\nexport async function setSessionMode(\n options: SessionSetModeOptions,\n): Promise<SessionSetModeResult> {\n const submittedToOwner = await trySetModeOnRunningOwner(\n options.sessionId,\n options.modeId,\n options.timeoutMs,\n options.verbose,\n );\n if (submittedToOwner) {\n const record = await resolveSessionRecord(options.sessionId);\n setDesiredModeId(record, options.modeId);\n await writeSessionRecord(record);\n return {\n record,\n resumed: false,\n };\n }\n\n return await runSessionSetModeDirect({\n sessionRecordId: options.sessionId,\n modeId: options.modeId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nexport async function setSessionModel(\n options: SessionSetModelOptions,\n): Promise<SessionSetModelResult> {\n const submittedToOwner = await trySetModelOnRunningOwner(\n options.sessionId,\n options.modelId,\n options.timeoutMs,\n options.verbose,\n );\n if (submittedToOwner) {\n const record = await resolveSessionRecord(options.sessionId);\n setDesiredModelId(record, options.modelId);\n setCurrentModelId(record, options.modelId);\n await writeSessionRecord(record);\n return {\n record,\n resumed: false,\n };\n }\n\n return await runSessionSetModelDirect({\n sessionRecordId: options.sessionId,\n modelId: options.modelId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nexport async function setSessionConfigOption(\n options: SessionSetConfigOptionOptions,\n): Promise<SessionSetConfigOptionResult> {\n const ownerResponse = await trySetConfigOptionOnRunningOwner(\n options.sessionId,\n options.configId,\n options.value,\n options.timeoutMs,\n options.verbose,\n );\n if (ownerResponse) {\n const record = await resolveSessionRecord(options.sessionId);\n if (options.configId === \"mode\") {\n setDesiredModeId(record, options.value);\n } else {\n setDesiredConfigOption(record, options.configId, options.value);\n }\n await writeSessionRecord(record);\n return {\n record,\n response: ownerResponse,\n resumed: false,\n };\n }\n\n return await runSessionSetConfigOptionDirect({\n sessionRecordId: options.sessionId,\n configId: options.configId,\n value: options.value,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n}\n\nfunction firstAgentCommandToken(command: string): string | undefined {\n const trimmed = command.trim();\n if (!trimmed) {\n return undefined;\n }\n const token = trimmed.split(/\\s+/, 1)[0];\n return token.length > 0 ? token : undefined;\n}\n\nasync function isLikelyMatchingProcess(pid: number, agentCommand: string): Promise<boolean> {\n const expectedToken = firstAgentCommandToken(agentCommand);\n if (!expectedToken) {\n return false;\n }\n\n const procCmdline = `/proc/${pid}/cmdline`;\n try {\n const payload = await fs.readFile(procCmdline, \"utf8\");\n const argv = payload\n .split(\"\\u0000\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n if (argv.length === 0) {\n return false;\n }\n\n const executableBase = path.basename(argv[0]);\n const expectedBase = path.basename(expectedToken);\n return (\n executableBase === expectedBase || argv.some((entry) => path.basename(entry) === expectedBase)\n );\n } catch {\n return true;\n }\n}\n\nexport async function closeSession(sessionId: string): Promise<SessionRecord> {\n const record = await resolveSessionRecord(sessionId);\n await tryCloseSessionOnRunningOwner({ sessionId: record.acpxRecordId }).catch(() => {\n // Preserve local close semantics even if best-effort ACP session shutdown fails.\n });\n await terminateQueueOwnerForSession(record.acpxRecordId);\n\n if (\n record.pid != null &&\n isProcessAlive(record.pid) &&\n (await isLikelyMatchingProcess(record.pid, record.agentCommand))\n ) {\n await terminateProcess(record.pid);\n }\n\n record.pid = undefined;\n record.closed = true;\n record.closedAt = isoNow();\n await writeSessionRecord(record);\n\n return record;\n}\n","import { AcpClient, type SessionCreateResult } from \"../../acp/client.js\";\nimport { formatErrorMessage } from \"../../acp/error-normalization.js\";\nimport { withInterrupt, withTimeout } from \"../../async-control.js\";\nimport { applyConfigOptionsToRecord } from \"../../session/config-options.js\";\nimport { createSessionConversation } from \"../../session/conversation-model.js\";\nimport { defaultSessionEventLog } from \"../../session/event-log.js\";\nimport { setCurrentModelId, syncAdvertisedModelState } from \"../../session/mode-preference.js\";\nimport {\n absolutePath,\n findGitRepositoryRoot,\n findSessionByDirectoryWalk,\n isoNow,\n normalizeName,\n writeSessionRecord,\n} from \"../../session/persistence.js\";\nimport { normalizeRuntimeSessionId } from \"../../session/runtime-session-id.js\";\nimport type { SessionEnsureResult, SessionRecord } from \"../../types.js\";\nimport { DEFAULT_QUEUE_OWNER_TTL_MS } from \"./contracts.js\";\nimport type {\n SessionAgentOptions,\n SessionCreateOptions,\n SessionCreateWithClientResult,\n SessionEnsureOptions,\n} from \"./contracts.js\";\nimport { applyRequestedModelIfAdvertised } from \"./model-helpers.js\";\nimport { setSessionModel } from \"./session-control.js\";\n\nfunction persistSessionOptions(\n record: SessionRecord,\n options: SessionAgentOptions | undefined,\n): void {\n const systemPromptOption = options?.systemPrompt;\n const normalizedSystemPrompt =\n typeof systemPromptOption === \"string\" && systemPromptOption.length > 0\n ? systemPromptOption\n : systemPromptOption &&\n typeof systemPromptOption === \"object\" &&\n typeof systemPromptOption.append === \"string\" &&\n systemPromptOption.append.length > 0\n ? { append: systemPromptOption.append }\n : undefined;\n\n const next =\n options &&\n ({\n model: typeof options.model === \"string\" ? options.model : undefined,\n allowed_tools: Array.isArray(options.allowedTools) ? [...options.allowedTools] : undefined,\n max_turns: typeof options.maxTurns === \"number\" ? options.maxTurns : undefined,\n system_prompt: normalizedSystemPrompt,\n } satisfies NonNullable<NonNullable<SessionRecord[\"acpx\"]>[\"session_options\"]>);\n\n const hasValues = Boolean(\n next &&\n ((typeof next.model === \"string\" && next.model.trim().length > 0) ||\n (Array.isArray(next.allowed_tools) && next.allowed_tools.length > 0) ||\n typeof next.max_turns === \"number\" ||\n next.system_prompt !== undefined),\n );\n\n if (hasValues && next) {\n record.acpx = {\n ...record.acpx,\n session_options: next,\n };\n return;\n }\n\n if (!record.acpx) {\n return;\n }\n\n delete record.acpx.session_options;\n}\n\nasync function createSessionRecordWithClient(\n client: AcpClient,\n options: SessionCreateOptions,\n): Promise<SessionRecord> {\n const cwd = absolutePath(options.cwd);\n await withTimeout(client.start(), options.timeoutMs);\n let sessionId: string;\n let agentSessionId: string | undefined;\n let sessionResult: Awaited<ReturnType<AcpClient[\"createSession\" | \"loadSession\"]>>;\n let sessionModels: SessionCreateResult[\"models\"];\n let requestedModelApplied = false;\n\n if (options.resumeSessionId) {\n if (!client.supportsLoadSession()) {\n throw new Error(\n `Agent command \"${options.agentCommand}\" does not support session/load; cannot resume session ${options.resumeSessionId}`,\n );\n }\n\n try {\n const loadedSession = await withTimeout(\n client.loadSession(options.resumeSessionId, cwd),\n options.timeoutMs,\n );\n sessionId = options.resumeSessionId;\n agentSessionId = normalizeRuntimeSessionId(loadedSession.agentSessionId);\n sessionResult = loadedSession;\n sessionModels = loadedSession.models;\n requestedModelApplied = await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: sessionModels,\n agentCommand: options.agentCommand,\n timeoutMs: options.timeoutMs,\n });\n } catch (error) {\n throw new Error(\n `Failed to resume ACP session ${options.resumeSessionId}: ${formatErrorMessage(error)}`,\n {\n cause: error,\n },\n );\n }\n } else {\n const createdSession = await withTimeout(client.createSession(cwd), options.timeoutMs);\n sessionId = createdSession.sessionId;\n agentSessionId = normalizeRuntimeSessionId(createdSession.agentSessionId);\n sessionResult = createdSession;\n sessionModels = createdSession.models;\n requestedModelApplied = await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: sessionModels,\n agentCommand: options.agentCommand,\n timeoutMs: options.timeoutMs,\n });\n }\n\n const lifecycle = client.getAgentLifecycleSnapshot();\n const now = isoNow();\n const record: SessionRecord = {\n schema: \"acpx.session.v1\",\n acpxRecordId: sessionId,\n acpSessionId: sessionId,\n agentSessionId,\n agentCommand: options.agentCommand,\n cwd,\n name: normalizeName(options.name),\n createdAt: now,\n lastUsedAt: now,\n lastSeq: 0,\n lastRequestId: undefined,\n eventLog: defaultSessionEventLog(sessionId),\n closed: false,\n closedAt: undefined,\n pid: lifecycle.pid,\n agentStartedAt: lifecycle.startedAt,\n protocolVersion: client.initializeResult?.protocolVersion,\n agentCapabilities: client.initializeResult?.agentCapabilities,\n ...createSessionConversation(now),\n acpx: {},\n };\n\n persistSessionOptions(record, options.sessionOptions);\n applyConfigOptionsToRecord(record, sessionResult);\n syncAdvertisedModelState(record, sessionModels);\n if (requestedModelApplied) {\n setCurrentModelId(record, options.sessionOptions?.model);\n }\n\n await writeSessionRecord(record);\n return record;\n}\n\nexport async function createSessionWithClient(\n options: SessionCreateOptions,\n): Promise<SessionCreateWithClientResult> {\n const client = new AcpClient({\n agentCommand: options.agentCommand,\n cwd: absolutePath(options.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n verbose: options.verbose,\n sessionOptions: options.sessionOptions,\n });\n\n try {\n const record = await withInterrupt(\n async () => await createSessionRecordWithClient(client, options),\n async () => {\n await client.close();\n },\n );\n\n return {\n record,\n client,\n };\n } catch (error) {\n await client.close();\n throw error;\n }\n}\n\nexport async function createSession(options: SessionCreateOptions): Promise<SessionRecord> {\n const { record, client } = await createSessionWithClient(options);\n try {\n return record;\n } finally {\n await client.close();\n }\n}\n\nexport async function ensureSession(options: SessionEnsureOptions): Promise<SessionEnsureResult> {\n const cwd = absolutePath(options.cwd);\n const gitRoot = findGitRepositoryRoot(cwd);\n const walkBoundary = options.walkBoundary ?? gitRoot ?? cwd;\n const existing = await findSessionByDirectoryWalk({\n agentCommand: options.agentCommand,\n cwd,\n name: options.name,\n boundary: walkBoundary,\n });\n if (existing) {\n const requestedModel = options.sessionOptions?.model;\n if (requestedModel) {\n const result = await setSessionModel({\n sessionId: existing.acpxRecordId,\n modelId: requestedModel,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n });\n return { record: result.record, created: false };\n }\n return {\n record: existing,\n created: false,\n };\n }\n\n const record = await createSession({\n agentCommand: options.agentCommand,\n cwd,\n name: options.name,\n resumeSessionId: options.resumeSessionId,\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n sessionOptions: options.sessionOptions,\n });\n\n return {\n record,\n created: true,\n };\n}\n\nexport { DEFAULT_QUEUE_OWNER_TTL_MS };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { getPerfMetricsSnapshot, resetPerfMetrics } from \"./perf-metrics.js\";\n\nconst PERF_METRICS_FILE_ENV = \"ACPX_PERF_METRICS_FILE\";\n\nlet installed = false;\nlet flushed = false;\nlet captureFilePath: string | undefined;\nlet captureRole = \"cli\";\nlet captureArgv: string[] = [];\nlet captureSequence = 0;\n\ntype CaptureReason = \"checkpoint\" | \"exit\" | \"signal\";\n\nfunction shouldCapture(): boolean {\n return typeof captureFilePath === \"string\" && captureFilePath.trim().length > 0;\n}\n\nfunction buildPayload(reason: CaptureReason): Record<string, unknown> {\n return {\n timestamp: new Date().toISOString(),\n pid: process.pid,\n ppid: process.ppid,\n role: captureRole,\n argv: captureArgv,\n cwd: process.cwd(),\n sequence: captureSequence,\n reason,\n metrics: getPerfMetricsSnapshot(),\n };\n}\n\nfunction writePerfMetricsCapture(reason: CaptureReason, resetAfterWrite: boolean): boolean {\n if (!shouldCapture()) {\n return false;\n }\n\n const payload = buildPayload(reason);\n const metrics = payload.metrics as {\n counters?: Record<string, number>;\n gauges?: Record<string, number>;\n timings?: Record<string, unknown>;\n };\n const hasData =\n Object.keys(metrics.counters ?? {}).length > 0 ||\n Object.keys(metrics.gauges ?? {}).length > 0 ||\n Object.keys(metrics.timings ?? {}).length > 0;\n if (!hasData) {\n return false;\n }\n\n try {\n fs.mkdirSync(path.dirname(captureFilePath!), { recursive: true });\n fs.appendFileSync(captureFilePath!, `${JSON.stringify(payload)}\\n`, \"utf8\");\n captureSequence += 1;\n if (resetAfterWrite) {\n resetPerfMetrics();\n }\n return true;\n } catch {\n // metrics capture is best-effort only\n return false;\n }\n}\n\nexport function checkpointPerfMetricsCapture(): void {\n flushed = false;\n writePerfMetricsCapture(\"checkpoint\", true);\n}\n\nexport function flushPerfMetricsCapture(reason: CaptureReason = \"exit\"): void {\n if (flushed || !shouldCapture()) {\n return;\n }\n flushed = true;\n writePerfMetricsCapture(reason, false);\n}\n\nexport function installPerfMetricsCapture(\n options: {\n argv?: string[];\n role?: string;\n filePath?: string;\n } = {},\n): void {\n captureFilePath = options.filePath ?? process.env[PERF_METRICS_FILE_ENV];\n if (!shouldCapture()) {\n return;\n }\n\n resetPerfMetrics();\n captureRole = options.role ?? captureRole;\n captureArgv = options.argv ?? [];\n captureSequence = 0;\n flushed = false;\n\n if (installed) {\n return;\n }\n installed = true;\n\n process.once(\"exit\", () => {\n flushPerfMetricsCapture(\"exit\");\n });\n for (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n const handler = () => {\n flushPerfMetricsCapture(\"signal\");\n process.removeListener(signal, handler);\n process.kill(process.pid, signal);\n };\n process.once(signal, handler);\n }\n}\n\nexport function perfMetricsCaptureFileFromEnv(\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const value = env[PERF_METRICS_FILE_ENV];\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return undefined;\n }\n return value;\n}\n","import type { SetSessionConfigOptionResponse } from \"@agentclientprotocol/sdk\";\nimport { QueueConnectionError } from \"../../errors.js\";\n\nexport type QueueOwnerTurnState = \"idle\" | \"starting\" | \"active\" | \"closing\";\n\nexport type QueueOwnerActiveSessionController = {\n hasActivePrompt: () => boolean;\n requestCancelActivePrompt: () => Promise<boolean>;\n setSessionMode: (modeId: string) => Promise<void>;\n setSessionModel: (modelId: string) => Promise<void>;\n setSessionConfigOption: (\n configId: string,\n value: string,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\ntype QueueOwnerTurnControllerOptions = {\n withTimeout: <T>(run: () => Promise<T>, timeoutMs?: number) => Promise<T>;\n setSessionModeFallback: (modeId: string, timeoutMs?: number) => Promise<void>;\n setSessionModelFallback: (modelId: string, timeoutMs?: number) => Promise<void>;\n setSessionConfigOptionFallback: (\n configId: string,\n value: string,\n timeoutMs?: number,\n ) => Promise<SetSessionConfigOptionResponse>;\n};\n\nexport class QueueOwnerTurnController {\n private readonly options: QueueOwnerTurnControllerOptions;\n private state: QueueOwnerTurnState = \"idle\";\n private pendingCancel = false;\n private activeController?: QueueOwnerActiveSessionController;\n\n constructor(options: QueueOwnerTurnControllerOptions) {\n this.options = options;\n }\n\n get lifecycleState(): QueueOwnerTurnState {\n return this.state;\n }\n\n get hasPendingCancel(): boolean {\n return this.pendingCancel;\n }\n\n beginTurn(): void {\n this.state = \"starting\";\n this.pendingCancel = false;\n }\n\n markPromptActive(): void {\n if (this.state === \"starting\" || this.state === \"active\") {\n this.state = \"active\";\n }\n }\n\n endTurn(): void {\n this.state = \"idle\";\n this.pendingCancel = false;\n }\n\n beginClosing(): void {\n this.state = \"closing\";\n this.pendingCancel = false;\n this.activeController = undefined;\n }\n\n setActiveController(controller: QueueOwnerActiveSessionController): void {\n this.activeController = controller;\n }\n\n clearActiveController(): void {\n this.activeController = undefined;\n }\n\n private assertCanHandleControlRequest(): void {\n if (this.state === \"closing\") {\n throw new QueueConnectionError(\"Queue owner is closing\", {\n detailCode: \"QUEUE_OWNER_SHUTTING_DOWN\",\n origin: \"queue\",\n retryable: true,\n });\n }\n }\n\n async requestCancel(): Promise<boolean> {\n const activeController = this.activeController;\n if (activeController?.hasActivePrompt()) {\n const cancelled = await activeController.requestCancelActivePrompt();\n if (cancelled) {\n this.pendingCancel = false;\n }\n return cancelled;\n }\n\n if (this.state === \"starting\" || this.state === \"active\") {\n this.pendingCancel = true;\n return true;\n }\n\n return false;\n }\n\n async applyPendingCancel(): Promise<boolean> {\n const activeController = this.activeController;\n if (!this.pendingCancel || !activeController || !activeController.hasActivePrompt()) {\n return false;\n }\n\n const cancelled = await activeController.requestCancelActivePrompt();\n if (cancelled) {\n this.pendingCancel = false;\n }\n return cancelled;\n }\n\n async setSessionMode(modeId: string, timeoutMs?: number): Promise<void> {\n this.assertCanHandleControlRequest();\n const activeController = this.activeController;\n if (activeController) {\n await this.options.withTimeout(\n async () => await activeController.setSessionMode(modeId),\n timeoutMs,\n );\n return;\n }\n\n await this.options.setSessionModeFallback(modeId, timeoutMs);\n }\n\n async setSessionModel(modelId: string, timeoutMs?: number): Promise<void> {\n this.assertCanHandleControlRequest();\n const activeController = this.activeController;\n if (activeController) {\n await this.options.withTimeout(\n async () => await activeController.setSessionModel(modelId),\n timeoutMs,\n );\n return;\n }\n\n await this.options.setSessionModelFallback(modelId, timeoutMs);\n }\n\n async setSessionConfigOption(\n configId: string,\n value: string,\n timeoutMs?: number,\n ): Promise<SetSessionConfigOptionResponse> {\n this.assertCanHandleControlRequest();\n const activeController = this.activeController;\n if (activeController) {\n return await this.options.withTimeout(\n async () => await activeController.setSessionConfigOption(configId, value),\n timeoutMs,\n );\n }\n\n return await this.options.setSessionConfigOptionFallback(configId, value, timeoutMs);\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { realpathSync } from \"node:fs\";\nimport type { SessionAgentOptions } from \"../../runtime/engine/session-options.js\";\nimport type {\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n PermissionMode,\n} from \"../../types.js\";\n\nexport type QueueOwnerRuntimeOptions = {\n sessionId: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n promptRetries?: number;\n sessionOptions?: SessionAgentOptions;\n};\n\ntype SessionSendLike = {\n sessionId: string;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n ttlMs?: number;\n maxQueueDepth?: number;\n promptRetries?: number;\n sessionOptions?: SessionAgentOptions;\n};\n\nexport function sanitizeQueueOwnerExecArgv(\n execArgv: readonly string[] = process.execArgv,\n): string[] {\n const sanitized: string[] = [];\n for (let index = 0; index < execArgv.length; index += 1) {\n const value = execArgv[index];\n if (value === \"--experimental-test-coverage\" || value === \"--test\") {\n continue;\n }\n if (\n value === \"--test-name-pattern\" ||\n value === \"--test-reporter\" ||\n value === \"--test-reporter-destination\"\n ) {\n index += 1;\n continue;\n }\n if (value.startsWith(\"--test-\")) {\n continue;\n }\n if (\n value === \"--inspect\" ||\n value === \"--inspect-brk\" ||\n value === \"--inspect-port\" ||\n value === \"--inspect-publish-uid\" ||\n value.startsWith(\"--inspect=\") ||\n value.startsWith(\"--inspect-brk=\") ||\n value.startsWith(\"--inspect-port=\") ||\n value.startsWith(\"--inspect-publish-uid=\") ||\n value === \"--debug-port\" ||\n value.startsWith(\"--debug-port=\")\n ) {\n if (\n value === \"--inspect\" ||\n value === \"--inspect-brk\" ||\n value === \"--inspect-port\" ||\n value === \"--inspect-publish-uid\" ||\n value === \"--debug-port\"\n ) {\n index += 1;\n }\n continue;\n }\n sanitized.push(value);\n }\n return sanitized;\n}\n\nexport function buildQueueOwnerArgOverride(\n entryPath: string,\n execArgv: readonly string[] = process.execArgv,\n): string | null {\n const sanitized = sanitizeQueueOwnerExecArgv(execArgv);\n if (sanitized.length === 0) {\n return null;\n }\n return JSON.stringify([...sanitized, entryPath, \"__queue-owner\"]);\n}\n\nexport function resolveQueueOwnerSpawnArgs(argv: readonly string[] = process.argv): string[] {\n const override = process.env.ACPX_QUEUE_OWNER_ARGS;\n if (override) {\n const parsed = JSON.parse(override) as unknown;\n if (\n Array.isArray(parsed) &&\n parsed.length > 0 &&\n parsed.every((value) => typeof value === \"string\" && value.length > 0)\n ) {\n return [...parsed];\n }\n throw new Error(\"acpx self-spawn failed: invalid ACPX_QUEUE_OWNER_ARGS\");\n }\n\n const entry = argv[1];\n if (!entry || entry.trim().length === 0) {\n throw new Error(\"acpx self-spawn failed: missing CLI entry path\");\n }\n const resolvedEntry = realpathSync(entry);\n return [resolvedEntry, \"__queue-owner\"];\n}\n\nexport function queueOwnerRuntimeOptionsFromSend(\n options: SessionSendLike,\n): QueueOwnerRuntimeOptions {\n return {\n sessionId: options.sessionId,\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n ttlMs: options.ttlMs,\n maxQueueDepth: options.maxQueueDepth,\n promptRetries: options.promptRetries,\n sessionOptions: options.sessionOptions,\n };\n}\n\nexport function buildQueueOwnerSpawnOptions(payload: string): {\n detached: true;\n stdio: \"ignore\";\n env: NodeJS.ProcessEnv;\n windowsHide: true;\n} {\n return {\n detached: true,\n stdio: \"ignore\",\n env: {\n ...process.env,\n ACPX_QUEUE_OWNER_PAYLOAD: payload,\n },\n windowsHide: true,\n };\n}\n\nexport function spawnQueueOwnerProcess(options: QueueOwnerRuntimeOptions): void {\n const payload = JSON.stringify(options);\n const child = spawn(\n process.execPath,\n resolveQueueOwnerSpawnArgs(),\n buildQueueOwnerSpawnOptions(payload),\n );\n child.unref();\n}\n","import fs from \"node:fs/promises\";\nimport { isAcpJsonRpcMessage } from \"../acp/jsonrpc.js\";\nimport { isProcessAlive } from \"../cli/queue/lease-store.js\";\nimport { incrementPerfCounter, measurePerf } from \"../perf-metrics.js\";\nimport type { AcpJsonRpcMessage, SessionRecord } from \"../types.js\";\nimport {\n DEFAULT_EVENT_MAX_SEGMENTS,\n DEFAULT_EVENT_SEGMENT_MAX_BYTES,\n sessionBaseDir,\n sessionEventActivePath as activeEventPath,\n sessionEventLockPath as eventsLockPath,\n sessionEventSegmentPath as segmentEventPath,\n} from \"./event-log.js\";\nimport { resolveSessionRecord, writeSessionRecord } from \"./persistence.js\";\n\nconst LOCK_RETRY_MS = 15;\nconst EVENT_LOCK_STALE_MS = 15_000;\n\nasync function ensureSessionDir(): Promise<void> {\n await fs.mkdir(sessionBaseDir(), { recursive: true });\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function statSize(filePath: string): Promise<number> {\n try {\n const stats = await fs.stat(filePath);\n return stats.size;\n } catch {\n return 0;\n }\n}\n\nasync function countExistingSegments(sessionId: string, maxSegments: number): Promise<number> {\n let count = 0;\n\n for (let segment = 1; segment <= maxSegments; segment += 1) {\n if (await pathExists(segmentEventPath(sessionId, segment))) {\n count += 1;\n }\n }\n\n if (await pathExists(activeEventPath(sessionId))) {\n count += 1;\n }\n\n return count;\n}\n\nasync function resolveSessionMaxSegments(sessionId: string): Promise<number> {\n try {\n const record = await resolveSessionRecord(sessionId);\n const configured = record.eventLog.max_segments;\n if (Number.isInteger(configured) && configured > 0) {\n return configured;\n }\n } catch {\n // Fall back to defaults when metadata is unavailable.\n }\n\n return DEFAULT_EVENT_MAX_SEGMENTS;\n}\n\nasync function rotateSegments(sessionId: string, maxSegments: number): Promise<void> {\n const active = activeEventPath(sessionId);\n\n const overflow = segmentEventPath(sessionId, maxSegments);\n await fs.unlink(overflow).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n\n for (let segment = maxSegments - 1; segment >= 1; segment -= 1) {\n const from = segmentEventPath(sessionId, segment);\n const to = segmentEventPath(sessionId, segment + 1);\n if (!(await pathExists(from))) {\n continue;\n }\n await fs.rename(from, to);\n }\n\n if (await pathExists(active)) {\n await fs.rename(active, segmentEventPath(sessionId, 1));\n }\n}\n\ntype LockHandle = {\n filePath: string;\n};\n\ntype EventLockPayload = {\n pid?: number;\n created_at?: string;\n};\n\nfunction parseEventLockPayload(raw: string): EventLockPayload {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {};\n }\n const record = parsed as Record<string, unknown>;\n return {\n pid: typeof record.pid === \"number\" ? record.pid : undefined,\n created_at: typeof record.created_at === \"string\" ? record.created_at : undefined,\n };\n } catch {\n return {};\n }\n}\n\nasync function removeStaleEventLock(lockPath: string): Promise<boolean> {\n try {\n const payload = await fs.readFile(lockPath, \"utf8\");\n const parsed = parseEventLockPayload(payload);\n const createdAtMs = parsed.created_at ? Date.parse(parsed.created_at) : Number.NaN;\n const lockAgeMs = Number.isFinite(createdAtMs)\n ? Date.now() - createdAtMs\n : Number.POSITIVE_INFINITY;\n const pidAlive = isProcessAlive(parsed.pid);\n if (pidAlive && lockAgeMs <= EVENT_LOCK_STALE_MS) {\n return false;\n }\n await fs.unlink(lockPath);\n incrementPerfCounter(\"session.events.stale_lock_recovered\");\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return true;\n }\n return false;\n }\n}\n\nasync function acquireEventsLock(sessionId: string): Promise<LockHandle> {\n await ensureSessionDir();\n const lockPath = eventsLockPath(sessionId);\n const payload = JSON.stringify(\n {\n pid: process.pid,\n created_at: new Date().toISOString(),\n },\n null,\n 2,\n );\n\n for (;;) {\n try {\n await fs.writeFile(lockPath, `${payload}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n return { filePath: lockPath };\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"EEXIST\") {\n throw error;\n }\n const recovered = await removeStaleEventLock(lockPath);\n if (recovered) {\n continue;\n }\n await new Promise<void>((resolve) => {\n setTimeout(resolve, LOCK_RETRY_MS);\n });\n }\n }\n}\n\nasync function releaseEventsLock(lock: LockHandle): Promise<void> {\n await fs.unlink(lock.filePath).catch((error) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n}\n\ntype SessionEventWriterOptions = {\n maxSegmentBytes?: number;\n maxSegments?: number;\n};\n\ntype AppendOptions = {\n checkpoint?: boolean;\n};\n\nexport class SessionEventWriter {\n private readonly record: SessionRecord;\n private readonly lock: LockHandle;\n private readonly maxSegmentBytes: number;\n private readonly maxSegments: number;\n private activePath: string;\n private activeSizeBytes: number;\n private segmentCount: number;\n private closed = false;\n\n private constructor(\n record: SessionRecord,\n lock: LockHandle,\n options: Required<SessionEventWriterOptions>,\n state: {\n activePath: string;\n activeSizeBytes: number;\n segmentCount: number;\n },\n ) {\n this.record = record;\n this.lock = lock;\n this.maxSegmentBytes = options.maxSegmentBytes;\n this.maxSegments = options.maxSegments;\n this.activePath = state.activePath;\n this.activeSizeBytes = state.activeSizeBytes;\n this.segmentCount = state.segmentCount;\n }\n\n static async open(\n record: SessionRecord,\n options: SessionEventWriterOptions = {},\n ): Promise<SessionEventWriter> {\n const lock = await acquireEventsLock(record.acpxRecordId);\n const maxSegmentBytes =\n options.maxSegmentBytes ??\n record.eventLog.max_segment_bytes ??\n DEFAULT_EVENT_SEGMENT_MAX_BYTES;\n const maxSegments =\n options.maxSegments ?? record.eventLog.max_segments ?? DEFAULT_EVENT_MAX_SEGMENTS;\n const activePath = activeEventPath(record.acpxRecordId);\n const activeSizeBytes = await statSize(activePath);\n const segmentCount =\n Number.isInteger(record.eventLog.segment_count) && record.eventLog.segment_count > 0\n ? record.eventLog.segment_count\n : (await countExistingSegments(record.acpxRecordId, maxSegments)) || 1;\n return new SessionEventWriter(\n record,\n lock,\n {\n maxSegmentBytes,\n maxSegments,\n },\n {\n activePath,\n activeSizeBytes,\n segmentCount,\n },\n );\n }\n\n getRecord(): SessionRecord {\n return this.record;\n }\n\n async appendMessage(message: AcpJsonRpcMessage, options: AppendOptions = {}): Promise<void> {\n await this.appendMessages([message], options);\n }\n\n async appendMessages(messages: AcpJsonRpcMessage[], options: AppendOptions = {}): Promise<void> {\n if (this.closed) {\n throw new Error(\"SessionEventWriter is closed\");\n }\n\n if (messages.length === 0) {\n return;\n }\n\n await ensureSessionDir();\n\n await measurePerf(\"session.events.append_batch\", async () => {\n for (const message of messages) {\n if (!isAcpJsonRpcMessage(message)) {\n throw new Error(\"Attempted to persist invalid ACP JSON-RPC payload\");\n }\n\n const line = `${JSON.stringify(message)}\\n`;\n const lineBytes = Buffer.byteLength(line);\n if (this.activeSizeBytes > 0 && this.activeSizeBytes + lineBytes > this.maxSegmentBytes) {\n await rotateSegments(this.record.acpxRecordId, this.maxSegments);\n this.activePath = activeEventPath(this.record.acpxRecordId);\n this.activeSizeBytes = 0;\n this.segmentCount = Math.min(this.segmentCount + 1, this.maxSegments);\n incrementPerfCounter(\"session.events.rotate\");\n }\n\n await fs.appendFile(this.activePath, line, \"utf8\");\n this.activeSizeBytes += lineBytes;\n\n this.record.lastSeq += 1;\n if (Object.hasOwn(message, \"id\")) {\n const id = (message as { id?: unknown }).id;\n if (typeof id === \"string\" || typeof id === \"number\") {\n this.record.lastRequestId = String(id);\n }\n }\n const writeTs = new Date().toISOString();\n this.record.lastUsedAt = writeTs;\n this.record.eventLog = {\n active_path: this.activePath,\n segment_count: this.segmentCount,\n max_segment_bytes: this.maxSegmentBytes,\n max_segments: this.maxSegments,\n last_write_at: writeTs,\n last_write_error: null,\n };\n }\n });\n\n if (options.checkpoint === true) {\n await writeSessionRecord(this.record);\n }\n }\n\n async checkpoint(): Promise<void> {\n if (this.closed) {\n throw new Error(\"SessionEventWriter is closed\");\n }\n await writeSessionRecord(this.record);\n }\n\n async close(options: AppendOptions = {}): Promise<void> {\n if (this.closed) {\n return;\n }\n\n try {\n if (options.checkpoint !== false) {\n await writeSessionRecord(this.record);\n }\n } finally {\n this.closed = true;\n await releaseEventsLock(this.lock);\n }\n }\n}\n\nexport async function listSessionEvents(sessionId: string): Promise<AcpJsonRpcMessage[]> {\n const maxSegments = await resolveSessionMaxSegments(sessionId);\n const files: string[] = [];\n\n for (let segment = maxSegments; segment >= 1; segment -= 1) {\n const filePath = segmentEventPath(sessionId, segment);\n if (await pathExists(filePath)) {\n files.push(filePath);\n }\n }\n\n const active = activeEventPath(sessionId);\n if (await pathExists(active)) {\n files.push(active);\n }\n\n const events: AcpJsonRpcMessage[] = [];\n for (const filePath of files) {\n const payload = await fs.readFile(filePath, \"utf8\");\n const lines = payload.split(\"\\n\").filter((line) => line.trim().length > 0);\n for (const line of lines) {\n try {\n const parsed = JSON.parse(line);\n if (isAcpJsonRpcMessage(parsed)) {\n events.push(parsed);\n }\n } catch {\n // Skip malformed lines to keep event listing resilient.\n }\n }\n }\n\n return events;\n}\n","import { AcpClient } from \"../../acp/client.js\";\nimport {\n formatErrorMessage,\n isRetryablePromptError,\n normalizeOutputError,\n} from \"../../acp/error-normalization.js\";\nimport { assertRequestedModelSupported } from \"../../acp/model-support.js\";\nimport { InterruptedError, withInterrupt, withTimeout } from \"../../async-control.js\";\nexport { InterruptedError, TimeoutError } from \"../../async-control.js\";\nimport { formatPerfMetric, measurePerf, startPerfTimer } from \"../../perf-metrics.js\";\nimport { textPrompt } from \"../../prompt-content.js\";\nimport {\n applyConversation,\n applyLifecycleSnapshotToRecord,\n} from \"../../runtime/engine/lifecycle.js\";\nimport { runPromptTurn } from \"../../runtime/engine/prompt-turn.js\";\nimport { connectAndLoadSession } from \"../../runtime/engine/reconnect.js\";\nimport {\n mergeSessionOptions,\n sessionOptionsFromRecord,\n type SessionAgentOptions,\n} from \"../../runtime/engine/session-options.js\";\nimport {\n cloneSessionAcpxState,\n cloneSessionConversation,\n recordClientOperation as recordConversationClientOperation,\n recordPromptSubmission,\n recordSessionUpdate as recordConversationSessionUpdate,\n trimConversationForRuntime,\n} from \"../../session/conversation-model.js\";\nimport { SessionEventWriter } from \"../../session/events.js\";\nimport { setCurrentModelId, setDesiredModelId } from \"../../session/mode-preference.js\";\nimport {\n absolutePath,\n isoNow,\n resolveSessionRecord,\n writeSessionRecord,\n} from \"../../session/persistence.js\";\nimport type {\n AcpJsonRpcMessage,\n AuthPolicy,\n McpServer,\n NonInteractivePermissionPolicy,\n OutputErrorAcpPayload,\n OutputErrorCode,\n OutputErrorOrigin,\n OutputFormatter,\n RunPromptResult,\n SessionRecord,\n SessionSendResult,\n} from \"../../types.js\";\nimport { type QueueOwnerMessage, type QueueTask, waitMs } from \"../queue/ipc.js\";\nimport { type QueueOwnerActiveSessionController } from \"../queue/owner-turn-controller.js\";\nimport type { RunOnceOptions, SessionSendOptions } from \"./contracts.js\";\nimport { applyRequestedModelIfAdvertised } from \"./model-helpers.js\";\n\nconst INTERRUPT_CANCEL_WAIT_MS = 2_500;\n\ntype RunSessionPromptOptions = Omit<\n SessionSendOptions,\n \"errorEmissionPolicy\" | \"maxQueueDepth\" | \"sessionId\" | \"ttlMs\" | \"waitForCompletion\"\n> & {\n sessionRecordId: string;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n onPromptActive?: () => Promise<void> | void;\n};\n\ntype ActiveSessionController = QueueOwnerActiveSessionController;\n\nclass QueueTaskOutputFormatter implements OutputFormatter {\n private readonly requestId: string;\n private readonly send: (message: QueueOwnerMessage) => void;\n\n constructor(task: QueueTask) {\n this.requestId = task.requestId;\n this.send = task.send;\n }\n\n setContext(_context: { sessionId: string }): void {}\n\n onAcpMessage(message: AcpJsonRpcMessage): void {\n this.send({\n type: \"event\",\n requestId: this.requestId,\n message,\n });\n }\n\n onError(params: {\n code: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n timestamp?: string;\n }): void {\n this.send({\n type: \"error\",\n requestId: this.requestId,\n code: params.code,\n detailCode: params.detailCode,\n origin: params.origin,\n message: params.message,\n retryable: params.retryable,\n acp: params.acp,\n });\n }\n\n flush(): void {}\n}\n\nconst DISCARD_OUTPUT_FORMATTER: OutputFormatter = {\n setContext() {},\n onAcpMessage() {},\n onError() {},\n flush() {},\n};\n\nfunction toPromptResult(\n stopReason: RunPromptResult[\"stopReason\"],\n sessionId: string,\n client: AcpClient,\n): RunPromptResult {\n return {\n stopReason,\n sessionId,\n permissionStats: client.getPermissionStats(),\n };\n}\n\nasync function applyPromptModelIfAdvertised(params: {\n client: AcpClient;\n sessionId: string;\n requestedModel: string | undefined;\n record: SessionRecord;\n timeoutMs?: number;\n}): Promise<void> {\n const requestedModel =\n typeof params.requestedModel === \"string\" ? params.requestedModel.trim() : \"\";\n if (!requestedModel) {\n return;\n }\n\n const availableModels = params.record.acpx?.available_models;\n assertRequestedModelSupported({\n requestedModel,\n models: Array.isArray(availableModels)\n ? {\n currentModelId: params.record.acpx?.current_model_id ?? \"\",\n availableModels: availableModels.map((modelId) => ({ modelId, name: modelId })),\n }\n : undefined,\n agentCommand: params.record.agentCommand,\n context: \"apply\",\n });\n if (!Array.isArray(availableModels)) {\n return;\n }\n if (params.record.acpx?.current_model_id === requestedModel) {\n setDesiredModelId(params.record, requestedModel);\n return;\n }\n\n await withTimeout(\n params.client.setSessionModel(params.sessionId, requestedModel),\n params.timeoutMs,\n );\n setDesiredModelId(params.record, requestedModel);\n setCurrentModelId(params.record, requestedModel);\n}\n\nfunction jsonRpcIdKey(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return `s:${value}`;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return `n:${value}`;\n }\n return undefined;\n}\n\nfunction extractJsonRpcRequestInfo(\n message: AcpJsonRpcMessage,\n): { idKey: string; method: string } | undefined {\n const candidate = message as { method?: unknown; id?: unknown };\n if (typeof candidate.method !== \"string\") {\n return undefined;\n }\n const idKey = jsonRpcIdKey(candidate.id);\n if (!idKey) {\n return undefined;\n }\n return {\n idKey,\n method: candidate.method,\n };\n}\n\nfunction extractJsonRpcResponseInfo(\n message: AcpJsonRpcMessage,\n): { idKey: string; hasError: boolean } | undefined {\n const candidate = message as { id?: unknown; error?: unknown; result?: unknown };\n const idKey = jsonRpcIdKey(candidate.id);\n if (!idKey) {\n return undefined;\n }\n const hasError = Object.hasOwn(candidate, \"error\");\n const hasResult = Object.hasOwn(candidate, \"result\");\n if (!hasError && !hasResult) {\n return undefined;\n }\n return {\n idKey,\n hasError,\n };\n}\n\nfunction filterRecoverableLoadFallbackOutput(messages: AcpJsonRpcMessage[]): AcpJsonRpcMessage[] {\n const requestMethodById = new Map<string, string>();\n const failedLoadRequestIds = new Set<string>();\n\n for (const message of messages) {\n const request = extractJsonRpcRequestInfo(message);\n if (request) {\n requestMethodById.set(request.idKey, request.method);\n continue;\n }\n\n const response = extractJsonRpcResponseInfo(message);\n if (!response || !response.hasError) {\n continue;\n }\n\n if (requestMethodById.get(response.idKey) === \"session/load\") {\n failedLoadRequestIds.add(response.idKey);\n }\n }\n\n if (failedLoadRequestIds.size === 0) {\n return messages;\n }\n\n return messages.filter((message) => {\n const request = extractJsonRpcRequestInfo(message);\n if (request && request.method === \"session/load\" && failedLoadRequestIds.has(request.idKey)) {\n return false;\n }\n\n const response = extractJsonRpcResponseInfo(message);\n if (response && failedLoadRequestIds.has(response.idKey)) {\n return false;\n }\n\n return true;\n });\n}\n\nfunction emitPromptRetryNotice(params: {\n error: unknown;\n delayMs: number;\n attempt: number;\n maxRetries: number;\n suppressSdkConsoleErrors?: boolean;\n}): void {\n if (params.suppressSdkConsoleErrors) {\n return;\n }\n\n process.stderr.write(\n `[acpx] prompt failed (${formatErrorMessage(params.error)}), retrying in ${params.delayMs}ms ` +\n `(attempt ${params.attempt}/${params.maxRetries})\\n`,\n );\n}\n\nexport async function runQueuedTask(\n sessionRecordId: string,\n task: QueueTask,\n options: {\n sharedClient?: AcpClient;\n verbose?: boolean;\n mcpServers?: McpServer[];\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n suppressSdkConsoleErrors?: boolean;\n promptRetries?: number;\n sessionOptions?: SessionAgentOptions;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n onPromptActive?: () => Promise<void> | void;\n },\n): Promise<void> {\n const outputFormatter = task.waitForCompletion\n ? new QueueTaskOutputFormatter(task)\n : DISCARD_OUTPUT_FORMATTER;\n\n try {\n const result = await runSessionPrompt({\n sessionRecordId,\n mcpServers: options.mcpServers,\n prompt: task.prompt ?? textPrompt(task.message),\n permissionMode: task.permissionMode,\n resumePolicy: task.resumePolicy,\n nonInteractivePermissions:\n task.nonInteractivePermissions ?? options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n outputFormatter,\n timeoutMs: task.timeoutMs,\n suppressSdkConsoleErrors: task.suppressSdkConsoleErrors ?? options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n promptRetries: options.promptRetries,\n sessionOptions: mergeSessionOptions(task.sessionOptions, options.sessionOptions),\n onClientAvailable: options.onClientAvailable,\n onClientClosed: options.onClientClosed,\n onPromptActive: options.onPromptActive,\n client: options.sharedClient,\n });\n\n if (task.waitForCompletion) {\n task.send({\n type: \"result\",\n requestId: task.requestId,\n result,\n });\n }\n } catch (error) {\n const normalizedError = normalizeOutputError(error, {\n origin: \"runtime\",\n detailCode: \"QUEUE_RUNTIME_PROMPT_FAILED\",\n });\n const alreadyEmitted =\n (error as { outputAlreadyEmitted?: unknown }).outputAlreadyEmitted === true;\n if (task.waitForCompletion) {\n task.send({\n type: \"error\",\n requestId: task.requestId,\n code: normalizedError.code,\n detailCode: normalizedError.detailCode,\n origin: normalizedError.origin,\n message: normalizedError.message,\n retryable: normalizedError.retryable,\n acp: normalizedError.acp,\n outputAlreadyEmitted: alreadyEmitted,\n });\n }\n\n if (error instanceof InterruptedError) {\n throw error;\n }\n } finally {\n task.close();\n }\n}\n\nasync function runSessionPrompt(options: RunSessionPromptOptions): Promise<SessionSendResult> {\n const stopTotalTimer = startPerfTimer(\"runtime.prompt.total\");\n const output = options.outputFormatter;\n const record = await measurePerf(\"session.resolve_prompt_record\", async () => {\n return await resolveSessionRecord(options.sessionRecordId);\n });\n const conversation = cloneSessionConversation(record);\n let acpxState = cloneSessionAcpxState(record.acpx);\n const promptStartedAt = isoNow();\n const promptMessageId = recordPromptSubmission(conversation, options.prompt, promptStartedAt);\n record.lastPromptAt = promptStartedAt;\n record.lastUsedAt = promptStartedAt;\n applyConversation(record, conversation);\n record.acpx = acpxState;\n await writeSessionRecord(record);\n\n output.setContext({\n sessionId: record.acpxRecordId,\n });\n\n const eventWriter = await measurePerf(\"session.events.open\", async () => {\n return await SessionEventWriter.open(record);\n });\n const pendingMessages: AcpJsonRpcMessage[] = [];\n const pendingConnectOutputMessages: AcpJsonRpcMessage[] = [];\n const sessionOptions = mergeSessionOptions(\n options.sessionOptions,\n sessionOptionsFromRecord(record),\n );\n let bufferingConnectOutput = true;\n let promptTurnActive = false;\n let promptTurnHadSideEffects = false;\n let sawAcpMessage = false;\n let eventWriterClosed = false;\n\n const closeEventWriter = async (checkpoint: boolean): Promise<void> => {\n if (eventWriterClosed) {\n return;\n }\n eventWriterClosed = true;\n await eventWriter.close({ checkpoint });\n };\n\n const flushPendingMessages = async (checkpoint = false): Promise<void> => {\n if (pendingMessages.length === 0) {\n return;\n }\n\n const batch = pendingMessages.splice(0);\n await measurePerf(\"session.events.flush_pending\", async () => {\n await eventWriter.appendMessages(batch, { checkpoint });\n });\n };\n\n const ownClient = options.client == null;\n const client =\n options.client ??\n new AcpClient({\n agentCommand: record.agentCommand,\n cwd: absolutePath(record.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n sessionOptions,\n });\n client.updateRuntimeOptions({\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n terminal: options.terminal,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n });\n client.setEventHandlers({\n onAcpMessage: (direction, message) => {\n sawAcpMessage = true;\n pendingMessages.push(message);\n options.onAcpMessage?.(direction, message);\n },\n onAcpOutputMessage: (_direction, message) => {\n if (bufferingConnectOutput) {\n pendingConnectOutputMessages.push(message);\n return;\n }\n output.onAcpMessage(message);\n },\n onSessionUpdate: (notification) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n acpxState = recordConversationSessionUpdate(conversation, acpxState, notification);\n trimConversationForRuntime(conversation);\n options.onSessionUpdate?.(notification);\n },\n onClientOperation: (operation) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n acpxState = recordConversationClientOperation(conversation, acpxState, operation);\n trimConversationForRuntime(conversation);\n options.onClientOperation?.(operation);\n },\n });\n let activeSessionIdForControl = record.acpSessionId;\n let notifiedClientAvailable = false;\n const activeController: ActiveSessionController = {\n hasActivePrompt: () => client.hasActivePrompt(),\n requestCancelActivePrompt: async () => await client.requestCancelActivePrompt(),\n setSessionMode: async (modeId: string) => {\n await client.setSessionMode(activeSessionIdForControl, modeId);\n },\n setSessionModel: async (modelId: string) => {\n await client.setSessionModel(activeSessionIdForControl, modelId);\n },\n setSessionConfigOption: async (configId: string, value: string) => {\n return await client.setSessionConfigOption(activeSessionIdForControl, configId, value);\n },\n };\n\n try {\n return await withInterrupt(\n async () => {\n const connectStartedAt = Date.now();\n const {\n sessionId: activeSessionId,\n resumed,\n loadError,\n } = await measurePerf(\"runtime.connect_and_load\", async () => {\n try {\n return await connectAndLoadSession({\n client,\n record,\n resumePolicy: options.resumePolicy,\n timeoutMs: options.timeoutMs,\n verbose: options.verbose,\n activeController,\n onClientAvailable: (controller) => {\n options.onClientAvailable?.(controller);\n notifiedClientAvailable = true;\n },\n onConnectedRecord: (connectedRecord) => {\n connectedRecord.lastPromptAt = isoNow();\n },\n onSessionIdResolved: (sessionId) => {\n activeSessionIdForControl = sessionId;\n },\n });\n } catch (error) {\n bufferingConnectOutput = false;\n for (const message of pendingConnectOutputMessages) {\n output.onAcpMessage(message);\n }\n pendingConnectOutputMessages.length = 0;\n throw error;\n }\n });\n bufferingConnectOutput = false;\n const connectOutputMessages =\n loadError == null\n ? pendingConnectOutputMessages\n : filterRecoverableLoadFallbackOutput(pendingConnectOutputMessages);\n for (const message of connectOutputMessages) {\n output.onAcpMessage(message);\n }\n pendingConnectOutputMessages.length = 0;\n if (options.verbose) {\n process.stderr.write(\n `[acpx] ${formatPerfMetric(\"prompt.connect_and_load\", Date.now() - connectStartedAt)}\\n`,\n );\n }\n\n await applyPromptModelIfAdvertised({\n client,\n sessionId: activeSessionId,\n requestedModel: sessionOptions?.model,\n record,\n timeoutMs: options.timeoutMs,\n });\n\n output.setContext({\n sessionId: record.acpxRecordId,\n });\n await flushPendingMessages(false);\n\n const maxRetries = options.promptRetries ?? 0;\n let response;\n promptTurnActive = true;\n for (let attempt = 0; ; attempt++) {\n try {\n const promptStartedAt = Date.now();\n response = await measurePerf(\"runtime.prompt.agent_turn\", async () => {\n return await runPromptTurn({\n client,\n sessionId: activeSessionId,\n prompt: options.prompt,\n timeoutMs: options.timeoutMs,\n conversation,\n promptMessageId,\n onPromptStarted:\n attempt === 0 && options.onPromptActive\n ? async () => {\n try {\n await options.onPromptActive?.();\n } catch (error) {\n if (options.verbose) {\n process.stderr.write(\n \"[acpx] onPromptActive hook failed: \" +\n formatErrorMessage(error) +\n \"\\n\",\n );\n }\n }\n }\n : undefined,\n });\n });\n if (options.verbose) {\n process.stderr.write(\n `[acpx] ${formatPerfMetric(\"prompt.agent_turn\", Date.now() - promptStartedAt)}\\n`,\n );\n }\n break;\n } catch (error) {\n const snapshot = client.getAgentLifecycleSnapshot();\n const agentCrashed = snapshot.lastExit?.unexpectedDuringPrompt === true;\n\n if (\n attempt < maxRetries &&\n !agentCrashed &&\n !promptTurnHadSideEffects &&\n isRetryablePromptError(error)\n ) {\n const delayMs = Math.min(1_000 * 2 ** attempt, 10_000);\n emitPromptRetryNotice({\n error,\n delayMs,\n attempt: attempt + 1,\n maxRetries,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n });\n await waitMs(delayMs);\n if (!promptTurnHadSideEffects) {\n continue;\n }\n }\n\n promptTurnActive = false;\n applyLifecycleSnapshotToRecord(record, snapshot);\n const lastExit = snapshot.lastExit;\n if (lastExit?.unexpectedDuringPrompt && options.verbose) {\n process.stderr.write(\n \"[acpx] agent disconnected during prompt (\" +\n lastExit.reason +\n \", exit=\" +\n lastExit.exitCode +\n \", signal=\" +\n (lastExit.signal ?? \"none\") +\n \")\\n\",\n );\n }\n\n const normalizedError = normalizeOutputError(error, {\n origin: \"runtime\",\n });\n\n await flushPendingMessages(false).catch(() => {\n // best effort while bubbling prompt failure\n });\n\n output.flush();\n\n record.lastUsedAt = isoNow();\n applyConversation(record, conversation);\n record.acpx = acpxState;\n\n const propagated =\n error instanceof Error ? error : new Error(formatErrorMessage(error));\n (propagated as { outputAlreadyEmitted?: boolean }).outputAlreadyEmitted = sawAcpMessage;\n (propagated as { normalizedOutputError?: unknown }).normalizedOutputError =\n normalizedError;\n throw propagated;\n }\n }\n promptTurnActive = false;\n\n await flushPendingMessages(false);\n output.flush();\n\n const now = isoNow();\n record.lastUsedAt = now;\n record.closed = false;\n record.closedAt = undefined;\n record.protocolVersion = client.initializeResult?.protocolVersion;\n record.agentCapabilities = client.initializeResult?.agentCapabilities;\n applyConversation(record, conversation);\n record.acpx = acpxState;\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n stopTotalTimer();\n\n return {\n ...toPromptResult(response.stopReason, record.acpxRecordId, client),\n record,\n resumed,\n loadError,\n };\n },\n async () => {\n await client.cancelActivePrompt(INTERRUPT_CANCEL_WAIT_MS);\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n record.lastUsedAt = isoNow();\n applyConversation(record, conversation);\n record.acpx = acpxState;\n await flushPendingMessages(false).catch(() => {\n // best effort while process is being interrupted\n });\n if (ownClient) {\n await client.close();\n }\n },\n );\n } finally {\n if (options.verbose) {\n process.stderr.write(`[acpx] ${formatPerfMetric(\"prompt.total\", stopTotalTimer())}\\n`);\n } else {\n stopTotalTimer();\n }\n if (notifiedClientAvailable) {\n options.onClientClosed?.();\n }\n client.clearEventHandlers();\n if (ownClient) {\n await client.close();\n }\n applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());\n applyConversation(record, conversation);\n record.acpx = acpxState;\n await flushPendingMessages(false).catch(() => {\n // best effort on close\n });\n await closeEventWriter(true).catch(() => {\n // best effort on close\n });\n }\n}\n\nexport async function runOnce(options: RunOnceOptions): Promise<RunPromptResult> {\n const output = options.outputFormatter;\n let promptTurnActive = false;\n let promptTurnHadSideEffects = false;\n const client = new AcpClient({\n agentCommand: options.agentCommand,\n cwd: absolutePath(options.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n onAcpMessage: options.onAcpMessage,\n onAcpOutputMessage: (_direction, message) => output.onAcpMessage(message),\n onSessionUpdate: (notification) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n options.onSessionUpdate?.(notification);\n },\n onClientOperation: (operation) => {\n if (promptTurnActive) {\n promptTurnHadSideEffects = true;\n }\n options.onClientOperation?.(operation);\n },\n sessionOptions: options.sessionOptions,\n });\n\n try {\n return await withInterrupt(\n async () => {\n await measurePerf(\"runtime.exec.start\", async () => {\n await withTimeout(client.start(), options.timeoutMs);\n });\n const createdSession = await measurePerf(\"runtime.exec.create_session\", async () => {\n return await withTimeout(\n client.createSession(absolutePath(options.cwd)),\n options.timeoutMs,\n );\n });\n const sessionId = createdSession.sessionId;\n await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: createdSession.models,\n agentCommand: options.agentCommand,\n timeoutMs: options.timeoutMs,\n });\n\n output.setContext({\n sessionId,\n });\n\n const maxRetries = options.promptRetries ?? 0;\n let response;\n promptTurnActive = true;\n for (let attempt = 0; ; attempt++) {\n try {\n response = await measurePerf(\"runtime.exec.prompt\", async () => {\n return await withTimeout(client.prompt(sessionId, options.prompt), options.timeoutMs);\n });\n break;\n } catch (error) {\n if (\n attempt < maxRetries &&\n !promptTurnHadSideEffects &&\n isRetryablePromptError(error)\n ) {\n const delayMs = Math.min(1_000 * 2 ** attempt, 10_000);\n emitPromptRetryNotice({\n error,\n delayMs,\n attempt: attempt + 1,\n maxRetries,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n });\n await waitMs(delayMs);\n if (!promptTurnHadSideEffects) {\n continue;\n }\n }\n promptTurnActive = false;\n throw error;\n }\n }\n promptTurnActive = false;\n output.flush();\n return toPromptResult(response.stopReason, sessionId, client);\n },\n async () => {\n await client.cancelActivePrompt(INTERRUPT_CANCEL_WAIT_MS);\n await client.close();\n },\n );\n } finally {\n await client.close();\n }\n}\n\nexport async function sendSessionDirect(options: SessionSendOptions): Promise<SessionSendResult> {\n return await runSessionPrompt({\n sessionRecordId: options.sessionId,\n prompt: options.prompt,\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n resumePolicy: options.resumePolicy,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n outputFormatter: options.outputFormatter,\n onAcpMessage: options.onAcpMessage,\n onSessionUpdate: options.onSessionUpdate,\n onClientOperation: options.onClientOperation,\n timeoutMs: options.timeoutMs,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n client: options.client,\n });\n}\n","import { AcpClient } from \"../../acp/client.js\";\nimport { formatErrorMessage } from \"../../acp/error-normalization.js\";\nimport { withTimeout } from \"../../async-control.js\";\nimport { checkpointPerfMetricsCapture } from \"../../perf-metrics-capture.js\";\nimport { setPerfGauge } from \"../../perf-metrics.js\";\nimport { promptToDisplayText } from \"../../prompt-content.js\";\nimport { applyLifecycleSnapshotToRecord } from \"../../runtime/engine/lifecycle.js\";\nimport {\n mergeSessionOptions,\n sessionOptionsFromRecord,\n} from \"../../runtime/engine/session-options.js\";\nimport {\n absolutePath,\n resolveSessionRecord,\n writeSessionRecord,\n} from \"../../session/persistence.js\";\nimport type { SessionSendOutcome } from \"../../types.js\";\nimport {\n QUEUE_CONNECT_RETRY_MS,\n SessionQueueOwner,\n releaseQueueOwnerLease,\n tryAcquireQueueOwnerLease,\n trySubmitToRunningOwner,\n waitMs,\n} from \"../queue/ipc.js\";\nimport { refreshQueueOwnerLease } from \"../queue/lease-store.js\";\nimport { QueueOwnerTurnController } from \"../queue/owner-turn-controller.js\";\nimport {\n DEFAULT_QUEUE_OWNER_TTL_MS,\n normalizeQueueOwnerTtlMs,\n type SessionSendOptions,\n} from \"./contracts.js\";\nimport {\n runSessionSetConfigOptionDirect,\n runSessionSetModelDirect,\n runSessionSetModeDirect,\n type ActiveSessionController,\n} from \"./prompt-runner.js\";\nimport type { QueueOwnerRuntimeOptions } from \"./queue-owner-process.js\";\nimport { queueOwnerRuntimeOptionsFromSend, spawnQueueOwnerProcess } from \"./queue-owner-process.js\";\nimport { runQueuedTask } from \"./runtime.js\";\n\nconst QUEUE_OWNER_STARTUP_MAX_ATTEMPTS = 120;\nconst QUEUE_OWNER_HEARTBEAT_INTERVAL_MS = 5_000;\n\nasync function submitToRunningOwner(\n options: SessionSendOptions,\n waitForCompletion: boolean,\n): Promise<SessionSendOutcome | undefined> {\n return await trySubmitToRunningOwner({\n sessionId: options.sessionId,\n message: promptToDisplayText(options.prompt),\n prompt: options.prompt,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n outputFormatter: options.outputFormatter,\n errorEmissionPolicy: options.errorEmissionPolicy,\n timeoutMs: options.timeoutMs,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n waitForCompletion,\n verbose: options.verbose,\n sessionOptions: options.sessionOptions,\n });\n}\n\nexport async function runSessionQueueOwner(options: QueueOwnerRuntimeOptions): Promise<void> {\n const lease = await tryAcquireQueueOwnerLease(options.sessionId);\n if (!lease) {\n return;\n }\n\n const sessionRecord = await resolveSessionRecord(options.sessionId);\n let owner: SessionQueueOwner | undefined;\n let heartbeatTimer: NodeJS.Timeout | undefined;\n const sharedClient = new AcpClient({\n agentCommand: sessionRecord.agentCommand,\n cwd: absolutePath(sessionRecord.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n verbose: options.verbose,\n sessionOptions: mergeSessionOptions(\n options.sessionOptions,\n sessionOptionsFromRecord(sessionRecord),\n ),\n });\n const ttlMs = normalizeQueueOwnerTtlMs(options.ttlMs);\n const maxQueueDepth = Math.max(1, Math.round(options.maxQueueDepth ?? 16));\n const taskPollTimeoutMs = ttlMs === 0 ? undefined : ttlMs;\n const initialTaskPollTimeoutMs =\n taskPollTimeoutMs == null ? undefined : Math.max(taskPollTimeoutMs, 1_000);\n const turnController = new QueueOwnerTurnController({\n withTimeout: async (run, timeoutMs) => await withTimeout(run(), timeoutMs),\n setSessionModeFallback: async (modeId: string, timeoutMs?: number) => {\n await runSessionSetModeDirect({\n sessionRecordId: options.sessionId,\n modeId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n timeoutMs,\n verbose: options.verbose,\n });\n },\n setSessionModelFallback: async (modelId: string, timeoutMs?: number) => {\n await runSessionSetModelDirect({\n sessionRecordId: options.sessionId,\n modelId,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n timeoutMs,\n verbose: options.verbose,\n });\n },\n setSessionConfigOptionFallback: async (configId: string, value: string, timeoutMs?: number) => {\n const result = await runSessionSetConfigOptionDirect({\n sessionRecordId: options.sessionId,\n configId,\n value,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n terminal: options.terminal,\n timeoutMs,\n verbose: options.verbose,\n });\n return result.response;\n },\n });\n\n const applyPendingCancel = async (): Promise<boolean> => {\n return await turnController.applyPendingCancel();\n };\n\n const scheduleApplyPendingCancel = (): void => {\n void applyPendingCancel().catch((error) => {\n if (options.verbose) {\n process.stderr.write(\n `[acpx] failed to apply deferred cancel: ${formatErrorMessage(error)}\\n`,\n );\n }\n });\n };\n\n const setActiveController = (controller: ActiveSessionController) => {\n turnController.setActiveController(controller);\n scheduleApplyPendingCancel();\n };\n\n const clearActiveController = () => {\n turnController.clearActiveController();\n };\n\n const closeActiveBackendSession = async (timeoutMs?: number): Promise<boolean> => {\n const latestRecord = await resolveSessionRecord(options.sessionId);\n if (!sharedClient.supportsCloseSession()) {\n return false;\n }\n await withTimeout(sharedClient.closeSession(latestRecord.acpSessionId), timeoutMs);\n return true;\n };\n\n const runPromptTurn = async <T>(run: () => Promise<T>): Promise<T> => {\n turnController.beginTurn();\n try {\n return await run();\n } finally {\n turnController.endTurn();\n }\n };\n\n try {\n owner = await SessionQueueOwner.start(\n lease,\n {\n cancelPrompt: async () => {\n const accepted = await turnController.requestCancel();\n if (!accepted) {\n return false;\n }\n await applyPendingCancel();\n return true;\n },\n closeSession: async (timeoutMs?: number) => await closeActiveBackendSession(timeoutMs),\n setSessionMode: async (modeId: string, timeoutMs?: number) => {\n await turnController.setSessionMode(modeId, timeoutMs);\n },\n setSessionModel: async (modelId: string, timeoutMs?: number) => {\n await turnController.setSessionModel(modelId, timeoutMs);\n },\n setSessionConfigOption: async (configId: string, value: string, timeoutMs?: number) => {\n return await turnController.setSessionConfigOption(configId, value, timeoutMs);\n },\n },\n {\n maxQueueDepth,\n onQueueDepthChanged: (queueDepth) => {\n setPerfGauge(\"queue.owner.depth\", queueDepth);\n void refreshQueueOwnerLease(lease, { queueDepth }).catch(() => {\n // best effort heartbeat refresh while owner is live\n });\n },\n },\n );\n\n if (options.verbose) {\n process.stderr.write(\n `[acpx] queue owner ready for session ${options.sessionId} (ttlMs=${ttlMs}, maxQueueDepth=${maxQueueDepth})\\n`,\n );\n }\n await refreshQueueOwnerLease(lease, { queueDepth: owner.queueDepth() }).catch(() => {\n // best effort initial heartbeat\n });\n heartbeatTimer = setInterval(() => {\n void refreshQueueOwnerLease(lease, { queueDepth: owner?.queueDepth() ?? 0 }).catch(() => {\n // best effort heartbeat\n });\n }, QUEUE_OWNER_HEARTBEAT_INTERVAL_MS);\n\n let isFirstTask = true;\n while (true) {\n const pollTimeoutMs = isFirstTask ? initialTaskPollTimeoutMs : taskPollTimeoutMs;\n const task = await owner.nextTask(pollTimeoutMs);\n if (!task) {\n break;\n }\n isFirstTask = false;\n\n await runPromptTurn(async () => {\n try {\n await runQueuedTask(options.sessionId, task, {\n sharedClient,\n verbose: options.verbose,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n promptRetries: options.promptRetries,\n sessionOptions: options.sessionOptions,\n onClientAvailable: setActiveController,\n onClientClosed: clearActiveController,\n onPromptActive: async () => {\n turnController.markPromptActive();\n await applyPendingCancel();\n },\n });\n } finally {\n checkpointPerfMetricsCapture();\n }\n });\n }\n } finally {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n }\n turnController.beginClosing();\n if (owner) {\n await owner.close();\n }\n await sharedClient.close().catch(() => {\n // best effort while queue owner is shutting down\n });\n try {\n const record = await resolveSessionRecord(options.sessionId);\n applyLifecycleSnapshotToRecord(record, sharedClient.getAgentLifecycleSnapshot());\n await writeSessionRecord(record);\n } catch {\n // best effort — session may already be cleaned up\n }\n await releaseQueueOwnerLease(lease);\n\n if (options.verbose) {\n process.stderr.write(`[acpx] queue owner stopped for session ${options.sessionId}\\n`);\n }\n }\n}\n\nexport async function sendSession(options: SessionSendOptions): Promise<SessionSendOutcome> {\n const waitForCompletion = options.waitForCompletion !== false;\n\n const queuedToOwner = await submitToRunningOwner(options, waitForCompletion);\n if (queuedToOwner) {\n return queuedToOwner;\n }\n\n spawnQueueOwnerProcess(queueOwnerRuntimeOptionsFromSend(options));\n\n for (let attempt = 0; attempt < QUEUE_OWNER_STARTUP_MAX_ATTEMPTS; attempt += 1) {\n const queued = await submitToRunningOwner(options, waitForCompletion);\n if (queued) {\n return queued;\n }\n await waitMs(QUEUE_CONNECT_RETRY_MS);\n }\n\n throw new Error(`Session queue owner failed to start for session ${options.sessionId}`);\n}\n\nexport type { QueueOwnerRuntimeOptions };\nexport { DEFAULT_QUEUE_OWNER_TTL_MS };\n","export * from \"../cli/session/contracts.js\";\nexport * from \"../cli/session/session-management.js\";\nexport * from \"../cli/session/queue-owner-runtime.js\";\nexport * from \"../cli/session/session-control.js\";\nexport * from \"../cli/session/runtime.js\";\nexport {\n DEFAULT_HISTORY_LIMIT,\n findGitRepositoryRoot,\n findSession,\n findSessionByDirectoryWalk,\n listSessions,\n listSessionsForAgent,\n pruneSessions,\n} from \"./persistence.js\";\nexport type { PruneOptions, PruneResult } from \"./persistence.js\";\nexport { isProcessAlive } from \"../cli/queue/ipc.js\";\n"],"mappings":"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"}
|