@sema-agent/sdk 23.0.3 → 24.0.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.
Files changed (57) hide show
  1. package/README.md +67 -1
  2. package/dist/device/index.d.ts +1 -1
  3. package/dist/device/index.d.ts.map +1 -1
  4. package/dist/device/index.js +2 -0
  5. package/dist/device/index.js.map +1 -1
  6. package/dist/errors.d.ts +215 -3
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/errors.js +87 -7
  9. package/dist/errors.js.map +1 -1
  10. package/dist/events.d.ts +129 -16
  11. package/dist/events.d.ts.map +1 -1
  12. package/dist/events.js +18 -0
  13. package/dist/events.js.map +1 -1
  14. package/dist/health.d.ts +4 -1
  15. package/dist/health.d.ts.map +1 -1
  16. package/dist/health.js.map +1 -1
  17. package/dist/index.d.ts +11 -3
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +9 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/registry/errors.d.ts +3 -0
  22. package/dist/registry/errors.d.ts.map +1 -1
  23. package/dist/registry/errors.js +3 -2
  24. package/dist/registry/errors.js.map +1 -1
  25. package/dist/registry/me-config.d.ts +1 -0
  26. package/dist/registry/me-config.d.ts.map +1 -1
  27. package/dist/registry/me-config.js +1 -1
  28. package/dist/registry/me-config.js.map +1 -1
  29. package/dist/registry/scope-config-feedback.d.ts +1 -0
  30. package/dist/registry/scope-config-feedback.d.ts.map +1 -1
  31. package/dist/registry/scope-config-feedback.js +1 -1
  32. package/dist/registry/scope-config-feedback.js.map +1 -1
  33. package/dist/resources/elicitations.d.ts +2 -1
  34. package/dist/resources/elicitations.d.ts.map +1 -1
  35. package/dist/resources/elicitations.js.map +1 -1
  36. package/dist/resources/questions.d.ts +2 -1
  37. package/dist/resources/questions.d.ts.map +1 -1
  38. package/dist/resources/questions.js.map +1 -1
  39. package/dist/resources/session-sync.d.ts +4 -2
  40. package/dist/resources/session-sync.d.ts.map +1 -1
  41. package/dist/resources/session-sync.js +4 -2
  42. package/dist/resources/session-sync.js.map +1 -1
  43. package/dist/resources/tool-approvals.d.ts +10 -6
  44. package/dist/resources/tool-approvals.d.ts.map +1 -1
  45. package/dist/resources/tool-approvals.js.map +1 -1
  46. package/dist/settings.d.ts +3 -0
  47. package/dist/settings.d.ts.map +1 -1
  48. package/dist/sse.d.ts +3 -0
  49. package/dist/sse.d.ts.map +1 -1
  50. package/dist/sse.js +3 -3
  51. package/dist/sse.js.map +1 -1
  52. package/dist/types.d.ts +348 -98
  53. package/dist/types.d.ts.map +1 -1
  54. package/dist/types.js +6 -2
  55. package/dist/types.js.map +1 -1
  56. package/openapi.yaml +590 -114
  57. package/package.json +2 -2
package/dist/types.d.ts CHANGED
@@ -218,6 +218,27 @@ export interface TaskStats {
218
218
  export declare const APPROVAL_REACH: readonly ["none"];
219
219
  /** {@link APPROVAL_REACH} 的成员型。 */
220
220
  export type ApprovalReach = (typeof APPROVAL_REACH)[number];
221
+ /** server ≥7.131.0(core 7.50.0 请求层附件):`TaskRequest.userAttachments[]` 的条目,**引擎的 `UserAttachment` 原样**(server 零读法,形判属主是引擎)。
222
+ * 三形:`{ path, lines? }` 读这次 run 的工作区里的文件(只在有手场景受理;无手场景整条由引擎拒 `config.user_attachment_invalid`);
223
+ * `{ name, text, startLine? }` 调用方持有的文本;`{ name, image: { data, mimeType } }` 调用方持有的图片字节(base64)。上限见
224
+ * {@link Capabilities.userAttachments}`.limits`(今天 20 条 / 渲染后 100000 字符)。 */
225
+ export type UserAttachment = {
226
+ path: string;
227
+ lines?: {
228
+ start: number;
229
+ end?: number;
230
+ };
231
+ } | {
232
+ name: string;
233
+ text: string;
234
+ startLine?: number;
235
+ } | {
236
+ name: string;
237
+ image: {
238
+ data: string;
239
+ mimeType: string;
240
+ };
241
+ };
221
242
  /** Common request body. `objective` is required; everything else is optional and server-capped where noted.
222
243
  * 🔴 `jobId` is the work-view correlation key (DIRECTION §2): set it so the workspace groups the runs of one
223
244
  * logical job into one Task — across BOTH doors.
@@ -302,13 +323,18 @@ export interface TaskRequest {
302
323
  * jobId across its sub-runs so they group into one Task. SDK auto-generates if absent. */
303
324
  jobId?: string;
304
325
  /** Business/UX system prompt the CLIENT owns (decoupling seam) — STABLE per integrator version (cacheable
305
- * prefix); put per-request context in `objective`. Server cap: >16384 chars → 400. */
326
+ * prefix); put per-request context in `objective`. Server cap: >16384 chars → 400.
327
+ * 🔴 **只给角色层(server ≥7.132.0 / core 7.52.0,行为变)**:本键(以及 {@link appendSystemPrompt} 与折进追加段的 `settings.outputStyle`)**逐字**含引擎提示里的
328
+ * 一段锁定文本(宪法 / 安全 / 运行环境等段;哪怕只是锁定文本里的一行标题如 `# Harness`)—— 即一份「已组装」的提示 ⇒ 开跑前拒 **`prompt.assembled_role_refused`**
329
+ * (同步腿 **400**,一个 token 没烧、不占幂等键;异步 / 活流腿 2xx、同码落终态;存下的续跑体带它 ⇒ 续跑同码失败)。出路:删掉抄进来的引擎段,只发角色文本 —— 引擎的段由引擎组;
330
+ * 判官只有引擎一只。≤7.131.x 这种提示被原样透传。 */
306
331
  systemPrompt?: string;
307
332
  /** Append-only system prompt rider (server ≥1.243, ≈ CC `--append-system-prompt`): a STABLE block composed
308
333
  * after the scenario base + `systemPrompt`, before the volatile tail. First-class lane for the shell's
309
334
  * product-knowledge block — `settings.outputStyle` composes AFTER it (byte-stable order), so a style block
310
335
  * and this rider coexist. Probe `capabilities.appendSystemPrompt`; on false/absent fall back to the
311
- * `settings.outputStyle` ride-along. Same cap as `systemPrompt`: >16384 chars → 400. */
336
+ * `settings.outputStyle` ride-along. Same cap as `systemPrompt`: >16384 chars → 400.
337
+ * 🔴 server ≥7.132.0:带引擎提示段原文 ⇒ 开跑前拒 `prompt.assembled_role_refused`(同 {@link systemPrompt} 那一条律;句子说的是 `the task's appendSystemPrompt …`)。 */
312
338
  appendSystemPrompt?: string;
313
339
  /** server ≥7.121.0 —— 输出风格的**每轮一句**:原样投给引擎的同名座位(`TaskSpec.outputStyle`),引擎在每个附件周期用自己的标记帧陈述
314
340
  * 「`<name>` output style is active. `<turnReminder>`」(`turnReminder` 缺席 ⇒ 引擎的缺省句),流上回声 `steering_injected` `source:"output_style"`。
@@ -401,6 +427,12 @@ export interface TaskRequest {
401
427
  } | {
402
428
  url: string;
403
429
  }>;
430
+ /** server ≥7.131.0(core 7.50.0):**请求层附件**,挂在这次提交的目标上、原样交给引擎(`TaskSpec.userAttachments`,至多 20 条),每条以引擎铸的消息紧随目标送到模型;
431
+ * 交付结局在流上 `human_input{carrier:"objective"}` 帧的 `attachments[]` 报一次(`ordinal` / `kind` / `outcome` / `label`)。**形判属主 = 引擎**:坏形 / 超 20 条 / text 带行号渲染后超
432
+ * Read 上限 / 过不了图片准入 / 无工作区的 `path` 条目 ⇒ 引擎在第一次模型调用之前拒 **400 `config.user_attachment_invalid`**(同步腿;`config.` 不是前缀族 ⇒ 带码的 `APIError`)。
433
+ * 只随目标走:送话口(`/respond`)不收(400 `request.body_shape`,键落 `unsupportedKeys`),续跑 / 投递腿的重建不带它。发之前先看 {@link Capabilities.userAttachments}:位缺席 = 老 server
434
+ * (≤7.130.x 对本键 400 `request.body_shape`),把附件拼进目标正文。 */
435
+ userAttachments?: UserAttachment[];
404
436
  /** D-1(server ≥1.289):预上传附件句柄(`client.attachments.upload()` 的 id)。提交时绑定会话并在
405
437
  * 执行环境工作目录 `attachments/` 物化;objective 尾部追加文件清单告知(内容不进 durable 流)。
406
438
  * ≤16/task;未知/他人 id → 400。⚠️ 键名 attachmentIds——`attachments` 已被系统提醒配置键占用。 */
@@ -431,7 +463,14 @@ export interface TaskRequest {
431
463
  /** §sandbox-image-select(P0.5):送**镜像 profile 意图**(≤128 chars),service 内部按 trusted
432
464
  * principal 用 `latestPublished(profile, viewer)` **fail-closed** 解析 digest + 再准入 → per-pod 起像(复用 select 同 visibility)。
433
465
  * 🔴 caller **永远只送 profile,绝不送 digest/ref**(信 caller digest = fail-OPEN,对抗审逮 4 越权);解析/准入 100% 在 service 信任边界。
434
- * v1 约束(违反 → 400):仅 k8s 后端;**不与 `verify`/`cascade` 同用**(镜像绑定按 sessionId,子运行换 session 会静默回退默认像,宁可 fail-loud)。 */
466
+ * v1 约束(违反 → 400):仅 k8s 后端;**不与 `verify`/`cascade` 同用**(镜像绑定按 sessionId,子运行换 session 会静默回退默认像,宁可 fail-loud)。
467
+ * 🔴 **server ≥7.132.0 沙箱车道的受理拒各带机读码**(一个事实一个码,一码一状态;此前无码、按状态给粗码):
468
+ * · 执行车道不是 k8s ⇒ **501 `capability.k8s_lane_required`**(新码;≤7.131.x 是无码 400,句子不变)—— 这台部署接不了每任务镜像,换部署形态;
469
+ * `capabilities.executionLane.provider !== "k8s"` 即可预判;落 `CapabilityUnavailableError`(`capability.` 前缀族);
470
+ * · k8s 车道而本部署没有镜像索引 ⇒ **501 `capability.image_index_required`**(此前 400;与 `/v1/images*` 同一事实同一码;句子说真因:需要 SQL store 后端);
471
+ * · 这次请求没有解析出会话 ⇒ 400 `request.precondition_unmet`;档案没有本主体可见的已发布镜像 / 可见的那份不具备 {@link capabilitiesNeeded} 要的能力 ⇒ 404 `not_found.image`;
472
+ * `capabilitiesNeeded` 里有不认识的能力词 ⇒ 400 `request.field_invalid`。
473
+ * 会话上 `SelectEnvironment` 选过的档案在下一个任务边界生效时同判。续跑腿上这几类照例折成 409 `resume_blocked_by_policy`,`blockedBy` 即上面的码。按码分支,别锚句子。 */
435
474
  sandboxImageProfile?: string;
436
475
  /** 约束选中像须具备的 bool 能力(`browser`/`db`/`nestedBuild`);**单独给(无 `sandboxImageProfile`)→ 400**。 */
437
476
  capabilitiesNeeded?: string[];
@@ -791,16 +830,18 @@ export interface TaskRequest {
791
830
  * Malformed (non-array / empty-string items) → 400 fail-loud at submit.
792
831
  * 🔴 **server ≥7.126.0(core 7.49.0 #1623;契约 G.9e)—— 与 {@link allowTools} 读同一文法**:条目 = wire 名或别名、`Tool(content)`(整只工具)、`mcp__srv` / `mcp__srv__*` / 工具段通配;
793
832
  * 名单里有一个这一 run **没有任何工具答应**的名字:**server 7.126.0–7.128.x** 引擎开跑前拒 `config.tool_face_control`(同步腿 400,一个 token 没烧;流式 / 后台腿是 `failed` 终局带同码);
794
- * 🔴 **server ≥7.129.0 照跑**(行为变化,零型变):条目原样保留(现在什么都不拒,之后挂上同名工具即生效),运维行 `runner_config_advisory` 每条告知一次并带该写的拼法 ——
795
- * 按名读:`excludeTools:["bash"]` 拒不了 `Bash`。`config.tool_face_control` 只剩任何工具名都不可能有的拼法。
833
+ * **server ≥7.129.0 照跑**:条目原样保留(现在什么都不拒,之后挂上同名工具即生效),运维行 `runner_config_advisory` 每条告知一次并带该写的拼法。`config.tool_face_control` 只剩任何工具名都不可能有的拼法。
834
+ * 🔴 **server ≥7.131.0 写错的名字受理口前置拒**:大小写孪生(`BASH`)、退役拼法(`bash` · `Task`)、文法读不出的拼法与 `*`(放行方向的静默:以为禁了、其实没禁)⇒ 400 `config.tool_face_control`,句子点名现名。
796
835
  * `"*"` 在这张名单上也被拒(此前它是一只叫 `*` 的工具;「卸全部」的拼法仍只有 {@link excludeAllTools})。deny 赢:可用工具 = 这一 run 挂的一切 ∩ {@link allowTools} − 本名单。 */
797
836
  excludeTools?: string[];
798
837
  /** server ≥7.126.0(core 7.49.0 #1623;契约 G.9e):这一 run 的**可用性选择器**,原样进引擎的 `TaskSpec.allowTools` —— server 零读法:不算补集、不过滤条目、`[]` 不折成缺席、不与 `settings.permissions.allow`
799
838
  * (allow 层,免问)混词。可用工具 = 这一 run 挂的一切(调用方工具、手、引擎自己的工具、MCP / A2A、场景与腿工具)∩ 本名单 − {@link excludeTools}(deny 赢),由引擎在开跑前一次算出。
800
839
  * 🔴 **读法**:`["*"]` = 本层不设名单(缺席同义);`[]` = 什么都不给;条目 = wire 名或别名、`Tool(content)`(整只工具)、`mcp__srv` / `mcp__srv__*` / 工具段通配(`mcp__*` 在这张名单上被拒)。
801
840
  * 腿的协议工具(委派子代的 `ReportBlocked` 等)不需要点名。子代定义的 {@link TaskAgentDefinition.allowTools} / `denyTools` 与本键是**同一只选择器**(三来源同判)。
802
- * 🔴 **没人答应的名字**:**server 7.126.0–7.128.x** 名单里有一个没有任何工具答应的名字 ⇒ `config.tool_face_control`(同步腿 **400**,一个 token 没烧;流式 / 后台腿是 `failed` 终局带同码;子代那一路的同类拒是终局码 `config.agent.unknown_tool`,不是 HTTP 码);
803
- * **server ≥7.129.0 照跑**:条目原样保留(今天什么都不准,之后挂上同名工具即生效),运维行 `runner_config_advisory` 每条告知一次并带该写的拼法(按名读:`allowTools:["bash"]` 准不了 `Bash`)。两码只剩任何工具名都不可能有的拼法。
841
+ * 🔴 **没人答应的名字**:**server 7.126.0–7.128.x** 名单里有一个没有任何工具答应的名字 ⇒ `config.tool_face_control`(同步腿 **400**,一个 token 没烧;流式 / 后台腿是 `failed` 终局带同码);
842
+ * **server ≥7.129.0 照跑**:条目原样保留(今天什么都不准,之后挂上同名工具即生效),运维行 `runner_config_advisory` 每条告知一次并带该写的拼法。
843
+ * 🔴 **server ≥7.132.0(引擎 7.52.0)写错的名字开跑前拒**:近似名与**有后继的退役名**(`Task` ⇒ `Agent`、`bash` ⇒ `Bash`)⇒ 根 `allowTools` 答 **400 `config.tool_face_control`**、子代 `allowTools` 答
844
+ * **400 `config.agent.unknown_tool`**(同步腿;子代那一形此前是 200 + failed;异步 / 活流腿 2xx、同码落终态),句子点名该条与现名。内容形与没有后继的退役名(`MultiEdit`)照跑。
804
845
  * 坏形(非字符串数组)⇒ 400 `request.field_invalid`,与 `excludeTools` / `deferTools` 同一只门。引擎不认该座(装着的引擎 < 7.49.0)⇒ 响亮拒 400 `request.field_invalid` 点名 `allowTools`(不静默丢:丢一只收窄键就是放宽)。
805
846
  * 🔴 **探测靠键闭集,没有能力位**:≤7.125.x 对它答 `400 request.body_shape` 并在 `unknownKeys` 里列名。⚠️ 辖域:A2A 入站面(`message/send`)不承载本键。 */
806
847
  allowTools?: string[];
@@ -971,9 +1012,16 @@ export interface TaskAgentDefinition {
971
1012
  whenToUseLean?: string;
972
1013
  /** Allowlist of tool names the agent may use. Omit ⇒ inherit all tools.
973
1014
  * server ≥7.126.0(core 7.49.0 #1623):名字归引擎一只判 —— 与根 run 的 {@link TaskRequest.allowTools} / {@link TaskRequest.excludeTools} 是同一只选择器(开跑前,三来源同判);
974
- * 没有任何工具答应的名字:server 7.126.0–7.128.x ⇒ 整 run 拒终局码 `config.agent.unknown_tool`(不是 HTTP 码;server 受理口只判形与条数);**server ≥7.129.0 照跑**(条目原样保留,运维行 `runner_config_advisory` 告知一次,`denyTools:["bash"]` 拒不了 `Bash`)。 */
1015
+ * 没有任何工具答应的名字:server 7.126.0–7.128.x ⇒ 整 run 拒终局码 `config.agent.unknown_tool`(那一代不是 HTTP 码;server 受理口只判形与条数);**server ≥7.129.0 照跑**(条目原样保留,运维行 `runner_config_advisory` 告知一次)。
1016
+ * 🔴 **写错的名字(server ≥7.131.0 / 7.132.0)**:本清单里的**近似名**(`BASH`)受理口前置拒(7.131.0);**有后继的退役名**(`Task` ⇒ `Agent`、`bash` ⇒ `Bash`)与文法不可能的拼法
1017
+ * 7.132.0 起由引擎开跑前拒 —— 码都是 **`config.agent.unknown_tool`**,同步腿 **400**(7.132.0 起;此前引擎那一形答 HTTP 200 + `failed` 终局体),一个 token 没烧、不占幂等键;
1018
+ * 异步 / 活流腿 HTTP 2xx、同码落在终态 run 行。句子点名子代、条目与现名(原因词在句子里,机读位 `terminal.detail.detail.reason` 不再上 wire)。只在整次提交零 turn 零 token 时答 400
1019
+ * (verify / cascade 前一轮已跑 ⇒ 仍 200 + failed)。内容形(`Agent(Explore)`)与没有后继的退役名(`MultiEdit`)照受理、交引擎通告;真未知名照跑、告运维。 */
975
1020
  allowTools?: string[];
976
- /** Denylist of tool names (subtractive; applied after `allowTools`). 同上:server ≥7.126.0 起读同一只选择器(`Tool(content)` ⇒ 整只工具;`denyTools:["Monitor"]` ⇒ 子代没有 `Monitor`)。 */
1021
+ /** Denylist of tool names (subtractive; applied after `allowTools`). 同上:server ≥7.126.0 起读同一只选择器(`Tool(content)` ⇒ 整只工具;`denyTools:["Monitor"]` ⇒ 子代没有 `Monitor`)。
1022
+ * 🔴 **server ≥7.131.0 引擎读成空的条目受理口前置拒**(限制侧读成空 = 放行,以为禁了的工具照用):近似名(`BASH`)、退役名(`bash` · `Task`)、任何工具名都不可能有的拼法、`*` ⇒
1023
+ * **400 `config.agent.unknown_tool`**(同步 / 流式 / 后台三条腿都是提交时 400),`error` = `agents[<i>].denyTools entry "<条目>" reads as nothing (<原因词>): <怎么写> — …`;清单超 1000 条 ⇒
1024
+ * `request.field_invalid`(撞帽机读位见 {@link import("./errors.js").RequestFieldRefusalExtra})。续跑重放存量体带这类条目 ⇒ 认领之前 409 `resume_blocked_by_policy`(`blockedBy: "config.agent.unknown_tool"`)。 */
977
1025
  denyTools?: string[];
978
1026
  /** Skills preloaded into the agent: `{ name, description, content }` (+ optional allowedTools / disallowedTools / files).
979
1027
  * server ≥7.116.0:子代技能受理两只清单(`allowedTools` / `disallowedTools`,读法见 {@link SkillSpec.allowedTools};≤7.115.x 是未知键整条拒)。
@@ -1557,13 +1605,16 @@ export interface ModelCompat {
1557
1605
  * `keyless` 哪儿都没凭据的本地无鉴权网关);
1558
1606
  * · 🔴 **23.0.0 BREAKING(server ≥7.129.0 / 引擎 7.51.0)**:`ok:unpinned`(部署凭据、部署没声明根 ⇒ 配对不可验证)**退役、零别名** —— 没声明根的部署上,
1559
1607
  * 部署凭据现在由引擎判 `broken:credential_mismatch`。server ≤7.128.x 仍会发 `ok:unpinned`:它落在下面的开集尾,**按通用「配对未验证」渲,别当成好**;
1560
- * · `broken:*` 两词 = 真请求会被引擎拒(标红,给这只模型配 per-model 凭据或挪到部署根上);
1608
+ * · `broken:*` 四词 = 真请求会被引擎拒(标红):`credential_mismatch` / `credential_missing`(给这只模型配 per-model 凭据或挪到部署根上);
1609
+ * **server ≥7.132.0 / 引擎 7.52.0 +两词** —— `credential_origin_mismatch`(这只模型自己的凭据绑在它第一次发往的主机上,这一行现在指向另一台主机:给新主机配一份凭据,
1610
+ * 或把它指回原主机;同一条拒在流上是 `engine_notice` `route.credential_origin_mismatch`)· `credential_answer_conflict`(per-model 凭据钩子的答复把同一把钥匙交了两遍 ——
1611
+ * `apiKey` 与该车道自己写钥匙的那个头同时在场:只答其一);
1561
1612
  * · `unknown` = 判不了。**不要**渲成「好」或「坏」,渲「未知」。
1562
1613
  * 🔴 **真开集**(`(string & {})` 逃生口不是装饰):core 把 `verdict.posture` 直接内插进 `ok:${…}`,
1563
1614
  * server 的铸点与 core 的那只函数**全路径没有一处运行期成员判定** —— 一只自带 `adjudicateRoute` 的 brain
1564
1615
  * 供什么词就上什么词。开/闭按**产方是否真判成员**定(8.4.0 拆假开集的同一条判据),所以这里给字面量
1565
- * 补全但**不执法**:switch 认上面六词,再留一条 default 臂当「未知」。 */
1566
- export type RoutePairingStatus = "ok:per-model" | "ok:paired" | "ok:keyless" | "broken:credential_mismatch" | "broken:credential_missing" | "unknown" | (string & {});
1616
+ * 补全但**不执法**:switch 认上面八词(core `RoutePairingStatus` 今天的全集),再留一条 default 臂当「未知」。 */
1617
+ export type RoutePairingStatus = "ok:per-model" | "ok:paired" | "ok:keyless" | "broken:credential_mismatch" | "broken:credential_missing" | "broken:credential_origin_mismatch" | "broken:credential_answer_conflict" | "unknown" | (string & {});
1567
1618
  /** `GET /v1/models` 的非密钥模型目录条目(core 1.116 `@model` mention 线;service src/http/routes/capabilities.ts)。
1568
1619
  * `name` = `@handle`(用户在正文打 `@<name>` per-task 选它)。🔴 **只名/能力,无 baseUrl/apiKey/headers**(service 已剥)。 */
1569
1620
  export interface ModelInfo {
@@ -2594,32 +2645,55 @@ export interface CheckpointGate {
2594
2645
  toolName?: string;
2595
2646
  [k: string]: unknown;
2596
2647
  }
2597
- /** The prompt-assembly manifest (server ≥1.219 — core `prompt.assembled` trace contract verbatim,
2598
- * service budget.ts `promptManifestRecordOf` 实拆): constitution ownership + per-section digests +
2599
- * the tool contract summary. Carries ONLY ids/digests/counts — NEVER prompt bodies (privacy boundary);
2600
- * hashes are process-salted (NOT comparable across worker restarts — UI must not diff them cross-process).
2601
- * v1 face = constitution/blocks/totalChars; `sections`/`tools` are the v2 additive face (absent on a
2602
- * v1-only engine). ⚠️ One task can carry MULTIPLE manifests: a cascade/verify run re-prepares under one
2603
- * taskId and every rung's manifest is persisted in emission order (server runs.ts flushPromptManifest). */
2648
+ /**
2649
+ * **提示清单 v3**(server ≥7.132.0 = 引擎 7.52.0 清单 v3;**BREAKING**)—— 这条腿的提示**是哪一份**(`identity` + 它的选择器值 `selectors`)、由哪些块与段组成、
2650
+ * 每一段的文本从哪里来(`chain`,被取代的 overlay 另在 `superseded`)。只有 id / 尺寸 / 摘要,**没有提示正文**(隐私边界)。每次 prepare 一行(cascade / verify 在同一
2651
+ * taskId 下重新 prepare,逐行按序)。三个出口同一行、原样:账本回放 `GET /v1/runs/:id/events` 的 `prompt_assembled`、`GET /v1/tasks/:id/turns` 的 `prompt-assembled` 块、
2652
+ * trace SSE 的 `prompt-assembled` 帧。成员 = 引擎帧(`prompt.assembled`)减信封(`kind` / `version` / `taskId` / `ts`)与 `snapshot` / `lowering`(server `promptManifestRecordOf`)。
2653
+ *
2654
+ * 🔴 **读法**(server 契约 §G.10 逐句):**每个成员都可能缺席** —— 可选成员缺席 = 「没有」,不折成空值;在场却读不出的成员 server 不上行(`identity` / `selectors` 整句、
2655
+ * 段 / 块 / `superseded` / 工具一行一判),所以「v3 行上缺 `identity`」= 引擎交出的身份读不出(已丢弃并计数),**不是**旧行。空列表是一句陈述(`tools: []` = 零工具)。
2656
+ * 词(档名、激活方式、来源类、渲染器 id、host 的 role / form)**按开集读**,server 原样过境(词表属主 = 引擎)。
2657
+ * 🔴 **这条腿运行的是哪一份提示只有一种读法:`identity`**(`identity.artifact` = 身份摘要;`identity.layers.binding` 自 7.132.0 起恒有场景名的摘要)。
2658
+ * 🔴 **BREAKING(server 7.132.0,零别名)**:v2 的顶层 `constitution` 删(宪法档锁定、只由引擎组;逐字含锁定段的提示在开跑前被拒 `prompt.assembled_role_refused`);
2659
+ * `sections[]` 去 `slot` / `carrier` / `cadence` / `cacheClass`、`hash` → `contentHash`(`sha256:` 未加盐 = 已发布文本 / `salted:` = 带本任务或本 run 自己的输入),
2660
+ * 加 `band`(恒在)/ `variant?` / `renderer?` / `locale` / `chain`;顶层加 `identity` / `selectors` / `superseded?`。运维指标 `prompt_constitution_total` 退役无替代。
2661
+ * ⚠️ **旧行**:7.131.x 及更早写下的账本行保留 v2 形,server 不回读、不改写 —— 一条升级前停驻、升级后续跑的 run,账本里两形并存。判别只有一只、属主是 server:
2662
+ * **带 `constitution` 的是旧行**(旧行恒带它,v3 行永不带),型见 {@link PromptManifestRetiredRow};三个出口的型 = {@link PromptManifestRow}。
2663
+ * ⚠️ 块的 `hash` 是**进程加盐**的短摘要(跨 worker 重启不可比,UI 别跨进程 diff)。
2664
+ */
2604
2665
  export interface PromptManifest {
2605
- /** Who owned the constitution layer: "core" is the steady state; anything else is worth eyes. */
2606
- constitution: "core" | "replaced" | "provider-assembled" | "legacy" | (string & {});
2607
- blocks: Array<{
2666
+ /** 这条腿的提示身份(core `PromptManifestIdentity`):`artifact` = 身份摘要(四个输入层的唯一摘要),`layers` = 它的输入层(只有 `center` 被钉、续跑按摘要还原),
2667
+ * `epoch` / `activatedBy` = 点名它的那条会话 epoch 记录(计数与成因,见 {@link PromptEpochDescriptor})。整句读不出 ⇒ 缺席。 */
2668
+ identity?: PromptManifestIdentity;
2669
+ /** 这条腿的选择器值(core `PromptManifestSelectors`)—— `identity.layers.binding` 的明文形:`binding?` = 场景名(server ≥7.132.0 恒由 `TaskSpec.promptBinding` 写入)、
2670
+ * `traits`、`host { role, form }`(引擎词:role `general` / `code` / `coordinator` / `cowork`,form `standard` / `minimal`;开集读)、`facts`(名 → 布尔)。整句读不出 ⇒ 缺席。 */
2671
+ selectors?: {
2672
+ binding?: string;
2673
+ traits: string[];
2674
+ host: {
2675
+ role: string;
2676
+ form: string;
2677
+ };
2678
+ facts: Record<string, boolean>;
2679
+ };
2680
+ /** 有序块:稳定 id(`role.base` / `harness.context` / `memory.safety` / `env.context` / `memory.tail` …)、字符数、进程加盐的短摘要。读不出的块逐个丢。 */
2681
+ blocks?: Array<{
2608
2682
  id: string;
2609
2683
  chars: number;
2610
2684
  hash: string;
2611
- [k: string]: unknown;
2612
2685
  }>;
2613
- sections?: Array<{
2686
+ /** 渲染出来的段,一段一行(读不出的段逐个丢),形见 {@link PromptManifestSection}。 */
2687
+ sections?: PromptManifestSection[];
2688
+ /** 这次组合**取代**了的 overlay(同一目标上后来的胜了,或它这一 run 什么都没改):`supersededBy` = 胜者 overlay 的 id,或字面 `(absent this run)`。缺席 = 没有被取代的。 */
2689
+ superseded?: Array<{
2614
2690
  id: string;
2615
- slot: string;
2616
- carrier: string;
2617
- cadence: string;
2618
- cacheClass: string;
2619
- chars: number;
2620
- hash: string;
2621
- [k: string]: unknown;
2691
+ source: string;
2692
+ by: string;
2693
+ target: string;
2694
+ supersededBy: string;
2622
2695
  }>;
2696
+ /** 挂载的工具面(初始挂载;延迟激活经 `tools_delta` 宣告):每只工具的契约身份、重放别名、形状摘要与整份 wire schema 摘要(内容寻址)。 */
2623
2697
  tools?: Array<{
2624
2698
  wireName: string;
2625
2699
  aliases: string[];
@@ -2628,24 +2702,105 @@ export interface PromptManifest {
2628
2702
  cardId: string;
2629
2703
  shapeDigest: string;
2630
2704
  wireSchemaDigest: string;
2631
- [k: string]: unknown;
2632
2705
  }>;
2633
- totalChars: number;
2634
- [k: string]: unknown;
2706
+ /** 延迟工具的披露策略(core `ToolDisclosureManifest`):`deferredTools` 条数、生效的 `strategy`(`swap` / `static`)与选它的那一席 `source`(`spec` / `env` / `default` /
2707
+ * `degraded_no_direct_lane`);这条腿什么都没延迟 ⇒ 缺席。 */
2708
+ toolDisclosure?: {
2709
+ deferredTools: number;
2710
+ strategy: string;
2711
+ source: string;
2712
+ };
2713
+ /** 提示总字符数。 */
2714
+ totalChars?: number;
2635
2715
  }
2636
- /** A session's prompt-epoch pin (server ≥1.220 `GET /v1/sessions/:id` additive `promptEpoch`; core
2637
- * `session.getPromptEpoch()` contract verbatim, service audit.ts 实拆). Absent key = a pre-epoch
2638
- * session (never null). `activatedBy: "legacy_migration"` = the one-time re-pin after an engine
2639
- * upgrade (normal, not an anomaly). */
2640
- export interface PromptEpoch {
2716
+ /** {@link PromptManifest.identity} 的形(core `PromptManifestIdentity`)。 */
2717
+ export interface PromptManifestIdentity {
2718
+ artifact: string;
2719
+ /** 身份的输入层(core `PromptIdentityLayers`;会话 epoch 记录 {@link PromptEpochDescriptor.layers} 是同一个形)。 */
2720
+ layers: PromptIdentityLayers;
2641
2721
  epoch: number;
2642
- /** `sha256:<64 hex>` — core's normalize gate rejects anything else (a bad pin reads as absent). */
2643
- artifactDigest: string;
2644
- packId: string;
2645
- assemblyApi: number;
2646
- activatedBy: "session_start" | "compaction" | "legacy_migration" | (string & {});
2647
- [k: string]: unknown;
2722
+ /** 点名它的 epoch 记录是怎么来的(core `PROMPT_EPOCH_ACTIVATIONS`:`session_start` / `compaction` / `code_change` / `selection_change`;开集读)。 */
2723
+ activatedBy: string;
2724
+ }
2725
+ /** 一段渲染出来的提示段(core `PromptManifestSection`):在哪(`band` 档 / `rank`)、哪个变体与渲染器做的、谁的文本(`locale`:`canonical` 目录原文 / `overlay` overlay 作者写的)、
2726
+ * 内容摘要(`contentHash`:`sha256:` 未加盐 = 已发布文本,`salted:` = 带本任务或本 run 自己的输入的文本)与它的历史 `chain`(`source` = `bundled` 或 overlay 来源类,
2727
+ * `overlay` / `op` = 改它的那只 overlay 与操作,`superseded: true` = 这一环被后来的取代)。`band` 恒在;`variant` / `renderer` 只在有时在场。 */
2728
+ export interface PromptManifestSection {
2729
+ id: string;
2730
+ band: string;
2731
+ rank: number;
2732
+ variant?: string;
2733
+ /** 渲染器(core `RENDERER_IDS`:`role-base` / `model-guidance` / `mcp-instructions` / `reminder-mark` / `environment` / `memory`;开集读)与它的版本。 */
2734
+ renderer?: {
2735
+ id: string;
2736
+ version: number;
2737
+ };
2738
+ chars: number;
2739
+ locale: string;
2740
+ contentHash: string;
2741
+ chain: Array<{
2742
+ source: string;
2743
+ overlay?: string;
2744
+ op?: string;
2745
+ superseded?: true;
2746
+ }>;
2648
2747
  }
2748
+ /**
2749
+ * **旧行**:7.131.x 及更早写下的 `prompt_assembled` 账本行(v2 形:顶层 `constitution` + 槽键段)。server 不回读、不改写,原样交出 ⇒ 一条升级前停驻、升级后续跑的
2750
+ * run 的账本里它与 v3 行并存。判别只有一只、属主是 server 契约:**`constitution` 在场 ⇔ 旧行**。本包**不再为旧形的成员具型**(v2 读法已退役):`"constitution" in row`
2751
+ * 收窄到本型后只剩不透明的成员,要么跳过、要么只读 `totalChars` 一类与 v3 同名同义的数。
2752
+ */
2753
+ export type PromptManifestRetiredRow = {
2754
+ constitution: string;
2755
+ readonly [member: string]: unknown;
2756
+ };
2757
+ /** 三个出口(账本 `prompt_assembled`、turns `prompt-assembled` 块、trace `prompt-assembled` 帧)上一行的型:v3 行或旧行,按 `"constitution" in row` 判。 */
2758
+ export type PromptManifestRow = PromptManifest | PromptManifestRetiredRow;
2759
+ /** 会话提示 epoch 记录的输入层(core `PromptIdentityLayers`;清单 {@link PromptManifestIdentity.layers} 同形)。只有 `center` 被钉(续跑按摘要还原),其余是那一跑算出来的、
2760
+ * 留着让后来的跑说清改了什么。`center` / `deploy` / `task` 缺席 = 那一层什么都没贡献;`binding` = 选择器值的摘要;`renderers` = 渲染器 id → 版本。 */
2761
+ export interface PromptIdentityLayers {
2762
+ catalog: string;
2763
+ renderers: Record<string, number>;
2764
+ /** 采纳的中心 artifact 的摘要。 */
2765
+ center?: string;
2766
+ deploy?: string;
2767
+ task?: string;
2768
+ binding: string;
2769
+ }
2770
+ /** 一条 v3 epoch 记录(core `PromptEpochDescriptor`)。 */
2771
+ export interface PromptEpochDescriptor {
2772
+ /** 每会话单调的记录计数。 */
2773
+ epoch: number;
2774
+ /** 这一跑的提示身份(= 清单的 `identity.artifact`)。 */
2775
+ identity: string;
2776
+ layers: PromptIdentityLayers;
2777
+ /** 记录怎么来的(core `PROMPT_EPOCH_ACTIVATIONS`:`session_start` / `compaction` 是合法边界;`code_change` = 代码或输入层动了;`selection_change` = 只有选择器值动了)。
2778
+ * 🔴 **闭集**:引擎的判官 `normalizePromptEpoch` 按这张表判成员,集外词的记录读不成 `pin` ⇒ 到不了 wire(产方真判成员 ⇒ 型闭,带编译期穷尽性)。 */
2779
+ activatedBy: PromptEpochActivation;
2780
+ /** 只在 `code_change` 且改了哪几层已知时在场(见 {@link PromptEpochChange};同样闭集)。 */
2781
+ changed?: PromptEpochChange[];
2782
+ /** 钉住的中心层的发布出处(不透明;只与 `layers.center` 同在,不进摘要)。 */
2783
+ sourceRevision?: string;
2784
+ }
2785
+ /** {@link PromptEpochDescriptor.activatedBy} 的闭集 = 引擎 `PROMPT_EPOCH_ACTIVATIONS`(逐词,钉在 `server-7132-wire` E1)。 */
2786
+ export type PromptEpochActivation = "session_start" | "compaction" | "code_change" | "selection_change";
2787
+ /** {@link PromptEpochDescriptor.changed} 的闭集 = 引擎 `PROMPT_EPOCH_CHANGES`:`catalog` / `renderers` / `deploy` / `task` / `published_schema`(退役形的中心钉被当前中心层替换的那一次)。 */
2788
+ export type PromptEpochChange = "catalog" | "renderers" | "deploy" | "task" | "published_schema";
2789
+ /**
2790
+ * 会话的提示 epoch(`GET /v1/sessions/:id` 的 `promptEpoch`;server ≥7.132.0 = 引擎 `StoredPromptEpoch` **读数原样**,server 不读不投、逐字附上;**BREAKING**)。
2791
+ * · `{ kind: "pin", descriptor }` —— 一条 v3 记录({@link PromptEpochDescriptor});
2792
+ * · `{ kind: "legacy", centerPinned }` —— 一条已退役形的记录(按字段名认出;引擎只读它钉没钉中心 artifact):下一跑会把它换成 v3 记录(`code_change`)。
2793
+ * 键缺席 = 没有 epoch 的会话(从不是 `null`)。
2794
+ * 🔴 **BREAKING(server 7.132.0,零别名)**:≤7.131.x 的形 `{ epoch, artifactDigest, packId, assemblyApi, activatedBy }` 退役 —— 引擎 7.52.0 起只交上面两臂。
2795
+ * 旧形的 `epoch` / `activatedBy` 在 `descriptor` 里,`artifactDigest` 由 `descriptor.identity` 承担(身份摘要的输入不同,两者不可比),`packId` / `assemblyApi` 无继任。
2796
+ */
2797
+ export type PromptEpoch = {
2798
+ kind: "pin";
2799
+ descriptor: PromptEpochDescriptor;
2800
+ } | {
2801
+ kind: "legacy";
2802
+ centerPinned: boolean;
2803
+ };
2649
2804
  /** A trace turn (GET /v1/tasks/:id/turns items — true shape). role currently only
2650
2805
  * "assistant" (user/system/tool reserved). */
2651
2806
  export interface TraceTurn {
@@ -3178,33 +3333,53 @@ export interface McpServerLiveness {
3178
3333
  */
3179
3334
  export type McpLivenessState = "reachable" | "unreachable" | "unknown";
3180
3335
  /**
3181
- * 一条腿的**钩子席位名册**里的**一行**(core 7.18.0 #789,server ≥7.78.0;**租户可见**):这条腿真接了
3182
- * 哪一族钩子、席位来自哪一层、以及 `preToolUse` 那一行是不是被声明成了只观察。
3183
- *
3184
- * 🔴 **在场 iff 至少一席接了**:core **从不发空数组**,所以「键在场」⇒ 非空。
3185
- * 🔴 **整键缺席的读法是「本条腿没有自己的钩子记录」,不是「没有钩子会跑」** —— 一只没有本地记录的
3186
- * 子代仍可能被**祖先**的 `preToolUse` 经约束折叠筛掉(甚至拒掉),core 这一面刻意不把那称作**本腿**的
3187
- * 钩子。把缺席读成「这条腿不过钩子」会得出相反的结论。
3188
- * 🔴 **坏行的处置**:缺 `family`/`owner` 的行由 server **逐条**丢弃(与 {@link WiringManifestMcpEntry}
3189
- * 同规),整段非数组 ⇒ 整键缺席。所以读到的每一行都保证有这两键。
3190
- * 🔴 本段**不进** {@link WiringManifest.configFingerprint}(core:钩子记录是 per-task 座)⇒ 两条腿指纹
3191
- * 相同而 `hooks[]` 不同**不是**矛盾。
3192
- *
3193
- * ⚠️ 与 {@link WiringManifestMcpEntry} 同一条裁定:**必须是 `type` 而不是 `interface`**(隐式索引签名,
3194
- * 理由与回归钉见那一型的顶注)。
3336
+ * 一条腿的 **mods 准入记录**里的**一行**(core 7.52.0 `ModAdmissionRecord`,server ≥7.132.0;**租户可见**)—— 两种注册席(`deployment` / `task`)上的每一张注册一行,
3337
+ * 按引擎的跑序(档 → 部署先于任务 → 座内顺序):**挂上的**({@link WiringManifestModMounted})或**被拒的**({@link WiringManifestModRefused})。
3338
+ * 判别读在场:挂上的行带 `events`,被拒的行带 `refusedBy` + `reason`(二者恒不同在)—— `"refusedBy" in row`。
3339
+ *
3340
+ * 🔴 **BREAKING(server 7.132.0)**:取代钩子席位名册 `hooks[]`(`{ family, owner, observational? }`;引擎 7.52.0 退役、零别名)。旧键与旧行形在本包整删:
3341
+ * 读 `manifest.hooks` 的消费端改读 `manifest.mods`;一只 `settings.hooks` 请求钩子在新形里是任务座注册 `settings.hooks`(一行)。
3342
+ * 🔴 **在场 iff 这条腿有注册**:本服务每条腿恒挂拒绝计量注册(`server.permission-denied-meter`;`TOOL_TRACE=true` 另有 `server.tool-trace`,品牌部署另有 `server.brand-identity`)
3343
+ * ⇒ 本服务的腿上这一段恒在场且至少一行。**缺席 ≠「没有扩展判这条腿的调用」**(core 逐字):委派子代仍可能经祖先链的约束被判。
3344
+ * 🔴 **串的出口纪律只有一种**:注册名与判官写的话(`name` / `refusedBy` / `reason` / `skipped[]` 三键)是注册方定的串,过 server 唯一的 wire 文本出口(凭据形换记号 + 截长),
3345
+ * 与通告 `mods.registration_refused` 的 `detail` 同一只 ⇒ 同一件事在两个出口逐字节相等;`seat` / `tier` / `events` / `observe` 是引擎词,逐字透传(词表属主 core,按开集读)。
3346
+ * 🔴 两形都读不成的行由 server **逐条**丢弃(全丢光 ⇒ 整键缺席);本段**不进** {@link WiringManifest.configFingerprint}(任务座是 per-task 座)。
3195
3347
  */
3196
- export type WiringManifestHookEntry = {
3197
- /** 钩子族。core 的闭集词(`preToolUse` / `postToolUse` / `userPromptSubmit` / `stop` /
3198
- * `postToolUseFailure` / `postToolBatch` / `preCompact` / `postCompact` / `stopFailure` /
3199
- * `permissionDenied`),但**按开集读** —— server 逐字透传不枚举,core 加一族要能穿过你的 default 臂。 */
3200
- family: string;
3201
- /** 这一席来自 spec 还是 deps(core `SeamProvenance`)。同样**闭集声明、开集读**。 */
3202
- owner: "spec" | "deps" | (string & {});
3203
- /** 只在 `preToolUse` 行、且部署**显式声明**过 `preToolUseObservational` 时在场:它仍在每次调用上跑,
3204
- * 只是不折进被委派子代的继承约束里。
3205
- * 🔴 **never-false**:core 逐字「Absence means "not declared", never "declared false"」⇒ 缺席**禁**读成
3206
- * `false`(那是「声明了不观察」,是另一件事)。 */
3207
- observational?: true;
3348
+ export type WiringManifestModEntry = WiringManifestModMounted | WiringManifestModRefused;
3349
+ /** 注册来自哪一席:core `MOD_SEATS`(`deployment` / `task`)。引擎词,server 逐字透传(echo-only);闭集声明、开集读。mods 行与通告 detail 共用这**一处**。 */
3350
+ export type ModSeat = "deployment" | "task" | (string & {});
3351
+ /** 注册的档:core `MOD_TIERS`(`prepend` / `user` / `append` / `builtin` / `core`)。引擎词,server 逐字透传;闭集声明、开集读。mods 行与通告 detail 共用这**一处**。 */
3352
+ export type ModTier = "prepend" | "user" | "append" | "builtin" | "core" | (string & {});
3353
+ /** {@link WiringManifestModEntry} 的**挂上**形。⚠️ `type` 而不是 `interface`:与 {@link WiringManifestMcpEntry} 同一条裁定(隐式索引签名,理由与回归钉见那一型的顶注)。 */
3354
+ export type WiringManifestModMounted = {
3355
+ /** 注册名(注册方的串,UNTRUSTED-for-display)。 */
3356
+ name: string;
3357
+ /** 来自哪一席(见 {@link ModSeat})。 */
3358
+ seat: ModSeat;
3359
+ /** 档(见 {@link ModTier})。 */
3360
+ tier: ModTier;
3361
+ /** 它**真挂上**的事件模式(引擎词,逐字)。 */
3362
+ events: string[];
3363
+ /** 其中声明为只观察的那些模式;缺席 = 没有观察 handler(正面事实)。 */
3364
+ observe?: string[];
3365
+ /** 准入它时被跳过的判官(core `ModSkip`):`cause` = core `MOD_FAILURE_CAUSES`(今天 `threw` / `timeout` / `violation` / `reentry`;开集读),
3366
+ * `registration` / `reason` = 注册方的串。**在场 iff 非空**(缺席 = 每个判官都答了);缺成员的元素由 server 逐个丢弃。 */
3367
+ skipped?: Array<{
3368
+ registration: string;
3369
+ cause: string;
3370
+ reason: string;
3371
+ }>;
3372
+ };
3373
+ /** {@link WiringManifestModEntry} 的**被拒**形:准入时被另一张注册的 `plugin.register` 判官拒了,这条腿照跑、少了它。同一只拒也作 `engine_notice`
3374
+ * `mods.registration_refused` 上流(`detail` 的串与本行逐字节相等,见 {@link import("./events.js").ModsRegistrationRefusedDetail})。本服务今天没有任何 `plugin.register` 判官 ⇒ 到达不了。 */
3375
+ export type WiringManifestModRefused = {
3376
+ name: string;
3377
+ seat: ModSeat;
3378
+ tier: ModTier;
3379
+ /** 拒它的那张注册(注册方的串)。 */
3380
+ refusedBy: string;
3381
+ /** 判拒的那张注册写的话(注册方的串,UNTRUSTED-for-display)。 */
3382
+ reason: string;
3208
3383
  };
3209
3384
  /**
3210
3385
  * 一条腿的 **LSP 代码智能接缝**(core 7.18.0 #789,server ≥7.78.0;**租户可见**)。
@@ -3428,10 +3603,11 @@ export type TraceBlock = {
3428
3603
  parentToolCallId?: string;
3429
3604
  }
3430
3605
  /** server ≥1.219 ([998]②/[1005]①b): the assembly manifest rendered at the TOP of the turn it prepared
3431
- * (web's "Prompt 组成" card source; service project.ts projectEvents `prompt_assembled` 实拆). */
3606
+ * (web's "Prompt 组成" card source; service project.ts projectEvents `prompt_assembled` 实拆). server ≥7.132.0 = 清单 v3 行或 ≤7.131.x 写下的旧行
3607
+ * (按 `"constitution" in block` 判,见 {@link PromptManifestRow})。 */
3432
3608
  | ({
3433
3609
  type: "prompt-assembled";
3434
- } & PromptManifest) | {
3610
+ } & PromptManifestRow) | {
3435
3611
  type: string;
3436
3612
  [k: string]: unknown;
3437
3613
  };
@@ -3449,9 +3625,9 @@ export type TraceBlock = {
3449
3625
  * - `tool-result` — `{ seq, callId, isError, output?, truncated?, eventId?, parentToolCallId? }` an action closed.
3450
3626
  * §E1 (SHIPPED, mapTraceEvent project.ts:248-250): `output`/`truncated` = the model-facing
3451
3627
  * BODY (redacted+bounded at append; absent ⇒ no body). The old "output absent" gap is CLOSED.
3452
- * - `prompt-assembled` — `{ seq, ...PromptManifest }` (server ≥1.219): the prepare's assembly manifest
3453
- * (constitution/blocks/sections?/tools?/totalChars — mapTraceEvent passthrough,
3454
- * whitelisted at append). MULTIPLE per task on cascade/verify runs.
3628
+ * - `prompt-assembled` — `{ seq, ...PromptManifestRow }` (server ≥1.219): the prepare's assembly manifest — the stored
3629
+ * ledger row verbatim (server ≥7.132.0: the v3 row `identity`/`selectors`/`blocks`/`sections`/…, or a
3630
+ * row written by ≤7.131.x carrying `constitution`; see {@link PromptManifestRow}). MULTIPLE per task on cascade/verify runs.
3455
3631
  * - `turn` — `{ seq, tokens? }` a turn boundary (+ usage if present).
3456
3632
  * - `done` — `{ seq, suspended? }` terminal (suspended:true = paused on HITL, NOT completed).
3457
3633
  * - `error` — `{ errorCode, message }` terminal failure / `WORKER_DOWN` (stalled) / `STREAM_MAX_DURATION` /
@@ -3536,7 +3712,7 @@ export type TraceStreamEvent = {
3536
3712
  data: {
3537
3713
  type?: "prompt-assembled";
3538
3714
  seq: number;
3539
- } & PromptManifest;
3715
+ } & PromptManifestRow;
3540
3716
  } | {
3541
3717
  event: "turn";
3542
3718
  id?: string;
@@ -3792,7 +3968,14 @@ export interface McpServerSpec {
3792
3968
  * but does not send an assertion yet (engine seat pending; operator line `mcp_assertion_header_not_sent`). */
3793
3969
  assertionHeader?: string;
3794
3970
  };
3795
- /** Optional allowlist of tool names to expose (others dropped). */
3971
+ /** 这台服务器上**挂哪些工具**的名单(工具**裸名**,即服务器自己列出的名)。三句语义(server ≥7.132.0 契约成文;读自引擎 `intakeListedTools`,server 原样过境、不对照活名单):
3972
+ * · **缺席** = 该台列出的工具**全挂**;
3973
+ * · **`[]`** = **一只不挂**(台仍连、仍探测、仍进 `GET /v1/capabilities/mcp` 状态面);🔴 `[]` **不得折成缺席** —— 两者在 wire 上是两个事实(「写了就在场」律),
3974
+ * 序列化时别把空数组省掉;
3975
+ * · **名单里服务器没列出的名** = **静默不匹配**(不 400、不告警 —— 收窄方向的失配只会少挂不会多挂)。要「写错即响」,用 {@link toolFaces} 点名同一只工具(未知名有
3976
+ * `config.tool_face_undeclared` 通告);{@link toolAxes} 只判形、对未知名不告警。
3977
+ * 引擎唯一会响的一处:该台没声明 `tools` 能力而本名单非空 ⇒ 运维告警 `mcp.tools_capability_absent`。本名单同时管这台的 **MCP 资源**:缺席 ⇒ 资源列 / 读照开;给了名单 ⇒
3978
+ * 只有名单含保留名 `list_resources` / `read_resource` 时才开(所以 `[]` 也把资源一并关掉)。坏形(非字符串数组)⇒ 400 `request.field_invalid` 点名 `mcpServers[i].allowTools`。 */
3796
3979
  allowTools?: string[];
3797
3980
  /** Opt in to INBOUND elicitation for this server (server may ask the END USER mid-tool-call). Default OFF. */
3798
3981
  elicitation?: boolean;
@@ -3813,6 +3996,11 @@ export interface McpServerSpec {
3813
3996
  * 物化后的 schema 上)由引擎拒**那一只**工具并出 `config.tool_face_invalid` 通告(operator 面)。三条腿(请求 /
3814
3997
  * config-center / 本地 config.d)同一条规则。 */
3815
3998
  toolFaces?: Record<string, McpToolFace>;
3999
+ /** server ≥7.132.0(受理键;core `McpServerSpec.startupTimeoutMs`):**这台**服务器的启动上限(整毫秒)—— 握手(连接 + initialize)与初次工具列举各带它。
4000
+ * 读序一只函数:本键 › 进程级 `MCP_TIMEOUT` › MCP SDK 自己的 60 000 ms ⇒ 启动卡住的一台按自己的钟被切,兄弟照用部署的钟;只界启动阶段(调用自己的超时不动)。
4001
+ * 合法范围 1 000 – 2 147 483 647;🔴 **值形判官只在引擎**:server 两扇门(新提交 / 探测口)都不在入口判它,坏值(串 / 小数 / 0 / 负数 / NaN / `null` / 越界)由引擎在拨号时
4002
+ * **只拒这一台**(`config.mcp_startup_timeout_invalid`,兄弟照挂),不钳、不读成缺省。老 server(≤7.131.x)对它答 `400 request.body_shape`(`unknownKeys` 点名)。 */
4003
+ startupTimeoutMs?: number;
3816
4004
  }
3817
4005
  /**
3818
4006
  * 一条 **A2A peer**(`TaskRequest.a2aPeers[]` 的一行)—— 本 SDK 镜像的是 server **真受理**的那一面:
@@ -3941,11 +4129,15 @@ export type PermissionModeAutoCapability =
3941
4129
  * **引擎能力词**(core `ENGINE_CAPABILITIES`,core 7.51.1 起;**逐词同序**)—— 「这台引擎做不做 X」的唯一住处:壳按**词**判断,不按版本号。
3942
4130
  * server ≥7.129.0 把它也接线了的词原样投到 `GET /v1/capabilities` 的**顶层**,**键就是词本身**(带点号,值恒 `true`;没接的词不投 ⇒ 缺席)。
3943
4131
  * · `inherit_env.own_credentials_withheld` —— 这台部署上起的子进程**从不继承**部署声明为自家凭据的名字(`inheritEnv` 的每种策略,含 `"all"`,都先减去那张名单;
3944
- * 点名其中一个名字的白名单被拒)。只说**继承**:引擎进程自己的环境对同机同用户进程仍可读,所以「凭据根本不进环境」仍是根治。
4132
+ * 点名其中一个名字的白名单被拒)。只说**继承**:引擎进程自己的环境对同机同用户进程仍可读,所以「凭据根本不进环境」仍是根治。值恒 `true`(没接的部署不投)。
4133
+ * · `inherit_env.own_credential_values_withheld`(core 7.52.0 起第二词;server ≥7.132.0 投)—— 宿主上起的子进程**不继承值等于本部署凭据值的变量**(值整串相等,不论变量叫什么名):
4134
+ * 部署把同一把钥匙抄进别的变量名,`inheritEnv: "all"` 下也扣得下。🔴 **这一位是事实不是能力声明,可以是 `false`**:位真 ⇔ 当前生效配置的每一个凭据变量(只要 env 里有值)都进了引擎的值臂;
4135
+ * 引擎判某个值「不是凭据」(空白 / 占位词 / 一个字符重复 / 不足 8 字符)或「是每个子进程都会拿到的变量的值」时不收它 ⇒ `false`(名臂照扣)。一次请求才解析出来的凭据不在值臂里。
4136
+ * 缺席 = 老 server(≤7.131.x:只按名扣,同值换名的副本在 `"all"` 下照进子进程)。壳要「连副本也扣」时按 `=== true` 闸。同样只说**继承**。
3945
4137
  * 一处派生:{@link EngineCapabilityBits} 与 {@link Capabilities} 的能力词键都由本数组生成 —— 引擎加词时这里加一项、其余零手写;
3946
4138
  * 缺席 = 老 server(≤7.128.x)或这一词没接线 ⇒ **读作「不保证」**,不是「不具备」。
3947
4139
  */
3948
- export declare const ENGINE_CAPABILITY_WORDS: readonly ["inherit_env.own_credentials_withheld"];
4140
+ export declare const ENGINE_CAPABILITY_WORDS: readonly ["inherit_env.own_credentials_withheld", "inherit_env.own_credential_values_withheld"];
3949
4141
  export type EngineCapabilityWord = (typeof ENGINE_CAPABILITY_WORDS)[number];
3950
4142
  /** 能力词 ⇒ 可选布尔(键名原样带点号);{@link Capabilities} 继承它。 */
3951
4143
  export type EngineCapabilityBits = {
@@ -4216,6 +4408,20 @@ export interface Capabilities extends EngineCapabilityBits {
4216
4408
  * `hooks` 仍是单用户部署(requirePrincipal!==true)才 true。逐位读,别按整体推断。
4217
4409
  * ⚠️ `permissions` 只是**受理位**(server 受理 `settings.permissions` 这一面,恒 `true`、仍是布尔,server ≥7.115.0 没动它);
4218
4410
  * `settings.permissions.allow` 按**哪一种读法**收,看下面的 {@link Capabilities.settings}`.permissions.allowGrant`。 */
4411
+ /** server ≥7.131.0(core 7.50.0):**请求层附件**席位 —— server 受理提交体顶层键 {@link TaskRequest.userAttachments} 并原样交给引擎,值 = 引擎的席位描述 `USER_ATTACHMENT_SEAT` **原样**(恒在,不随部署形变):
4412
+ * `entries` = 哪些入口带附件(今天恒 `["objective"]`:送话口不收);`kinds` = 引擎认得出的种类词(`text` / `notebook` / `image` / `pdf` / `directory` / `client_text` / `client_image`,引擎闭集);
4413
+ * `supplies` = 供给词(`path` / `content_text` / `content_image`);`limits` = `{ maxEntries, maxRenderedTextChars }`(今天 20 / 100000)。
4414
+ * ⚠️ `supplies` 说的是席位**能承载**的供给,不是这台部署、这个场景此刻**受理**的:`path` 条目只在有手场景受理(工作区在哪台机器读 {@link Capabilities.executionLane}),无手场景整条由引擎拒
4415
+ * `config.user_attachment_invalid`。**位缺席 = 老 server(≤7.130.x)**,别发这个键(它会 400 `request.body_shape`)。 */
4416
+ userAttachments?: {
4417
+ entries: string[];
4418
+ kinds: string[];
4419
+ supplies: string[];
4420
+ limits: {
4421
+ maxEntries: number;
4422
+ maxRenderedTextChars: number;
4423
+ };
4424
+ };
4219
4425
  taskSettings?: {
4220
4426
  permissions?: boolean;
4221
4427
  permissionMode?: boolean;
@@ -5006,7 +5212,7 @@ export interface ScenarioDetail {
5006
5212
  * decide-ready operator queue),**不是** (a) inbox/tasks 的标量 `CheckpointSummary`(见下文 CheckpointSummary)。
5007
5213
  * 与标量形状的精确差(§7b/§4a):
5008
5214
  * - severity 嵌在 **`riskDescriptor.severity`** 内 —— 富行**无顶层 severity 标量**;
5009
- * - 富行**无 `gateKind`**(消费方要类别时回退 `toolName`/`riskDescriptor.toolName`);
5215
+ * - 富行的门类是**顶层 `gateKind`**(server 3.0.0 起两只 checkpoint store 的富行投影都发;server ≥7.132.0 **恒在场**,见 {@link PendingCheckpoint.gateKind})—— 不从 `toolName` 反推;
5010
5216
  * - 富行**无 `token`**(§1:resume capability token 是永不上线的 secret,server 自按 sessionId 解析);
5011
5217
  * - **无 `checkpointToken`**(§4a:server-INTERNAL,NOT surfaced 在 /v1/approvals 记录上;合规 client 只回传
5012
5218
  * boundCallId+boundInputHash 两件套 —— `ApprovalDecision` 上那个可选 checkpointToken 字段已于 SDK 1.0.0 删除)。
@@ -5149,7 +5355,13 @@ export interface PendingCheckpoint {
5149
5355
  * 🔴 类型是 `string` 而**不是**联合枚举:门类是**开集**(实测产物里至少有 `human` /
5150
5356
  * `irreversible_ask` / `plan_review` / `needs_review` / `resource_limit`,core 还会加)。写死枚举会让
5151
5357
  * 一个新门类在类型上"不存在",消费端要么编译不过要么被迫 `as`,那正是这条声明想消除的东西。
5152
- * ⚠️ 缺席 = pre-`gate_kind` 的历史行(SQL 侧 `gate_kind` 列为 NULL)⇒ 老实降级,别当 `"human"`。 */
5358
+ *
5359
+ * 🔴 **server ≥7.132.0 恒在场**(wire 收窄,契约 §7(b)):每次停驻都在行上盖门类;起服一次性迁移 M21 给缺它的存量行补上(门型读不出登记词的行置 expired);
5360
+ * SQL 店里仍读不出登记门类的行**不列**(计数 `server.approvals.queue-row-gate-kind-missing`;也没有决断口绑得住它),而不是缺着这个键送出。
5361
+ * ⇒ 对着 ≥7.132.0 的 server,缺席**到达不了**;对着 7.131.x 及更早的 server,缺席 = pre-`gate_kind` 的历史 SQL 行(`gate_kind` 列为 NULL)。
5362
+ * 消费端对缺席的读法一句(server 契约原话):**按「读不出」fail closed**(不当 `"human"`、不编类别、不路由到任何决断口)。
5363
+ * ⚠️ 本位**刻意仍是可选**(与 {@link import("./errors.js").ResumeBlockedByPolicyError.blockedBy} 同一条律,K-24 复审 r1 M1):支持地板 3.0.0 之内的老 server 真的会缺它 ——
5364
+ * 型上写必有 = 让老 server 上的缺席变成一个型说「不可能」的值。支持地板抬过 7.132.0 的那一版改必有(那时缺席不再可达)。 */
5153
5365
  gateKind?: string;
5154
5366
  /** server 7.16.0([3684]②):同步卡早有的「别再问我这个」持久规则候选,durable 队列行补齐供给——
5155
5367
  * 数组序=展示序,EXACT 形若在场恒在首位;core 契约 basis ≤ 2,server 执法上限 4 ⇒ 消费端按 ≤4 布局
@@ -5302,9 +5514,9 @@ export interface SessionRecord {
5302
5514
  messages: unknown[];
5303
5515
  /** Present ONLY on a windowed read (`tail`/`before`) against server ≥1.162. */
5304
5516
  window?: SessionWindow;
5305
- /** server ≥1.220 ([1023]①): the session's prompt-epoch pin (additive; absent = pre-epoch session
5306
- * OR an older engine — never null). The typed entry is NOT an LLM message, so it never appears
5307
- * in `messages`. */
5517
+ /** server ≥1.220 ([1023]①): the session's prompt-epoch record (absent = pre-epoch session OR an older engine — never null). The typed entry is
5518
+ * NOT an LLM message, so it never appears in `messages`. 🔴 **server ≥7.132.0 BREAKING**:值 = 引擎 `StoredPromptEpoch` 读数原样(`{ kind: "pin", descriptor }` /
5519
+ * `{ kind: "legacy", centerPinned }`),形见 {@link PromptEpoch}。 */
5308
5520
  promptEpoch?: PromptEpoch;
5309
5521
  /** server ≥7.110.0(S-928 用户输入受理账本):这个会话里**崩溃丢掉**的用户输入 —— server 回了 200 `applied`(interrupt{text}:202)、
5310
5522
  * 承载它的 server 进程却在那条 run 收场前死了(**引擎在进程死前没来得及确认消费**;server ≥7.113.0 / core 7.39.0 #1273 起引擎确认消费过的受理结清成 `consumed`、
@@ -5475,7 +5687,7 @@ export interface McpServerStatus {
5475
5687
  * 超时台、没拨到的台都**占住自己的位置**。拿自己的申报列表按 **index** 配,**别按 `name` 配** —— 名字不
5476
5688
  * 保证唯一,而重名申报上按名字配就是把 A 的读数贴到 B 上。
5477
5689
  *
5478
- * 🔴 **本面没有 `degraded` 臂,这是刻意的**(与 {@link McpStatusPanel.degraded} 刻意不同):一次答不出来的
5690
+ * 🔴 **本面没有 `degraded` 臂,这是刻意的**(与 {@link McpStatusPanelServed.degraded} 刻意不同):一次答不出来的
5479
5691
  * 探测如果回一份看着正常的空名单,那正是这条面要根除的假答案。答不出来是**响亮**的 —— 整次走查超界 ⇒
5480
5692
  * 503 `state.mcp_probe_incomplete` + `Retry-After`。⚠️ 零申报的 `servers: []` 与它**是两件事**:那是一份
5481
5693
  * 诚实的空面(这台部署什么都没申报),不是「取不到」。
@@ -5488,17 +5700,39 @@ export interface McpProbeFace {
5488
5700
  /** 逐台一行,**行形单源** = {@link WiringManifestMcpEntry};与申报表同序同长(见本型顶注)。 */
5489
5701
  servers: WiringManifestMcpEntry[];
5490
5702
  }
5491
- /** `GET /v1/sessions/:id/mcp` 的信封(service src/http/routes/sessions.ts)。`asOf` = THIS materialize 时刻(ISO);
5492
- * `degraded:true` = materialize 超时/失败 → `servers` 空但非「无 MCP」(壳显「状态暂不可得」)。无 MCP 配置 → `servers:[]`。 */
5493
- export interface McpStatusPanel {
5494
- asOf: string;
5703
+ /**
5704
+ * `GET /v1/sessions/:id/mcp` 的体 —— **两臂恰一**(server 7.132.0 `http/routes/sessions.js` 的三只铸造臂)。`asOf` = 这次 materialize 的时刻(ISO)。
5705
+ * 两半分答(server ≥7.131.0):账本半(`lastLegMcp`)与场景无关、两臂都可带;场景半问场景门 ——
5706
+ * · {@link McpStatusPanelServed} —— 门放行:`servers`(没配 MCP ⇒ `[]`;materialize 超时 / 失败 ⇒ `[]` + `degraded: true`,壳显「状态暂不可得」,不是「无 MCP」);
5707
+ * · {@link McpStatusPanelRefused} —— 门拒(**仍是 200**):`scenarioRefusal` 在场,`servers` / `degraded` 缺席(场景这一半没答 ≠ `servers: []`)。
5708
+ * 判别读一句:`panel.scenarioRefusal === undefined ? 渲 panel.servers : 渲拒因`(两臂互把对方的键声明成 `?: undefined`,所以 `panel.servers ?? []` 也照样可写)。
5709
+ * 体封闭(随包 spec `additionalProperties: false` + 两臂 `oneOf`),型上不留索引签名。老 server(<7.131.0)恒是 served 臂。
5710
+ */
5711
+ export type McpStatusPanel = McpStatusPanelServed | McpStatusPanelRefused;
5712
+ /** 场景门放行的面板(见 {@link McpStatusPanel})。 */
5713
+ export type McpStatusPanelServed = McpStatusPanelCommon & {
5714
+ /** 场景半:这位主体**现在**的场景会挂什么。`[]` = 门放行、该场景没配 MCP(与拒臂的缺席是两件事)。 */
5495
5715
  servers: McpServerStatus[];
5496
5716
  /** materialize 超时/失败的降级标记(servers 空且 degraded 时 = 取不到,非「没有」)。 */
5497
5717
  degraded?: boolean;
5718
+ scenarioRefusal?: undefined;
5719
+ };
5720
+ /** 场景门拒的面板(server ≥7.131.0;见 {@link McpStatusPanel})。 */
5721
+ export type McpStatusPanelRefused = McpStatusPanelCommon & {
5722
+ /** **场景门拒的拒因**(server ≥7.131.0)—— 今天的拒形:中心把这位主体指派到本部署不在册的场景
5723
+ * ⇒ `errorCode: "state.scenario_assignment_unknown"`。成员 = 同一构造下整面拒(`GET /v1/capabilities/mcp` / `GET /v1/sessions/:id/a2a` 的 503)的体**逐字**
5724
+ * (server 同一只组句器),形见 {@link McpPanelScenarioRefusal}。门抛的不是 typed 错仍是 500,不被改写成本键。 */
5725
+ scenarioRefusal: McpPanelScenarioRefusal;
5726
+ servers?: undefined;
5727
+ degraded?: undefined;
5728
+ };
5729
+ /** 两臂共有的成员(不导出:读者按 {@link McpStatusPanel} 的两臂读)。 */
5730
+ interface McpStatusPanelCommon {
5731
+ asOf: string;
5498
5732
  /**
5499
5733
  * **这个会话上一次真挂上了什么**(server ≥7.77.0,**可选**顶层键)。
5500
5734
  *
5501
- * {@link servers} 答的是「这台 worker 的**部署缺省场景**会给你什么」;本键答的是「这个会话**最近一条
5735
+ * `servers` 答的是「这台 worker 的**部署缺省场景**会给你什么」;本键答的是「这个会话**最近一条
5502
5736
  * run** 真挂上去的名册」——后者的真源是那条腿账本里**从尾向前**第一条 `wiring_manifest` 的 `mcp` 段。
5503
5737
  * 两面**合法可不同**(请求级 MCP 注入 / 该 run 的场景不是部署缺省 / 某台当时没连上),此前只能靠翻账本
5504
5738
  * 才看得到第二面。
@@ -5528,8 +5762,24 @@ export interface McpStatusPanel {
5528
5762
  * ({@link WiringManifestMcpEntry},一字不差;零新形,同一份载荷换一条 wire 出来)。 */
5529
5763
  mcp: WiringManifestMcpEntry[];
5530
5764
  };
5531
- [k: string]: unknown;
5532
5765
  }
5766
+ /**
5767
+ * {@link McpStatusPanelRefused.scenarioRefusal} 的形(server ≥7.131.0)= 一只拒的体 `{ error, errorCode, ...facts }`(server `refusalBody`,整面拒与面板数据同一只组句器)。
5768
+ * · `errorCode` —— 今天只有 `state.scenario_assignment_unknown`(开集读:场景门日后多一种 typed 拒,同样落这里);
5769
+ * · `error` —— 给人读的句子(点名那个场景名与本部署的在册词表);
5770
+ * · `detail` —— 门拒的机读事实 `{ scenario, source }`:`source` 闭二词 `"ruling"`(中心按这位主体指派的场景本部署没有:花名册漂移)/ `"deployment"`(部署缺省 `DEFAULT_SCENARIO` 悬空,
5771
+ * sema-server 起服即拒这一形 —— 只有自己装配 `resolveSpec` 的嵌入方到得了)。
5772
+ * 调用方没有错:修法在中心(改指派)或部署(把那个场景加回册),修好后原样重试。
5773
+ */
5774
+ export type McpPanelScenarioRefusal = {
5775
+ errorCode: string;
5776
+ error: string;
5777
+ detail?: {
5778
+ scenario: string;
5779
+ source: "ruling" | "deployment" | (string & {});
5780
+ };
5781
+ [k: string]: unknown;
5782
+ };
5533
5783
  /**
5534
5784
  * `POST /v1/sessions/:id/mcp/reconnect` 的 `status` 段(server ≥7.85.0 / S-381;铸点
5535
5785
  * `src/http/routes/mcp-reconnect.ts` 的 `projectStatus`)—— core `McpServerStatus` 的**本面投影**。
@@ -6394,7 +6644,7 @@ export interface AssistantTaskStatus {
6394
6644
  * 🔴 **一条规则管所有「effective 半场 only」的键**(9.7.0 立,codex 对抗复审 [high] 验真后收成这一句,
6395
6645
  * 而不是给新加的三段各写一条特例):本型**今天唯一的消费点**是 `GET /v1/diagnostics/wiring` 的 `static`
6396
6646
  * 半场,而标了「只在 effective 半场铸」的键(`leg` / `ask.effective` / `configFingerprint` / `tools` /
6397
- * `hooks` / `lsp` / `modelGate` / `autoMode` / `writeProtection` / `readDeny` / `autoConsolidation` / `fileHistory`)
6647
+ * `mods` / `lsp` / `modelGate` / `autoMode` / `writeProtection` / `readDeny` / `autoConsolidation` / `fileHistory`)
6398
6648
  * 在这条 wire 上**恒缺席** ⇒ **它们在本面上的缺席不携带任何信息**。
6399
6649
  * 每一段顶注里写的那些「缺席 = 未武装 / 缺席 = 第三态」的读法**只对 live 帧成立**(`AgentEvent` 的
6400
6650
  * `wiring_manifest` 臂),**不许**搬到这条端点的响应上来读 —— 在这里把缺席读成「未武装」,恰恰会把一台
@@ -6483,11 +6733,9 @@ export interface WiringManifest {
6483
6733
  * `httpStatus` 只在 `errorCode === "http_status"` 时在场(**缺席**而不是 0)。引擎的 `error` 自由文本
6484
6734
  * **刻意不投**(远端作者文本,脱敏单点在 core)。 */
6485
6735
  mcp?: WiringManifestMcpEntry[];
6486
- /** core 7.18.0(#789),server ≥7.78.0 —— **租户可见**:这条腿真接了席的钩子族,一族一行。
6487
- * 🔴 **只在 effective 半场**(live 帧)铸;静态半场恒无(core:effective half only)。
6488
- * 🔴 **在场 iff 至少一席接了**(core 从不发空数组);**缺席 ≠「没有钩子会跑」** —— 逐条读法见
6489
- * {@link WiringManifestHookEntry} 顶注(行形单源,live 帧与本面同一个名字)。 */
6490
- hooks?: WiringManifestHookEntry[];
6736
+ /** core 7.52.0,server ≥7.132.0 —— **租户可见**:这条腿的 mods 准入记录,一张注册一行(挂上 / 被拒两形)。**取代 `hooks[]`(BREAKING,零别名)**。
6737
+ * 🔴 **只在 effective 半场**(live 帧)铸;静态半场恒无(core:effective half only)。逐条读法见 {@link WiringManifestModEntry} 顶注(行形单源,live 帧与本面同一个名字)。 */
6738
+ mods?: WiringManifestModEntry[];
6491
6739
  /** core 7.18.0(#789),server ≥7.78.0 —— **租户可见**:LSP 代码智能接缝。
6492
6740
  * 🔴 **只在 effective 半场**铸;静态半场恒无。**在场 iff 解析出了 manager 席**,两位互相独立、禁合读
6493
6741
  * —— 见 {@link WiringManifestLspSeam} 顶注(段形单源)。 */
@@ -7119,6 +7367,8 @@ export interface WiringDiagnostics {
7119
7367
  memoryPosture?: Record<string, unknown> | null;
7120
7368
  /** 本部署的 SQL 引擎姿态(server ≥7.60 / S-131):引擎 / 版本 / 会话隔离级 / TiDB 事务模式,读的是驱动在
7121
7369
  * 真连接上 `SET` 完之后**回读**的值,不是 env 里写了什么。`null` = 无 SQL 后端。
7370
+ * server ≥7.132.0 段内多三键(加性):`maxRowBytes` / `maxPacketBytes`(库的单行墙 / 包墙,`null` = 这堵墙不存在)与 `wallSources`(两堵墙各自的出处,`reported` / `assumed`,
7371
+ * 见 {@link import("./errors.js").SqlWallSource})—— 413 拒体的 `wallSource` 读的就是这一处。
7122
7372
  * 🔴 **本代 SDK 尚未逐键镜像** —— 按不透明读。 */
7123
7373
  sqlEngine?: Record<string, unknown> | null;
7124
7374
  /** 配置世代账的 operator 面(server ≥7.5x / #322):按组的 appliedVersion / deferredKeys+铸因 /