@sema-agent/server 7.133.0 → 7.135.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 (526) hide show
  1. package/MIGRATION.md +221 -0
  2. package/README.md +2 -2
  3. package/README.zh-CN.md +2 -2
  4. package/USAGE.md +222 -36
  5. package/deploy/sema-up/README.md +16 -0
  6. package/deploy/sema-up/chart/Chart.yaml +1 -1
  7. package/deploy/sema-up/chart/templates/NOTES.txt +15 -0
  8. package/deploy/sema-up/chart/templates/_helpers.tpl +129 -0
  9. package/deploy/sema-up/chart/templates/sealed-key.yaml +24 -0
  10. package/deploy/sema-up/chart/templates/server-v4pro.yaml +14 -0
  11. package/deploy/sema-up/chart/templates/server.yaml +14 -0
  12. package/deploy/sema-up/chart/values-full-single.yaml +5 -1
  13. package/deploy/sema-up/chart/values.yaml +34 -0
  14. package/dist/adoption/plan.d.ts +1 -1
  15. package/dist/approval-ask-audit-store.d.ts +25 -25
  16. package/dist/approval-ask-machine.d.ts +2 -2
  17. package/dist/approval-card.d.ts +66 -154
  18. package/dist/approval-card.js +33 -52
  19. package/dist/approval-content-kind.d.ts +26 -6
  20. package/dist/approval-content-kind.js +23 -3
  21. package/dist/approval-deny-reasons.d.ts +1 -1
  22. package/dist/approval-gate-currency.d.ts +91 -0
  23. package/dist/approval-gate-currency.js +120 -0
  24. package/dist/approval-hmac.d.ts +7 -7
  25. package/dist/approval-policy-settlement.d.ts +2 -2
  26. package/dist/approval-reconciler.d.ts +3 -3
  27. package/dist/approval.d.ts +14 -8
  28. package/dist/approval.js +35 -16
  29. package/dist/auth-bridge.d.ts +1 -1
  30. package/dist/auto-mode-face.d.ts +4 -4
  31. package/dist/background-session-reap.d.ts +2 -2
  32. package/dist/bake-runner/main.d.ts +2 -2
  33. package/dist/bake-runner/runner.d.ts +4 -4
  34. package/dist/bench/s1/live-deps.d.ts +1 -1
  35. package/dist/bench/s1/run-firm.d.ts +1 -1
  36. package/dist/boot/coordinators.d.ts +7 -2
  37. package/dist/boot/coordinators.js +8 -5
  38. package/dist/boot/deferred-sandbox-path-env.d.ts +0 -6
  39. package/dist/boot/deferred-sandbox-path-env.js +0 -5
  40. package/dist/boot/engine-lease.d.ts +5 -5
  41. package/dist/boot/execution-env.d.ts +16 -15
  42. package/dist/boot/execution-env.js +19 -21
  43. package/dist/boot/fatal-exit.d.ts +2 -2
  44. package/dist/boot/late-binds.d.ts +1 -1
  45. package/dist/boot/leader.d.ts +2 -0
  46. package/dist/boot/leader.js +2 -1
  47. package/dist/boot/memory-boundary.d.ts +2 -2
  48. package/dist/boot/memory-consolidation.d.ts +15 -15
  49. package/dist/boot/parked-revive-gate.d.ts +3 -3
  50. package/dist/boot/parked-revive-gate.js +3 -2
  51. package/dist/boot/read-deny-anchor-audit.js +2 -2
  52. package/dist/boot/reapers.d.ts +4 -4
  53. package/dist/boot/resolve-spec.d.ts +1 -1
  54. package/dist/boot/resolve-spec.js +28 -24
  55. package/dist/boot/runner-deps.d.ts +29 -16
  56. package/dist/boot/runner-deps.js +12 -2
  57. package/dist/boot/session-faces.d.ts +3 -3
  58. package/dist/boot/session-faces.js +11 -30
  59. package/dist/boot/shutdown.d.ts +5 -5
  60. package/dist/boot/side-query-lane.d.ts +2 -2
  61. package/dist/boot/stage-05-execution-env.js +4 -4
  62. package/dist/boot/stage-06-runners.d.ts +4 -3
  63. package/dist/boot/stage-06-runners.js +15 -4
  64. package/dist/boot/stage-07-capability-layer.d.ts +2 -1
  65. package/dist/boot/stage-08-reapers.d.ts +2 -1
  66. package/dist/boot/stage-09-leader.d.ts +2 -1
  67. package/dist/boot/stage-09-leader.js +2 -2
  68. package/dist/boot/stage-10-http-server.d.ts +2 -1
  69. package/dist/boot/stage-10-http-server.js +2 -1
  70. package/dist/boot/stores.d.ts +8 -0
  71. package/dist/boot/stores.js +10 -13
  72. package/dist/boot/web-admin.d.ts +21 -15
  73. package/dist/boot/web-admin.js +16 -12
  74. package/dist/boot/workflow-orchestration.js +2 -9
  75. package/dist/brain.d.ts +11 -11
  76. package/dist/budget.d.ts +4 -4
  77. package/dist/budget.js +5 -1
  78. package/dist/caller-text-echo.d.ts +2 -0
  79. package/dist/caller-text-echo.js +2 -1
  80. package/dist/canonical-json.d.ts +2 -41
  81. package/dist/canonical-json.js +2 -13
  82. package/dist/capabilities/approvals-push.d.ts +4 -4
  83. package/dist/capabilities/builtin-tools.d.ts +5 -5
  84. package/dist/capabilities/center-plugins.d.ts +5 -5
  85. package/dist/capabilities/center-plugins.js +1 -1
  86. package/dist/capabilities/center-prompts.d.ts +1 -1
  87. package/dist/capabilities/center-wiring.d.ts +1 -1
  88. package/dist/capabilities/composite-members.d.ts +2 -2
  89. package/dist/capabilities/composite-members.js +1 -1
  90. package/dist/capabilities/execution-lane.d.ts +5 -5
  91. package/dist/capabilities/execution-lane.js +2 -2
  92. package/dist/capabilities/hands-lane.d.ts +5 -5
  93. package/dist/capabilities/mcp-probe.d.ts +10 -7
  94. package/dist/capabilities/mcp-probe.js +2 -2
  95. package/dist/capabilities/sandbox-file-send.d.ts +1 -18
  96. package/dist/capabilities/sandbox-file-send.js +0 -7
  97. package/dist/capabilities/scenarios.d.ts +28 -10
  98. package/dist/capabilities/scenarios.js +15 -5
  99. package/dist/capabilities/send-user-file-tool.d.ts +1 -1
  100. package/dist/capabilities/skills.d.ts +31 -12
  101. package/dist/capabilities/skills.js +23 -17
  102. package/dist/capabilities/tool-defer.d.ts +1 -1
  103. package/dist/capability-facts.d.ts +27 -24
  104. package/dist/capability-facts.js +18 -20
  105. package/dist/center-config-tier.d.ts +1 -1
  106. package/dist/center-credential.d.ts +4 -4
  107. package/dist/checkpoint-ctx-seal-m28.d.ts +42 -0
  108. package/dist/checkpoint-ctx-seal-m28.js +19 -0
  109. package/dist/checkpoint-identity.d.ts +5 -0
  110. package/dist/checkpoint-identity.js +14 -0
  111. package/dist/config-catalog.d.ts +12 -12
  112. package/dist/config-invariants.d.ts +4 -4
  113. package/dist/config-invariants.js +3 -2
  114. package/dist/config-lkg.d.ts +1 -1
  115. package/dist/config-provider.d.ts +13 -13
  116. package/dist/config-provider.js +2 -1
  117. package/dist/config-types.d.ts +83 -83
  118. package/dist/config.d.ts +26 -24
  119. package/dist/config.js +12 -10
  120. package/dist/cross-session-settings.d.ts +1 -1
  121. package/dist/delegated-session-owner.d.ts +16 -13
  122. package/dist/delegated-session-owner.js +9 -10
  123. package/dist/deployment-governance.d.ts +16 -16
  124. package/dist/deployment-shape.d.ts +127 -0
  125. package/dist/deployment-shape.js +72 -0
  126. package/dist/device-store.d.ts +1 -1
  127. package/dist/device-ws-hub.d.ts +1 -1
  128. package/dist/egress-redirect.d.ts +1 -1
  129. package/dist/entry-mode-clamp-notice.d.ts +2 -2
  130. package/dist/env-facts.d.ts +10 -9
  131. package/dist/env-facts.js +1 -1
  132. package/dist/env-name-allowlist-knobs.d.ts +5 -5
  133. package/dist/exec-bounds.d.ts +2 -2
  134. package/dist/execution-lane-caps.d.ts +31 -43
  135. package/dist/execution-lane-caps.js +0 -13
  136. package/dist/field-conflict.d.ts +2 -1
  137. package/dist/field-conflict.js +1 -0
  138. package/dist/file-history-capture.d.ts +9 -9
  139. package/dist/file-history-disclosure.d.ts +50 -9
  140. package/dist/file-history-disclosure.js +8 -13
  141. package/dist/fleet/drain-entry.d.ts +2 -2
  142. package/dist/fleet/fleet-bus.d.ts +26 -14
  143. package/dist/fleet/fleet-bus.js +6 -5
  144. package/dist/fleet/fleet-reconciler.d.ts +9 -9
  145. package/dist/fleet/subagent-tail-bus.d.ts +4 -4
  146. package/dist/fleet-client.d.ts +13 -13
  147. package/dist/fleet-lease.d.ts +16 -16
  148. package/dist/governance-http-status.d.ts +2 -2
  149. package/dist/hooks/hook-llm.d.ts +7 -7
  150. package/dist/hooks/hook-runner.d.ts +57 -30
  151. package/dist/hooks/hook-runner.js +38 -20
  152. package/dist/host-decision.d.ts +5 -5
  153. package/dist/host-lsp-manager.d.ts +5 -5
  154. package/dist/hosted-posture.d.ts +23 -13
  155. package/dist/hosted-posture.js +4 -9
  156. package/dist/http/admission.d.ts +2 -2
  157. package/dist/http/admission.js +28 -5
  158. package/dist/http/approval-sweeps.d.ts +1 -1
  159. package/dist/http/approval-sweeps.js +5 -2
  160. package/dist/http/checkpoint-ctx.d.ts +183 -2
  161. package/dist/http/checkpoint-ctx.js +197 -2
  162. package/dist/http/dispatch.d.ts +3 -3
  163. package/dist/http/dispatch.js +3 -3
  164. package/dist/http/durable-run-leg.js +7 -5
  165. package/dist/http/idempotency.d.ts +4 -4
  166. package/dist/http/idempotency.js +2 -2
  167. package/dist/http/mcp-dial-deadline.d.ts +7 -5
  168. package/dist/http/memory-compliance-failure-reply.d.ts +4 -4
  169. package/dist/http/owner-access.d.ts +4 -6
  170. package/dist/http/owner-access.js +1 -1
  171. package/dist/http/principal-gate.d.ts +39 -13
  172. package/dist/http/principal-gate.js +30 -6
  173. package/dist/http/readiness.d.ts +1 -1
  174. package/dist/http/refusal-body.d.ts +12 -0
  175. package/dist/http/refusal-body.js +11 -0
  176. package/dist/http/request-guards.d.ts +4 -13
  177. package/dist/http/request-guards.js +4 -17
  178. package/dist/http/resume-ctx-read.d.ts +53 -6
  179. package/dist/http/resume-ctx-read.js +26 -3
  180. package/dist/http/resume-legs.d.ts +5 -4
  181. package/dist/http/resume-legs.js +47 -29
  182. package/dist/http/route-ctx.d.ts +29 -38
  183. package/dist/http/route-table.d.ts +9 -9
  184. package/dist/http/routes/agents-roster.d.ts +1 -1
  185. package/dist/http/routes/agents-roster.js +2 -3
  186. package/dist/http/routes/approvals-assistant.d.ts +5 -5
  187. package/dist/http/routes/approvals-assistant.js +91 -17
  188. package/dist/http/routes/background.d.ts +3 -3
  189. package/dist/http/routes/background.js +2 -2
  190. package/dist/http/routes/capabilities.d.ts +1 -1
  191. package/dist/http/routes/capabilities.js +16 -8
  192. package/dist/http/routes/config-catalog.d.ts +1 -1
  193. package/dist/http/routes/devices.d.ts +1 -1
  194. package/dist/http/routes/diagnostics.d.ts +6 -6
  195. package/dist/http/routes/diagnostics.js +1 -1
  196. package/dist/http/routes/fleet.d.ts +1 -1
  197. package/dist/http/routes/fleet.js +5 -4
  198. package/dist/http/routes/mcp-reconnect.d.ts +4 -4
  199. package/dist/http/routes/mcp-reconnect.js +3 -3
  200. package/dist/http/routes/memory-consolidation.d.ts +1 -1
  201. package/dist/http/routes/memory-origin.d.ts +1 -1
  202. package/dist/http/routes/notify-wake.d.ts +1 -1
  203. package/dist/http/routes/notify-wake.js +2 -2
  204. package/dist/http/routes/rules.d.ts +1 -1
  205. package/dist/http/routes/rules.js +4 -4
  206. package/dist/http/routes/runs.js +44 -11
  207. package/dist/http/routes/session-sync.d.ts +3 -2
  208. package/dist/http/routes/session-sync.js +109 -62
  209. package/dist/http/routes/sessions-list.d.ts +1 -1
  210. package/dist/http/routes/sessions-list.js +4 -5
  211. package/dist/http/routes/sessions.js +34 -48
  212. package/dist/http/routes/tasks.d.ts +1 -1
  213. package/dist/http/routes/tasks.js +21 -16
  214. package/dist/http/routes/trace-usage.d.ts +1 -1
  215. package/dist/http/routes/trace-usage.js +7 -9
  216. package/dist/http/routes/workflows.d.ts +3 -0
  217. package/dist/http/routes/workflows.js +31 -28
  218. package/dist/http/send.d.ts +5 -5
  219. package/dist/http/server.d.ts +39 -33
  220. package/dist/http/server.js +5 -2
  221. package/dist/http/session-inherit-env.d.ts +3 -3
  222. package/dist/http/sse-lifecycle.d.ts +1 -1
  223. package/dist/http/sse-log.d.ts +2 -2
  224. package/dist/http/submit-ctx.d.ts +4 -3
  225. package/dist/http/submit-ctx.js +19 -3
  226. package/dist/http/sync-submit-body.d.ts +1 -1
  227. package/dist/http/verify-rounds.d.ts +1 -1
  228. package/dist/http/wire-types.d.ts +35 -24
  229. package/dist/index.d.ts +2 -0
  230. package/dist/index.js +1 -0
  231. package/dist/instruction-source-notice.d.ts +2 -2
  232. package/dist/key-resolver.d.ts +3 -3
  233. package/dist/lane-home-probe.d.ts +1 -1
  234. package/dist/leader/diffout.d.ts +1 -1
  235. package/dist/leader/diffup.d.ts +2 -2
  236. package/dist/leader/endpoint.d.ts +1 -1
  237. package/dist/leader/fanout.d.ts +1 -1
  238. package/dist/leader/leader.d.ts +4 -4
  239. package/dist/leader/merge.d.ts +3 -3
  240. package/dist/leader/repair-wire.d.ts +1 -1
  241. package/dist/leader/wire.d.ts +9 -5
  242. package/dist/leader/wire.js +8 -7
  243. package/dist/list-entry-display.d.ts +1 -1
  244. package/dist/lsp-evict.d.ts +1 -1
  245. package/dist/main.js +1 -1
  246. package/dist/mcp-assertion-header.d.ts +1 -1
  247. package/dist/memory-layer-legacy-lock.d.ts +1 -1
  248. package/dist/memory-operator-faces.d.ts +1 -1
  249. package/dist/memory-origin-fence.js +2 -2
  250. package/dist/memory-posture.js +4 -2
  251. package/dist/memory-project-layer.d.ts +1 -1
  252. package/dist/memory-scope.d.ts +19 -19
  253. package/dist/memory-store-refusal.d.ts +4 -4
  254. package/dist/model-compat.d.ts +1 -1
  255. package/dist/model-entry-headers.d.ts +2 -2
  256. package/dist/model-entry-refusal.d.ts +17 -17
  257. package/dist/model-provider.d.ts +10 -10
  258. package/dist/model-reach-scope.d.ts +1 -1
  259. package/dist/model-route-endpoint.d.ts +6 -6
  260. package/dist/model-route-url.d.ts +5 -5
  261. package/dist/model-select.d.ts +15 -6
  262. package/dist/model-select.js +5 -0
  263. package/dist/model-unreachable-notice.d.ts +3 -3
  264. package/dist/namespaced-rule-name.d.ts +15 -5
  265. package/dist/namespaced-rule-name.js +3 -2
  266. package/dist/observability/corrupt-read-seat.d.ts +9 -9
  267. package/dist/observability/cost-taxonomy.d.ts +1 -1
  268. package/dist/observability/err-text.d.ts +1 -1
  269. package/dist/observability/fail-open.d.ts +12 -8
  270. package/dist/observability/fail-open.js +12 -8
  271. package/dist/observability/metrics.d.ts +3 -3
  272. package/dist/observability/prompt-manifest.d.ts +19 -8
  273. package/dist/observability/prompt-manifest.js +9 -8
  274. package/dist/observability/run-terminal.d.ts +36 -36
  275. package/dist/observability/secret-env-scrub.d.ts +3 -3
  276. package/dist/observability/tool-trace.d.ts +1 -1
  277. package/dist/observability/tool-trace.js +8 -9
  278. package/dist/operator-ask.d.ts +4 -4
  279. package/dist/orchestration/workflow-agent-session-index.d.ts +3 -3
  280. package/dist/orchestration/workflow-completion-inbox.d.ts +20 -5
  281. package/dist/orchestration/workflow-completion-inbox.js +29 -7
  282. package/dist/orchestration/workflow-notify-journal.d.ts +43 -19
  283. package/dist/orchestration/workflow-notify-journal.js +17 -0
  284. package/dist/orchestration/workflow-park-decision.d.ts +1 -1
  285. package/dist/orchestration/workflow-park-decision.js +1 -0
  286. package/dist/outbound-dispatcher.d.ts +4 -4
  287. package/dist/parent-watch.d.ts +4 -4
  288. package/dist/parked-decide.d.ts +20 -20
  289. package/dist/parked-decide.js +8 -5
  290. package/dist/parked-revive-surface.d.ts +7 -7
  291. package/dist/parked-revive-surface.js +2 -3
  292. package/dist/peer-directory.d.ts +3 -3
  293. package/dist/peer-directory.js +1 -1
  294. package/dist/permission-rule-list.d.ts +10 -1
  295. package/dist/permission-rule-list.js +7 -5
  296. package/dist/permission-rule-vocab.d.ts +3 -25
  297. package/dist/permission-rule-vocab.js +0 -13
  298. package/dist/plugins/adoption-log-sql.d.ts +1 -1
  299. package/dist/plugins/approval-ask-store-file.d.ts +8 -1
  300. package/dist/plugins/approval-ask-store-file.js +6 -3
  301. package/dist/plugins/approval-ask-store-memory.d.ts +11 -7
  302. package/dist/plugins/approval-ask-store-memory.js +11 -7
  303. package/dist/plugins/approval-ask-store-sql.d.ts +34 -15
  304. package/dist/plugins/approval-ask-store-sql.js +18 -5
  305. package/dist/plugins/approval-exemption-store.d.ts +3 -3
  306. package/dist/plugins/approval-nonce-store.d.ts +3 -3
  307. package/dist/plugins/approval-payload-fingerprint.d.ts +14 -6
  308. package/dist/plugins/approval-payload-fingerprint.js +1 -1
  309. package/dist/plugins/background-agent-store-sql.d.ts +1 -1
  310. package/dist/plugins/background-shell-support.d.ts +2 -2
  311. package/dist/plugins/blob-backend.d.ts +1 -1
  312. package/dist/plugins/caching-session-store.d.ts +24 -33
  313. package/dist/plugins/caching-session-store.js +8 -19
  314. package/dist/plugins/checkpoint-index-columns.d.ts +81 -0
  315. package/dist/plugins/checkpoint-index-columns.js +62 -0
  316. package/dist/plugins/checkpoint-store-sql.d.ts +66 -67
  317. package/dist/plugins/checkpoint-store-sql.js +100 -103
  318. package/dist/plugins/device-store-sql.d.ts +7 -6
  319. package/dist/plugins/e2b-orphan-reclaim.d.ts +1 -1
  320. package/dist/plugins/ensure-schema-lock-policy.d.ts +1 -1
  321. package/dist/plugins/file-history-store-sql.d.ts +9 -7
  322. package/dist/plugins/file-history-store-sql.js +27 -15
  323. package/dist/plugins/file-run-store.d.ts +8 -8
  324. package/dist/plugins/fork-routing-session-store.d.ts +2 -2
  325. package/dist/plugins/fork-routing-session-store.js +1 -1
  326. package/dist/plugins/host-platform.d.ts +10 -10
  327. package/dist/plugins/image-bake-store-sql.d.ts +1 -1
  328. package/dist/plugins/image-index-sql.d.ts +1 -1
  329. package/dist/plugins/leader-run-store-sql.d.ts +1 -1
  330. package/dist/plugins/local-checkpoint-store.d.ts +23 -12
  331. package/dist/plugins/local-checkpoint-store.js +29 -4
  332. package/dist/plugins/local-session-store.d.ts +44 -45
  333. package/dist/plugins/local-session-store.js +42 -52
  334. package/dist/plugins/local-session-window.d.ts +12 -6
  335. package/dist/plugins/local-session-window.js +1 -17
  336. package/dist/plugins/mailbox-store-sql.d.ts +2 -2
  337. package/dist/plugins/memory-engine-pg.d.ts +1 -1
  338. package/dist/plugins/memory-run-store.d.ts +4 -4
  339. package/dist/plugins/memory-sync-store-pg.d.ts +3 -3
  340. package/dist/plugins/one-time-migrations.d.ts +76 -39
  341. package/dist/plugins/one-time-migrations.js +127 -34
  342. package/dist/plugins/outcome-ledger-sql.d.ts +1 -1
  343. package/dist/plugins/park-commit-watch.d.ts +3 -3
  344. package/dist/plugins/permission-rule-store-file.d.ts +5 -5
  345. package/dist/plugins/permission-rule-store-file.js +16 -19
  346. package/dist/plugins/permission-rule-store-sql.d.ts +38 -4
  347. package/dist/plugins/permission-rule-store-sql.js +74 -31
  348. package/dist/plugins/pg-cost-quota.d.ts +1 -1
  349. package/dist/plugins/pg-pool.d.ts +2 -2
  350. package/dist/plugins/pg-pool.js +5 -2
  351. package/dist/plugins/pg-rate-limiter.d.ts +1 -1
  352. package/dist/plugins/pg-session-storage.d.ts +9 -21
  353. package/dist/plugins/pg-session-storage.js +51 -42
  354. package/dist/plugins/remote-env-adb.d.ts +10 -10
  355. package/dist/plugins/remote-env-device.d.ts +22 -14
  356. package/dist/plugins/remote-env-device.js +28 -16
  357. package/dist/plugins/remote-env-e2b.d.ts +3 -3
  358. package/dist/plugins/remote-env-host.d.ts +16 -16
  359. package/dist/plugins/remote-env-k8s.d.ts +8 -8
  360. package/dist/plugins/remote-env-local-docker.d.ts +2 -2
  361. package/dist/plugins/remote-env-ssh.d.ts +4 -4
  362. package/dist/plugins/remote-scratchpad.d.ts +2 -3
  363. package/dist/plugins/remote-scratchpad.js +0 -4
  364. package/dist/plugins/remote-shell.d.ts +6 -6
  365. package/dist/plugins/retention-lane-store-sql.d.ts +4 -4
  366. package/dist/plugins/retention-store-sql.d.ts +4 -4
  367. package/dist/plugins/roster-store-sql.d.ts +1 -1
  368. package/dist/plugins/run-store-sql.d.ts +8 -8
  369. package/dist/plugins/schema-consistency.d.ts +2 -2
  370. package/dist/plugins/schema-ensure-legs.d.ts +3 -3
  371. package/dist/plugins/schema-indexes.d.ts +1 -1
  372. package/dist/plugins/schema-live-columns.d.ts +1 -1
  373. package/dist/plugins/session-event-payload.d.ts +4 -4
  374. package/dist/plugins/session-fork.d.ts +34 -0
  375. package/dist/plugins/session-fork.js +29 -0
  376. package/dist/plugins/session-ownership.d.ts +11 -0
  377. package/dist/plugins/session-ownership.js +11 -0
  378. package/dist/plugins/session-placement.d.ts +12 -14
  379. package/dist/plugins/session-placement.js +2 -15
  380. package/dist/plugins/session-policy-store-sql.d.ts +12 -12
  381. package/dist/plugins/session-store.d.ts +2 -2
  382. package/dist/plugins/session-store.js +2 -2
  383. package/dist/plugins/shared-memory-store-sql.d.ts +2 -2
  384. package/dist/plugins/sql-driver.d.ts +8 -8
  385. package/dist/plugins/sql-errors.d.ts +1 -1
  386. package/dist/plugins/sql-json-column.d.ts +21 -21
  387. package/dist/plugins/sql-row-helpers.d.ts +2 -2
  388. package/dist/plugins/store-backend.d.ts +17 -16
  389. package/dist/plugins/store-backend.js +3 -3
  390. package/dist/plugins/store-contracts.d.ts +21 -21
  391. package/dist/plugins/task-attachment-store.d.ts +2 -2
  392. package/dist/plugins/task-list-store-sql.d.ts +1 -1
  393. package/dist/plugins/tidb-pool.d.ts +2 -2
  394. package/dist/plugins/tidb-pool.js +9 -2
  395. package/dist/plugins/tidb-session-store.d.ts +17 -27
  396. package/dist/plugins/tidb-session-store.js +52 -42
  397. package/dist/plugins/tool-result-store-sql.d.ts +1 -1
  398. package/dist/plugins/usage-window-store-sql.d.ts +3 -3
  399. package/dist/plugins/user-input-ledger-file.d.ts +1 -1
  400. package/dist/plugins/user-input-ledger-sql.d.ts +3 -3
  401. package/dist/plugins/web-search.d.ts +19 -5
  402. package/dist/plugins/web-search.js +19 -4
  403. package/dist/{orchestration/workflow-journal-entry.d.ts → plugins/workflow-journal-payload.d.ts} +23 -32
  404. package/dist/plugins/workflow-journal-payload.js +32 -0
  405. package/dist/plugins/workflow-journal-store-sql.d.ts +28 -14
  406. package/dist/plugins/workflow-journal-store-sql.js +34 -15
  407. package/dist/plugins/workflow-run-store-sql.d.ts +4 -4
  408. package/dist/posture-source.d.ts +11 -11
  409. package/dist/principal-jwt.d.ts +6 -6
  410. package/dist/project-identity.d.ts +3 -3
  411. package/dist/project-memory.d.ts +4 -4
  412. package/dist/read-face-posture.d.ts +7 -7
  413. package/dist/request-key-closure.d.ts +1 -1
  414. package/dist/request-key-closure.js +1 -1
  415. package/dist/request-tool-axes.d.ts +12 -0
  416. package/dist/request-tool-axes.js +20 -0
  417. package/dist/request-value-closure.d.ts +15 -8
  418. package/dist/request-value-closure.js +2 -0
  419. package/dist/router/route-orchestration.d.ts +11 -16
  420. package/dist/router/route-orchestration.js +2 -12
  421. package/dist/rule-entry-list.d.ts +8 -7
  422. package/dist/rule-entry-list.js +2 -9
  423. package/dist/rules-consent.d.ts +6 -6
  424. package/dist/rules-consent.js +2 -0
  425. package/dist/run-cancel-context.d.ts +5 -5
  426. package/dist/run-local.d.ts +10 -10
  427. package/dist/run-local.js +1 -0
  428. package/dist/runs.d.ts +15 -12
  429. package/dist/runs.js +19 -4
  430. package/dist/runtime-caps-resolver.d.ts +6 -6
  431. package/dist/runtime-governance.d.ts +9 -9
  432. package/dist/sandbox-pkg-source.d.ts +9 -31
  433. package/dist/sandbox-pkg-source.js +14 -8
  434. package/dist/sealed-key.d.ts +34 -2
  435. package/dist/sealed-key.js +55 -1
  436. package/dist/security.d.ts +31 -32
  437. package/dist/security.js +12 -9
  438. package/dist/server-secret-env.d.ts +10 -10
  439. package/dist/session-children-retire.d.ts +1 -1
  440. package/dist/session-error-wire.d.ts +19 -12
  441. package/dist/session-error-wire.js +4 -1
  442. package/dist/session-incarnation.d.ts +52 -35
  443. package/dist/session-incarnation.js +23 -8
  444. package/dist/session-policy-wire.d.ts +27 -5
  445. package/dist/session-policy-wire.js +15 -1
  446. package/dist/session-records-skipped-notice.d.ts +1 -1
  447. package/dist/session-sync-kernel.d.ts +38 -11
  448. package/dist/session-sync-kernel.js +10 -0
  449. package/dist/session-sync.d.ts +49 -6
  450. package/dist/session-sync.js +52 -10
  451. package/dist/session-titler.d.ts +7 -6
  452. package/dist/session-titler.js +8 -13
  453. package/dist/session-watch.d.ts +3 -3
  454. package/dist/session-watch.js +4 -4
  455. package/dist/sighup-idle.d.ts +2 -2
  456. package/dist/spec-fields.d.ts +4 -4
  457. package/dist/sql-engine-posture.d.ts +3 -3
  458. package/dist/store-posture.d.ts +2 -2
  459. package/dist/stored-request-tool-axes-m19.d.ts +1 -1
  460. package/dist/task-a2a.d.ts +3 -1
  461. package/dist/task-a2a.js +38 -5
  462. package/dist/task-cwd.d.ts +7 -88
  463. package/dist/task-cwd.js +2 -15
  464. package/dist/task-mcp.d.ts +14 -10
  465. package/dist/task-mcp.js +39 -12
  466. package/dist/task-settings.d.ts +34 -18
  467. package/dist/task-settings.js +34 -4
  468. package/dist/task-workflow.d.ts +0 -24
  469. package/dist/task-workflow.js +2 -1
  470. package/dist/terminal.d.ts +5 -5
  471. package/dist/tighten-only-seats.d.ts +7 -6
  472. package/dist/tighten-only-seats.js +1 -1
  473. package/dist/tool-approval.d.ts +273 -228
  474. package/dist/tool-approval.js +125 -47
  475. package/dist/tool-rule-names.d.ts +7 -1
  476. package/dist/trace/core-keyset-guard.d.ts +15 -9
  477. package/dist/trace/engine-notice-wire.d.ts +5 -5
  478. package/dist/trace/engine-notice-wire.js +1 -0
  479. package/dist/trace/exit-seat.d.ts +40 -1
  480. package/dist/trace/exit-seat.js +46 -14
  481. package/dist/trace/ledger-events.d.ts +6 -4
  482. package/dist/trace/ledger-sink.d.ts +1 -1
  483. package/dist/trace/model-segment.d.ts +3 -3
  484. package/dist/trace/project.d.ts +65 -46
  485. package/dist/trace/project.js +49 -5
  486. package/dist/trace/redact.d.ts +44 -27
  487. package/dist/trace/redact.js +343 -73
  488. package/dist/trace/self-minted-wire.d.ts +39 -14
  489. package/dist/trace/self-minted-wire.js +9 -0
  490. package/dist/trace/sema-provenance.d.ts +1 -1
  491. package/dist/trace/task-notification-facets.d.ts +4 -4
  492. package/dist/trace/wire-projection-faces.d.ts +9 -3
  493. package/dist/trace/wire-projection-faces.js +7 -1
  494. package/dist/unattended-permission-mode.d.ts +5 -5
  495. package/dist/url-credential.d.ts +52 -0
  496. package/dist/url-credential.js +49 -0
  497. package/dist/url-refusal.d.ts +6 -2
  498. package/dist/url-refusal.js +8 -1
  499. package/dist/usage-analytics.d.ts +2 -2
  500. package/dist/user-input-ledger.d.ts +23 -23
  501. package/dist/web-admin-client/apply-effective.d.ts +5 -5
  502. package/dist/web-admin-client/apply-effective.js +2 -1
  503. package/dist/web-admin-client/apply-ledger.d.ts +2 -2
  504. package/dist/web-admin-client/center-request.d.ts +2 -2
  505. package/dist/web-admin-client/facade.d.ts +5 -5
  506. package/dist/web-admin-client/facade.js +1 -1
  507. package/dist/web-admin-client/hot-keys-registry.d.ts +2 -2
  508. package/dist/web-admin-client/http-client.d.ts +4 -4
  509. package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
  510. package/dist/web-admin-client/pull-state.d.ts +1 -1
  511. package/dist/web-admin-client/read-face.d.ts +2 -2
  512. package/dist/web-admin-client/read-warnings.d.ts +5 -5
  513. package/dist/web-admin-client/restart-signal.d.ts +6 -6
  514. package/dist/web-admin-client/skills-mcp.d.ts +29 -4
  515. package/dist/web-admin-client/skills-mcp.js +31 -4
  516. package/dist/web-admin-client/types.d.ts +17 -10
  517. package/dist/workspace-space.d.ts +5 -3
  518. package/dist/write-protection.d.ts +2 -2
  519. package/package.json +4 -3
  520. package/scripts/drain-check-local.mjs +35 -2
  521. package/scripts/drain-check.mysql.sql +22 -2
  522. package/scripts/drain-check.pg.sql +22 -2
  523. package/skills/loop.md +1 -1
  524. package/dist/mcp-tool-faces.d.ts +0 -69
  525. package/dist/mcp-tool-faces.js +0 -104
  526. package/dist/orchestration/workflow-journal-entry.js +0 -27
@@ -154,6 +154,22 @@ data-center:2c/2G/20G)以下 BLOCK——确实无法稳定部署,提前警告不
154
154
  - **MinIO**:钉死的 tag(`minio/minio:RELEASE.…`,chart / cluster 静态清单 / compose 三份同值;k8s `imagePullPolicy: IfNotPresent`,不再 `:latest` + `Always`)。换源 = 换整条引用:
155
155
  compose 与 kube-up 读环境变量 `MINIO_IMAGE`(kube-up 给了才递给 chart),chart 直接 `--set minio.image=<源>/minio/minio:<tag>`(预灌镜像的节点 `--set minio.pullPolicy=Never`)。
156
156
 
157
+ ## 停驻钥匙的持久卷(helm 图表的 `sealedKey` 块)
158
+
159
+ server 的 `<数据根>/sealed-key/` 存着停驻任务续跑上下文里请求凭据的封签钥匙(子目录 `checkpoint-ctx-keys/`)和模型钥匙 —— 私钥只在这个目录里、不进库。
160
+ 图表(`kube-up.sh` 的 `--kube=existing|k3s`、`cluster-up.sh` 的 `STACK_ENGINE=helm`)缺省把整个目录挂成一只 PVC(`sealedKey.persistence.enabled: true`),
161
+ 容器内路径 `/root/.ai-agent/sealed-key`,主 worker 与启用的 `serverV4pro` 共用:重启与换副本都不丢钥匙,停驻的任务照常续跑。
162
+
163
+ - **访问模式缺省随共享这只卷的 pod 数**:`server.replicas`(加上启用的 `serverV4pro.replicas`)为 1 ⇒ `ReadWriteOnce`,多于 1 ⇒ `ReadWriteMany`,**要集群的存储类支持 RWX**
164
+ (Longhorn 走 NFS 共享管理器、每个节点要装 NFS 客户端;`local-path` 与多数云盘类不支持 ⇒ PVC 一直 Pending、server Pod 起不来)。点名存储类:`--set sealedKey.persistence.storageClass=<支持 RWX 的类>`。
165
+ 单节点多副本(pod 都在同一个节点)用 `--set sealedKey.persistence.accessMode=ReadWriteOnce` 显式盖(随包的 `values-full-single.yaml` 就这么写)。
166
+ 有效访问模式是 `ReadWriteOnce` 时 Deployment 用 `Recreate`(RWO 卷同时只能被一个节点挂,滚动更新的新 Pod 落在别的节点就永远等不到卷;代价是升级窗口内短暂没有副本)。
167
+ - **没有 RWX 的集群**:`--set server.replicas=1`,或单节点多副本盖 RWO(上一条),或关持久 `--set sealedKey.persistence.enabled=false` —— 关掉时图表**显式**给每只 worker 设 `DURABLE_APPROVAL=false`
168
+ (耐久审批整条关,不产生续不了的停驻行;`helm install` 打印的安装说明里也有这一句),且同时配 `server.durableApproval=true` 渲染即拒。
169
+ - **首装是空卷**:多个 pod 并发首启会各自生成一把钥匙、各持自己那一把;装好后 `kubectl -n <ns> rollout restart deploy/sema-server`(启用 `serverV4pro` 时再加 `deploy/sema-server-v4pro`)一次,之后每个 pod 读到全部钥匙。
170
+ - PVC 的 `accessModes` 建好后不可改:副本数跨过 1 的边界时 `helm upgrade` 会撞「spec is immutable」;卷里是私钥,换卷前先结掉停驻行或备份钥匙文件。
171
+ PVC 带 `helm.sh/resource-policy: keep`:`helm uninstall` 与把 `enabled` 改成 `false` 的 upgrade 都不删它(确认不要了再 `kubectl -n <ns> delete pvc sema-server-sealed-key`)。
172
+
157
173
  ## 凭据纪律
158
174
 
159
175
  全部凭据生成一次、落 `~/.sema-up/<project>/.env`(0600),重跑**绝不轮换**;
@@ -7,5 +7,5 @@ description: >-
7
7
  SC、kata-deploy(runtimeclass)、CNPG operator、runner-token 跨 ns 复制、MinIO 建桶、
8
8
  imagePullSecret(sema-regcred)。
9
9
  type: application
10
- version: 0.3.0
10
+ version: 0.4.0
11
11
  appVersion: "1.156.1"
@@ -0,0 +1,15 @@
1
+ {{- $persist := eq (include "sema.sealedKey.enabled" .) "true" }}
2
+ {{- if $persist }}
3
+ 停驻封签钥匙:server 的 <数据根>/sealed-key/ 在持久卷 {{ include "sema.sealedKey.claimName" . }}(挂在容器内 {{ include "sema.sealedKey.mountPath" . }},{{ include "sema.sealedKey.accessMode" . }}),重启与换副本都不丢钥匙,停驻的任务照常续跑。PVC 带 helm.sh/resource-policy: keep(helm uninstall 与把 sealedKey.persistence.enabled 改成 false 的 upgrade 都不删它)。
4
+ {{- if eq (include "sema.sealedKey.accessMode" .) "ReadWriteOnce" }}
5
+ 有效访问模式是 ReadWriteOnce,server / serverV4pro 的 Deployment 用 Recreate 更新策略(RWO 卷同时只能被一个节点挂,滚动更新的新 Pod 落在别的节点会一直等不到卷;代价是升级窗口内短暂没有副本)。
6
+ {{- end }}
7
+ {{- if eq (include "sema.sealedKey.accessMode" .) "ReadWriteMany" }}
8
+ 多个 pod 共用这只卷,存储类必须支持 ReadWriteMany(PVC 一直 Pending 就是它不支持:出路 server.replicas=1,或 sealedKey.persistence.enabled=false 并接受耐久审批随之关)。
9
+ {{- end }}
10
+ {{- if gt (int (include "sema.sealedKey.podCount" .)) 1 }}
11
+ 首装是空卷:多个副本并发首启会各自生成一把钥匙、各持自己那一把 —— 装好后执行一次 kubectl -n {{ .Release.Namespace }} rollout restart deploy/sema-server{{ if .Values.serverV4pro.enabled }} deploy/sema-server-v4pro{{ end }},此后每个副本读到目录里的全部钥匙。
12
+ {{- end }}
13
+ {{- else }}
14
+ 停驻封签钥匙:sealedKey.persistence.enabled=false —— 不建卷,图表已给每只 worker 显式设上 DURABLE_APPROVAL=false(耐久审批整条关,不产生续不了的停驻行;代价见 values.yaml 的 sealedKey 块;要重新打开,把它改回 true)。关持久 + 提交体没声明 settings.approvalFrameFamilies 的客户端 ⇒ 受门工具当场拒(没有耐久店,无处停驻;7.134.0 起审批卡只发给声明认得这一族的客户端)。
15
+ {{- end }}
@@ -0,0 +1,129 @@
1
+ {{- /*
2
+ sealedKey 持久块的助手 —— 卷名 / 挂载路径 / 共享 pod 数 / 访问模式 / 耐久审批的渲值,各一处定义,主 worker(server.yaml)与
3
+ v4pro 变体(server-v4pro.yaml)同调,不各抄一份。
4
+
5
+ 这是什么:server 的数据根下 `sealed-key/` 目录存两样东西 —— 模型钥匙(web-admin 贴的 `sealedApiKey` 的解封私钥)与停驻任务续跑上下文里
6
+ 请求凭据的封签钥匙(子目录 `checkpoint-ctx-keys/`)。私钥只在这个目录里(不进库),所以它要**跨重启持久**、**每个副本是同一份**:
7
+ 不持久 ⇒ 每次重启换钥匙,重启前停驻、带请求凭据的任务续跑恒 409 conflict.checkpoint_ctx_unsealable(reason key_not_held);
8
+ 多副本各一份 ⇒ A 副本停驻的任务在 B 副本上同一个结局。
9
+
10
+ 路径:镜像以 root 跑、本图表不设 LOCAL_DATA_ROOT / CONFIG_LOCAL_DIR / AGENT_DATA_DIR ⇒ 数据根是缺省 ~/.ai-agent = /root/.ai-agent。
11
+ 给部署另设了数据根变量的人:挂载路径要跟着移(本图表不替部署设这几个变量)。
12
+ */ -}}
13
+
14
+ {{- /* 卷 / PVC 的名字。 */ -}}
15
+ {{- define "sema.sealedKey.claimName" -}}sema-server-sealed-key{{- end -}}
16
+
17
+ {{- /* 容器内挂载点 = <数据根>/sealed-key(整个目录:模型钥匙 + checkpoint-ctx-keys/ 同一卷)。 */ -}}
18
+ {{- define "sema.sealedKey.mountPath" -}}/root/.ai-agent/sealed-key{{- end -}}
19
+
20
+ {{- /*
21
+ 持久开关,且**只收布尔**:`--set-string ...enabled=false` / values 里带引号的 "false" 是字符串,模板里字符串恒为真 ⇒ 会静默保持持久开,
22
+ 与写的人的意思相反,所以非布尔渲染即拒。输出 "true" / "false"。
23
+ */ -}}
24
+ {{- define "sema.sealedKey.enabled" -}}
25
+ {{- $v := .Values.sealedKey.persistence.enabled -}}
26
+ {{- if not (kindIs "bool" $v) -}}
27
+ {{- fail (printf "sealedKey.persistence.enabled must be a boolean (true or false), got %s %q — a string such as \"false\" is truthy in a template and would silently keep the volume on" (kindOf $v) (toString $v)) -}}
28
+ {{- end -}}
29
+ {{- $v -}}
30
+ {{- end -}}
31
+
32
+ {{- /* 一只 Deployment 的副本数:缺省(null,k8s 按 1 只起)不当 0 只数;其余按整数。 */ -}}
33
+ {{- define "sema.sealedKey.replicasOf" -}}
34
+ {{- if kindIs "invalid" . -}}1{{- else -}}{{- int . -}}{{- end -}}
35
+ {{- end -}}
36
+
37
+ {{- /* 共享这只卷的 pod 数:主 worker 的副本数 + 启用的 v4pro 变体的副本数(两者读同一个库里的停驻行,所以挂同一只卷)。 */ -}}
38
+ {{- define "sema.sealedKey.podCount" -}}
39
+ {{- $n := int (include "sema.sealedKey.replicasOf" .Values.server.replicas) -}}
40
+ {{- if .Values.serverV4pro.enabled -}}
41
+ {{- $n = add $n (int (include "sema.sealedKey.replicasOf" .Values.serverV4pro.replicas)) -}}
42
+ {{- end -}}
43
+ {{- $n -}}
44
+ {{- end -}}
45
+
46
+ {{- /*
47
+ 访问模式:`sealedKey.persistence.accessMode` 留空 = 随共享 pod 数派生(一只 ReadWriteOnce,多只 ReadWriteMany —— 要集群的存储类支持 RWX,见 values.yaml sealedKey 块);
48
+ 写了 ReadWriteOnce / ReadWriteMany = 显式盖。显式盖的用处:单节点、多副本 —— 所有 pod 在同一个节点上,RWO 就够,不必为它给节点装 NFS 客户端;
49
+ 盖成 RWO 而 pod 其实会落在不同节点是写的人的前提(新 Pod 会卡在「卷被别的节点挂着」)。其它词渲染即拒。
50
+ */ -}}
51
+ {{- define "sema.sealedKey.accessMode" -}}
52
+ {{- $raw := .Values.sealedKey.persistence.accessMode -}}
53
+ {{- $m := "" -}}
54
+ {{- if not (kindIs "invalid" $raw) -}}
55
+ {{- $m = toString $raw -}}
56
+ {{- end -}}
57
+ {{- if not (has $m (list "" "ReadWriteOnce" "ReadWriteMany")) -}}
58
+ {{- fail (printf "sealedKey.persistence.accessMode must be empty (derive from the number of pods sharing the volume), \"ReadWriteOnce\" or \"ReadWriteMany\", got %q" $m) -}}
59
+ {{- end -}}
60
+ {{- if ne $m "" -}}
61
+ {{- $m -}}
62
+ {{- else if gt (int (include "sema.sealedKey.podCount" .)) 1 -}}
63
+ ReadWriteMany
64
+ {{- else -}}
65
+ ReadWriteOnce
66
+ {{- end -}}
67
+ {{- end -}}
68
+
69
+ {{- /*
70
+ Deployment 的更新策略:有效访问模式是 ReadWriteOnce ⇒ `Recreate`(`nindent 2` 接在 `replicas:` 之后)。RWO 卷同时只能被一个节点挂,默认的滚动更新先起新 Pod、
71
+ 旧 Pod 要等新 Pod 就绪才放卷 —— 新 Pod 落在别的节点就永远等不到卷。代价:升级窗口内这一只 Deployment 短暂没有副本(只有一只 pod 的形本来就没有别的副本可接)。
72
+ RWX 与持久关闭不碰策略。
73
+ */ -}}
74
+ {{- define "sema.sealedKey.strategy" -}}
75
+ {{- /* 访问模式先取(取值即校验):持久关闭时写了非闭集词也拒,「其它词渲染即拒」不看开关。 */ -}}
76
+ {{- $mode := include "sema.sealedKey.accessMode" . -}}
77
+ {{- if and (eq (include "sema.sealedKey.enabled" .) "true") (eq $mode "ReadWriteOnce") -}}
78
+ strategy: { type: Recreate }
79
+ {{- end -}}
80
+ {{- end -}}
81
+
82
+ {{- /*
83
+ `server.durableApproval`(耐久审批,env DURABLE_APPROVAL)渲给 worker 的值:"" = 不渲(开关归引擎按姿态定),"true" / "false" = 显式。
84
+ 布尔与字符串写法同义;其它词渲染即拒。持久被关(sealedKey.persistence.enabled=false)⇒ 固定 "false" —— 钥匙跨不过重启,耐久审批铸出来的停驻行
85
+ 就是续不了的行,所以图表替部署**显式**关掉它(不是靠引擎的缺省碰巧关);同一份 values 又把它点名成 true ⇒ 渲染即拒,两个键各说各的就是矛盾。
86
+ `kindIs "invalid"` 判 nil(`--set server.durableApproval=null` 删键):不能用 `default ""` —— 布尔 false 在 `default` 里算空,会把显式 false 吞成「没表态」。
87
+ */ -}}
88
+ {{- define "sema.durableApproval" -}}
89
+ {{- $raw := .Values.server.durableApproval -}}
90
+ {{- $want := "" -}}
91
+ {{- if not (kindIs "invalid" $raw) -}}
92
+ {{- $want = lower (trim (toString $raw)) -}}
93
+ {{- end -}}
94
+ {{- if not (has $want (list "" "true" "false")) -}}
95
+ {{- fail (printf "server.durableApproval must be \"true\", \"false\" or empty (empty = the engine decides by posture), got %q" $want) -}}
96
+ {{- end -}}
97
+ {{- if eq (include "sema.sealedKey.enabled" .) "true" -}}
98
+ {{- $want -}}
99
+ {{- else -}}
100
+ {{- if eq $want "true" -}}
101
+ {{- fail "server.durableApproval=true cannot be combined with sealedKey.persistence.enabled=false: durable approvals park tasks whose request credentials are sealed under keys kept in the sealed-key volume, and without that volume every restart replaces the keys so no parked task could resume. Keep sealedKey.persistence.enabled=true (the default), or drop server.durableApproval (with persistence off the chart sets DURABLE_APPROVAL=false itself)" -}}
102
+ {{- end -}}
103
+ false
104
+ {{- end -}}
105
+ {{- end -}}
106
+
107
+ {{- /* worker 容器 env 里的耐久审批一条(`nindent 12` 之后接在 env 列表里);值为空 ⇒ 什么都不出。 */ -}}
108
+ {{- define "sema.sealedKey.env" -}}
109
+ {{- with (include "sema.durableApproval" .) -}}
110
+ - { name: DURABLE_APPROVAL, value: {{ . | quote }} }
111
+ {{- end -}}
112
+ {{- end -}}
113
+
114
+ {{- /* worker 容器的 volumeMounts 块(`nindent 10`);持久关 ⇒ 什么都不出。 */ -}}
115
+ {{- define "sema.sealedKey.volumeMounts" -}}
116
+ {{- if eq (include "sema.sealedKey.enabled" .) "true" -}}
117
+ volumeMounts:
118
+ - { name: sealed-key, mountPath: {{ include "sema.sealedKey.mountPath" . | quote }} }
119
+ {{- end -}}
120
+ {{- end -}}
121
+
122
+ {{- /* Pod 的 volumes 块(`nindent 6`);持久关 ⇒ 什么都不出。 */ -}}
123
+ {{- define "sema.sealedKey.volumes" -}}
124
+ {{- if eq (include "sema.sealedKey.enabled" .) "true" -}}
125
+ volumes:
126
+ - name: sealed-key
127
+ persistentVolumeClaim: { claimName: {{ include "sema.sealedKey.claimName" . }} }
128
+ {{- end -}}
129
+ {{- end -}}
@@ -0,0 +1,24 @@
1
+ # ── 停驻封签钥匙的持久卷(sealedKey.persistence.enabled,缺省开)──────────────────────────
2
+ # server 的 <数据根>/sealed-key/ 整个目录(模型钥匙 + 子目录 checkpoint-ctx-keys/ 的停驻行封签钥匙)挂这一只 PVC,
3
+ # 主 worker 与启用的 v4pro 变体共用。私钥只在这里(不进库):卷丢了,封在停驻行里的请求凭据就开不开。
4
+ # 访问模式随共享这只卷的 pod 数(助手 sema.sealedKey.accessMode):一只 ReadWriteOnce,多只 ReadWriteMany(要集群的存储类支持 RWX)。
5
+ # ⚠ PVC 的 accessModes 建好后不可改:副本数跨过 1 的边界(1 ⇄ 多)会让升级撞「spec is immutable」—— 响亮,不静默;见 values.yaml sealedKey 块。
6
+ # 有效访问模式是 ReadWriteOnce 时 server / v4pro 两只 Deployment 用 Recreate(助手 sema.sealedKey.strategy)。
7
+ {{- if eq (include "sema.sealedKey.enabled" .) "true" }}
8
+ apiVersion: v1
9
+ kind: PersistentVolumeClaim
10
+ metadata:
11
+ name: {{ include "sema.sealedKey.claimName" . }}
12
+ namespace: {{ .Release.Namespace }}
13
+ annotations:
14
+ # 卷里是私钥:丢了,库里停驻行的请求凭据就开不开。`helm uninstall` 与「关持久」的 upgrade 都不顺手删它(确认不要了再 kubectl delete pvc)。
15
+ helm.sh/resource-policy: keep
16
+ spec:
17
+ accessModes: [{{ include "sema.sealedKey.accessMode" . }}]
18
+ {{- if .Values.sealedKey.persistence.storageClass }}
19
+ storageClassName: {{ .Values.sealedKey.persistence.storageClass | quote }}
20
+ {{- end }}
21
+ resources:
22
+ requests:
23
+ storage: {{ .Values.sealedKey.persistence.size | quote }}
24
+ {{- end }}
@@ -11,6 +11,9 @@ metadata:
11
11
  labels: { app: sema-server-v4pro }
12
12
  spec:
13
13
  replicas: {{ .Values.serverV4pro.replicas }}
14
+ {{- with (include "sema.sealedKey.strategy" .) }}
15
+ {{ . | indent 2 }}
16
+ {{- end }}
14
17
  selector:
15
18
  matchLabels: { app: sema-server-v4pro }
16
19
  template:
@@ -75,10 +78,21 @@ spec:
75
78
  - { name: K8S_SANDBOX_IMAGE, value: {{ .Values.sandbox.image | quote }} }
76
79
  - { name: K8S_SANDBOX_IPV6, value: {{ .Values.sandbox.ipv6 | quote }} }
77
80
  - { name: K8S_TOKEN, valueFrom: { secretKeyRef: { name: sema-runner-token-copy, key: token } } }
81
+ {{- /* 耐久审批的显式表态与停驻封签钥匙卷同源(助手 sema.durableApproval / sema.sealedKey.*,见 _helpers.tpl):关持久 ⇒ 显式 false;留空 ⇒ 不渲。 */}}
82
+ {{- with (include "sema.sealedKey.env" .) }}
83
+ {{ . | indent 12 }}
84
+ {{- end }}
78
85
  readinessProbe: # the only probe path is /readyz (/health is diagnostic, always 200)
79
86
  httpGet: { path: /readyz, port: 8090 }
80
87
  initialDelaySeconds: 5
81
88
  periodSeconds: 5
89
+ {{- /* <数据根>/sealed-key 的持久卷(整个目录:模型钥匙 + 停驻封签钥匙);关持久时两块都不出。 */}}
90
+ {{- with (include "sema.sealedKey.volumeMounts" .) }}
91
+ {{ . | indent 10 }}
92
+ {{- end }}
93
+ {{- with (include "sema.sealedKey.volumes" .) }}
94
+ {{ . | indent 6 }}
95
+ {{- end }}
82
96
  ---
83
97
  apiVersion: v1
84
98
  kind: Service
@@ -16,6 +16,9 @@ metadata:
16
16
  namespace: {{ .Release.Namespace }}
17
17
  spec:
18
18
  replicas: {{ .Values.server.replicas }}
19
+ {{- with (include "sema.sealedKey.strategy" .) }}
20
+ {{ . | indent 2 }}
21
+ {{- end }}
19
22
  selector:
20
23
  matchLabels: { app: sema-server }
21
24
  template:
@@ -88,10 +91,21 @@ spec:
88
91
  - { name: K8S_SANDBOX_IMAGE, value: {{ .Values.sandbox.image | quote }} }
89
92
  - { name: K8S_SANDBOX_IPV6, value: {{ .Values.sandbox.ipv6 | quote }} }
90
93
  - { name: K8S_TOKEN, valueFrom: { secretKeyRef: { name: sema-runner-token-copy, key: token } } }
94
+ {{- /* 耐久审批的显式表态与停驻封签钥匙卷同源(助手 sema.durableApproval / sema.sealedKey.*,见 _helpers.tpl):关持久 ⇒ 显式 false;留空 ⇒ 不渲。 */}}
95
+ {{- with (include "sema.sealedKey.env" .) }}
96
+ {{ . | indent 12 }}
97
+ {{- end }}
91
98
  readinessProbe: # the only probe path is /readyz (/health is diagnostic, always 200)
92
99
  httpGet: { path: /readyz, port: 8090 }
93
100
  initialDelaySeconds: 5
94
101
  periodSeconds: 5
102
+ {{- /* <数据根>/sealed-key 的持久卷(整个目录:模型钥匙 + 停驻封签钥匙);关持久时两块都不出。 */}}
103
+ {{- with (include "sema.sealedKey.volumeMounts" .) }}
104
+ {{ . | indent 10 }}
105
+ {{- end }}
106
+ {{- with (include "sema.sealedKey.volumes" .) }}
107
+ {{ . | indent 6 }}
108
+ {{- end }}
95
109
  ---
96
110
  apiVersion: v1
97
111
  kind: Service
@@ -1,5 +1,5 @@
1
1
  # full-single(单节点 k3s dev/测试)覆盖:1 实例 PG、preferred 反亲和(required 在单机=永久
2
- # Pending——真踩)、2 副本 server。用法:
2
+ # Pending——真踩)、2 副本 server(钥匙卷 RWO,见文末)。用法:
3
3
  # helm upgrade --install sema-stack ./chart -n sema --create-namespace \
4
4
  # -f chart/values-full-single.yaml --set server.image=… --set …(凭据)
5
5
  pg:
@@ -7,3 +7,7 @@ pg:
7
7
  antiAffinity: preferred
8
8
  server:
9
9
  replicas: 2
10
+ # 钥匙卷:单节点上的 2 个副本在同一个节点,ReadWriteOnce 的卷同节点可共用 —— 不必为它给节点装 NFS 客户端(缺省的 ReadWriteMany 要 RWX 存储类)。
11
+ sealedKey:
12
+ persistence:
13
+ accessMode: ReadWriteOnce
@@ -49,6 +49,10 @@ server:
49
49
  modelApiKey: "" # REQUIRED
50
50
  modelVision: "false"
51
51
  requirePrincipal: "false" # users=multi 时 true(身份隔离;compose 路径同名 env)
52
+ # 耐久审批(env DURABLE_APPROVAL;停驻 / 续跑 / /v1/approvals 整条路由)。留空 = 图表不渲这个 env,开关归引擎按姿态定
53
+ # (单用户 + 有耐久店 ⇒ 开;requirePrincipal=true 的多用户形 ⇒ 关);"true" / "false" = 显式表态,原样渲给每只 worker。
54
+ # sealedKey.persistence.enabled=false 时图表固定渲 "false"(钥匙跨不过重启,停驻行就续不了);此处再写 "true" ⇒ 渲染即拒。
55
+ durableApproval: ""
52
56
  # region=global 时置 "global"(B5 env-first);cn 留空 = 域内默认
53
57
  sandboxPkgSource: ""
54
58
  # k8s exec lane 的 TLS 姿势:true=渲染 K8S_INSECURE_TLS=true(chart 0.1.0 as-built);
@@ -66,6 +70,36 @@ server:
66
70
  s3PublicBucket: ""
67
71
  sendUserFileSandboxPutEndpoint: ""
68
72
 
73
+ # 停驻封签钥匙的持久卷:server 的 <数据根>/sealed-key/ 整个目录挂一只 PVC(缺省开)。
74
+ # 为什么:耐久审批(单用户 + 有耐久店时引擎缺省就开)停驻的任务,续跑上下文里请求自带的凭据只以封签落盘,封签的私钥只在这个目录里
75
+ # (子目录 checkpoint-ctx-keys/;同目录还有模型钥匙)——钥匙不进库。目录不持久 ⇒ 每次重启换一把钥匙;多副本各一份 ⇒ 换副本就换了钥匙。
76
+ # 两种结局相同:重启 / 换副本之前停驻、带请求凭据的任务续跑恒答 409 conflict.checkpoint_ctx_unsealable(reason key_not_held),只能作为新任务重提。
77
+ # 挂在哪:容器内 /root/.ai-agent/sealed-key(镜像以 root 跑、本图表不设数据根变量 ⇒ 数据根是缺省 /root/.ai-agent)。
78
+ # 主 worker 与启用的 serverV4pro 变体共用同一只 PVC(它们读同一个库里的停驻行)。
79
+ # 访问模式缺省随共享这只卷的 pod 数(server.replicas + 启用的 serverV4pro.replicas):1 只 ⇒ ReadWriteOnce;多只 ⇒ ReadWriteMany;`accessMode` 可显式盖(见下)。
80
+ # 有效访问模式是 ReadWriteOnce 时,server / serverV4pro 两只 Deployment 用 Recreate 更新策略(RWO 卷同时只能被一个节点挂,滚动更新的新 Pod 落在别的节点就永远等不到卷;
81
+ # 代价:升级窗口内这一只 Deployment 短暂没有副本)。
82
+ # ⚠ ReadWriteMany 要集群的存储类支持 RWX(Longhorn 的 RWX 走 NFS 共享管理器,每个节点要装 NFS 客户端 —— cluster-up.sh 不替你装;NFS / CephFS 类存储本就支持;
83
+ # local-path 与多数云盘类不支持,PVC 会一直 Pending、server Pod 起不来)。没有 RWX 的集群出路有三:server.replicas=1(RWO 即可);
84
+ # 单节点多副本(所有 pod 在同一个节点)显式 accessMode: ReadWriteOnce(随包的 values-full-single.yaml 就是这么写的);或关掉持久(下面 enabled: false,耐久审批随之关 —— 代价见下)。
85
+ # ⚠ PVC 的 accessModes 建好后不可改:副本数跨过 1 的边界(1 ⇄ 多;启用 v4pro 也算一只)时 helm upgrade 会撞 PVC「spec is immutable」—— 响亮失败,不静默;
86
+ # 这只卷里是私钥,不要为了过这个错直接删 PVC:先把停驻行结掉(随包排空检查脚本数一数)或备份钥匙文件,再换卷。
87
+ # PVC 带 helm.sh/resource-policy: keep:`helm uninstall` 与把 enabled 改成 false 的 upgrade 都不删它(钥匙留着;确认不要了再 `kubectl -n <ns> delete pvc sema-server-sealed-key`);
88
+ # 同名 release 重装会接管这只留下的 PVC。
89
+ # ⚠ 空卷上多副本并发首启:每个副本看到空目录各自生成一把钥匙,各副本只持有自己那一把,直到下次重启 —— 首装后 `kubectl -n <ns> rollout restart deploy/sema-server`
90
+ # 一次(启用 serverV4pro 时再加 deploy/sema-server-v4pro;NOTES 也说这句),重启之后每个副本读到目录里的全部钥匙,从此一致。
91
+ sealedKey:
92
+ persistence:
93
+ # true(缺省)= 建 PVC 并挂到上面的路径。
94
+ # false = 不建卷、不挂载,图表**显式**给每只 worker 设 DURABLE_APPROVAL=false(不产生续不了的停驻行;NOTES 也打印这一句);
95
+ # 此时 server.durableApproval 再写 "true" ⇒ 渲染即拒。代价:耐久审批整条关(审批卡停驻 / 续跑、/v1/approvals 路由、/v1/capabilities 的 approvals 位);
96
+ # web-admin 贴的模型钥匙 sealedApiKey 的私钥也跨不过重启(重启后那些条目答 stale_ciphertext,要对着新公钥重封)。
97
+ # 只收布尔:字符串 "false" 在模板里恒为真,会静默保持开着,所以渲染即拒。
98
+ enabled: true
99
+ size: 64Mi # 只放几个几百字节的钥匙文件;留余量给文件系统开销
100
+ storageClass: "" # 空 = 集群默认 SC;访问模式是 ReadWriteMany 时要点名一个支持它的类
101
+ accessMode: "" # 空 = 随共享 pod 数派生(1 只 RWO,多只 RWX);"ReadWriteOnce" / "ReadWriteMany" = 显式盖,其它词渲染即拒
102
+
69
103
  # v4-pro 变体 worker(2026-07-11 手工 kubectl 资源收编进 chart;同镜像/同 env 面,仅 MODEL_ID 不同;
70
104
  # 公网入口=Gcore LB listener 8091 → nodePort,LB 面不归 chart 管)
71
105
  serverV4pro:
@@ -161,7 +161,7 @@ export declare function checkAdoptionPrincipalShape(fromPrincipal: string, toPri
161
161
  */
162
162
  export declare function checkAdoptionWidths(fromPrincipal: string, toPrincipal: string): string | undefined;
163
163
  /** 两段键的 tenant / 属主段前缀(值对由 DISTINCT 扫描按前缀解出;扫描 SQL 的前缀臂由本表生成,一处):`proj:` / `userproj:`(core 文法)
164
- * 与单用户项目层 `userrepo:`(S-640,文法 `project-layer-key.ts`:属主段 = principal 的段编码)。 */
164
+ * 与单用户项目层 `userrepo:`([ref],文法 `project-layer-key.ts`:属主段 = principal 的段编码)。 */
165
165
  export declare const MEMORY_PROJECT_SCOPE_PREFIXES: readonly string[];
166
166
  /**
167
167
  * 一根身份轴上,「旧值 → 新值」的**值对**。`verbatim` 轴恒只有一对;`memory-scope` 轴的对数 =
@@ -3,11 +3,11 @@
3
3
  * `server/designs/2026-08-31-s38-local-stream-approval-v1.md`,v1 三臂 + v1.1 §6 两件增益)——
4
4
  * local 车道(`DB_BACKEND=local`)的 **File ask 审计店**。SINGLE-FILE 店([ref] A12 单文件店纪律,
5
5
  * 形照 `plugins/memory-optout-grant-store-sql.ts`:一个实现文件、数据形/偏离/坏值姿态全部成文在头注;
6
- * 崩溃安全机制 = append-only JSONL、fsync 逐行、重放容忍撕尾行 —— 追加与重放都走本仓 JSONL 店族的**共用口**(S-967,见下「追加 / 重放口」段))。
6
+ * 崩溃安全机制 = append-only JSONL、fsync 逐行、重放容忍撕尾行 —— 追加与重放都走本仓 JSONL 店族的**共用口**([ref],见下「追加 / 重放口」段))。
7
7
  *
8
- * ## 它治的病([ref] / [ref]① 车定界钉;⚠️ **病因描述是 [ref] 当时的事实,S-384 起已变**)
8
+ * ## 它治的病([ref] / [ref]① 车定界钉;⚠️ **病因描述是 [ref] 当时的事实,[ref] 起已变**)
9
9
  * 当时:local 车道 ask 账进程内易失(`InMemoryApprovalAskStore`),活卡窗内崩溃 = **零痕迹**:重启后
10
- * `/v1/approvals` 两数组空,那次审批连一条审计行都没有。**S-384 起 local 的 ask 账已是持久的**
10
+ * `/v1/approvals` 两数组空,那次审批连一条审计行都没有。**[ref] 起 local 的 ask 账已是持久的**
11
11
  * (`FileApprovalAskStore`),所以「零痕迹」那句不再成立;本店今天还在的理由收窄成它**独有**的那一格:
12
12
  * `crashConverged` 这个 local-only 的 additive 读面(孤儿行的 `orphanState` / `resumeSafe` 两位)—— **腿证据只在这里**
13
13
  * (`legTracked` / `leg_closed` / 关停记号),ask 账没有。🔴 **「这一问还能不能决」不归本店答**:答案源是 ask 账的行状态
@@ -20,10 +20,10 @@
20
20
  * 操作员追溯。
21
21
  *
22
22
  * ## 它**不**做的事(裁 (c) 的边界,与稿 §1 (a) 臂的语义论证同源)
23
- * - **不翻 `streamApproval` 能力位**([ref] 当时的裁 (c);⚠️ **这一位已由 S-384 翻真,不是被本店翻的**):
23
+ * - **不翻 `streamApproval` 能力位**([ref] 当时的裁 (c);⚠️ **这一位已由 [ref] 翻真,不是被本店翻的**):
24
24
  * 当年不翻的理由是「该位在 SQL 车道隐含 durable park 兜底,local 给不了」+「local 的 ask 账是进程内
25
25
  * 易失形」。后半条已由 `FileApprovalAskStore` 消掉(持久账落地);前半条的答案一直在谓词里 ——
26
- * `resolveStreamApprovalGate` 的 `parkFacility` 合取项要求 `backend.checkpoint` 在场 ∧ `DURABLE_APPROVAL`,
26
+ * `resolveStreamApprovalGate` 的 park 设施(`checkpointStore`)合取项要求 `backend.checkpoint` 在场 ∧ `DURABLE_APPROVAL`,
27
27
  * 所以位报 true 的 local 部署**必然**配齐了 File 形 checkpoint 店(`durable-approval-local-e2e` 第一格
28
28
  * 实证:park 行跨双 kill 存活、重启后 decide 驱动 resume 真跑完)。本店与那一位自此无关:它治的是
29
29
  * **活卡窗内崩溃**(park 还没落盘)那一格的零痕迹病,而那一格无论位真位假都不复活 run。
@@ -40,11 +40,11 @@
40
40
  * 收敛器**不**把它当孤儿)+ 宿主自报(在场才带)+ **`cause`(成因闭集 {@link SettleCause},`approval-deny-reasons.ts`)**:
41
41
  * `outcome:"expired"`(非人结局)恒带、人答(`allowed` / `denied`)恒缺席 —— 写口的联合型逼每个非人调用点点名一个;
42
42
  * 词表外 ⇒ 计坏行、结清照认;本版之前落盘的 `expired` 行没有 `cause`(存量审计行不回填,读面缺席即缺席)。
43
- * `cause:"shutdown_before_park"`(S-929)= 这次等待是被**有序关停**结束的 —— `drainForShutdown` 按断连同路收场的活卡;park 路由的那几行**等观察到 core 已处置这次调用才落**(F1:停车行提交 / 承载它的腿退场,后者恒在 `leg_closed` 之前),两者皆无就退出 ⇒ 无此行。
43
+ * `cause:"shutdown_before_park"`([ref])= 这次等待是被**有序关停**结束的 —— `drainForShutdown` 按断连同路收场的活卡;park 路由的那几行**等观察到 core 已处置这次调用才落**(F1:停车行提交 / 承载它的腿退场,后者恒在 `leg_closed` 之前),两者皆无就退出 ⇒ 无此行。
44
44
  * `leg_closed` 腿闭点(`runWithContext` finally;只为铸过审计行的 taskId 落,防账本膨胀):
45
45
  * 「决议之后腿有没有闭」是 decided 臂唯一的机械证据面 —— 没有它,「批完跑完」与
46
46
  * 「批了、执行窗内崩」在账本字节上同形,收敛器只能二选一地撒谎。
47
- * `interrupted_by_shutdown` **有序关停记号**(S-929;`drainForShutdown` 在关停宽限窗满时落,只为铸过审计行、腿仍未闭的 taskId):
47
+ * `interrupted_by_shutdown` **有序关停记号**([ref];`drainForShutdown` 在关停宽限窗满时落,只为铸过审计行、腿仍未闭的 taskId):
48
48
  * 「这条腿是被**有序关停**截断的,不是进程崩了」。它**不是** `leg_closed`(腿没闭:工具可能正执行到一半),所以
49
49
  * 不改变收敛判据,只改变收敛行的 `cause`(`"shutdown_before_park"` 而不是 `"crashed_before_park"`)—— `resumeSafe:false`
50
50
  * 那句「确认上次操作再续跑」的提醒不许因为关停是有序的就丢掉。
@@ -94,13 +94,13 @@
94
94
  * **decided 臂**:批了、执行窗内崩,工具可能有半截副作用 ⇒ `resumeSafe:false`(留人工确认)。
95
95
  * 判据方向刻意**保守**:腿闭是「本进程对该腿的守护结束」,晚于工具真完成 —— 误差方向是「把可能
96
96
  * 干净的批注成待人工确认」,绝不反向。
97
- * - **腿证据只对被追踪行作数**(S-945,[ref]):`leg_closed` 与 `interrupted_by_shutdown` 都只按 taskId 落,只对 `ask.legTracked` 的行作证据 ——
97
+ * - **腿证据只对被追踪行作数**([ref],[ref]):`leg_closed` 与 `interrupted_by_shutdown` 都只按 taskId 落,只对 `ask.legTracked` 的行作证据 ——
98
98
  * 委派 / 后台子代 ask 行的 taskId 是宿主 run,宿主腿的记录不证明子代那次调用的任何事(下面三条判据都经这一口读)。
99
99
  * - **腿闭反证门**(codex R1-F1 部分采):有 `ask`(被追踪)、无 `settle`、却有本 taskId 的后继 `leg_closed` ⇒
100
100
  * 这不是崩溃孤儿(settle 恒先于 ask() 返回、腿闭恒在其后),只能是「settle 行写丢在一条跑完了的
101
101
  * 腿上」的审计断档组 —— **不收敛**(标 pending = 把可能已执行的批注成 resumeSafe:true,方向反;
102
102
  * 标 decided = 凭空断言人批了),`inconsistent` 计数进 boot 日志。
103
- * - **收敛行的 `cause`**(S-929,两臂同一条):该组最后一个事件行(settle 行,缺席则 ask 行)之后、它的收敛行(重投影时)
103
+ * - **收敛行的 `cause`**([ref],两臂同一条):该组最后一个事件行(settle 行,缺席则 ask 行)之后、它的收敛行(重投影时)
104
104
  * 之前,有本 taskId 的 `interrupted_by_shutdown` 记号(被追踪行才认)⇒ `"shutdown_before_park"`(腿被有序关停截断);否则 `"crashed_before_park"`。
105
105
  * 记号**只改成因注,不改收敛判据**:有序关停下已批而腿未闭,工具照样可能半截副作用(decided 臂 `resumeSafe:false` 照留)。
106
106
  * 有序关停下的**未决**活卡由 `drainForShutdown` 先落 settle(`cause:"shutdown_before_park"`)⇒ 不再是 pending 孤儿(本就不收敛);
@@ -108,7 +108,7 @@
108
108
  * 与崩溃同路,证据不丢;腿被打过记号 ⇒ `shutdown_before_park`,零活流 / 子代腿无记号 ⇒ `crashed_before_park`)。
109
109
  * - 其余(denied / expired / park 路由 / 已收敛)⇒ 不收敛。三条成文残留(fail-safe 方向,宁漏不误):
110
110
  * ① `legTracked:false` 的 decided 行拿不到腿闭信号 ⇒ decided 臂对它不收(pending 臂不受此限 —— 但也因此没有腿闭反证门护着:
111
- * 子代卡照列 pending 孤儿但 `resumeSafe:false` —— 没有腿证据就不作「零执行」正断言(S-945 ⑧,车 SO codex r2 [high];修前 true = 方向反))。
111
+ * 子代卡照列 pending 孤儿但 `resumeSafe:false` —— 没有腿证据就不作「零执行」正断言([ref] ⑧,车 SO codex r2 [high];修前 true = 方向反))。
112
112
  * 两形同标 false:bg 腿(出处腿不在本协调器 runWithContext 视野)与**委派/bg 子代**(codex
113
113
  * R1-F2:继承链闭包携宿主身份,origin.taskId = 宿主 run,宿主腿退场的 leg_closed 会把「批了、
114
114
  * 子代执行中崩」误反证成「跑完了」—— 铸造点 `!child` 合取如实标 false);
@@ -142,20 +142,20 @@
142
142
  * **终态成因注**(收敛器 fail-closed 地把孤儿收成 DENIED 同码并在读面显形),它的存在恰恰是响亮化
143
143
  * 本身,不是静默降级。本店的静默降级臂有两条:① 运行期 append 失败(审批可用性不押在审计盘上),已按
144
144
  * [ref] 律走 `recordFailOpen("server.approval-ask-audit.append-failed")`(census 第 53 行);② boot 重放跳过中间坏行
145
- * (S-967 起由重放属主逐条披露 + `server.approval-ask-audit.corrupt-record-skipped`,census 第 106 行;此前只计 `corruptLines`)。
145
+ * ([ref] 起由重放属主逐条披露 + `server.approval-ask-audit.corrupt-record-skipped`,census 第 106 行;此前只计 `corruptLines`)。
146
146
  * boot 期(mkdir/重放的读错)失败则**拒启**(与 File 店族同律:`FileStorageBackend` ctor 同 root 同姿态)——
147
147
  * 一台「审计写不进却继续批」的机器 = [ref] 换个皮回来。
148
148
  *
149
- * ## 追加 / 重放口(S-967:一只追加日志实现,不留两份)
149
+ * ## 追加 / 重放口([ref]:一只追加日志实现,不留两份)
150
150
  * 追加 = core `AppendLog`(惰性打开,首次 append 才铸文件;一行 = 单次 `writeSync` 的 `JSON.stringify(rec) + "\n"`、`fsync=true` 逐行;文件 0o600、目录 0o700;
151
151
  * 末段无换行的字节在打开与每次追加前由它按 core 的同一只判词修 —— 解析成对象 = 丢了换行的整条记录,**补换行、字节保留**;不解析 = 崩溃半写(撕尾),
152
- * **截断**回最后一个换行;解析成非对象 = 截断并披露(core 7.38.2 #1278))。重放 = `replayJsonlSkipping`(登记名 `approval-ask-audit`,fail-open + F 类 tag
152
+ * **截断**回最后一个换行;解析成非对象 = 截断并披露(core 7.38.2 [ref]))。重放 = `replayJsonlSkipping`(登记名 `approval-ask-audit`,fail-open + F 类 tag
153
153
  * `server.approval-ask-audit.corrupt-record-skipped`:中间坏行逐条披露 + 计数;撕尾不计,无换行的完整末行照常进重放)。本店只剩两样自己的东西:**形判据**({@link LEDGER_SHAPE},逐 `kind` 的最小必填键
154
154
  * + 词表外成因行「计坏行、结清照认」)与**失败方向**(运行期 append 失败 ⇒ `recordFailOpen("server.approval-ask-audit.append-failed")`,审批照常)。
155
- * **一行「在账」的判据 = 它的字节解析成一只对象**(与共用口同一条,core 7.38.2 #1278:读面、打开修尾、追加门修尾三站问同一只判词;换行只是边界的拼法,
155
+ * **一行「在账」的判据 = 它的字节解析成一只对象**(与共用口同一条,core 7.38.2 [ref]:读面、打开修尾、追加门修尾三站问同一只判词;换行只是边界的拼法,
156
156
  * 不是记录存在的条件 —— 没有一只 JSON 对象的真前缀能被解析,所以解析得出的末行就是整条记录;失败的 append 由 core 截回它开写处,不留自己的字节)。
157
157
  * 修前本店手写了第二份追加 / 修尾(私有的脏尾标 + 写字节注入席),撕尾用**孤立换行隔离**保留残字节而不是截断;与共用口的形差(撕尾隔离 ⇄ 截断、撕尾计数、
158
- * 字节全落却报错后多落的孤立换行、空白行计数、坏行披露)逐条记在 CHANGELOG 7.111.0 S-967 段,读数钉 = `test/approval-ask-audit.test.ts` 的「S-967」两组;
158
+ * 字节全落却报错后多落的孤立换行、空白行计数、坏行披露)逐条记在 CHANGELOG 7.111.0 [ref] 段,读数钉 = `test/approval-ask-audit.test.ts` 的「[ref]」两组;
159
159
  * 「完整 JSON 却缺换行的末行」一条(R2)在 core 7.38.2 下与修前同形(认下 + 补换行,C2 正向钉),不再是形差。
160
160
  *
161
161
  * ## 装配(为什么不在 `plugins/store-backend.ts`)
@@ -221,7 +221,7 @@ export type AuditSettleInput = (AuditSettleBase & {
221
221
  outcome: typeof SETTLE_OUTCOME.EXPIRED;
222
222
  cause: SettleCause;
223
223
  });
224
- /** 收敛行 `cause` 的闭集(`GET /v1/approvals` `crashConverged[].cause`):崩溃孤儿 / 有序关停截断的腿(S-929 +1;与 `crashed_before_park` 同形)。
224
+ /** 收敛行 `cause` 的闭集(`GET /v1/approvals` `crashConverged[].cause`):崩溃孤儿 / 有序关停截断的腿([ref] +1;与 `crashed_before_park` 同形)。
225
225
  * 🔴 **词表属主 = `approval-deny-reasons.ts` 的 {@link HolderGoneCause}**(本表两词的子集):启动收敛把同一问的问账行收成 VOID 时 `denied_reason` 写的就是这两个词 ——
226
226
  * 同一问在 `crashConverged` 与决断口 410 体上只有一个成因词。wire 值闭集登记在 `trace/self-minted-wire.ts` 的 `crashConvergedCause`
227
227
  * (`satisfies Record<HolderGoneCause, …>` 双向绑定 ⇒ 加词不登记 = tsc 红,wire 变更清单从那张表 diff —— F3)。 */
@@ -246,7 +246,7 @@ export interface AuditLateSettleInput {
246
246
  * 的成因,[ref] 件6③ 同律)。`"person"` = 运维经审批通道做的决定;`"sla_timeout"` = 宿主自己的 SLA 扫
247
247
  * 在行的 deadline 上判的。今天两条 HTTP decide 腿恒 `"person"`,但真值以调用方为准。
248
248
  *
249
- * 🔴 S-136(core 7.6.0 [ref] S6-A):这一格此前记的是 core 的**结算词**(`ApprovalSettledBy`,
249
+ * 🔴 [ref](core 7.6.0 [ref] S6-A):这一格此前记的是 core 的**结算词**(`ApprovalSettledBy`,
250
250
  * 已删)。改记**事实**而不是词,理由是 core 的 `@contract settlement.single_mint` 逐字写着「宿主永不
251
251
  * 铸词」—— 账本要是记一个自己拼出来的 `human_refused`,server 就成了同一套词表的**第二个铸点**,
252
252
  * 而两个铸点的分歧一定是静默的。词的属主留在 core,取证要词就去读行的 `resolvedOutcome.gateOutcome`
@@ -265,7 +265,7 @@ export interface ApprovalAskAuditSink {
265
265
  recordSettle(input: AuditSettleInput): void;
266
266
  /** 腿闭点(`runWithContext` finally)。只为铸过审计行的 taskId 真落行(店内去重)。 */
267
267
  noteLegClosed(taskId: string): void;
268
- /** S-929 有序关停记号点(`drainForShutdown` 宽限窗满时调一次):铸过审计行、腿仍未闭的每个 taskId 各落一条
268
+ /** [ref] 有序关停记号点(`drainForShutdown` 宽限窗满时调一次):铸过审计行、腿仍未闭的每个 taskId 各落一条
269
269
  * `interrupted_by_shutdown`。 */
270
270
  noteLegsInterruptedByShutdown(): void;
271
271
  /** [ref] 迟到人工结算点(HTTP decide 两腿)。**纯观察**:自吞一切失败,不返回受否,绝不改变结算面。 */
@@ -301,7 +301,7 @@ export interface CrashConvergedRow {
301
301
  * 不是语义(改这个值会让把它当闭集判别式读的消费端整行丢弃,须与消费端同窗改)。
302
302
  */
303
303
  decision: "denied";
304
- /** 成因注(闭集 {@link HolderGoneCause}):`crashed_before_park` = 进程崩了;`shutdown_before_park`(S-929)= 腿被**有序关停**截断
304
+ /** 成因注(闭集 {@link HolderGoneCause}):`crashed_before_park` = 进程崩了;`shutdown_before_park`([ref])= 腿被**有序关停**截断
305
305
  * (判据见头注「收敛行的 `cause`」)。两者的 `orphanState` / `resumeSafe` 判据相同。 */
306
306
  cause: HolderGoneCause;
307
307
  orphanState: CrashOrphanState;
@@ -339,13 +339,13 @@ export declare class FileApprovalAskAuditStore implements ApprovalAskAuditSink,
339
339
  private readonly replayed;
340
340
  /** 前世账本里的腿闭事件(taskId + 行序;decided 臂按「决议行之后」判)。 */
341
341
  private readonly replayedLegClosed;
342
- /** S-929:前世账本里的有序关停记号(taskId + 行序;收敛行 `cause` 的判据,见头注)。 */
342
+ /** [ref]:前世账本里的有序关停记号(taskId + 行序;收敛行 `cause` 的判据,见头注)。 */
343
343
  private readonly replayedShutdownMarks;
344
344
  /** 已收敛行(读面数据源;含前世已收敛 + 本次 boot 新收敛)。owner 只做 scope 门,不上 wire。 */
345
345
  private readonly convergedRows;
346
346
  /** 本进程铸过审计行、且腿闭信号可达的 taskId(腿闭去重 + 防无关腿刷账本)。 */
347
347
  private readonly openLegTasks;
348
- /** S-929:本进程已落过有序关停记号的 taskId(记号去重;与腿追踪集分开 —— 记号之后的真实腿闭照落)。 */
348
+ /** [ref]:本进程已落过有序关停记号的 taskId(记号去重;与腿追踪集分开 —— 记号之后的真实腿闭照落)。 */
349
349
  private readonly shutdownMarkedLegs;
350
350
  private convergedOnce;
351
351
  /**
@@ -367,12 +367,12 @@ export declare class FileApprovalAskAuditStore implements ApprovalAskAuditSink,
367
367
  * boot 期 fail-stop:建目录 / 重放的**读错**(非 ENOENT)⇒ 抛 ⇒ **拒启**(File 店族同律)。root = local 数据根
368
368
  * (`config.localDataRoot`;与 `LocalBackend` 同源,见头注装配段)。
369
369
  * 0o700 目录 + 0o600 账本:行携租户身份(owner/sessionId),不得组/他人可读(目录由 core `ensureDir`、账本由 `AppendLog` 铸)。
370
- * 追加口惰性打开(S-967,与 `FileUserInputLedgerStore` 同形):末段的修(撕尾截断 / 完整末行补换行)随首次 append 的打开发生 —— 重放读数不依赖它
370
+ * 追加口惰性打开([ref],与 `FileUserInputLedgerStore` 同形):末段的修(撕尾截断 / 完整末行补换行)随首次 append 的打开发生 —— 重放读数不依赖它
371
371
  * (撕尾不进重放、完整末行进重放,修前修后读数同);
372
372
  * 目录已在而盘后来满 / 变只读 ⇒ boot 照常,append 走 `recordFailOpen`。
373
373
  * @param internals.appendLog 测试注入席(见 {@link AuditAppendPort})。
374
374
  *
375
- * 坏行披露 = F 类座纪律(S-1000:无 warn 出口)—— 每条跳过的行 `recordFailOpen` 计数 + 探针行,warn 每进程每 tag 一次。
375
+ * 坏行披露 = F 类座纪律([ref]:无 warn 出口)—— 每条跳过的行 `recordFailOpen` 计数 + 探针行,warn 每进程每 tag 一次。
376
376
  */
377
377
  constructor(root: string, internals?: {
378
378
  appendLog?: (path: string) => AuditAppendPort;
@@ -405,7 +405,7 @@ export declare class FileApprovalAskAuditStore implements ApprovalAskAuditSink,
405
405
  recordAsk(input: AuditAskInput): void;
406
406
  recordSettle(input: AuditSettleInput): void;
407
407
  noteLegClosed(taskId: string): void;
408
- /** S-929:有序关停宽限窗满时仍未闭的腿各落一条记号。只为铸过审计行、腿仍开着的 taskId 落;记号有**自己的**去重集 ——
408
+ /** [ref]:有序关停宽限窗满时仍未闭的腿各落一条记号。只为铸过审计行、腿仍开着的 taskId 落;记号有**自己的**去重集 ——
409
409
  * 腿追踪集 `openLegTasks` **不动**:进程在记号之后仍可能活几秒(server / backend 收尾),期间真跑完的腿照常落 `leg_closed`
410
410
  * (codex r1 F1 [high]:清空追踪集会吞掉这份真实证据,而「settle 写丢 + 腿跑完」时正是它让腿闭反证门判 inconsistent,
411
411
  * 吞掉就把一次已执行的批投影成 pending / `resumeSafe:true`)。迟到的腿闭落在记号之后 ⇒ 收敛判据照常认它(腿跑完了,不是孤儿)。 */
@@ -449,7 +449,7 @@ export declare class FileApprovalAskAuditStore implements ApprovalAskAuditSink,
449
449
  * 没有有序关停的证据,就不说它是有序关停。判据读的是构造时冻结的前世账本 ⇒ 同一份账本跨几次启动恒得同一个词。
450
450
  */
451
451
  causeFor(approvalId: string): HolderGoneCause;
452
- /** S-929 收敛行的成因注(判据见头注「收敛行的 `cause`」):组的最后一个事件行之后、收敛行(若已收敛)之前,有本 taskId 的
452
+ /** [ref] 收敛行的成因注(判据见头注「收敛行的 `cause`」):组的最后一个事件行之后、收敛行(若已收敛)之前,有本 taskId 的
453
453
  * 有序关停记号 ⇒ `shutdown_before_park`;否则 `crashed_before_park`。 */
454
454
  private causeOf;
455
455
  private projectRow;
@@ -40,13 +40,13 @@ export type AskIdentityRequest = Pick<AskRequest, "toolCallId" | "classes"> & {
40
40
  };
41
41
  /** ask_id = sha256('ask' ⊕ sourceTaskId ⊕ runId ⊕ toolCallId ⊕ legKey ⊕ parentToolCallId ⊕ 类集规范形).slice(0,64)。
42
42
  * 确定性:同参数元组(含重试/failover/闭包再入)永远派生同一个 id——这是 ensureAsk 幂等 upsert 成立的前提;
43
- * 同调用不同类集 ⇒ 不同 id(S-944)。 */
43
+ * 同调用不同类集 ⇒ 不同 id([ref])。 */
44
44
  export declare function deriveAskId(sourceTaskId: string, runId: string, legKey: string, request: AskIdentityRequest): string;
45
45
  /** batch_id = sha256('batch' ⊕ sourceTaskId ⊕ runId ⊕ legKey).slice(0,64)。同一 (sourceTaskId, runId,
46
46
  * legKey) 恒派生同一批——批 = 同一决策点的兄弟 ask 集合,故不掺 toolCallId。 */
47
47
  export declare function deriveBatchId(sourceTaskId: string, runId: string, legKey: string): string;
48
48
  /**
49
- * 🔴 S-689 codex R1-F1:**单 ask 批** —— batch_id = sha256('ask-batch' ⊕ askId).slice(0,64)。
49
+ * 🔴 [ref] codex R1-F1:**单 ask 批** —— batch_id = sha256('ask-batch' ⊕ askId).slice(0,64)。
50
50
  *
51
51
  * 批是 **park 路由的单位**:窗到期赢家把整批转投递面(OPEN → ROUTING_UNBOUND)、兄弟连坐 VOID,core 随后 park,
52
52
  * 这条腿就此结束 —— 所以「整腿一批」成立。不走 park 路由的部署(`UNATTENDED_APPROVAL_POLICY=deny`)上这个前提