@sema-agent/sdk 8.2.0 → 8.4.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 +302 -0
- package/dist/events.d.ts +91 -28
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +16 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/tasks.d.ts +5 -2
- package/dist/resources/tasks.d.ts.map +1 -1
- package/dist/resources/tasks.js +5 -2
- package/dist/resources/tasks.js.map +1 -1
- package/dist/resources/tool-approvals.d.ts +132 -2
- package/dist/resources/tool-approvals.d.ts.map +1 -1
- package/dist/resources/tool-approvals.js +88 -1
- package/dist/resources/tool-approvals.js.map +1 -1
- package/dist/types.d.ts +614 -23
- package/dist/types.d.ts.map +1 -1
- package/openapi.yaml +1073 -63
- package/package.json +1 -1
package/dist/types.d.ts
CHANGED
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
* null" may be correct — check for a normalizer at the boundary before widening it to `| null`.
|
|
58
58
|
*/
|
|
59
59
|
import type { SemaSettings } from "./settings.js";
|
|
60
|
-
import type { RuleOffer } from "./resources/tool-approvals.js";
|
|
60
|
+
import type { AskOrigin, RuleOffer } from "./resources/tool-approvals.js";
|
|
61
61
|
/** Authenticated end-user identity. Opaque to the service (used as memory scope + session owner). The SDK
|
|
62
62
|
* normalizes; the service does NOT validate the format. Convention: `user:` / `org:` / `ai:` / `anon:`. */
|
|
63
63
|
export type Principal = string;
|
|
@@ -699,11 +699,94 @@ export interface PendingGateMaterial {
|
|
|
699
699
|
decidePath: string;
|
|
700
700
|
governanceForced?: true;
|
|
701
701
|
}
|
|
702
|
+
/**
|
|
703
|
+
* 🔴 **BREAKING(server ≥ 7.64.0,core 7.6.0 design/390 D-8)—— 终局是一条带标因由,不再是八个平面键。**
|
|
704
|
+
*
|
|
705
|
+
* 7.63.0 及以前,一次 run 怎么结束的要从并列的八个可选键里拼:`status` / `errorCode` / `errorMessage` /
|
|
706
|
+
* `blockedReason` / `checkpointToken` / `checkpointId` / `checkpointGate` / `workspaceRestoreMode`。哪些组合
|
|
707
|
+
* 合法(「`suspended` ⇔ 有 token」「review park 与 approval park 不同时置位」)只活在引擎那条 if/else 阶梯的
|
|
708
|
+
* 顺序里,读的人只能靠**缺席**推断。现在它是**形状**:paused 因由带着它的门,completed 因由**写不出**码。
|
|
709
|
+
*
|
|
710
|
+
* **怎么读**:分诊读 `terminal.kind`。要旧的五词 `status`,调引擎导出的 `terminalProjection(terminal)` ——
|
|
711
|
+
* 那是**唯一**一条 因由→平面 的派生。🔴 **本 SDK 刻意不提供兼容投影**:提供一条就等于同一个事实在这条
|
|
712
|
+
* wire 上有了两个真源,而消费端会分成「读因由的」和「读投影的」两派(下一次形变时后者全部无声地错)。
|
|
713
|
+
* 「哪个 park 读作 `suspended`、哪个读作 `needs_review`」由引擎的 pause registry 决定,不是本服务的表。
|
|
714
|
+
*
|
|
715
|
+
* 🔴 **没有变的是 server 自己的列与信封**(它们不是引擎结果):`GET /v1/runs/:id` 行上的 `status` /
|
|
716
|
+
* `errorCode` 列、任务列表行的 `status`、`/decide` 200 体的三键、fleet 行的终态词 —— 照旧说五词,只是
|
|
717
|
+
* 数据源改成从因由投影一次。
|
|
718
|
+
*/
|
|
719
|
+
export type TerminalCause = {
|
|
720
|
+
kind: "completed";
|
|
721
|
+
} | {
|
|
722
|
+
kind: "failed";
|
|
723
|
+
/** 这次失败带的**机器码**——退役的平面 `errorCode` 那一席,现在**结构上**只属于失败臂
|
|
724
|
+
* (「码属于失败」成了形状,不再是一条跨字段口头约定)。**开集**,点分命名空间可按族前缀匹配:
|
|
725
|
+
* `limits.max_tokens_exceeded` / `limits.max_cost_exceeded` / `limits.max_turns_exceeded` /
|
|
726
|
+
* `limits.max_walltime_exceeded` / `config.*` / `resume_at.*`;brain 码(`auth`/`network`/
|
|
727
|
+
* `rate_limit`/…)与 `conflict` 仍是扁平词。
|
|
728
|
+
* ⚠️ 两个**外因**停因刻意**不在** `limits.*` 族(重试要的是新环境 / 等窗口放开,不是更小的预算):
|
|
729
|
+
* `env.lifetime_expired` 与 `usage.window_exhausted`。
|
|
730
|
+
* 治理码同样落这里,而**哪条腿把它改写成 HTTP 状态逐码不同**,别互相推广:
|
|
731
|
+
* · `memory.admission_denied` / `memory.admission_required` **只**在同步 `POST /v1/tasks` 上被改写成
|
|
732
|
+
* 403/503;异步轮询腿与 `done` 帧上它们骑 200;
|
|
733
|
+
* · `usage.window_exhausted` 只有**进场前**那道门是 429,进场后竞态窗内的拒**任何腿都不改写**。
|
|
734
|
+
* 嵌套编排器遇到自己驱动不了的耐久 park 时盖 `unexpected.suspended` / `unexpected.needs_review`,
|
|
735
|
+
* 并把那次 park 整只带在 {@link nestedPause}。
|
|
736
|
+
* 🔴 消费端必须带 `default` 臂;缺席 = 这次失败本来就没有码。 */
|
|
737
|
+
code?: string;
|
|
738
|
+
/** 人类可读的失败文本;没有就缺席。 */
|
|
739
|
+
message?: string;
|
|
740
|
+
/** 这次失败**顶替的那次耐久暂停** —— 只在**嵌套硬边界**(verify / cascade)上出现:嵌套腿停在一道
|
|
741
|
+
* 耐久门上,而编排器从内部驱动不了 resume,于是在**它的**边界上如实报 failed,同时把那次 park 的
|
|
742
|
+
* 因由整只带在这里,顶层调用方据此仍能恢复。
|
|
743
|
+
* 🔴 wire 上它同样**不带 `token`**(与顶层 paused 臂同一条摘除规则);`gate` / `checkpointId` 照常在。
|
|
744
|
+
* 引擎自己组装的失败上恒缺席。 */
|
|
745
|
+
nestedPause?: PausedCause;
|
|
746
|
+
} | {
|
|
747
|
+
kind: "blocked";
|
|
748
|
+
/** agent 为什么完不成(治理判决不是失败)。 */
|
|
749
|
+
reason: string;
|
|
750
|
+
} | PausedCause;
|
|
751
|
+
/**
|
|
752
|
+
* 一次耐久暂停的因由(`TerminalCause` 的 paused 臂)—— 提交了 checkpoint,这条 run 可恢复。
|
|
753
|
+
*
|
|
754
|
+
* 🔴 **`token` 席位永不上 wire**:它是恢复**能力凭据**(token-as-auth),永不离开服务边界 —— 与 7.63.0
|
|
755
|
+
* 之前的 `checkpointToken` 从不上 wire 是**同一条纪律**,只是凭据换了住址(server `src/terminal.ts` 的
|
|
756
|
+
* `stripResumeToken` 在**两条**够得着的路径上摘它:本臂与 `failed.nestedPause`)。要动这次暂停:走
|
|
757
|
+
* `POST /v1/approvals/{sessionId}/decide`,凭 `checkpointId` 对账。
|
|
758
|
+
*/
|
|
759
|
+
export interface PausedCause {
|
|
760
|
+
kind: "paused";
|
|
761
|
+
/** **哪一道**暂停 —— 谁/什么必须来恢复它。与 park 行的 `gate.kind` 是同一个词。 */
|
|
762
|
+
gate: CheckpointGate;
|
|
763
|
+
/** 这次暂停的**非密**稳定身份 —— token 不能去的地方可以记/可以渲的那个对账键。
|
|
764
|
+
* pre-identity 的老 checkpoint 上缺席。 */
|
|
765
|
+
checkpointId?: string;
|
|
766
|
+
/** 被暂停任务的远端工作区**怎么回来**,只要这次暂停捕获了远端工作区就在场。两种模式计费与行为差得远:
|
|
767
|
+
* · `"snapshot"` —— VM 被挂起成快照(供应商侧计费通常停,进程内存态被捕获,resume 复原);
|
|
768
|
+
* · `"park_only"` —— 环境自陈不可挂起(SSH 主机 / ADB 设备),于是**什么都没被暂停**:机器继续跑、
|
|
769
|
+
* 继续花钱,进程内存态听凭那头处置,resume 只是重新连上还在那儿的工作区。
|
|
770
|
+
* **缺席** = 进程内暂停(静态的、调用方自有的环境:没有远端工作区被捕获)。
|
|
771
|
+
* 🔴 把「paused ⇒ 空闲且免费」当成不变量的调度器必须看得见这一位。 */
|
|
772
|
+
restoreMode?: "snapshot" | "park_only";
|
|
773
|
+
}
|
|
702
774
|
/** Synchronous task result (`POST /v1/tasks`). */
|
|
703
775
|
export interface TaskResult {
|
|
704
776
|
taskId: string;
|
|
705
777
|
sessionId: string;
|
|
706
|
-
|
|
778
|
+
/** 🔴 **server ≥ 7.64.0** —— 这条 run 的**唯一**终局记录。分诊读 `terminal.kind`;退役的八个平面键
|
|
779
|
+
* (`status` / `errorCode` / `errorMessage` / `blockedReason` / `checkpointToken` / `checkpointId` /
|
|
780
|
+
* `checkpointGate` / `workspaceRestoreMode`)已从本型面**整删**,**不留可选兼容键**(同一条 wire 上
|
|
781
|
+
* 两种拼法 = 一个语义面两个写者)。要五词 `status` 的消费方自己调引擎的 `terminalProjection(terminal)`。
|
|
782
|
+
*
|
|
783
|
+
* ⚠️ **跨代偏斜,如实登记**(与 8.0.0 的 `CcImportResult` 换形同款处置):本 SDK 的 server 支持地板是
|
|
784
|
+
* **3.0.0**,而 `terminal` 只有 **≥7.64.0** 的 server 才发。对着一台更老的 server,这一座在运行期
|
|
785
|
+
* **缺席**(而型面上它是必填)—— 旧的平面键则仍在 wire 上,经开集索引读得到但**无类型**。
|
|
786
|
+
* 🔴 要同时吃两代 server 的消费方:先用 `"terminal" in result` 判形,别把型面的必填当成运行期保证。
|
|
787
|
+
* ⚠️ 本座**不**做成可选来「表达这件事」:可选会让 7.64.0 之后的每一个读点都被迫处理一个**不存在**的
|
|
788
|
+
* 缺席分支,而真正的判别位是对端版本,不是这个键。 */
|
|
789
|
+
terminal: TerminalCause;
|
|
707
790
|
result?: string;
|
|
708
791
|
/** [2255]① 拒绝形材料(server ≥3.21:SSE 车道 409 conflict.session_active_run 的 done 帧 result 携带;
|
|
709
792
|
* 普通终态帧不带)。activeTaskId 其实自 [1833] G10 起就在 wire 上,此前 SDK 侧漏登记——一并补。
|
|
@@ -711,8 +794,6 @@ export interface TaskResult {
|
|
|
711
794
|
activeTaskId?: string | null;
|
|
712
795
|
activeTaskStatus?: string;
|
|
713
796
|
pendingGate?: PendingGateMaterial;
|
|
714
|
-
errorCode?: string;
|
|
715
|
-
errorMessage?: string;
|
|
716
797
|
/** 🔴 **等待提示的 2xx 形**(复审车 C,2026-08-05)—— 引擎 result 里的等待提示,**毫秒、未换算**
|
|
717
798
|
* (与错误体的 `retryAfterSec`(**秒**)不同单位,别混用)。
|
|
718
799
|
* ⚠️「带等待提示」≠「transient」:引擎把 `memory.admission_required` 判为 **transient**(目录答上来后
|
|
@@ -741,17 +822,15 @@ export interface TaskResult {
|
|
|
741
822
|
};
|
|
742
823
|
/** [1543] SDK-M 补键(core 真域逐字,engine 一直在发、此前封闭接口读不到):
|
|
743
824
|
* salvagedOutput = degenerate/timeout 终态抢救出的最后模型文本(render as partial);
|
|
744
|
-
* blockedReason = 任务被策略/门挡下的人类可读因;
|
|
745
|
-
* checkpointGate = suspended 时挂起的门(与 events 的 `suspended.gate` 同源——poller 面读这里);
|
|
746
825
|
* degraded = 模型降级链实录(from/to/reason/atTurn);
|
|
747
|
-
* structuredOutput = outputSchema 任务的结构化产出(0.0.74 的 outputRetries 旋钮所服务的产物)。
|
|
826
|
+
* structuredOutput = outputSchema 任务的结构化产出(0.0.74 的 outputRetries 旋钮所服务的产物)。
|
|
827
|
+
* (7.64.0 删:`blockedReason` → `terminal.blocked.reason`;`checkpointGate` → `terminal.paused.gate`,
|
|
828
|
+
* 而且不再是 `unknown` —— 因由形下它是 typed 的 {@link CheckpointGate}。) */
|
|
748
829
|
salvagedOutput?: string;
|
|
749
|
-
|
|
750
|
-
checkpointGate?: unknown;
|
|
751
|
-
/** [4913](server 7.41+)—— durable park(status suspended/needs_review)时**待批工具调用**的 id,
|
|
830
|
+
/** [4913](server 7.41+)—— durable park(`terminal.kind === "paused"`)时**待批工具调用**的 id,
|
|
752
831
|
* 与 tool_approval 帧的 `toolCallId` 同键同义(server ≥1.307)。缺席形照 core [1995]② OMITTED 契约:
|
|
753
832
|
* tool-less park(resource_limit / plan_review / task_done)或 server 侧读失败时**键整个缺席**,
|
|
754
|
-
* 绝不编 null——消费方测 presence
|
|
833
|
+
* 绝不编 null——消费方测 presence。非 paused 的因由上恒缺席。 */
|
|
755
834
|
toolCallId?: string;
|
|
756
835
|
degraded?: {
|
|
757
836
|
from: string;
|
|
@@ -776,7 +855,10 @@ export interface TaskResult {
|
|
|
776
855
|
* }
|
|
777
856
|
* ```
|
|
778
857
|
* 或直接按机器码 `ev.result.errorCode === "conflict.session_active_run"`。
|
|
779
|
-
*
|
|
858
|
+
* 🔴 **server ≥ 7.64.0 起两形靠键分家**:正常终态带 `terminal`(带标因由)、**没有** `status`;拒绝形带扁平
|
|
859
|
+
* `status: "failed"` + `errorCode`,因为它是 **server 自己的**拒绝信封、不是引擎结果,这次形变没动它。
|
|
860
|
+
* 于是 `status` 现在只在其中一形上 —— 但判别位仍按 server 钉的那两个来(`stats` 在场性 / `errorCode`),
|
|
861
|
+
* 别改判成 `status` 缺席(那是拿「另一形没有的键」当判据,方向脆)。
|
|
780
862
|
*
|
|
781
863
|
* 出路材料([2255]①/[2257]):`activeTaskStatus` 分「插话/取消」(running)与「决议/取消」(parked)两族;
|
|
782
864
|
* `pendingGate.decidePath` 是 parked run 的**那一个**正确 resume 入口(sessionId 寻址,checkpoint token
|
|
@@ -1381,13 +1463,53 @@ export interface SupervisorCostBreakdown {
|
|
|
1381
1463
|
};
|
|
1382
1464
|
totalMicroUsd: number;
|
|
1383
1465
|
}
|
|
1466
|
+
/**
|
|
1467
|
+
* 🔴 **盘上的那一形** —— server 7.63.0 及以前写下的任务结果,退役的**平面**形。
|
|
1468
|
+
*
|
|
1469
|
+
* 它只出现在**回放持久字节**的那几张脸上,而且只在跨过 7.64.0 升级过的部署上:`GET /v1/runs/:id` 的
|
|
1470
|
+
* `result`(server 对存储 blob 是**逐字透传**,只过一次脱敏,**不补** `terminal` —— `src/http/routes/runs.ts`)
|
|
1471
|
+
* 与 durable 账本回放出来的 `done` 帧。**没有任何东西会再写出它**:写口只铸一种形({@link TaskResult})。
|
|
1472
|
+
*
|
|
1473
|
+
* 🔴 **这不是兼容孪生键**。「同一条 wire 上一个事实两种拼法」禁的是**写者**:一个语义面两个生产者。这里
|
|
1474
|
+
* 只有**一个**写者,外加一张**读盘**面认盘上那个已停产的写者真留下的字节 —— 与 server 自己那只两代读器
|
|
1475
|
+
* (`persistedPlaneOf`)划的是同一条线,而那个函数的顶注逐字记着「删掉它」造成的两条可复现回归:历史 run 的
|
|
1476
|
+
* `GET /v1/runs/:id` 整个 500,以及旧账本行回放时凭据重新明文外发。
|
|
1477
|
+
*
|
|
1478
|
+
* **判别位** = `"terminal" in result`:在场 = 现行因由形,缺席 = 本形。🔴 **别只按 `status` 判** ——
|
|
1479
|
+
* SSE 的拒绝信封({@link ActiveRunConflictDoneResult})也带 `status`。
|
|
1480
|
+
*/
|
|
1481
|
+
export interface LegacyPlaneTaskResult {
|
|
1482
|
+
taskId: string;
|
|
1483
|
+
sessionId: string;
|
|
1484
|
+
/** 退役的五词平面状态。它的继任是 {@link TaskResult.terminal} 的 `kind`(经引擎的 `terminalProjection` 派生)。 */
|
|
1485
|
+
status: RunStatus;
|
|
1486
|
+
result?: string;
|
|
1487
|
+
stats: TaskStats;
|
|
1488
|
+
/** 退役的平面终局码。继任者 = `terminal.failed.code`。 */
|
|
1489
|
+
errorCode?: string;
|
|
1490
|
+
/** 退役的平面失败文本。继任者 = `terminal.failed.message`。 */
|
|
1491
|
+
errorMessage?: string;
|
|
1492
|
+
/** 退役的平面治理因由。继任者 = `terminal.blocked.reason`。 */
|
|
1493
|
+
blockedReason?: string;
|
|
1494
|
+
/** 退役的平面暂停门 —— **刻意留 `unknown`**:这是上一代写下的字节,本契约不替它重新裁定形状。
|
|
1495
|
+
* 继任者 = `terminal.paused.gate`(typed 的 {@link CheckpointGate})。 */
|
|
1496
|
+
checkpointGate?: unknown;
|
|
1497
|
+
salvagedOutput?: string;
|
|
1498
|
+
model?: string;
|
|
1499
|
+
toolCallId?: string;
|
|
1500
|
+
retryAfterMs?: number;
|
|
1501
|
+
}
|
|
1384
1502
|
/** Run state (`GET /v1/runs/:id`) — LIVE shape (service Drift 2): `result` is the NESTED TaskResult
|
|
1385
1503
|
* (output text = result.result, stats = result.stats; no top-level stats); error text field is `error`. */
|
|
1386
1504
|
export interface RunRecord {
|
|
1387
1505
|
taskId: string;
|
|
1388
1506
|
sessionId: string;
|
|
1389
1507
|
status: RunStatus;
|
|
1390
|
-
|
|
1508
|
+
/** 🔴 **读盘面 ⇒ 两代字节**(server ≥7.64.0 起;见 {@link LegacyPlaneTaskResult}):server 对存储 blob 是
|
|
1509
|
+
* 逐字透传、**不补** `terminal`,所以一台跨 7.64.0 升级过的部署上,升级前的历史行读出来仍是旧的平面形。
|
|
1510
|
+
* 判别位 `"terminal" in run.result`。 */
|
|
1511
|
+
result?: TaskResult | LegacyPlaneTaskResult;
|
|
1512
|
+
/** 本**行的列**,7.64.0 未变(照旧说五词);只是数据源改成从 `result.terminal` 投影一次(旧行则直接读平面键)。 */
|
|
1391
1513
|
errorCode?: string;
|
|
1392
1514
|
error?: string;
|
|
1393
1515
|
/** Work-view correlation. Present when the run has a jobId (omitted when null). LIVE server-side
|
|
@@ -1594,6 +1716,156 @@ export interface TraceTurn {
|
|
|
1594
1716
|
};
|
|
1595
1717
|
[k: string]: unknown;
|
|
1596
1718
|
}
|
|
1719
|
+
/**
|
|
1720
|
+
* **谁拒的** —— 判决是这次 deny 的那一**层**(core 7.6.0 `DENIED_BY_VALUES`,闭八词)。
|
|
1721
|
+
* deny 引出的另一个问题「谁**问**的」由 {@link AskOrigin} 回答;7.6.0 之前两者共用一张七词表
|
|
1722
|
+
* (`PermissionDeniedSource`),其中 `classifier` 同时兼任「分类器提的问」与「分类器拒的」两义。
|
|
1723
|
+
* · `policy` —— 部署 `ToolPolicy` 拒(直接拒,或复查一次被批准的编辑),或审批-编辑链撞了轮次上限;
|
|
1724
|
+
* · `hook` —— PreToolUse hook 拒 / 抛 / 从未作答(对「没作决定的 hook」的 fail-closed 拦阻按 hook 层归因);
|
|
1725
|
+
* · `org` —— 组织策略规则拒;
|
|
1726
|
+
* · `classifier` —— auto 模式分类器**直接**拒(它的 ASK 侧角色是 `origin: "denial_limit_fallback"`);
|
|
1727
|
+
* · `plan_mode` —— plan 模式对写工具的只读拦阻;
|
|
1728
|
+
* · `compliance` —— 合规的调用期锁;
|
|
1729
|
+
* · `write_protection` —— 一次被批准的编辑被限制链改写到了**没有任何审批覆盖**的写保护路径上;
|
|
1730
|
+
* · `ask_resolution` —— 这次 ask 的**结算本身**就是拒(有人说了不 / 窗到期 / 没人可问……),细节在
|
|
1731
|
+
* {@link GateOutcome.settlement}。
|
|
1732
|
+
* 🔴 **本词表在这条 wire 上是真闭集,所以类型也闭**(与 {@link McpFailureKind} 那种「只是眼下十个词」的开集
|
|
1733
|
+
* 不同,这条差别有出处):引擎的 `screenGateOutcome` 把「`deniedBy` 出闭集」列为记录**缺陷**,而 server 对
|
|
1734
|
+
* 有缺陷的记录是**整条不上帧**(report + withhold)。⇒ 一个词表外的 `deniedBy` **结构上到不了消费端** ——
|
|
1735
|
+
* 它到达的形式是 `gate` **整键缺席**,而不是一个陌生的词。给这里加一条 `(string & {})` 只会造出一个永远
|
|
1736
|
+
* 走不到的分支,同时把消费端本可以拿到的**编译期穷尽性**弄丢。
|
|
1737
|
+
* {@link Settlement} 的 `kind` 与 {@link GateOutcome.origin} 走同一只筛子,同样是这条纪律。
|
|
1738
|
+
*/
|
|
1739
|
+
export type DeniedBy = "policy" | "hook" | "org" | "classifier" | "plan_mode" | "compliance" | "write_protection" | "ask_resolution";
|
|
1740
|
+
/**
|
|
1741
|
+
* 这次门通过的**最终处置**:放行,或被哪一层拒。deny 臂**必须**点名那一层 —— 这正是它与 allow 臂
|
|
1742
|
+
* 在类型上分家的理由(「拒了但说不出谁拒的」写不出来)。
|
|
1743
|
+
*/
|
|
1744
|
+
export type GateDisposition = {
|
|
1745
|
+
kind: "allowed";
|
|
1746
|
+
} | {
|
|
1747
|
+
kind: "denied";
|
|
1748
|
+
deniedBy: DeniedBy;
|
|
1749
|
+
};
|
|
1750
|
+
/**
|
|
1751
|
+
* 一只 ask 在等的那次等待**怎么结束的** —— 按 `kind` 判别的联合(core 7.6.0 `SETTLEMENT_KINDS`,闭十二词)。
|
|
1752
|
+
*
|
|
1753
|
+
* 🔴 它**刻意不是** `kind × who` 的自由积:自由积表达得出「human_allowed,由引擎的窗结束」——一条结构完整
|
|
1754
|
+
* 却自相矛盾的记录,而消费端随后就得自己记住这张配对表。这里 `who` 的形**由词决定**:两个 human 词带人,
|
|
1755
|
+
* 两条窗词说是谁的窗,park 词说是宿主,fail-closed 那一族谁也不是。
|
|
1756
|
+
* 🔴 **单铸律**:每一个词都由**引擎**在那次等待结束的地方铸出来。宿主永不铸词,只报**事实**(同步 approver
|
|
1757
|
+
* 报 `human`/`timeout`,耐久 decide 报 `decidedBy: "person" | "sla_timeout"`),core 据此铸词。
|
|
1758
|
+
* ⚠️ server 侧投影:`who.approver`(宿主派生的身份串)与 `note`(拒批人自己写的自由文本)在上 wire 前
|
|
1759
|
+
* 都过脱敏,`note` 另有长度上界。
|
|
1760
|
+
*/
|
|
1761
|
+
export type Settlement = {
|
|
1762
|
+
/** 人(或代他行事的 approver)做了决定;`human_refused` 可带决策者自己写的那句话。 */
|
|
1763
|
+
kind: "human_allowed" | "human_refused";
|
|
1764
|
+
who: {
|
|
1765
|
+
party: "person";
|
|
1766
|
+
approver?: string;
|
|
1767
|
+
};
|
|
1768
|
+
/** epoch ms,写在结算发生的那一处。 */
|
|
1769
|
+
when: number;
|
|
1770
|
+
/** 拒批人附的那句话。**没有 note 的拒 = 一句干脆的「不」**,不是「没说理由的 bug」。 */
|
|
1771
|
+
note?: string;
|
|
1772
|
+
} | {
|
|
1773
|
+
/** 审批窗走完了没人答:引擎自己的审批工厂窗,或同步宿主 approver 报「我的窗到了」。 */
|
|
1774
|
+
kind: "approval_window_expired";
|
|
1775
|
+
who: {
|
|
1776
|
+
party: "engine";
|
|
1777
|
+
window: "approval_factory";
|
|
1778
|
+
} | {
|
|
1779
|
+
party: "host";
|
|
1780
|
+
};
|
|
1781
|
+
when: number;
|
|
1782
|
+
} | {
|
|
1783
|
+
/** 分类器拒绝上限回落的自动拒窗(core 在同步腿上自己的计时器)走完了没人答。 */
|
|
1784
|
+
kind: "denial_limit_window_expired";
|
|
1785
|
+
who: {
|
|
1786
|
+
party: "engine";
|
|
1787
|
+
window: "denial_limit";
|
|
1788
|
+
};
|
|
1789
|
+
when: number;
|
|
1790
|
+
} | {
|
|
1791
|
+
/** 一次**耐久 park** 的 SLA 到期,宿主的扫把它判成拒。店的 `expire`/`reap` 不产 `tool_end`,
|
|
1792
|
+
* 因此也不产结算。 */
|
|
1793
|
+
kind: "park_sla_expired";
|
|
1794
|
+
who: {
|
|
1795
|
+
party: "host";
|
|
1796
|
+
approver?: string;
|
|
1797
|
+
};
|
|
1798
|
+
when: number;
|
|
1799
|
+
} | {
|
|
1800
|
+
/** fail-closed 一族 —— 结束这次等待的不是某个人,是处境本身。
|
|
1801
|
+
* `no_approver`(headless:没接 approver / 问答面,或就是拒的姿态串)/ `approver_unavailable`
|
|
1802
|
+
* (approver 对**路由**问题答了「没人可达」,且没有 park 接住)/ `approver_error`(它抛了)/
|
|
1803
|
+
* `approver_contract`(它答在契约之外)/ `presentation_failed`(参数或编辑没法安全呈现/采纳)/
|
|
1804
|
+
* `blanket_allow_refused`(整体放行撞上 `requiresRealApproval` 的 ask)/ `task_aborted`
|
|
1805
|
+
* (等待的中止信号结束了它)。 */
|
|
1806
|
+
kind: "no_approver" | "approver_unavailable" | "approver_error" | "approver_contract" | "presentation_failed" | "blanket_allow_refused" | "task_aborted";
|
|
1807
|
+
who: {
|
|
1808
|
+
party: "none";
|
|
1809
|
+
};
|
|
1810
|
+
when: number;
|
|
1811
|
+
};
|
|
1812
|
+
/**
|
|
1813
|
+
* 🔴 **BREAKING(server ≥ 7.64.0,core 7.6.0 design/390 S6-A)—— 一次工具门通过的整条记录。**
|
|
1814
|
+
*
|
|
1815
|
+
* 它取代了 7.63.0 及以前的四个正交词(`settledBy` / `resolution` / `autoDenied` / `approver`,**四键全删,
|
|
1816
|
+
* 无 alias**):那四个词的配对规则只活在注释里,消费端要靠**缺席**推语义(「有 `timeout` 没有 `resolution`
|
|
1817
|
+
* ⇒ 耐久 park 过期」)。现在配对规则是引擎的四条不变量,判据是引擎的一只筛子。
|
|
1818
|
+
*
|
|
1819
|
+
* **铸一次,投三面**(门的出口;耐久 park 走 decide 车道)—— `permissionDenied` 观察者的载荷、这次调用的
|
|
1820
|
+
* `tool_end` 帧、耐久行的 resolved outcome。三面是同一张对象图,所以讲不出三个故事。
|
|
1821
|
+
*
|
|
1822
|
+
* 三个成员正交,但被引擎的四条不变量绑住:
|
|
1823
|
+
* · **I1** `settlement` 在场 ⇔ `origin` 在场(它们说的是同一只 ask);
|
|
1824
|
+
* · **I2** `deniedBy === "ask_resolution"` ⇒ `settlement` 在场且是拒绝类词;
|
|
1825
|
+
* · **I3** `human_allowed` 结算旁边出现 `denied` 处置 ⇒ 那是**人批了之后的复查**否决,`deniedBy` 必是可否决层
|
|
1826
|
+
* (`policy` / `hook` / `org` / `write_protection`),而 approver 留在结算上(这不是 approver 的拒);
|
|
1827
|
+
* · **I4** `allowed` 处置 ⇒ `settlement` 缺席或恰是 `human_allowed`。
|
|
1828
|
+
*
|
|
1829
|
+
* 🔴 **没有任何一项从缺席读出来**:普通放行是 `{ disposition: { kind: "allowed" } }`,直接策略拒是
|
|
1830
|
+
* `{ disposition: { kind: "denied", deniedBy: "policy" } }`,两者都不带结算 —— 因为两者都没结算过什么。
|
|
1831
|
+
* 🔴 **server 对过不了引擎不变量筛的记录整条不投**(report + withhold,计数 `server.trace.gate-outcome-defective`),
|
|
1832
|
+
* 所以「本该有 `gate` 却缺席」除了「门没看见这次调用」(未武装的门 / 延后重发 / reconcile 捡回的孤儿)之外
|
|
1833
|
+
* 还有第四种成因:那条记录坏了。四者在 wire 上不可分辨 ⇒ 一律退回 `isError` + 文案。
|
|
1834
|
+
*/
|
|
1835
|
+
export interface GateOutcome {
|
|
1836
|
+
disposition: GateDisposition;
|
|
1837
|
+
/** 只在**这次通过真的结算了一只 ask** 时在场。与 {@link origin} 同在同缺(I1)。 */
|
|
1838
|
+
settlement?: Settlement;
|
|
1839
|
+
/** 谁**问**的。与 {@link settlement} 同在同缺(I1)。 */
|
|
1840
|
+
origin?: AskOrigin;
|
|
1841
|
+
}
|
|
1842
|
+
/**
|
|
1843
|
+
* 一次失败的 MCP 请求**到没到那台服务器**(core 7.6.0 `MCP_DELIVERY_VERDICTS`,闭三词)。
|
|
1844
|
+
* · `yes` —— 服务器答了(`protocol` 型拒绝本身就证明交换发生过);
|
|
1845
|
+
* · `no` —— **可证**没发出去(connect 相 errno / spawn 失败 / 声明畸形 / 已知死掉的服务器)⇒ 直接重试或
|
|
1846
|
+
* 放弃都安全,什么都没执行;
|
|
1847
|
+
* · `unknown` —— 客户端在交换中途不等了或丢了管道(超时 / 在飞关闭 / reset / 前置网关给的 HTTP 状态)⇒
|
|
1848
|
+
* 请求**可能**已经执行,带写副作用的工具必须先核实再重试。
|
|
1849
|
+
*
|
|
1850
|
+
* 🔴 **与 `errorCode` 合读,别单读**:同一个 `connection_closed`,`no` 可以直接重试、`unknown` 必须先去查 ——
|
|
1851
|
+
* 这正是判词自成一格、不折进失败类的理由。
|
|
1852
|
+
* ⚠️ `no` 说的是**调用方的工具调用**没发出去,**不**保证「那台服务器一个字节都没收到」(dial 期的
|
|
1853
|
+
* elicitation 可能已经跨过连接)—— core 的契约原话,逐字透传。
|
|
1854
|
+
*/
|
|
1855
|
+
export type McpDelivered = "yes" | "no" | "unknown";
|
|
1856
|
+
/**
|
|
1857
|
+
* MCP 失败的**类**(core 7.6.0 `MCP_FAILURE_KINDS`,闭十词)—— `tool_end.errorCode` 与
|
|
1858
|
+
* `wiring_manifest.mcp[].errorCode` 上 MCP 那一族的取值。
|
|
1859
|
+
* `connect_refused`(连接相 errno:请求**可证**从未离开)/ `connection_failed`(其他 errno:可能跑过了)/
|
|
1860
|
+
* `connection_closed`(SDK 报传输已关:在飞时命运不可知,对已知死掉的服务器则从未尝试——两者靠
|
|
1861
|
+
* {@link McpDelivered} 分辨)/ `http_status`(HTTP 端点回了状态而不是 MCP 响应;数字在 `httpStatus`)/
|
|
1862
|
+
* `not_mcp_response` / `spawn_failed`(stdio 子进程起不来)/ `timeout` / `protocol`(服务器**答**了一个
|
|
1863
|
+
* MCP/JSON-RPC 错:交换发生过)/ `invalid_config`(声明本身拨不出去 —— 要改 spec,不是等它恢复)/ `unknown`。
|
|
1864
|
+
* 🔴 core 7.6.0 起**退役** `MCP_FAILURE_CODES` 那张十词表,`network` 与 `http_<status>` **两种拼法一并作废**
|
|
1865
|
+
* (HTTP 状态从此走结构位 `httpStatus`,不再编进码里)。
|
|
1866
|
+
* 🔴 `tool_end.errorCode` 整体仍是**开集**(词表属主是工具);本类型只描述其中 MCP 这一族,按开集读。
|
|
1867
|
+
*/
|
|
1868
|
+
export type McpFailureKind = "connect_refused" | "connection_failed" | "connection_closed" | "http_status" | "not_mcp_response" | "spawn_failed" | "timeout" | "protocol" | "invalid_config" | "unknown" | (string & {});
|
|
1597
1869
|
/** Open set — render unknown types generically, never crash.
|
|
1598
1870
|
*
|
|
1599
1871
|
* design/99 §E1/§E2 (SHIPPED, service `TraceBlock`/`projectEvents` project.ts:69-73,160-165): the action-card
|
|
@@ -1630,16 +1902,18 @@ export type TraceBlock = {
|
|
|
1630
1902
|
/** `label` 同 `tool-call`(`toolResultFieldsOf`,`trace/project.ts:603`);`totalChars` = **截断前的可信总量**
|
|
1631
1903
|
* (core 1.442 / RB-210,`:604`)—— `truncated:true` 时「还剩多少没显示」= `totalChars` 减已渲染长度。
|
|
1632
1904
|
* 与 `honest-absence-not-fabricated-zero` 同族:缺席 = 旧 core / 未截断场景,**不要当 0 读**。 */
|
|
1633
|
-
/**
|
|
1634
|
-
* `
|
|
1635
|
-
*
|
|
1636
|
-
*
|
|
1637
|
-
* 🔴
|
|
1638
|
-
*
|
|
1905
|
+
/** 🔴 **server ≥7.64.0 BREAKING**:`gate` = 这次调用**整条门记录**({@link GateOutcome})—— 它取代了退役的
|
|
1906
|
+
* 四个正交词 `settledBy` / `resolution` / `autoDenied` / `approver`(四键全删,无 alias)。与
|
|
1907
|
+
* `AgentEvent.tool_end.gate` **同一个值**:server 的共享挑键器 `toolResultFieldsOf` 把它同时喂给 turns 面
|
|
1908
|
+
* 与 SSE 面,所以三处同形(历史教训:此前只补 tool_end、两条 trace 面漏声明 = 运行时给了值、类型上拿不到)。
|
|
1909
|
+
* 🔴 **读腿是独立的一道筛**:账本行可以来自任何引擎世代或第三方 producer,所以坏记录在读面同样被扣下 ——
|
|
1910
|
+
* 缺席不是关于这次调用的事实。
|
|
1911
|
+
* `delivered` = MCP 投递判词({@link McpDelivered}),与 `errorCode` **合读**;非 MCP 失败上恒缺席。
|
|
1912
|
+
* `gatedCallId` = 耐久 park 正扣着哪个 call(core ≥5.55.0);tool-less park 上缺席。 */
|
|
1639
1913
|
/** `errorCode` = core ≥5.9.0(W3 / [2535],#191 件三补):这次调用**为什么失败**的机器可判别短码。
|
|
1640
1914
|
* 与 `AgentEvent.tool_end.errorCode` **同一个值**(server 的共享挑键器 `toolResultFieldsOf` 同时喂 turns 面
|
|
1641
1915
|
* 与 SSE 面),完整语义见那一处的长注。
|
|
1642
|
-
* 🔴
|
|
1916
|
+
* 🔴 **开集**:词表属主在**工具**那一侧,任意 `ToolResult.details.code`
|
|
1643
1917
|
* 都可能到达 —— 分支已知值、永远带 `default`。与 HTTP 错误体上的 `errorCode` 是两个不同的命名空间,只是
|
|
1644
1918
|
* 同名;**两者都可增补**,差别在属主与兜底手段(HTTP 那张属 server、按前缀/状态码兜底;本键属工具、
|
|
1645
1919
|
* 只能靠 `default`)—— 完整口径见 `AgentEvent.tool_end.errorCode` 的长注。 */
|
|
@@ -1652,7 +1926,9 @@ export type TraceBlock = {
|
|
|
1652
1926
|
truncated?: boolean;
|
|
1653
1927
|
totalChars?: number;
|
|
1654
1928
|
structured?: unknown;
|
|
1655
|
-
|
|
1929
|
+
gate?: GateOutcome;
|
|
1930
|
+
delivered?: McpDelivered;
|
|
1931
|
+
gatedCallId?: string;
|
|
1656
1932
|
errorCode?: string;
|
|
1657
1933
|
eventId?: string;
|
|
1658
1934
|
parentToolCallId?: string;
|
|
@@ -1750,7 +2026,9 @@ export type TraceStreamEvent = {
|
|
|
1750
2026
|
truncated?: boolean;
|
|
1751
2027
|
totalChars?: number;
|
|
1752
2028
|
structured?: unknown;
|
|
1753
|
-
|
|
2029
|
+
gate?: GateOutcome;
|
|
2030
|
+
delivered?: McpDelivered;
|
|
2031
|
+
gatedCallId?: string;
|
|
1754
2032
|
errorCode?: string;
|
|
1755
2033
|
eventId?: string;
|
|
1756
2034
|
parentToolCallId?: string;
|
|
@@ -1998,6 +2276,66 @@ export interface McpServerSpec {
|
|
|
1998
2276
|
}
|
|
1999
2277
|
/** Worker capability map (`GET /v1/capabilities`). Open set — ignore unknown keys. Booleans
|
|
2000
2278
|
* share deps with the route gates ("says yes but 501s" is structurally impossible, producer-tested). */
|
|
2279
|
+
/**
|
|
2280
|
+
* `permissionModeAuto` 的**武装未达成因由**(server `AUTO_MODE_UNARMED_REASONS` 闭六词;S-80)。
|
|
2281
|
+
* 🔴 **按开集读**:词表已经从四词长到六词,server 再加员时未知词必须落进 `default` 臂当「未知因由」,
|
|
2282
|
+
* 不许被当成「没有因由」。`local_denied`(本机 `PERMISSIONS_DISABLE_AUTO_MODE`)与 `org_denied`
|
|
2283
|
+
* (center deny)**分词就是为了让壳指不同的路**(改本机 env vs 找组织),消费端别把两者折在一起。
|
|
2284
|
+
*/
|
|
2285
|
+
export type AutoModeUnarmedReason = "mode_not_auto" | "deployment_incapable" | "org_denied" | "local_denied" | "settings_denied" | "resolver_fault" | (string & {});
|
|
2286
|
+
/** 三代形共有的三位 —— server **≤7.56.0 只发这三位**(见 {@link PermissionModeAutoCapability})。 */
|
|
2287
|
+
interface PermissionModeAutoBase {
|
|
2288
|
+
/** 提交面按五词闭集收 `"auto"`(server 写的是字面量,恒 `true`)。 */
|
|
2289
|
+
accepted: true;
|
|
2290
|
+
/** 分类器席位真挂上了(桩 / 一次性 CLI 不挂席位时如实 `false`)。 */
|
|
2291
|
+
classifierSeat: boolean;
|
|
2292
|
+
/** **center 源在不在**,绝不冒充「你被授权了」—— 授权是 per-principal 的,部署级布尔对它说不了话。 */
|
|
2293
|
+
entitlementSource: boolean;
|
|
2294
|
+
[k: string]: unknown;
|
|
2295
|
+
}
|
|
2296
|
+
/**
|
|
2297
|
+
* `capabilities.permissionModeAuto` 的**两代形**(判别位 = `armed` 的**三态**)。
|
|
2298
|
+
*
|
|
2299
|
+
* 🔴 **武装三键(`intentArming` / `armed` / `reason`)是 server ≥7.57.0(S-80)才有的**,而本包声明的
|
|
2300
|
+
* 支持地板是 **3.0.0** ⇒ 每一台 7.x ≤7.56.0 的 server 都在承诺面内,它们**只发** {@link PermissionModeAutoBase}
|
|
2301
|
+
* 那三位(亲核 server tag `v7.50.0` / `v7.56.0` 的 `routes/capabilities.ts` 逐字确认)。
|
|
2302
|
+
* 所以 `armed` **不能**写成必填:写成必填会让
|
|
2303
|
+
* ```ts
|
|
2304
|
+
* if (!auto.armed) console.log(auto.reason.toUpperCase()); // 老 server 上 reason 根本不在场
|
|
2305
|
+
* ```
|
|
2306
|
+
* **编译通过、运行期炸**,而 spec 侧同样会把一台受支持 server 的**合法**响应判成非法。
|
|
2307
|
+
*
|
|
2308
|
+
* 🔴 正确读法是**三态**,不是二值:
|
|
2309
|
+
* · `armed === true` —— 此刻会武装;
|
|
2310
|
+
* · `armed === false` —— 此刻不会,`reason` **必在场**(按开集分支);
|
|
2311
|
+
* · `armed === undefined` —— **老 server,武装态不可知**。禁折成 `false`(那会把一台正在武装的
|
|
2312
|
+
* 7.50 部署渲成「auto 是 default 的别名」),该渲成「这台 worker 不报武装态」。
|
|
2313
|
+
*
|
|
2314
|
+
* 四位披露键**刻意不合成一个布尔**:合成后「这份二进制不认识 auto」与「认识但本机没有 entitlement 源」
|
|
2315
|
+
* 会得到同一个 `false`,而壳对这两种要做的事不同(前者别给这一档;后者给,但别宣称在筛)。
|
|
2316
|
+
*/
|
|
2317
|
+
export type PermissionModeAutoCapability =
|
|
2318
|
+
/** **server ≤7.56.0**:只有三位,武装三键**整体缺席**(`armed` 缺席 = 武装态不可知)。 */
|
|
2319
|
+
(PermissionModeAutoBase & {
|
|
2320
|
+
intentArming?: undefined;
|
|
2321
|
+
armed?: undefined;
|
|
2322
|
+
reason?: undefined;
|
|
2323
|
+
model?: undefined;
|
|
2324
|
+
})
|
|
2325
|
+
/** **server ≥7.57.0** · 会武装。`model` = 分类器**配置**的模型路由;解不出时 server 不写这个键。 */
|
|
2326
|
+
| (PermissionModeAutoBase & {
|
|
2327
|
+
intentArming: boolean;
|
|
2328
|
+
armed: true;
|
|
2329
|
+
reason?: undefined;
|
|
2330
|
+
model?: string;
|
|
2331
|
+
})
|
|
2332
|
+
/** **server ≥7.57.0** · 不会武装 ⇒ `reason` 必在场(闭六词,按开集分支)。 */
|
|
2333
|
+
| (PermissionModeAutoBase & {
|
|
2334
|
+
intentArming: boolean;
|
|
2335
|
+
armed: false;
|
|
2336
|
+
reason: AutoModeUnarmedReason;
|
|
2337
|
+
model?: string;
|
|
2338
|
+
});
|
|
2001
2339
|
export interface Capabilities {
|
|
2002
2340
|
asyncRuns?: boolean;
|
|
2003
2341
|
/** [1833] G6(server `src/http/routes/capabilities.ts` 的 `sideQuery` 位,恒 `true` —— runner 自带):
|
|
@@ -2332,6 +2670,239 @@ export interface Capabilities {
|
|
|
2332
2670
|
sendUserFileLedger?: boolean;
|
|
2333
2671
|
/** GET /v1/workflows 列表面(`routes/capabilities.ts` 的能力对象 `Boolean(workflowRunStore)`;`workflows` 总位见上)。 */
|
|
2334
2672
|
workflowsList?: boolean;
|
|
2673
|
+
/** device lane 探测位(server `routes/capabilities.ts:162`;design/device-executor-lane-v2 §4.8)——
|
|
2674
|
+
* **一个诚实对象或 `false`**,与 {@link fleet} / {@link workspace} 同族三态形。谓词 = `deps.deviceHub`
|
|
2675
|
+
* 在场,而那正是 `GET /v1/device/ws` 的 upgrade 处理器挂没挂的**同一个**判据(`server.ts` 的
|
|
2676
|
+
* `deps.deviceHub?.attach(server)`)⇒「说 yes ⟺ 设备连得上」是结构性的,executor 不必
|
|
2677
|
+
* trial-by-upgrade-404。三个字段各答一件 executor 在**首连之前**就必须知道的事:
|
|
2678
|
+
* · `protocolVersion` —— 本 server 说第几版(§5.6:不满足最低版 = 响亮 helloReject,**不静默降级**);
|
|
2679
|
+
* · `maxInflightPerDevice` —— per-device 在途上限(§5.5 背压;超额在云侧排队,到期 `device.busy`);
|
|
2680
|
+
* · `wsPath` —— upgrade 路径。**刻意上 wire** 而不让客户端硬编码:路径是 server 铸的 wire 契约的
|
|
2681
|
+
* 一部分,硬编码在别的仓里 = 把「改路径」变成一次跨仓破坏性变更。
|
|
2682
|
+
* 🔴 server **刻意不广告**设备台数 / 在线态:那是管理面(`/v1/devices/*`)的事,能力面暴露它等于给
|
|
2683
|
+
* 未鉴权探测送一个组织规模 oracle。 */
|
|
2684
|
+
deviceExecutor?: false | {
|
|
2685
|
+
enabled: true;
|
|
2686
|
+
protocolVersion: number;
|
|
2687
|
+
maxInflightPerDevice: number;
|
|
2688
|
+
wsPath: string;
|
|
2689
|
+
[k: string]: unknown;
|
|
2690
|
+
};
|
|
2691
|
+
/** 记忆**引擎**位(server `routes/capabilities.ts:210` = `projectMemoryEngineCapability(deps.memoryPosture)`,
|
|
2692
|
+
* 实现在 `src/memory-posture.ts:143`)—— 对象 = 本部署的记忆面**真点亮**,`false` = 暗。判据**逐字**是
|
|
2693
|
+
* boot 的 `memoryPosture`(`boot/stores.ts` 的单一推导点)的窄投影,与 operator 诊断面
|
|
2694
|
+
* `GET /v1/diagnostics/wiring` 的 `memoryPosture` 段同源 ⇒「诊断页说亮、能力位说暗」结构上不可能。
|
|
2695
|
+
* 🔴 与 {@link memory} / {@link memoryWrite} **不是**一回事:那两位说的是**退役的** MemoryStore HTTP
|
|
2696
|
+
* 动词(恒假,且会一直恒假);本位说的是**引擎接线**,它没有 HTTP 动词面 —— 记忆是模型在注入目录上的
|
|
2697
|
+
* 文件技能。所以本位为真**不**意味着有记忆读写端点可打(那正是 legacy 两位在否认的东西)。
|
|
2698
|
+
* 🔴 `vectorMode: null` = 这条腿**没有档位指示面**(`file` 引擎),**不是**「档位是词面」。 */
|
|
2699
|
+
memoryEngine?: false | {
|
|
2700
|
+
backend: "file" | "pg" | "tidb" | (string & {});
|
|
2701
|
+
vectorMode: "native" | "portable" | "lexical" | null;
|
|
2702
|
+
[k: string]: unknown;
|
|
2703
|
+
};
|
|
2704
|
+
/** 本部署的 **SQL 事务读语义**(server `routes/capabilities.ts:216` =
|
|
2705
|
+
* `projectSqlEngineCapability(deps.sqlEngineFacts?.())`,实现在 `src/sql-engine-posture.ts:57`;S-131)。
|
|
2706
|
+
* 判据**逐字**是驱动连接初始化**回读复核过**的那份事实(`plugins/sql-driver.ts` 的 `SqlEngineFacts`),
|
|
2707
|
+
* 与 operator 面 `GET /v1/diagnostics/wiring` 的 `sqlEngine` 段同源(那一段另有一个 `version`,纯排障料,
|
|
2708
|
+
* 刻意不进本位)⇒「诊断页说悲观、能力位说乐观」结构上不可能。
|
|
2709
|
+
* 🔴 `null` = 本部署**没有 SQL 后端**(env-only worker / local 文件后端),**不是**「读不出来」。
|
|
2710
|
+
* 🔴 `txnMode: null` = 这个引擎**没有该指示面**,**不是** `"optimistic"`。
|
|
2711
|
+
* 受众是运维与部署自述:一个多副本部署不登服务器就能答出「本仓的连接跑在什么读语义上」。 */
|
|
2712
|
+
sql?: null | {
|
|
2713
|
+
engine: "tidb" | "innodb" | "pg" | (string & {});
|
|
2714
|
+
isolation: string;
|
|
2715
|
+
txnMode: "pessimistic" | null;
|
|
2716
|
+
[k: string]: unknown;
|
|
2717
|
+
};
|
|
2718
|
+
/** **远端车道可 detach**(server `routes/capabilities.ts:233` = `Boolean(deps.runStore)`)—— 零新机制,
|
|
2719
|
+
* 说的就是既有的那条腿:`POST /v1/tasks/stream` 带请求头 `x-detach-on-disconnect: true` ⇒ 客户端断连
|
|
2720
|
+
* **不杀** run,它在 server 跑完;回来按响应头 `X-Task-Id` 走 `GET /v1/runs/:id` 与 `/events`
|
|
2721
|
+
* (durable 事件日志重放 + `Last-Event-ID` 续流)拿全离开期间的帧。
|
|
2722
|
+
* 谓词 = **部署半场**,逐字就是那条腿自己的前置判据(`routes/tasks.ts` 缺 runStore ⇒ 400
|
|
2723
|
+
* `request.precondition_unmet`「detached 的结果无处可查」);**per-request 半场(调用方必须带
|
|
2724
|
+
* `sessionId`)不在本位里** —— 那是每次调用自己的事,部署级布尔对它说不了话。
|
|
2725
|
+
* 🔴 **辖域只到远端车道**:本地车道的转后台归壳自己的判据,本位不覆盖、也不许被拿去禁本地。
|
|
2726
|
+
* 🔴 **不承诺** detach 期间流内审批的存活(那条另有 {@link approvals} / {@link streamApproval} 广告;
|
|
2727
|
+
* 本位为真而它们为假的部署上 detach 照常工作,只是断连那刻挂起的审批走 core 的 fail-closed 臂)。
|
|
2728
|
+
* 今天取值与 {@link asyncRuns} 相同是**诚实记账不是冗余**:那一位问「异步 run API 在不在」,本位问
|
|
2729
|
+
* 「壳的转后台键在远端车道该不该映射成 detach」。 */
|
|
2730
|
+
sessionBackgroundable?: boolean;
|
|
2731
|
+
/** 中途翻转 verb `POST /v1/runs/:id/memory/capture-optout` 的在场位(server `routes/capabilities.ts:237`
|
|
2732
|
+
* = `Boolean(deps.runStore)`;design/383 S-8①)。谓词与 {@link sessionBackgroundable} 同源:该 verb 需要
|
|
2733
|
+
* 持久 run 账面做属主门 + 活流句柄。缺席(老 worker)⇒ 壳**不渲入口**(假 affordance 纪律)。
|
|
2734
|
+
* 🔴 位为真只保证**端点在场**,不保证这一次是 live —— 非 live ⇒ 409 指路声明形。 */
|
|
2735
|
+
runMemoryCaptureOptOut?: boolean;
|
|
2736
|
+
/** 治理携出 bundle 两口 `POST /v1/memory/{export,import}`(operator lane)的位
|
|
2737
|
+
* —— server `routes/capabilities.ts:261` = `Boolean(deps.memoryBundleExport && deps.memoryBundleImport)
|
|
2738
|
+
* && deps.config.operatorPrincipals.length > 0`(#264 v2-c)。
|
|
2739
|
+
* ⚠️ 位为真**不**保证后端真有 bundle 复合面:server 的两只 SQL 记忆孪生未实现
|
|
2740
|
+
* `exportSnapshotOf`/`importBundleCommit`,那时 core 响亮拒 `memory.export_incomplete`。 */
|
|
2741
|
+
memoryBundle?: boolean;
|
|
2742
|
+
/** 出处 / 抹除合规两口 `GET /v1/memory/entries/:entryId/provenance` · `POST /v1/memory/erase`
|
|
2743
|
+
* (operator lane)的位 —— server `routes/capabilities.ts:273` = `Boolean(deps.memoryCompliance) &&
|
|
2744
|
+
* operatorPrincipals.length > 0`(design/316 件③)。第一项在**挂载期**判后端有没有控制面归属(缺则整口不挂)。
|
|
2745
|
+
* ⚠️ 与 {@link memoryBundle} **不同源**:一个部署可以有 bundle 复合面而没有控制面归属,反之亦然。 */
|
|
2746
|
+
memoryCompliance?: boolean;
|
|
2747
|
+
/** 外源标记人面三口 `GET /v1/memory/origin/external` · `GET /v1/memory/origin/clearances` ·
|
|
2748
|
+
* `POST /v1/memory/origin/entries/:entryId/clear`(operator lane)的位 —— server
|
|
2749
|
+
* `routes/capabilities.ts:287` = `Boolean(deps.memoryOriginFace) && operatorPrincipals.length > 0`
|
|
2750
|
+
* (design/316 件②)。
|
|
2751
|
+
* ⚠️ 与 {@link memoryCompliance} **同判据不同位**:两族今天查后端的同一个面(`controlPlaneRoot`),
|
|
2752
|
+
* 但它们是**两个产品面**(合规问询/抹除 vs 外源审计/清标),一个部署可以只想开其中一族 ——
|
|
2753
|
+
* server 刻意不合并,即使今天两位恒同值。
|
|
2754
|
+
* ⚠️ 位为真**也不**保证 `GET …/external` 的答案完备:server v1 没有 scope 枚举读面,答案只覆盖调用方
|
|
2755
|
+
* 点名的那些 scope,**空答绝不读作「本店干净」**。 */
|
|
2756
|
+
memoryOrigin?: boolean;
|
|
2757
|
+
/** consolidation 阀门两口 `POST /v1/admin/memory/consolidation/run` ·
|
|
2758
|
+
* `GET /v1/admin/memory/consolidation`(operator lane)的位 —— server `routes/capabilities.ts:301`
|
|
2759
|
+
* = `Boolean(deps.memoryConsolidation) && operatorPrincipals.length > 0`(design/378 D4)。
|
|
2760
|
+
* 第一项 ⟺ `MEMORY_CONSOLIDATION_DRIVER=on` **且**座解析成功(座配不出 / 引擎没接线 / 后端无控制面
|
|
2761
|
+
* 归属 / provenance=off 四形都在**启动期**被拒,那些机器根本起不来)。
|
|
2762
|
+
* 🔴 位为假时两口是 **404**(整域不挂)**而不是 501** —— 消费端别按 501 分支(阀门未开是一句运维表态,
|
|
2763
|
+
* 不是部署能力缺失);与 {@link memoryOptOutGrant} 的 501 分家。
|
|
2764
|
+
* ⚠️ 位为真不保证这一轮跑得完:模型失败 / fuse 残留 / 被 park 都是运行期事实,落在收执的 `outcome` 上
|
|
2765
|
+
* (200 + 一个非 converged 的停因)。 */
|
|
2766
|
+
memoryConsolidationDriver?: boolean;
|
|
2767
|
+
/** memory-capture opt-out **授权表**管理四口 `/v1/admin/memory-optout[/default|/:principal]`
|
|
2768
|
+
* (operator-only)的位 —— server `routes/capabilities.ts:307` = `Boolean(deps.memoryOptOutGrant) &&
|
|
2769
|
+
* operatorPrincipals.length > 0`(design/383 S-2)。第一项 = 授权表在场(SQL 后端有;**local 车道刻意无源**
|
|
2770
|
+
* ⇒ 四口 501 `capability.memory_optout_grant_required`)。
|
|
2771
|
+
* 🔴 位为假时是 **501**(换部署形态),与 {@link memoryConsolidationDriver} 的 404(开旋钮)分家。 */
|
|
2772
|
+
memoryOptOutGrant?: boolean;
|
|
2773
|
+
/** `permissionMode: "auto"` 的**缺省态披露**(server `routes/capabilities.ts:463`;裁决在
|
|
2774
|
+
* `src/auto-mode-face.ts` 的 `judgeAutoModeArming`)。**四项刻意不合成一个布尔** —— 合成后
|
|
2775
|
+
* 「这份二进制不认识 auto」与「认识但本机没有 entitlement 源」会得到同一个 `false`,而壳对这两种要做的
|
|
2776
|
+
* 事不同(前者别给这一档;后者给,但别宣称在筛)。
|
|
2777
|
+
* · `accepted` —— 提交面按五词闭集收 `"auto"`(恒 `true`,server 写的是字面量);
|
|
2778
|
+
* · `classifierSeat` —— 分类器席位真挂上了(server 读装配面递来的 `autoModeFace.seatMounted`,
|
|
2779
|
+
* 桩 / 一次性 CLI 不挂席位时如实 `false`);
|
|
2780
|
+
* · `entitlementSource` —— **center 源在不在**,绝不冒充「你被授权了」(授权是 per-principal 的,
|
|
2781
|
+
* 部署级布尔对它说不了话);自 S-80 起它是**三态里的一格**,`false` 不再意味着 auto 不武装;
|
|
2782
|
+
* · `intentArming` —— 这对 server+core 走的是哪套极性:`true` = core #521 的**意图武装式**
|
|
2783
|
+
* (用户开 + org 拒),`false` = 旧式「org 授予」。壳据此渲「无 center 也能 auto」与否;
|
|
2784
|
+
* · `armed` —— **此刻会不会武装**(按当前运行时真值答;旧式 core 下按旧谓词答,不得假阴);
|
|
2785
|
+
* · `reason` —— **仅** `armed:false` 时在场,server 闭六词集(`AUTO_MODE_UNARMED_REASONS`)。
|
|
2786
|
+
* `local_denied` = 本机 `PERMISSIONS_DISABLE_AUTO_MODE`,`org_denied` = center deny ——
|
|
2787
|
+
* **分词就是为了让壳指不同的路**(改本机 env vs 找组织)。按开集读:server 已经从四词长到六词。
|
|
2788
|
+
* · `model` —— 分类器**配置**的模型路由(core 的 role 回落链 `classifier → summarize → default`);
|
|
2789
|
+
* 解不出时 server **不写这个键**(把 core 的拒句当数据记进日志,读面不 500)。
|
|
2790
|
+
* 🔴 查询串 `?permissionMode=<五词>` 把「本次意图」折进裁决(缺席 = 按 auto 意图答);五词闭集之外
|
|
2791
|
+
* server 回 **400 `request.field_invalid`**(读面也不静默折词)。 */
|
|
2792
|
+
permissionModeAuto?: PermissionModeAutoCapability;
|
|
2793
|
+
/** READ 容纳面的**生效档**披露位(server `routes/capabilities.ts:484` = `deps.config.readFace ?? null`;#A4)。
|
|
2794
|
+
* 值 = 本部署**显式**表态的那一档(env `READ_FACE`,或 config-center 的 `readFace.face` —— 两条腿落的是
|
|
2795
|
+
* 同一个 config 键,所以这一位对「组织下发」与「本机 env」不做区分,它说的是**最终生效值**)。
|
|
2796
|
+
* 🔴 `null` = **本部署没有钉这一档**,由引擎默认接管。server 刻意**不**把 `null` 折成 `"roots"`:
|
|
2797
|
+
* 在这条轴上从不复制上游默认 —— 把引擎默认抄进 wire 会在 core 改默认的那天变成一句谎,而消费端无从察觉。
|
|
2798
|
+
* 🔴 **最小披露**:deny 表(pattern 表 / 内建档位 / 排除行名)**不上**能力面 —— 那是策略内容。
|
|
2799
|
+
* ⚠️ 与 `TaskRequest` 无关:这条轴上**没有** per-request 接收臂(部署 env 席,负控钉在
|
|
2800
|
+
* `test/capabilities-full.test.ts` 的「A4 / [4073] readFace 定界」那组)。 */
|
|
2801
|
+
readFace?: "open" | "roots" | (string & {}) | null;
|
|
2802
|
+
/** 调用方给的 `cwd` **到底兑不兑现**的精确位(server `routes/capabilities.ts:541` =
|
|
2803
|
+
* `cwdHonored(deps.config) || deviceCwdHonored(deps.config)`)。真 ⟺ 单用户 `host` lane **或**
|
|
2804
|
+
* `device` lane(路径落在**发起者自己的**机器上,host 闸防的跨租户宿主穿越在那儿结构性不存在)。
|
|
2805
|
+
* 谓词与提交侧 `boot/resolve-spec.ts` 的写侧闸**逐字同源** —— 它漂了就是「说没有其实有」。
|
|
2806
|
+
* 消费端读法:**优先读本位**;缺席(老 worker)⇒ 按 {@link projectContext} 兜底 = 本位出现前的逐字行为。 */
|
|
2807
|
+
callerCwd?: boolean;
|
|
2808
|
+
/** A2A **client** 读面 `GET /v1/sessions/:id/a2a` 在场位(server `routes/capabilities.ts:555`,恒 `true`;
|
|
2809
|
+
* DESIGN-269 车1 件4)。与 {@link mcp} 同姿势的无条件位:没配 peer 时它回一个**诚实的空面板**,
|
|
2810
|
+
* 所以根本没有 501 路可门。
|
|
2811
|
+
* 🔴 与 {@link a2aInjection} **刻意两位不同谓词**(一位诚实不了两件事):本位答「读面在不在」。 */
|
|
2812
|
+
a2a?: boolean;
|
|
2813
|
+
/** 本部署**是否兑现**调用方送的 `body.a2aPeers`(server `routes/capabilities.ts:556` =
|
|
2814
|
+
* `a2aInjectionHonored(deps.config)`,属主 `src/task-a2a.ts`)。三条否决全归那只函数:
|
|
2815
|
+
* 单用户 ∧ `a2a` 未锁 ∧ 合规允许。
|
|
2816
|
+
* 🔴 `false` 的行为是**字段门**形:请求照样 200,字段被 **warn + 忽略**(不是 4xx)——
|
|
2817
|
+
* **例外**是配置被 lock 时,提交口 400 `config.locked_key`(那条 veto 正是让「说 yes ⟺ 路真能用」
|
|
2818
|
+
* 在这一形上仍成立的东西)。 */
|
|
2819
|
+
a2aInjection?: boolean;
|
|
2820
|
+
/** server-as-peer 半场的**旋钮实况**(server `routes/capabilities.ts:564` =
|
|
2821
|
+
* `deps.config.a2aServe !== undefined`;DESIGN-269 车2)—— 这台 worker 是否作为一个 A2A agent 对外存在。
|
|
2822
|
+
* `true` ⟺ `A2A_SERVE_ENABLED` 开 ⟺ `GET /.well-known/agent-card.json` 与 `POST /v1/a2a` 两条路由存在;
|
|
2823
|
+
* `false` ⟺ 两条都 **404**(设计稿 §3.3「卡都不发 = 对外不存在」)。缺席即关。
|
|
2824
|
+
* ⚠️ **辖域 = 路由在不在,不是「每个方法都能跑」**:`message/send` / `tasks/get` 还需要 durable run store
|
|
2825
|
+
* (缺它时两个方法回具名 JSON-RPC `-32004`,不是静默降级)。server 刻意不把 runStore 折进本位 ——
|
|
2826
|
+
* 那会造出「卡还在发、位却是 false」这种更糟的谎。 */
|
|
2827
|
+
a2aServe?: boolean;
|
|
2828
|
+
/** 后台 agent **名册读面** `GET /v1/agents/roster` 的位(server `routes/capabilities.ts:640` =
|
|
2829
|
+
* `Boolean(deps.backgroundAgentStore)`;#A1)。谓词**逐字**是那条路由的 501 门 ⇒「说 yes ⟺ 路由真能用」
|
|
2830
|
+
* 是结构性的。
|
|
2831
|
+
* ⚠️ **辖域 = 列举面**:名册回的是 content-free 投影(handle / name / agentType / status / 三个时间戳);
|
|
2832
|
+
* 要子代**产物正文**走 `/v1/runs/:id/subagents/:handle/output`(那条口有它自己的谓词 {@link subagentOutput})。 */
|
|
2833
|
+
agentRoster?: boolean;
|
|
2834
|
+
/** **托管留存**的部署事实(server `routes/capabilities.ts:654` = `retentionAdvertisement(deps.config)`;#270 车2)。
|
|
2835
|
+
* `null` = sweep lane 关着(缺省);在场 = `{mode, maxAgeDays}` —— 两格都是**部署事实不是秘密**
|
|
2836
|
+
* (策略数值本来就该告诉用户「你的数据留多久」)。`mode: "audit-only"` = 照跑照判、只记审计行、
|
|
2837
|
+
* **不调任何破坏性方法**;`"enforce"` = 真删。
|
|
2838
|
+
* 🔴 谓词只看 config 而不合取「执行器在场」是**结构性**的,不是疏漏:`intervalSec > 0` 而没有真执行器的
|
|
2839
|
+
* 那台机器**根本起不来**(`boot/retention-lane.ts` 的 `assertRetentionLaneWirable` 在 boot 期就拒了)。 */
|
|
2840
|
+
retention?: null | {
|
|
2841
|
+
mode: "audit-only" | "enforce" | (string & {});
|
|
2842
|
+
maxAgeDays: number;
|
|
2843
|
+
[k: string]: unknown;
|
|
2844
|
+
};
|
|
2845
|
+
/** 自编排(workflows)的**拒因披露**(server `routes/capabilities.ts:739`;S-81)。**两项刻意不合成一个
|
|
2846
|
+
* 布尔**(与 {@link permissionModeAuto} 同判据):
|
|
2847
|
+
* · `engineCan` —— core 的 `workflowsCapability`(硬化脚本 runner ∧ 治理基线)。`false` = 这台机器压根
|
|
2848
|
+
* 没有工作流引擎,壳别给这一格;
|
|
2849
|
+
* · `denial` —— **部署级准入**拒因闭集(今日唯一成员 `"entitlement_resolver_absent"`),`null` = 这一层
|
|
2850
|
+
* 不拒。非 `null` = 引擎在、但本部署对**任何** principal 都授不出去(半配置:阀门开着而配不出来)——
|
|
2851
|
+
* 壳该提示运维接 config-center(或关掉 `SELF_ORCHESTRATION_ENABLED`),**而不是提示用户重试**。
|
|
2852
|
+
* 🔴 `denial: null` **不**等于「你被授权了」:授权是 per-principal 的(core 逐 principal 解 `allowWorkflows`),
|
|
2853
|
+
* 部署级布尔对它说不了话 —— 与 `permissionModeAuto.entitlementSource` 同一条辖域线。
|
|
2854
|
+
* 🔴 与 {@link workflows} 的关系:那一位是 `engineCan × 准入` 的**乘积**(「说 yes ⟺ 这台机器上真跑得起来」),
|
|
2855
|
+
* 本位把两个因子拆开给壳看拒因。 */
|
|
2856
|
+
workflowsGate?: {
|
|
2857
|
+
engineCan: boolean;
|
|
2858
|
+
denial: "entitlement_resolver_absent" | (string & {}) | null;
|
|
2859
|
+
[k: string]: unknown;
|
|
2860
|
+
};
|
|
2861
|
+
/** **写保护名表**的姿态(server ≥7.63.0 / S-138;`routes/capabilities.ts` = `projectWriteProtectionCapability`)。
|
|
2862
|
+
* 引擎的**字面名表**把落在表行上的可定路径写(Write/Edit/NotebookEdit)从 `allow` 降级成 `ask`,所以壳
|
|
2863
|
+
* 可以**事先**知道这些路径会弹卡。
|
|
2864
|
+
* 🔴 **三项刻意不合成一个布尔**:合成之后「引擎缺省表在岗」与「运维换了一张自己的表」同为 true,而两者
|
|
2865
|
+
* 对运维说的是两件事。
|
|
2866
|
+
* 🔴 **最小披露**:逐行 name/kind **不在**这一位 —— 部署自定义行可能含内部路径名,列出来等于告诉想绕过的人
|
|
2867
|
+
* 「哪些名字不受保护」。行内容在 operator 面 `GET /v1/diagnostics/wiring` 的 `writeProtection.rows`。
|
|
2868
|
+
* 🔴 与 `SENSITIVE_WRITE_PATTERNS`(**模式型** write deny)是**并列机制**,两个读面分开报、绝不合成一位:
|
|
2869
|
+
* 两者的解法不同(一套改模式,一套改名表)。
|
|
2870
|
+
* `null` = 这个进程说不出来(非 composition root 装配的夹具形)。**老 worker 上整键缺席,而「没有这个键」
|
|
2871
|
+
* 不是「没有表」** —— 引擎侧座位缺席恰恰是**缺省表在岗**(按键名 grep 推断「没装」会推错,B-023 F2 真案)。 */
|
|
2872
|
+
writeProtection?: WriteProtectionCapability | null;
|
|
2873
|
+
[k: string]: unknown;
|
|
2874
|
+
}
|
|
2875
|
+
/** 写保护名表的**租户面**窄投影(`GET /v1/capabilities.writeProtection`)。**不含行内容**。 */
|
|
2876
|
+
export interface WriteProtectionCapability {
|
|
2877
|
+
/** 生效表非空 ⇒ 引擎真会对表行弹卡。 */
|
|
2878
|
+
armed: boolean;
|
|
2879
|
+
/** 生效表的**行数**(内容只上 operator 面)。 */
|
|
2880
|
+
rows: number;
|
|
2881
|
+
/** 整表替换旋钮被写 ⇒ 缺省表不再原样在岗。与 {@link armed} 刻意不合成。
|
|
2882
|
+
* ⚠️ 「整表替换成**空**表」也算 —— 报 false 会把「运维亲手关掉了表」说成「缺省表没被动过」。 */
|
|
2883
|
+
replaced: boolean;
|
|
2884
|
+
[k: string]: unknown;
|
|
2885
|
+
}
|
|
2886
|
+
/** 写保护表的**一行**(core `WriteProtectedRow`):一个**字面**名字 + 它怎么匹配。
|
|
2887
|
+
* `name` 同时是这一行的稳定身份 —— 拒绝/询问文案里引用的就是这个串。 */
|
|
2888
|
+
export interface WriteProtectedRow {
|
|
2889
|
+
name: string;
|
|
2890
|
+
/** `basename` = 目标的**最后一段**等于行名;`segment` = **任意**一段等于行名;
|
|
2891
|
+
* `segment-run` = **连续若干段**等于行名按 `/` 切出的那几段。 */
|
|
2892
|
+
kind: "basename" | "segment" | "segment-run" | (string & {});
|
|
2893
|
+
[k: string]: unknown;
|
|
2894
|
+
}
|
|
2895
|
+
/** 写保护表的 **operator 面**(`GET /v1/diagnostics/wiring` 的 `writeProtection`;server ≥7.63.0 / S-138)。
|
|
2896
|
+
* 与租户面能力位**同一份 boot 产物** ⇒ 两面不可能各说各话;本面多出来的是**行内容**。 */
|
|
2897
|
+
export interface WriteProtectionPosture {
|
|
2898
|
+
/** 生效表逐行,逐字来自引擎自己的编译产物(server 零重算)。空数组 = 显式无表。 */
|
|
2899
|
+
rows: WriteProtectedRow[];
|
|
2900
|
+
/** `default` = 两根旋钮都没写(引擎缺省表在岗;server **不复制**那张表,属主在引擎)/ `extra` = 缺省表 + 增量 /
|
|
2901
|
+
* `replace` = 整表替换 / `off` = 整表替换成空表(合法,且响亮)。 */
|
|
2902
|
+
source: "default" | "extra" | "replace" | "off" | (string & {});
|
|
2903
|
+
/** 整表替换**丢掉**的缺省行名;只在替换族在场(`extra`/`default` 结构上丢不掉行)。
|
|
2904
|
+
* 行的身份判据借**引擎自己**的折叠规则,所以大小写变体不会被误报成「你丢了一行」。 */
|
|
2905
|
+
droppedDefaultRows?: string[];
|
|
2335
2906
|
[k: string]: unknown;
|
|
2336
2907
|
}
|
|
2337
2908
|
/** One scenario's detail card (`GET /v1/capabilities/scenarios/:name` — server handler = the
|
|
@@ -3110,5 +3681,25 @@ export interface ServerWiringGates {
|
|
|
3110
3681
|
export interface WiringDiagnostics {
|
|
3111
3682
|
static: WiringManifest;
|
|
3112
3683
|
serverGates: ServerWiringGates;
|
|
3113
|
-
|
|
3684
|
+
/** **写保护名表**,带**行内容**(server ≥7.63.0 / S-138;operator 面独有 —— 租户面
|
|
3685
|
+
* `capabilities.writeProtection` 只有计数)。与那一位是**同一份 boot 产物**。
|
|
3686
|
+
* `null` = 这个进程说不出来。 */
|
|
3687
|
+
writeProtection?: WriteProtectionPosture | null;
|
|
3688
|
+
/** 记忆面姿态(server ≥7.30 / #252):backend / vector 模式 / 点亮态与 dark 成因 / embedder 身份 ——
|
|
3689
|
+
* 此前只活在启动日志里(不可查询、跨副本不可聚合)。
|
|
3690
|
+
* 🔴 **本代 SDK 尚未逐键镜像**:声明在这里是为了让严格消费端停止拒收真实的 operator 响应,按不透明读。 */
|
|
3691
|
+
memoryPosture?: Record<string, unknown> | null;
|
|
3692
|
+
/** 本部署的 SQL 引擎姿态(server ≥7.60 / S-131):引擎 / 版本 / 会话隔离级 / TiDB 事务模式,读的是驱动在
|
|
3693
|
+
* 真连接上 `SET` 完之后**回读**的值,不是 env 里写了什么。`null` = 无 SQL 后端。
|
|
3694
|
+
* 🔴 **本代 SDK 尚未逐键镜像** —— 按不透明读。 */
|
|
3695
|
+
sqlEngine?: Record<string, unknown> | null;
|
|
3696
|
+
/** 配置世代账的 operator 面(server ≥7.5x / #322):按组的 appliedVersion / deferredKeys+铸因 /
|
|
3697
|
+
* **消毒形** lastRejected(只有键名与判据文案,值从不进读面)。`/health` 那三键是同一份读数的窄投影。
|
|
3698
|
+
* 🔴 **本代 SDK 尚未逐键镜像** —— 按不透明读。 */
|
|
3699
|
+
configApply?: Record<string, unknown> | null;
|
|
3700
|
+
/** mid-turn MCP 撤销名单(server ≥7.5x / #324,design/338)。`null` = 本进程没有配置管道(说不出来)。
|
|
3701
|
+
* 🔴 **本代 SDK 尚未逐键镜像** —— 按不透明读。 */
|
|
3702
|
+
mcpRevocations?: Record<string, unknown> | null;
|
|
3703
|
+
}
|
|
3704
|
+
export {};
|
|
3114
3705
|
//# sourceMappingURL=types.d.ts.map
|