@sema-agent/server 7.138.0 → 7.139.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 (215) hide show
  1. package/MIGRATION.md +276 -7
  2. package/README.md +7 -4
  3. package/README.zh-CN.md +6 -4
  4. package/USAGE.md +73 -29
  5. package/deploy/sema-up/README.md +1 -1
  6. package/deploy/sema-up/lib/lanes.json +3 -2
  7. package/dist/adoption/wire.d.ts +3 -3
  8. package/dist/approval-card.d.ts +20 -20
  9. package/dist/bench/s1/arms.d.ts +1 -1
  10. package/dist/bench/s1/arms.js +1 -3
  11. package/dist/bench/s1/run-firm.js +2 -2
  12. package/dist/boot/device-lane.d.ts +8 -3
  13. package/dist/boot/device-lane.js +7 -2
  14. package/dist/boot/execution-env.d.ts +4 -2
  15. package/dist/boot/execution-env.js +16 -24
  16. package/dist/boot/execution-lane.d.ts +1 -1
  17. package/dist/boot/governance-seams.d.ts +3 -2
  18. package/dist/boot/governance-seams.js +9 -11
  19. package/dist/boot/memory-consolidation.js +2 -2
  20. package/dist/boot/resolve-spec.d.ts +1 -1
  21. package/dist/boot/resolve-spec.js +8 -9
  22. package/dist/boot/retention-lane.d.ts +5 -5
  23. package/dist/boot/retention-lane.js +0 -6
  24. package/dist/boot/runner-deps.d.ts +3 -1
  25. package/dist/boot/runner-deps.js +2 -1
  26. package/dist/boot/session-faces.d.ts +0 -3
  27. package/dist/boot/session-faces.js +15 -8
  28. package/dist/boot/stage-02-web-admin-pull.js +2 -2
  29. package/dist/boot/stage-05-execution-env.js +2 -2
  30. package/dist/boot/stage-06-runners.js +0 -1
  31. package/dist/boot/stage-09-leader.js +1 -2
  32. package/dist/boot/stage-10-http-server.js +2 -2
  33. package/dist/boot/stores.js +4 -4
  34. package/dist/boot/web-admin.js +2 -2
  35. package/dist/capabilities/mcp-probe.js +1 -1
  36. package/dist/capabilities/scenarios.d.ts +1 -1
  37. package/dist/capability-facts.d.ts +15 -7
  38. package/dist/capability-facts.js +8 -3
  39. package/dist/config-catalog.js +7 -7
  40. package/dist/config-invariants.d.ts +23 -3
  41. package/dist/config-invariants.js +42 -0
  42. package/dist/config-provider.d.ts +19 -24
  43. package/dist/config-provider.js +27 -12
  44. package/dist/config-types.d.ts +10 -5
  45. package/dist/config.d.ts +33 -0
  46. package/dist/config.js +44 -15
  47. package/dist/delegated-session-owner.d.ts +2 -2
  48. package/dist/deployment-shape.d.ts +1 -1
  49. package/dist/device-enrollment.d.ts +41 -2
  50. package/dist/device-enrollment.js +27 -12
  51. package/dist/device-store.d.ts +58 -85
  52. package/dist/device-store.js +19 -49
  53. package/dist/device-ws-hub.js +2 -1
  54. package/dist/env-name-allowlist-knobs.d.ts +5 -4
  55. package/dist/exec-cut.d.ts +60 -0
  56. package/dist/exec-cut.js +36 -0
  57. package/dist/execution-lane-caps.d.ts +19 -0
  58. package/dist/execution-lane-caps.js +10 -0
  59. package/dist/execution-placement.d.ts +259 -0
  60. package/dist/execution-placement.js +199 -0
  61. package/dist/field-conflict.d.ts +3 -2
  62. package/dist/field-conflict.js +1 -0
  63. package/dist/hosted-posture.d.ts +2 -2
  64. package/dist/http/admission.js +8 -19
  65. package/dist/http/checkpoint-ctx.d.ts +21 -12
  66. package/dist/http/checkpoint-ctx.js +4 -2
  67. package/dist/http/claimed-run.d.ts +1 -1
  68. package/dist/http/durable-run-leg.js +9 -5
  69. package/dist/http/execution-context.d.ts +218 -0
  70. package/dist/http/execution-context.js +330 -0
  71. package/dist/http/resume-legs.js +50 -20
  72. package/dist/http/route-ctx.d.ts +14 -8
  73. package/dist/http/routes/background.d.ts +29 -1
  74. package/dist/http/routes/background.js +29 -2
  75. package/dist/http/routes/devices.d.ts +13 -19
  76. package/dist/http/routes/devices.js +21 -26
  77. package/dist/http/routes/session-sync.js +110 -15
  78. package/dist/http/routes/sessions.d.ts +6 -0
  79. package/dist/http/routes/sessions.js +115 -11
  80. package/dist/http/routes/side-query.d.ts +12 -4
  81. package/dist/http/routes/side-query.js +4 -5
  82. package/dist/http/routes/tasks.js +37 -31
  83. package/dist/http/server.d.ts +35 -19
  84. package/dist/http/server.js +11 -0
  85. package/dist/http/session-inherit-env.d.ts +3 -4
  86. package/dist/http/session-inherit-env.js +1 -1
  87. package/dist/http/wire-types.d.ts +8 -12
  88. package/dist/index.d.ts +1 -0
  89. package/dist/memory-sync-client.d.ts +53 -14
  90. package/dist/memory-sync-client.js +196 -116
  91. package/dist/memory-sync.d.ts +1 -1
  92. package/dist/memory-sync.js +3 -2
  93. package/dist/observability/cost-taxonomy.d.ts +2 -2
  94. package/dist/observability/fail-open.d.ts +12 -0
  95. package/dist/observability/fail-open.js +12 -0
  96. package/dist/observability/run-terminal.js +0 -1
  97. package/dist/orchestration/workflow-notify-journal.js +4 -4
  98. package/dist/org-memory-admission.d.ts +4 -3
  99. package/dist/org-memory-admission.js +6 -6
  100. package/dist/parked-decide.d.ts +34 -9
  101. package/dist/parked-decide.js +12 -19
  102. package/dist/parked-revive-surface.d.ts +12 -15
  103. package/dist/parked-revive-surface.js +3 -6
  104. package/dist/peer-seat.d.ts +13 -7
  105. package/dist/peer-seat.js +37 -3
  106. package/dist/plugins/approval-ask-store-file.d.ts +7 -0
  107. package/dist/plugins/approval-ask-store-file.js +11 -0
  108. package/dist/plugins/approval-ask-store-memory.d.ts +6 -0
  109. package/dist/plugins/approval-ask-store-memory.js +12 -0
  110. package/dist/plugins/approval-ask-store-sql.d.ts +22 -5
  111. package/dist/plugins/approval-ask-store-sql.js +30 -12
  112. package/dist/plugins/caching-session-store.d.ts +6 -2
  113. package/dist/plugins/caching-session-store.js +9 -3
  114. package/dist/plugins/checkpoint-store-sql.d.ts +6 -5
  115. package/dist/plugins/checkpoint-store-sql.js +5 -7
  116. package/dist/plugins/device-store-sql.d.ts +25 -51
  117. package/dist/plugins/device-store-sql.js +49 -103
  118. package/dist/plugins/execution-placement-sql.d.ts +151 -0
  119. package/dist/plugins/execution-placement-sql.js +223 -0
  120. package/dist/plugins/file-history-store-sql.d.ts +7 -6
  121. package/dist/plugins/file-history-store-sql.js +5 -5
  122. package/dist/plugins/file-run-store.d.ts +6 -1
  123. package/dist/plugins/file-run-store.js +4 -0
  124. package/dist/plugins/fork-routing-session-store.d.ts +6 -0
  125. package/dist/plugins/fork-routing-session-store.js +16 -0
  126. package/dist/plugins/local-session-store.d.ts +149 -50
  127. package/dist/plugins/local-session-store.js +382 -107
  128. package/dist/plugins/memory-key-guards.d.ts +4 -0
  129. package/dist/plugins/memory-key-guards.js +1 -0
  130. package/dist/plugins/memory-run-store.d.ts +1 -1
  131. package/dist/plugins/one-time-migrations.d.ts +111 -3
  132. package/dist/plugins/one-time-migrations.js +380 -10
  133. package/dist/plugins/outcome-ledger-sql.d.ts +2 -2
  134. package/dist/plugins/permission-rule-store-sql.d.ts +13 -15
  135. package/dist/plugins/permission-rule-store-sql.js +13 -16
  136. package/dist/plugins/pg-pool.d.ts +7 -3
  137. package/dist/plugins/pg-session-storage.d.ts +31 -20
  138. package/dist/plugins/pg-session-storage.js +120 -52
  139. package/dist/plugins/remote-env-adb.d.ts +20 -4
  140. package/dist/plugins/remote-env-adb.js +70 -62
  141. package/dist/plugins/remote-env-device.d.ts +30 -12
  142. package/dist/plugins/remote-env-device.js +18 -17
  143. package/dist/plugins/remote-env-e2b.d.ts +18 -4
  144. package/dist/plugins/remote-env-e2b.js +41 -42
  145. package/dist/plugins/remote-env-file-error.d.ts +2 -0
  146. package/dist/plugins/remote-env-file-error.js +1 -1
  147. package/dist/plugins/remote-env-host.d.ts +21 -8
  148. package/dist/plugins/remote-env-host.js +66 -70
  149. package/dist/plugins/remote-env-k8s.d.ts +11 -16
  150. package/dist/plugins/remote-env-k8s.js +61 -54
  151. package/dist/plugins/remote-env-local-docker.d.ts +29 -6
  152. package/dist/plugins/remote-env-local-docker.js +46 -59
  153. package/dist/plugins/remote-env-ssh.d.ts +16 -4
  154. package/dist/plugins/remote-env-ssh.js +72 -56
  155. package/dist/plugins/remote-shell.d.ts +100 -3
  156. package/dist/plugins/remote-shell.js +166 -2
  157. package/dist/plugins/retention-store-sql.d.ts +9 -6
  158. package/dist/plugins/retention-store-sql.js +7 -1
  159. package/dist/plugins/run-store-sql.d.ts +13 -3
  160. package/dist/plugins/run-store-sql.js +5 -0
  161. package/dist/plugins/schema-consistency.d.ts +15 -5
  162. package/dist/plugins/schema-consistency.js +14 -8
  163. package/dist/plugins/schema-drift-sentence.d.ts +27 -0
  164. package/dist/plugins/schema-drift-sentence.js +38 -0
  165. package/dist/plugins/session-fork.d.ts +54 -0
  166. package/dist/plugins/session-fork.js +38 -1
  167. package/dist/plugins/session-row-sql.d.ts +22 -0
  168. package/dist/plugins/session-row-sql.js +81 -0
  169. package/dist/plugins/session-store.d.ts +1 -1
  170. package/dist/plugins/store-backend.d.ts +1 -1
  171. package/dist/plugins/store-backend.js +19 -7
  172. package/dist/plugins/store-contracts.d.ts +25 -5
  173. package/dist/plugins/tidb-pool.d.ts +12 -7
  174. package/dist/plugins/tidb-pool.js +9 -3
  175. package/dist/plugins/tidb-session-store.d.ts +57 -26
  176. package/dist/plugins/tidb-session-store.js +118 -50
  177. package/dist/plugins/tool-result-store-sql.d.ts +3 -2
  178. package/dist/plugins/tool-result-store-sql.js +18 -10
  179. package/dist/project-memory.d.ts +9 -15
  180. package/dist/project-memory.js +5 -4
  181. package/dist/request-key-closure.js +1 -1
  182. package/dist/request-value-closure.d.ts +6 -7
  183. package/dist/request-value-closure.js +1 -3
  184. package/dist/run-local.d.ts +6 -0
  185. package/dist/run-local.js +24 -20
  186. package/dist/runs.d.ts +2 -1
  187. package/dist/runs.js +3 -1
  188. package/dist/security.d.ts +38 -12
  189. package/dist/security.js +8 -2
  190. package/dist/server-secret-env.d.ts +9 -5
  191. package/dist/session-children-retire.d.ts +27 -9
  192. package/dist/session-children-retire.js +9 -5
  193. package/dist/session-incarnation.d.ts +19 -9
  194. package/dist/session-incarnation.js +4 -2
  195. package/dist/session-row.d.ts +114 -5
  196. package/dist/session-row.js +55 -5
  197. package/dist/session-titler.d.ts +2 -2
  198. package/dist/task-a2a.d.ts +1 -1
  199. package/dist/task-cwd.d.ts +6 -1
  200. package/dist/task-mcp.d.ts +3 -3
  201. package/dist/tool-approval.d.ts +6 -0
  202. package/dist/tool-approval.js +8 -1
  203. package/dist/trace/project.d.ts +1 -0
  204. package/dist/trace/project.js +1 -0
  205. package/dist/trace/self-minted-wire.d.ts +111 -2
  206. package/dist/trace/self-minted-wire.js +38 -1
  207. package/dist/url-refusal.d.ts +1 -1
  208. package/dist/web-admin-client/apply-effective.d.ts +17 -3
  209. package/dist/web-admin-client/apply-effective.js +20 -10
  210. package/dist/web-admin-client/skills-mcp.js +3 -2
  211. package/dist/web-admin-client/types.d.ts +6 -0
  212. package/package.json +3 -3
  213. package/wire-changes/server@7.139.0.json +348 -0
  214. package/dist/http/device-placement.d.ts +0 -175
  215. package/dist/http/device-placement.js +0 -145
@@ -233,6 +233,18 @@ export const SELF_MINTED_WIRE = {
233
233
  supportsThinkingOff: { attr: "always", since: "7.138.0" },
234
234
  },
235
235
  },
236
+ sessionBackgroundRowKey: {
237
+ at: "GET /v1/sessions/:id/background rows[] 行键(<键> → 在场律)",
238
+ members: {
239
+ sessionId: { attr: "present-iff background agent row bound to a child session", since: "7.139.0" },
240
+ },
241
+ },
242
+ sessionsListRowKey: {
243
+ at: "GET /v1/sessions sessions[] 行键 = PATCH /v1/sessions/:id 200 体 = 409 conflict.session_row_changed currentRow(<键> → 在场律)",
244
+ members: {
245
+ rowTag: { attr: "present-iff the row can be written conditionally (the store has the row write primitive and the row carries an incarnation)", since: "7.139.0" },
246
+ },
247
+ },
236
248
  toolEndGateDispositionKey: {
237
249
  at: "tool_end gate.disposition 键(<臂>#<键> → 在场律)",
238
250
  members: {
@@ -283,6 +295,7 @@ export const SELF_MINTED_WIRE = {
283
295
  file_history_restore: { attr: "-", since: "7.133.0" },
284
296
  skills_disabled: { attr: "-", since: "7.133.0" },
285
297
  existing_session: { attr: "-", since: "7.133.0" },
298
+ fork_target: { attr: "-", since: "7.139.0" },
286
299
  scratchpad_root: { attr: "-", since: "7.133.0" },
287
300
  ask_answer: { attr: "-", since: "7.133.0" },
288
301
  policy_person_ask: { attr: "-", since: "7.133.0" },
@@ -441,6 +454,12 @@ export const SELF_MINTED_WIRE = {
441
454
  "POST /v1/tasks|/v1/tasks/stream|/v1/runs#限制侧名内带 *(agents[i].denyTools)": { attr: 200, since: "7.137.0" },
442
455
  "POST /v1/assistant/tasks/:id/plan_review#checkpointId_not_current(体带的门身份不是该会话此刻待决的 plan 门;体 approval_stale + currentPending { checkpointId }?;不落决断、零状态改动)": { attr: 409, since: "7.137.0" },
443
456
  "POST /v1/assistant/tasks/:id/plan_review#checkpointId_current(体带当前门的身份;受理形与不带键同)": { attr: 200, since: "7.137.0" },
457
+ "POST /v1/tasks|/v1/tasks/stream|/v1/runs#rewindFiles(新提交;体 request.body_shape + unknownKeys [rewindFiles])": { attr: 400, since: "7.139.0" },
458
+ "POST /v1/side-query#uncoded_error_with_preflight_prefix(没有引擎码、英文开头与前缀表同形的错误;体 internal.error)": { attr: 500, since: "7.139.0" },
459
+ "PATCH /v1/sessions/:id#mirror_row(只读镜像行上的写,带不带 expectedRowTag;体 conflict.session_mirror + forkPath)": { attr: 409, since: "7.139.0" },
460
+ "PATCH /v1/sessions/:id#owner_changed_after_gate(门那一读之后同一会话的属主被改;体 not_found.session)": { attr: 404, since: "7.139.0" },
461
+ "PATCH /v1/sessions/:id#expectedRowTag_stale(行已不在那只标签上;体 conflict.session_row_changed + currentRow)": { attr: 409, since: "7.139.0" },
462
+ "PATCH /v1/sessions/:id#expectedRowTag_current(行仍在那只标签上;体 = 列表行)": { attr: 200, since: "7.139.0" },
444
463
  },
445
464
  },
446
465
  refusalSentenceForm: {
@@ -471,6 +490,10 @@ export const SELF_MINTED_WIRE = {
471
490
  "400 request.field_invalid#plan_review.checkpointId.not_non_empty_string": { attr: "checkpointId must be a non-empty string (the identity of the plan gate you decided on: …)", since: "7.137.0" },
472
491
  "400 request.field_invalid#plan_review.checkpointId.too_large": { attr: "checkpointId too large (max <n> chars)", since: "7.137.0" },
473
492
  "400 request.body_shape#/decide.checkpointId(落 unsupportedKeys)": { attr: "unsupported (a body field of POST /v1/assistant/tasks/:id/plan_review — send it there, this door never reads it): checkpointId", since: "7.137.0" },
493
+ "400 request.body_shape#PATCH /v1/sessions/:id": { attr: "the body must be a JSON object carrying at least one of `title` and `pinned` (and, optionally, `expectedRowTag`), and nothing else", since: "7.139.0" },
494
+ "400 request.field_invalid#PATCH /v1/sessions/:id.expectedRowTag": { attr: "expectedRowTag must be the `rowTag` string a session list row carries (43 characters: letters, digits, `-` and `_`)", since: "7.139.0" },
495
+ "409 conflict.session_mirror#PATCH /v1/sessions/:id": { attr: "this session is a read-only mirror of a session whose writer is elsewhere — it cannot be renamed or pinned here; fork it (forkPath) to continue here; nothing was written", since: "7.139.0" },
496
+ "409 conflict.session_row_changed#PATCH /v1/sessions/:id": { attr: "the session row changed since the rowTag you sent was read — nothing was written; currentRow is the row as it stands now: decide again, then send its rowTag", since: "7.139.0" },
474
497
  },
475
498
  },
476
499
  decisionBodyKey: {
@@ -479,6 +502,14 @@ export const SELF_MINTED_WIRE = {
479
502
  "POST /v1/assistant/tasks/:id/plan_review#checkpointId": { attr: "optional;non-empty-string≤128;not-current⇒409 approval_stale;direct-door:signed-envelope-ext", since: "7.137.0" },
480
503
  },
481
504
  },
505
+ sessionRowWriteKey: {
506
+ at: "PATCH /v1/sessions/:id 体受理键与 409 拒体键(<面>#<键> → 读法 / 在场律;只登本版新增的)",
507
+ members: {
508
+ "body#expectedRowTag": { attr: "optional;43×[A-Za-z0-9_-] else 400 request.field_invalid;alone 400 request.body_shape;stale⇒409 conflict.session_row_changed", since: "7.139.0" },
509
+ "409 conflict.session_row_changed#currentRow": { attr: "always", since: "7.139.0" },
510
+ "409 conflict.session_mirror#forkPath": { attr: "always", since: "7.139.0" },
511
+ },
512
+ },
482
513
  approvalStaleBodyKey: {
483
514
  at: "409 approval_stale 拒体(<端点>#<键> → 在场律)",
484
515
  members: {
@@ -552,7 +583,13 @@ export const SELF_MINTED_WIRE = {
552
583
  "GET /v1/config/catalog#rows[WORKSPACE_SNAPSHOT_BUCKET].semantics": { attr: "boot-checks-bucket;runtime-latest-no-such-bucket-fails-run", since: "7.136.0" },
553
584
  "GET /v1/config/catalog#rows[WORKSPACE_SNAPSHOT_PREFIX].semantics": { attr: "multi-segment-prefix;bad-segment-refuses-boot", since: "7.136.0" },
554
585
  "GET /v1/config/catalog#rows[WORKSPACE_SNAPSHOT_PREFIX].derivedDefaultNote": { attr: "absent=>kata", since: "7.136.0" },
555
- "GET /v1/config/catalog#rows[K8S_SANDBOX_ENV].semantics": { attr: "values-only-in-the-pod-own-secret;role-needs-secrets-create;denied-refuses-boot", since: "7.137.0" },
586
+ "GET /v1/config/catalog#rows[K8S_SANDBOX_ENV].semantics": { attr: "values-only-in-the-pod-own-secret;role-needs-secrets-create;denied-refuses-boot;own-credential-name-refuses-boot", since: "7.139.0" },
587
+ "GET /v1/config/catalog#rows[K8S_NAMESPACE].semantics": { attr: "required-no-default;absent-or-blank-refuses-boot", since: "7.139.0" },
588
+ "GET /v1/config/catalog#rows[E2B_SANDBOX_ENV].semantics": { attr: "own-credential-name-refuses-boot", since: "7.139.0" },
589
+ "GET /v1/config/catalog#rows[DOCKER_SANDBOX_ENV].semantics": { attr: "own-credential-name-refuses-boot", since: "7.139.0" },
590
+ "GET /v1/config/catalog#rows[CONFIG_PROVIDER].semantics": { attr: "remote-without-center-url-refuses-boot", since: "7.139.0" },
591
+ "GET /v1/config/catalog#rows[RETENTION_MODE].semantics": { attr: "enforce-without-horizon-or-cadence-refuses-boot", since: "7.139.0" },
592
+ "GET /v1/config/catalog#rows[RETENTION_SWEEP_INTERVAL_SEC].semantics": { attr: "cadence-without-horizon-refuses-boot", since: "7.139.0" },
556
593
  "GET /v1/sessions/:id/mcp#servers[].error": { attr: "exit-seat:mcp-remote-text(engine-mark=masked-value)+truncate:200", since: "7.138.0" },
557
594
  "POST /v1/sessions/:id/mcp/reconnect#reason|status.error|listingIncomplete.error": { attr: "exit-seat:mcp-remote-text(engine-mark=masked-value)+truncate:200", since: "7.138.0" },
558
595
  "GET /v1/config/catalog#rows[MODEL_VISION].semantics": { attr: "names-engine-notice:model.capability_downgraded", since: "7.137.0" },
@@ -12,7 +12,7 @@
12
12
  * 拒句从源头不含解析记号 —— 判官只给规则词,值只经本模块的展示律出现。
13
13
  *
14
14
  * ## 读者
15
- * 中心基址三席 + 公告地址 + 请求期 `centerFetch`(`web-admin-client/center-request.ts` `pathBaseUrlRefusal`:禁 userinfo / query / fragment)·
15
+ * 中心基址三席 + 公告地址 + 记忆同步中心基址 `MEMORY_SYNC_URL` + 请求期 `centerFetch`(`web-admin-client/center-request.ts` `pathBaseUrlRefusal`:禁 userinfo / query / fragment)·
16
16
  * 续签 issuer(只问形)· 模型路由三键(`model-route-url.ts`:禁 userinfo / fragment,query 照收)· `MEMORY_EMBEDDER_ENDPOINT` 与
17
17
  * `A2A_SERVE_URL`(禁 userinfo)· `SANDBOX_PKG_SOURCE=custom` 六只地址(形 + 带凭据,后者的判官是契约包根的 `findUrlCredential`,拒句经 {@link buildUrlCredentialRefusal})。
18
18
  * 「scheme 只有判官与展示铸点读」由 `test/config-url-display-safe.test.ts` 的读者普查门钉住。
@@ -94,9 +94,11 @@ export declare function withModelPlaneOf<E extends EffectiveConfig>(target: E, s
94
94
  */
95
95
  export declare function fullyLandedForLkg(read: ConfigCandidateRead, report: ApplyReport | undefined): boolean;
96
96
  /**
97
- * [ref]:组拒码 → 铸它的那条模型面不变量 —— **以码为键**(组拒码闭集的属主是 settings-schema `MODEL_PLANE_REFUSAL_CODES`;那边加一个码
98
- * ⇒ 本表缺键 ⇒ 本仓 tsc 红)。模型面 stage 的组拒按**码**铸(码是判决那刻的数据),不变量 id 由本表派生 —— 一个 id 两个码
99
- * (`model-route-endpoint`)时码不可能从 id 反推,反过来查才是全函数。
97
+ * [ref]:组拒码 → 铸它的那条模型面不变量 —— **以码为键**。组拒码闭集的属主是 settings-schema `MODEL_PLANE_REFUSAL_CODES`,每个码恰有**一个铸码方**,
98
+ * 分两本账(下面两个表 + 三道编译门;那边加一个码而这两本都没收 ⇒ 本仓 tsc 红):
99
+ * · 本表 = **本仓模型面 stage 自己铸**的码 → 铸它的不变量。模型面 stage 的组拒按**码**铸(码是判决那刻的数据),不变量 id 由本表派生 —— 一个 id 两个码
100
+ * (`model-route-endpoint`)时码不可能从 id 反推,反过来查才是全函数;
101
+ * · {@link ENGINE_MINTED_PLANE_REFUSAL_CODES} = 契约包出码、执法者是本仓但**今天未执法**的码(名字里的 ENGINE 沿契约包的词义 = worker,即本仓),本仓 stage 现在不铸。
100
102
  */
101
103
  export declare const PLANE_REFUSAL_INVARIANT_OF: {
102
104
  readonly "config.default_model_missing": "default-model-resolvable";
@@ -104,6 +106,18 @@ export declare const PLANE_REFUSAL_INVARIANT_OF: {
104
106
  readonly "config.model_route_endpoint_missing": "model-route-endpoint";
105
107
  readonly "config.gateway_fallback_without_primary": "model-route-endpoint";
106
108
  };
109
+ /**
110
+ * 契约包出码、执法者是本仓但今天**未执法**的两只组拒码:本地配置腿上「管模型面的目录会顶替已声明的 env 表、决定不是 `replaced`」那道闸,与「每个任务都要解的 summarize 落不到可服务条目」的不变量。
111
+ *
112
+ * 词义:settings-schema 发布说明里的「engine / 引擎一侧」指**本仓(worker)**,不是 `@sema-agent/core` —— 这两码要的全部输入(本地配置腿、env 表、模型面 stage 与组拒口)只在本仓,core 里没有读
113
+ * `MODEL_ID` / `config.d` 的地方、也没有组拒码。(契约包自己有几处把同一个词写成 core 7.58.0,那是它的叫法错。)所以本仓 stage 现在没有对应的不变量、不铸这两个码,不是因为「归引擎」,而是**还没做**,两码各自候什么:
114
+ * · `CATALOG_REPLACES_ENV_MODELS_CODE`:执法是一整组跨仓件 —— 开机迁移 SS-M11(铸决定文档)· 本地腿每拍读决定(读数身份进候选的 etag)· 目录信任判官走根级文档 · 命令行 / 桌面 / 客户端核心三个写者先接契约包的计划助手;
115
+ * 候设计票。在那之前,候选目录管着模型面而 env 表也声明了时,仍照旧由目录服务(与升级前逐位同)。
116
+ * · `SUMMARIZE_MODEL_MISSING_CODE`:码的前提是「summarize 落不到可服务条目 ⇒ 采纳后每个任务都被拒」,而本仓所钉 core 7.59.0 起非严格座位(summarize 在内)点名目录里没有的词时读作未设、沿自己的回落链走
117
+ * (summarize 的链是 → default,即回落缺省模型)并通告 `model.role_defaulted`;链上没有可解的模型才拒 —— 前提与所钉 core 相抵,候上游(settings-schema / core)重定义或退役这个码;在那之前 summarize 角色绑到不可用条目时仍是角色绑定那一行 warn(`ROLE_BINDING_UNAVAILABLE_HINT`),不是组拒。
118
+ * 两码开始被铸之后,它们进 `/health.modelRefusals.plane` 的座位是**另案设计**(现在没有座:见 `model-plane-face.ts` 对「装配期被引擎整份拒收」的披露),不在这张表里偷铸一个不变量替它占位。
119
+ */
120
+ export declare const ENGINE_MINTED_PLANE_REFUSAL_CODES: readonly ["config.catalog_replaces_env_models", "config.summarize_model_missing"];
107
121
  /**
108
122
  * [ref] —— **「无中心配置」档的候选**:中心凭证换人时,server 把在用的中心配置降到这一档({@link applyEffective} 吃它,和吃任何候选走同一条 stage → swap → commit)。
109
123
  * 它的意思是「**撤回**中心配置」—— 中心下发的每个热面回 env 底:
@@ -1,8 +1,8 @@
1
- import { expandTiers, resolveTaskModel as coreResolveTaskModel } from "@sema-agent/core";
2
- import { WEB_ADMIN_ENV, narrowAtMention, resolveActiveTiers, resolveCatalogDefaultModel } from "@sema-agent/settings-schema";
1
+ import { expandTiers, modelOriginOf, resolveTaskModel as coreResolveTaskModel } from "@sema-agent/core";
2
+ import { CATALOG_REPLACES_ENV_MODELS_CODE, SUMMARIZE_MODEL_MISSING_CODE, WEB_ADMIN_ENV, narrowAtMention, resolveActiveTiers, resolveCatalogDefaultModel } from "@sema-agent/settings-schema";
3
3
  import { modelKeyPoison } from "../key-resolver.js";
4
4
  import { buildEnvModelIdNotServedNotice, mintCapabilityKeys, readAtMention, servedModelTableLeg } from "../model-select.js";
5
- import { applyAutoCompactWindow, buildModelCostKey, parseAutonomy, unmatchableToolNamesRefusal } from "../config.js";
5
+ import { applyAutoCompactWindow, buildModelCostKey, ownCredentialHitsInForce, parseAutonomy, unmatchableToolNamesRefusal } from "../config.js";
6
6
  import { NAME_TABLE_BEHAVIOR } from "../namespaced-rule-name.js";
7
7
  import { buildModelCompat, readModelCompat } from "../model-compat.js";
8
8
  import { buildModelHeadersKey } from "../model-entry-headers.js";
@@ -118,7 +118,7 @@ export function applyEffective(config, eff, logger, opts) {
118
118
  }
119
119
  const mp = staged.modelPlaneGroup.stages.models;
120
120
  if (mp !== undefined) {
121
- declareCandidateWithheldEnv(mp.modelApiKeyEnv, staged.version);
121
+ declareCandidateWithheldEnv(config, mp.modelApiKeyEnv, staged.version);
122
122
  if (opts.swapPlane !== undefined) {
123
123
  try {
124
124
  opts.swapPlane({ models: mp.models, tiers: mp.activeTiers });
@@ -171,17 +171,25 @@ export function applyEffective(config, eff, logger, opts) {
171
171
  logger?.info("web_admin_projects", { projects: Object.keys(staged.projects) });
172
172
  return true;
173
173
  }
174
- function declareCandidateWithheldEnv(modelApiKeyEnv, version) {
174
+ function declareCandidateWithheldEnv(seats, modelApiKeyEnv, version) {
175
+ const entries = Object.entries(modelApiKeyEnv)
176
+ .map(([model, envName]) => `${model}→${envName}`)
177
+ .join(", ");
175
178
  try {
176
179
  declareServerWithheldEnv(modelApiKeyEnv);
177
180
  }
178
181
  catch (err) {
179
- const entries = Object.entries(modelApiKeyEnv)
180
- .map(([model, envName]) => `${model}→${envName}`)
181
- .join(", ");
182
182
  throw new Error(`model catalog (effective v${version}): a model entry's apiKeyEnv names a variable the engine cannot withhold from model-driven shells — ` +
183
183
  `the candidate is refused whole and the current generation keeps serving; fix that entry's apiKeyEnv (entries: ${entries}). Engine: ${err instanceof Error ? err.message : String(err)}`);
184
184
  }
185
+ const handedOn = ownCredentialHitsInForce(seats);
186
+ if (handedOn.length === 0)
187
+ return;
188
+ withdrawServerWithheldEnv();
189
+ throw new Error(`model catalog (effective v${version}): a model entry's apiKeyEnv names a variable a name-list env knob hands on — ` +
190
+ handedOn.map((h) => `env ${h.knob} hands on ${h.name}, which this candidate makes ${h.problem}`).join("; ") +
191
+ `; or point that entry's apiKeyEnv at a variable no name list hands on. The name lists are read at boot (changing one takes a restart); ` +
192
+ `the candidate is refused whole and the current generation keeps serving (entries: ${entries}).`);
185
193
  }
186
194
  function commitStaged(config, staged) {
187
195
  const mp = staged.modelPlaneGroup.stages.models;
@@ -240,13 +248,14 @@ export const PLANE_REFUSAL_INVARIANT_OF = {
240
248
  "config.model_route_endpoint_missing": "model-route-endpoint",
241
249
  "config.gateway_fallback_without_primary": "model-route-endpoint",
242
250
  };
251
+ export const ENGINE_MINTED_PLANE_REFUSAL_CODES = [CATALOG_REPLACES_ENV_MODELS_CODE, SUMMARIZE_MODEL_MISSING_CODE];
243
252
  function modelPlaneGroupReport(group) {
244
253
  return {
245
254
  applied: MODEL_PLANE_DOMAINS.flatMap((d) => (group.stages[d] !== undefined ? MODEL_PLANE_SURFACES[d] : [])),
246
255
  ...(group.rejected !== undefined ? { rejected: { keys: group.rejected.keys, reason: group.rejected.reason } } : {}),
247
256
  };
248
257
  }
249
- const ROLE_BINDING_UNAVAILABLE_HINT = "tasks resolving this role fail: alias/tier expansion cannot mint this name; the engine refuses it loud — bind the role to a usable model, or make the entry usable (see the entry's own warn)";
258
+ const ROLE_BINDING_UNAVAILABLE_HINT = "alias/tier expansion cannot mint this name, so the engine does not hold it: a strict seat (default, classifier) refuses the task loud; any other role reads as unset and falls back along its own chain with a model.role_defaulted notice (refused only when nothing on that chain resolves) — bind the role to a usable model, or make the entry usable (see the entry's own warn)";
250
259
  export const NO_CENTER_EFFECTIVE = deepFreeze({ version: 0, updatedAt: "", models: { models: [], roles: {} }, mcp: { servers: [] } });
251
260
  export const isNoCenterEffective = (eff) => eff === NO_CENTER_EFFECTIVE;
252
261
  function deepFreeze(v) {
@@ -636,7 +645,8 @@ function engineDefaultOfSelect(select, models, activeTiers) {
636
645
  catch (err) {
637
646
  return { unresolved: err instanceof Error ? err.message : String(err) };
638
647
  }
639
- const name = Object.keys(models).find((n) => models[n] === picked);
648
+ const origin = modelOriginOf(picked);
649
+ const name = Object.keys(models).find((n) => models[n] === origin);
640
650
  return name !== undefined ? { name } : { unresolved: "the engine picked a model object that is not an entry of the usable catalog" };
641
651
  }
642
652
  export function logEffectiveDiff(config, eff, logger) {
@@ -174,12 +174,13 @@ export function resolveMcpServers(mcp, desk, rosterLease, logger) {
174
174
  continue;
175
175
  }
176
176
  const sessionMetaKey = metaKey.key === undefined ? {} : { sessionMetaKey: metaKey.key };
177
+ const startupTimeout = s.startupTimeoutMs === undefined ? {} : { startupTimeoutMs: s.startupTimeoutMs };
177
178
  if (s.transport.kind === "stdio") {
178
179
  const env = resolveRefs(s.transport.envRefs, s.name, "env", logger);
179
180
  if (env === null)
180
181
  continue;
181
182
  const draft = {
182
- spec: { name: s.name, transport: { kind: "stdio", command: s.transport.command, args: s.transport.args }, ...allow, ...elicit, ...contentOrigin, ...source, ...toolFaces, ...toolAxes, ...sessionMetaKey },
183
+ spec: { name: s.name, transport: { kind: "stdio", command: s.transport.command, args: s.transport.args }, ...allow, ...elicit, ...contentOrigin, ...source, ...toolFaces, ...toolAxes, ...sessionMetaKey, ...startupTimeout },
183
184
  pieces: env,
184
185
  };
185
186
  out.push({ scenarios: s.scenarios ?? [], spec: mintDeclaration(desk, draft, rosterLease) });
@@ -191,7 +192,7 @@ export function resolveMcpServers(mcp, desk, rosterLease, logger) {
191
192
  if (withholdsMcpAssertionHeader(s.transport.assertionHeader))
192
193
  noteMcpAssertionHeaderNotSent(logger, s.name);
193
194
  const draft = {
194
- spec: { name: s.name, transport: { kind: "http", url: s.transport.url, ...(s.transport.principalHeader ? { principalHeader: s.transport.principalHeader } : {}) }, ...allow, ...elicit, ...contentOrigin, ...source, ...toolFaces, ...toolAxes, ...sessionMetaKey },
195
+ spec: { name: s.name, transport: { kind: "http", url: s.transport.url, ...(s.transport.principalHeader ? { principalHeader: s.transport.principalHeader } : {}) }, ...allow, ...elicit, ...contentOrigin, ...source, ...toolFaces, ...toolAxes, ...sessionMetaKey, ...startupTimeout },
195
196
  pieces: headers,
196
197
  };
197
198
  out.push({ scenarios: s.scenarios ?? [], spec: mintDeclaration(desk, draft, rosterLease) });
@@ -175,6 +175,12 @@ export interface CenterMcpServer {
175
175
  * 承载形 `unknown`(与 {@link CenterMcpServer.toolAxes} 同姿):判官只有引擎根导出的 `judgeSessionMetaKey`(`resolveMcpServers` 在铸 spec 那一刻问它;坏形整条 server 不进)。
176
176
  */
177
177
  sessionMetaKey?: unknown;
178
+ /**
179
+ * core 7.52.0 `McpServerSpec.startupTimeoutMs`(settings-schema 14.8.0 起解析透明)—— 这台服务器握手(连接 + initialize)与首次工具列举各带的启动界(整数毫秒),缺席读进程级缺省界;只界启动阶段,不动单次调用的超时。
180
+ * 承载形 `unknown`(与 {@link CenterMcpServer.sessionMetaKey} 同姿):是不是数、整数性、范围只有一只判官 —— 引擎根导出的 `mcpStartupTimeoutMs`,在**拨号时**判,
181
+ * 不合 ⇒ 拒这一台服务器的拨号(兄弟照挂)、点名 `config.mcp_startup_timeout_invalid`;本仓只承运,不判(判了就是第二只判官)。
182
+ */
183
+ startupTimeoutMs?: unknown;
178
184
  transport: {
179
185
  kind: "stdio";
180
186
  command: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/server",
3
- "version": "7.138.0",
3
+ "version": "7.139.0",
4
4
  "description": "Sema Server — the server/API implementation layer for Sema, wiring core, registry, model providers, and cloud agent execution. Built on @sema-agent/core.",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",
@@ -69,8 +69,8 @@
69
69
  "build:binary:run-local:darwin-arm64": "bun build --compile --target=bun-darwin-arm64 src/run-local.ts --outfile dist/run-local-darwin-arm64"
70
70
  },
71
71
  "dependencies": {
72
- "@sema-agent/core": "7.59.0",
73
- "@sema-agent/settings-schema": "14.7.0",
72
+ "@sema-agent/core": "7.60.0",
73
+ "@sema-agent/settings-schema": "15.1.0",
74
74
  "e2b": "^2.28.0",
75
75
  "libsodium-wrappers": "^0.8.4",
76
76
  "mysql2": "^3.22.4",
@@ -0,0 +1,348 @@
1
+ {
2
+ "repo": "server",
3
+ "version": "7.139.0",
4
+ "from": "v7.138.0",
5
+ "fromCommit": "8b41148fef6d0d0c316c0e963efec70714a24e98",
6
+ "to": "v7.139.0",
7
+ "generator": "scripts/wire-changes-server.mjs",
8
+ "sources": [
9
+ "docs/ASSISTANT-WIRE-CONTRACT.md#A.1",
10
+ "docs/ASSISTANT-WIRE-CONTRACT.md#A.1b",
11
+ "docs/ASSISTANT-WIRE-CONTRACT.md#B.1",
12
+ "docs/ASSISTANT-WIRE-CONTRACT.md#B.1a",
13
+ "docs/ASSISTANT-WIRE-CONTRACT.md#B.2b",
14
+ "docs/ASSISTANT-WIRE-CONTRACT.md#B.2",
15
+ "docs/ASSISTANT-WIRE-CONTRACT.md#D.3",
16
+ "src/trace/wire-projection-faces.ts",
17
+ "src/trace/self-minted-wire.ts",
18
+ "node_modules/@sema-agent/core/wire-changes"
19
+ ],
20
+ "added": [
21
+ {
22
+ "id": "A1",
23
+ "source": "errorCode",
24
+ "member": "conflict.fork_id_taken",
25
+ "text": "附录 A.1 / A.1b 错误码新增 `conflict.fork_id_taken`(状态码 409)"
26
+ },
27
+ {
28
+ "id": "A2",
29
+ "source": "errorCode",
30
+ "member": "conflict.fork_in_progress",
31
+ "text": "附录 A.1 / A.1b 错误码新增 `conflict.fork_in_progress`(状态码 409)"
32
+ },
33
+ {
34
+ "id": "A3",
35
+ "source": "errorCode",
36
+ "member": "conflict.session_mirror",
37
+ "text": "附录 A.1 / A.1b 错误码新增 `conflict.session_mirror`(状态码 409)"
38
+ },
39
+ {
40
+ "id": "A4",
41
+ "source": "errorCode",
42
+ "member": "conflict.session_row_changed",
43
+ "text": "附录 A.1 / A.1b 错误码新增 `conflict.session_row_changed`(状态码 409)"
44
+ },
45
+ {
46
+ "id": "A5",
47
+ "source": "errorCode",
48
+ "member": "conflict.session_writer",
49
+ "text": "附录 A.1 / A.1b 错误码新增 `conflict.session_writer`(状态码 409)"
50
+ },
51
+ {
52
+ "id": "A6",
53
+ "source": "errorCode",
54
+ "member": "execution_lane.not_served",
55
+ "text": "附录 A.1 / A.1b 错误码新增 `execution_lane.not_served`(状态码 409)"
56
+ },
57
+ {
58
+ "id": "A7",
59
+ "source": "errorCode",
60
+ "member": "execution_lane.tree_bound",
61
+ "text": "附录 A.1 / A.1b 错误码新增 `execution_lane.tree_bound`(状态码 409)"
62
+ },
63
+ {
64
+ "id": "A8",
65
+ "source": "errorCode",
66
+ "member": "state.fork_target_unsettled",
67
+ "text": "附录 A.1 / A.1b 错误码新增 `state.fork_target_unsettled`(状态码 503)"
68
+ },
69
+ {
70
+ "id": "A9",
71
+ "source": "selfMinted.endpointFaceStatus",
72
+ "member": "PATCH /v1/sessions/:id#expectedRowTag_current(行仍在那只标签上;体 = 列表行)",
73
+ "text": "自铸 逐端点应答面 → 状态(<端点>#<面> → 状态;只登记本版改了状态的面) 新增 `PATCH /v1/sessions/:id#expectedRowTag_current(行仍在那只标签上;体 = 列表行)`(属性 200;since 7.139.0 = 本版新上 wire)"
74
+ },
75
+ {
76
+ "id": "A10",
77
+ "source": "selfMinted.endpointFaceStatus",
78
+ "member": "PATCH /v1/sessions/:id#expectedRowTag_stale(行已不在那只标签上;体 conflict.session_row_changed + currentRow)",
79
+ "text": "自铸 逐端点应答面 → 状态(<端点>#<面> → 状态;只登记本版改了状态的面) 新增 `PATCH /v1/sessions/:id#expectedRowTag_stale(行已不在那只标签上;体 conflict.session_row_changed + currentRow)`(属性 409;since 7.139.0 = 本版新上 wire)"
80
+ },
81
+ {
82
+ "id": "A11",
83
+ "source": "selfMinted.endpointFaceStatus",
84
+ "member": "PATCH /v1/sessions/:id#mirror_row(只读镜像行上的写,带不带 expectedRowTag;体 conflict.session_mirror + forkPath)",
85
+ "text": "自铸 逐端点应答面 → 状态(<端点>#<面> → 状态;只登记本版改了状态的面) 新增 `PATCH /v1/sessions/:id#mirror_row(只读镜像行上的写,带不带 expectedRowTag;体 conflict.session_mirror + forkPath)`(属性 409;since 7.139.0 = 本版新上 wire)"
86
+ },
87
+ {
88
+ "id": "A12",
89
+ "source": "selfMinted.endpointFaceStatus",
90
+ "member": "PATCH /v1/sessions/:id#owner_changed_after_gate(门那一读之后同一会话的属主被改;体 not_found.session)",
91
+ "text": "自铸 逐端点应答面 → 状态(<端点>#<面> → 状态;只登记本版改了状态的面) 新增 `PATCH /v1/sessions/:id#owner_changed_after_gate(门那一读之后同一会话的属主被改;体 not_found.session)`(属性 404;since 7.139.0 = 本版新上 wire)"
92
+ },
93
+ {
94
+ "id": "A13",
95
+ "source": "selfMinted.endpointFaceStatus",
96
+ "member": "POST /v1/side-query#uncoded_error_with_preflight_prefix(没有引擎码、英文开头与前缀表同形的错误;体 internal.error)",
97
+ "text": "自铸 逐端点应答面 → 状态(<端点>#<面> → 状态;只登记本版改了状态的面) 新增 `POST /v1/side-query#uncoded_error_with_preflight_prefix(没有引擎码、英文开头与前缀表同形的错误;体 internal.error)`(属性 500;since 7.139.0 = 本版新上 wire)"
98
+ },
99
+ {
100
+ "id": "A14",
101
+ "source": "selfMinted.endpointFaceStatus",
102
+ "member": "POST /v1/tasks|/v1/tasks/stream|/v1/runs#rewindFiles(新提交;体 request.body_shape + unknownKeys [rewindFiles])",
103
+ "text": "自铸 逐端点应答面 → 状态(<端点>#<面> → 状态;只登记本版改了状态的面) 新增 `POST /v1/tasks|/v1/tasks/stream|/v1/runs#rewindFiles(新提交;体 request.body_shape + unknownKeys [rewindFiles])`(属性 400;since 7.139.0 = 本版新上 wire)"
104
+ },
105
+ {
106
+ "id": "A15",
107
+ "source": "selfMinted.fieldConflictKind",
108
+ "member": "fork_target",
109
+ "text": "自铸 400 request.field_conflict detail.kind 新增 `fork_target`(属性 -;since 7.139.0 = 本版新上 wire)"
110
+ },
111
+ {
112
+ "id": "A16",
113
+ "source": "selfMinted.refusalSentenceForm",
114
+ "member": "400 request.body_shape#PATCH /v1/sessions/:id",
115
+ "text": "自铸 拒体 message 的句型(<码>#<座> → 句型骨架;码 / 状态 / 机读位不变) 新增 `400 request.body_shape#PATCH /v1/sessions/:id`(属性 the body must be a JSON object carrying at least one of `title` and `pinned` (and, optionally, `expectedRowTag`), and nothing else;since 7.139.0 = 本版新上 wire)"
116
+ },
117
+ {
118
+ "id": "A17",
119
+ "source": "selfMinted.refusalSentenceForm",
120
+ "member": "400 request.field_invalid#PATCH /v1/sessions/:id.expectedRowTag",
121
+ "text": "自铸 拒体 message 的句型(<码>#<座> → 句型骨架;码 / 状态 / 机读位不变) 新增 `400 request.field_invalid#PATCH /v1/sessions/:id.expectedRowTag`(属性 expectedRowTag must be the `rowTag` string a session list row carries (43 characters: letters, digits, `-` and `_`);since 7.139.0 = 本版新上 wire)"
122
+ },
123
+ {
124
+ "id": "A18",
125
+ "source": "selfMinted.refusalSentenceForm",
126
+ "member": "409 conflict.session_mirror#PATCH /v1/sessions/:id",
127
+ "text": "自铸 拒体 message 的句型(<码>#<座> → 句型骨架;码 / 状态 / 机读位不变) 新增 `409 conflict.session_mirror#PATCH /v1/sessions/:id`(属性 this session is a read-only mirror of a session whose writer is elsewhere — it cannot be renamed or pinned here; fork it (forkPath) to continue here; nothing was written;since 7.139.0 = 本版新上 wire)"
128
+ },
129
+ {
130
+ "id": "A19",
131
+ "source": "selfMinted.refusalSentenceForm",
132
+ "member": "409 conflict.session_row_changed#PATCH /v1/sessions/:id",
133
+ "text": "自铸 拒体 message 的句型(<码>#<座> → 句型骨架;码 / 状态 / 机读位不变) 新增 `409 conflict.session_row_changed#PATCH /v1/sessions/:id`(属性 the session row changed since the rowTag you sent was read — nothing was written; currentRow is the row as it stands now: decide again, then send its rowTag;since 7.139.0 = 本版新上 wire)"
134
+ },
135
+ {
136
+ "id": "A20",
137
+ "source": "selfMinted.sessionBackgroundRowKey",
138
+ "member": "sessionId",
139
+ "text": "自铸 GET /v1/sessions/:id/background rows[] 行键(<键> → 在场律) 新增 `sessionId`(属性 present-iff background agent row bound to a child session;since 7.139.0 = 本版新上 wire)"
140
+ },
141
+ {
142
+ "id": "A21",
143
+ "source": "selfMinted.sessionRowWriteKey",
144
+ "member": "409 conflict.session_mirror#forkPath",
145
+ "text": "自铸 PATCH /v1/sessions/:id 体受理键与 409 拒体键(<面>#<键> → 读法 / 在场律;只登本版新增的) 新增 `409 conflict.session_mirror#forkPath`(属性 always;since 7.139.0 = 本版新上 wire)"
146
+ },
147
+ {
148
+ "id": "A22",
149
+ "source": "selfMinted.sessionRowWriteKey",
150
+ "member": "409 conflict.session_row_changed#currentRow",
151
+ "text": "自铸 PATCH /v1/sessions/:id 体受理键与 409 拒体键(<面>#<键> → 读法 / 在场律;只登本版新增的) 新增 `409 conflict.session_row_changed#currentRow`(属性 always;since 7.139.0 = 本版新上 wire)"
152
+ },
153
+ {
154
+ "id": "A23",
155
+ "source": "selfMinted.sessionRowWriteKey",
156
+ "member": "body#expectedRowTag",
157
+ "text": "自铸 PATCH /v1/sessions/:id 体受理键与 409 拒体键(<面>#<键> → 读法 / 在场律;只登本版新增的) 新增 `body#expectedRowTag`(属性 optional;43×[A-Za-z0-9_-] else 400 request.field_invalid;alone 400 request.body_shape;stale⇒409 conflict.session_row_changed;since 7.139.0 = 本版新上 wire)"
158
+ },
159
+ {
160
+ "id": "A24",
161
+ "source": "selfMinted.sessionsListRowKey",
162
+ "member": "rowTag",
163
+ "text": "自铸 GET /v1/sessions sessions[] 行键 = PATCH /v1/sessions/:id 200 体 = 409 conflict.session_row_changed currentRow(<键> → 在场律) 新增 `rowTag`(属性 present-iff the row can be written conditionally (the store has the row write primitive and the row carries an incarnation);since 7.139.0 = 本版新上 wire)"
164
+ },
165
+ {
166
+ "id": "A25",
167
+ "source": "selfMinted.wireValueRule",
168
+ "member": "GET /v1/config/catalog#rows[CONFIG_PROVIDER].semantics",
169
+ "text": "自铸 出口值变换(<端点>#<键> → 变换) 新增 `GET /v1/config/catalog#rows[CONFIG_PROVIDER].semantics`(属性 remote-without-center-url-refuses-boot;since 7.139.0 = 本版新上 wire)"
170
+ },
171
+ {
172
+ "id": "A26",
173
+ "source": "selfMinted.wireValueRule",
174
+ "member": "GET /v1/config/catalog#rows[DOCKER_SANDBOX_ENV].semantics",
175
+ "text": "自铸 出口值变换(<端点>#<键> → 变换) 新增 `GET /v1/config/catalog#rows[DOCKER_SANDBOX_ENV].semantics`(属性 own-credential-name-refuses-boot;since 7.139.0 = 本版新上 wire)"
176
+ },
177
+ {
178
+ "id": "A27",
179
+ "source": "selfMinted.wireValueRule",
180
+ "member": "GET /v1/config/catalog#rows[E2B_SANDBOX_ENV].semantics",
181
+ "text": "自铸 出口值变换(<端点>#<键> → 变换) 新增 `GET /v1/config/catalog#rows[E2B_SANDBOX_ENV].semantics`(属性 own-credential-name-refuses-boot;since 7.139.0 = 本版新上 wire)"
182
+ },
183
+ {
184
+ "id": "A28",
185
+ "source": "selfMinted.wireValueRule",
186
+ "member": "GET /v1/config/catalog#rows[K8S_NAMESPACE].semantics",
187
+ "text": "自铸 出口值变换(<端点>#<键> → 变换) 新增 `GET /v1/config/catalog#rows[K8S_NAMESPACE].semantics`(属性 required-no-default;absent-or-blank-refuses-boot;since 7.139.0 = 本版新上 wire)"
188
+ },
189
+ {
190
+ "id": "A29",
191
+ "source": "selfMinted.wireValueRule",
192
+ "member": "GET /v1/config/catalog#rows[RETENTION_MODE].semantics",
193
+ "text": "自铸 出口值变换(<端点>#<键> → 变换) 新增 `GET /v1/config/catalog#rows[RETENTION_MODE].semantics`(属性 enforce-without-horizon-or-cadence-refuses-boot;since 7.139.0 = 本版新上 wire)"
194
+ },
195
+ {
196
+ "id": "A30",
197
+ "source": "selfMinted.wireValueRule",
198
+ "member": "GET /v1/config/catalog#rows[RETENTION_SWEEP_INTERVAL_SEC].semantics",
199
+ "text": "自铸 出口值变换(<端点>#<键> → 变换) 新增 `GET /v1/config/catalog#rows[RETENTION_SWEEP_INTERVAL_SEC].semantics`(属性 cadence-without-horizon-refuses-boot;since 7.139.0 = 本版新上 wire)"
200
+ },
201
+ {
202
+ "id": "A31",
203
+ "source": "wireFace.coreKey",
204
+ "member": "status.seat",
205
+ "text": "投影面 status 新投 core 新键 seat(core 7.60.0 新增,面表没有把它登记进 excluded ⇒ 默认上 wire)"
206
+ }
207
+ ],
208
+ "registered": [],
209
+ "excluded": [],
210
+ "removed": [],
211
+ "changed": [
212
+ {
213
+ "id": "C1",
214
+ "source": "engineNotice",
215
+ "member": "delegation.ask_unresolvable",
216
+ "text": "附录 D.3 engine_notice 码 `delegation.ask_unresolvable` 的detail:`{ sessionId, toolName, toolCallId, cause, parkLaneExisted }` —— `sessionId` 在 core 侧是 **REQUIRED** typed 键(委派子代上是**子代**的 session,归属标按 `fromSubagent`/`sourceTaskId` 同路);🔴 **`cause`(7.74.0 / core 7.17.0 [ref]② 起;旧名 `settlementKind` 已随该版**退役**,读它恒 `undefined`,无别名无双读)闭三词** `approver_unavailable`(被咨询的席答了 unavailable,其后无 park 接住)/ `no_approver_wired`(这条腿压根没接审批席或问答面,含 headless 的 `\"deny\"` 姿态)/ `mandate_unreconstructible`(祖先绑的 durable mandate 在这条腿上没有 park 设施可兑现 ⇒ 委派子代折内拒),逐字透传不窄化(词表属主在 core);`toolCallId` 与 `tool_approval` 卡帧同值可 join。🔴 **`remedies`(core 7.56.0;server 7.137.0 起过境)= 出路的数据形**:闭集 `approver` / `permission_mode` 上的非空表,恰在 `remedy`(无人可问的那一句)在场时带 —— `{ kind: \"approver\" }`(句子已说的那条:接一个审批席 / 让接着的那个能答)与 `{ kind: \"permission_mode\", value: \"bypassPermissions\", disclosedOn: \"gate.disposition.released\" }`(只在两臂上:模式放行这一问,放行披露在那只调用的 `tool_end.gate.disposition.released`)。`detail.remedies` 由宿主按 `kind` 渲染(或不渲染;`permission_mode` 是宿主只在运维放开该模式时才可提的出路,旁边带上 `disclosedOn` 指的披露),**server 只透传、不改写、不补句**;闭集外的 `kind` 属于更新的引擎,忽略。用户读的 `message` / `remedy` 自 core 7.56.0 起**不再教** `bypassPermissions`(那条出路只在 `remedies` 里) → `{ sessionId, toolName, toolCallId, cause, parkLaneExisted }` —— `sessionId` 在 core 侧是 **REQUIRED** typed 键 = 被拒那只调用**所在腿**的会话(委派子代上是**子代自己的** session);本服务按这一个键投给该会话**当前登记的腿**,不经 `fromSubagent` / `sourceTaskId`(那两键属于审批卡帧,不在本码 `detail` 上)转投父会话 —— 同步委派子代的会话本服务不登记腿,于是子代上的这一条今天**不上任何会话流**,只落运维日志行;父会话可见要等引擎为本码另铸父会话副本(`detail.sessionId` = 父会话 + `childSessionId`,`task.user_steer_undrained` 的同形先例),届时本服务零改动承载;🔴 **`cause`(7.74.0 / core 7.17.0 [ref]② 起;旧名 `settlementKind` 已随该版**退役**,读它恒 `undefined`,无别名无双读)闭三词** `approver_unavailable`(被咨询的席答了 unavailable,其后无 park 接住)/ `no_approver_wired`(这条腿压根没接审批席或问答面,含 headless 的 `\"deny\"` 姿态)/ `mandate_unreconstructible`(祖先绑的 durable mandate 在这条腿上没有 park 设施可兑现 ⇒ 委派子代折内拒),逐字透传不窄化(词表属主在 core);`toolCallId` 与 `tool_approval` 卡帧同值可 join。🔴 **`remedies`(core 7.56.0;server 7.137.0 起过境)= 出路的数据形**:闭集 `approver` / `permission_mode` 上的非空表,恰在 `remedy`(无人可问的那一句)在场时带 —— `{ kind: \"approver\" }`(句子已说的那条:接一个审批席 / 让接着的那个能答)与 `{ kind: \"permission_mode\", value: \"bypassPermissions\", disclosedOn: \"gate.disposition.released\" }`(只在两臂上:模式放行这一问,放行披露在那只调用的 `tool_end.gate.disposition.released`)。`detail.remedies` 由宿主按 `kind` 渲染(或不渲染;`permission_mode` 是宿主只在运维放开该模式时才可提的出路,旁边带上 `disclosedOn` 指的披露),**server 只透传、不改写、不补句**;闭集外的 `kind` 属于更新的引擎,忽略。用户读的 `message` / `remedy` 自 core 7.56.0 起**不再教** `bypassPermissions`(那条出路只在 `remedies` 里)"
217
+ },
218
+ {
219
+ "id": "C2",
220
+ "source": "selfMinted.wireValueRule",
221
+ "member": "GET /v1/config/catalog#rows[K8S_SANDBOX_ENV].semantics",
222
+ "text": "自铸 出口值变换(<端点>#<键> → 变换) `GET /v1/config/catalog#rows[K8S_SANDBOX_ENV].semantics` 的属性:values-only-in-the-pod-own-secret;role-needs-secrets-create;denied-refuses-boot → values-only-in-the-pod-own-secret;role-needs-secrets-create;denied-refuses-boot;own-credential-name-refuses-boot(since 7.139.0)"
223
+ }
224
+ ],
225
+ "narrowed": [],
226
+ "closedSetMembers": [
227
+ {
228
+ "set": "errorCode",
229
+ "at": [
230
+ "docs/ASSISTANT-WIRE-CONTRACT.md#A.1",
231
+ "docs/ASSISTANT-WIRE-CONTRACT.md#A.1b"
232
+ ],
233
+ "added": [
234
+ "conflict.fork_id_taken",
235
+ "conflict.fork_in_progress",
236
+ "conflict.session_mirror",
237
+ "conflict.session_row_changed",
238
+ "conflict.session_writer",
239
+ "execution_lane.not_served",
240
+ "execution_lane.tree_bound",
241
+ "state.fork_target_unsettled"
242
+ ],
243
+ "registered": [],
244
+ "removed": [],
245
+ "breaking": false
246
+ },
247
+ {
248
+ "set": "selfMinted.endpointFaceStatus",
249
+ "at": [
250
+ "src/trace/self-minted-wire.ts#endpointFaceStatus"
251
+ ],
252
+ "added": [
253
+ "PATCH /v1/sessions/:id#expectedRowTag_current(行仍在那只标签上;体 = 列表行)",
254
+ "PATCH /v1/sessions/:id#expectedRowTag_stale(行已不在那只标签上;体 conflict.session_row_changed + currentRow)",
255
+ "PATCH /v1/sessions/:id#mirror_row(只读镜像行上的写,带不带 expectedRowTag;体 conflict.session_mirror + forkPath)",
256
+ "PATCH /v1/sessions/:id#owner_changed_after_gate(门那一读之后同一会话的属主被改;体 not_found.session)",
257
+ "POST /v1/side-query#uncoded_error_with_preflight_prefix(没有引擎码、英文开头与前缀表同形的错误;体 internal.error)",
258
+ "POST /v1/tasks|/v1/tasks/stream|/v1/runs#rewindFiles(新提交;体 request.body_shape + unknownKeys [rewindFiles])"
259
+ ],
260
+ "registered": [],
261
+ "removed": [],
262
+ "breaking": false
263
+ },
264
+ {
265
+ "set": "selfMinted.fieldConflictKind",
266
+ "at": [
267
+ "src/trace/self-minted-wire.ts#fieldConflictKind"
268
+ ],
269
+ "added": [
270
+ "fork_target"
271
+ ],
272
+ "registered": [],
273
+ "removed": [],
274
+ "breaking": false
275
+ },
276
+ {
277
+ "set": "selfMinted.refusalSentenceForm",
278
+ "at": [
279
+ "src/trace/self-minted-wire.ts#refusalSentenceForm"
280
+ ],
281
+ "added": [
282
+ "400 request.body_shape#PATCH /v1/sessions/:id",
283
+ "400 request.field_invalid#PATCH /v1/sessions/:id.expectedRowTag",
284
+ "409 conflict.session_mirror#PATCH /v1/sessions/:id",
285
+ "409 conflict.session_row_changed#PATCH /v1/sessions/:id"
286
+ ],
287
+ "registered": [],
288
+ "removed": [],
289
+ "breaking": false
290
+ },
291
+ {
292
+ "set": "selfMinted.sessionBackgroundRowKey",
293
+ "at": [
294
+ "src/trace/self-minted-wire.ts#sessionBackgroundRowKey"
295
+ ],
296
+ "added": [
297
+ "sessionId"
298
+ ],
299
+ "registered": [],
300
+ "removed": [],
301
+ "breaking": false
302
+ },
303
+ {
304
+ "set": "selfMinted.sessionRowWriteKey",
305
+ "at": [
306
+ "src/trace/self-minted-wire.ts#sessionRowWriteKey"
307
+ ],
308
+ "added": [
309
+ "409 conflict.session_mirror#forkPath",
310
+ "409 conflict.session_row_changed#currentRow",
311
+ "body#expectedRowTag"
312
+ ],
313
+ "registered": [],
314
+ "removed": [],
315
+ "breaking": false
316
+ },
317
+ {
318
+ "set": "selfMinted.sessionsListRowKey",
319
+ "at": [
320
+ "src/trace/self-minted-wire.ts#sessionsListRowKey"
321
+ ],
322
+ "added": [
323
+ "rowTag"
324
+ ],
325
+ "registered": [],
326
+ "removed": [],
327
+ "breaking": false
328
+ },
329
+ {
330
+ "set": "selfMinted.wireValueRule",
331
+ "at": [
332
+ "src/trace/self-minted-wire.ts#wireValueRule"
333
+ ],
334
+ "added": [
335
+ "GET /v1/config/catalog#rows[CONFIG_PROVIDER].semantics",
336
+ "GET /v1/config/catalog#rows[DOCKER_SANDBOX_ENV].semantics",
337
+ "GET /v1/config/catalog#rows[E2B_SANDBOX_ENV].semantics",
338
+ "GET /v1/config/catalog#rows[K8S_NAMESPACE].semantics",
339
+ "GET /v1/config/catalog#rows[RETENTION_MODE].semantics",
340
+ "GET /v1/config/catalog#rows[RETENTION_SWEEP_INTERVAL_SEC].semantics"
341
+ ],
342
+ "registered": [],
343
+ "removed": [],
344
+ "breaking": false
345
+ }
346
+ ],
347
+ "breaking": 0
348
+ }