@sema-agent/server 7.57.0 → 7.59.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/USAGE.md +2 -0
- package/dist/approval-card.d.ts +47 -0
- package/dist/approval-card.js +18 -0
- package/dist/boot/parked-revive-gate.d.ts +3 -0
- package/dist/boot/parked-revive-gate.js +2 -2
- package/dist/boot/resolve-spec.js +1 -1
- package/dist/boot/runner-deps.d.ts +2 -2
- package/dist/boot/runner-deps.js +4 -0
- package/dist/boot/stores.js +15 -8
- package/dist/config-catalog.d.ts +0 -29
- package/dist/config-catalog.js +3 -0
- package/dist/config-center/http-client.js +7 -11
- package/dist/config-center/read-warnings.d.ts +20 -0
- package/dist/config-center/read-warnings.js +36 -0
- package/dist/config-provider.d.ts +3 -0
- package/dist/config-provider.js +4 -8
- package/dist/config-types.d.ts +12 -2
- package/dist/config.js +13 -2
- package/dist/cross-session-settings.d.ts +70 -0
- package/dist/cross-session-settings.js +37 -0
- package/dist/deployment-governance.d.ts +30 -1
- package/dist/deployment-governance.js +11 -5
- package/dist/hooks/hook-runner.js +8 -8
- package/dist/main.js +1 -0
- package/dist/memory-scope.d.ts +20 -0
- package/dist/memory-scope.js +9 -1
- package/dist/observability/metrics.js +1 -1
- package/dist/observability/run-terminal-log.d.ts +4 -0
- package/dist/observability/run-terminal-log.js +15 -1
- package/dist/plugins/device-store-sql.d.ts +30 -6
- package/dist/plugins/device-store-sql.js +23 -4
- package/dist/plugins/file-history-store-sql.d.ts +5 -0
- package/dist/plugins/file-history-store-sql.js +7 -7
- package/dist/plugins/image-bake-store-sql.js +1 -1
- package/dist/plugins/mailbox-store-sql.d.ts +33 -11
- package/dist/plugins/mailbox-store-sql.js +74 -12
- package/dist/plugins/retention-lane-store-sql.d.ts +8 -4
- package/dist/plugins/retention-lane-store-sql.js +1 -1
- package/dist/plugins/retention-store-sql.d.ts +7 -3
- package/dist/plugins/retention-store-sql.js +2 -2
- package/dist/plugins/task-list-store-sql.d.ts +2 -2
- package/dist/plugins/task-list-store-sql.js +1 -1
- package/dist/plugins/usage-window-store-sql.d.ts +5 -3
- package/dist/plugins/usage-window-store-sql.js +1 -5
- package/dist/run-local.d.ts +2 -1
- package/dist/run-local.js +3 -3
- package/dist/runs.d.ts +13 -0
- package/dist/runs.js +2 -0
- package/dist/task-settings.d.ts +13 -3
- package/dist/task-settings.js +1 -1
- package/dist/tool-approval.d.ts +23 -1
- package/dist/tool-approval.js +6 -1
- package/dist/trace/core-keyset-guard.d.ts +7 -8
- package/dist/trace/engine-notice-wire.d.ts +1 -1
- package/dist/trace/engine-notice-wire.js +5 -0
- package/dist/trace/project.d.ts +45 -3
- package/dist/trace/project.js +23 -0
- package/dist/trace/redact.js +7 -3
- package/dist/trace/sema-provenance.d.ts +15 -0
- package/dist/trace/sema-provenance.js +3 -0
- package/package.json +3 -3
package/dist/trace/project.d.ts
CHANGED
|
@@ -343,8 +343,47 @@ export declare function workspaceChangedEventData(ev: {
|
|
|
343
343
|
* ⚠️ 与 `storeWired` **不同**:本仓这两条至今未接(`RunnerDeps.permissionRuleSyncWired` /
|
|
344
344
|
* `permissionRuleOrg` 全树零声明点,2026-08-10 [ref] 复扫亲验)⇒ 今天恒 `false`,这是**真值**不是
|
|
345
345
|
* 缺席。哪天接上其中任一条,连本句一起改 —— 这一行是它的登记处。
|
|
346
|
+
* · `modelGate`(可选段 `{ class, removed[], restore }`;core fc52b4d4 [ref] / [ref] 片2b,[ref] 提货件,
|
|
347
|
+
* 黑板 [ref] @server①)—— **裁:租户可见**。它是 per-session 的**读面**:「我这条 session 因为工具-模型门卸掉了
|
|
348
|
+
* 哪些工具」——与 operator 通告 `config.tool_model_gate_removed` **同决策同源**(core 从同一张 trim 表铸两面),
|
|
349
|
+
* 但通告归 operator 车道(engine_notice 白名单,附录 D),本段归租户:消费端(cli L-70 [ref])要在**首帧一次读**
|
|
350
|
+
* 里知道自己少了哪些工具、怎么恢复,否则只能等到调用被拒才发现。三键都是引擎派生值:`class` = 合并 gate 表的 class 行键
|
|
351
|
+
* (prepare-task 对表外 class 响亮拒),`removed` = 工具 wire 名(core 表键,非用户内容),`restore` = core 铸的一句恢复指引(引擎文案)
|
|
352
|
+
* ⇒ 不脱敏、逐字。多 class 同卸 ⇒ core 报首 class + removed **并集**(core 合并律;本仓不按 class 过滤)。
|
|
353
|
+
* 仅本 run 有门卸时在场:**缺席 = 本 run 没卸**,不铸空段、不铸 `removed: []`。畸形(三键任一缺席/形不合)
|
|
354
|
+
* ⇒ 整段按缺席 —— 不铸半段,半段会被读成「只卸了这些」。它不构成 governance 四布尔的侧信道(门卸由
|
|
355
|
+
* 模型/门 class 决定,与 lockedConfig/compliance/memoryAdmission/retention 无函数关系)。
|
|
356
|
+
* · `autoMode`(`{ armed: boolean, reason: AutoModeArmReason }`;core 7.3.1 [ref],147③ 提货件,黑板 [ref])
|
|
357
|
+
* —— **裁:租户可见**。它是 per-leg 的**读面**:「我这条腿的 auto 模式武装了吗?没武装是卡在哪一臂?」
|
|
358
|
+
* ① **同主体同受众**:本仓早已把同一件事投在租户面上 —— `/v1/capabilities.permissionModeAuto.{armed,reason}`
|
|
359
|
+
* ([ref],7.57.0 已发)答的是「**若此刻提交**会不会武装」,本段答的是「**这条真跑起来的腿**武装了吗」;
|
|
360
|
+
* 同一个主体(调用方自己的 run)、同一条轴,只差事前/事后。剥掉它,壳就只能拿事前预测冒充事后事实;
|
|
361
|
+
* ② **两个值都是引擎派生的闭形**:`armed` 布尔,`reason` 是 core 的闭集词(`AUTO_MODE_ARM_REASONS`:
|
|
362
|
+
* armed / no_intent / no_face / denied / resolver_fault / latch_open)—— 非用户内容,不脱敏、逐字;
|
|
363
|
+
* ③ **不是 governance 侧信道**:它描述的是**本腿**的武装结论,与 lockedConfig/compliance/memoryAdmission/
|
|
364
|
+
* retention 四位无函数关系;而 `denied` 这一词所披露的「组织把这一位关了」在 [ref] 读面上**本就已经**
|
|
365
|
+
* 对同一租户可见(`org_denied`),本段没有扩大任何受众。
|
|
366
|
+
* 🔴 **逐字透传,不映射**:core 的六词与本仓 [ref] 读面的六词(`AUTO_MODE_UNARMED_REASONS`)**刻意不归一**
|
|
367
|
+
* —— 两张表回答的是两个问题、粒度也不同(core 的 `denied` 一词对应本仓的 `org_denied` / `local_denied`
|
|
368
|
+
* 两词:core 只看合成后的 caps deny 位,本仓分得出这个 false 是 center 下发的还是本地 env 写的)。
|
|
369
|
+
* ⚠️ **`settings_denied` 不折进 `denied`,它折进 `no_intent`**(codex 车BO r1 [medium] 验真后纠):
|
|
370
|
+
* settings 层的 kill-switch 折的是**模式**(`effectivePermissionMode`:auto → default),于是 resolve-spec
|
|
371
|
+
* 阶段④ 压根不写意图座 `TaskSpec.autoModeRequested` ⇒ core 的武装谓词第一项就落空;而本地 env 腿折的是
|
|
372
|
+
* **caps**(`applyLocalAutoModeDeny`),模式不动、座照写 ⇒ core 才报 `denied`。两条腿在 manifest 上
|
|
373
|
+
* **分不开**,要分辨得读 `/v1/capabilities`。对照表与保鲜钉在 `test/wiring-manifest-projection.test.ts`
|
|
374
|
+
* 的 147③ 节,分岔的行为面格在 `test/permission-mode-shell-gate-translation.test.ts`;
|
|
375
|
+
* 本函数**只透传**,一个字都不换。
|
|
376
|
+
* ⚠️ 缺席 ≠ 「不适用」:core 顶注逐字「absence here means an older mint or an external derivation, never
|
|
377
|
+
* "not applicable"」⇒ 缺席时**不铸** `armed:false`(那会把「老 mint 写的行」谎报成「这条腿确实没武装」)。
|
|
378
|
+
* ⚠️ **自相矛盾按缺席**:core 把 `armed ⇔ reason === "armed"` 写成段内不变量并在 derive 点拒(`readAutoModeFact`
|
|
379
|
+
* 抛)。账本回放/第三方 producer 送来的矛盾对若原样上 wire,按 `armed` 读与按 `reason` 读的消费端会得到
|
|
380
|
+
* **相反**的答案 —— 这条轴上(@cli `sema doctor permissions` 正读它)两个答案比没答案更坏 ⇒ 整段不铸。
|
|
381
|
+
* 这不是改语义:它与本函数「畸形值一律按缺席」是同一条规则,而这条不变量是 core 自己写的段内契约。
|
|
346
382
|
* 未来 core 加一段而它没有 audience 标签时,**先在这里补一条裁定再决定挑不挑键** —— 段级完备性钉
|
|
347
|
-
* (test/wiring-manifest-projection.test.ts)
|
|
383
|
+
* (test/wiring-manifest-projection.test.ts)会在那一刻先把人拦下来 —— ⚠️ **但那条钉是夹具驱动的**:它只看
|
|
384
|
+
* `deriveWiringManifest(EFFECTIVE_FACTS)` 真铸出来的段,facts 不带的可选段(147③ 的 `autoMode` 就是)它一格
|
|
385
|
+
* 都红不了(2026-09-04 实测:该钉 26/26 全绿,红出 `autoMode` 的是编译期门)。段级 + 成员级的**编译期**门在
|
|
386
|
+
* `core-keyset-guard.ts` ⑥b —— 那才是「core 加了段/加了成员」的可靠红点,两道并用缺一不可。
|
|
348
387
|
*/
|
|
349
388
|
export declare function wiringManifestEventData(ev: {
|
|
350
389
|
manifest?: unknown;
|
|
@@ -410,8 +449,9 @@ export declare function humanInputEventData(ev: {
|
|
|
410
449
|
}): Record<string, unknown>;
|
|
411
450
|
/** S4 (SILENT-FALLBACK P0-a): the durable `brain_status` observation row, shared by the bg + resume append
|
|
412
451
|
* sites. core marks the live `status` frame EPHEMERAL (never replayed by core on resume) — this row is the
|
|
413
|
-
* SERVICE's own observation record (why a turn stalled: rate_limited/retrying/reconnecting/circuit_open
|
|
414
|
-
*
|
|
452
|
+
* SERVICE's own observation record (why a turn stalled: rate_limited/retrying/reconnecting/circuit_open, and
|
|
453
|
+
* since core 7.3.1 / [ref] the pre-failure `waiting_first_token` wait), not a core event replay.
|
|
454
|
+
* Whitelist: the closed phase union verbatim + neutral bounded detail (redacted) + the bounded numeric seats. */
|
|
415
455
|
export declare function brainStatusEventData(ev: {
|
|
416
456
|
phase: string;
|
|
417
457
|
detail?: string;
|
|
@@ -422,6 +462,8 @@ export declare function brainStatusEventData(ev: {
|
|
|
422
462
|
errClass?: string;
|
|
423
463
|
retryAtMs?: number;
|
|
424
464
|
errorStatus?: number;
|
|
465
|
+
elapsedMs?: number;
|
|
466
|
+
timeoutMs?: number;
|
|
425
467
|
eventId?: string;
|
|
426
468
|
parentToolCallId?: string;
|
|
427
469
|
}): Record<string, unknown>;
|
package/dist/trace/project.js
CHANGED
|
@@ -250,6 +250,25 @@ export function wiringManifestEventData(ev) {
|
|
|
250
250
|
...(bool(rulesIn.syncWired) !== undefined ? { syncWired: rulesIn.syncWired } : {}),
|
|
251
251
|
...(bool(rulesIn.orgGoverned) !== undefined ? { orgGoverned: rulesIn.orgGoverned } : {}),
|
|
252
252
|
});
|
|
253
|
+
const gateIn = sec(m.modelGate);
|
|
254
|
+
const modelGate = (() => {
|
|
255
|
+
if (gateIn === undefined)
|
|
256
|
+
return undefined;
|
|
257
|
+
const cls = str(gateIn.class);
|
|
258
|
+
const restore = str(gateIn.restore);
|
|
259
|
+
const removed = Array.isArray(gateIn.removed) && gateIn.removed.every((r) => typeof r === "string") ? [...gateIn.removed] : undefined;
|
|
260
|
+
return cls !== undefined && restore !== undefined && removed !== undefined ? { class: cls, removed, restore } : undefined;
|
|
261
|
+
})();
|
|
262
|
+
const autoIn = sec(m.autoMode);
|
|
263
|
+
const autoMode = (() => {
|
|
264
|
+
if (autoIn === undefined)
|
|
265
|
+
return undefined;
|
|
266
|
+
const armed = bool(autoIn.armed);
|
|
267
|
+
const reason = str(autoIn.reason);
|
|
268
|
+
if (armed === undefined || reason === undefined)
|
|
269
|
+
return undefined;
|
|
270
|
+
return armed === (reason === "armed") ? { armed, reason } : undefined;
|
|
271
|
+
})();
|
|
253
272
|
return {
|
|
254
273
|
...(num(m.schemaVersion) !== undefined ? { schemaVersion: m.schemaVersion } : {}),
|
|
255
274
|
...(str(legIn.kind) !== undefined ? { leg: { kind: legIn.kind } } : {}),
|
|
@@ -261,6 +280,8 @@ export function wiringManifestEventData(ev) {
|
|
|
261
280
|
...(str(sessionIn.store) !== undefined ? { session: { store: sessionIn.store } } : {}),
|
|
262
281
|
...(fleet !== undefined ? { fleet } : {}),
|
|
263
282
|
...(permissionRules !== undefined ? { permissionRules } : {}),
|
|
283
|
+
...(modelGate !== undefined ? { modelGate } : {}),
|
|
284
|
+
...(autoMode !== undefined ? { autoMode } : {}),
|
|
264
285
|
...identityFields(ev),
|
|
265
286
|
};
|
|
266
287
|
}
|
|
@@ -314,6 +335,8 @@ export function brainStatusEventData(ev) {
|
|
|
314
335
|
...(num(ev.maxRetries) ? { maxRetries: ev.maxRetries } : {}),
|
|
315
336
|
...(num(ev.retryInMs) ? { retryInMs: ev.retryInMs } : {}),
|
|
316
337
|
...(num(ev.retryAtMs) ? { retryAtMs: ev.retryAtMs } : {}),
|
|
338
|
+
...(num(ev.elapsedMs) ? { elapsedMs: ev.elapsedMs } : {}),
|
|
339
|
+
...(num(ev.timeoutMs) ? { timeoutMs: ev.timeoutMs } : {}),
|
|
317
340
|
...(num(ev.errorStatus) ? { errorStatus: ev.errorStatus } : {}),
|
|
318
341
|
...(typeof ev.errClass === "string" && ev.errClass.length > 0 ? { errClass: ev.errClass } : {}),
|
|
319
342
|
...identityFields(ev),
|
package/dist/trace/redact.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { recordFailOpen } from "../observability/fail-open.js";
|
|
2
2
|
const REDACTION_TOKEN_RE_SRC = String.raw `«redacted(?::[a-z-]{1,16}){0,2}»`;
|
|
3
3
|
const FULL_SECRET_PATTERNS = [
|
|
4
|
-
[/-----BEGIN[^-]
|
|
4
|
+
[/-----BEGIN[^-](?:[^-](?:[^-]|-(?!-))*)?PRIVATE KEY(?: BLOCK)?-----[\s\S]{0,8192}?-----END[^-](?:[^-](?:[^-]|-(?!-))*)?PRIVATE KEY(?: BLOCK)?-----/g, "«redacted:private-key»"],
|
|
5
5
|
[/---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----[\s\S]{0,8192}?---- END SSH2 ENCRYPTED PRIVATE KEY ----/g, "«redacted:private-key»"],
|
|
6
6
|
[/\bsk-[A-Za-z0-9_-]{16,}\b/g, "«redacted:key»"],
|
|
7
7
|
[/\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}\b/g, "«redacted:gh-token»"],
|
|
@@ -220,8 +220,12 @@ function isPemFenceLabel(s, from, to) {
|
|
|
220
220
|
return false;
|
|
221
221
|
if (!s.startsWith(PEM_KEY_WORD, end - PEM_KEY_WORD.length))
|
|
222
222
|
return false;
|
|
223
|
-
|
|
224
|
-
|
|
223
|
+
if (s.charCodeAt(from) === 45)
|
|
224
|
+
return false;
|
|
225
|
+
if (s.charCodeAt(from + 1) === 45)
|
|
226
|
+
return false;
|
|
227
|
+
for (let i = from + 1; i < to; i++)
|
|
228
|
+
if (s.charCodeAt(i) === 45 && s.charCodeAt(i + 1) === 45)
|
|
225
229
|
return false;
|
|
226
230
|
return true;
|
|
227
231
|
}
|
|
@@ -11,7 +11,22 @@
|
|
|
11
11
|
* (它是渲染判别,不是 lane 词)。
|
|
12
12
|
*/
|
|
13
13
|
import type { SemaProvenance } from "@sema-agent/core";
|
|
14
|
+
/** wire 放行的 lane 词(PROJECTED)。 */
|
|
14
15
|
export declare const SEMA_PROVENANCE_KINDS: readonly ["agent_message"];
|
|
16
|
+
/**
|
|
17
|
+
* 有意**不**放行的 lane 词(EXCLUDED,逐词记账;运行期落到「丢整键」臂 —— 与闭集外的未知词同臂,但这里的词是
|
|
18
|
+
* core 词表**内**的、经人裁定不上 wire 的):
|
|
19
|
+
* · `cross_session_message` —— core fc52b4d4 [ref] §4.1(session-box drain 铸;`from` 是对端**地址**、`peerMeta`
|
|
20
|
+
* 携 typed peer 记录)。[ref] 候:本仓不可达(`RunnerDeps.peerDirectory` 零声明点)+ 注入帧渲染形候 [ref] @server③
|
|
21
|
+
* 表态;与 core-keyset-guard.ts ① 的 `crossSessionMessage` / ①-nested 的 `peerMeta` 同批同判,接线时三处同翻。
|
|
22
|
+
* · `cross_session_notice` —— core 7.4.0 [ref] §4.4/§5.2(片4;本闭集 2026-09-05 真红出它)。**同一条车道的
|
|
23
|
+
* 第二个载体**,不是新判据:同一个 session-box drain 铸(`agents/peer-session-drain.js` 的 notice 臂),同一个
|
|
24
|
+
* `RunnerDeps.peerDirectory` 座前提 ⇒ 本仓同样不可达;渲染形与它的载体 `crossSessionNotice`(core-keyset-guard.ts
|
|
25
|
+
* ① 的同名排除键)一同候 [ref] 表态。放进 EXCLUDED 而不是 PROJECTED,是**沿用**上一行的裁定而不是新增特判:
|
|
26
|
+
* 车道没接线时放行一个 lane 词,等于替 [ref] 预先声明一种 cli 渲染形。[ref] 接线那天三处(本簿、载体键、
|
|
27
|
+
* ①-nested 的 `peerMeta`)同批翻。
|
|
28
|
+
*/
|
|
29
|
+
export declare const SEMA_PROVENANCE_KINDS_EXCLUDED: readonly ["cross_session_message", "cross_session_notice"];
|
|
15
30
|
/** 本仓两条腿入参的**形**(不是 core 类型:入参是运行期载荷,`kind` 先当 string 收、经闭集才成 typed)。 */
|
|
16
31
|
export interface SemaProvenanceInput {
|
|
17
32
|
kind: string;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
export const SEMA_PROVENANCE_KINDS = ["agent_message"];
|
|
2
|
+
export const SEMA_PROVENANCE_KINDS_EXCLUDED = ["cross_session_message", "cross_session_notice"];
|
|
2
3
|
const _semaProvenanceExhaustive = true;
|
|
3
4
|
void _semaProvenanceExhaustive;
|
|
5
|
+
const _semaProvenanceNoDoubleBook = true;
|
|
6
|
+
void _semaProvenanceNoDoubleBook;
|
|
4
7
|
export function semaProvenanceOrAbsent(p) {
|
|
5
8
|
if (!SEMA_PROVENANCE_KINDS.includes(p.kind))
|
|
6
9
|
return undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sema-agent/server",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.59.0",
|
|
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",
|
|
@@ -54,8 +54,8 @@
|
|
|
54
54
|
"build:binary:run-local:darwin-arm64": "bun build --compile --target=bun-darwin-arm64 src/run-local.ts --outfile dist/run-local-darwin-arm64"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@sema-agent/core": "7.
|
|
58
|
-
"@sema-agent/settings-schema": "1.
|
|
57
|
+
"@sema-agent/core": "7.4.0",
|
|
58
|
+
"@sema-agent/settings-schema": "1.6.0",
|
|
59
59
|
"e2b": "^2.28.0",
|
|
60
60
|
"libsodium-wrappers": "^0.8.4",
|
|
61
61
|
"mysql2": "^3.22.4",
|