@sema-agent/server 7.147.0 → 7.148.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 (725) hide show
  1. package/MIGRATION.md +1039 -24
  2. package/README.md +20 -7
  3. package/README.zh-CN.md +14 -8
  4. package/USAGE.md +380 -163
  5. package/deploy/sema-up/README.md +16 -5
  6. package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
  7. package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
  8. package/deploy/sema-up/chart/values.yaml +3 -2
  9. package/deploy/sema-up/cluster-up.sh +74 -176
  10. package/deploy/sema-up/kube-up.sh +29 -49
  11. package/deploy/sema-up/lib/chart-run.sh +23 -0
  12. package/deploy/sema-up/lib/dataroot.sh +3 -3
  13. package/deploy/sema-up/lib/health.sh +62 -13
  14. package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
  15. package/deploy/sema-up/lib/helm-values-kube.py +35 -0
  16. package/deploy/sema-up/lib/regcred.py +8 -0
  17. package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
  18. package/deploy/sema-up/lib/remote/image-import.sh +6 -0
  19. package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
  20. package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
  21. package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
  22. package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
  23. package/deploy/sema-up/lib/render-stack.py +17 -0
  24. package/deploy/sema-up/lib/shell-text.sh +87 -0
  25. package/deploy/sema-up/lib/usage-flags.txt +10 -0
  26. package/deploy/sema-up/lib/usage-head.txt +1 -0
  27. package/deploy/sema-up/lib/usage-tail.txt +13 -0
  28. package/deploy/sema-up/preflight.sh +10 -8
  29. package/deploy/sema-up/sema-up.sh +14 -39
  30. package/deploy/sema-up/smoke.sh +7 -6
  31. package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
  32. package/deploy/sema-up/stack/compose.yaml +13 -1
  33. package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
  34. package/dist/adoption/plan.d.ts +24 -0
  35. package/dist/adoption/plan.js +53 -1
  36. package/dist/adoption/runner.d.ts +10 -1
  37. package/dist/adoption/runner.js +36 -16
  38. package/dist/adoption/wire.d.ts +3 -3
  39. package/dist/approval-card.d.ts +28 -30
  40. package/dist/approval-gate-currency.js +3 -2
  41. package/dist/approval-reconciler.d.ts +4 -13
  42. package/dist/approval-reconciler.js +2 -2
  43. package/dist/approval.d.ts +13 -11
  44. package/dist/approval.js +3 -3
  45. package/dist/audit.d.ts +10 -3
  46. package/dist/audit.js +15 -7
  47. package/dist/auth-bridge.d.ts +0 -14
  48. package/dist/auth-bridge.js +0 -7
  49. package/dist/auto-mode-face.d.ts +10 -7
  50. package/dist/auto-mode-face.js +7 -4
  51. package/dist/background-agent-name.d.ts +19 -1
  52. package/dist/background-agent-name.js +12 -2
  53. package/dist/background-session-reap.d.ts +1 -1
  54. package/dist/bake-runner/main.js +9 -6
  55. package/dist/bench/s1/arms.js +6 -5
  56. package/dist/bench/s1/live-deps.js +5 -2
  57. package/dist/bench/s1/run-firm.js +6 -5
  58. package/dist/bind-host.d.ts +25 -0
  59. package/dist/bind-host.js +25 -0
  60. package/dist/boot/adoption.d.ts +3 -0
  61. package/dist/boot/adoption.js +1 -0
  62. package/dist/boot/deployment-mods.d.ts +1 -1
  63. package/dist/boot/execution-env.d.ts +17 -7
  64. package/dist/boot/execution-env.js +37 -31
  65. package/dist/boot/exit-boundary.d.ts +2 -2
  66. package/dist/boot/exit-boundary.js +6 -5
  67. package/dist/boot/fatal-exit.d.ts +3 -5
  68. package/dist/boot/fatal-exit.js +2 -2
  69. package/dist/boot/leader.d.ts +15 -0
  70. package/dist/boot/leader.js +17 -15
  71. package/dist/boot/memory-consolidation.d.ts +37 -29
  72. package/dist/boot/memory-consolidation.js +11 -5
  73. package/dist/boot/org-memory.js +1 -1
  74. package/dist/boot/parked-revive-gate.js +2 -2
  75. package/dist/boot/reapers.d.ts +4 -3
  76. package/dist/boot/reapers.js +19 -16
  77. package/dist/boot/resolve-spec.d.ts +5 -3
  78. package/dist/boot/resolve-spec.js +55 -67
  79. package/dist/boot/retention-lane.d.ts +4 -4
  80. package/dist/boot/retention-lane.js +2 -2
  81. package/dist/boot/runner-deps.d.ts +28 -7
  82. package/dist/boot/runner-deps.js +11 -4
  83. package/dist/boot/runtime-caps.d.ts +2 -2
  84. package/dist/boot/runtime-caps.js +16 -2
  85. package/dist/boot/session-faces.d.ts +16 -7
  86. package/dist/boot/session-faces.js +114 -94
  87. package/dist/boot/shutdown.d.ts +5 -4
  88. package/dist/boot/shutdown.js +6 -4
  89. package/dist/boot/stage-01-config.js +9 -1
  90. package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
  91. package/dist/boot/stage-02-web-admin-pull.js +6 -1
  92. package/dist/boot/stage-03-store-backend.d.ts +3 -0
  93. package/dist/boot/stage-03-store-backend.js +4 -3
  94. package/dist/boot/stage-04-stores.d.ts +2 -0
  95. package/dist/boot/stage-04-stores.js +2 -2
  96. package/dist/boot/stage-05-execution-env.d.ts +7 -3
  97. package/dist/boot/stage-05-execution-env.js +2 -2
  98. package/dist/boot/stage-06-runners.d.ts +10 -12
  99. package/dist/boot/stage-06-runners.js +23 -15
  100. package/dist/boot/stage-07-capability-layer.d.ts +11 -8
  101. package/dist/boot/stage-07-capability-layer.js +5 -3
  102. package/dist/boot/stage-08-reapers.d.ts +11 -8
  103. package/dist/boot/stage-08-reapers.js +3 -3
  104. package/dist/boot/stage-09-leader.d.ts +12 -15
  105. package/dist/boot/stage-09-leader.js +12 -4
  106. package/dist/boot/stage-10-http-server.d.ts +12 -15
  107. package/dist/boot/stage-10-http-server.js +7 -4
  108. package/dist/boot/store-evidence.d.ts +20 -0
  109. package/dist/boot/store-evidence.js +13 -0
  110. package/dist/boot/stores.d.ts +3 -0
  111. package/dist/boot/stores.js +21 -10
  112. package/dist/boot/task-list-lane.d.ts +4 -4
  113. package/dist/boot/web-admin.d.ts +4 -2
  114. package/dist/boot/web-admin.js +55 -35
  115. package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
  116. package/dist/boot-reclaim.d.ts +3 -1
  117. package/dist/boot-reclaim.js +1 -1
  118. package/dist/brain.d.ts +7 -18
  119. package/dist/brain.js +5 -17
  120. package/dist/budget.js +6 -6
  121. package/dist/capabilities/center-plugins.d.ts +7 -1
  122. package/dist/capabilities/center-plugins.js +32 -10
  123. package/dist/capabilities/center-wiring.js +1 -1
  124. package/dist/capabilities/composite-members.d.ts +2 -2
  125. package/dist/capabilities/composite-members.js +2 -2
  126. package/dist/capabilities/repo-tools.d.ts +2 -0
  127. package/dist/capabilities/repo-tools.js +14 -12
  128. package/dist/capabilities/scenarios.d.ts +6 -15
  129. package/dist/capabilities/scenarios.js +11 -16
  130. package/dist/capabilities/skills.d.ts +1 -1
  131. package/dist/capabilities/tool-defer.d.ts +1 -1
  132. package/dist/capability-facts.d.ts +38 -11
  133. package/dist/capability-facts.js +47 -8
  134. package/dist/card-void.d.ts +4 -4
  135. package/dist/card-void.js +1 -1
  136. package/dist/center-credential-renewer.d.ts +6 -2
  137. package/dist/center-credential-renewer.js +7 -3
  138. package/dist/config-catalog.d.ts +16 -1
  139. package/dist/config-catalog.js +62 -56
  140. package/dist/config-dir-trust.d.ts +37 -4
  141. package/dist/config-dir-trust.js +88 -44
  142. package/dist/config-invariants.d.ts +42 -3
  143. package/dist/config-invariants.js +69 -5
  144. package/dist/config-lkg.d.ts +23 -1
  145. package/dist/config-lkg.js +17 -3
  146. package/dist/config-provider.d.ts +9 -9
  147. package/dist/config-provider.js +25 -110
  148. package/dist/config-pull-failure.d.ts +50 -0
  149. package/dist/config-pull-failure.js +48 -0
  150. package/dist/config-types.d.ts +26 -17
  151. package/dist/config.d.ts +8 -16
  152. package/dist/config.js +113 -47
  153. package/dist/delegated-session-owner.d.ts +1 -1
  154. package/dist/deleted-session-ids.d.ts +3 -2
  155. package/dist/deployment-governance.d.ts +3 -3
  156. package/dist/deployment-shape.d.ts +30 -4
  157. package/dist/deployment-shape.js +7 -0
  158. package/dist/egress-redirect.d.ts +25 -7
  159. package/dist/egress-redirect.js +20 -2
  160. package/dist/elicitation.d.ts +6 -5
  161. package/dist/elicitation.js +23 -22
  162. package/dist/engine-identity.d.ts +28 -0
  163. package/dist/engine-identity.js +10 -0
  164. package/dist/entry-problems.d.ts +5 -7
  165. package/dist/entry-problems.js +1 -1
  166. package/dist/env-facts.js +2 -1
  167. package/dist/env-witness.d.ts +7 -0
  168. package/dist/env-witness.js +16 -0
  169. package/dist/execution-lane-caps.d.ts +5 -18
  170. package/dist/execution-lane-caps.js +0 -22
  171. package/dist/execution-placement.d.ts +58 -18
  172. package/dist/execution-placement.js +41 -2
  173. package/dist/field-conflict.d.ts +7 -11
  174. package/dist/field-conflict.js +3 -3
  175. package/dist/file-history-capture.d.ts +3 -3
  176. package/dist/file-history-disclosure.js +1 -0
  177. package/dist/fleet/fleet-bus.d.ts +21 -3
  178. package/dist/fleet/fleet-bus.js +35 -25
  179. package/dist/fleet/fleet-reconciler.js +2 -2
  180. package/dist/fleet/serving-lease.js +3 -3
  181. package/dist/fleet-client.js +3 -3
  182. package/dist/fleet-lease.d.ts +0 -1
  183. package/dist/fleet-lease.js +4 -5
  184. package/dist/history-anchor.d.ts +23 -3
  185. package/dist/history-anchor.js +24 -4
  186. package/dist/hitl-delivery.d.ts +90 -0
  187. package/dist/hitl-delivery.js +98 -0
  188. package/dist/hooks/classic-stations.d.ts +8 -11
  189. package/dist/hooks/classic-stations.js +0 -7
  190. package/dist/hooks/hook-llm.d.ts +5 -1
  191. package/dist/hooks/hook-llm.js +24 -15
  192. package/dist/hooks/hook-runner.d.ts +67 -57
  193. package/dist/hooks/hook-runner.js +260 -186
  194. package/dist/host-lsp-manager.d.ts +22 -8
  195. package/dist/host-lsp-manager.js +4 -1
  196. package/dist/http/active-run-conflict.d.ts +2 -43
  197. package/dist/http/active-run-conflict.js +3 -7
  198. package/dist/http/admission.d.ts +4 -18
  199. package/dist/http/admission.js +75 -78
  200. package/dist/http/approval-sweeps.d.ts +3 -3
  201. package/dist/http/approval-sweeps.js +54 -30
  202. package/dist/http/caller-trust.d.ts +8 -10
  203. package/dist/http/caller-trust.js +1 -2
  204. package/dist/http/claim-heartbeat.d.ts +49 -0
  205. package/dist/http/claim-heartbeat.js +46 -0
  206. package/dist/http/claimed-run.d.ts +4 -3
  207. package/dist/http/dispatch.d.ts +8 -1
  208. package/dist/http/dispatch.js +76 -30
  209. package/dist/http/durable-run-leg.d.ts +3 -3
  210. package/dist/http/durable-run-leg.js +17 -12
  211. package/dist/http/execution-context.d.ts +17 -43
  212. package/dist/http/execution-context.js +7 -5
  213. package/dist/http/health-reader.d.ts +36 -0
  214. package/dist/http/health-reader.js +21 -0
  215. package/dist/http/health-self-report.d.ts +9 -9
  216. package/dist/http/health-self-report.js +4 -4
  217. package/dist/http/idempotency.d.ts +9 -5
  218. package/dist/http/idempotency.js +4 -4
  219. package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
  220. package/dist/http/memory-compliance-failure-reply.js +4 -2
  221. package/dist/http/memory-face-fault-reply.d.ts +67 -0
  222. package/dist/http/memory-face-fault-reply.js +71 -0
  223. package/dist/http/memory-store-refusal-reply.d.ts +1 -1
  224. package/dist/http/memory-store-refusal-reply.js +3 -0
  225. package/dist/http/owner-access.d.ts +391 -67
  226. package/dist/http/owner-access.js +371 -35
  227. package/dist/http/principal-gate.d.ts +24 -81
  228. package/dist/http/principal-gate.js +24 -68
  229. package/dist/http/refusal-body.d.ts +35 -2
  230. package/dist/http/refusal-body.js +34 -0
  231. package/dist/http/request-guards.d.ts +9 -13
  232. package/dist/http/request-guards.js +34 -68
  233. package/dist/http/resume-composition.d.ts +37 -0
  234. package/dist/http/resume-composition.js +18 -0
  235. package/dist/http/resume-ctx-read.d.ts +35 -12
  236. package/dist/http/resume-ctx-read.js +25 -6
  237. package/dist/http/resume-legs.d.ts +21 -18
  238. package/dist/http/resume-legs.js +189 -129
  239. package/dist/http/retired-skill-manifest.d.ts +1 -1
  240. package/dist/http/route-ctx.d.ts +25 -32
  241. package/dist/http/routes/a2a-serve.d.ts +43 -5
  242. package/dist/http/routes/a2a-serve.js +58 -37
  243. package/dist/http/routes/admin-config-refresh.js +2 -2
  244. package/dist/http/routes/admin-drain.js +2 -2
  245. package/dist/http/routes/admin-memory-optout.js +4 -3
  246. package/dist/http/routes/adoption.d.ts +3 -0
  247. package/dist/http/routes/adoption.js +17 -10
  248. package/dist/http/routes/agents-roster.js +13 -7
  249. package/dist/http/routes/approvals-assistant.js +70 -65
  250. package/dist/http/routes/attachments.js +2 -2
  251. package/dist/http/routes/background.d.ts +3 -3
  252. package/dist/http/routes/background.js +9 -17
  253. package/dist/http/routes/capabilities.js +15 -18
  254. package/dist/http/routes/config-catalog.js +2 -2
  255. package/dist/http/routes/devices.d.ts +3 -3
  256. package/dist/http/routes/devices.js +4 -4
  257. package/dist/http/routes/diagnostics.d.ts +27 -3
  258. package/dist/http/routes/diagnostics.js +27 -21
  259. package/dist/http/routes/engine.js +2 -2
  260. package/dist/http/routes/fleet.js +5 -3
  261. package/dist/http/routes/images.js +10 -6
  262. package/dist/http/routes/leader.d.ts +7 -2
  263. package/dist/http/routes/leader.js +12 -3
  264. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  265. package/dist/http/routes/mcp-reconnect.js +7 -15
  266. package/dist/http/routes/memory-bundle.js +4 -7
  267. package/dist/http/routes/memory-compliance.js +4 -4
  268. package/dist/http/routes/memory-consolidation.js +6 -9
  269. package/dist/http/routes/memory-origin.d.ts +2 -0
  270. package/dist/http/routes/memory-origin.js +7 -8
  271. package/dist/http/routes/memory-policy.js +17 -12
  272. package/dist/http/routes/notify-wake.js +10 -19
  273. package/dist/http/routes/observability.js +3 -3
  274. package/dist/http/routes/principal-inbox.d.ts +1 -1
  275. package/dist/http/routes/principal-inbox.js +2 -2
  276. package/dist/http/routes/projects.d.ts +1 -1
  277. package/dist/http/routes/projects.js +3 -2
  278. package/dist/http/routes/retention-ops.js +6 -9
  279. package/dist/http/routes/rules.js +20 -5
  280. package/dist/http/routes/run-memory-capture.d.ts +2 -2
  281. package/dist/http/routes/run-memory-capture.js +6 -12
  282. package/dist/http/routes/run-permission-mode.d.ts +2 -2
  283. package/dist/http/routes/run-permission-mode.js +10 -17
  284. package/dist/http/routes/runs.js +146 -231
  285. package/dist/http/routes/session-memory-sync.d.ts +2 -2
  286. package/dist/http/routes/session-memory-sync.js +7 -13
  287. package/dist/http/routes/session-sync.d.ts +4 -2
  288. package/dist/http/routes/session-sync.js +21 -20
  289. package/dist/http/routes/sessions-list.d.ts +3 -3
  290. package/dist/http/routes/sessions-list.js +9 -9
  291. package/dist/http/routes/sessions.js +87 -124
  292. package/dist/http/routes/shared-memory.js +6 -6
  293. package/dist/http/routes/side-query.js +2 -2
  294. package/dist/http/routes/tasks.js +136 -120
  295. package/dist/http/routes/trace-usage.d.ts +0 -12
  296. package/dist/http/routes/trace-usage.js +40 -46
  297. package/dist/http/routes/workflows.d.ts +39 -4
  298. package/dist/http/routes/workflows.js +42 -14
  299. package/dist/http/run-concurrency-cap.d.ts +20 -12
  300. package/dist/http/run-concurrency-cap.js +39 -26
  301. package/dist/http/run-read-face.d.ts +3 -5
  302. package/dist/http/run-read-face.js +8 -13
  303. package/dist/http/send.d.ts +12 -3
  304. package/dist/http/send.js +42 -6
  305. package/dist/http/server.d.ts +39 -40
  306. package/dist/http/server.js +36 -11
  307. package/dist/http/sse-log.d.ts +17 -10
  308. package/dist/http/sse-log.js +7 -7
  309. package/dist/http/stored-body-replay.d.ts +12 -0
  310. package/dist/http/stored-body-replay.js +2 -2
  311. package/dist/http/submit-ctx.d.ts +16 -8
  312. package/dist/http/submit-ctx.js +6 -2
  313. package/dist/http/submit-replay.d.ts +19 -6
  314. package/dist/http/submit-replay.js +18 -6
  315. package/dist/http/sync-submit-body.d.ts +3 -4
  316. package/dist/http/sync-submit-body.js +4 -5
  317. package/dist/http/wire-types.d.ts +4 -3
  318. package/dist/identity-source.d.ts +36 -5
  319. package/dist/identity-source.js +27 -0
  320. package/dist/index.d.ts +1 -0
  321. package/dist/index.js +1 -0
  322. package/dist/key-resolver.d.ts +32 -0
  323. package/dist/key-resolver.js +23 -9
  324. package/dist/leader/diffup.js +2 -1
  325. package/dist/leader/endpoint.d.ts +26 -5
  326. package/dist/leader/endpoint.js +154 -14
  327. package/dist/leader/fanout.d.ts +3 -0
  328. package/dist/leader/fanout.js +78 -63
  329. package/dist/leader/leader.d.ts +16 -0
  330. package/dist/leader/leader.js +43 -3
  331. package/dist/leader/merge.d.ts +9 -1
  332. package/dist/leader/merge.js +16 -1
  333. package/dist/leader/repair-wire.js +1 -1
  334. package/dist/leader/wire.d.ts +36 -3
  335. package/dist/leader/wire.js +59 -18
  336. package/dist/lsp-evict.d.ts +6 -4
  337. package/dist/lsp-evict.js +2 -3
  338. package/dist/memory-operator-faces.d.ts +5 -4
  339. package/dist/memory-operator-faces.js +1 -1
  340. package/dist/memory-scope.d.ts +29 -2
  341. package/dist/memory-scope.js +64 -15
  342. package/dist/memory-store-refusal.d.ts +5 -2
  343. package/dist/memory-sync-client.d.ts +3 -2
  344. package/dist/memory-sync-client.js +6 -3
  345. package/dist/model-compat.d.ts +17 -8
  346. package/dist/model-compat.js +6 -2
  347. package/dist/model-context-window.d.ts +18 -0
  348. package/dist/model-context-window.js +2 -0
  349. package/dist/model-entry-headers.d.ts +46 -4
  350. package/dist/model-entry-headers.js +2 -2
  351. package/dist/model-entry-refusal.d.ts +35 -16
  352. package/dist/model-entry-refusal.js +40 -27
  353. package/dist/model-plane-face.d.ts +19 -11
  354. package/dist/model-plane-face.js +9 -1
  355. package/dist/model-plane-probe.d.ts +2 -0
  356. package/dist/model-plane-probe.js +17 -0
  357. package/dist/model-provider.d.ts +3 -3
  358. package/dist/model-route-endpoint.d.ts +9 -5
  359. package/dist/model-route-endpoint.js +29 -7
  360. package/dist/model-select.d.ts +16 -0
  361. package/dist/model-select.js +4 -0
  362. package/dist/mountinfo.d.ts +37 -0
  363. package/dist/mountinfo.js +47 -0
  364. package/dist/namespaced-rule-name.d.ts +23 -14
  365. package/dist/namespaced-rule-name.js +8 -11
  366. package/dist/net-address.d.ts +1 -1
  367. package/dist/observability/corrupt-read-seat.d.ts +4 -4
  368. package/dist/observability/corrupt-read-seat.js +5 -3
  369. package/dist/observability/fail-open.d.ts +58 -38
  370. package/dist/observability/fail-open.js +60 -38
  371. package/dist/observability/logger.d.ts +22 -1
  372. package/dist/observability/logger.js +89 -12
  373. package/dist/observability/metrics.js +3 -4
  374. package/dist/observability/otel-exporter.js +2 -1
  375. package/dist/observability/principal-context.d.ts +14 -7
  376. package/dist/observability/principal-context.js +8 -3
  377. package/dist/observability/run-terminal.d.ts +7 -1
  378. package/dist/observability/run-terminal.js +5 -2
  379. package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
  380. package/dist/orchestration/hardened-vm-runner.js +11 -5
  381. package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
  382. package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
  383. package/dist/orchestration/hardened-vm-worker.js +2 -1
  384. package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
  385. package/dist/orchestration/workflow-completion-inbox.js +3 -2
  386. package/dist/org-delivery-gate.d.ts +5 -4
  387. package/dist/org-delivery-gate.js +7 -6
  388. package/dist/outbound-dispatcher.d.ts +1 -1
  389. package/dist/outbound-dispatcher.js +6 -12
  390. package/dist/owner-brands.d.ts +81 -0
  391. package/dist/owner-brands.js +42 -0
  392. package/dist/owner-faces.d.ts +531 -0
  393. package/dist/owner-faces.js +126 -0
  394. package/dist/parked-decide.d.ts +67 -5
  395. package/dist/parked-decide.js +127 -5
  396. package/dist/parked-revive-surface.d.ts +14 -4
  397. package/dist/parked-revive-surface.js +5 -4
  398. package/dist/peer-directory.d.ts +6 -8
  399. package/dist/peer-directory.js +3 -2
  400. package/dist/permission-rule-vocab.d.ts +53 -8
  401. package/dist/permission-rule-vocab.js +30 -2
  402. package/dist/plugins/adoption-log-sql.d.ts +0 -22
  403. package/dist/plugins/adoption-log-sql.js +5 -3
  404. package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
  405. package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
  406. package/dist/plugins/approval-ask-store-file.d.ts +18 -7
  407. package/dist/plugins/approval-ask-store-file.js +37 -14
  408. package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
  409. package/dist/plugins/approval-ask-store-memory.js +24 -10
  410. package/dist/plugins/approval-ask-store-sql.d.ts +39 -20
  411. package/dist/plugins/approval-ask-store-sql.js +41 -10
  412. package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
  413. package/dist/plugins/approval-exemption-skill-m46.js +25 -0
  414. package/dist/plugins/approval-exemption-store.d.ts +6 -1
  415. package/dist/plugins/approval-exemption-store.js +14 -0
  416. package/dist/plugins/approval-nonce-store.d.ts +39 -12
  417. package/dist/plugins/approval-nonce-store.js +72 -23
  418. package/dist/plugins/blob-backend.d.ts +2 -0
  419. package/dist/plugins/blob-backend.js +9 -6
  420. package/dist/plugins/caching-session-store.d.ts +13 -1
  421. package/dist/plugins/caching-session-store.js +43 -4
  422. package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
  423. package/dist/plugins/checkpoint-index-columns.js +36 -1
  424. package/dist/plugins/checkpoint-store-face.d.ts +83 -10
  425. package/dist/plugins/checkpoint-store-face.js +18 -1
  426. package/dist/plugins/device-store-sql.js +1 -0
  427. package/dist/plugins/ensure-index.d.ts +13 -1
  428. package/dist/plugins/ensure-index.js +154 -21
  429. package/dist/plugins/ensure-schema-lock-policy.d.ts +0 -15
  430. package/dist/plugins/ensure-schema-lock-policy.js +3 -2
  431. package/dist/plugins/file-run-store.d.ts +63 -23
  432. package/dist/plugins/file-run-store.js +138 -83
  433. package/dist/plugins/host-platform.d.ts +24 -3
  434. package/dist/plugins/host-platform.js +15 -1
  435. package/dist/plugins/image-bake-store-sql.js +2 -0
  436. package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
  437. package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
  438. package/dist/plugins/k8s-pod-reaper.js +0 -1
  439. package/dist/plugins/leader-run-store-sql.d.ts +22 -0
  440. package/dist/plugins/leader-run-store-sql.js +34 -4
  441. package/dist/plugins/local-checkpoint-store.d.ts +58 -23
  442. package/dist/plugins/local-checkpoint-store.js +195 -76
  443. package/dist/plugins/local-data-dir-modes-m39.js +2 -1
  444. package/dist/plugins/local-docker-capacity.d.ts +93 -0
  445. package/dist/plugins/local-docker-capacity.js +194 -0
  446. package/dist/plugins/local-docker-reaper.d.ts +92 -0
  447. package/dist/plugins/local-docker-reaper.js +102 -0
  448. package/dist/plugins/local-engine-high-water.d.ts +4 -2
  449. package/dist/plugins/local-engine-high-water.js +4 -1
  450. package/dist/plugins/local-session-store.d.ts +358 -125
  451. package/dist/plugins/local-session-store.js +824 -251
  452. package/dist/plugins/local-session-window.d.ts +3 -2
  453. package/dist/plugins/local-session-window.js +3 -2
  454. package/dist/plugins/local-sidecar-quarantine.js +3 -2
  455. package/dist/plugins/local-task-attachment-store.d.ts +18 -1
  456. package/dist/plugins/local-task-attachment-store.js +22 -1
  457. package/dist/plugins/memory-embedder.js +9 -7
  458. package/dist/plugins/memory-engine-pg.d.ts +3 -2
  459. package/dist/plugins/memory-engine-pg.js +14 -5
  460. package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
  461. package/dist/plugins/memory-engine-sql-apply.js +6 -8
  462. package/dist/plugins/memory-engine-tidb.d.ts +4 -2
  463. package/dist/plugins/memory-engine-tidb.js +11 -2
  464. package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
  465. package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
  466. package/dist/plugins/memory-run-store.d.ts +39 -27
  467. package/dist/plugins/memory-run-store.js +72 -70
  468. package/dist/plugins/one-time-migration-marker.d.ts +10 -0
  469. package/dist/plugins/one-time-migration-marker.js +7 -0
  470. package/dist/plugins/one-time-migrations.d.ts +186 -45
  471. package/dist/plugins/one-time-migrations.js +442 -119
  472. package/dist/plugins/org-delivery-quota-store.js +2 -1
  473. package/dist/plugins/permission-rule-store-file.d.ts +3 -3
  474. package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
  475. package/dist/plugins/permission-rule-store-sql.js +6 -86
  476. package/dist/plugins/pg-pool.d.ts +1 -31
  477. package/dist/plugins/pg-pool.js +16 -7
  478. package/dist/plugins/remote-env-e2b.d.ts +7 -25
  479. package/dist/plugins/remote-env-e2b.js +34 -25
  480. package/dist/plugins/remote-env-host.d.ts +2 -9
  481. package/dist/plugins/remote-env-host.js +34 -22
  482. package/dist/plugins/remote-env-k8s.d.ts +40 -45
  483. package/dist/plugins/remote-env-k8s.js +107 -58
  484. package/dist/plugins/remote-env-local-docker.d.ts +148 -14
  485. package/dist/plugins/remote-env-local-docker.js +367 -72
  486. package/dist/plugins/remote-scratchpad.js +4 -0
  487. package/dist/plugins/retention-deployment.d.ts +49 -17
  488. package/dist/plugins/retention-deployment.js +39 -8
  489. package/dist/plugins/run-preview-m45.d.ts +11 -0
  490. package/dist/plugins/run-preview-m45.js +19 -0
  491. package/dist/plugins/run-store-sql.d.ts +56 -68
  492. package/dist/plugins/run-store-sql.js +127 -116
  493. package/dist/plugins/s3-answer.d.ts +2 -1
  494. package/dist/plugins/sandbox-reaper.d.ts +26 -0
  495. package/dist/plugins/sandbox-reaper.js +2 -0
  496. package/dist/plugins/scenario-prefix-switch-m42.d.ts +54 -0
  497. package/dist/plugins/scenario-prefix-switch-m42.js +55 -0
  498. package/dist/plugins/scheduler-support.d.ts +16 -1
  499. package/dist/plugins/scheduler-support.js +22 -2
  500. package/dist/plugins/schema-consistency.d.ts +42 -9
  501. package/dist/plugins/schema-consistency.js +212 -11
  502. package/dist/plugins/schema-drift-sentence.d.ts +4 -1
  503. package/dist/plugins/schema-drift-sentence.js +4 -4
  504. package/dist/plugins/schema-ensure-legs.d.ts +9 -0
  505. package/dist/plugins/schema-ensure-legs.js +1 -1
  506. package/dist/plugins/schema-indexes.js +3 -0
  507. package/dist/plugins/schema-live-columns.d.ts +14 -5
  508. package/dist/plugins/schema-live-columns.js +10 -10
  509. package/dist/plugins/send-user-file.js +2 -1
  510. package/dist/plugins/session-birth.d.ts +37 -0
  511. package/dist/plugins/session-birth.js +38 -0
  512. package/dist/plugins/session-epoch-anchor.d.ts +40 -12
  513. package/dist/plugins/session-epoch-anchor.js +33 -11
  514. package/dist/plugins/session-ext-table.d.ts +27 -3
  515. package/dist/plugins/session-ext-table.js +19 -6
  516. package/dist/plugins/session-fork.d.ts +15 -1
  517. package/dist/plugins/session-fork.js +3 -0
  518. package/dist/plugins/session-ownership.d.ts +1 -1
  519. package/dist/plugins/session-placement.d.ts +22 -16
  520. package/dist/plugins/session-placement.js +15 -12
  521. package/dist/plugins/session-row-sql.d.ts +12 -0
  522. package/dist/plugins/session-row-sql.js +3 -3
  523. package/dist/plugins/session-run-rollup.d.ts +29 -0
  524. package/dist/plugins/session-run-rollup.js +40 -0
  525. package/dist/plugins/session-store-sql.d.ts +38 -12
  526. package/dist/plugins/session-store-sql.js +130 -30
  527. package/dist/plugins/session-withdraw-sql.d.ts +36 -0
  528. package/dist/plugins/session-withdraw-sql.js +42 -0
  529. package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
  530. package/dist/plugins/shared-memory-store-sql.js +2 -1
  531. package/dist/plugins/shell-sentinel-owner-m48.d.ts +20 -0
  532. package/dist/plugins/shell-sentinel-owner-m48.js +3 -0
  533. package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
  534. package/dist/plugins/sql-driver.d.ts +1 -1
  535. package/dist/plugins/sql-driver.js +2 -1
  536. package/dist/plugins/sql-errors.d.ts +32 -5
  537. package/dist/plugins/sql-errors.js +55 -7
  538. package/dist/plugins/sql-json-column.d.ts +8 -7
  539. package/dist/plugins/sql-json-column.js +10 -6
  540. package/dist/plugins/store-backend.d.ts +84 -15
  541. package/dist/plugins/store-backend.js +186 -55
  542. package/dist/plugins/store-contracts.d.ts +90 -30
  543. package/dist/plugins/store-contracts.js +22 -1
  544. package/dist/plugins/store-fault.d.ts +28 -2
  545. package/dist/plugins/store-fault.js +20 -2
  546. package/dist/plugins/task-attachment-store.d.ts +15 -3
  547. package/dist/plugins/task-attachment-store.js +22 -9
  548. package/dist/plugins/tidb-pool.js +23 -8
  549. package/dist/plugins/web-search.js +5 -3
  550. package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
  551. package/dist/plugins/workflow-run-store-sql.js +11 -5
  552. package/dist/principal-jwt.d.ts +4 -4
  553. package/dist/principal-jwt.js +20 -5
  554. package/dist/principal-shape.d.ts +41 -0
  555. package/dist/principal-shape.js +19 -0
  556. package/dist/question.d.ts +13 -23
  557. package/dist/question.js +21 -39
  558. package/dist/request-declaration-refusal.d.ts +35 -12
  559. package/dist/request-declaration-refusal.js +21 -9
  560. package/dist/request-form.d.ts +58 -0
  561. package/dist/request-form.js +72 -0
  562. package/dist/request-image-urls.d.ts +8 -2
  563. package/dist/request-image-urls.js +2 -1
  564. package/dist/request-images.d.ts +20 -0
  565. package/dist/request-images.js +59 -0
  566. package/dist/request-key-closure.d.ts +6 -7
  567. package/dist/request-key-closure.js +15 -2
  568. package/dist/resource-suspend.d.ts +7 -16
  569. package/dist/resource-suspend.js +1 -1
  570. package/dist/retired-name-host-notice.d.ts +21 -0
  571. package/dist/retired-name-host-notice.js +12 -0
  572. package/dist/rule-entry-list.d.ts +2 -2
  573. package/dist/rule-entry-list.js +3 -4
  574. package/dist/rule-issue-reading.d.ts +58 -0
  575. package/dist/rule-issue-reading.js +14 -0
  576. package/dist/rules-consent.d.ts +5 -3
  577. package/dist/rules-consent.js +1 -0
  578. package/dist/run-acceptance.d.ts +3 -1
  579. package/dist/run-acceptance.js +3 -0
  580. package/dist/run-local.d.ts +14 -6
  581. package/dist/run-local.js +92 -80
  582. package/dist/run-stale-default.d.ts +7 -0
  583. package/dist/run-stale-default.js +2 -0
  584. package/dist/runs.d.ts +26 -15
  585. package/dist/runs.js +39 -27
  586. package/dist/runtime-caps-resolver.d.ts +21 -6
  587. package/dist/runtime-caps-resolver.js +17 -4
  588. package/dist/runtime-governance.d.ts +2 -2
  589. package/dist/runtime-governance.js +5 -3
  590. package/dist/sealed-key-layout.d.ts +12 -5
  591. package/dist/sealed-key-layout.js +5 -0
  592. package/dist/sealed-key.d.ts +12 -2
  593. package/dist/sealed-key.js +115 -27
  594. package/dist/security.d.ts +128 -158
  595. package/dist/security.js +163 -59
  596. package/dist/sema-config-dir.d.ts +20 -0
  597. package/dist/sema-config-dir.js +25 -0
  598. package/dist/server-secret-env.d.ts +21 -5
  599. package/dist/server-secret-env.js +14 -4
  600. package/dist/session-children-retire.d.ts +7 -5
  601. package/dist/session-children-retire.js +7 -2
  602. package/dist/session-deletion.d.ts +88 -0
  603. package/dist/session-deletion.js +8 -0
  604. package/dist/session-erase.d.ts +145 -0
  605. package/dist/session-erase.js +115 -0
  606. package/dist/session-error-wire.d.ts +5 -5
  607. package/dist/session-error-wire.js +1 -1
  608. package/dist/session-incarnation.d.ts +52 -5
  609. package/dist/session-incarnation.js +19 -2
  610. package/dist/session-policy-wire.d.ts +6 -3
  611. package/dist/session-policy-wire.js +11 -1
  612. package/dist/session-resident-background.d.ts +0 -71
  613. package/dist/session-resident-background.js +4 -3
  614. package/dist/session-row.d.ts +2 -1
  615. package/dist/session-rules-seat.d.ts +12 -0
  616. package/dist/session-rules-seat.js +19 -0
  617. package/dist/session-titler.d.ts +7 -15
  618. package/dist/session-titler.js +1 -1
  619. package/dist/spec-fields.d.ts +57 -3
  620. package/dist/spec-fields.js +72 -51
  621. package/dist/store-posture.d.ts +136 -20
  622. package/dist/store-posture.js +188 -3
  623. package/dist/stored-request-hooks-m20.js +2 -2
  624. package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
  625. package/dist/stores-sql/background-agent-store-sql.js +73 -20
  626. package/dist/stores-sql/checkpoint-store-sql.d.ts +33 -28
  627. package/dist/stores-sql/checkpoint-store-sql.js +75 -44
  628. package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
  629. package/dist/stores-sql/mailbox-store-sql.js +31 -32
  630. package/dist/stores-sql/pg-session-storage.d.ts +7 -5
  631. package/dist/stores-sql/pg-session-storage.js +54 -46
  632. package/dist/stores-sql/retention-store-sql.d.ts +87 -19
  633. package/dist/stores-sql/retention-store-sql.js +92 -27
  634. package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
  635. package/dist/stores-sql/session-policy-store-sql.js +44 -36
  636. package/dist/stores-sql/session-write-hooks.d.ts +12 -6
  637. package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
  638. package/dist/stores-sql/tidb-session-storage.js +13 -8
  639. package/dist/stores-sql/tidb-session-store.d.ts +36 -17
  640. package/dist/stores-sql/tidb-session-store.js +69 -39
  641. package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
  642. package/dist/stores-sql/windowed-session-storage.js +9 -0
  643. package/dist/submission-exit.d.ts +50 -0
  644. package/dist/submission-exit.js +108 -0
  645. package/dist/task-a2a.d.ts +1 -1
  646. package/dist/task-a2a.js +3 -3
  647. package/dist/task-cwd.d.ts +20 -0
  648. package/dist/task-cwd.js +8 -0
  649. package/dist/task-mcp.d.ts +1 -1
  650. package/dist/task-mcp.js +3 -3
  651. package/dist/task-settings.d.ts +14 -10
  652. package/dist/task-settings.js +18 -7
  653. package/dist/terminal.d.ts +25 -43
  654. package/dist/terminal.js +31 -11
  655. package/dist/tool-approval.d.ts +131 -129
  656. package/dist/tool-approval.js +189 -193
  657. package/dist/trace/core-keyset-guard.d.ts +13 -6
  658. package/dist/trace/core-vocab-wire.d.ts +95 -0
  659. package/dist/trace/core-vocab-wire.js +15 -0
  660. package/dist/trace/exit-seat.d.ts +30 -4
  661. package/dist/trace/exit-seat.js +40 -36
  662. package/dist/trace/extension-call-face.d.ts +3 -2
  663. package/dist/trace/extension-call-face.js +3 -1
  664. package/dist/trace/ledger-events.d.ts +4 -7
  665. package/dist/trace/ledger-sink.d.ts +1 -30
  666. package/dist/trace/ledger-sink.js +0 -11
  667. package/dist/trace/model-segment.d.ts +5 -5
  668. package/dist/trace/model-segment.js +5 -5
  669. package/dist/trace/project.d.ts +55 -42
  670. package/dist/trace/project.js +52 -19
  671. package/dist/trace/redact.d.ts +123 -27
  672. package/dist/trace/redact.js +880 -260
  673. package/dist/trace/self-minted-wire.d.ts +487 -19
  674. package/dist/trace/self-minted-wire.js +172 -23
  675. package/dist/trace/wire-projection-faces.d.ts +5 -6
  676. package/dist/trace/wire-projection-faces.js +2 -2
  677. package/dist/upstream-body.d.ts +23 -0
  678. package/dist/upstream-body.js +16 -0
  679. package/dist/url-refusal.d.ts +3 -3
  680. package/dist/url-refusal.js +11 -4
  681. package/dist/user-authored-text.d.ts +1 -1
  682. package/dist/user-input-ledger.d.ts +7 -8
  683. package/dist/user-input-ledger.js +1 -1
  684. package/dist/web-admin-client/apply-effective.d.ts +6 -3
  685. package/dist/web-admin-client/apply-effective.js +13 -16
  686. package/dist/web-admin-client/apply-ledger.d.ts +16 -7
  687. package/dist/web-admin-client/apply-ledger.js +5 -2
  688. package/dist/web-admin-client/center-request.d.ts +2 -2
  689. package/dist/web-admin-client/center-request.js +15 -15
  690. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  691. package/dist/web-admin-client/effective-keys.js +1 -1
  692. package/dist/web-admin-client/entry-metadata.d.ts +8 -0
  693. package/dist/web-admin-client/entry-metadata.js +13 -0
  694. package/dist/web-admin-client/http-client.d.ts +1 -1
  695. package/dist/web-admin-client/http-client.js +23 -4
  696. package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
  697. package/dist/web-admin-client/mcp-revocation.js +2 -1
  698. package/dist/web-admin-client/read-warnings.d.ts +1 -0
  699. package/dist/web-admin-client/read-warnings.js +1 -0
  700. package/dist/web-admin-client/restart-signal.js +8 -4
  701. package/dist/web-admin-client/skills-mcp.d.ts +2 -2
  702. package/dist/web-admin-client/types.d.ts +1 -2
  703. package/dist/workspace-space.d.ts +3 -2
  704. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
  705. package/package.json +6 -3
  706. package/scripts/drain-check-local.mjs +118 -147
  707. package/scripts/drain-check.mysql.sql +22 -2
  708. package/scripts/drain-check.pg.sql +22 -2
  709. package/wire-changes/server@7.148.0.json +1517 -0
  710. package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
  711. package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
  712. package/dist/http/memory-layer-reply.d.ts +0 -30
  713. package/dist/http/memory-layer-reply.js +0 -24
  714. package/dist/lsp/e2b-bridge.d.ts +0 -57
  715. package/dist/lsp/e2b-bridge.js +0 -139
  716. package/dist/lsp/e2b-manager.d.ts +0 -93
  717. package/dist/lsp/e2b-manager.js +0 -178
  718. package/dist/lsp/lsp-frames.d.ts +0 -14
  719. package/dist/lsp/lsp-frames.js +0 -25
  720. package/dist/lsp/manager.d.ts +0 -129
  721. package/dist/lsp/manager.js +0 -127
  722. package/dist/lsp/types.d.ts +0 -12
  723. package/dist/lsp/types.js +0 -2
  724. package/dist/lsp/ws-transport.d.ts +0 -40
  725. package/dist/lsp/ws-transport.js +0 -210
@@ -1,7 +1,35 @@
1
1
  import { COARSE_SHELL_TOOLS, ruleToolGrammarOf } from "@sema-agent/core";
2
- export function cardTakesWholeToolConsent(tool) {
3
- return ruleToolGrammarOf(tool) === undefined && !COARSE_SHELL_TOOLS.includes(tool);
2
+ export function cardRuleFormOf(tool) {
3
+ const grammar = ruleToolGrammarOf(tool);
4
+ switch (grammar) {
5
+ case "command":
6
+ case "name":
7
+ case "domain":
8
+ return grammar;
9
+ case "path":
10
+ return undefined;
11
+ case undefined:
12
+ return COARSE_SHELL_TOOLS.includes(tool) ? undefined : "tool";
13
+ default: {
14
+ const unknown = grammar;
15
+ void unknown;
16
+ return undefined;
17
+ }
18
+ }
4
19
  }
20
+ export const CARD_RULE_FORM_OF_MATCH = {
21
+ exact: "command",
22
+ prefix: "command",
23
+ wildcard: "command",
24
+ pattern: "command",
25
+ tool: "tool",
26
+ name: "name",
27
+ host: "domain",
28
+ name_prefix: undefined,
29
+ subdomain: undefined,
30
+ path: undefined,
31
+ subpath: undefined,
32
+ };
5
33
  export const DIRECT_RULE_WRITE_ADMITS = {
6
34
  allow: false,
7
35
  deny: true,
@@ -1,25 +1,3 @@
1
- /**
2
- * [ref] I2(form b 位)—— **SQL 收编日志**:phase 真源与被迁的行**同库**。
3
- *
4
- * 🔴 为什么 phase 必须住 SQL 而不是一个 sidecar 文件(183 r3 按 codex r2-F2):发起收编的那个 pod 在两条
5
- * 腿之间被摧毁时,进程本地的标记会与已经半迁移的 SQL 状态**分家** —— 接棒副本读不到「迁到哪了」。
6
- * 标记与行同事务 ⇒ 崩溃后接棒副本按日志续跑,分家形不存在。
7
- *
8
- * ── 幂等身份 = DB 约束,不是「查了再插」(小票 v2/F2)────────────────────────────────────────────
9
- * `from_principal` 上有 **UNIQUE**(183 D7「拒二次收编」的 DB 强形)。发起走 **insert-or-fetch 原子形**:
10
- * 一条 `INSERT … ON CONFLICT DO NOTHING` / `INSERT IGNORE`,再按 `from_principal` 读回行。
11
- * **禁 SELECT-then-INSERT** —— 那两句之间的窗正是两个并发同参 POST 各插一行(或各读到空)的地方,
12
- * 而 UNIQUE 让「谁插进去了」由数据库仲裁,`affected` 就是判别式。
13
- * 同 from 异 to ⇒ 读回的行 `to_principal` 不等 ⇒ typed conflict(调用方看到的是 409,不是「成功」)。
14
- *
15
- * ── 列的口径 ────────────────────────────────────────────────────────────────────────────────────
16
- * · `legs` / `configs` / `report` 是 **TEXT 不是 JSON 列**:`report` 是 `immutableReport` 的落库形,
17
- * 契约是「逐字节恒同」;JSON 列会按引擎自己的规范形重排键序,而 TEXT 是「存什么读什么」。
18
- * (workflow_run.run / workflow_journal.result 同款先例,理由同源:String()→JSON.parse 的字节面。)
19
- * · 时间列一律 `_ms BIGINT`(schema-naming 门 ② 咬 `_at BIGINT`)。
20
- * · `phase` 是**单调**推进的阶段号,不是乐观锁计数 —— 但它的推进走的就是 CAS(`WHERE phase = :expect`),
21
- * 所以它同时是那把锁。命名不叫 `rev`,因为它不守卫「行内容有没有变」,而守卫「弧走到哪了」。
22
- */
23
1
  import type { Pool as MySqlPool } from "mysql2/promise";
24
2
  import type { Pool as PgPool } from "pg";
25
3
  import { type SqlDriver, type SqlExec, type SqlTxConn } from "./sql-driver.js";
@@ -1,3 +1,4 @@
1
+ import { writeLogText } from "../observability/logger.js";
1
2
  import { createHash } from "node:crypto";
2
3
  import { mysqlDriver, pgDriver } from "./sql-driver.js";
3
4
  import { ensureIndexes } from "./ensure-index.js";
@@ -32,6 +33,7 @@ export const TIDB_ADOPTION_LOG_STATEMENTS = [
32
33
  ) COLLATE utf8mb4_bin`,
33
34
  ];
34
35
  export const ADOPTION_LOG_INDEXES = [
36
+ { table: `${ADOPTION_LOG_TABLE}`, name: "uq_adoption_log_from", columns: ["from_principal"], unique: true },
35
37
  { table: `${ADOPTION_LOG_TABLE}`, name: "idx_adoption_log_state", columns: ["state"] },
36
38
  ];
37
39
  export async function ensurePgAdoptionLogSchema(q) {
@@ -130,7 +132,7 @@ export class SqlAdoptionLogStore {
130
132
  await conn.rollback();
131
133
  }
132
134
  catch (rollbackErr) {
133
- console.warn("[adoption-log] rollback after a failed rebind transaction also failed:", rollbackErr);
135
+ writeLogText("stderr", "[adoption-log] rollback after a failed rebind transaction also failed:", rollbackErr);
134
136
  }
135
137
  throw err;
136
138
  }
@@ -147,7 +149,7 @@ export class SqlAdoptionLogStore {
147
149
  await conn.rollback();
148
150
  }
149
151
  catch (rollbackErr) {
150
- console.warn("[adoption-log] rollback after a failed sweep transaction also failed:", rollbackErr);
152
+ writeLogText("stderr", "[adoption-log] rollback after a failed sweep transaction also failed:", rollbackErr);
151
153
  }
152
154
  throw err;
153
155
  }
@@ -207,7 +209,7 @@ export class SqlAdoptionLogStore {
207
209
  await conn.query(this.q("SELECT RELEASE_LOCK(?) AS released", "SELECT pg_advisory_unlock($1, $2) AS released"), this.db.dialect === "mysql" ? [lockName] : [PG_ADOPTION_LOCK_CLASS, pgLockObjectKey(lockName)]);
208
210
  }
209
211
  catch (releaseErr) {
210
- console.warn("[adoption-log] releasing the adoption arc lock failed (it auto-frees when the connection closes):", releaseErr);
212
+ writeLogText("stderr", "[adoption-log] releasing the adoption arc lock failed (it auto-frees when the connection closes):", releaseErr);
211
213
  }
212
214
  }
213
215
  conn.release();
@@ -0,0 +1,7 @@
1
+ /** 退役的那只账本动词(只在重放认它;写口不会再写)。 */
2
+ export declare const RETIRED_DELETE_BY_TASK_OP_M50 = "deleteByTask";
3
+ /** M50 的窗在 `today`(UTC 日历日 YYYY-MM-DD)开着没有:开 ⇒ 按旧读法重放;关 ⇒ {@link retiredDeleteByTaskClosedWhyM50} 那一句拒。 */
4
+ export declare function retiredDeleteByTaskReplayOpenM50(today: string): boolean;
5
+ /** 窗关之后的拒因(接在账本拒句里,拒句本身带账本路径与通用出路):点名本条、窗的最后一天与那一版之前的出路 —— 版本与日期都读登记行,不手写第二份。 */
6
+ export declare function retiredDeleteByTaskClosedWhyM50(): string;
7
+ //# sourceMappingURL=approval-ask-retired-delete-by-task-m50.d.ts.map
@@ -0,0 +1,17 @@
1
+ import { ONE_TIME_MIGRATIONS, migrationWindowOpen } from "./one-time-migrations.js";
2
+ export const RETIRED_DELETE_BY_TASK_OP_M50 = "deleteByTask";
3
+ function windowRowM50() {
4
+ const row = ONE_TIME_MIGRATIONS.find((w) => w.id === "M50");
5
+ if (row === undefined)
6
+ throw new Error("approval-ask-retired-delete-by-task-m50: the one-time migration registry has no M50 row (the retired deleteByTask journal replay window) — the replay arm outlived its registry row; delete it with that row");
7
+ return row;
8
+ }
9
+ export function retiredDeleteByTaskReplayOpenM50(today) {
10
+ return migrationWindowOpen(windowRowM50(), today);
11
+ }
12
+ export function retiredDeleteByTaskClosedWhyM50() {
13
+ const row = windowRowM50();
14
+ return (`a deleteByTask record — a verb retired in ${row.introducedIn}; its one-time replay window (migration M50) closed after ${row.removableAfter ?? "an unreleased date"}, ` +
15
+ `so this build no longer replays it. A server older than ${row.introducedIn} still knows the verb and its boot compacts the record away: start one once against this data root, then upgrade`);
16
+ }
17
+ //# sourceMappingURL=approval-ask-retired-delete-by-task-m50.js.map
@@ -24,7 +24,7 @@ export declare const ASK_JOURNAL_COMPACT_GROWTH = 2;
24
24
  * 账本的**动词闭集**([ref] 形)。运行期的词表判定与编译期的穷尽 `switch` 读同一份:
25
25
  * 往这里加一个词,{@link FileApprovalAskStore.replayOp} 的 switch 立刻编译红(漏一口不可能发布)。
26
26
  */
27
- declare const JOURNAL_OPS: readonly ["ensureAsk", "transitionAsk", "decideAsk", "claimTerminal", "claimTerminalRefuse", "expireAsk", "bindBatch", "abortBatch", "deferReconcile", "resolveProvisional", "deleteByTask", "reapSettledAsks", "reapEmptyBatches"];
27
+ declare const JOURNAL_OPS: readonly ["ensureAsk", "transitionAsk", "decideAsk", "claimTerminal", "claimTerminalRefuse", "expireAsk", "bindBatch", "abortBatch", "deferReconcile", "resolveProvisional", "deleteBySession", "reapSettledAsks", "reapEmptyBatches"];
28
28
  type JournalOpWord = (typeof JOURNAL_OPS)[number];
29
29
  /** 运行期词表(上面的数组)与类型面动词维({@link JournalCall})的**双向**对表 —— 任一边加词而另一边
30
30
  * 没跟上,这个别名解析成 `never`,{@link JOURNAL_OP_TABLE_GATE} 的赋值当场编译红。 */
@@ -95,9 +95,11 @@ type JournalCall = {
95
95
  from: AskState;
96
96
  to: AskState;
97
97
  patch: AskTransitionPatch;
98
- } | {
99
- op: "deleteByTask";
100
- taskId: string;
98
+ }
99
+ /** 删会话的审批腿。更老的读者不认这个动词 ⇒ 拒启并点名出路(与留存两动词同一条降级纪律);本版压实成功之后它不在盘上。 */
100
+ | {
101
+ op: "deleteBySession";
102
+ sessionId: string;
101
103
  }
102
104
  /** 留存律的问账两半(挂靠集落成数组;Set 不是 JSON)。更老的读者不认这两个动词 ⇒ 拒启并点名出路(与 `claimTerminalRefuse` 同一条降级纪律)。 */
103
105
  | {
@@ -131,6 +133,8 @@ export declare class FileApprovalAskStore implements ApprovalAskStore {
131
133
  private journalV1Records;
132
134
  /** 盘上还有 v1 信封记录(随 M34):重放到 v1 记录时置位,任何一次压实(整本重写成 v2)清位 —— 已被压实过的账本不再为升级重写第二次。 */
133
135
  private journalV1OnDisk;
136
+ /** 本次启动按旧读法重放的退役动词 `deleteByTask` 记录数(随 M50;构造器末段那一行 stderr 的读数)。 */
137
+ private retiredDeleteByTaskRecordsM50;
134
138
  /**
135
139
  * 盘上还有删行记录({@link ROW_REMOVAL_OPS}):写下一条 / 重放到一条时置位,任何一次压实(整本重写成快照)清位 —— 与 {@link journalV1OnDisk} 同形。
136
140
  * 置位期间压实到期(顶注「压实」段的起因 ②):同一拍压实;压实失败 ⇒ 位留着,下一次写(或下一次起服)再试。
@@ -204,8 +208,13 @@ export declare class FileApprovalAskStore implements ApprovalAskStore {
204
208
  abortBatch(batchId: string): Promise<string[]>;
205
209
  deferReconcile(askId: string, expectedState: AskState, expectedRev: number, nowMs: number): Promise<boolean>;
206
210
  resolveProvisional(askId: string, from: AskState, to: AskState, patch: AskTransitionPatch): Promise<boolean>;
207
- /** 删一个 run 名下的全部问行与批行。与两只留存动词同律:内核的纯读选择为空 ⇒ 不落账本、不压实;否则「先落账、再翻内存」并同拍压实(顶注「压实」段起因 ②)。 */
208
- deleteByTask(taskId: string): Promise<void>;
211
+ /**
212
+ * 删会话的审批腿(谓词在内核,见接口注)。与两只留存动词同律:内核的纯读选择为空 ⇒ 不落账本;否则「先落账、再翻内存」并同拍压实(顶注「压实」段起因 ②)。
213
+ * 🔴 **完成条件 = 被删行的字节离开账本**(删除面;顶注「边界」段):`write()` 尾段的压实失败按它的律不上抛(那条律管的是「已提交的写不因管家动作报失败」),
214
+ * 而本动词的成功说的是删除 —— 删行位仍置位(这一次或上一次删行之后的压实没成)⇒ 当场再压一次,失败原样上抛:删会话的协调器据此不删会话行,
215
+ * 幂等重试走到这里时选择为空、仍补这一次压实,成了才返回。
216
+ */
217
+ deleteBySession(sessionId: string): Promise<void>;
209
218
  /**
210
219
  * 留存律的问行半场(谓词在内核,见接口注)。空的一次(内核的纯读选择为空)不落账本、不碰内存、不压实;否则照常「先落账、再翻内存」,
211
220
  * 并在 `write()` 尾段同一拍压实(顶注「压实」段起因 ②)—— 选择非空 ⇒ 内核同步前缀里必删 ≥ 1 行,被删行的字节不留在盘上。
@@ -217,7 +226,7 @@ export declare class FileApprovalAskStore implements ApprovalAskStore {
217
226
  listPendingByTask(taskId: string, signal?: AbortSignal): Promise<AskRow[]>;
218
227
  listPendingBySession(sessionId: string, owner: string | null, signal?: AbortSignal): Promise<AskRow[]>;
219
228
  listByCall(call: AskCallCoordinate): Promise<AskRow[]>;
220
- listParkingBySession(sessionId: string): Promise<AskRow[]>;
229
+ listParkingBySourceSession(sourceSessionId: string): Promise<AskRow[]>;
221
230
  getAsk(askId: string): Promise<AskRow | null>;
222
231
  getByIdempotencyKey(taskId: string, key: string): Promise<AskRow | null>;
223
232
  getBatch(batchId: string): Promise<BatchRow | null>;
@@ -245,6 +254,8 @@ export declare class FileApprovalAskStore implements ApprovalAskStore {
245
254
  * 出处车道记成退役词的问改记新名,然后**一次压实**重写整本账。没有 ⇒ 零写。返回改了的问数。词的属主 = `execution-lane-rename-m40.ts`。
246
255
  * 压实写不进 ⇒ {@link ExecutionLaneRenameWriteRefusedError}(拒启;内存里已改的行随进程退出作废,盘上账本原样,下次起服重跑)。
247
256
  */
257
+ /** 一次性迁移 **M42 的 local 腿**(场景前缀的切换检查;窗口见 `plugins/one-time-migrations.ts` 登记表):属主以保留前缀开头的问行数(重放后的内存账,零写)。 */
258
+ scenarioPrefixOwnerRowsM42(): number;
248
259
  renameRetiredExecutionLaneWordM40(): number;
249
260
  /** 释放追加 fd(`LocalBackend.close` → 优雅重启重开)。不包 try/catch 的理由同
250
261
  * {@link FileApprovalNonceStore.dispose}:core 的 `AppendLog.close()` 自己就是全函数。 */
@@ -1,7 +1,10 @@
1
+ import { writeLogText } from "../observability/logger.js";
2
+ import { SCENARIO_SUBJECT_PREFIX } from "../owner-brands.js";
1
3
  import { closeSync, copyFileSync, openSync, readSync, statSync, existsSync } from "node:fs";
2
4
  import { isExecutionLane } from "../execution-lane-caps.js";
3
5
  import { RENAMED_EXECUTION_LANE_M40, RETIRED_EXECUTION_LANE_WORD_M40 } from "./execution-lane-rename-m40.js";
4
6
  import { ExecutionLaneRenameWriteRefusedError } from "./one-time-migrations.js";
7
+ import { RETIRED_DELETE_BY_TASK_OP_M50, retiredDeleteByTaskClosedWhyM50, retiredDeleteByTaskReplayOpenM50 } from "./approval-ask-retired-delete-by-task-m50.js";
5
8
  import { join } from "node:path";
6
9
  import { AppendLog, atomicWriteFile, ensureDir } from "@sema-agent/core";
7
10
  import { replayJsonlSkipping } from "../observability/corrupt-read-seat.js";
@@ -24,13 +27,13 @@ const JOURNAL_OPS = [
24
27
  "abortBatch",
25
28
  "deferReconcile",
26
29
  "resolveProvisional",
27
- "deleteByTask",
30
+ "deleteBySession",
28
31
  "reapSettledAsks",
29
32
  "reapEmptyBatches",
30
33
  ];
31
34
  const JOURNAL_OP_WORDS = new Set(JOURNAL_OPS);
32
35
  export const JOURNAL_OP_TABLE_GATE = true;
33
- const ROW_REMOVAL_OPS = new Set(["reapSettledAsks", "reapEmptyBatches", "deleteByTask"]);
36
+ const ROW_REMOVAL_OPS = new Set(["reapSettledAsks", "reapEmptyBatches", "deleteBySession"]);
34
37
  const JOURNAL_V1_CLAIM_INTENTS = ["expire", "cancel"];
35
38
  const JOURNAL_V1_CLAIM_INTENT_WORDS = new Set(JOURNAL_V1_CLAIM_INTENTS);
36
39
  const JOURNAL_ENVELOPE = 2;
@@ -97,6 +100,7 @@ export class FileApprovalAskStore {
97
100
  corruptLineCount = 0;
98
101
  journalV1Records = 0;
99
102
  journalV1OnDisk = false;
103
+ retiredDeleteByTaskRecordsM50 = 0;
100
104
  removalRecordsOnDisk = false;
101
105
  corruptQuarantinePath;
102
106
  constructor(root) {
@@ -125,13 +129,17 @@ export class FileApprovalAskStore {
125
129
  "(clear an immutable flag, remount read-write, free disk space), then restart.", { cause: e });
126
130
  }
127
131
  this.corruptQuarantinePath = quarantine;
128
- console.warn(`FileApprovalAskStore: approval ask journal ${this.path} had ${tornTail ? "a torn tail" : "no torn tail"} and ` +
132
+ writeLogText("stderr", `FileApprovalAskStore: approval ask journal ${this.path} had ${tornTail ? "a torn tail" : "no torn tail"} and ` +
129
133
  `${this.corruptLineCount} unparseable line(s) — replayed every COMPLETE record, quarantined the original at ${quarantine}, ` +
130
134
  `and rewrote the live journal from the replayed state. A dropped record is a LOST approval-ask transition: inspect the quarantined file.`);
131
135
  }
132
136
  else if (this.removalRecordsOnDisk) {
133
137
  this.compactOrRecord();
134
138
  }
139
+ if (this.retiredDeleteByTaskRecordsM50 > 0) {
140
+ writeLogText("stderr", `FileApprovalAskStore: replayed ${this.retiredDeleteByTaskRecordsM50} retired deleteByTask record(s) from ${this.path} under one-time migration M50 ` +
141
+ "(each deletes the asks and batches of its run, as the build that wrote it did); the startup compaction rewrites them out of the journal.");
142
+ }
135
143
  }
136
144
  clockRead() {
137
145
  const pinned = this.pinnedNow;
@@ -226,8 +234,19 @@ export class FileApprovalAskStore {
226
234
  }
227
235
  if (probe.k !== "op")
228
236
  refuse("unknown record kind");
237
+ if (probe.op === RETIRED_DELETE_BY_TASK_OP_M50) {
238
+ if (!retiredDeleteByTaskReplayOpenM50(new Date().toISOString().slice(0, 10)))
239
+ refuse(retiredDeleteByTaskClosedWhyM50());
240
+ const taskId = raw.taskId;
241
+ if (typeof taskId !== "string" || taskId.length === 0)
242
+ refuse("deleteByTask record without a taskId");
243
+ this.removalRecordsOnDisk = true;
244
+ this.retiredDeleteByTaskRecordsM50 += 1;
245
+ this.core.deleteByTaskM50(taskId);
246
+ return;
247
+ }
229
248
  if (typeof probe.op !== "string" || !JOURNAL_OP_WORDS.has(probe.op))
230
- refuse("verb outside this build's closed set (a DOWNGRADE: a newer server wrote it)");
249
+ refuse("verb outside this build's closed set (written by a build with a different verb set — a newer server, or an earlier one using a verb this build retired)");
231
250
  if (typeof probe.op === "string" && ROW_REMOVAL_OPS.has(probe.op))
232
251
  this.removalRecordsOnDisk = true;
233
252
  if (typeof probe.t !== "number" || !Number.isFinite(probe.t))
@@ -244,7 +263,7 @@ export class FileApprovalAskStore {
244
263
  try {
245
264
  void this.replayOp(rec).catch((e) => {
246
265
  this.replayRejectedCount += 1;
247
- console.warn(`FileApprovalAskStore: replaying ${rec.op} from ${this.path} was REFUSED by the store's own rules ` +
266
+ writeLogText("stderr", `FileApprovalAskStore: replaying ${rec.op} from ${this.path} was REFUSED by the store's own rules ` +
248
267
  `(${e instanceof Error ? e.message : String(e)}). The live call was refused the same way and changed nothing, ` +
249
268
  "so the state is faithful — but a record nobody can apply should not be on disk; inspect the journal.");
250
269
  });
@@ -275,8 +294,8 @@ export class FileApprovalAskStore {
275
294
  return this.core.deferReconcile(rec.askId, rec.expectedState, rec.expectedRev, rec.nowMs);
276
295
  case "resolveProvisional":
277
296
  return this.core.resolveProvisional(rec.askId, rec.from, rec.to, rec.patch);
278
- case "deleteByTask":
279
- return this.core.deleteByTask(rec.taskId);
297
+ case "deleteBySession":
298
+ return this.core.deleteBySession(rec.sessionId);
280
299
  case "reapSettledAsks":
281
300
  return this.core.reapSettledAsks(rec.cutoffMs, rec.limit, new Set(rec.keepAnchors));
282
301
  case "reapEmptyBatches":
@@ -327,11 +346,12 @@ export class FileApprovalAskStore {
327
346
  async resolveProvisional(askId, from, to, patch) {
328
347
  return this.write({ op: "resolveProvisional", askId, from, to, patch }, (c) => this.core.resolveProvisional(c.askId, c.from, c.to, c.patch));
329
348
  }
330
- async deleteByTask(taskId) {
331
- const plan = this.core.planDeleteByTask(taskId);
332
- if (plan.askIds.length === 0 && plan.batchIds.length === 0)
333
- return;
334
- return this.write({ op: "deleteByTask", taskId }, (c) => this.core.deleteByTask(c.taskId));
349
+ async deleteBySession(sessionId) {
350
+ const plan = this.core.planDeleteBySession(sessionId);
351
+ if (plan.askIds.length > 0 || plan.batchIds.length > 0)
352
+ await this.write({ op: "deleteBySession", sessionId }, (c) => this.core.deleteBySession(c.sessionId));
353
+ if (this.removalRecordsOnDisk)
354
+ this.compact();
335
355
  }
336
356
  async reapSettledAsks(cutoffMs, limit, keepAnchors) {
337
357
  if (this.core.planReapSettledAsks(cutoffMs, limit, keepAnchors).length === 0)
@@ -355,8 +375,8 @@ export class FileApprovalAskStore {
355
375
  listByCall(call) {
356
376
  return this.core.listByCall(call);
357
377
  }
358
- listParkingBySession(sessionId) {
359
- return this.core.listParkingBySession(sessionId);
378
+ listParkingBySourceSession(sourceSessionId) {
379
+ return this.core.listParkingBySourceSession(sourceSessionId);
360
380
  }
361
381
  getAsk(askId) {
362
382
  return this.core.getAsk(askId);
@@ -400,6 +420,9 @@ export class FileApprovalAskStore {
400
420
  this.compact();
401
421
  return filled;
402
422
  }
423
+ scenarioPrefixOwnerRowsM42() {
424
+ return this.core.ownerRowsWithPrefix(SCENARIO_SUBJECT_PREFIX);
425
+ }
403
426
  renameRetiredExecutionLaneWordM40() {
404
427
  const renamed = this.core.renameExecutionLaneWord(RETIRED_EXECUTION_LANE_WORD_M40, RENAMED_EXECUTION_LANE_M40);
405
428
  if (renamed === 0)
@@ -79,8 +79,15 @@ export declare class InMemoryApprovalAskStore implements ApprovalAskStore {
79
79
  * 装回后这一格不在)记成 `lane`(一元车道表的唯一项 —— 调用方判过)。返回改了的行数;只碰这一格缺席的行 —— 记下了而不是车道词的行不在这里改(调用方先拒)。
80
80
  */
81
81
  fillMissingExecutionLanes(lane: ExecutionLane): number;
82
+ /** 一次性迁移 M42 的 local 问账腿(File 形的内核口;`FileApprovalAskStore.scenarioPrefixOwnerRowsM42` 调):属主以 `prefix` 开头的问行数。纯读。 */
83
+ ownerRowsWithPrefix(prefix: string): number;
82
84
  /** 一次性迁移 M40 的 local 问账腿(File 形的内核口;`FileApprovalAskStore.renameRetiredExecutionLaneWordM40` 调):出处车道记成 `from` 的行改记 `to`。返回改了的行数。 */
83
85
  renameExecutionLaneWord(from: string, to: ExecutionLane): number;
86
+ /**
87
+ * 一次性迁移 M50 的 local 问账腿(File 形的内核口;`FileApprovalAskStore` 重放到退役动词 `deleteByTask` 的记录时调;窗口见 `plugins/one-time-migrations.ts` 登记表):
88
+ * 按写下那条记录的版本的读法重放 —— 删 `taskId` 名下的问(`taskId` 相等)与批(`taskId` 相等)。不是店接口的一口(那只动词已退役);随 M50 删。
89
+ */
90
+ deleteByTaskM50(taskId: string): void;
84
91
  /** [ref]:一行的**同步**点读(拷贝;纯读,零判定)—— File 形在写口的同步前缀里用它(见类顶注)。 */
85
92
  peekAsk(askId: string): AskRow | null;
86
93
  /** [ref]:把快照里的行**原样**装回两张 Map(同键覆盖)。零谓词、零状态机 —— 它不是一条转移,是重放
@@ -116,13 +123,14 @@ export declare class InMemoryApprovalAskStore implements ApprovalAskStore {
116
123
  listPendingByTask(taskId: string, signal?: AbortSignal): Promise<AskRow[]>;
117
124
  listPendingBySession(sessionId: string, owner: string | null, signal?: AbortSignal): Promise<AskRow[]>;
118
125
  listByCall(call: AskCallCoordinate): Promise<AskRow[]>;
119
- listParkingBySession(sessionId: string): Promise<AskRow[]>;
126
+ listParkingBySourceSession(sourceSessionId: string): Promise<AskRow[]>;
120
127
  getAsk(askId: string): Promise<AskRow | null>;
121
128
  getByIdempotencyKey(taskId: string, key: string): Promise<AskRow | null>;
122
129
  resolveProvisional(askId: string, from: AskState, to: AskState, patch: AskTransitionPatch): Promise<boolean>;
123
- deleteByTask(taskId: string): Promise<void>;
124
- /** {@link deleteByTask} 会删哪些行(纯读,零写;选择与删除共用这一只,没有第二份谓词)。 */
125
- planDeleteByTask(taskId: string): {
130
+ /** 删会话的审批腿(语义见接口注;谓词 = {@link askAttachedToSession},与 SQL 两方言的语句同读)。方法体全同步(零 `await`)⇒ File 形重放逐字复现。 */
131
+ deleteBySession(sessionId: string): Promise<void>;
132
+ /** {@link deleteBySession} 会删哪些行(纯读,零写;选择与删除共用这一只,没有第二份谓词):挂靠该会话的问,与它们所在的批(还在的那些)。 */
133
+ planDeleteBySession(sessionId: string): {
126
134
  readonly askIds: readonly string[];
127
135
  readonly batchIds: readonly string[];
128
136
  };
@@ -1,6 +1,6 @@
1
1
  import { ASK_TERMINAL, canAskTransition } from "../approval-ask-machine.js";
2
2
  import { APPROVAL_ENDING_CAUSES } from "../approval-deny-reasons.js";
3
- import { askRowCarriesOwner, askRowOnCall, assertDecideSource, assertIdempotencyKeyShape, assertIntegralEpochMs, assertReapBounds, ApprovalAskReadAbortedError, claimTargetState, POLICY_REFUSAL_DECISION, projectAskTerminalClaimTruth, projectDecideReading } from "./approval-ask-store-sql.js";
3
+ import { askAttachedToSession, askRowCarriesOwner, askRowOnCall, assertDecideSource, assertIdempotencyKeyShape, assertIntegralEpochMs, assertReapBounds, ApprovalAskReadAbortedError, claimTargetState, POLICY_REFUSAL_DECISION, projectAskTerminalClaimTruth, projectDecideReading } from "./approval-ask-store-sql.js";
4
4
  function applyPatch(row, patch) {
5
5
  if (patch.decision !== undefined)
6
6
  row.decision = patch.decision;
@@ -51,6 +51,13 @@ export class InMemoryApprovalAskStore {
51
51
  }
52
52
  return filled;
53
53
  }
54
+ ownerRowsWithPrefix(prefix) {
55
+ let n = 0;
56
+ for (const row of this.asks.values())
57
+ if (row.owner !== null && row.owner.startsWith(prefix))
58
+ n += 1;
59
+ return n;
60
+ }
54
61
  renameExecutionLaneWord(from, to) {
55
62
  let renamed = 0;
56
63
  for (const [askId, row] of this.asks) {
@@ -61,6 +68,14 @@ export class InMemoryApprovalAskStore {
61
68
  }
62
69
  return renamed;
63
70
  }
71
+ deleteByTaskM50(taskId) {
72
+ for (const [askId, row] of this.asks)
73
+ if (row.taskId === taskId)
74
+ this.asks.delete(askId);
75
+ for (const [batchId, batch] of this.batches)
76
+ if (batch.taskId === taskId)
77
+ this.batches.delete(batchId);
78
+ }
64
79
  peekAsk(askId) {
65
80
  const row = this.asks.get(askId);
66
81
  return row ? { ...row } : null;
@@ -344,9 +359,9 @@ export class InMemoryApprovalAskStore {
344
359
  .sort((a, b) => a.createdAtMs - b.createdAtMs || (a.askId < b.askId ? -1 : a.askId > b.askId ? 1 : 0))
345
360
  .map((r) => ({ ...r }));
346
361
  }
347
- async listParkingBySession(sessionId) {
362
+ async listParkingBySourceSession(sourceSessionId) {
348
363
  return [...this.asks.values()]
349
- .filter((r) => r.sessionId === sessionId && r.state === "PARKING")
364
+ .filter((r) => r.sourceSessionId === sourceSessionId && r.state === "PARKING")
350
365
  .sort((a, b) => a.createdAtMs - b.createdAtMs || (a.askId < b.askId ? -1 : a.askId > b.askId ? 1 : 0))
351
366
  .map((r) => ({ ...r }));
352
367
  }
@@ -373,18 +388,17 @@ export class InMemoryApprovalAskStore {
373
388
  row.updatedAtMs = patch.updatedAtMs;
374
389
  return true;
375
390
  }
376
- async deleteByTask(taskId) {
377
- const plan = this.planDeleteByTask(taskId);
391
+ async deleteBySession(sessionId) {
392
+ const plan = this.planDeleteBySession(sessionId);
378
393
  for (const id of plan.askIds)
379
394
  this.asks.delete(id);
380
395
  for (const id of plan.batchIds)
381
396
  this.batches.delete(id);
382
397
  }
383
- planDeleteByTask(taskId) {
384
- return {
385
- askIds: [...this.asks.values()].filter((r) => r.taskId === taskId).map((r) => r.askId),
386
- batchIds: [...this.batches.values()].filter((b) => b.taskId === taskId).map((b) => b.batchId),
387
- };
398
+ planDeleteBySession(sessionId) {
399
+ const asks = [...this.asks.values()].filter((r) => askAttachedToSession(r, sessionId));
400
+ const batchIds = [...new Set(asks.map((r) => r.batchId))].filter((id) => this.batches.has(id));
401
+ return { askIds: asks.map((r) => r.askId), batchIds };
388
402
  }
389
403
  async getBatch(batchId) {
390
404
  const b = this.batches.get(batchId);
@@ -39,7 +39,7 @@
39
39
  import type { Pool as MySqlPool } from "mysql2/promise";
40
40
  import type { Pool as PgPool } from "pg";
41
41
  import type { PgQueryFn } from "./pg-query.js";
42
- import { type SqlDriver, type SqlDialect } from "./sql-driver.js";
42
+ import { type SqlDriver, type SqlDialect, type SqlExec } from "./sql-driver.js";
43
43
  import { type AskState, type BatchState } from "../approval-ask-machine.js";
44
44
  import type { HostSettledBy } from "../host-decision.js";
45
45
  import { type DecidedVia } from "@sema-agent/core";
@@ -472,19 +472,11 @@ export interface BatchRow {
472
472
  export type AskCallCoordinate = Pick<AskRow, "taskId" | "legKey" | "toolCallId" | "sourceSessionId">;
473
473
  /** 「这一行在这次调用上」的唯一判据(四列逐字相等):InMemory twin 的筛子与 SQL twin 的出口对齐读同一只。 */
474
474
  export declare function askRowOnCall(row: AskRow, call: AskCallCoordinate): boolean;
475
- /**
476
- * 🔴 [ref] —— **一只问的属主判据**(全仓唯一;两扇决议口 —— live 应答口 `POST /v1/tool-approvals/:id/respond`、耐久决断口
477
- * `POST /v1/tasks/:taskId/asks/:askId/decision` —— 与按问读口都调它):调用方是不是这只问的属主。`owner` 只有一条来源律:有行的问读行上
478
- * **当下的** `owner` 列(铸行写定,只有 `/v1/adoption` 改写它;进程内任何快照 —— 包括登记在铸卡那一刻记下的那一格 —— 都改不动);
479
- * 没有行的问(问账没上场 / 旧族腿)只有登记记下的那一位可读。`null` = auth-off 单用户行,恒过。
480
- * 门判过的那位属主再交给决议 CAS 的作用域({@link askRowCarriesOwner},[ref])。耐久决断口的 operator 越域臂不在这里 —— 那是那扇口自己的授权门。
481
- */
482
- export declare function askOwnerAdmits(owner: string | null, principal: string | undefined): boolean;
483
475
  /**
484
476
  * 🔴 [ref] —— **决议作用域的属主维**:这一行此刻带着的属主,是不是这次决议的门判过的那一位(逐字相等;`null` 只等于 `null`)。
485
477
  *
486
478
  * 律(一条):一次决议请求的作用域 = (ask, 批, **门判过的那位属主**)。属主的唯一来源是行上的 `owner` 列(铸行写定,只有 `/v1/adoption` 改写它);
487
- * 门(耐久回决口 `owner ∨ operator`、live 应答口 `owner`)照旧在门里判授权,本谓词**不复判授权**,只绑「门判的那一份属主事实」——
479
+ * 门(面表 `owner-faces.ts` 的 ask 两行:耐久回决口 `ask.decide` 属主 ∨ 无主 ∨ 运维、live 应答口 `ask.answer` 属主 ∨ 无主)照旧在门里判授权,本谓词**不复判授权**,只绑「门判的那一份属主事实」——
488
480
  * 门读行与 CAS 之间属主被改写,门的判断就不再是关于这一行的判断。于是这次请求拿到的**每一份**行读数(CAS 本身、CAS 输者的读数、
489
481
  * 提交歧义的确认读、幂等回放的命中)都过这一只:出域 = 缺席,门按缺席答(与行不在同体同码)。
490
482
  * InMemory twin 的判定、SQL twin 输者读数的投影、两扇门的确认读读同一只;SQL twin 的 UPDATE 谓词是它的方言镜像({@link decideOwnerWhere})。
@@ -492,6 +484,24 @@ export declare function askOwnerAdmits(owner: string | null, principal: string |
492
484
  export declare function askRowCarriesOwner(row: AskRow | null, owner: string | null): row is AskRow;
493
485
  /** [ref]:决议输者读数的投影(三 twin 共用一份):行出了这次决议的属主域 ⇒ 读作缺席,不交出别人的行。 */
494
486
  export declare function projectDecideReading(row: AskRow | null, owner: string | null): AskRow | null;
487
+ /**
488
+ * 🔴 **问行挂靠会话 S 吗** —— 删一只会话时审批账本带走哪些行的唯一谓词(内存 / File 两形读本函数;SQL 两方言读它的镜像 {@link deleteSessionApprovalRows})。
489
+ *
490
+ * 律:一只问挂靠 S ⇔ 它的两只会话格之一 —— 宿主会话(`sessionId`,列 `session_id`)/ 发问那条腿的会话(`sourceSessionId`,列 `source_task_id`)—— 等于 S,
491
+ * 且那一格不是 **run 替身**。铸点(`tool-approval.ts` 的 `ensureAsk`)在出处没有会话时(adhoc 腿)把自己的 run id 折进两只会话格;那样的行挂靠的是 run,
492
+ * 不是任何会话 —— 会话 id 由调用方自选,恰取某条 adhoc run 的 id 再删,不得带走那条 run 的问。真会话的行 `taskId`(server 新铸的 run id)恒 ≠ 调用方事先选定的会话 id,
493
+ * 所以「`taskId ≠ S`」只排除替身,不排除任何真挂靠。两格都算:子代(后台 / 委派)发的问记在宿主 run 与宿主会话名下、发问格是子代自己的会话 ——
494
+ * 只按宿主格删,子代会话被删时它发的问(带工具实参字面的卡)就留在宿主名下。批随它的问走(见 {@link ApprovalAskStore.deleteBySession})。
495
+ */
496
+ export declare function askAttachedToSession(row: Pick<AskRow, "taskId" | "sessionId" | "sourceSessionId">, sessionId: string): boolean;
497
+ /**
498
+ * {@link askAttachedToSession} 的 SQL 镜像 —— 两条删除执行体(在线协调器经店的 {@link ApprovalAskStore.deleteBySession};托管留存在会话树事务里经部署钩
499
+ * `retention-deployment.ts` 的 `deleteDeploymentSessionRows`)发的是**同一组语句**,只有执行它的连接不同。每格两句:先批(`batch_id` 取自同一谓词选中的问 ——
500
+ * 子查询要读问,所以先于删问)、后问;谓词 `<格> ∈ ids ∧ <格> <> task_id`(行内比较,对一批 id 与单个 id 同读)。索引:宿主格走 `idx_ask_session_state` 的前缀,
501
+ * 发问格走 `idx_ask_source_session`。会话 id 在入口只收规范 uuid、发问格是引擎铸的会话 id 原值 ⇒ MySQL 协议 VARCHAR 等值的 PAD SPACE 近撞构造不出,不另做出口逐字再滤。
502
+ * 空集 ⇒ 零语句。
503
+ */
504
+ export declare function deleteSessionApprovalRows(exec: SqlExec, dialect: SqlDialect, ids: readonly string[]): Promise<void>;
495
505
  export interface ApprovalAskStore {
496
506
  /** 幂等 upsert。返回**行 + 本次是否真插入**(判别位语义见 {@link EnsureAskResult})。 */
497
507
  ensureAsk(row: NewAskRow): Promise<EnsureAskResult>;
@@ -566,23 +576,31 @@ export interface ApprovalAskStore {
566
576
  */
567
577
  listByCall(call: AskCallCoordinate): Promise<AskRow[]>;
568
578
  /**
569
- * 一个会话里**仍在 `PARKING`** 的全部行(序 = `created_at_ms ASC, ask_id ASC`,确定性)。
579
+ * 发起会话(`sourceSessionId`,列 `source_task_id`)是给定会话、**仍在 `PARKING`** 的全部行(序 = `created_at_ms ASC, ask_id ASC`,确定性)。
570
580
  *
571
581
  * 唯一消费者 = 对账收敛器的 park 提交那一拍(`approval-reconciler.ts` 的 `bindCommittedPark`):一只审批停车行提交了,收敛器要对**这次调用**
572
582
  * 的 PARKING 行即时跑判据 1。停车行只陈述会话与调用 id(没有 taskId / legKey ⇒ `listByCall` 用不上);`listByState` 带 LIMIT 且按队列序,
573
- * 新行排在队尾会被截掉。按会话读是**判据 1 能命中的行的超集**:判据 1 的候选读口按 `ask.sessionId` 查停车行,命中要求停车行的会话就是这一列。
583
+ * 新行排在队尾会被截掉。停车行陈述的会话 = 铸它的那条腿的会话 = 同一次调用的问的发起会话(core 同一只变量;委派 / 后台子代 = 子代自己的会话,
584
+ * 行上的 `sessionId` 记的是投递上下文)⇒ 按发起会话读是**判据 1 能命中的行的超集**:判据 1 的候选读口按同一格查停车行。
574
585
  *
575
- * 不带租户门(内部读口,不上 wire):租户门在判据 1 的候选读口上(scope = 行的 owner)。索引走既有 `idx_ask_session_state (session_id, state)`。
576
- * 三 twin 同答:SQL twin 读后按会话逐字再滤一遍(MySQL 协议 VARCHAR 等值的 PAD SPACE,与 `listByCall` 同一条出口对齐)。
586
+ * 不带租户门(内部读口,不上 wire):租户门在判据 1 的候选读口上(scope = 行的 owner)。索引走既有 `idx_ask_state (state)`(`PARKING` 是转移窗里的态,
587
+ * 行数随在途停驻,不随账本总量)。三 twin 同答:SQL twin 读后按发起会话逐字再滤一遍(MySQL 协议 VARCHAR 等值的 PAD SPACE,与 `listByCall` 同一条出口对齐)。
577
588
  */
578
- listParkingBySession(sessionId: string): Promise<AskRow[]>;
589
+ listParkingBySourceSession(sourceSessionId: string): Promise<AskRow[]>;
579
590
  getAsk(askId: string): Promise<AskRow | null>;
580
591
  /** 回决幂等回放的读口。🔴 `taskId` **必填**且是键的第一维——UNIQUE 已改 `(task_id, idempotency_key)`
581
592
  * (车4 §12-E),裸按 key 全局查在多租户库上既可能回**别人 task** 的行(存在性外泄),也可能在同 key
582
593
  * 合法共存于两 task 时任选一行返回(不确定)。租户门是读口自己的责任,同 `listPendingBySession`。 */
583
594
  getByIdempotencyKey(taskId: string, key: string): Promise<AskRow | null>;
584
595
  resolveProvisional(askId: string, from: AskState, to: AskState, patch: AskTransitionPatch): Promise<boolean>;
585
- deleteByTask(taskId: string): Promise<void>;
596
+ /**
597
+ * **删一只会话时审批账本那一腿**(删净执行体两形同读:local 执行体 `session-erase.ts` 调本方法;SQL 上在线删除与托管留存同一段会话树事务发同一组 SQL,见
598
+ * {@link deleteSessionApprovalRows})。删掉挂靠该会话的全部问行({@link askAttachedToSession})与这些问所在的批 —— 一只批里的问共享同一 (发问会话, run)
599
+ * (`approval-ask-machine.ts` 的批 id 派生;铸点不变式,店不强制),整批同挂靠。**不碰**已经没有问的空批:批只带 `task_id`、不带会话格,归属不了任何会话,
600
+ * 归留存律的 {@link reapEmptyBatches} 按龄收。任意状态都删(删会话的协调器已先过活跑门并结束子代;留存腿的候选按定义没有活引用)。
601
+ * 幂等;删不到东西是零动作。File 形另有一条完成条件:被删行的字节离开账本才返回(见该形)。
602
+ */
603
+ deleteBySession(sessionId: string): Promise<void>;
586
604
  /**
587
605
  * **审批账本留存律的问账半场之一:问行**(律、节律与「还能动的 run」一处成文在 `approval-ask-retention.ts`;维护 tick 是唯一调用方)。
588
606
  * 删至多 `limit` 只**结了**的问行 —— `state ∈ ASK_TERMINAL` ∧ `provisional = false`(provisional 行还能被 {@link resolveProvisional} 改判,没结)
@@ -651,8 +669,8 @@ export declare const APPROVAL_BATCH_TABLE = "approval_batch";
651
669
  * `task_run.task_id VARCHAR(64)` 同宽(此前 255 是本家族独有的偏离,无依据)。
652
670
  * · `session_id` → 64:提交入口只收 canonical uuid(36 字符;7.125.x 及更早硬拒 >64),列宽仍容存量,
653
671
  * 与 `session_meta`/`task_run` 同宽。
654
- * · `owner` → 190:`assertPrincipalShape` 的 `PRINCIPAL_MAX_LENGTH = 190`(`security.ts` 的同名导出常量,
655
- * 刻意不钉行号 —— 旧注写的 `security.ts:350` 已随该文件编辑漂走)硬拒更长者;
672
+ * · `owner` → 190:`assertPrincipalShape` 按 `PRINCIPAL_MAX_BYTES = 190`(UTF-8 字节;`principal-shape.ts` 的同名导出常量,
673
+ * 刻意不钉行号 —— 旧注写的 `security.ts:350` 已随该文件编辑漂走)硬拒更长者(190 字节的串至多 190 字符);
656
674
  * 全仓每一根 owner/scope 轴都是 190,此前 255 同样是无依据偏离。
657
675
  * · `gate_token` → 120:它抄的是 checkpoint 的 token(core `mintCheckpointToken` = 16 字节 hex = 32 字符),
658
676
  * 取与**被抄那一列** `checkpoint.token VARCHAR(120)` 同宽 —— 同一个值在两张表上宽度必须一致,
@@ -772,12 +790,13 @@ export declare class SqlApprovalAskStore implements ApprovalAskStore {
772
790
  listPendingByTask(taskId: string, signal?: AbortSignal): Promise<AskRow[]>;
773
791
  listPendingBySession(sessionId: string, owner: string | null, signal?: AbortSignal): Promise<AskRow[]>;
774
792
  listByCall(call: AskCallCoordinate): Promise<AskRow[]>;
775
- listParkingBySession(sessionId: string): Promise<AskRow[]>;
793
+ listParkingBySourceSession(sourceSessionId: string): Promise<AskRow[]>;
776
794
  getAsk(askId: string): Promise<AskRow | null>;
777
795
  getByIdempotencyKey(taskId: string, key: string): Promise<AskRow | null>;
778
796
  deferReconcile(askId: string, expectedState: AskState, expectedRev: number, nowMs: number): Promise<boolean>;
779
797
  resolveProvisional(askId: string, from: AskState, to: AskState, patch: AskTransitionPatch): Promise<boolean>;
780
- deleteByTask(taskId: string): Promise<void>;
798
+ /** 一个事务里发 {@link deleteSessionApprovalRows} 那组语句(与留存腿同一组;批与问同生同死,半途失败整组回滚、重试收敛)。 */
799
+ deleteBySession(sessionId: string): Promise<void>;
781
800
  /**
782
801
  * 留存律的问行半场(谓词见接口注)。一条带 `LIMIT` 的 `DELETE`(PG 无 `DELETE … LIMIT` ⇒ `ctid IN (SELECT … LIMIT)`,与
783
802
  * `permission-rule-store-sql.ts` 的清扫同形);终态闭集从 {@link ASK_TERMINAL} 展开成占位符,不在 SQL 里手抄态名;挂靠集对三格各一句