@sema-agent/server 7.148.0 → 7.149.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 (247) hide show
  1. package/MIGRATION.md +429 -0
  2. package/README.md +16 -1
  3. package/README.zh-CN.md +4 -0
  4. package/USAGE.md +89 -55
  5. package/dist/adoption/wire.d.ts +3 -3
  6. package/dist/approval-card.d.ts +32 -32
  7. package/dist/approval-leg-origin.d.ts +33 -0
  8. package/dist/approval-leg-origin.js +4 -0
  9. package/dist/auth-bridge.d.ts +9 -1
  10. package/dist/auth-bridge.js +4 -4
  11. package/dist/auth-keys.d.ts +10 -1
  12. package/dist/auth-keys.js +8 -0
  13. package/dist/boot/execution-env.js +10 -11
  14. package/dist/boot/execution-lane.d.ts +6 -4
  15. package/dist/boot/execution-lane.js +3 -1
  16. package/dist/boot/org-delivery.d.ts +3 -2
  17. package/dist/boot/resolve-spec.js +6 -4
  18. package/dist/boot/runner-deps.js +3 -1
  19. package/dist/boot/stage-01-config.d.ts +1 -0
  20. package/dist/boot/stage-01-config.js +4 -3
  21. package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
  22. package/dist/boot/stage-02-web-admin-pull.js +10 -2
  23. package/dist/boot/stage-03-store-backend.d.ts +1 -0
  24. package/dist/boot/stage-03-store-backend.js +2 -2
  25. package/dist/boot/stage-04-stores.d.ts +1 -0
  26. package/dist/boot/stage-05-execution-env.d.ts +1 -0
  27. package/dist/boot/stage-06-runners.d.ts +2 -1
  28. package/dist/boot/stage-07-capability-layer.d.ts +2 -1
  29. package/dist/boot/stage-08-reapers.d.ts +2 -1
  30. package/dist/boot/stage-09-leader.d.ts +2 -1
  31. package/dist/boot/stage-10-http-server.d.ts +2 -1
  32. package/dist/boot/stores.d.ts +3 -0
  33. package/dist/boot/stores.js +22 -19
  34. package/dist/capabilities/tool-defer.d.ts +1 -1
  35. package/dist/capability-facts.d.ts +5 -4
  36. package/dist/capability-facts.js +3 -14
  37. package/dist/card-settle-stored-scope.d.ts +56 -0
  38. package/dist/card-settle-stored-scope.js +27 -0
  39. package/dist/card-void.d.ts +7 -12
  40. package/dist/card-void.js +2 -7
  41. package/dist/config-catalog.d.ts +12 -0
  42. package/dist/config-catalog.js +36 -32
  43. package/dist/config-invariants.d.ts +5 -4
  44. package/dist/config-invariants.js +4 -4
  45. package/dist/config-types.d.ts +37 -5
  46. package/dist/config.d.ts +6 -5
  47. package/dist/config.js +35 -24
  48. package/dist/context-window-notice.d.ts +31 -0
  49. package/dist/context-window-notice.js +28 -0
  50. package/dist/deployment-shape.d.ts +20 -11
  51. package/dist/deployment-shape.js +1 -0
  52. package/dist/env-name-allowlist-knobs.d.ts +6 -5
  53. package/dist/env-name-allowlist-knobs.js +5 -0
  54. package/dist/execution-lane-caps.d.ts +20 -5
  55. package/dist/execution-lane-caps.js +18 -4
  56. package/dist/hooks/command-spawn.d.ts +7 -2
  57. package/dist/hooks/command-spawn.js +13 -6
  58. package/dist/hooks/hook-runner.d.ts +5 -0
  59. package/dist/hooks/hook-runner.js +11 -7
  60. package/dist/http/admission.js +3 -3
  61. package/dist/http/approval-sweeps.js +3 -2
  62. package/dist/http/claim-heartbeat.d.ts +3 -3
  63. package/dist/http/claim-heartbeat.js +3 -3
  64. package/dist/http/claimed-run.d.ts +16 -9
  65. package/dist/http/claimed-run.js +8 -0
  66. package/dist/http/dispatch.js +5 -3
  67. package/dist/http/durable-run-leg.d.ts +8 -1
  68. package/dist/http/durable-run-leg.js +30 -11
  69. package/dist/http/execution-context.d.ts +115 -14
  70. package/dist/http/execution-context.js +130 -40
  71. package/dist/http/owner-access.d.ts +3 -2
  72. package/dist/http/owner-access.js +2 -3
  73. package/dist/http/principal-gate.d.ts +18 -11
  74. package/dist/http/principal-gate.js +3 -1
  75. package/dist/http/resume-ctx-read.d.ts +14 -3
  76. package/dist/http/resume-ctx-read.js +8 -2
  77. package/dist/http/resume-legs.d.ts +35 -3
  78. package/dist/http/resume-legs.js +244 -92
  79. package/dist/http/route-ctx.d.ts +6 -0
  80. package/dist/http/routes/a2a-serve.js +2 -0
  81. package/dist/http/routes/approvals-assistant.js +3 -2
  82. package/dist/http/routes/capabilities.js +1 -1
  83. package/dist/http/routes/diagnostics.d.ts +3 -1
  84. package/dist/http/routes/diagnostics.js +30 -5
  85. package/dist/http/routes/principal-inbox.d.ts +3 -1
  86. package/dist/http/routes/principal-inbox.js +3 -2
  87. package/dist/http/routes/runs.js +10 -7
  88. package/dist/http/routes/session-sync.d.ts +24 -5
  89. package/dist/http/routes/session-sync.js +46 -34
  90. package/dist/http/routes/sessions-list.d.ts +1 -1
  91. package/dist/http/routes/tasks.js +127 -93
  92. package/dist/http/server.d.ts +4 -5
  93. package/dist/http/server.js +30 -5
  94. package/dist/http/submit-ctx.d.ts +1 -0
  95. package/dist/http/submit-ctx.js +2 -3
  96. package/dist/index.d.ts +3 -1
  97. package/dist/index.js +1 -0
  98. package/dist/leg-facts.d.ts +7 -2
  99. package/dist/leg-facts.js +1 -0
  100. package/dist/local-store-declaration.d.ts +54 -0
  101. package/dist/local-store-declaration.js +59 -0
  102. package/dist/mcp-assertion-header.d.ts +1 -1
  103. package/dist/mcp-assertion-header.js +1 -1
  104. package/dist/memory-project-layer.js +1 -1
  105. package/dist/memory-scope.d.ts +4 -4
  106. package/dist/memory-scope.js +4 -4
  107. package/dist/memory-sync-client.js +2 -2
  108. package/dist/model-context-window.d.ts +50 -11
  109. package/dist/model-context-window.js +20 -1
  110. package/dist/model-entry-refusal.d.ts +5 -4
  111. package/dist/model-entry-refusal.js +17 -3
  112. package/dist/model-reach-scope.d.ts +2 -1
  113. package/dist/observability/fail-open.d.ts +14 -2
  114. package/dist/observability/fail-open.js +14 -2
  115. package/dist/observability/metrics.js +1 -1
  116. package/dist/observability/run-terminal.js +1 -0
  117. package/dist/observability/secret-env-scrub.d.ts +1 -1
  118. package/dist/observability/secret-env-scrub.js +1 -1
  119. package/dist/org-delivery-gate.d.ts +31 -6
  120. package/dist/org-delivery-gate.js +7 -4
  121. package/dist/owner-faces.d.ts +3 -2
  122. package/dist/park-row-commit.d.ts +67 -0
  123. package/dist/park-row-commit.js +76 -0
  124. package/dist/parked-decide.d.ts +9 -7
  125. package/dist/parked-decide.js +25 -6
  126. package/dist/peer-directory.d.ts +1 -1
  127. package/dist/plugins/adoption-log-sql.d.ts +3 -3
  128. package/dist/plugins/adoption-log-sql.js +19 -19
  129. package/dist/plugins/approval-ask-store-sql.d.ts +1 -1
  130. package/dist/plugins/approval-ask-store-sql.js +3 -5
  131. package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
  132. package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
  133. package/dist/plugins/approval-exemption-skill-m46.d.ts +0 -6
  134. package/dist/plugins/approval-exemption-skill-m46.js +6 -10
  135. package/dist/plugins/approval-exemption-store.d.ts +26 -1
  136. package/dist/plugins/approval-exemption-store.js +28 -19
  137. package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -3
  138. package/dist/plugins/ensure-schema-lock-policy.js +75 -9
  139. package/dist/plugins/file-run-store.d.ts +22 -9
  140. package/dist/plugins/file-run-store.js +50 -22
  141. package/dist/plugins/local-checkpoint-store.d.ts +4 -0
  142. package/dist/plugins/local-checkpoint-store.js +2 -1
  143. package/dist/plugins/local-data-root-admission.d.ts +52 -0
  144. package/dist/plugins/local-data-root-admission.js +100 -0
  145. package/dist/plugins/local-engine-high-water.d.ts +28 -7
  146. package/dist/plugins/local-engine-high-water.js +27 -22
  147. package/dist/plugins/local-session-store.d.ts +134 -49
  148. package/dist/plugins/local-session-store.js +149 -108
  149. package/dist/plugins/memory-run-store.d.ts +14 -9
  150. package/dist/plugins/memory-run-store.js +47 -21
  151. package/dist/plugins/one-time-migration-marker.d.ts +19 -3
  152. package/dist/plugins/one-time-migration-marker.js +7 -1
  153. package/dist/plugins/one-time-migrations.d.ts +46 -20
  154. package/dist/plugins/one-time-migrations.js +102 -79
  155. package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
  156. package/dist/plugins/org-delivery-quota-store.js +29 -14
  157. package/dist/plugins/permission-rule-store-sql.d.ts +1 -1
  158. package/dist/plugins/permission-rule-store-sql.js +5 -9
  159. package/dist/plugins/pg-pool.d.ts +1 -1
  160. package/dist/plugins/pg-pool.js +10 -12
  161. package/dist/plugins/remote-env-device.d.ts +3 -2
  162. package/dist/plugins/remote-env-e2b.d.ts +1 -7
  163. package/dist/plugins/remote-env-e2b.js +10 -7
  164. package/dist/plugins/remote-env-host.d.ts +50 -9
  165. package/dist/plugins/remote-env-host.js +77 -20
  166. package/dist/plugins/remote-env-k8s.js +4 -2
  167. package/dist/plugins/remote-env-local-docker.d.ts +6 -3
  168. package/dist/plugins/remote-env-local-docker.js +8 -23
  169. package/dist/plugins/run-store-sql.d.ts +26 -7
  170. package/dist/plugins/run-store-sql.js +44 -16
  171. package/dist/plugins/scenario-prefix-switch-m42.d.ts +3 -1
  172. package/dist/plugins/scenario-prefix-switch-m42.js +4 -3
  173. package/dist/plugins/schema-consistency.d.ts +89 -5
  174. package/dist/plugins/schema-consistency.js +176 -7
  175. package/dist/plugins/schema-drift-sentence.d.ts +6 -5
  176. package/dist/plugins/schema-drift-sentence.js +13 -5
  177. package/dist/plugins/session-placement.d.ts +5 -4
  178. package/dist/plugins/shell-sentinel-owner-m48.d.ts +22 -0
  179. package/dist/plugins/shell-sentinel-owner-m48.js +6 -0
  180. package/dist/plugins/stop-then-start-sentence.d.ts +16 -0
  181. package/dist/plugins/stop-then-start-sentence.js +7 -0
  182. package/dist/plugins/store-backend.d.ts +22 -8
  183. package/dist/plugins/store-backend.js +58 -24
  184. package/dist/plugins/store-contracts.d.ts +33 -3
  185. package/dist/plugins/store-contracts.js +16 -0
  186. package/dist/plugins/tidb-pool.d.ts +11 -6
  187. package/dist/plugins/tidb-pool.js +18 -12
  188. package/dist/plugins/workspace-custody.d.ts +44 -0
  189. package/dist/plugins/workspace-custody.js +47 -0
  190. package/dist/project-identity.d.ts +8 -7
  191. package/dist/project-identity.js +40 -17
  192. package/dist/project-layer-key.d.ts +13 -2
  193. package/dist/project-layer-key.js +9 -1
  194. package/dist/read-deny-floor-notice.d.ts +36 -0
  195. package/dist/read-deny-floor-notice.js +40 -0
  196. package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
  197. package/dist/request-declaration-disposition.js +39 -0
  198. package/dist/run-cancel-card.d.ts +28 -0
  199. package/dist/run-cancel-card.js +19 -0
  200. package/dist/run-cancel-context.d.ts +10 -0
  201. package/dist/run-cancel-context.js +1 -0
  202. package/dist/run-local.js +28 -13
  203. package/dist/runs.d.ts +31 -7
  204. package/dist/runs.js +34 -16
  205. package/dist/security.d.ts +2 -2
  206. package/dist/server-secret-env.d.ts +34 -20
  207. package/dist/server-secret-env.js +61 -18
  208. package/dist/session-agent.d.ts +3 -2
  209. package/dist/session-children-retire.d.ts +6 -3
  210. package/dist/session-children-retire.js +2 -5
  211. package/dist/session-workspace.d.ts +3 -3
  212. package/dist/store-admission.d.ts +33 -0
  213. package/dist/store-admission.js +49 -0
  214. package/dist/store-posture.d.ts +5 -0
  215. package/dist/store-posture.js +18 -1
  216. package/dist/stores-sql/checkpoint-store-sql.d.ts +1 -1
  217. package/dist/stores-sql/checkpoint-store-sql.js +3 -5
  218. package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
  219. package/dist/stores-sql/file-history-store-sql.js +3 -5
  220. package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
  221. package/dist/stores-sql/tool-result-store-sql.js +4 -6
  222. package/dist/task-a2a.d.ts +3 -8
  223. package/dist/task-a2a.js +25 -27
  224. package/dist/task-cwd.d.ts +23 -7
  225. package/dist/task-cwd.js +3 -0
  226. package/dist/task-mcp.d.ts +3 -3
  227. package/dist/task-mcp.js +1 -1
  228. package/dist/task-settings.js +1 -0
  229. package/dist/terminal.d.ts +2 -0
  230. package/dist/terminal.js +21 -6
  231. package/dist/tool-approval.d.ts +44 -36
  232. package/dist/tool-approval.js +66 -47
  233. package/dist/trace/engine-notice-wire.d.ts +24 -21
  234. package/dist/trace/engine-notice-wire.js +7 -3
  235. package/dist/trace/ledger-sink.d.ts +3 -1
  236. package/dist/trace/project.d.ts +4 -2
  237. package/dist/trace/project.js +8 -7
  238. package/dist/trace/redact.d.ts +12 -0
  239. package/dist/trace/redact.js +5 -1
  240. package/dist/trace/self-minted-wire.d.ts +131 -52
  241. package/dist/trace/self-minted-wire.js +71 -39
  242. package/dist/web-admin-client/apply-effective.js +22 -9
  243. package/docs/error-text-lexicon.json +317 -0
  244. package/package.json +3 -1
  245. package/scripts/embed-minimal.mjs +183 -0
  246. package/wire-changes/server@7.149.0.json +372 -0
  247. package/dist/plain-string-record.js +0 -70
@@ -12,7 +12,8 @@
12
12
  * **≥** 某条未发布形的 `introducedIn` 而两格仍是 `null` ⇒ 红(发布准备提交就是回填时刻,忘了就当场红;版本更低 = 还在开发,不红)。
13
13
  * 最后一条删掉时,整个文件连同 `StoreBackend.runOneTimeMigrations()`(npm 公面上的接口成员)、`NO_SQL_MIGRATIONS`、
14
14
  * `logOneTimeMigrations` / `runAndLogOneTimeMigrations`、三只后端与两只测试夹具上的实现、`boot/stores.ts` 的调用点一起删 —— 零例外:本文件里只有带窗的迁移与它们自己的
15
- * 帮手(两只在场探针、锁腿、方言适配器);没有窗的东西(跳版升级的库的拒启臂)住在起服对账一族(`schema-consistency.ts`),不在这里。
15
+ * 帮手(两只在场探针、锁腿、方言适配器);没有窗的东西(跳版升级的库的拒启臂)住在起服对账一族(`schema-consistency.ts`、`approval-exemption-skill-cutoff.ts`、local 的
16
+ * `local-data-root-admission.ts`),不在这里 —— 那条迁移还在时臂只判、不拒,读本文件的 {@link migrationCarried}(行随码同删 ⇒ 删码那一版起臂恒判)。
16
17
  * 其余文件一律只写「窗口见本文件登记表」,不各写一个日期或版本 —— [ref] 之前本文件头写死了一个删除版本号(7.75.0),
17
18
  * 连同 11 个文件里的复述共 23 行;那一版过去了 28 个 minor 也没删,7.93.5 反倒往本文件里又加了一条迁移。
18
19
  *
@@ -250,7 +251,7 @@
250
251
  * 每行单独读整只文档(一页里不同时持有两份停驻快照)、问那一只派生,答出词才写(`WHERE … AND approval_card IS NULL` CAS,第二跑零写);文档读不出 / 不是一只
251
252
  * 引擎读得了的检查点 ⇒ 计数、不写(这样的行续不了,`get()` 对同一格拒);答出的卡词放不进列(MySQL 协议 `TEXT` 按 UTF-8 字节 65,535;PG 无上限)⇒ 同一个态度:
252
253
  * 计数 + 一行 warn 点名(会话 id + 字节数)、不写、起服不挡 —— 引擎铸的卡词是闭集短词,超长只会是手改 / 外来写者写下的行,列留 NULL、读面按缺列读(与「无卡」同读;到期 facet 不变 —— 超长的词不可能是 core `CARD_FACET_OVERRIDES` 的键;文档一个字节没动)。排在 M21 之后:M21 给存量问答行补上的卡词由本条落列。**列不在 ⇒ 延后**(与 M36 同一条前置:
253
- * 迁移段先于起服列册对账,缺列表上的扫描会抛裸的「未知列」、盖住随后的拒启句)。到期 facet 的生成谓词与运维队列行的卡读这一列 —— 本条跑完之前它们不运行
254
+ * HTTP 服务起服时列册对账先于迁移段,缺列的库在那里就拒;不经对账的公开序列(嵌入方)上,缺列表上的扫描会抛裸的「未知列」)。到期 facet 的生成谓词与运维队列行的卡读这一列 —— 本条跑完之前它们不运行
254
255
  * (迁移段先于任何路由与收割器装配)。**够不到的一格(如实登记)**:已决 / 已作废的行不扫(没有读者读它们的卡);local 车道没有这一列(停驻行在引擎自己的 File 店,
255
256
  * 卡从文档读)。窗 = 发布日 + 30 天(与 M21 同一条论证:窗关时缺省部署上升级前停驻的行已被终局兜底收走)。
256
257
  * · **M30 停驻行请求体里的退役键 `promptProfile` 原地改写**(7.137.0,引擎 7.56.0)—— 提示词形收成布尔 `promptLean`,双形词 `promptProfile` 整键退役(新提交在键闭集门 400)。
@@ -400,11 +401,13 @@
400
401
  * local 腿 = `FileRunStore.migrateRunObjectivePreviewM45`(数据根独占)。读数 `runObjectivePreviewRewritten`。
401
402
  * · **M46 存量的引擎家 `Skill` 会话豁免行**(7.148.0)—— 会话豁免店的一行只记一件事:某人对这个 wire 工具名放过行、且那一问的应答不授予这次调用之外的东西。7.116.0 之前耐久腿曾为带摘要的 `Skill` 卡
402
403
  * (批准 = 激活某技能 + 它清单上的工具免问)与名单点名 `Skill` 的名单问落过 `(会话, "Skill")`;今天读者对「不绑授予」的同名调用读这一行 —— 而引擎说无技能时不挂 `Skill`、同名调用是另一只工具 ⇒ 存量行代答它是**扩权**。
403
- * **删,不加列、不加读侧的未知臂**:谓词 = `tool_name = <core 导出的引擎 Skill 工具名> ∧ created_at < T0`;**T0 = 本库第一次跑本步的时刻,先于删除落进标记**(SQL:标记表 `M46` 行;local:数据根里的标记文件),
404
+ * **删,不加列、不加读侧的未知臂**:谓词 = `tool_name = <core 导出的引擎 Skill 工具名> ∧ created_at < T0`;**T0 = 本库的 `Skill` 豁免截点,先于删除落下**(SQL:标记表 `M46` 行;local:数据根里的标记文件;
405
+ * 7.149.0 起由常设的一步在本步之前落 —— SQL `ensureSchema()` 的种子行、local 数据根准入的锁内一步;缺席时本步自己落),
404
406
  * 不按日历截(各部署升级日不同,日历截点会漏掉跳版直升的库里升级前几天写下的行)。第一次删升级前就在的全部 `Skill` 行(含 7.138.0–7.147.x 写下的合法行;方向 = 那些会话的人下一次 `Skill` 调用被重问一次),
405
407
  * 之后各跑零命中、不碰本版自己写下的新行。SQL:`session_id` 键集分批,一页一句 `DELETE … IN`;被打断 ⇒ 下一次起服读同一个 T0 接着删。local 腿 = `FileApprovalExemptionStore.dropToolRowsCreatedBeforeM46`
406
408
  * (对命中行逐会话追加墓碑,与按名撤销同形;日志已判坏的会话不碰),T0 在数据根的标记文件(M42 local 腿同形)。无停-迁-起守卫:更早版本的副本窗内写下的 `Skill` 行是它们当时合法的行,`created_at ≥ T0` 不被碰、`< T0` 被删,两个方向都是重问。
407
409
  * 读数 `legacySkillExemptionsDropped`(非零 ⇒ 一行 warn `legacy_skill_exemptions_dropped`)。存量规模上限 = 会话数 × 1。
410
+ * **删码之后**由常设的跳版拒启臂接住(`approval-exemption-skill-cutoff.ts`,同一条谓词):本条还在时它只判不拒;删码那一版起,截点之前的 `Skill` 行在场 ⇒ 先于任何写拒启(登记行 `afterRemoval`)。
408
411
  * · **M47 local 无格存档收进行,化身沿用存档头令牌**(7.148.0;local 独有 —— SQL 孪生没有存档头,住客只在 `session_meta.incarnation` 一格)—— 本版起一个数据根只有一只会话行店:
409
412
  * run-local 与 HTTP 服务的 local 臂经同一只 `openLocalBackend` 打开数据根、读同一格住客(`local-session-store.ts` 的 `occupiedBy` 注)。更早的 run-local 经引擎的文件仓直接建档、续跑,
410
413
  * 从不写会话元数据格,它的记忆引擎按**存档头**上引擎另铸的令牌落记录(采集 opt-out、污染标记)。这种「存档在而格缺」的会话,第一次读会补铸一只新令牌 —— 那些记录从此不绑。
@@ -417,6 +420,9 @@
417
420
  * 哨兵是一位普通的具名属主(只对字面相等的主体可见),改成无主 = 过了凭据门的任何主体都够得着;那里零改写、读数 0,行原样,本条照样记完成。
418
421
  * SQL:三张表各一句 `UPDATE … SET owner = NULL WHERE owner = <哨兵>`(逐字节比:MySQL 协议两边 `CAST(… AS BINARY)`,只差尾空格的另一位属主不动;表不在 ⇒ 跳过);local 腿 = `LocalSessionStore.clearShellSentinelOwnersM48`(会话元数据边档一次提交)
419
422
  * + `FileRunStore.clearShellSentinelOwnersM48`。读数 `shellSentinelOwnersCleared`(三处行数之和)。幂等:写后不再有哨兵值 ⇒ 第二跑零命中。
423
+ * **有身份边界的部署不改写,但数一遍留着的**:部署形读数是起服的那一个进程的配置,而改写落在整只库 / 数据根上、不可逆 —— 同一只库 / 根被身份配置不同的进程打开(`run-local` 不带服务凭据 / 桥、嵌入方的起服序列、连着共享库的临时进程)时,
424
+ * 一样身份键都不带的那个进程先起会替有边界的服务进程改写(边界是任一身份来源在的并)。有边界的那一臂因此对同一批改写面用**同一个比较**(SQL:`shellSentinelOwnerWhereM48` —— 与改写的 `UPDATE` 是同一句 WHERE、同一个绑定参数;local:`isShellSentinelOwnerM48`)只数不写,
425
+ * 读数 `shellSentinelOwnerRowsRetained`(逐面、只列非零)非空 ⇒ 一行 warn `shell_sentinel_rows_retained`(`logReceiptRows`)。窗内每次起服都数、每次起服都报,直到有人处置(出路:MIGRATION 7.148.0 节第 86 条的手工一步)。
420
426
  * 不改规则行(哨兵键下的规则此前也不对无主体任务生效,改键 = 放宽)、收件箱条目 / 问账行 / 检查点 scope(这些读面从没放过那一格)。
421
427
  * · **M49 检查点的归属会话回填**(7.148.0)—— `checkpoint.host_session_id`(一张卡归在哪只会话上 = 兑现它的那条 run 的会话;读法 `checkpoint-index-columns.ts` 的
422
428
  * `hostSessionOf`,写口 `put` 求值)本版新加;按 run 找卡的读口(取消、steer 停放、两条停驻收割、续跑输入回收、运维队列行的 run)此后只读它。存量行一律自 `session_id`
@@ -428,11 +434,11 @@
428
434
  * 已有格的会话不动(行令牌胜:本仓每一个按住客的读已在答它):升级前 run-local 在头令牌下给它们落过的记录升级后不再绑(MIGRATION 披露)。
429
435
  * 窗内「已在盘的旧存档长第一格」只有这一条规则(`local-session-store.ts` 的 `firstCellIncarnationOf`):本条的起服扫是它的急切版,按 id 打开 / 读时的补铸、登记、执行位回填、
430
436
  * M33 的行回填与快照恢复同经它 —— 不调起服对账的嵌入方同一次起服里按 id 打开旧会话,住客也不变。
431
- * **收令牌欠账**:高水位按律判过即抬、先于本条 —— 「谁可能写过这只根」与「这只根还欠不欠本条」是两件事。带本条的构建打开数据根时(高水位判过、**抬之前**),
437
+ * **收令牌欠账**:高水位按律判过即抬、先于本条 —— 「谁可能写过这只根」与「这只根还欠不欠本条」是两件事。带本条的构建打开数据根时(准入判过、锁内**抬之前**),
432
438
  * 打开之前的高水位早于 7.148.0 或缺席 ∧ 存档目录里有存档 ⇒ 原子写数据根顶层的欠账标记 `archive-token-adoption.pending`(`required`;本服务内部、不是公开契约);
433
439
  * 本条在欠账起服里以 `required` 提交、再用常驻臂那一只读法证明收齐(剔除 placed 与存档头读不出两类 = 本条的收取范围)之后才删它 —— 任何一步失败标记留着、起服拒,下一次窗内起服重来。
434
440
  * **跳版拒启臂(常设,不随本条删)**:不带本条的构建打开数据根时,(打开之前的引擎高水位早于 7.148.0 或缺席 ∨ 欠账标记在)∧ 根里有存档在而格缺的会话
435
- * ⇒ `local-session-store.ts` 的 `holdArchiveTokenAdoptionDuty` 拒启(`config.schema_mismatch`,读数种别 `skipped-required-migration`;标记在而无格存档为零 ⇒ 无事可收,销账放行)—— 它在数据根打开的同步段里、引擎高水位**抬之前**判
441
+ * ⇒ `local-session-store.ts` 的 `judgeArchiveTokenAdoptionDuty` 拒启(`config.schema_mismatch`,读数种别 `skipped-required-migration`;标记在而无格存档为零 ⇒ 无事可收,锁内抬之前销账放行)—— 它是数据根准入的一格(只读,本进程第一笔写之前;`local-data-root-admission.ts`)
436
442
  * (拒 ⇒ 不抬,出路那一版仍开得了这只根:不比已记高水位旧、仍带本条);本条在树里时那一判换成记账(登记表里有本行 ⇒ 记、不判)。读数 `localArchiveTokensAdopted` / `localArchiveTokensMinted`;只 local(SQL 恒零)。
437
443
  * · **M50 local 问账日志里退役动词 `deleteByTask` 的记录**(7.148.0)—— 店接口的按 run 删除动词本版退役(删会话的审批腿 `deleteBySession` 取代它),File 账本的动词闭集随之少一个词。
438
444
  * 本服务已发版本没有任何生产路径调过它;嵌入方经导出的店型调过、且进程停在那一次压实之前,账本里才会留一条它的记录。持久面不翻红:与 M38 同形的**窗内才生效的行为臂**
@@ -458,11 +464,13 @@ import type { Pool as PgPool } from "pg";
458
464
  import { type AllowEntryInertReason, type GateKind } from "@sema-agent/core";
459
465
  import { type SqlDialect } from "./sql-driver.js";
460
466
  import { StoreBootRefusalError } from "./store-contracts.js";
467
+ import { type ShellSentinelOwnerRowsRetained } from "./shell-sentinel-owner-m48.js";
461
468
  import { listRuleBucketOwners } from "./permission-rule-store-sql.js";
462
469
  import type { SchemaProbeRead } from "./schema-live-columns.js";
463
470
  import type { ExecutionLane } from "../execution-lane-caps.js";
464
471
  import { type ImportedLayerRootAllowRetired, type ImportedLayerRootBucketSkipped, type ImportedLayerRootRetirementSource } from "./imported-layer-root-retirement.js";
465
472
  import { type LocalPlacementBackfillSeat, type UnusableArchiveWord } from "../execution-placement.js";
473
+ import type { PendingShapeChange } from "./schema-consistency.js";
466
474
  /** 迁移读数(启动日志一行写全;测试按它断言,不靠日志文本)。 */
467
475
  export interface OneTimeMigrationReport {
468
476
  /** M17:`session_policy` 装规则的那一列 —— `renamed` = 本次把 `rules` 改名成 `rule_entries`;`current` = 早已是新名(新库 / 第二跑);
@@ -545,6 +553,8 @@ export interface OneTimeMigrationReport {
545
553
  readonly runObjectivePreviewRewritten: number;
546
554
  /** M48:本次把 cli 哨兵属主改写成无主的行数(SQL `session_meta` + `task_run` + `leader_run`;local 会话元数据格 + `run.json`)。SQL 与 local 都有。非零 = 真写了存量行;有身份边界的部署恒 0(那里不改写)。 */
547
555
  readonly shellSentinelOwnersCleared: number;
556
+ /** M48:有身份边界的部署上,留着没改的哨兵属主行数(逐面、只列非零的面;SQL = 表,local = 会话元数据格 / run 行)。只数不写。SQL 与 local 都有。非空 = 库 / 数据根里还有行被别的(一样身份键都不带的)进程改写的风险 —— 一行 warn `shell_sentinel_rows_retained`。 */
557
+ readonly shellSentinelOwnerRowsRetained: readonly ShellSentinelOwnerRowsRetained[];
548
558
  /** M49:本次自 `session_id` 回填了归属会话的检查点行数(SQL `checkpoint.host_session_id` / local 归属索引)。SQL 与 local 都有。非零 = 真写了存量行。 */
549
559
  readonly checkpointHostSessionsBackfilled: number;
550
560
  /** M46:本次删掉的存量引擎家 `Skill` 会话豁免行数(SQL `approval_exemption` / local 豁免日志墓碑;首次放行早于本库第一次跑本步的时刻 T0)。非零 = 真删了存量行 —— 那些会话的人下一次 `Skill` 调用被重问一次。 */
@@ -701,11 +711,19 @@ export interface OneTimeMigrationWindow {
701
711
  /** 本条在 {@link OneTimeMigrationReport} 里的读数键 —— 报告的每个键恰属一条(到期门核:新迁移不登记 ⇒ 红)。 */
702
712
  readonly reportKeys: readonly (keyof OneTimeMigrationReport)[];
703
713
  /**
704
- * 本条起服时从存量表上**删掉**的列(表名 → 列名)。只有会发 `DROP COLUMN` 的迁移写它;列名取自删列句读的那一份常量(不手抄)。读者 = 发车门 1.10 第三档
705
- * ({@link columnsRemovedByPendingMigrations} → `scripts/schema-reconcile.mjs`):共享测试库还是升级前的旧形、带着这些列时,读成「待跑迁移要删的旧列」,不读成「库比本树新」。
706
- * 删码时随本行一起走 —— 行没了,这些列重新读作多余列(= 本条 `afterRemoval` 写的起服拒启)。
714
+ * 本条起服时对**存量表形**做的事(闭集四种,`schema-consistency.ts` 的 {@link PendingShapeChange}:删列 / 改名 / 补列 / 按建表语句重建)。只有会改表形的迁移写它;
715
+ * 列名取自迁移语句读的那一份常量(不手抄),条件与迁移步自己的判据同一个事实(列在不在)。读者 = 列册对账的投影 `projectPendingShape`(唯一一只;「待跑迁移要建 / 要删哪些列」只有这一格在写):
716
+ * 起服对账在迁移**之前**跑,比的是「这些迁移跑完之后」的形 —— 迁移要删 / 改名 / 补的列不让起服拒,别的不符照拒;迁移段之前 / 之中读列册的拒句(单表探针的拒因、判活守卫的句尾 ——
717
+ * `schema-consistency.ts` 的 `statementBearing`)同读这只投影,迁移自己要建的列不列成部署者的 `ALTER`;发车门 1.10 第三档(`scripts/schema-reconcile.mjs`)读同一只投影,
718
+ * 共享测试库的升级前旧形读成 `migration-pending`,不读成「库比本树新 / 旧」。删码时随本行一起走 —— 行没了,旧形重新读作不符(= 本条 `afterRemoval` 写的起服拒启)。
707
719
  */
708
- readonly dropsColumns?: Readonly<Record<string, readonly string[]>>;
720
+ readonly shapeChanges?: readonly PendingShapeChange[];
721
+ /**
722
+ * 本条是**停-迁-起**迁移:起服时的守卫在判活窗(`REAP_RUN_STALE_SEC`)内库里还有 run 在心跳时拒启、一字节不写(动作段的唯一属主 = `stop-then-start-sentence.ts`)。
723
+ * 值 = 一句英文:更早版本的副本在迁移之后还会写什么、写了会怎样 —— 起服列册对账的升级清单(`schema-consistency.ts` 的 `describeUpgradeChecklist`)把它原样列给运维,
724
+ * 于是「本构建有哪几条要先停光旧副本」只有这一处在写、随行删码一起没。读者 = {@link stopThenStartMigrations}。
725
+ */
726
+ readonly stopThenStart?: string;
709
727
  }
710
728
  /**
711
729
  * 🔴 [ref] —— 一次性迁移登记表,本文件各条的窗的**唯一属主**。别处(接口 JSDoc、调用点、DDL 注、部署文档)只写「窗口见
@@ -724,16 +742,22 @@ export declare function migrationWindowOpen(window: Pick<OneTimeMigrationWindow,
724
742
  * 还没有日期可写)⇒ 响亮抛,不铸一句带空日期的句子。
725
743
  */
726
744
  export declare function migrationWindowEnd(id: string): string;
727
- /** 待删列:表 → 列 → 认领它的迁移 id。 */
728
- export type PendingColumnRemovals = ReadonlyMap<string, ReadonlyMap<string, string>>;
729
745
  /**
730
- * 登记表里**待跑的**一次性迁移要删的存量列(表 → 列 → 迁移 id)—— 发车门 1.10 第三档读它,把共享测试库上「本树没有的列」分成两类:这里点名的 = 待跑迁移起服时要删的升级前旧形(不是库太新);
731
- * 别的 = 库比本树新(起服同样拒)。登记行在 ⇔ 这条迁移的代码还在、起服会跑它 ⇒ 「待跑」的判据就是行在场,不另设标记;行随删码一起没了,集合随之变空。「待跑」只说起服会**去跑**它,不说一定跑得成(迁移自己的前提 —— 如 M41 的判活窗内无 run 在心跳 —— 是起服时的动态条件,读者不据此判)。
732
- * 同一(表 × 列)被两行认领 ⇒ 响亮抛(一件事一个属主,不挑一个)。`registry` 是测试缝,生产只用登记表本身。
746
+ * 本构建带不带这一条迁移:登记表里有没有那一行(行随码同删 —— 删码那一版起答 `false`)。给**常设的跳版拒启臂**读:那条迁移还在时,存量旧形归它处置(臂只判、不拒);
747
+ * 删码之后臂接住(`Skill` 豁免截点:SQL 探针口与 local 数据根准入各传一次 `migrationCarried(SKILL_EXEMPTION_CUTOFF_ID)`;收令牌欠账:数据根准入与窗内长第一格的规则读 `migrationCarried("M47")`)。
748
+ * 「本构建带不带某条迁移」只有这一只读者(测试摘行模拟删码那一版:就地改登记表,本函数读同一只数组)。
733
749
  */
734
- export declare function columnsRemovedByPendingMigrations(registry?: readonly Pick<OneTimeMigrationWindow, "id" | "dropsColumns">[]): PendingColumnRemovals;
750
+ export declare function migrationCarried(id: string): boolean;
751
+ /**
752
+ * 本构建带的**停-迁-起**迁移(登记行的 `stopThenStart` 一格;行在 ⇔ 码在 ⇒ 起服会在这一条上判活)。读者 = 起服列册对账的升级清单:拒句把它们一次列给运维。
753
+ * 登记表里再没有这样的行时返回空数组 —— 清单的这一步随之不出。
754
+ */
755
+ export declare function stopThenStartMigrations(registry?: readonly Pick<OneTimeMigrationWindow, "id" | "stopThenStart">[]): readonly {
756
+ readonly id: string;
757
+ readonly reason: string;
758
+ }[];
735
759
  /** local 车道上 SQL 独有的几条(M17 / M18 / M21 / M23 / M24 / M26 / M27 / M29)的读数(M32 的回填两车道都有、M33 只在 local,local 腿的读数由 `LocalBackend.runOneTimeMigrations` 现算):那几张表 / 列在文件底座上从来不存在 ⇒ 如实答 absent / 0。 */
736
- export declare const NO_SQL_MIGRATIONS: Omit<OneTimeMigrationReport, "runErrorCodeColumnRewritten" | "runObjectivePreviewRewritten" | "shellSentinelOwnersCleared" | "checkpointHostSessionsBackfilled" | "legacySkillExemptionsDropped" | "executionPlacementsBackfilled" | "askExecutionLanesBackfilled" | "executionLaneWordsRenamed" | "scenarioPrefixSourcesScanned" | "executionPlacementSessionsUnreadable" | "localArchiveRowFactsBackfilled" | "localArchivesAnonymized" | "localArchivesKeptStamped" | "localArchivesUnreadable" | "localArchiveSnapshotsRecovered" | "localArchiveTokensAdopted" | "localArchiveTokensMinted" | "askJournalRecordsUpgraded" | "importedLayerRootAllowsRetired" | "importedLayerRootBucketsSkipped" | "importedLayerRootBucketsUnnamed">;
760
+ export declare const NO_SQL_MIGRATIONS: Omit<OneTimeMigrationReport, "runErrorCodeColumnRewritten" | "runObjectivePreviewRewritten" | "shellSentinelOwnersCleared" | "shellSentinelOwnerRowsRetained" | "checkpointHostSessionsBackfilled" | "legacySkillExemptionsDropped" | "executionPlacementsBackfilled" | "askExecutionLanesBackfilled" | "executionLaneWordsRenamed" | "scenarioPrefixSourcesScanned" | "executionPlacementSessionsUnreadable" | "localArchiveRowFactsBackfilled" | "localArchivesAnonymized" | "localArchivesKeptStamped" | "localArchivesUnreadable" | "localArchiveSnapshotsRecovered" | "localArchiveTokensAdopted" | "localArchiveTokensMinted" | "askJournalRecordsUpgraded" | "importedLayerRootAllowsRetired" | "importedLayerRootBucketsSkipped" | "importedLayerRootBucketsUnnamed">;
737
761
  /** 启动期的日志口(logger 的子集)。两级各有其用,见 {@link logOneTimeMigrations}。 */
738
762
  export interface MigrationLogSink {
739
763
  warn(msg: string, meta?: Record<string, unknown>): void;
@@ -772,11 +796,12 @@ export interface MigrationDb {
772
796
  */
773
797
  export declare function createSqlImportedLayerRootSource(exec: Parameters<typeof listRuleBucketOwners>[0]): ImportedLayerRootRetirementSource;
774
798
  export declare function runSqlOneTimeMigrations(dialect: SqlDialect, pool: MysqlPool | PgPool, input: SqlOneTimeMigrationInput): Promise<OneTimeMigrationReport>;
775
- /** M48 的那一步(见头注 M48 段):只在输入显式说「没有身份边界」时改写 —— 有身份边界的部署上零改写(哨兵在那里是一位普通的具名属主);改写面里的每张表一句按值的 `UPDATE`(表不在 ⇒ 跳过);写后不再有哨兵值 ⇒ 第二跑零命中。
776
- * 值**逐字节**比:MySQL 协议的 `utf8mb4_bin` 是 PAD SPACE(`'a' = 'a '`),普通等值会把只差尾空格的另一位属主(合法主体名)也改成无主 ——
777
- * 与 M17 / M18 的 CAS 同一写法 `CAST(… AS BINARY)`;PG `text` 等值本就逐字节。 */
799
+ /** M48 的那一步(见头注 M48 段):输入显式说「没有身份边界」⇒ 改写 —— 改写面里的每张表一句按值的 `UPDATE`(表不在 ⇒ 跳过);写后不再有哨兵值 ⇒ 第二跑零命中。
800
+ * 其余一切(有身份边界,或绕过类型缺这一格 / 不是布尔 ⇒ fail-closed,不静默放宽)零改写,但对同一批表用**同一句 WHERE**({@link shellSentinelOwnerWhereM48})数一遍留着的行,
801
+ * 非零的面记进 `shellSentinelOwnerRowsRetained`(起服日志一行 warn;见头注)。值**逐字节**比的理由在 {@link shellSentinelOwnerWhereM48}。 */
778
802
  export declare function clearShellSentinelOwnersM48(db: MigrationDb, dialect: SqlDialect, receipts: {
779
803
  shellSentinelOwnersCleared: number;
804
+ shellSentinelOwnerRowsRetained: ShellSentinelOwnerRowsRetained[];
780
805
  }, input: ShellSentinelOwnerInput): Promise<void>;
781
806
  /**
782
807
  * M46 的 SQL 腿(判据与形见头注 M46 段):标记表不在才建(与 M42 / M43 同一张);**T0 先落**(标记行 `M46`:不在 ⇒ 写下此刻、再读回来用;并发起服收敛到先落的那一只);
@@ -794,7 +819,8 @@ export declare const SESSION_DELETING_SWITCH_REFUSED_CODE = "config.session_dele
794
819
  export declare class SessionDeletingSwitchRefusedError extends StoreBootRefusalError {
795
820
  readonly code = "config.session_deleting_switch_refused";
796
821
  readonly reason: "live_runs";
797
- constructor(live: LiveRunHeartbeat);
822
+ /** `tail` = 库此刻还差的列(`describeUpgradeDriftTail`;列齐 ⇒ 空串):一次起服读全,不必补一句再试。 */
823
+ constructor(live: LiveRunHeartbeat, tail?: string);
798
824
  }
799
825
  /**
800
826
  * M42 的扫描面:本树建表句(两方言各自的录制,与起服列册对账同一份)里名字合 {@link IDENTITY_COLUMN_NAME}、类型是字符 / 字节串的列,与库里实际在的列取交(条件建的表不在库里 ⇒ 不扫)。