@sema-agent/server 1.229.0 → 1.231.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/dist/http/server.d.ts +4 -0
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +266 -19
- package/dist/http/server.js.map +1 -1
- package/dist/main.js +31 -1
- package/dist/main.js.map +1 -1
- package/dist/plugins/caching-session-store.d.ts +4 -0
- package/dist/plugins/caching-session-store.d.ts.map +1 -1
- package/dist/plugins/caching-session-store.js +3 -0
- package/dist/plugins/caching-session-store.js.map +1 -1
- package/dist/plugins/local-session-store.d.ts +4 -0
- package/dist/plugins/local-session-store.d.ts.map +1 -1
- package/dist/plugins/local-session-store.js +9 -0
- package/dist/plugins/local-session-store.js.map +1 -1
- package/dist/plugins/pg-session-storage.d.ts +4 -0
- package/dist/plugins/pg-session-storage.d.ts.map +1 -1
- package/dist/plugins/pg-session-storage.js +6 -0
- package/dist/plugins/pg-session-storage.js.map +1 -1
- package/dist/plugins/tidb-session-store.d.ts +4 -0
- package/dist/plugins/tidb-session-store.d.ts.map +1 -1
- package/dist/plugins/tidb-session-store.js +6 -0
- package/dist/plugins/tidb-session-store.js.map +1 -1
- package/dist/security.d.ts +4 -0
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js.map +1 -1
- package/dist/session-watch.d.ts +27 -0
- package/dist/session-watch.d.ts.map +1 -0
- package/dist/session-watch.js +134 -0
- package/dist/session-watch.js.map +1 -0
- package/dist/task-settings.d.ts +5 -2
- package/dist/task-settings.d.ts.map +1 -1
- package/dist/task-settings.js +37 -8
- package/dist/task-settings.js.map +1 -1
- package/package.json +2 -2
package/dist/http/server.d.ts
CHANGED
|
@@ -100,6 +100,10 @@ export interface ServiceDeps {
|
|
|
100
100
|
toolApproval?: ToolApprovalCoordinator;
|
|
101
101
|
sendUserFile?: import("../capabilities/send-user-file-tool.js").SendUserFileEmitter;
|
|
102
102
|
sendFileLedger?: import("../plugins/send-file-ledger.js").SendFileLedger;
|
|
103
|
+
sessionWatch?: import("../session-watch.js").SessionWatchRegistry;
|
|
104
|
+
sessionEventsMaxConnections?: number;
|
|
105
|
+
sessionEventsHeartbeatMs?: number;
|
|
106
|
+
sessionEventsStallMs?: number;
|
|
103
107
|
capabilities?: Record<string, unknown>;
|
|
104
108
|
restartState?: () => RestartSignal | undefined;
|
|
105
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"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"}
|
package/dist/http/server.js
CHANGED
|
@@ -158,6 +158,9 @@ const WORKFLOW_AGENT_STEER_RE = /^\/v1\/workflows\/([^/]+)\/agents\/([^/]+)\/ste
|
|
|
158
158
|
const RUN_SUBAGENT_STEER_RE = /^\/v1\/runs\/([^/]+)\/subagents\/([^/]+)\/steer$/;
|
|
159
159
|
const RUN_SUBAGENT_RESUME_RE = /^\/v1\/runs\/([^/]+)\/subagents\/([^/]+)\/resume$/;
|
|
160
160
|
const HAND_TOOL_NAMES = Object.keys(HAND_TOOL_EFFECTS);
|
|
161
|
+
function isCheckpointReopenedFailure(r) {
|
|
162
|
+
return r.status === "failed" && (r.errorCode === "resume.env_failed" || r.errorCode === "resume.tool_unavailable");
|
|
163
|
+
}
|
|
161
164
|
function gatedPrincipal(req, config) {
|
|
162
165
|
if (bearerPresentedButUnverified(req, config))
|
|
163
166
|
return undefined;
|
|
@@ -177,6 +180,8 @@ function bearerPresentedButUnverified(req, config) {
|
|
|
177
180
|
}
|
|
178
181
|
export function createHttpServer(deps) {
|
|
179
182
|
const idemCache = new IdempotencyCache();
|
|
183
|
+
let sseConnections = 0;
|
|
184
|
+
let sseOwnerLookups = 0;
|
|
180
185
|
const bakeSubmitLimiter = new RateLimiter(deps.config.imageBakes?.submitRateMax ?? 0, (deps.config.imageBakes?.submitRateWindowSec ?? 60) * 1000);
|
|
181
186
|
const inflightRuns = new Map();
|
|
182
187
|
const cancelledViaVerb = new Set();
|
|
@@ -581,6 +586,7 @@ export function createHttpServer(deps) {
|
|
|
581
586
|
artifacts: Boolean(deps.runStore),
|
|
582
587
|
approvals: Boolean(deps.checkpointStore),
|
|
583
588
|
sessions: Boolean(deps.sessionAudit),
|
|
589
|
+
sessionEvents: Boolean(deps.sessionWatch && deps.sessionStorage?.getLeafId && deps.sessionStorage?.ownerOf),
|
|
584
590
|
leader: Boolean(deps.leaderEndpoint),
|
|
585
591
|
memory: false,
|
|
586
592
|
memoryWrite: false,
|
|
@@ -3013,21 +3019,37 @@ export function createHttpServer(deps) {
|
|
|
3013
3019
|
{
|
|
3014
3020
|
const hm = req.method === "GET" ? /^\/v1\/sessions\/([^/]+)\/head$/.exec(url) : null;
|
|
3015
3021
|
if (hm) {
|
|
3016
|
-
const getLeafId = deps.sessionStorage?.getLeafId;
|
|
3022
|
+
const getLeafId = deps.sessionStorage?.getLeafId?.bind(deps.sessionStorage);
|
|
3017
3023
|
const ownerOf = deps.sessionStorage?.ownerOf?.bind(deps.sessionStorage);
|
|
3018
3024
|
if (!getLeafId || !ownerOf) {
|
|
3019
3025
|
sendJson(res, 501, { error: "session head probe requires a durable session store (SESSION_BACKEND=tidb|pg|local)" });
|
|
3020
3026
|
return;
|
|
3021
3027
|
}
|
|
3022
3028
|
const headSession = decodeURIComponent(hm[1]);
|
|
3023
|
-
const
|
|
3024
|
-
|
|
3025
|
-
|
|
3026
|
-
|
|
3029
|
+
const getHead = deps.sessionStorage?.getHead?.bind(deps.sessionStorage);
|
|
3030
|
+
let owner;
|
|
3031
|
+
let leafId;
|
|
3032
|
+
if (getHead) {
|
|
3033
|
+
const head = await getHead(headSession);
|
|
3034
|
+
if (head === undefined) {
|
|
3035
|
+
sendJson(res, 404, { error: "session not found" });
|
|
3036
|
+
return;
|
|
3037
|
+
}
|
|
3038
|
+
owner = head.owner;
|
|
3039
|
+
if (!runOwnerOk(req, res, owner ?? null))
|
|
3040
|
+
return;
|
|
3041
|
+
leafId = head.leafId;
|
|
3042
|
+
}
|
|
3043
|
+
else {
|
|
3044
|
+
owner = await ownerOf(headSession);
|
|
3045
|
+
if (owner === undefined) {
|
|
3046
|
+
sendJson(res, 404, { error: "session not found" });
|
|
3047
|
+
return;
|
|
3048
|
+
}
|
|
3049
|
+
if (!runOwnerOk(req, res, owner ?? null))
|
|
3050
|
+
return;
|
|
3051
|
+
leafId = await getLeafId(headSession);
|
|
3027
3052
|
}
|
|
3028
|
-
if (!runOwnerOk(req, res, owner ?? null))
|
|
3029
|
-
return;
|
|
3030
|
-
const leafId = await getLeafId(headSession);
|
|
3031
3053
|
const etag = `"${leafId ?? "empty"}"`;
|
|
3032
3054
|
if (req.headers["if-none-match"] === etag) {
|
|
3033
3055
|
res.writeHead(304, { etag }).end();
|
|
@@ -3038,6 +3060,195 @@ export function createHttpServer(deps) {
|
|
|
3038
3060
|
return;
|
|
3039
3061
|
}
|
|
3040
3062
|
}
|
|
3063
|
+
{
|
|
3064
|
+
const em = req.method === "GET" ? /^\/v1\/sessions\/([^/]+)\/events$/.exec(url) : null;
|
|
3065
|
+
if (em) {
|
|
3066
|
+
const ownerOf = deps.sessionStorage?.ownerOf?.bind(deps.sessionStorage);
|
|
3067
|
+
const watch = deps.sessionWatch;
|
|
3068
|
+
if (!deps.sessionStorage?.getLeafId || !ownerOf || !watch) {
|
|
3069
|
+
sendJson(res, 501, { error: "session events require a durable session store (SESSION_BACKEND=tidb|pg|local)" });
|
|
3070
|
+
return;
|
|
3071
|
+
}
|
|
3072
|
+
const evSession = decodeURIComponent(em[1]);
|
|
3073
|
+
if (sseConnections >= (deps.sessionEventsMaxConnections ?? 256)) {
|
|
3074
|
+
res.writeHead(503, { "retry-after": "5", "content-type": "application/json" });
|
|
3075
|
+
res.end(JSON.stringify({ error: "session-events connection cap reached — fall back to /head polling" }));
|
|
3076
|
+
return;
|
|
3077
|
+
}
|
|
3078
|
+
sseConnections++;
|
|
3079
|
+
let hb;
|
|
3080
|
+
let unsubscribe;
|
|
3081
|
+
let closed = false;
|
|
3082
|
+
const cleanup = () => {
|
|
3083
|
+
if (closed)
|
|
3084
|
+
return;
|
|
3085
|
+
closed = true;
|
|
3086
|
+
sseConnections--;
|
|
3087
|
+
if (hb)
|
|
3088
|
+
clearInterval(hb);
|
|
3089
|
+
unsubscribe?.();
|
|
3090
|
+
};
|
|
3091
|
+
res.on("close", cleanup);
|
|
3092
|
+
req.on("close", cleanup);
|
|
3093
|
+
try {
|
|
3094
|
+
const stallBound = deps.sessionEventsStallMs ?? 60_000;
|
|
3095
|
+
if (sseOwnerLookups >= 64) {
|
|
3096
|
+
cleanup();
|
|
3097
|
+
res.writeHead(503, { "retry-after": "5", "content-type": "application/json" });
|
|
3098
|
+
res.end(JSON.stringify({ error: "session-events owner-lookup concurrency cap — retry" }));
|
|
3099
|
+
return;
|
|
3100
|
+
}
|
|
3101
|
+
sseOwnerLookups++;
|
|
3102
|
+
const ownerP = ownerOf(evSession);
|
|
3103
|
+
void ownerP.catch(() => undefined).then(() => { sseOwnerLookups--; });
|
|
3104
|
+
let stallTimer;
|
|
3105
|
+
let owner;
|
|
3106
|
+
try {
|
|
3107
|
+
owner = await Promise.race([
|
|
3108
|
+
ownerP,
|
|
3109
|
+
new Promise((r) => { stallTimer = setTimeout(() => r("__stall__"), stallBound); stallTimer.unref?.(); }),
|
|
3110
|
+
]);
|
|
3111
|
+
}
|
|
3112
|
+
finally {
|
|
3113
|
+
if (stallTimer)
|
|
3114
|
+
clearTimeout(stallTimer);
|
|
3115
|
+
}
|
|
3116
|
+
if (closed)
|
|
3117
|
+
return;
|
|
3118
|
+
if (owner === "__stall__") {
|
|
3119
|
+
cleanup();
|
|
3120
|
+
res.writeHead(503, { "retry-after": "5", "content-type": "application/json" });
|
|
3121
|
+
res.end(JSON.stringify({ error: "session-events owner lookup stalled — retry" }));
|
|
3122
|
+
return;
|
|
3123
|
+
}
|
|
3124
|
+
if (owner === undefined) {
|
|
3125
|
+
cleanup();
|
|
3126
|
+
sendJson(res, 404, { error: "session not found" });
|
|
3127
|
+
return;
|
|
3128
|
+
}
|
|
3129
|
+
if (!runOwnerOk(req, res, owner ?? null)) {
|
|
3130
|
+
cleanup();
|
|
3131
|
+
return;
|
|
3132
|
+
}
|
|
3133
|
+
const q = new URL(req.url ?? url, "http://x").searchParams;
|
|
3134
|
+
const lastLeafId = q.get("lastLeafId");
|
|
3135
|
+
let first = true;
|
|
3136
|
+
let lastAccepted;
|
|
3137
|
+
let lastWritten;
|
|
3138
|
+
let writeBlocked = false;
|
|
3139
|
+
let blockedAt = 0;
|
|
3140
|
+
let pendingHead;
|
|
3141
|
+
const stallMs = deps.sessionEventsStallMs ?? 60_000;
|
|
3142
|
+
const writeRaw = (chunk) => {
|
|
3143
|
+
if (closed)
|
|
3144
|
+
return;
|
|
3145
|
+
try {
|
|
3146
|
+
const okW = res.write(chunk);
|
|
3147
|
+
if (!okW && !writeBlocked) {
|
|
3148
|
+
writeBlocked = true;
|
|
3149
|
+
blockedAt = Date.now();
|
|
3150
|
+
res.once("drain", () => {
|
|
3151
|
+
writeBlocked = false;
|
|
3152
|
+
const p = pendingHead;
|
|
3153
|
+
pendingHead = undefined;
|
|
3154
|
+
if (p && !closed && p.v !== lastWritten)
|
|
3155
|
+
doWrite(p.v);
|
|
3156
|
+
});
|
|
3157
|
+
}
|
|
3158
|
+
}
|
|
3159
|
+
catch { }
|
|
3160
|
+
};
|
|
3161
|
+
const doWrite = (leafId) => {
|
|
3162
|
+
lastWritten = leafId;
|
|
3163
|
+
writeRaw(`event: head\ndata: ${JSON.stringify({ sessionId: evSession, leafId })}\n\n`);
|
|
3164
|
+
};
|
|
3165
|
+
const emit = (leafId) => {
|
|
3166
|
+
if (closed || leafId === lastAccepted)
|
|
3167
|
+
return;
|
|
3168
|
+
lastAccepted = leafId;
|
|
3169
|
+
const suppress = first && lastLeafId !== null && lastLeafId === (leafId ?? "null");
|
|
3170
|
+
first = false;
|
|
3171
|
+
if (suppress) {
|
|
3172
|
+
lastWritten = leafId;
|
|
3173
|
+
return;
|
|
3174
|
+
}
|
|
3175
|
+
if (writeBlocked) {
|
|
3176
|
+
pendingHead = { v: leafId };
|
|
3177
|
+
if (Date.now() - blockedAt > stallMs) {
|
|
3178
|
+
cleanup();
|
|
3179
|
+
try {
|
|
3180
|
+
res.end();
|
|
3181
|
+
}
|
|
3182
|
+
catch { }
|
|
3183
|
+
}
|
|
3184
|
+
return;
|
|
3185
|
+
}
|
|
3186
|
+
doWrite(leafId);
|
|
3187
|
+
};
|
|
3188
|
+
let started = false;
|
|
3189
|
+
let preVal;
|
|
3190
|
+
const onHead = (leafId) => {
|
|
3191
|
+
if (!started)
|
|
3192
|
+
preVal = { v: leafId };
|
|
3193
|
+
else
|
|
3194
|
+
emit(leafId);
|
|
3195
|
+
};
|
|
3196
|
+
const onEnd = () => { cleanup(); try {
|
|
3197
|
+
res.end();
|
|
3198
|
+
}
|
|
3199
|
+
catch { } };
|
|
3200
|
+
unsubscribe = watch.subscribe(evSession, owner ?? null, onHead, onEnd);
|
|
3201
|
+
if (!unsubscribe) {
|
|
3202
|
+
cleanup();
|
|
3203
|
+
res.writeHead(503, { "retry-after": "5", "content-type": "application/json" });
|
|
3204
|
+
res.end(JSON.stringify({ error: "session-events probe cap reached — fall back to /head polling" }));
|
|
3205
|
+
return;
|
|
3206
|
+
}
|
|
3207
|
+
res.writeHead(200, { "content-type": "text/event-stream", "cache-control": "no-cache, no-transform", connection: "keep-alive", "x-accel-buffering": "no" });
|
|
3208
|
+
writeRaw(": connected\n\n");
|
|
3209
|
+
started = true;
|
|
3210
|
+
if (preVal !== undefined)
|
|
3211
|
+
emit(preVal.v);
|
|
3212
|
+
const hbMs = deps.sessionEventsHeartbeatMs ?? 25_000;
|
|
3213
|
+
let ownerCheckPending = false;
|
|
3214
|
+
let ownerCheckStartedAt = 0;
|
|
3215
|
+
hb = setInterval(() => {
|
|
3216
|
+
if (closed)
|
|
3217
|
+
return;
|
|
3218
|
+
if (writeBlocked && Date.now() - blockedAt > stallMs) {
|
|
3219
|
+
onEnd();
|
|
3220
|
+
return;
|
|
3221
|
+
}
|
|
3222
|
+
if (!writeBlocked)
|
|
3223
|
+
writeRaw(": hb\n\n");
|
|
3224
|
+
if (ownerCheckPending) {
|
|
3225
|
+
if (Date.now() - ownerCheckStartedAt > stallMs)
|
|
3226
|
+
onEnd();
|
|
3227
|
+
return;
|
|
3228
|
+
}
|
|
3229
|
+
ownerCheckPending = true;
|
|
3230
|
+
ownerCheckStartedAt = Date.now();
|
|
3231
|
+
void ownerOf(evSession).then((o) => {
|
|
3232
|
+
ownerCheckPending = false;
|
|
3233
|
+
if (!closed && o !== owner)
|
|
3234
|
+
onEnd();
|
|
3235
|
+
}).catch(() => { ownerCheckPending = false; });
|
|
3236
|
+
}, hbMs);
|
|
3237
|
+
hb.unref?.();
|
|
3238
|
+
}
|
|
3239
|
+
catch (e) {
|
|
3240
|
+
cleanup();
|
|
3241
|
+
if (!res.headersSent)
|
|
3242
|
+
sendJson(res, 500, { error: `session events failed: ${e instanceof Error ? e.message : "unknown"}` });
|
|
3243
|
+
else
|
|
3244
|
+
try {
|
|
3245
|
+
res.end();
|
|
3246
|
+
}
|
|
3247
|
+
catch { }
|
|
3248
|
+
}
|
|
3249
|
+
return;
|
|
3250
|
+
}
|
|
3251
|
+
}
|
|
3041
3252
|
if (deps.sessionAudit && req.method === "GET") {
|
|
3042
3253
|
const sm = /^\/v1\/sessions\/([^/]+)$/.exec(url);
|
|
3043
3254
|
if (sm) {
|
|
@@ -4195,6 +4406,9 @@ export function createHttpServer(deps) {
|
|
|
4195
4406
|
availableTools.add(name);
|
|
4196
4407
|
if (deps.checkpointStore)
|
|
4197
4408
|
availableTools.add("AskUserQuestion");
|
|
4409
|
+
if (spec.selfOrchestration === true && deps.config.selfOrchestrationEnabled) {
|
|
4410
|
+
availableTools.add("Workflow");
|
|
4411
|
+
}
|
|
4198
4412
|
if (decision === "approve" && pendingToolCanon && !availableTools.has(pendingToolCanon)) {
|
|
4199
4413
|
return {
|
|
4200
4414
|
status: 422,
|
|
@@ -4245,6 +4459,18 @@ export function createHttpServer(deps) {
|
|
|
4245
4459
|
fleetPub?.onTerminal(status);
|
|
4246
4460
|
};
|
|
4247
4461
|
let result;
|
|
4462
|
+
let reopenConfirmedPark = false;
|
|
4463
|
+
const confirmCheckpointReopened = async () => {
|
|
4464
|
+
const store = deps.checkpointStore;
|
|
4465
|
+
if (!store)
|
|
4466
|
+
return true;
|
|
4467
|
+
try {
|
|
4468
|
+
return (await store.findPendingTokenBySession(sessionId)) === token;
|
|
4469
|
+
}
|
|
4470
|
+
catch {
|
|
4471
|
+
return true;
|
|
4472
|
+
}
|
|
4473
|
+
};
|
|
4248
4474
|
let resumeHeartbeat;
|
|
4249
4475
|
let resumeManifestLease = 0;
|
|
4250
4476
|
let resumeStreamRef;
|
|
@@ -4299,18 +4525,27 @@ export function createHttpServer(deps) {
|
|
|
4299
4525
|
const vr = await resumeWithVerification(deps.runner, token, outcome, { ...taskConfig, signal: cancelCtrl.signal, preemptSignal: preemptCtrl.signal }, resumeObjective, { maxRounds: verifyRounds });
|
|
4300
4526
|
let safe = stripCheckpointToken(vr);
|
|
4301
4527
|
const reSuspended = vr.verification?.unverifiedReason === "suspended";
|
|
4528
|
+
const vrReopened = isCheckpointReopenedFailure(vr) && (await confirmCheckpointReopened());
|
|
4529
|
+
if (vrReopened)
|
|
4530
|
+
reopenConfirmedPark = true;
|
|
4302
4531
|
if (taskId && deps.runStore) {
|
|
4303
4532
|
const rs2 = deps.runStore;
|
|
4304
|
-
|
|
4305
|
-
|
|
4306
|
-
|
|
4307
|
-
|
|
4308
|
-
|
|
4309
|
-
|
|
4533
|
+
try {
|
|
4534
|
+
let seq = (await rs2.maxSeq(taskId)) + 1;
|
|
4535
|
+
const ap = (type, data) => rs2.appendEvent(taskId, seq++, type, data);
|
|
4536
|
+
await appendPromptManifest(ap, deps.promptManifests, taskId);
|
|
4537
|
+
if (reSuspended || vrReopened) {
|
|
4538
|
+
await appendModelUsageDelta(ap, deps.modelUsage, taskId);
|
|
4539
|
+
await ap("suspended", { gate: vr.checkpointGate ?? null, ...(vrReopened ? { reopened: vr.errorCode ?? null } : {}) });
|
|
4540
|
+
}
|
|
4541
|
+
else {
|
|
4542
|
+
safe = await attachModelUsage(safe, { append: ap, getEvents: (id, a) => rs2.getEvents(id, a), modelUsage: deps.modelUsage, taskId });
|
|
4543
|
+
await ap("done", { result: safe });
|
|
4544
|
+
}
|
|
4310
4545
|
}
|
|
4311
|
-
|
|
4312
|
-
|
|
4313
|
-
|
|
4546
|
+
catch (e) {
|
|
4547
|
+
if (!vrReopened)
|
|
4548
|
+
throw e;
|
|
4314
4549
|
}
|
|
4315
4550
|
}
|
|
4316
4551
|
if (reSuspended)
|
|
@@ -4469,6 +4704,16 @@ export function createHttpServer(deps) {
|
|
|
4469
4704
|
await appendModelUsageDelta(append, deps.modelUsage, taskId);
|
|
4470
4705
|
return r;
|
|
4471
4706
|
}
|
|
4707
|
+
if (isCheckpointReopenedFailure(r) && (await confirmCheckpointReopened())) {
|
|
4708
|
+
reopenConfirmedPark = true;
|
|
4709
|
+
try {
|
|
4710
|
+
await append("suspended", { gate: null, reopened: r.errorCode ?? null });
|
|
4711
|
+
await appendModelUsageDelta(append, deps.modelUsage, taskId);
|
|
4712
|
+
}
|
|
4713
|
+
catch {
|
|
4714
|
+
}
|
|
4715
|
+
return r;
|
|
4716
|
+
}
|
|
4472
4717
|
const safe = await attachModelUsage(stripCheckpointToken(r), { append, getEvents: (id, a) => rs.getEvents(id, a), modelUsage: deps.modelUsage, taskId });
|
|
4473
4718
|
await append("done", { result: safe });
|
|
4474
4719
|
if (taskConfig.suggestNextPrompts && safe.status === "completed") {
|
|
@@ -4541,21 +4786,23 @@ export function createHttpServer(deps) {
|
|
|
4541
4786
|
resumeLegLive = false;
|
|
4542
4787
|
}
|
|
4543
4788
|
evictIfConflict(deps.runner, sessionId, result);
|
|
4789
|
+
const checkpointReopened = reopenConfirmedPark;
|
|
4544
4790
|
if (taskId && deps.runStore) {
|
|
4545
|
-
if (result.status === "suspended")
|
|
4791
|
+
if (result.status === "suspended" || checkpointReopened)
|
|
4546
4792
|
await deps.runStore.setSuspended(taskId);
|
|
4547
4793
|
else if (result.status === "needs_review")
|
|
4548
4794
|
await deps.runStore.setNeedsReview(taskId);
|
|
4549
4795
|
else
|
|
4550
4796
|
await deps.runStore.setTerminal(taskId, result.status, stripCheckpointToken(result), result.errorMessage ?? null);
|
|
4551
4797
|
}
|
|
4552
|
-
settleFleet(result.status);
|
|
4798
|
+
settleFleet(checkpointReopened ? "suspended" : result.status);
|
|
4553
4799
|
return {
|
|
4554
4800
|
status: 200,
|
|
4555
4801
|
body: {
|
|
4556
4802
|
taskId, sessionId, status: result.status,
|
|
4557
4803
|
...(result.errorCode ? { errorCode: result.errorCode } : {}),
|
|
4558
4804
|
...(result.errorMessage ? { errorMessage: redactSecrets(result.errorMessage) } : {}),
|
|
4805
|
+
...(checkpointReopened ? { retriable: true } : {}),
|
|
4559
4806
|
},
|
|
4560
4807
|
};
|
|
4561
4808
|
}
|