acpx 0.5.2 → 0.6.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 +12 -4
- package/dist/{cli-ChWsO-bb.js → cli-rGyZlX2p.js} +4 -4
- package/dist/{cli-ChWsO-bb.js.map → cli-rGyZlX2p.js.map} +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +100 -24
- package/dist/cli.js.map +1 -1
- package/dist/{client-D-4_aZf2.d.ts → client-2fTFutRH.d.ts} +4 -2
- package/dist/client-2fTFutRH.d.ts.map +1 -0
- package/dist/{flags-ceSqz2T6.js → flags-DG-3Vfgg.js} +25 -6
- package/dist/flags-DG-3Vfgg.js.map +1 -0
- package/dist/{flows-_KmnuUXd.js → flows-gbxyIf6o.js} +13 -6
- package/dist/flows-gbxyIf6o.js.map +1 -0
- package/dist/flows.d.ts +2 -8
- package/dist/flows.d.ts.map +1 -1
- package/dist/flows.js +1 -1
- package/dist/{ipc-BM335WFg.js → ipc-CkAW8Qvc.js} +51 -9
- package/dist/ipc-CkAW8Qvc.js.map +1 -0
- package/dist/{output-C4QhjpM6.js → output-DmHvT8vm.js} +141 -12
- package/dist/output-DmHvT8vm.js.map +1 -0
- package/dist/{perf-metrics-D0um6IR6.js → perf-metrics-DvT_gvUh.js} +12 -2
- package/dist/perf-metrics-DvT_gvUh.js.map +1 -0
- package/dist/{prompt-turn-CXMtXBl-.js → prompt-turn-BOoZaDEq.js} +221 -38
- package/dist/prompt-turn-BOoZaDEq.js.map +1 -0
- package/dist/{render-Br-kVPK_.js → render-CyodRDtK.js} +35 -3
- package/dist/{render-Br-kVPK_.js.map → render-CyodRDtK.js.map} +1 -1
- package/dist/runtime.d.ts +84 -10
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +425 -190
- package/dist/runtime.js.map +1 -1
- package/dist/{session-BtwAKtJ3.js → session-DcIse8N0.js} +66 -15
- package/dist/session-DcIse8N0.js.map +1 -0
- package/dist/session-options-pCbHn_n7.d.ts +13 -0
- package/dist/session-options-pCbHn_n7.d.ts.map +1 -0
- package/dist/{types-yxf-gcOE.d.ts → types-CVBeQyi3.d.ts} +9 -1
- package/dist/types-CVBeQyi3.d.ts.map +1 -0
- package/package.json +20 -20
- package/skills/acpx/SKILL.md +7 -2
- package/dist/client-D-4_aZf2.d.ts.map +0 -1
- package/dist/flags-ceSqz2T6.js.map +0 -1
- package/dist/flows-_KmnuUXd.js.map +0 -1
- package/dist/ipc-BM335WFg.js.map +0 -1
- package/dist/output-C4QhjpM6.js.map +0 -1
- package/dist/perf-metrics-D0um6IR6.js.map +0 -1
- package/dist/prompt-turn-CXMtXBl-.js.map +0 -1
- package/dist/session-BtwAKtJ3.js.map +0 -1
- package/dist/types-yxf-gcOE.d.ts.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
|
|
2
|
-
import { V as QueueConnectionError, b as isRetryablePromptError, c as startPerfTimer, g as textPrompt, h as promptToDisplayText, i as measurePerf, n as getPerfMetricsSnapshot, o as resetPerfMetrics, r as incrementPerfCounter, s as setPerfGauge, t as formatPerfMetric, u as normalizeRuntimeSessionId, v as formatErrorMessage, x as normalizeOutputError } from "./perf-metrics-
|
|
3
|
-
import { A as
|
|
2
|
+
import { V as QueueConnectionError, b as isRetryablePromptError, c as startPerfTimer, g as textPrompt, h as promptToDisplayText, i as measurePerf, n as getPerfMetricsSnapshot, o as resetPerfMetrics, r as incrementPerfCounter, s as setPerfGauge, t as formatPerfMetric, u as normalizeRuntimeSessionId, v as formatErrorMessage, x as normalizeOutputError } from "./perf-metrics-DvT_gvUh.js";
|
|
3
|
+
import { A as listSessionsForAgent, B as sessionEventLockPath, D as findSessionByDirectoryWalk, E as findSession, G as TimeoutError, K as withInterrupt, L as defaultSessionEventLog, M as pruneSessions, N as resolveSessionRecord, O as isoNow, P as writeSessionRecord, R as sessionBaseDir, T as findGitRepositoryRoot, V as sessionEventSegmentPath, W as InterruptedError, _ as recordClientOperation, a as connectAndLoadSession, b as trimConversationForRuntime, d as setDesiredModeId, f as setDesiredModelId, g as createSessionConversation, h as cloneSessionConversation, i as sessionOptionsFromRecord, j as normalizeName, k as listSessions, l as setCurrentModelId, m as cloneSessionAcpxState, n as withConnectedSession, o as applyConversation, p as syncAdvertisedModelState, q as withTimeout, r as mergeSessionOptions, s as applyLifecycleSnapshotToRecord, t as runPromptTurn, u as setDesiredConfigOption, v as recordPromptSubmission, w as absolutePath, x as AcpClient, y as recordSessionUpdate, z as sessionEventActivePath } from "./prompt-turn-BOoZaDEq.js";
|
|
4
4
|
import { n as isAcpJsonRpcMessage } from "./jsonrpc-DSxh2w5R.js";
|
|
5
|
-
import { a as trySubmitToRunningOwner, c as isProcessAlive, d as terminateProcess, f as terminateQueueOwnerForSession, i as trySetModelOnRunningOwner, l as refreshQueueOwnerLease, m as waitMs, n as trySetConfigOptionOnRunningOwner, o as SessionQueueOwner, p as tryAcquireQueueOwnerLease, r as trySetModeOnRunningOwner, t as tryCancelOnRunningOwner, u as releaseQueueOwnerLease } from "./ipc-
|
|
5
|
+
import { a as trySubmitToRunningOwner, c as isProcessAlive, d as terminateProcess, f as terminateQueueOwnerForSession, i as trySetModelOnRunningOwner, l as refreshQueueOwnerLease, m as waitMs, n as trySetConfigOptionOnRunningOwner, o as SessionQueueOwner, p as tryAcquireQueueOwnerLease, r as trySetModeOnRunningOwner, t as tryCancelOnRunningOwner, u as releaseQueueOwnerLease } from "./ipc-CkAW8Qvc.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";
|
|
@@ -25,6 +25,7 @@ async function runSessionSetModeDirect(options) {
|
|
|
25
25
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
26
26
|
authCredentials: options.authCredentials,
|
|
27
27
|
authPolicy: options.authPolicy,
|
|
28
|
+
terminal: options.terminal,
|
|
28
29
|
timeoutMs: options.timeoutMs,
|
|
29
30
|
verbose: options.verbose,
|
|
30
31
|
onClientAvailable: (controller) => {
|
|
@@ -51,6 +52,7 @@ async function runSessionSetModelDirect(options) {
|
|
|
51
52
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
52
53
|
authCredentials: options.authCredentials,
|
|
53
54
|
authPolicy: options.authPolicy,
|
|
55
|
+
terminal: options.terminal,
|
|
54
56
|
timeoutMs: options.timeoutMs,
|
|
55
57
|
verbose: options.verbose,
|
|
56
58
|
onClientAvailable: (controller) => {
|
|
@@ -78,6 +80,7 @@ async function runSessionSetConfigOptionDirect(options) {
|
|
|
78
80
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
79
81
|
authCredentials: options.authCredentials,
|
|
80
82
|
authPolicy: options.authPolicy,
|
|
83
|
+
terminal: options.terminal,
|
|
81
84
|
timeoutMs: options.timeoutMs,
|
|
82
85
|
verbose: options.verbose,
|
|
83
86
|
onClientAvailable: (controller) => {
|
|
@@ -87,6 +90,7 @@ async function runSessionSetConfigOptionDirect(options) {
|
|
|
87
90
|
run: async ({ client, sessionId, record }) => {
|
|
88
91
|
const response = await withTimeout(client.setSessionConfigOption(sessionId, options.configId, options.value), options.timeoutMs);
|
|
89
92
|
if (options.configId === "mode") setDesiredModeId(record, options.value);
|
|
93
|
+
else setDesiredConfigOption(record, options.configId, options.value);
|
|
90
94
|
return response;
|
|
91
95
|
}
|
|
92
96
|
});
|
|
@@ -123,6 +127,7 @@ async function setSessionMode(options) {
|
|
|
123
127
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
124
128
|
authCredentials: options.authCredentials,
|
|
125
129
|
authPolicy: options.authPolicy,
|
|
130
|
+
terminal: options.terminal,
|
|
126
131
|
timeoutMs: options.timeoutMs,
|
|
127
132
|
verbose: options.verbose
|
|
128
133
|
});
|
|
@@ -145,6 +150,7 @@ async function setSessionModel(options) {
|
|
|
145
150
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
146
151
|
authCredentials: options.authCredentials,
|
|
147
152
|
authPolicy: options.authPolicy,
|
|
153
|
+
terminal: options.terminal,
|
|
148
154
|
timeoutMs: options.timeoutMs,
|
|
149
155
|
verbose: options.verbose
|
|
150
156
|
});
|
|
@@ -153,10 +159,9 @@ async function setSessionConfigOption(options) {
|
|
|
153
159
|
const ownerResponse = await trySetConfigOptionOnRunningOwner(options.sessionId, options.configId, options.value, options.timeoutMs, options.verbose);
|
|
154
160
|
if (ownerResponse) {
|
|
155
161
|
const record = await resolveSessionRecord(options.sessionId);
|
|
156
|
-
if (options.configId === "mode")
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
162
|
+
if (options.configId === "mode") setDesiredModeId(record, options.value);
|
|
163
|
+
else setDesiredConfigOption(record, options.configId, options.value);
|
|
164
|
+
await writeSessionRecord(record);
|
|
160
165
|
return {
|
|
161
166
|
record,
|
|
162
167
|
response: ownerResponse,
|
|
@@ -171,6 +176,7 @@ async function setSessionConfigOption(options) {
|
|
|
171
176
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
172
177
|
authCredentials: options.authCredentials,
|
|
173
178
|
authPolicy: options.authPolicy,
|
|
179
|
+
terminal: options.terminal,
|
|
174
180
|
timeoutMs: options.timeoutMs,
|
|
175
181
|
verbose: options.verbose
|
|
176
182
|
});
|
|
@@ -208,12 +214,15 @@ async function closeSession(sessionId) {
|
|
|
208
214
|
//#endregion
|
|
209
215
|
//#region src/cli/session/session-management.ts
|
|
210
216
|
function persistSessionOptions(record, options) {
|
|
217
|
+
const systemPromptOption = options?.systemPrompt;
|
|
218
|
+
const normalizedSystemPrompt = typeof systemPromptOption === "string" && systemPromptOption.length > 0 ? systemPromptOption : systemPromptOption && typeof systemPromptOption === "object" && typeof systemPromptOption.append === "string" && systemPromptOption.append.length > 0 ? { append: systemPromptOption.append } : void 0;
|
|
211
219
|
const next = options && {
|
|
212
220
|
model: typeof options.model === "string" ? options.model : void 0,
|
|
213
221
|
allowed_tools: Array.isArray(options.allowedTools) ? [...options.allowedTools] : void 0,
|
|
214
|
-
max_turns: typeof options.maxTurns === "number" ? options.maxTurns : void 0
|
|
222
|
+
max_turns: typeof options.maxTurns === "number" ? options.maxTurns : void 0,
|
|
223
|
+
system_prompt: normalizedSystemPrompt
|
|
215
224
|
};
|
|
216
|
-
if (Boolean(next && (typeof next.model === "string" && next.model.trim().length > 0 || Array.isArray(next.allowed_tools) && next.allowed_tools.length > 0 || typeof next.max_turns === "number")) && next) {
|
|
225
|
+
if (Boolean(next && (typeof next.model === "string" && next.model.trim().length > 0 || Array.isArray(next.allowed_tools) && next.allowed_tools.length > 0 || typeof next.max_turns === "number" || next.system_prompt !== void 0)) && next) {
|
|
217
226
|
record.acpx = {
|
|
218
227
|
...record.acpx,
|
|
219
228
|
session_options: next
|
|
@@ -306,6 +315,7 @@ async function createSessionWithClient(options) {
|
|
|
306
315
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
307
316
|
authCredentials: options.authCredentials,
|
|
308
317
|
authPolicy: options.authPolicy,
|
|
318
|
+
terminal: options.terminal,
|
|
309
319
|
verbose: options.verbose,
|
|
310
320
|
sessionOptions: options.sessionOptions
|
|
311
321
|
});
|
|
@@ -349,6 +359,7 @@ async function ensureSession(options) {
|
|
|
349
359
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
350
360
|
authCredentials: options.authCredentials,
|
|
351
361
|
authPolicy: options.authPolicy,
|
|
362
|
+
terminal: options.terminal,
|
|
352
363
|
timeoutMs: options.timeoutMs,
|
|
353
364
|
verbose: options.verbose
|
|
354
365
|
})).record,
|
|
@@ -370,6 +381,7 @@ async function ensureSession(options) {
|
|
|
370
381
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
371
382
|
authCredentials: options.authCredentials,
|
|
372
383
|
authPolicy: options.authPolicy,
|
|
384
|
+
terminal: options.terminal,
|
|
373
385
|
timeoutMs: options.timeoutMs,
|
|
374
386
|
verbose: options.verbose,
|
|
375
387
|
sessionOptions: options.sessionOptions
|
|
@@ -586,11 +598,13 @@ function queueOwnerRuntimeOptionsFromSend(options) {
|
|
|
586
598
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
587
599
|
authCredentials: options.authCredentials,
|
|
588
600
|
authPolicy: options.authPolicy,
|
|
601
|
+
terminal: options.terminal,
|
|
589
602
|
suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,
|
|
590
603
|
verbose: options.verbose,
|
|
591
604
|
ttlMs: options.ttlMs,
|
|
592
605
|
maxQueueDepth: options.maxQueueDepth,
|
|
593
|
-
promptRetries: options.promptRetries
|
|
606
|
+
promptRetries: options.promptRetries,
|
|
607
|
+
sessionOptions: options.sessionOptions
|
|
594
608
|
};
|
|
595
609
|
}
|
|
596
610
|
function buildQueueOwnerSpawnOptions(payload) {
|
|
@@ -846,6 +860,17 @@ async function applyRequestedModelIfAdvertised(params) {
|
|
|
846
860
|
await withTimeout(params.client.setSessionModel(params.sessionId, requestedModel), params.timeoutMs);
|
|
847
861
|
return true;
|
|
848
862
|
}
|
|
863
|
+
async function applyPromptModelIfAdvertised(params) {
|
|
864
|
+
const requestedModel = typeof params.requestedModel === "string" ? params.requestedModel.trim() : "";
|
|
865
|
+
if (!requestedModel || !Array.isArray(params.record.acpx?.available_models)) return;
|
|
866
|
+
if (params.record.acpx.current_model_id === requestedModel) {
|
|
867
|
+
setDesiredModelId(params.record, requestedModel);
|
|
868
|
+
return;
|
|
869
|
+
}
|
|
870
|
+
await withTimeout(params.client.setSessionModel(params.sessionId, requestedModel), params.timeoutMs);
|
|
871
|
+
setDesiredModelId(params.record, requestedModel);
|
|
872
|
+
setCurrentModelId(params.record, requestedModel);
|
|
873
|
+
}
|
|
849
874
|
function jsonRpcIdKey(value) {
|
|
850
875
|
if (typeof value === "string") return `s:${value}`;
|
|
851
876
|
if (typeof value === "number" && Number.isFinite(value)) return `n:${value}`;
|
|
@@ -914,6 +939,7 @@ async function runQueuedTask(sessionRecordId, task, options) {
|
|
|
914
939
|
suppressSdkConsoleErrors: task.suppressSdkConsoleErrors ?? options.suppressSdkConsoleErrors,
|
|
915
940
|
verbose: options.verbose,
|
|
916
941
|
promptRetries: options.promptRetries,
|
|
942
|
+
sessionOptions: mergeSessionOptions(task.sessionOptions, options.sessionOptions),
|
|
917
943
|
onClientAvailable: options.onClientAvailable,
|
|
918
944
|
onClientClosed: options.onClientClosed,
|
|
919
945
|
onPromptActive: options.onPromptActive,
|
|
@@ -954,13 +980,20 @@ async function runSessionPrompt(options) {
|
|
|
954
980
|
});
|
|
955
981
|
const conversation = cloneSessionConversation(record);
|
|
956
982
|
let acpxState = cloneSessionAcpxState(record.acpx);
|
|
957
|
-
const
|
|
983
|
+
const promptStartedAt = isoNow();
|
|
984
|
+
const promptMessageId = recordPromptSubmission(conversation, options.prompt, promptStartedAt);
|
|
985
|
+
record.lastPromptAt = promptStartedAt;
|
|
986
|
+
record.lastUsedAt = promptStartedAt;
|
|
987
|
+
applyConversation(record, conversation);
|
|
988
|
+
record.acpx = acpxState;
|
|
989
|
+
await writeSessionRecord(record);
|
|
958
990
|
output.setContext({ sessionId: record.acpxRecordId });
|
|
959
991
|
const eventWriter = await measurePerf("session.events.open", async () => {
|
|
960
992
|
return await SessionEventWriter.open(record);
|
|
961
993
|
});
|
|
962
994
|
const pendingMessages = [];
|
|
963
995
|
const pendingConnectOutputMessages = [];
|
|
996
|
+
const sessionOptions = mergeSessionOptions(options.sessionOptions, sessionOptionsFromRecord(record));
|
|
964
997
|
let bufferingConnectOutput = true;
|
|
965
998
|
let promptTurnActive = false;
|
|
966
999
|
let promptTurnHadSideEffects = false;
|
|
@@ -987,13 +1020,15 @@ async function runSessionPrompt(options) {
|
|
|
987
1020
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
988
1021
|
authCredentials: options.authCredentials,
|
|
989
1022
|
authPolicy: options.authPolicy,
|
|
1023
|
+
terminal: options.terminal,
|
|
990
1024
|
suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,
|
|
991
1025
|
verbose: options.verbose,
|
|
992
|
-
sessionOptions
|
|
1026
|
+
sessionOptions
|
|
993
1027
|
});
|
|
994
1028
|
client.updateRuntimeOptions({
|
|
995
1029
|
permissionMode: options.permissionMode,
|
|
996
1030
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
1031
|
+
terminal: options.terminal,
|
|
997
1032
|
suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,
|
|
998
1033
|
verbose: options.verbose
|
|
999
1034
|
});
|
|
@@ -1073,6 +1108,13 @@ async function runSessionPrompt(options) {
|
|
|
1073
1108
|
for (const message of connectOutputMessages) output.onAcpMessage(message);
|
|
1074
1109
|
pendingConnectOutputMessages.length = 0;
|
|
1075
1110
|
if (options.verbose) process.stderr.write(`[acpx] ${formatPerfMetric("prompt.connect_and_load", Date.now() - connectStartedAt)}\n`);
|
|
1111
|
+
await applyPromptModelIfAdvertised({
|
|
1112
|
+
client,
|
|
1113
|
+
sessionId: activeSessionId,
|
|
1114
|
+
requestedModel: sessionOptions?.model,
|
|
1115
|
+
record,
|
|
1116
|
+
timeoutMs: options.timeoutMs
|
|
1117
|
+
});
|
|
1076
1118
|
output.setContext({ sessionId: record.acpxRecordId });
|
|
1077
1119
|
await flushPendingMessages(false);
|
|
1078
1120
|
const maxRetries = options.promptRetries ?? 0;
|
|
@@ -1181,6 +1223,7 @@ async function runOnce(options) {
|
|
|
1181
1223
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
1182
1224
|
authCredentials: options.authCredentials,
|
|
1183
1225
|
authPolicy: options.authPolicy,
|
|
1226
|
+
terminal: options.terminal,
|
|
1184
1227
|
suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,
|
|
1185
1228
|
verbose: options.verbose,
|
|
1186
1229
|
onAcpMessage: options.onAcpMessage,
|
|
@@ -1257,6 +1300,7 @@ async function sendSessionDirect(options) {
|
|
|
1257
1300
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
1258
1301
|
authCredentials: options.authCredentials,
|
|
1259
1302
|
authPolicy: options.authPolicy,
|
|
1303
|
+
terminal: options.terminal,
|
|
1260
1304
|
outputFormatter: options.outputFormatter,
|
|
1261
1305
|
onAcpMessage: options.onAcpMessage,
|
|
1262
1306
|
onSessionUpdate: options.onSessionUpdate,
|
|
@@ -1283,7 +1327,8 @@ async function submitToRunningOwner(options, waitForCompletion) {
|
|
|
1283
1327
|
timeoutMs: options.timeoutMs,
|
|
1284
1328
|
suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,
|
|
1285
1329
|
waitForCompletion,
|
|
1286
|
-
verbose: options.verbose
|
|
1330
|
+
verbose: options.verbose,
|
|
1331
|
+
sessionOptions: options.sessionOptions
|
|
1287
1332
|
});
|
|
1288
1333
|
}
|
|
1289
1334
|
async function runSessionQueueOwner(options) {
|
|
@@ -1300,9 +1345,10 @@ async function runSessionQueueOwner(options) {
|
|
|
1300
1345
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
1301
1346
|
authCredentials: options.authCredentials,
|
|
1302
1347
|
authPolicy: options.authPolicy,
|
|
1348
|
+
terminal: options.terminal,
|
|
1303
1349
|
suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,
|
|
1304
1350
|
verbose: options.verbose,
|
|
1305
|
-
sessionOptions: sessionOptionsFromRecord(sessionRecord)
|
|
1351
|
+
sessionOptions: mergeSessionOptions(options.sessionOptions, sessionOptionsFromRecord(sessionRecord))
|
|
1306
1352
|
});
|
|
1307
1353
|
const ttlMs = normalizeQueueOwnerTtlMs(options.ttlMs);
|
|
1308
1354
|
const maxQueueDepth = Math.max(1, Math.round(options.maxQueueDepth ?? 16));
|
|
@@ -1318,6 +1364,7 @@ async function runSessionQueueOwner(options) {
|
|
|
1318
1364
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
1319
1365
|
authCredentials: options.authCredentials,
|
|
1320
1366
|
authPolicy: options.authPolicy,
|
|
1367
|
+
terminal: options.terminal,
|
|
1321
1368
|
timeoutMs,
|
|
1322
1369
|
verbose: options.verbose
|
|
1323
1370
|
});
|
|
@@ -1330,6 +1377,7 @@ async function runSessionQueueOwner(options) {
|
|
|
1330
1377
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
1331
1378
|
authCredentials: options.authCredentials,
|
|
1332
1379
|
authPolicy: options.authPolicy,
|
|
1380
|
+
terminal: options.terminal,
|
|
1333
1381
|
timeoutMs,
|
|
1334
1382
|
verbose: options.verbose
|
|
1335
1383
|
});
|
|
@@ -1343,6 +1391,7 @@ async function runSessionQueueOwner(options) {
|
|
|
1343
1391
|
nonInteractivePermissions: options.nonInteractivePermissions,
|
|
1344
1392
|
authCredentials: options.authCredentials,
|
|
1345
1393
|
authPolicy: options.authPolicy,
|
|
1394
|
+
terminal: options.terminal,
|
|
1346
1395
|
timeoutMs,
|
|
1347
1396
|
verbose: options.verbose
|
|
1348
1397
|
})).response;
|
|
@@ -1416,6 +1465,7 @@ async function runSessionQueueOwner(options) {
|
|
|
1416
1465
|
authPolicy: options.authPolicy,
|
|
1417
1466
|
suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,
|
|
1418
1467
|
promptRetries: options.promptRetries,
|
|
1468
|
+
sessionOptions: options.sessionOptions,
|
|
1419
1469
|
onClientAvailable: setActiveController,
|
|
1420
1470
|
onClientClosed: clearActiveController,
|
|
1421
1471
|
onPromptActive: async () => {
|
|
@@ -1473,6 +1523,7 @@ var session_exports = /* @__PURE__ */ __exportAll({
|
|
|
1473
1523
|
listSessions: () => listSessions,
|
|
1474
1524
|
listSessionsForAgent: () => listSessionsForAgent,
|
|
1475
1525
|
normalizeQueueOwnerTtlMs: () => normalizeQueueOwnerTtlMs,
|
|
1526
|
+
pruneSessions: () => pruneSessions,
|
|
1476
1527
|
runOnce: () => runOnce,
|
|
1477
1528
|
runQueuedTask: () => runQueuedTask,
|
|
1478
1529
|
runSessionQueueOwner: () => runSessionQueueOwner,
|
|
@@ -1485,4 +1536,4 @@ var session_exports = /* @__PURE__ */ __exportAll({
|
|
|
1485
1536
|
//#endregion
|
|
1486
1537
|
export { buildQueueOwnerArgOverride as a, createSessionWithClient as c, sendSessionDirect as i, cancelSessionPrompt as l, runSessionQueueOwner as n, flushPerfMetricsCapture as o, runOnce as r, installPerfMetricsCapture as s, session_exports as t, DEFAULT_QUEUE_OWNER_TTL_MS as u };
|
|
1487
1538
|
|
|
1488
|
-
//# sourceMappingURL=session-
|
|
1539
|
+
//# sourceMappingURL=session-DcIse8N0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-DcIse8N0.js","names":["fs","applyRequestedModelIfAdvertised","fs","segmentEventPath","activeEventPath","eventsLockPath","recordConversationSessionUpdate","recordConversationClientOperation"],"sources":["../src/cli/session/contracts.ts","../src/cli/session/prompt-runner.ts","../src/cli/session/session-control.ts","../src/cli/session/session-management.ts","../src/perf-metrics-capture.ts","../src/cli/queue/owner-turn-controller.ts","../src/cli/session/queue-owner-process.ts","../src/session/events.ts","../src/cli/session/runtime.ts","../src/cli/session/queue-owner-runtime.ts","../src/session/session.ts"],"sourcesContent":["import type { AcpClient } from \"../../acp/client.js\";\nimport type { SessionAgentOptions } from \"../../runtime/engine/session-options.js\";\nimport type {\n AcpJsonRpcMessage,\n AcpMessageDirection,\n AuthPolicy,\n ClientOperation,\n McpServer,\n NonInteractivePermissionPolicy,\n OutputErrorEmissionPolicy,\n OutputFormatter,\n PermissionMode,\n PromptInput,\n SessionNotification,\n SessionResumePolicy,\n SessionRecord,\n} from \"../../types.js\";\n\ntype TimedRunOptions = {\n timeoutMs?: number;\n};\n\nexport const DEFAULT_QUEUE_OWNER_TTL_MS = 300_000;\n\nexport function normalizeQueueOwnerTtlMs(ttlMs: number | undefined): number {\n if (ttlMs == null) {\n return DEFAULT_QUEUE_OWNER_TTL_MS;\n }\n\n if (!Number.isFinite(ttlMs) || ttlMs < 0) {\n return DEFAULT_QUEUE_OWNER_TTL_MS;\n }\n\n // 0 means keep alive forever (no TTL)\n return Math.round(ttlMs);\n}\n\nexport type RunOnceOptions = {\n agentCommand: string;\n cwd: string;\n prompt: PromptInput;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n 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 { withTimeout } from \"../../async-control.js\";\nimport {\n withConnectedSession,\n type FullConnectedSessionController,\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\nexport async function runSessionSetModeDirect(\n options: RunSessionSetModeDirectOptions,\n): Promise<SessionSetModeResult> {\n const result = await withConnectedSession({\n sessionRecordId: options.sessionRecordId,\n loadRecord: resolveSessionRecord,\n saveRecord: writeSessionRecord,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n 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: async ({ client, sessionId, record }) => {\n await withTimeout(client.setSessionMode(sessionId, options.modeId), options.timeoutMs);\n setDesiredModeId(record, options.modeId);\n },\n });\n\n return {\n record: result.record,\n resumed: result.resumed,\n loadError: result.loadError,\n };\n}\n\nexport async function runSessionSetModelDirect(\n options: RunSessionSetModelDirectOptions,\n): Promise<SessionSetModelResult> {\n const result = await withConnectedSession({\n sessionRecordId: options.sessionRecordId,\n loadRecord: resolveSessionRecord,\n saveRecord: writeSessionRecord,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n 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: async ({ client, sessionId, record }) => {\n await withTimeout(client.setSessionModel(sessionId, options.modelId), options.timeoutMs);\n setDesiredModelId(record, options.modelId);\n setCurrentModelId(record, options.modelId);\n },\n });\n\n return {\n record: result.record,\n resumed: result.resumed,\n loadError: result.loadError,\n };\n}\n\nexport async function runSessionSetConfigOptionDirect(\n options: RunSessionSetConfigOptionDirectOptions,\n): Promise<SessionSetConfigOptionResult> {\n const result = await withConnectedSession({\n sessionRecordId: options.sessionRecordId,\n loadRecord: resolveSessionRecord,\n saveRecord: writeSessionRecord,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n 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: 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 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 terminateQueueOwnerForSession(record.acpxRecordId);\n\n if (\n record.pid != null &&\n isProcessAlive(record.pid) &&\n (await isLikelyMatchingProcess(record.pid, record.agentCommand))\n ) {\n await terminateProcess(record.pid);\n }\n\n record.pid = undefined;\n record.closed = true;\n record.closedAt = isoNow();\n await writeSessionRecord(record);\n\n return record;\n}\n","import { AcpClient, type SessionCreateResult } from \"../../acp/client.js\";\nimport { formatErrorMessage } from \"../../acp/error-normalization.js\";\nimport { withInterrupt, withTimeout } from \"../../async-control.js\";\nimport { createSessionConversation } from \"../../session/conversation-model.js\";\nimport { defaultSessionEventLog } from \"../../session/event-log.js\";\nimport { setCurrentModelId, syncAdvertisedModelState } from \"../../session/mode-preference.js\";\nimport {\n absolutePath,\n findGitRepositoryRoot,\n findSessionByDirectoryWalk,\n isoNow,\n normalizeName,\n writeSessionRecord,\n} from \"../../session/persistence.js\";\nimport { normalizeRuntimeSessionId } from \"../../session/runtime-session-id.js\";\nimport type { SessionEnsureResult, SessionRecord } from \"../../types.js\";\nimport { DEFAULT_QUEUE_OWNER_TTL_MS } from \"./contracts.js\";\nimport type {\n SessionAgentOptions,\n SessionCreateOptions,\n SessionCreateWithClientResult,\n SessionEnsureOptions,\n} from \"./contracts.js\";\nimport { setSessionModel } from \"./session-control.js\";\n\nfunction persistSessionOptions(\n record: SessionRecord,\n options: SessionAgentOptions | undefined,\n): void {\n const 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 applyRequestedModelIfAdvertised(params: {\n client: AcpClient;\n sessionId: string;\n requestedModel: string | undefined;\n models: SessionCreateResult[\"models\"];\n timeoutMs?: number;\n}): Promise<boolean> {\n const requestedModel =\n typeof params.requestedModel === \"string\" ? params.requestedModel.trim() : \"\";\n if (!requestedModel || !params.models) {\n return false;\n }\n if (params.models.currentModelId === requestedModel) {\n return true;\n }\n\n await withTimeout(\n params.client.setSessionModel(params.sessionId, requestedModel),\n params.timeoutMs,\n );\n return true;\n}\n\nasync function createSessionRecordWithClient(\n client: AcpClient,\n options: SessionCreateOptions,\n): Promise<SessionRecord> {\n const cwd = absolutePath(options.cwd);\n await withTimeout(client.start(), options.timeoutMs);\n let sessionId: string;\n let agentSessionId: string | undefined;\n let sessionModels: SessionCreateResult[\"models\"];\n let requestedModelApplied = false;\n\n if (options.resumeSessionId) {\n if (!client.supportsLoadSession()) {\n throw new Error(\n `Agent command \"${options.agentCommand}\" does not support session/load; cannot resume session ${options.resumeSessionId}`,\n );\n }\n\n try {\n const loadedSession = await withTimeout(\n client.loadSession(options.resumeSessionId, cwd),\n options.timeoutMs,\n );\n sessionId = options.resumeSessionId;\n agentSessionId = normalizeRuntimeSessionId(loadedSession.agentSessionId);\n sessionModels = loadedSession.models;\n requestedModelApplied = await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: sessionModels,\n timeoutMs: options.timeoutMs,\n });\n } catch (error) {\n throw new Error(\n `Failed to resume ACP session ${options.resumeSessionId}: ${formatErrorMessage(error)}`,\n {\n cause: error,\n },\n );\n }\n } else {\n const createdSession = await withTimeout(client.createSession(cwd), options.timeoutMs);\n sessionId = createdSession.sessionId;\n agentSessionId = normalizeRuntimeSessionId(createdSession.agentSessionId);\n sessionModels = createdSession.models;\n requestedModelApplied = await applyRequestedModelIfAdvertised({\n client,\n sessionId,\n requestedModel: options.sessionOptions?.model,\n models: sessionModels,\n timeoutMs: options.timeoutMs,\n });\n }\n\n const lifecycle = client.getAgentLifecycleSnapshot();\n const now = isoNow();\n const record: SessionRecord = {\n schema: \"acpx.session.v1\",\n acpxRecordId: sessionId,\n acpSessionId: sessionId,\n agentSessionId,\n agentCommand: options.agentCommand,\n cwd,\n name: normalizeName(options.name),\n createdAt: now,\n lastUsedAt: now,\n lastSeq: 0,\n lastRequestId: undefined,\n eventLog: defaultSessionEventLog(sessionId),\n closed: false,\n closedAt: undefined,\n pid: lifecycle.pid,\n agentStartedAt: lifecycle.startedAt,\n protocolVersion: client.initializeResult?.protocolVersion,\n agentCapabilities: client.initializeResult?.agentCapabilities,\n ...createSessionConversation(now),\n acpx: {},\n };\n\n persistSessionOptions(record, options.sessionOptions);\n syncAdvertisedModelState(record, sessionModels);\n if (requestedModelApplied) {\n setCurrentModelId(record, options.sessionOptions?.model);\n }\n\n await writeSessionRecord(record);\n return record;\n}\n\nexport async function createSessionWithClient(\n options: SessionCreateOptions,\n): Promise<SessionCreateWithClientResult> {\n const client = new AcpClient({\n agentCommand: options.agentCommand,\n cwd: absolutePath(options.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n 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 { 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 AcpMessageDirection,\n AuthPolicy,\n ClientOperation,\n McpServer,\n NonInteractivePermissionPolicy,\n OutputErrorAcpPayload,\n OutputErrorCode,\n OutputErrorOrigin,\n OutputFormatter,\n PermissionMode,\n PromptInput,\n RunPromptResult,\n SessionNotification,\n SessionRecord,\n SessionResumePolicy,\n SessionSendResult,\n} from \"../../types.js\";\nimport { type QueueOwnerMessage, type QueueTask, waitMs } from \"../queue/ipc.js\";\nimport { type QueueOwnerActiveSessionController } from \"../queue/owner-turn-controller.js\";\nimport type { RunOnceOptions, SessionSendOptions } from \"./contracts.js\";\n\nconst INTERRUPT_CANCEL_WAIT_MS = 2_500;\n\ntype RunSessionPromptOptions = {\n sessionRecordId: string;\n prompt: PromptInput;\n resumePolicy?: SessionResumePolicy;\n mcpServers?: McpServer[];\n permissionMode: PermissionMode;\n nonInteractivePermissions?: NonInteractivePermissionPolicy;\n authCredentials?: Record<string, string>;\n authPolicy?: AuthPolicy;\n terminal?: boolean;\n outputFormatter: OutputFormatter;\n onAcpMessage?: (direction: AcpMessageDirection, message: AcpJsonRpcMessage) => void;\n onSessionUpdate?: (notification: SessionNotification) => void;\n onClientOperation?: (operation: ClientOperation) => void;\n timeoutMs?: number;\n suppressSdkConsoleErrors?: boolean;\n verbose?: boolean;\n promptRetries?: number;\n sessionOptions?: SessionAgentOptions;\n onClientAvailable?: (controller: ActiveSessionController) => void;\n onClientClosed?: () => void;\n onPromptActive?: () => Promise<void> | void;\n client?: AcpClient;\n};\n\ntype ActiveSessionController = QueueOwnerActiveSessionController;\n\nclass QueueTaskOutputFormatter implements OutputFormatter {\n private readonly requestId: string;\n private readonly send: (message: QueueOwnerMessage) => void;\n\n constructor(task: QueueTask) {\n this.requestId = task.requestId;\n this.send = task.send;\n }\n\n setContext(_context: { sessionId: string }): void {}\n\n onAcpMessage(message: AcpJsonRpcMessage): void {\n this.send({\n type: \"event\",\n requestId: this.requestId,\n message,\n });\n }\n\n onError(params: {\n code: OutputErrorCode;\n detailCode?: string;\n origin?: OutputErrorOrigin;\n message: string;\n retryable?: boolean;\n acp?: OutputErrorAcpPayload;\n timestamp?: string;\n }): void {\n this.send({\n type: \"error\",\n requestId: this.requestId,\n code: params.code,\n detailCode: params.detailCode,\n origin: params.origin,\n message: params.message,\n retryable: params.retryable,\n acp: params.acp,\n });\n }\n\n flush(): void {}\n}\n\nconst DISCARD_OUTPUT_FORMATTER: OutputFormatter = {\n setContext() {},\n onAcpMessage() {},\n onError() {},\n flush() {},\n};\n\nfunction toPromptResult(\n stopReason: RunPromptResult[\"stopReason\"],\n sessionId: string,\n client: AcpClient,\n): RunPromptResult {\n return {\n stopReason,\n sessionId,\n permissionStats: client.getPermissionStats(),\n };\n}\n\nasync function applyRequestedModelIfAdvertised(params: {\n client: AcpClient;\n sessionId: string;\n requestedModel: string | undefined;\n models: import(\"../../acp/client.js\").SessionCreateResult[\"models\"];\n timeoutMs?: number;\n}): Promise<boolean> {\n const requestedModel =\n typeof params.requestedModel === \"string\" ? params.requestedModel.trim() : \"\";\n if (!requestedModel || !params.models) {\n return false;\n }\n if (params.models.currentModelId === requestedModel) {\n return true;\n }\n\n await withTimeout(\n params.client.setSessionModel(params.sessionId, requestedModel),\n params.timeoutMs,\n );\n return true;\n}\n\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 || !Array.isArray(params.record.acpx?.available_models)) {\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, pendingMessages.length);\n await measurePerf(\"session.events.flush_pending\", async () => {\n await eventWriter.appendMessages(batch, { checkpoint });\n });\n };\n\n const ownClient = options.client == null;\n const client =\n options.client ??\n new AcpClient({\n agentCommand: record.agentCommand,\n cwd: absolutePath(record.cwd),\n mcpServers: options.mcpServers,\n permissionMode: options.permissionMode,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n 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 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 runPromptTurn = async <T>(run: () => Promise<T>): Promise<T> => {\n turnController.beginTurn();\n try {\n return await run();\n } finally {\n turnController.endTurn();\n }\n };\n\n try {\n owner = await SessionQueueOwner.start(\n lease,\n {\n cancelPrompt: async () => {\n const accepted = await turnController.requestCancel();\n if (!accepted) {\n return false;\n }\n await applyPendingCancel();\n return true;\n },\n setSessionMode: async (modeId: string, timeoutMs?: number) => {\n await turnController.setSessionMode(modeId, timeoutMs);\n },\n setSessionModel: async (modelId: string, timeoutMs?: number) => {\n await turnController.setSessionModel(modelId, timeoutMs);\n },\n setSessionConfigOption: async (configId: string, value: string, timeoutMs?: number) => {\n return await turnController.setSessionConfigOption(configId, value, timeoutMs);\n },\n },\n {\n maxQueueDepth,\n onQueueDepthChanged: (queueDepth) => {\n setPerfGauge(\"queue.owner.depth\", queueDepth);\n void refreshQueueOwnerLease(lease, { queueDepth }).catch(() => {\n // best effort heartbeat refresh while owner is live\n });\n },\n },\n );\n\n if (options.verbose) {\n process.stderr.write(\n `[acpx] queue owner ready for session ${options.sessionId} (ttlMs=${ttlMs}, maxQueueDepth=${maxQueueDepth})\\n`,\n );\n }\n await refreshQueueOwnerLease(lease, { queueDepth: owner.queueDepth() }).catch(() => {\n // best effort initial heartbeat\n });\n heartbeatTimer = setInterval(() => {\n void refreshQueueOwnerLease(lease, { queueDepth: owner?.queueDepth() ?? 0 }).catch(() => {\n // best effort heartbeat\n });\n }, QUEUE_OWNER_HEARTBEAT_INTERVAL_MS);\n\n let isFirstTask = true;\n while (true) {\n const pollTimeoutMs = isFirstTask ? initialTaskPollTimeoutMs : taskPollTimeoutMs;\n const task = await owner.nextTask(pollTimeoutMs);\n if (!task) {\n break;\n }\n isFirstTask = false;\n\n await runPromptTurn(async () => {\n try {\n await runQueuedTask(options.sessionId, task, {\n sharedClient,\n verbose: options.verbose,\n mcpServers: options.mcpServers,\n nonInteractivePermissions: options.nonInteractivePermissions,\n authCredentials: options.authCredentials,\n authPolicy: options.authPolicy,\n suppressSdkConsoleErrors: options.suppressSdkConsoleErrors,\n promptRetries: options.promptRetries,\n 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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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/runtime/engine/session-options.d.ts
|
|
2
|
+
type SystemPromptOption = string | {
|
|
3
|
+
append: string;
|
|
4
|
+
};
|
|
5
|
+
type SessionAgentOptions = {
|
|
6
|
+
model?: string;
|
|
7
|
+
allowedTools?: string[];
|
|
8
|
+
maxTurns?: number;
|
|
9
|
+
systemPrompt?: SystemPromptOption;
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
12
|
+
export { SessionAgentOptions as t };
|
|
13
|
+
//# sourceMappingURL=session-options-pCbHn_n7.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-options-pCbHn_n7.d.ts","names":[],"sources":["../src/runtime/engine/session-options.ts"],"mappings":";KAEY,kBAAA;EAAgC,MAAA;AAAA;AAAA,KAEhC,mBAAA;EACV,KAAA;EACA,YAAA;EACA,QAAA;EACA,YAAA,GAAe,kBAAA;AAAA"}
|