@sema-agent/server 3.4.2 → 3.5.1
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/bench/s1/reviewer.d.ts +0 -1
- package/dist/config-types.d.ts +5 -1
- package/dist/config.js +4 -1
- package/dist/elicitation.d.ts +0 -7
- package/dist/elicitation.js +0 -4
- package/dist/fleet/fleet-bus.d.ts +7 -1
- package/dist/fleet/fleet-bus.js +15 -10
- package/dist/http/routes/approvals-assistant.js +19 -1
- package/dist/http/server.d.ts +2 -0
- package/dist/http/server.js +61 -46
- package/dist/lsp/types.d.ts +1 -1
- package/dist/main.js +28 -1
- package/dist/orchestration/hardened-vm-runner.d.ts +0 -2
- package/dist/orchestration/hardened-vm-runner.js +1 -6
- package/dist/question.d.ts +0 -4
- package/dist/question.js +0 -4
- package/dist/tool-approval.d.ts +0 -5
- package/dist/tool-approval.js +0 -5
- package/package.json +2 -2
|
@@ -22,7 +22,6 @@ export declare const THINK_MS: {
|
|
|
22
22
|
/** A pre-action plan review (`CheckpointGate.kind === "plan_review"`). */
|
|
23
23
|
readonly plan_review: 45000;
|
|
24
24
|
};
|
|
25
|
-
export type GateKind = keyof typeof THINK_MS;
|
|
26
25
|
/** Look up the fixed modeled think-time for a gate kind (defaults to the `human` rubric for an unknown kind). */
|
|
27
26
|
export declare function thinkMsForGate(gateKind: string): number;
|
|
28
27
|
/** The trap slice the reviewer needs to apply its rubric (kept narrow to avoid a circular import on tasks.ts). */
|
package/dist/config-types.d.ts
CHANGED
|
@@ -357,6 +357,10 @@ export interface ServiceConfigFlat {
|
|
|
357
357
|
* `BIND_HOST`(兼容 `HOST`)。显式值恒生效;缺省见 {@link resolveBindHost}——**无鉴权写面
|
|
358
358
|
* (allowUnauthedWrites 且零凭证)自动收窄到 127.0.0.1**,其余维持全接口(既有部署零影响)。 */
|
|
359
359
|
bindHost?: string;
|
|
360
|
+
/** [2062]③ `bindHost` 的取值来源(BIND_HOST 显式 / HOST 兼容名 / 未设)。`"HOST"` 时 main.ts 打一行
|
|
361
|
+
* 启动告警:zsh 常把 HOST 设成机器名,`{...process.env}` 起底的壳会静默继承给引擎——bind 面被 shell
|
|
362
|
+
* 环境暗配而部署者不知情(HOST=机器名解析到 LAN 口时=静默扩暴露面)。 */
|
|
363
|
+
bindHostSource?: "BIND_HOST" | "HOST";
|
|
360
364
|
/** D-1 附件孤儿对象 GC 的 grace(毫秒;`ATTACHMENT_ORPHAN_GRACE_MS`,默认 1h,**0=关掉本腿**)。
|
|
361
365
|
* 复审 F10:同 tick 邻居(workflowOrphanGraceMs/attachmentUnboundTtlMs/scratchpadSweepTtlMs)都有
|
|
362
366
|
* 旋钮——存量对象巨大的部署要调慢/停掉,不该被迫取消 MinIO 配置(那会连带关掉整个附件面)。 */
|
|
@@ -864,7 +868,7 @@ export type ServiceApprovalConfig = Pick<ServiceConfigFlat, "approvalRequire" |
|
|
|
864
868
|
export type ServiceMemoryConfig = Pick<ServiceConfigFlat, "memoryEngineEnabled" | "memoryEngineDir" | "memoryEngineRemoteLaneAllowed" | "memoryEngineBackend" | "memoryScope" | "memorySync" | "projectMemoryEnabled" | "syncImportLeaseStaleSec">;
|
|
865
869
|
/** 组:auth(鉴权 / 身份 / 治理棒)。`commandPolicy` 只有 sema-registry 腿(无 env 标量形),故 env 解析
|
|
866
870
|
* 函数不产出它,但它与 `autonomy` 是同一根治理棒的两半,归本组。 */
|
|
867
|
-
export type ServiceAuthConfig = Pick<ServiceConfigFlat, "authToken" | "authTokens" | "allowUnauthedWrites" | "corsOrigins" | "principalHeader" | "requirePrincipal" | "autonomy" | "commandPolicy" | "operatorPrincipals" | "principalJwtPubkeys" | "principalJwtIss" | "principalJwtAud" | "principalJwtMaxTtlSec" | "bindHost">;
|
|
871
|
+
export type ServiceAuthConfig = Pick<ServiceConfigFlat, "authToken" | "authTokens" | "allowUnauthedWrites" | "corsOrigins" | "principalHeader" | "requirePrincipal" | "autonomy" | "commandPolicy" | "operatorPrincipals" | "principalJwtPubkeys" | "principalJwtIss" | "principalJwtAud" | "principalJwtMaxTtlSec" | "bindHost" | "bindHostSource">;
|
|
868
872
|
/** 组:orchestration(编排 + 执行车道 + 沙箱面 + workflow/后台 agent 存留)。 */
|
|
869
873
|
export type ServiceOrchestrationConfig = Pick<ServiceConfigFlat, "remoteExec" | "worktreeIsolation" | "leaderEnabled" | "leaderFanoutEnabled" | "routerEnabled" | "selfOrchestrationEnabled" | "selfOrchestrationModels" | "selfOrchestrationWorkerIsolation" | "forkEnabled" | "experimentalObserverAgents" | "schedulerEnabled" | "schedulerSessionWakeup" | "schedulerStorePath" | "planModeEnabled" | "workflowRunStoreBackend" | "workflowOrphanGraceMs" | "workflowJournalRetentionMs" | "workflowRunRetentionMs" | "workflowAgentsReadOnly" | "workflowSizeGuideline" | "backgroundAgentRetentionMs" | "backgroundAgentStaleRunningMs" | "backgroundAgentParkClaimStaleMs" | "rosterRetentionMs" | "scratchpadSweepTtlMs" | "sandboxPkgSource" | "sessionAutoTitle" | "selectEnvironmentTool" | "envFactsEnabled" | "toolDeferLongtail" | "lspEnabled" | "lspHostEnabled" | "imageBakes">;
|
|
870
874
|
/** 组:limitsHttp(HTTP 面 + 各类上限/配额/回收窗)。 */
|
package/dist/config.js
CHANGED
|
@@ -873,6 +873,9 @@ function parseAuthDomain(ctx) {
|
|
|
873
873
|
return {
|
|
874
874
|
// 绑址([1934]):BIND_HOST 优先,HOST 兼容(cli/桌面传的就是它);空串=未设。
|
|
875
875
|
bindHost: process.env.BIND_HOST || process.env.HOST || undefined,
|
|
876
|
+
// [2062]③ 来源记账:HOST 是 zsh 会替用户设的名字(HOST=机器名),{...process.env} 起底的壳会把它
|
|
877
|
+
// 静默继承给引擎——bind 面被 shell 环境暗配而部署者不知情。main.ts 对 "HOST" 来源打一行启动告警。
|
|
878
|
+
bindHostSource: process.env.BIND_HOST ? "BIND_HOST" : process.env.HOST ? "HOST" : undefined,
|
|
876
879
|
authToken: process.env.SERVICE_AUTH_TOKEN,
|
|
877
880
|
authTokens,
|
|
878
881
|
allowUnauthedWrites: boolEnv("ALLOW_UNAUTHED_WRITES", false),
|
|
@@ -1224,7 +1227,7 @@ const MEMORY_GROUP_KEYS = [
|
|
|
1224
1227
|
const AUTH_GROUP_KEYS = [
|
|
1225
1228
|
"authToken", "authTokens", "allowUnauthedWrites", "corsOrigins", "principalHeader", "requirePrincipal", "autonomy",
|
|
1226
1229
|
"commandPolicy", "operatorPrincipals", "principalJwtPubkeys", "principalJwtIss", "principalJwtAud",
|
|
1227
|
-
"principalJwtMaxTtlSec", "bindHost",
|
|
1230
|
+
"principalJwtMaxTtlSec", "bindHost", "bindHostSource",
|
|
1228
1231
|
];
|
|
1229
1232
|
const ORCHESTRATION_GROUP_KEYS = [
|
|
1230
1233
|
"remoteExec", "worktreeIsolation", "leaderEnabled", "leaderFanoutEnabled", "routerEnabled", "selfOrchestrationEnabled",
|
package/dist/elicitation.d.ts
CHANGED
|
@@ -25,9 +25,6 @@ export interface ElicitationRunContext {
|
|
|
25
25
|
emit: (frame: ElicitationFrame) => void | Promise<void>;
|
|
26
26
|
abortSignal?: AbortSignal;
|
|
27
27
|
}
|
|
28
|
-
/** @deprecated design/158 N22: the root word got truncated at naming time — `ElicitationFrame` / `ElicitationThrottle` /
|
|
29
|
-
* `ElicitationCoordinator` all spell it out; this alias was the odd one. Use {@link ElicitationRunContext}. */
|
|
30
|
-
export type ElicitRunContext = ElicitationRunContext;
|
|
31
28
|
export interface ElicitationThrottle {
|
|
32
29
|
/** Max concurrent in-flight elicitations per run leg (parallel tool calls can each elicit). Breach ⇒ decline. */
|
|
33
30
|
maxConcurrentPerRun: number;
|
|
@@ -49,10 +46,6 @@ export declare function parseElicitationResponse(body: unknown): {
|
|
|
49
46
|
ok: false;
|
|
50
47
|
error: string;
|
|
51
48
|
};
|
|
52
|
-
/** @deprecated design/158 N22: renamed to {@link parseElicitationResponse} — unifies the HITL trio's parse-fn
|
|
53
|
-
* vocabulary (`parseQuestionResponse` / `parseElicitationResponse` / `parseToolApprovalResponse`, all "the
|
|
54
|
-
* human's reply body"). Kept as a compat alias. */
|
|
55
|
-
export declare const parseElicitResponse: typeof parseElicitationResponse;
|
|
56
49
|
/**
|
|
57
50
|
* Coordinates inbound MCP elicitations for one server instance. Process-local + same-replica (the pending map is in
|
|
58
51
|
* memory, like `steerableRuns`): a respond that lands on another replica finds nothing → 404. Present (passed into
|
package/dist/elicitation.js
CHANGED
|
@@ -65,10 +65,6 @@ export function parseElicitationResponse(body) {
|
|
|
65
65
|
}
|
|
66
66
|
return { ok: true, value: { action: b.action } };
|
|
67
67
|
}
|
|
68
|
-
/** @deprecated design/158 N22: renamed to {@link parseElicitationResponse} — unifies the HITL trio's parse-fn
|
|
69
|
-
* vocabulary (`parseQuestionResponse` / `parseElicitationResponse` / `parseToolApprovalResponse`, all "the
|
|
70
|
-
* human's reply body"). Kept as a compat alias. */
|
|
71
|
-
export const parseElicitResponse = parseElicitationResponse;
|
|
72
68
|
/** redactDeep + size-bound an UNTRUSTED `requestedSchema` before it is persisted to the durable log / streamed
|
|
73
69
|
* (the same redact-at-write contract every other untrusted structured field honors, e.g. tool_end.output). A JSON
|
|
74
70
|
* Schema's free-text carriers (description/title/default/enum) can smuggle a secret. Over the byte cap ⇒ undefined
|
|
@@ -16,7 +16,13 @@ export type FleetTaskStatus = "queued" | "running" | "waiting" | "stopping" | "a
|
|
|
16
16
|
* shell-local render state the renderer composes; the wire carries the data that TRANSITIONS). */
|
|
17
17
|
export interface FleetTaskRow {
|
|
18
18
|
id: string;
|
|
19
|
-
|
|
19
|
+
/** 显示名。**缺席不铸**([2070]③ cli 定谳,server 3.5.1):没有真名时本键**不发**。
|
|
20
|
+
* ⚠️ 两代语义留档 —— 3.5.0 及以前,三处在无真名时把**行 id** 顶到本位(匿名子代 tick 铸子代 uuid、
|
|
21
|
+
* `onChildTerminal` 合成终帧铸 a\* handle、`publishTask` 懒铸底座铸行 id),于是人眼看到一串乱码
|
|
22
|
+
* (clay 亲报的「子代名乱码」形),消费端也**分不清**「它就叫这个」与「我们不知道它叫什么」。
|
|
23
|
+
* 3.5.1 起后者 = 键缺席,显示占位归客户端渲(cli 已收敛 `'(unnamed)'`)。同一条纪律见 [2053]
|
|
24
|
+
* costUSD:诚实缺席 > 编造。(SDK `FleetTaskRow.name` 同步放宽 —— 见发车工单。) */
|
|
25
|
+
name?: string;
|
|
20
26
|
description?: string;
|
|
21
27
|
/** §K-7 (shell ASK 2026-06-28; byte-aligned to `@sema-agent/sdk` 0.0.39 `FleetTaskRow.agentType`/`agentName`) — a
|
|
22
28
|
* SHORT agent-TYPE label so the picker renders like CC 187 (`Explore`/`general-purpose`/`code-review`) instead of
|
package/dist/fleet/fleet-bus.js
CHANGED
|
@@ -41,7 +41,9 @@ export class FleetEventBus {
|
|
|
41
41
|
/** Upsert a task row (MERGE onto any existing row by `id`) + fan out the merged row. Publishers may send a
|
|
42
42
|
* partial `{ id, tokens }` etc.; the row keeps its other fields. */
|
|
43
43
|
publishTask(delta) {
|
|
44
|
-
|
|
44
|
+
// [2070]③:懒铸底座**不带 name** —— 一条只有 `{id,…}` 的首帧此前会把行 id 铸成显示名,而这里
|
|
45
|
+
// 恰恰是「谁都没给过名字」的位置。真名后到时照常 MERGE 上行(见本文件末的 [2070]③ 第 4 条钉)。
|
|
46
|
+
const merged = { ...(this.tasks.get(delta.id) ?? { id: delta.id, status: "running" }), ...delta };
|
|
45
47
|
this.tasks.set(delta.id, merged);
|
|
46
48
|
this.emit({ type: "task", row: merged, ts: this.now() });
|
|
47
49
|
}
|
|
@@ -157,16 +159,16 @@ export function fleetRunPublisher(bus, run) {
|
|
|
157
159
|
// core 1.147 subagent usage tick (per-turn, cumulative) → a CHILD fleet row nested under the run.
|
|
158
160
|
const cid = childId(ev.taskId);
|
|
159
161
|
children.add(cid);
|
|
160
|
-
// BC-2 (core 1.151): use the subagent's sanitized display `name` (taskName/agent-type) for the child row
|
|
161
|
-
//
|
|
162
|
-
//
|
|
162
|
+
// BC-2 (core 1.151): use the subagent's sanitized display `name` (taskName/agent-type) for the child row.
|
|
163
|
+
// [2070]③:name 缺席时**不铸**(此前回落 taskId=子代 uuid,人眼乱码)——行 IDENTITY 一直是 `cid`
|
|
164
|
+
// (runId+taskId),显示名与身份是两件事,没有显示名就让客户端渲占位。
|
|
163
165
|
// [WF2-A] redact the subagent display name for PARITY with the top-level run name (fleetRunLabels): core
|
|
164
166
|
// sanitizes it for RENDERING (ANSI/NUL strip + truncate) but does NOT secret-redact, so a secret-shaped
|
|
165
167
|
// taskName would leak verbatim on the child row without this.
|
|
166
168
|
// §K-7: `ev.name` IS the subagent TYPE (BC-2: taskName / selected agent-type) → ALSO surface it as
|
|
167
169
|
// `agentType` (the picker's short-label field), not only the display `name`. Absent name (anonymous
|
|
168
|
-
// subagent) →
|
|
169
|
-
const childName =
|
|
170
|
+
// subagent) → 两位一起缺席(name/agentType 同源同命)。One redacted value (name === agentType).
|
|
171
|
+
const childName = ev.name !== undefined ? redactSecrets(ev.name) : undefined;
|
|
170
172
|
if (!childStartedAt.has(cid))
|
|
171
173
|
childStartedAt.set(cid, Date.now());
|
|
172
174
|
if (ev.parentToolCallId)
|
|
@@ -174,7 +176,7 @@ export function fleetRunPublisher(bus, run) {
|
|
|
174
176
|
// [1415]③ 点亮半场:core 1.354 起 settle 时补终态 tick(status 值域 additive 扩 completed|failed;
|
|
175
177
|
// 此前恒 "running"=行为逐位不变)——workflow 子的 uuid 行终于有完成态可见(running→removed 的
|
|
176
178
|
// [1414]#3 形就此闭)。
|
|
177
|
-
bus.publishTask({ id: cid,
|
|
179
|
+
bus.publishTask({ id: cid, ...(childName !== undefined ? { name: childName, agentType: childName } : {}), parentId: run.runId, scope: run.scope, ...sessionField, status: tickStatus(ev.status), tokens: sumTokens(ev.usage), ...(() => { const t = toolUsesOf(ev.usage); return t !== undefined ? { toolUses: t } : {}; })(), elapsedMs: Date.now() - childStartedAt.get(cid) });
|
|
178
180
|
}
|
|
179
181
|
else if (ev.type === "tool_start" && ev.toolName) {
|
|
180
182
|
// BC-1 (clay 2026-06-27): the top-level run row's `description` = LIVE ACTIVITY (the tool now running), NOT
|
|
@@ -212,12 +214,13 @@ export function fleetRunPublisher(bus, run) {
|
|
|
212
214
|
const parentId = ev.parentTaskId && ev.parentTaskId !== run.rootTaskId ? childId(ev.parentTaskId) : run.runId;
|
|
213
215
|
// [WF2-A] redact the forwarded subagent name for parity with the top-level run name (see onEvent above).
|
|
214
216
|
// §K-7: ev.name IS the subagent type → also surface it as `agentType` (picker short label). Reuse the value.
|
|
215
|
-
|
|
217
|
+
// [2070]③ 同 onEvent 臂:无 name ⇒ name/agentType 两位一起缺席(不拿 taskId 冒充显示名)。
|
|
218
|
+
const fwdName = ev.name !== undefined ? redactSecrets(ev.name) : undefined;
|
|
216
219
|
if (!childStartedAt.has(cid))
|
|
217
220
|
childStartedAt.set(cid, Date.now());
|
|
218
221
|
if (ev.parentToolCallId)
|
|
219
222
|
childByToolCall.set(ev.parentToolCallId, cid);
|
|
220
|
-
bus.publishTask({ id: cid,
|
|
223
|
+
bus.publishTask({ id: cid, ...(fwdName !== undefined ? { name: fwdName, agentType: fwdName } : {}), parentId, scope: run.scope, ...sessionField, status: tickStatus(ev.status), tokens: sumTokens(ev.usage), ...(() => { const t = toolUsesOf(ev.usage); return t !== undefined ? { toolUses: t } : {}; })(), elapsedMs: Date.now() - childStartedAt.get(cid) }); // [1415]③ 同上;[1748] toolUses 同 bg lane 口径
|
|
221
224
|
},
|
|
222
225
|
onChildTerminal(taskId, status, altId, toolUseId) {
|
|
223
226
|
// A background subagent/bash CHILD settles — task_progress never emits a terminal tick,
|
|
@@ -251,9 +254,11 @@ export function fleetRunPublisher(bus, run) {
|
|
|
251
254
|
const liveCids = candidateCids.filter((c) => children.has(c));
|
|
252
255
|
const hadRow = liveCids.length > 0;
|
|
253
256
|
// 都没活行 = bash 无 tick 形:按首候选合成瞬态终帧(建即离,诚实且无害)。
|
|
257
|
+
// [2070]③:合成帧**不铸 name** —— 这条「瞬态」帧会被壳的终态留存池渲 60s,顶上去的 a\* handle
|
|
258
|
+
// 在那 60s 里就是用户看到的名字。父链接/租户/会话三位照发(它们是归属事实,不是显示名)。
|
|
254
259
|
for (const cid of hadRow ? liveCids : [childId(taskId)]) {
|
|
255
260
|
const startedAtChild = childStartedAt.get(cid);
|
|
256
|
-
bus.publishTask({ id: cid, ...(children.has(cid) ? {} : {
|
|
261
|
+
bus.publishTask({ id: cid, ...(children.has(cid) ? {} : { parentId: run.runId, scope: run.scope, ...sessionField }), status: fleetStatus, ...(startedAtChild !== undefined ? { elapsedMs: Date.now() - startedAtChild } : {}) });
|
|
257
262
|
bus.removeTask(cid);
|
|
258
263
|
children.delete(cid);
|
|
259
264
|
childStartedAt.delete(cid);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { canonicalToolName } from "@sema-agent/core";
|
|
2
2
|
import { principalFrom, verifyDirectDoorProof, MAX_APPROVAL_REASON_CHARS } from "../../security.js";
|
|
3
3
|
import { redactedPreview } from "../../trace/redact.js";
|
|
4
|
+
import { fleetRunLabels } from "../../fleet/fleet-bus.js"; // [2069]④ §3 行展示名与 fleet 行同源(见用处的注)
|
|
4
5
|
import { sleep } from "../sse-log.js";
|
|
5
6
|
import { sendJson, sendError, sseHeaders } from "../send.js";
|
|
6
7
|
import { gatedPrincipal, explicitOperatorOk, isOperator } from "../principal-gate.js";
|
|
@@ -227,7 +228,24 @@ async function handleApprovalsAssistantBody(req, res, url, ctx, miss) {
|
|
|
227
228
|
// ③ 补偿=(a) 行**不消失**——它仍在本列表里带真实 `status`,「所有还停着的任务」由 status 回答;
|
|
228
229
|
// (b) failSuspendedWithExpiredCheckpoint 三个 run store 全实装、每 tick 无条件跑(不受
|
|
229
230
|
// APPROVAL_TIMEOUT_SEC 开关),窗口由 REAP_INTERVAL_SEC 封顶后收敛成 failed。
|
|
230
|
-
|
|
231
|
+
// [2069]④(cli 2026-07-30):additive 展示位。行此前只有 taskId/status/needsAttention,面板
|
|
232
|
+
// 渲不出「这是哪个任务」。源 = run 行自己的 `objectivePreview`(写入时已脱敏 + ~120 截断)——
|
|
233
|
+
// **不**走 §2 inbox 那套 per-row `getCtx`:本视图头注逐字承诺「ONE query, no N+1」,为两个
|
|
234
|
+
// 展示位把它变成 N+1 是拿契约换排版。
|
|
235
|
+
// · `name` 经 `fleetRunLabels()`,与 fleet 行**同一个函数** ⇒ 同一个 run 在两个面板里名字一致
|
|
236
|
+
// (两处各写一遍必然漂),顺带白拿 [1414]④ 的控制帧形保护(`<task-notification…>` 给中性名)。
|
|
237
|
+
// · `description` = 未截断原值,**仅在与 name 不同时才发** —— 相同就是同一句话印两遍
|
|
238
|
+
// (BC-1 在 fleet 行上杀掉的 objective-shown-twice)。
|
|
239
|
+
// · 两键 OMIT-when-absent(无 preview ⇒ 都不发,占位归客户端),同批 [2070]③ 同一条纪律。
|
|
240
|
+
// 钉:test/assistant-tasks-display-keys.test.ts。
|
|
241
|
+
const preview = r.objectivePreview?.trim() ? r.objectivePreview : undefined;
|
|
242
|
+
const label = preview !== undefined ? fleetRunLabels(preview).name : undefined;
|
|
243
|
+
return {
|
|
244
|
+
taskId: r.taskId, sessionId: r.sessionId, status: r.status, needsAttention: !!gate, gate,
|
|
245
|
+
...(label !== undefined ? { name: label } : {}),
|
|
246
|
+
...(preview !== undefined && label !== preview ? { description: preview } : {}),
|
|
247
|
+
createdAt: r.createdAt, updatedAt: r.updatedAt,
|
|
248
|
+
};
|
|
231
249
|
})
|
|
232
250
|
.sort((a, b) => Number(b.needsAttention) - Number(a.needsAttention) || (b.gate?.severity ?? 0) - (a.gate?.severity ?? 0) || (b.gate?.spentMicroUsd ?? 0) - (a.gate?.spentMicroUsd ?? 0));
|
|
233
251
|
sendJson(res, 200, { tasks });
|
package/dist/http/server.d.ts
CHANGED
|
@@ -466,4 +466,6 @@ export declare function clampVerifyRounds(v: unknown): number;
|
|
|
466
466
|
export declare function createHttpServer(rawDeps: ServiceDeps): http.Server & {
|
|
467
467
|
denyExpiredApprovals: (now: number) => Promise<void>;
|
|
468
468
|
};
|
|
469
|
+
/** Stable, low-cardinality route label for metrics/logs (ids collapsed to `:id`). */
|
|
470
|
+
export declare function routeLabel(_method: string, url: string): string;
|
|
469
471
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/http/server.js
CHANGED
|
@@ -35,15 +35,15 @@ import { handleFleet } from "./routes/fleet.js";
|
|
|
35
35
|
import { handleTraceUsage } from "./routes/trace-usage.js";
|
|
36
36
|
import { handleWorkflows, handleWorkflowAgentSteer } from "./routes/workflows.js";
|
|
37
37
|
import { handleNotifyWake } from "./routes/notify-wake.js";
|
|
38
|
-
import { handleApprovalsAssistant, streamApprovals, isQuestionAnswer,
|
|
38
|
+
import { handleApprovalsAssistant, streamApprovals, isQuestionAnswer, ASSISTANT_RESUME_RE, ASSISTANT_PLAN_REVIEW_RE } from "./routes/approvals-assistant.js";
|
|
39
39
|
export { streamApprovals, isQuestionAnswer };
|
|
40
|
-
import { handleRuns, handleRunVerbs,
|
|
40
|
+
import { handleRuns, handleRunVerbs, RUN_SUBAGENT_RESUME_RE } from "./routes/runs.js";
|
|
41
41
|
import { handleSideQuery } from "./routes/side-query.js";
|
|
42
42
|
import { handleTasks } from "./routes/tasks.js";
|
|
43
43
|
import { handleLeader } from "./routes/leader.js";
|
|
44
44
|
import { cascadeConfig } from "./run-meta.js";
|
|
45
45
|
export { cascadeConfig };
|
|
46
|
-
import { handleImages, createImagesLocal, coarseStatusForState, errorCodeForExit
|
|
46
|
+
import { handleImages, createImagesLocal, coarseStatusForState, errorCodeForExit } from "./routes/images.js";
|
|
47
47
|
export { coarseStatusForState, errorCodeForExit };
|
|
48
48
|
// design/158 A9:装配器缝——发送器/身份门下沉到 http/ 叶子模块,routes/* 与 server.ts 共用同一实现
|
|
49
49
|
// (routes/* 绝不可值 import server.ts:那条边会闭合运行时环,见 test/module-cycle-gate.test.ts)。
|
|
@@ -2452,50 +2452,65 @@ function isBillableSubmitPath(url) {
|
|
|
2452
2452
|
// ⚠️ SSE 帧纪律(2026-07-12):center BFF 中继凭「data 无 type 字段」识别心跳帧并吞掉
|
|
2453
2453
|
// (AgentEvent 是 closed oneof 全带 type,故可控)。**未来新增任何 SSE data 帧必须带 type 字段**,否则会被
|
|
2454
2454
|
// 中继当心跳吞掉、永远到不了前端。heartbeat 帧(`event: heartbeat` + `data: {}`)是唯一豁免。
|
|
2455
|
+
/** 路由标签表(表驱动;[2061] 批1 层A 重写)。顺序=具体先于泛化。
|
|
2456
|
+
* 🔴 本表由 `test/route-shape-roster.test.ts` 棘轮看守:门机器枚举源码全部路由模式并断言每条都映射到
|
|
2457
|
+
* 非 "other"——新路由不补此表该门当场红(census 抓获本表曾漂掉 56 条模式:session-sync/workspace/
|
|
2458
|
+
* workflows/subagents/attachments/images/leader 等整族全折 "other",metrics 不可分桶)。 */
|
|
2459
|
+
const ROUTE_LABEL_PATTERNS = [
|
|
2460
|
+
[/^\/v1\/runs\/[^/]+\/steer$/, "/v1/runs/:id/steer"],
|
|
2461
|
+
[/^\/v1\/runs\/[^/]+\/detach$/, "/v1/runs/:id/detach"],
|
|
2462
|
+
[/^\/v1\/runs\/[^/]+\/cancel$/, "/v1/runs/:id/cancel"],
|
|
2463
|
+
[/^\/v1\/runs\/[^/]+\/compact$/, "/v1/runs/:id/compact"],
|
|
2464
|
+
[/^\/v1\/runs\/[^/]+\/events$/, "/v1/runs/:id/events"],
|
|
2465
|
+
[/^\/v1\/runs\/[^/]+\/subagents\/[^/]+\/(steer|resume|output|stream)$/, "/v1/runs/:id/subagents/:sub/*"],
|
|
2466
|
+
[/^\/v1\/runs\/[^/]+\/tasks\/[^/]+\/(output|stop)$/, "/v1/runs/:id/tasks/:tid/*"],
|
|
2467
|
+
[/^\/v1\/runs\/[^/]+$/, "/v1/runs/:id"],
|
|
2468
|
+
[/^\/v1\/images\/bakes\/[^/]+\/events$/, "/v1/images/bakes/:id/events"],
|
|
2469
|
+
[/^\/v1\/images\/bakes\/[^/]+\/cancel$/, "/v1/images/bakes/:id/cancel"],
|
|
2470
|
+
[/^\/v1\/images\/bakes\/[^/]+\/claim$/, "/v1/images/bakes/:id/claim"],
|
|
2471
|
+
[/^\/v1\/images\/bakes\/[^/]+\/ingest$/, "/v1/images/bakes/:id/ingest"],
|
|
2472
|
+
[/^\/v1\/images\/bakes\/[^/]+$/, "/v1/images/bakes/:id"],
|
|
2473
|
+
[/^\/v1\/images\/digests\/[^/]+$/, "/v1/images/digests/:digest"],
|
|
2474
|
+
[/^\/v1\/images\/[^/]+$/, "/v1/images/:profile"],
|
|
2475
|
+
[/^\/v1\/approvals\/[^/]+\/decide$/, "/v1/approvals/:id/decide"],
|
|
2476
|
+
[/^\/v1\/approvals\/[^/]+\/exemptions(\/[^/]+)?$/, "/v1/approvals/:id/exemptions"],
|
|
2477
|
+
[/^\/v1\/approvals\/[^/]+$/, "/v1/approvals/:id"],
|
|
2478
|
+
[/^\/v1\/sessions\/[^/]+\/(wake|fork|init|notify|events|head|mcp|policy|settings)$/, "/v1/sessions/:id/$verb"],
|
|
2479
|
+
[/^\/v1\/sessions\/[^/]+\/sync\/(manifest|entries|plan)$/, "/v1/sessions/:id/sync/$verb"],
|
|
2480
|
+
[/^\/v1\/sessions\/[^/]+\/sync\/import(\/[^/]+\/entries)?$/, "/v1/sessions/:id/sync/import"],
|
|
2481
|
+
[/^\/v1\/sessions\/[^/]+\/sync\/blobs(\/[^/]+)?$/, "/v1/sessions/:id/sync/blobs"],
|
|
2482
|
+
[/^\/v1\/sessions\/[^/]+\/sync\/snapshots\/[^/]+\/blobs\/[^/]+$/, "/v1/sessions/:id/sync/snapshots/:key/blobs/:hash"],
|
|
2483
|
+
[/^\/v1\/sessions\/[^/]+\/workspace(\/[^/]+(\/(tree|file|archive))?)?$/, "/v1/sessions/:id/workspace"],
|
|
2484
|
+
[/^\/v1\/sessions\/[^/]+$/, "/v1/sessions/:id"],
|
|
2485
|
+
[/^\/v1\/assistant\/tasks\/[^/]+\/preempt$/, "/v1/assistant/tasks/:id/preempt"],
|
|
2486
|
+
[/^\/v1\/assistant\/tasks\/[^/]+\/resume$/, "/v1/assistant/tasks/:id/resume"],
|
|
2487
|
+
[/^\/v1\/assistant\/tasks\/[^/]+\/plan_review$/, "/v1/assistant/tasks/:id/plan_review"],
|
|
2488
|
+
[/^\/v1\/(elicitations|questions|tool-approvals)\/[^/]+\/respond$/, "/v1/$hitl/:id/respond"],
|
|
2489
|
+
[/^\/v1\/workflows\/[^/]+\/agents\/[^/]+\/steer$/, "/v1/workflows/:id/agents/:aid/steer"],
|
|
2490
|
+
[/^\/v1\/workflows\/[^/]+\/(stream|journal)$/, "/v1/workflows/:id/$sub"],
|
|
2491
|
+
[/^\/v1\/workflows\/[^/]+$/, "/v1/workflows/:id"],
|
|
2492
|
+
[/^\/v1\/tasks\/[^/]+\/(turns|stream|artifacts)$/, "/v1/tasks/:id/$sub"],
|
|
2493
|
+
[/^\/v1\/leader\/[^/]+$/, "/v1/leader/:id"],
|
|
2494
|
+
[/^\/v1\/attachments\/[^/]+$/, "/v1/attachments/:id"],
|
|
2495
|
+
[/^\/v1\/capabilities\/scenarios\/[^/]+$/, "/v1/capabilities/scenarios/:name"],
|
|
2496
|
+
[/^\/v1\/memory\/sync\/[^/]+$/, "/v1/memory/sync/:scope"],
|
|
2497
|
+
[/^\/v1\/usage\/(summary|series|breakdown)$/, "/v1/usage/$sub"],
|
|
2498
|
+
];
|
|
2499
|
+
const ROUTE_LABEL_LITERALS = new Set([
|
|
2500
|
+
"/health", "/metrics", "/metrics/summary", "/metrics/plan-cache",
|
|
2501
|
+
"/v1/models", "/v1/tasks", "/v1/tasks/stream", "/v1/tasks/source-summary",
|
|
2502
|
+
"/v1/runs", "/v1/sessions", "/v1/approvals", "/v1/approvals/stream",
|
|
2503
|
+
"/v1/assistant/inbox", "/v1/assistant/tasks", "/v1/usage", "/v1/policy", "/v1/capabilities",
|
|
2504
|
+
"/v1/images", "/v1/images/bakes", "/v1/images/bakes/claim", "/v1/images/select", "/v1/images/register",
|
|
2505
|
+
"/v1/workflows", "/v1/attachments", "/v1/leader", "/v1/outcomes", "/v1/side-query",
|
|
2506
|
+
"/v1/memory/export", "/v1/sendfile-links",
|
|
2507
|
+
]);
|
|
2455
2508
|
/** Stable, low-cardinality route label for metrics/logs (ids collapsed to `:id`). */
|
|
2456
|
-
function routeLabel(_method, url) {
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
if (RUN_CANCEL_RE.test(url))
|
|
2462
|
-
return "/v1/runs/:id/cancel";
|
|
2463
|
-
if (/^\/v1\/runs\/[^/]+\/events$/.test(url))
|
|
2464
|
-
return "/v1/runs/:id/events";
|
|
2465
|
-
if (/^\/v1\/runs\/[^/]+$/.test(url))
|
|
2466
|
-
return "/v1/runs/:id";
|
|
2467
|
-
if (url === "/v1/images/bakes")
|
|
2468
|
-
return "/v1/images/bakes";
|
|
2469
|
-
if (BAKE_EVENTS_RE.test(url))
|
|
2470
|
-
return "/v1/images/bakes/:id/events";
|
|
2471
|
-
if (BAKE_CANCEL_RE.test(url))
|
|
2472
|
-
return "/v1/images/bakes/:id/cancel";
|
|
2473
|
-
if (BAKE_CLAIM_RE.test(url))
|
|
2474
|
-
return "/v1/images/bakes/:id/claim";
|
|
2475
|
-
if (BAKE_INGEST_RE.test(url))
|
|
2476
|
-
return "/v1/images/bakes/:id/ingest";
|
|
2477
|
-
if (BAKE_ID_RE.test(url))
|
|
2478
|
-
return "/v1/images/bakes/:id";
|
|
2479
|
-
if (url === "/v1/approvals/stream")
|
|
2480
|
-
return "/v1/approvals/stream"; // native-push SSE — distinct from a /:id decide
|
|
2481
|
-
if (/^\/v1\/approvals\/[^/]+$/.test(url))
|
|
2482
|
-
return "/v1/approvals/:id";
|
|
2483
|
-
if (/^\/v1\/sessions\/[^/]+\/wake$/.test(url))
|
|
2484
|
-
return "/v1/sessions/:id/wake";
|
|
2485
|
-
if (/^\/v1\/sessions\/[^/]+\/fork$/.test(url))
|
|
2486
|
-
return "/v1/sessions/:id/fork";
|
|
2487
|
-
if (/^\/v1\/sessions\/[^/]+\/init$/.test(url))
|
|
2488
|
-
return "/v1/sessions/:id/init";
|
|
2489
|
-
if (/^\/v1\/sessions\/[^/]+$/.test(url))
|
|
2490
|
-
return "/v1/sessions/:id";
|
|
2491
|
-
if (ASSISTANT_PREEMPT_RE.test(url))
|
|
2492
|
-
return "/v1/assistant/tasks/:id/preempt";
|
|
2493
|
-
if (ASSISTANT_RESUME_RE.test(url))
|
|
2494
|
-
return "/v1/assistant/tasks/:id/resume";
|
|
2495
|
-
if (ASSISTANT_PLAN_REVIEW_RE.test(url))
|
|
2496
|
-
return "/v1/assistant/tasks/:id/plan_review";
|
|
2497
|
-
const known = ["/health", "/metrics", "/v1/models", "/v1/tasks", "/v1/tasks/stream", "/v1/runs", "/v1/sessions", "/v1/approvals", "/v1/assistant/inbox", "/v1/assistant/tasks", "/v1/usage", "/v1/policy", "/v1/capabilities"];
|
|
2498
|
-
if (known.includes(url))
|
|
2509
|
+
export function routeLabel(_method, url) {
|
|
2510
|
+
for (const [re, label] of ROUTE_LABEL_PATTERNS)
|
|
2511
|
+
if (re.test(url))
|
|
2512
|
+
return label;
|
|
2513
|
+
if (ROUTE_LABEL_LITERALS.has(url))
|
|
2499
2514
|
return url;
|
|
2500
2515
|
return "other";
|
|
2501
2516
|
}
|
package/dist/lsp/types.d.ts
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
* `LspTransport` IMPLEMENTATION (`WsLspTransport` in ws-transport.ts) — core has no WebSocket transport (raw TCP
|
|
9
9
|
* doesn't traverse E2B's HTTP proxy; WS does). "1:1-copy-CC" is the protocol; the WS transport is ours.
|
|
10
10
|
*/
|
|
11
|
-
export type { LspOperation, LspRequestParams, LspResult,
|
|
11
|
+
export type { LspOperation, LspRequestParams, LspResult, LspServerManager, LspSession, LspTransport, LspReadText, } from "@sema-agent/core";
|
|
12
12
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/main.js
CHANGED
|
@@ -808,7 +808,34 @@ async function main() {
|
|
|
808
808
|
runDenySweep = server.denyExpiredApprovals;
|
|
809
809
|
// [1934]:绑址旋钮 + 无鉴权自收窄(理由见 resolveBindHost 顶注)。undefined = Node 默认全接口。
|
|
810
810
|
const bindHost = resolveBindHost(config);
|
|
811
|
-
|
|
811
|
+
// [2062]③ HOST 继承暗通道告警:zsh 常把 HOST 设成机器名,`{...process.env}` 起底的壳会静默继承给
|
|
812
|
+
// 引擎——bind 面被 shell 环境暗配而部署者不知情(HOST=机器名解析到 LAN 口时=静默扩暴露面)。
|
|
813
|
+
// 🔴 [2067]③ 次序承重:必须在 listen **之前**打——HOST=不可解析名时 listen 直接 ENOTFOUND 崩溃,
|
|
814
|
+
// 恰是「继承 HOST 把 boot 弄崩」这个最需要解释的场景;warn 在 listen 后=诊断在崩溃里缺席,用户只见
|
|
815
|
+
// 裸 getaddrinfo 栈(cli 真机取证)。
|
|
816
|
+
if (config.bindHostSource === "HOST") {
|
|
817
|
+
logger.warn("bind_host_from_HOST_env", {
|
|
818
|
+
bindHost,
|
|
819
|
+
note: "the bind address came from the HOST env var (not BIND_HOST). Shells like zsh commonly set HOST to the machine name — if you did not set it yourself, this may be an inherited shell variable silently configuring the bind face. Set BIND_HOST explicitly to silence this warning.",
|
|
820
|
+
});
|
|
821
|
+
}
|
|
822
|
+
try {
|
|
823
|
+
await new Promise((resolve, reject) => {
|
|
824
|
+
server.once("error", reject); // listen 失败(ENOTFOUND/EADDRINUSE…)不吊死这个 Promise
|
|
825
|
+
bindHost ? server.listen(config.port, bindHost, resolve) : server.listen(config.port, resolve);
|
|
826
|
+
});
|
|
827
|
+
}
|
|
828
|
+
catch (e) {
|
|
829
|
+
// [2067]③:崩溃路径自带来源诊断——不可解析的 HOST 继承名在这里最常见。
|
|
830
|
+
logger.error("listen_failed", {
|
|
831
|
+
port: config.port,
|
|
832
|
+
bindHost: bindHost ?? "0.0.0.0/::(all interfaces)",
|
|
833
|
+
...(config.bindHostSource ? { bindHostSource: config.bindHostSource } : {}),
|
|
834
|
+
...(config.bindHostSource === "HOST" ? { note: "bind failed for a host inherited from the HOST env var — set BIND_HOST explicitly (e.g. BIND_HOST=127.0.0.1)." } : {}),
|
|
835
|
+
error: e instanceof Error ? e.message : String(e),
|
|
836
|
+
});
|
|
837
|
+
throw e;
|
|
838
|
+
}
|
|
812
839
|
logger.info("listening", {
|
|
813
840
|
port: config.port,
|
|
814
841
|
bindHost: bindHost ?? "0.0.0.0/::(all interfaces)",
|
|
@@ -62,8 +62,6 @@ export interface HardenedVmLimits {
|
|
|
62
62
|
* A script exceeding it OOMs the WORKER (killed), never the shared main process. Default 128. */
|
|
63
63
|
maxHeapMb?: number;
|
|
64
64
|
}
|
|
65
|
-
/** Optional observability hook for contained script-realm rejections (e.g. wire to the deployment logger). */
|
|
66
|
-
export declare function setScriptRealmRejectionObserver(observer: (summary: string) => void): void;
|
|
67
65
|
export declare function installScriptRealmRejectionGuard(): void;
|
|
68
66
|
/**
|
|
69
67
|
* The membrane handed to a surface's `buildGlobals` callback to construct the CONTEXT-LOCAL bindings the
|
|
@@ -48,11 +48,6 @@ function scrubProtoDeep(value) {
|
|
|
48
48
|
* their global posture, and only then is the hazard live. Idempotent.
|
|
49
49
|
*/
|
|
50
50
|
let rejectionGuardInstalled = false;
|
|
51
|
-
let onScriptRealmRejection;
|
|
52
|
-
/** Optional observability hook for contained script-realm rejections (e.g. wire to the deployment logger). */
|
|
53
|
-
export function setScriptRealmRejectionObserver(observer) {
|
|
54
|
-
onScriptRealmRejection = observer;
|
|
55
|
-
}
|
|
56
51
|
export function installScriptRealmRejectionGuard() {
|
|
57
52
|
if (rejectionGuardInstalled)
|
|
58
53
|
return;
|
|
@@ -62,7 +57,7 @@ export function installScriptRealmRejectionGuard() {
|
|
|
62
57
|
// cross-realm ⇒ minted in a vm context ⇒ an un-awaited rejection inside an untrusted script. Contain.
|
|
63
58
|
const summary = reason instanceof Error ? `${reason.name}: ${reason.message}` : String(reason);
|
|
64
59
|
try {
|
|
65
|
-
|
|
60
|
+
console.warn(`hardened-vm: un-awaited script rejection contained: ${summary}`);
|
|
66
61
|
}
|
|
67
62
|
catch {
|
|
68
63
|
/* the guard must never become a crash source itself */
|
package/dist/question.d.ts
CHANGED
|
@@ -39,10 +39,6 @@ export declare function parseQuestionResponse(body: unknown): {
|
|
|
39
39
|
ok: false;
|
|
40
40
|
error: string;
|
|
41
41
|
};
|
|
42
|
-
/** @deprecated design/158 N22: renamed to {@link parseQuestionResponse} — unifies the HITL trio's parse-fn
|
|
43
|
-
* vocabulary (`parseQuestionResponse` / `parseElicitationResponse` / `parseToolApprovalResponse`, all "the
|
|
44
|
-
* human's reply body"). Kept as a compat alias. */
|
|
45
|
-
export declare const parseQuestionAnswer: typeof parseQuestionResponse;
|
|
46
42
|
/**
|
|
47
43
|
* Coordinates AskUserQuestion HITL for the singleton runner. Process-local + same-replica (the pending map is in memory,
|
|
48
44
|
* like ElicitationCoordinator / steerableRuns): a respond that lands on another replica finds nothing → 404. Present
|
package/dist/question.js
CHANGED
|
@@ -63,10 +63,6 @@ export function parseQuestionResponse(body) {
|
|
|
63
63
|
}
|
|
64
64
|
return { ok: true, value: { answers: out } };
|
|
65
65
|
}
|
|
66
|
-
/** @deprecated design/158 N22: renamed to {@link parseQuestionResponse} — unifies the HITL trio's parse-fn
|
|
67
|
-
* vocabulary (`parseQuestionResponse` / `parseElicitationResponse` / `parseToolApprovalResponse`, all "the
|
|
68
|
-
* human's reply body"). Kept as a compat alias. */
|
|
69
|
-
export const parseQuestionAnswer = parseQuestionResponse;
|
|
70
66
|
/** redactDeep + size-bound the UNTRUSTED model-authored questions before they are persisted/streamed (a question's
|
|
71
67
|
* free-text — question/header/option label+description — can echo a secret from the model's context). Over the byte
|
|
72
68
|
* cap OR unserializable ⇒ undefined (drop; the ask headless-defaults). */
|
package/dist/tool-approval.d.ts
CHANGED
|
@@ -53,11 +53,6 @@ export declare function parseToolApprovalResponse(body: unknown): {
|
|
|
53
53
|
ok: false;
|
|
54
54
|
error: string;
|
|
55
55
|
};
|
|
56
|
-
/** @deprecated design/158 N22: renamed to {@link parseToolApprovalResponse} — unifies the HITL trio's parse-fn
|
|
57
|
-
* vocabulary (`parseQuestionResponse` / `parseElicitationResponse` / `parseToolApprovalResponse`, all "the
|
|
58
|
-
* human's reply body"; `ToolApprovalDecision` itself is unchanged — it names the allow/deny VALUE, not the
|
|
59
|
-
* parse function). Kept as a compat alias. */
|
|
60
|
-
export declare const parseToolApprovalDecision: typeof parseToolApprovalResponse;
|
|
61
56
|
/**
|
|
62
57
|
* Coordinates the live tool-approval HITL for the singleton runner. Process-local + same-replica (the pending map is
|
|
63
58
|
* in memory, like QuestionCoordinator): a respond that lands on another replica finds nothing → 404. Present (passed
|
package/dist/tool-approval.js
CHANGED
|
@@ -85,11 +85,6 @@ export function parseToolApprovalResponse(body) {
|
|
|
85
85
|
}
|
|
86
86
|
return { ok: false, error: 'decision must be one of "allow" | "allow_session" | "deny"' };
|
|
87
87
|
}
|
|
88
|
-
/** @deprecated design/158 N22: renamed to {@link parseToolApprovalResponse} — unifies the HITL trio's parse-fn
|
|
89
|
-
* vocabulary (`parseQuestionResponse` / `parseElicitationResponse` / `parseToolApprovalResponse`, all "the
|
|
90
|
-
* human's reply body"; `ToolApprovalDecision` itself is unchanged — it names the allow/deny VALUE, not the
|
|
91
|
-
* parse function). Kept as a compat alias. */
|
|
92
|
-
export const parseToolApprovalDecision = parseToolApprovalResponse;
|
|
93
88
|
/** [1550] RB-39② 兑现:判别式换 core 1.378 显式键 `fromSubagent`(委派子代 gate 发起的 ask 恒带,受信
|
|
94
89
|
* internals 事实——worker 不可伪造/不可抑制)。取代 [1546] MED-1 的「在场 ∧ ≠ 宿主 sessionId」权宜式
|
|
95
90
|
* (旧判别式靠 ctx.sessionId 参与推导,sessionless adhoc 场景无法区分;显式键不依赖 ctx,恒定准确)。 */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sema-agent/server",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.5.1",
|
|
4
4
|
"description": "Sema Server — the server/API implementation layer for Sema, wiring core, registry, model providers, and cloud agent execution. Built on @sema-agent/core.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "BUSL-1.1",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"sharp": "^0.35.3"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
|
-
"@sema-agent/sdk": "^1.1
|
|
70
|
+
"@sema-agent/sdk": "^2.1.1",
|
|
71
71
|
"@types/libsodium-wrappers": "^0.7.14",
|
|
72
72
|
"@types/node": "22.10.2",
|
|
73
73
|
"@types/pg": "^8.20.0",
|