@sema-agent/server 1.199.0 → 1.201.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.map +1 -1
- package/dist/http/server.js +100 -6
- package/dist/http/server.js.map +1 -1
- package/dist/main.js +4 -0
- package/dist/main.js.map +1 -1
- package/dist/model-select.d.ts +2 -0
- package/dist/model-select.d.ts.map +1 -1
- package/dist/model-select.js +20 -2
- package/dist/model-select.js.map +1 -1
- package/dist/plugins/file-run-store.d.ts +5 -1
- package/dist/plugins/file-run-store.d.ts.map +1 -1
- package/dist/plugins/file-run-store.js +50 -3
- package/dist/plugins/file-run-store.js.map +1 -1
- package/dist/plugins/local-checkpoint-store.d.ts +4 -0
- package/dist/plugins/local-checkpoint-store.d.ts.map +1 -1
- package/dist/plugins/local-checkpoint-store.js +52 -0
- package/dist/plugins/local-checkpoint-store.js.map +1 -1
- package/dist/plugins/memory-run-store.d.ts +9 -1
- package/dist/plugins/memory-run-store.d.ts.map +1 -1
- package/dist/plugins/memory-run-store.js +53 -4
- package/dist/plugins/memory-run-store.js.map +1 -1
- package/dist/plugins/store-backend.d.ts.map +1 -1
- package/dist/plugins/store-backend.js +11 -4
- package/dist/plugins/store-backend.js.map +1 -1
- package/dist/sema-registry.d.ts +4 -0
- package/dist/sema-registry.d.ts.map +1 -1
- package/dist/sema-registry.js +29 -6
- package/dist/sema-registry.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,
|
|
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
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import http from "node:http";
|
|
2
2
|
import { once } from "node:events";
|
|
3
3
|
import { timingSafeEqual, createHash, randomBytes } from "node:crypto";
|
|
4
|
-
import { uuidv7, isThinkingLevel, DEFAULT_EFFORT_LEVELS, materializeMcpTools, runWithVerification, resumeWithVerification, runCascade, CheckpointError, mintCheckpointToken, SessionPolicyError, SessionError, HAND_TOOL_EFFECTS, canonicalToolName, formatUserScope, validatePendingSteer, StreamingImportValidator, listWorkflowRuns, getWorkflowRun, subscribeWorkflow, deriveAgentDisplayStatus } from "@sema-agent/core";
|
|
4
|
+
import { uuidv7, isThinkingLevel, DEFAULT_EFFORT_LEVELS, expandTiers, materializeMcpTools, runWithVerification, resumeWithVerification, runCascade, CheckpointError, mintCheckpointToken, SessionPolicyError, SessionError, HAND_TOOL_EFFECTS, canonicalToolName, formatUserScope, validatePendingSteer, StreamingImportValidator, listWorkflowRuns, getWorkflowRun, subscribeWorkflow, deriveAgentDisplayStatus } from "@sema-agent/core";
|
|
5
|
+
import { matchCatalogModel } from "../model-select.js";
|
|
5
6
|
import { mcpForScenario } from "../sema-registry.js";
|
|
6
7
|
import { HttpError, principalFrom, verifiedPrincipal, setSsoPrincipal, ssoVerifiedPrincipal, setSsoScope, isUuidV7, isUuidShape, verifyDirectDoorProof } from "../security.js";
|
|
7
8
|
import { exportSession, exportSessionManifest, importSession, classifySyncRelationshipByIds, SyncConflictError, stagingIdFor } from "../session-sync.js";
|
|
@@ -632,7 +633,9 @@ export function createHttpServer(deps) {
|
|
|
632
633
|
...(m.maxTokens ? { maxOutputTokens: m.maxTokens } : {}),
|
|
633
634
|
...(m.reasoning ? { supportedEffortLevels: [...DEFAULT_EFFORT_LEVELS] } : {}),
|
|
634
635
|
}));
|
|
635
|
-
|
|
636
|
+
const nonAlias = Object.entries(deps.config.models).filter(([n]) => n !== "default");
|
|
637
|
+
const defaultName = (nonAlias.find(([, m]) => m === deps.config.model) ?? nonAlias.find(([, m]) => m.id === deps.config.model.id))?.[0];
|
|
638
|
+
sendJson(res, 200, { models, default: deps.config.model.id, defaultModel: { id: deps.config.model.id, ...(defaultName ? { name: defaultName } : {}) } });
|
|
636
639
|
return;
|
|
637
640
|
}
|
|
638
641
|
if (req.method === "POST" && (url === "/v1/tasks" || url === "/v1/tasks/stream")) {
|
|
@@ -717,6 +720,7 @@ export function createHttpServer(deps) {
|
|
|
717
720
|
resp = await idemCache.run(idemKey, async () => {
|
|
718
721
|
ranLive = true;
|
|
719
722
|
let finalResult;
|
|
723
|
+
let runRowSettled = false;
|
|
720
724
|
let durableTaskId;
|
|
721
725
|
let durableHeartbeat;
|
|
722
726
|
let userMsgEntryId;
|
|
@@ -920,10 +924,13 @@ export function createHttpServer(deps) {
|
|
|
920
924
|
settleFleet("suspended");
|
|
921
925
|
}
|
|
922
926
|
else {
|
|
923
|
-
|
|
927
|
+
const dcErr = "stream client disconnected before completion (run aborted)";
|
|
928
|
+
const dc = { taskId: durableTaskId, sessionId: prepared.spec.sessionId ?? "", status: "failed", errorCode: "cancelled", errorMessage: dcErr, stats: { turns: 0, tokens: 0 } };
|
|
929
|
+
await deps.runStore.setTerminal(durableTaskId, "failed", dc, dcErr);
|
|
924
930
|
settleFleet("failed");
|
|
925
931
|
}
|
|
926
932
|
}
|
|
933
|
+
runRowSettled = true;
|
|
927
934
|
}
|
|
928
935
|
}
|
|
929
936
|
finally {
|
|
@@ -934,6 +941,27 @@ export function createHttpServer(deps) {
|
|
|
934
941
|
steerableRuns.delete(durableTaskId);
|
|
935
942
|
for (const evict of subagentHandleEvictions)
|
|
936
943
|
evict();
|
|
944
|
+
if (!runRowSettled && durableTaskId && deps.runStore) {
|
|
945
|
+
try {
|
|
946
|
+
const row = await deps.runStore.getRun(durableTaskId);
|
|
947
|
+
if (row?.status === "running") {
|
|
948
|
+
const pending = prepared.spec.sessionId ? await deps.checkpointStore?.findPendingTokenBySession(prepared.spec.sessionId) : undefined;
|
|
949
|
+
if (pending) {
|
|
950
|
+
await deps.runStore.setSuspended(durableTaskId);
|
|
951
|
+
settleFleet("suspended");
|
|
952
|
+
}
|
|
953
|
+
else if (ac.signal.aborted) {
|
|
954
|
+
const err = "stream aborted before completion (run cancelled)";
|
|
955
|
+
const c = { taskId: durableTaskId, sessionId: prepared.spec.sessionId ?? "", status: "failed", errorCode: "cancelled", errorMessage: err, stats: { turns: 0, tokens: 0 } };
|
|
956
|
+
await deps.runStore.setTerminal(durableTaskId, "failed", c, err);
|
|
957
|
+
}
|
|
958
|
+
else
|
|
959
|
+
await deps.runStore.setTerminal(durableTaskId, "failed", null, "stream leg threw before a terminal event");
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
catch {
|
|
963
|
+
}
|
|
964
|
+
}
|
|
937
965
|
settleFleet("failed");
|
|
938
966
|
}
|
|
939
967
|
return { status: 200, body: finalResult };
|
|
@@ -1166,12 +1194,63 @@ export function createHttpServer(deps) {
|
|
|
1166
1194
|
}
|
|
1167
1195
|
if (!runOwnerOk(req, res, run.owner))
|
|
1168
1196
|
return;
|
|
1197
|
+
const rs = deps.runStore;
|
|
1198
|
+
const cancelSuspended = async () => {
|
|
1199
|
+
const cs = deps.checkpointStore;
|
|
1200
|
+
let note = "cancelled while suspended (pending approval settled)";
|
|
1201
|
+
if (cs) {
|
|
1202
|
+
const token = await cs.findPendingTokenBySession(run.sessionId);
|
|
1203
|
+
if (token) {
|
|
1204
|
+
const cp = await cs.get(token);
|
|
1205
|
+
const won = cp ? await cs.expire(token, cp.scope) : false;
|
|
1206
|
+
if (!won) {
|
|
1207
|
+
const now = await rs.getRun(taskId);
|
|
1208
|
+
const st = now?.status;
|
|
1209
|
+
if (st === "suspended" || st === "needs_review" || st === "running") {
|
|
1210
|
+
sendJson(res, 409, { taskId, status: st, error: "pending approval was decided concurrently — the run is resuming; retry cancel to stop it" });
|
|
1211
|
+
}
|
|
1212
|
+
else {
|
|
1213
|
+
sendJson(res, 202, { taskId, status: st ?? "failed", note: "run already terminal — cancel is a no-op" });
|
|
1214
|
+
}
|
|
1215
|
+
return;
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
else {
|
|
1219
|
+
const claimed = await rs.markResuming(taskId);
|
|
1220
|
+
if (!claimed) {
|
|
1221
|
+
const now = await rs.getRun(taskId);
|
|
1222
|
+
const st = now?.status;
|
|
1223
|
+
if (st === "running" || st === "suspended" || st === "needs_review") {
|
|
1224
|
+
sendJson(res, 409, { taskId, status: st, error: "pending approval was decided concurrently — the run is resuming; retry cancel to stop it" });
|
|
1225
|
+
}
|
|
1226
|
+
else {
|
|
1227
|
+
sendJson(res, 202, { taskId, status: st ?? "failed", note: "run already terminal — cancel is a no-op" });
|
|
1228
|
+
}
|
|
1229
|
+
return;
|
|
1230
|
+
}
|
|
1231
|
+
note = "cancelled while suspended (no pending approval found — stale park released)";
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
else {
|
|
1235
|
+
note = "cancelled while suspended (no checkpoint store on this deployment — run row terminalized only)";
|
|
1236
|
+
}
|
|
1237
|
+
const err = note;
|
|
1238
|
+
try {
|
|
1239
|
+
const result = { taskId, sessionId: run.sessionId, status: "failed", errorCode: "cancelled", errorMessage: err, stats: { turns: 0, tokens: 0 } };
|
|
1240
|
+
await rs.setTerminal(taskId, "failed", result, err);
|
|
1241
|
+
}
|
|
1242
|
+
catch (e) {
|
|
1243
|
+
sendJson(res, 500, { taskId, error: `cancel settled the pending approval but could not terminalize the run row — retry cancel (${e instanceof Error ? e.message : String(e)})` });
|
|
1244
|
+
return;
|
|
1245
|
+
}
|
|
1246
|
+
sendJson(res, 202, { taskId, status: "failed", errorCode: "cancelled", note });
|
|
1247
|
+
};
|
|
1169
1248
|
if (run.status === "running") {
|
|
1170
1249
|
const flagged = await deps.runStore.requestCancel(taskId, run.owner);
|
|
1171
1250
|
if (!flagged) {
|
|
1172
1251
|
const now = await deps.runStore.getRun(taskId);
|
|
1173
1252
|
if (now?.status === "suspended") {
|
|
1174
|
-
|
|
1253
|
+
await cancelSuspended();
|
|
1175
1254
|
}
|
|
1176
1255
|
else {
|
|
1177
1256
|
sendJson(res, 202, { taskId, status: now?.status ?? "failed", note: "run already terminal — cancel is a no-op" });
|
|
@@ -1181,8 +1260,8 @@ export function createHttpServer(deps) {
|
|
|
1181
1260
|
inflightRuns.get(taskId)?.abort();
|
|
1182
1261
|
sendJson(res, 202, { taskId, status: "cancelling" });
|
|
1183
1262
|
}
|
|
1184
|
-
else if (run.status === "suspended") {
|
|
1185
|
-
|
|
1263
|
+
else if (run.status === "suspended" || run.status === "needs_review") {
|
|
1264
|
+
await cancelSuspended();
|
|
1186
1265
|
}
|
|
1187
1266
|
else {
|
|
1188
1267
|
sendJson(res, 202, { taskId, status: run.status, note: "run already terminal — cancel is a no-op" });
|
|
@@ -3770,6 +3849,21 @@ export function createHttpServer(deps) {
|
|
|
3770
3849
|
}
|
|
3771
3850
|
}
|
|
3772
3851
|
}
|
|
3852
|
+
if (body.model !== undefined) {
|
|
3853
|
+
if (typeof body.model !== "string" || body.model.length === 0) {
|
|
3854
|
+
sendJson(res, 400, { error: "model must be a non-empty string (a configured catalog name, tier word, or model id)" });
|
|
3855
|
+
return null;
|
|
3856
|
+
}
|
|
3857
|
+
const bare = deps.config.models ?? {};
|
|
3858
|
+
const catalog = expandTiers(bare, deps.config.tiers ?? {}) ?? bare;
|
|
3859
|
+
if (matchCatalogModel(body.model, catalog) === undefined) {
|
|
3860
|
+
sendJson(res, 400, {
|
|
3861
|
+
error: `unknown model "${body.model.slice(0, 120)}" — not in the configured catalog (name, tier word, or id)`,
|
|
3862
|
+
available: Object.keys(catalog).filter((n) => n !== "default"),
|
|
3863
|
+
});
|
|
3864
|
+
return null;
|
|
3865
|
+
}
|
|
3866
|
+
}
|
|
3773
3867
|
if (body.attachments !== undefined) {
|
|
3774
3868
|
const a = body.attachments;
|
|
3775
3869
|
if (typeof a !== "object" || a === null || Array.isArray(a)) {
|