@sema-agent/server 7.147.0 → 7.149.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (790) hide show
  1. package/MIGRATION.md +1468 -24
  2. package/README.md +35 -7
  3. package/README.zh-CN.md +18 -8
  4. package/USAGE.md +444 -193
  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/approval-card.d.ts +36 -38
  39. package/dist/approval-gate-currency.js +3 -2
  40. package/dist/approval-leg-origin.d.ts +33 -0
  41. package/dist/approval-leg-origin.js +4 -0
  42. package/dist/approval-reconciler.d.ts +4 -13
  43. package/dist/approval-reconciler.js +2 -2
  44. package/dist/approval.d.ts +13 -11
  45. package/dist/approval.js +3 -3
  46. package/dist/audit.d.ts +10 -3
  47. package/dist/audit.js +15 -7
  48. package/dist/auth-bridge.d.ts +9 -15
  49. package/dist/auth-bridge.js +4 -11
  50. package/dist/auth-keys.d.ts +10 -1
  51. package/dist/auth-keys.js +8 -0
  52. package/dist/auto-mode-face.d.ts +10 -7
  53. package/dist/auto-mode-face.js +7 -4
  54. package/dist/background-agent-name.d.ts +19 -1
  55. package/dist/background-agent-name.js +12 -2
  56. package/dist/background-session-reap.d.ts +1 -1
  57. package/dist/bake-runner/main.js +9 -6
  58. package/dist/bench/s1/arms.js +6 -5
  59. package/dist/bench/s1/live-deps.js +5 -2
  60. package/dist/bench/s1/run-firm.js +6 -5
  61. package/dist/bind-host.d.ts +25 -0
  62. package/dist/bind-host.js +25 -0
  63. package/dist/boot/adoption.d.ts +3 -0
  64. package/dist/boot/adoption.js +1 -0
  65. package/dist/boot/deployment-mods.d.ts +1 -1
  66. package/dist/boot/execution-env.d.ts +17 -7
  67. package/dist/boot/execution-env.js +47 -42
  68. package/dist/boot/execution-lane.d.ts +6 -4
  69. package/dist/boot/execution-lane.js +3 -1
  70. package/dist/boot/exit-boundary.d.ts +2 -2
  71. package/dist/boot/exit-boundary.js +6 -5
  72. package/dist/boot/fatal-exit.d.ts +3 -5
  73. package/dist/boot/fatal-exit.js +2 -2
  74. package/dist/boot/leader.d.ts +15 -0
  75. package/dist/boot/leader.js +17 -15
  76. package/dist/boot/memory-consolidation.d.ts +37 -29
  77. package/dist/boot/memory-consolidation.js +11 -5
  78. package/dist/boot/org-delivery.d.ts +3 -2
  79. package/dist/boot/org-memory.js +1 -1
  80. package/dist/boot/parked-revive-gate.js +2 -2
  81. package/dist/boot/reapers.d.ts +4 -3
  82. package/dist/boot/reapers.js +19 -16
  83. package/dist/boot/resolve-spec.d.ts +5 -3
  84. package/dist/boot/resolve-spec.js +60 -70
  85. package/dist/boot/retention-lane.d.ts +4 -4
  86. package/dist/boot/retention-lane.js +2 -2
  87. package/dist/boot/runner-deps.d.ts +28 -7
  88. package/dist/boot/runner-deps.js +14 -5
  89. package/dist/boot/runtime-caps.d.ts +2 -2
  90. package/dist/boot/runtime-caps.js +16 -2
  91. package/dist/boot/session-faces.d.ts +16 -7
  92. package/dist/boot/session-faces.js +114 -94
  93. package/dist/boot/shutdown.d.ts +5 -4
  94. package/dist/boot/shutdown.js +6 -4
  95. package/dist/boot/stage-01-config.d.ts +1 -0
  96. package/dist/boot/stage-01-config.js +13 -4
  97. package/dist/boot/stage-02-web-admin-pull.d.ts +2 -0
  98. package/dist/boot/stage-02-web-admin-pull.js +16 -3
  99. package/dist/boot/stage-03-store-backend.d.ts +4 -0
  100. package/dist/boot/stage-03-store-backend.js +4 -3
  101. package/dist/boot/stage-04-stores.d.ts +3 -0
  102. package/dist/boot/stage-04-stores.js +2 -2
  103. package/dist/boot/stage-05-execution-env.d.ts +8 -3
  104. package/dist/boot/stage-05-execution-env.js +2 -2
  105. package/dist/boot/stage-06-runners.d.ts +12 -13
  106. package/dist/boot/stage-06-runners.js +23 -15
  107. package/dist/boot/stage-07-capability-layer.d.ts +13 -9
  108. package/dist/boot/stage-07-capability-layer.js +5 -3
  109. package/dist/boot/stage-08-reapers.d.ts +13 -9
  110. package/dist/boot/stage-08-reapers.js +3 -3
  111. package/dist/boot/stage-09-leader.d.ts +14 -16
  112. package/dist/boot/stage-09-leader.js +12 -4
  113. package/dist/boot/stage-10-http-server.d.ts +14 -16
  114. package/dist/boot/stage-10-http-server.js +7 -4
  115. package/dist/boot/store-evidence.d.ts +20 -0
  116. package/dist/boot/store-evidence.js +13 -0
  117. package/dist/boot/stores.d.ts +6 -0
  118. package/dist/boot/stores.js +41 -27
  119. package/dist/boot/task-list-lane.d.ts +4 -4
  120. package/dist/boot/web-admin.d.ts +4 -2
  121. package/dist/boot/web-admin.js +55 -35
  122. package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
  123. package/dist/boot-reclaim.d.ts +3 -1
  124. package/dist/boot-reclaim.js +1 -1
  125. package/dist/brain.d.ts +7 -18
  126. package/dist/brain.js +5 -17
  127. package/dist/budget.js +6 -6
  128. package/dist/capabilities/center-plugins.d.ts +7 -1
  129. package/dist/capabilities/center-plugins.js +32 -10
  130. package/dist/capabilities/center-wiring.js +1 -1
  131. package/dist/capabilities/composite-members.d.ts +2 -2
  132. package/dist/capabilities/composite-members.js +2 -2
  133. package/dist/capabilities/repo-tools.d.ts +2 -0
  134. package/dist/capabilities/repo-tools.js +14 -12
  135. package/dist/capabilities/scenarios.d.ts +6 -15
  136. package/dist/capabilities/scenarios.js +11 -16
  137. package/dist/capabilities/skills.d.ts +1 -1
  138. package/dist/capabilities/tool-defer.d.ts +1 -1
  139. package/dist/capability-facts.d.ts +39 -11
  140. package/dist/capability-facts.js +35 -7
  141. package/dist/card-settle-stored-scope.d.ts +56 -0
  142. package/dist/card-settle-stored-scope.js +27 -0
  143. package/dist/card-void.d.ts +8 -13
  144. package/dist/card-void.js +2 -7
  145. package/dist/center-credential-renewer.d.ts +6 -2
  146. package/dist/center-credential-renewer.js +7 -3
  147. package/dist/config-catalog.d.ts +28 -1
  148. package/dist/config-catalog.js +95 -85
  149. package/dist/config-dir-trust.d.ts +37 -4
  150. package/dist/config-dir-trust.js +88 -44
  151. package/dist/config-invariants.d.ts +43 -3
  152. package/dist/config-invariants.js +69 -5
  153. package/dist/config-lkg.d.ts +23 -1
  154. package/dist/config-lkg.js +17 -3
  155. package/dist/config-provider.d.ts +9 -9
  156. package/dist/config-provider.js +25 -110
  157. package/dist/config-pull-failure.d.ts +50 -0
  158. package/dist/config-pull-failure.js +48 -0
  159. package/dist/config-types.d.ts +62 -21
  160. package/dist/config.d.ts +14 -21
  161. package/dist/config.js +141 -64
  162. package/dist/context-window-notice.d.ts +31 -0
  163. package/dist/context-window-notice.js +28 -0
  164. package/dist/delegated-session-owner.d.ts +1 -1
  165. package/dist/deleted-session-ids.d.ts +3 -2
  166. package/dist/deployment-governance.d.ts +3 -3
  167. package/dist/deployment-shape.d.ts +46 -11
  168. package/dist/deployment-shape.js +8 -0
  169. package/dist/egress-redirect.d.ts +25 -7
  170. package/dist/egress-redirect.js +20 -2
  171. package/dist/elicitation.d.ts +6 -5
  172. package/dist/elicitation.js +23 -22
  173. package/dist/engine-identity.d.ts +28 -0
  174. package/dist/engine-identity.js +10 -0
  175. package/dist/entry-problems.d.ts +5 -7
  176. package/dist/entry-problems.js +1 -1
  177. package/dist/env-facts.js +2 -1
  178. package/dist/env-name-allowlist-knobs.d.ts +6 -5
  179. package/dist/env-name-allowlist-knobs.js +5 -0
  180. package/dist/env-witness.d.ts +7 -0
  181. package/dist/env-witness.js +16 -0
  182. package/dist/execution-lane-caps.d.ts +25 -23
  183. package/dist/execution-lane-caps.js +18 -26
  184. package/dist/execution-placement.d.ts +58 -18
  185. package/dist/execution-placement.js +41 -2
  186. package/dist/field-conflict.d.ts +7 -11
  187. package/dist/field-conflict.js +3 -3
  188. package/dist/file-history-capture.d.ts +3 -3
  189. package/dist/file-history-disclosure.js +1 -0
  190. package/dist/fleet/fleet-bus.d.ts +21 -3
  191. package/dist/fleet/fleet-bus.js +35 -25
  192. package/dist/fleet/fleet-reconciler.js +2 -2
  193. package/dist/fleet/serving-lease.js +3 -3
  194. package/dist/fleet-client.js +3 -3
  195. package/dist/fleet-lease.d.ts +0 -1
  196. package/dist/fleet-lease.js +4 -5
  197. package/dist/history-anchor.d.ts +23 -3
  198. package/dist/history-anchor.js +24 -4
  199. package/dist/hitl-delivery.d.ts +90 -0
  200. package/dist/hitl-delivery.js +98 -0
  201. package/dist/hooks/classic-stations.d.ts +8 -11
  202. package/dist/hooks/classic-stations.js +0 -7
  203. package/dist/hooks/command-spawn.d.ts +7 -2
  204. package/dist/hooks/command-spawn.js +13 -6
  205. package/dist/hooks/hook-llm.d.ts +5 -1
  206. package/dist/hooks/hook-llm.js +24 -15
  207. package/dist/hooks/hook-runner.d.ts +72 -57
  208. package/dist/hooks/hook-runner.js +271 -193
  209. package/dist/host-lsp-manager.d.ts +22 -8
  210. package/dist/host-lsp-manager.js +4 -1
  211. package/dist/http/active-run-conflict.d.ts +2 -43
  212. package/dist/http/active-run-conflict.js +3 -7
  213. package/dist/http/admission.d.ts +4 -18
  214. package/dist/http/admission.js +76 -79
  215. package/dist/http/approval-sweeps.d.ts +3 -3
  216. package/dist/http/approval-sweeps.js +56 -31
  217. package/dist/http/caller-trust.d.ts +8 -10
  218. package/dist/http/caller-trust.js +1 -2
  219. package/dist/http/claim-heartbeat.d.ts +49 -0
  220. package/dist/http/claim-heartbeat.js +46 -0
  221. package/dist/http/claimed-run.d.ts +16 -8
  222. package/dist/http/claimed-run.js +8 -0
  223. package/dist/http/dispatch.d.ts +8 -1
  224. package/dist/http/dispatch.js +78 -30
  225. package/dist/http/durable-run-leg.d.ts +11 -4
  226. package/dist/http/durable-run-leg.js +45 -21
  227. package/dist/http/execution-context.d.ts +122 -47
  228. package/dist/http/execution-context.js +135 -43
  229. package/dist/http/health-reader.d.ts +36 -0
  230. package/dist/http/health-reader.js +21 -0
  231. package/dist/http/health-self-report.d.ts +9 -9
  232. package/dist/http/health-self-report.js +4 -4
  233. package/dist/http/idempotency.d.ts +9 -5
  234. package/dist/http/idempotency.js +4 -4
  235. package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
  236. package/dist/http/memory-compliance-failure-reply.js +4 -2
  237. package/dist/http/memory-face-fault-reply.d.ts +67 -0
  238. package/dist/http/memory-face-fault-reply.js +71 -0
  239. package/dist/http/memory-store-refusal-reply.d.ts +1 -1
  240. package/dist/http/memory-store-refusal-reply.js +3 -0
  241. package/dist/http/owner-access.d.ts +392 -67
  242. package/dist/http/owner-access.js +370 -35
  243. package/dist/http/principal-gate.d.ts +39 -89
  244. package/dist/http/principal-gate.js +26 -68
  245. package/dist/http/refusal-body.d.ts +35 -2
  246. package/dist/http/refusal-body.js +34 -0
  247. package/dist/http/request-guards.d.ts +9 -13
  248. package/dist/http/request-guards.js +34 -68
  249. package/dist/http/resume-composition.d.ts +37 -0
  250. package/dist/http/resume-composition.js +18 -0
  251. package/dist/http/resume-ctx-read.d.ts +46 -12
  252. package/dist/http/resume-ctx-read.js +31 -6
  253. package/dist/http/resume-legs.d.ts +54 -19
  254. package/dist/http/resume-legs.js +408 -196
  255. package/dist/http/retired-skill-manifest.d.ts +1 -1
  256. package/dist/http/route-ctx.d.ts +31 -32
  257. package/dist/http/routes/a2a-serve.d.ts +43 -5
  258. package/dist/http/routes/a2a-serve.js +60 -37
  259. package/dist/http/routes/admin-config-refresh.js +2 -2
  260. package/dist/http/routes/admin-drain.js +2 -2
  261. package/dist/http/routes/admin-memory-optout.js +4 -3
  262. package/dist/http/routes/adoption.d.ts +3 -0
  263. package/dist/http/routes/adoption.js +17 -10
  264. package/dist/http/routes/agents-roster.js +13 -7
  265. package/dist/http/routes/approvals-assistant.js +73 -67
  266. package/dist/http/routes/attachments.js +2 -2
  267. package/dist/http/routes/background.d.ts +3 -3
  268. package/dist/http/routes/background.js +9 -17
  269. package/dist/http/routes/capabilities.js +16 -19
  270. package/dist/http/routes/config-catalog.js +2 -2
  271. package/dist/http/routes/devices.d.ts +3 -3
  272. package/dist/http/routes/devices.js +4 -4
  273. package/dist/http/routes/diagnostics.d.ts +29 -3
  274. package/dist/http/routes/diagnostics.js +49 -18
  275. package/dist/http/routes/engine.js +2 -2
  276. package/dist/http/routes/fleet.js +5 -3
  277. package/dist/http/routes/images.js +10 -6
  278. package/dist/http/routes/leader.d.ts +7 -2
  279. package/dist/http/routes/leader.js +12 -3
  280. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  281. package/dist/http/routes/mcp-reconnect.js +7 -15
  282. package/dist/http/routes/memory-bundle.js +4 -7
  283. package/dist/http/routes/memory-compliance.js +4 -4
  284. package/dist/http/routes/memory-consolidation.js +6 -9
  285. package/dist/http/routes/memory-origin.d.ts +2 -0
  286. package/dist/http/routes/memory-origin.js +7 -8
  287. package/dist/http/routes/memory-policy.js +17 -12
  288. package/dist/http/routes/notify-wake.js +10 -19
  289. package/dist/http/routes/observability.js +3 -3
  290. package/dist/http/routes/principal-inbox.d.ts +4 -2
  291. package/dist/http/routes/principal-inbox.js +5 -4
  292. package/dist/http/routes/projects.d.ts +1 -1
  293. package/dist/http/routes/projects.js +3 -2
  294. package/dist/http/routes/retention-ops.js +6 -9
  295. package/dist/http/routes/rules.js +20 -5
  296. package/dist/http/routes/run-memory-capture.d.ts +2 -2
  297. package/dist/http/routes/run-memory-capture.js +6 -12
  298. package/dist/http/routes/run-permission-mode.d.ts +2 -2
  299. package/dist/http/routes/run-permission-mode.js +10 -17
  300. package/dist/http/routes/runs.js +155 -237
  301. package/dist/http/routes/session-memory-sync.d.ts +2 -2
  302. package/dist/http/routes/session-memory-sync.js +7 -13
  303. package/dist/http/routes/session-sync.d.ts +28 -7
  304. package/dist/http/routes/session-sync.js +63 -50
  305. package/dist/http/routes/sessions-list.d.ts +3 -3
  306. package/dist/http/routes/sessions-list.js +9 -9
  307. package/dist/http/routes/sessions.js +87 -124
  308. package/dist/http/routes/shared-memory.js +6 -6
  309. package/dist/http/routes/side-query.js +2 -2
  310. package/dist/http/routes/tasks.js +237 -187
  311. package/dist/http/routes/trace-usage.d.ts +0 -12
  312. package/dist/http/routes/trace-usage.js +40 -46
  313. package/dist/http/routes/workflows.d.ts +39 -4
  314. package/dist/http/routes/workflows.js +42 -14
  315. package/dist/http/run-concurrency-cap.d.ts +20 -12
  316. package/dist/http/run-concurrency-cap.js +39 -26
  317. package/dist/http/run-read-face.d.ts +3 -5
  318. package/dist/http/run-read-face.js +8 -13
  319. package/dist/http/send.d.ts +12 -3
  320. package/dist/http/send.js +42 -6
  321. package/dist/http/server.d.ts +43 -45
  322. package/dist/http/server.js +61 -11
  323. package/dist/http/sse-log.d.ts +17 -10
  324. package/dist/http/sse-log.js +7 -7
  325. package/dist/http/stored-body-replay.d.ts +12 -0
  326. package/dist/http/stored-body-replay.js +2 -2
  327. package/dist/http/submit-ctx.d.ts +17 -8
  328. package/dist/http/submit-ctx.js +8 -5
  329. package/dist/http/submit-replay.d.ts +19 -6
  330. package/dist/http/submit-replay.js +18 -6
  331. package/dist/http/sync-submit-body.d.ts +3 -4
  332. package/dist/http/sync-submit-body.js +4 -5
  333. package/dist/http/wire-types.d.ts +4 -3
  334. package/dist/identity-source.d.ts +36 -5
  335. package/dist/identity-source.js +27 -0
  336. package/dist/index.d.ts +4 -1
  337. package/dist/index.js +2 -0
  338. package/dist/key-resolver.d.ts +32 -0
  339. package/dist/key-resolver.js +23 -9
  340. package/dist/leader/diffup.js +2 -1
  341. package/dist/leader/endpoint.d.ts +26 -5
  342. package/dist/leader/endpoint.js +154 -14
  343. package/dist/leader/fanout.d.ts +3 -0
  344. package/dist/leader/fanout.js +78 -63
  345. package/dist/leader/leader.d.ts +16 -0
  346. package/dist/leader/leader.js +43 -3
  347. package/dist/leader/merge.d.ts +9 -1
  348. package/dist/leader/merge.js +16 -1
  349. package/dist/leader/repair-wire.js +1 -1
  350. package/dist/leader/wire.d.ts +36 -3
  351. package/dist/leader/wire.js +59 -18
  352. package/dist/leg-facts.d.ts +7 -2
  353. package/dist/leg-facts.js +1 -0
  354. package/dist/local-store-declaration.d.ts +54 -0
  355. package/dist/local-store-declaration.js +59 -0
  356. package/dist/lsp-evict.d.ts +6 -4
  357. package/dist/lsp-evict.js +2 -3
  358. package/dist/mcp-assertion-header.d.ts +1 -1
  359. package/dist/mcp-assertion-header.js +1 -1
  360. package/dist/memory-operator-faces.d.ts +5 -4
  361. package/dist/memory-operator-faces.js +1 -1
  362. package/dist/memory-project-layer.js +1 -1
  363. package/dist/memory-scope.d.ts +33 -6
  364. package/dist/memory-scope.js +68 -19
  365. package/dist/memory-store-refusal.d.ts +5 -2
  366. package/dist/memory-sync-client.d.ts +3 -2
  367. package/dist/memory-sync-client.js +8 -5
  368. package/dist/model-compat.d.ts +17 -8
  369. package/dist/model-compat.js +6 -2
  370. package/dist/model-context-window.d.ts +57 -0
  371. package/dist/model-context-window.js +21 -0
  372. package/dist/model-entry-headers.d.ts +46 -4
  373. package/dist/model-entry-headers.js +2 -2
  374. package/dist/model-entry-refusal.d.ts +40 -20
  375. package/dist/model-entry-refusal.js +57 -30
  376. package/dist/model-plane-face.d.ts +19 -11
  377. package/dist/model-plane-face.js +9 -1
  378. package/dist/model-plane-probe.d.ts +2 -0
  379. package/dist/model-plane-probe.js +17 -0
  380. package/dist/model-provider.d.ts +3 -3
  381. package/dist/model-reach-scope.d.ts +2 -1
  382. package/dist/model-route-endpoint.d.ts +9 -5
  383. package/dist/model-route-endpoint.js +29 -7
  384. package/dist/model-select.d.ts +16 -0
  385. package/dist/model-select.js +4 -0
  386. package/dist/mountinfo.d.ts +37 -0
  387. package/dist/mountinfo.js +47 -0
  388. package/dist/namespaced-rule-name.d.ts +23 -14
  389. package/dist/namespaced-rule-name.js +8 -11
  390. package/dist/net-address.d.ts +1 -1
  391. package/dist/observability/corrupt-read-seat.d.ts +4 -4
  392. package/dist/observability/corrupt-read-seat.js +5 -3
  393. package/dist/observability/fail-open.d.ts +72 -40
  394. package/dist/observability/fail-open.js +74 -40
  395. package/dist/observability/logger.d.ts +22 -1
  396. package/dist/observability/logger.js +89 -12
  397. package/dist/observability/metrics.js +4 -5
  398. package/dist/observability/otel-exporter.js +2 -1
  399. package/dist/observability/principal-context.d.ts +14 -7
  400. package/dist/observability/principal-context.js +8 -3
  401. package/dist/observability/run-terminal.d.ts +7 -1
  402. package/dist/observability/run-terminal.js +6 -2
  403. package/dist/observability/secret-env-scrub.d.ts +1 -1
  404. package/dist/observability/secret-env-scrub.js +1 -1
  405. package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
  406. package/dist/orchestration/hardened-vm-runner.js +11 -5
  407. package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
  408. package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
  409. package/dist/orchestration/hardened-vm-worker.js +2 -1
  410. package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
  411. package/dist/orchestration/workflow-completion-inbox.js +3 -2
  412. package/dist/org-delivery-gate.d.ts +36 -10
  413. package/dist/org-delivery-gate.js +12 -8
  414. package/dist/outbound-dispatcher.d.ts +1 -1
  415. package/dist/outbound-dispatcher.js +6 -12
  416. package/dist/owner-brands.d.ts +81 -0
  417. package/dist/owner-brands.js +42 -0
  418. package/dist/owner-faces.d.ts +532 -0
  419. package/dist/owner-faces.js +126 -0
  420. package/dist/park-row-commit.d.ts +67 -0
  421. package/dist/park-row-commit.js +76 -0
  422. package/dist/parked-decide.d.ts +76 -12
  423. package/dist/parked-decide.js +152 -11
  424. package/dist/parked-revive-surface.d.ts +14 -4
  425. package/dist/parked-revive-surface.js +5 -4
  426. package/dist/peer-directory.d.ts +7 -9
  427. package/dist/peer-directory.js +3 -2
  428. package/dist/permission-rule-vocab.d.ts +53 -8
  429. package/dist/permission-rule-vocab.js +30 -2
  430. package/dist/plugins/adoption-log-sql.d.ts +3 -25
  431. package/dist/plugins/adoption-log-sql.js +23 -21
  432. package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
  433. package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
  434. package/dist/plugins/approval-ask-store-file.d.ts +18 -7
  435. package/dist/plugins/approval-ask-store-file.js +37 -14
  436. package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
  437. package/dist/plugins/approval-ask-store-memory.js +24 -10
  438. package/dist/plugins/approval-ask-store-sql.d.ts +40 -21
  439. package/dist/plugins/approval-ask-store-sql.js +44 -15
  440. package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
  441. package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
  442. package/dist/plugins/approval-exemption-skill-m46.d.ts +14 -0
  443. package/dist/plugins/approval-exemption-skill-m46.js +21 -0
  444. package/dist/plugins/approval-exemption-store.d.ts +32 -2
  445. package/dist/plugins/approval-exemption-store.js +42 -19
  446. package/dist/plugins/approval-nonce-store.d.ts +39 -12
  447. package/dist/plugins/approval-nonce-store.js +72 -23
  448. package/dist/plugins/blob-backend.d.ts +2 -0
  449. package/dist/plugins/blob-backend.js +9 -6
  450. package/dist/plugins/caching-session-store.d.ts +13 -1
  451. package/dist/plugins/caching-session-store.js +43 -4
  452. package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
  453. package/dist/plugins/checkpoint-index-columns.js +36 -1
  454. package/dist/plugins/checkpoint-store-face.d.ts +83 -10
  455. package/dist/plugins/checkpoint-store-face.js +18 -1
  456. package/dist/plugins/device-store-sql.js +1 -0
  457. package/dist/plugins/ensure-index.d.ts +13 -1
  458. package/dist/plugins/ensure-index.js +154 -21
  459. package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -18
  460. package/dist/plugins/ensure-schema-lock-policy.js +76 -9
  461. package/dist/plugins/file-run-store.d.ts +85 -32
  462. package/dist/plugins/file-run-store.js +177 -94
  463. package/dist/plugins/host-platform.d.ts +24 -3
  464. package/dist/plugins/host-platform.js +15 -1
  465. package/dist/plugins/image-bake-store-sql.js +2 -0
  466. package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
  467. package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
  468. package/dist/plugins/k8s-pod-reaper.js +0 -1
  469. package/dist/plugins/leader-run-store-sql.d.ts +22 -0
  470. package/dist/plugins/leader-run-store-sql.js +34 -4
  471. package/dist/plugins/local-checkpoint-store.d.ts +62 -23
  472. package/dist/plugins/local-checkpoint-store.js +197 -77
  473. package/dist/plugins/local-data-dir-modes-m39.js +2 -1
  474. package/dist/plugins/local-data-root-admission.d.ts +52 -0
  475. package/dist/plugins/local-data-root-admission.js +100 -0
  476. package/dist/plugins/local-docker-capacity.d.ts +93 -0
  477. package/dist/plugins/local-docker-capacity.js +194 -0
  478. package/dist/plugins/local-docker-reaper.d.ts +92 -0
  479. package/dist/plugins/local-docker-reaper.js +102 -0
  480. package/dist/plugins/local-engine-high-water.d.ts +29 -6
  481. package/dist/plugins/local-engine-high-water.js +27 -19
  482. package/dist/plugins/local-session-store.d.ts +458 -140
  483. package/dist/plugins/local-session-store.js +906 -292
  484. package/dist/plugins/local-session-window.d.ts +3 -2
  485. package/dist/plugins/local-session-window.js +3 -2
  486. package/dist/plugins/local-sidecar-quarantine.js +3 -2
  487. package/dist/plugins/local-task-attachment-store.d.ts +18 -1
  488. package/dist/plugins/local-task-attachment-store.js +22 -1
  489. package/dist/plugins/memory-embedder.js +9 -7
  490. package/dist/plugins/memory-engine-pg.d.ts +3 -2
  491. package/dist/plugins/memory-engine-pg.js +14 -5
  492. package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
  493. package/dist/plugins/memory-engine-sql-apply.js +6 -8
  494. package/dist/plugins/memory-engine-tidb.d.ts +4 -2
  495. package/dist/plugins/memory-engine-tidb.js +11 -2
  496. package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
  497. package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
  498. package/dist/plugins/memory-run-store.d.ts +53 -36
  499. package/dist/plugins/memory-run-store.js +116 -88
  500. package/dist/plugins/one-time-migration-marker.d.ts +26 -0
  501. package/dist/plugins/one-time-migration-marker.js +13 -0
  502. package/dist/plugins/one-time-migrations.d.ts +214 -47
  503. package/dist/plugins/one-time-migrations.js +481 -135
  504. package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
  505. package/dist/plugins/org-delivery-quota-store.js +31 -15
  506. package/dist/plugins/permission-rule-store-file.d.ts +3 -3
  507. package/dist/plugins/permission-rule-store-sql.d.ts +5 -64
  508. package/dist/plugins/permission-rule-store-sql.js +11 -95
  509. package/dist/plugins/pg-pool.d.ts +2 -32
  510. package/dist/plugins/pg-pool.js +24 -17
  511. package/dist/plugins/remote-env-device.d.ts +3 -2
  512. package/dist/plugins/remote-env-e2b.d.ts +8 -32
  513. package/dist/plugins/remote-env-e2b.js +44 -32
  514. package/dist/plugins/remote-env-host.d.ts +51 -17
  515. package/dist/plugins/remote-env-host.js +111 -42
  516. package/dist/plugins/remote-env-k8s.d.ts +40 -45
  517. package/dist/plugins/remote-env-k8s.js +111 -60
  518. package/dist/plugins/remote-env-local-docker.d.ts +152 -15
  519. package/dist/plugins/remote-env-local-docker.js +352 -72
  520. package/dist/plugins/remote-scratchpad.js +4 -0
  521. package/dist/plugins/retention-deployment.d.ts +49 -17
  522. package/dist/plugins/retention-deployment.js +39 -8
  523. package/dist/plugins/run-preview-m45.d.ts +11 -0
  524. package/dist/plugins/run-preview-m45.js +19 -0
  525. package/dist/plugins/run-store-sql.d.ts +82 -75
  526. package/dist/plugins/run-store-sql.js +164 -125
  527. package/dist/plugins/s3-answer.d.ts +2 -1
  528. package/dist/plugins/sandbox-reaper.d.ts +26 -0
  529. package/dist/plugins/sandbox-reaper.js +2 -0
  530. package/dist/plugins/scenario-prefix-switch-m42.d.ts +56 -0
  531. package/dist/plugins/scenario-prefix-switch-m42.js +56 -0
  532. package/dist/plugins/scheduler-support.d.ts +16 -1
  533. package/dist/plugins/scheduler-support.js +22 -2
  534. package/dist/plugins/schema-consistency.d.ts +131 -14
  535. package/dist/plugins/schema-consistency.js +388 -18
  536. package/dist/plugins/schema-drift-sentence.d.ts +10 -6
  537. package/dist/plugins/schema-drift-sentence.js +15 -7
  538. package/dist/plugins/schema-ensure-legs.d.ts +9 -0
  539. package/dist/plugins/schema-ensure-legs.js +1 -1
  540. package/dist/plugins/schema-indexes.js +3 -0
  541. package/dist/plugins/schema-live-columns.d.ts +14 -5
  542. package/dist/plugins/schema-live-columns.js +10 -10
  543. package/dist/plugins/send-user-file.js +2 -1
  544. package/dist/plugins/session-birth.d.ts +37 -0
  545. package/dist/plugins/session-birth.js +38 -0
  546. package/dist/plugins/session-epoch-anchor.d.ts +40 -12
  547. package/dist/plugins/session-epoch-anchor.js +33 -11
  548. package/dist/plugins/session-ext-table.d.ts +27 -3
  549. package/dist/plugins/session-ext-table.js +19 -6
  550. package/dist/plugins/session-fork.d.ts +15 -1
  551. package/dist/plugins/session-fork.js +3 -0
  552. package/dist/plugins/session-ownership.d.ts +1 -1
  553. package/dist/plugins/session-placement.d.ts +27 -20
  554. package/dist/plugins/session-placement.js +15 -12
  555. package/dist/plugins/session-row-sql.d.ts +12 -0
  556. package/dist/plugins/session-row-sql.js +3 -3
  557. package/dist/plugins/session-run-rollup.d.ts +29 -0
  558. package/dist/plugins/session-run-rollup.js +40 -0
  559. package/dist/plugins/session-store-sql.d.ts +38 -12
  560. package/dist/plugins/session-store-sql.js +130 -30
  561. package/dist/plugins/session-withdraw-sql.d.ts +36 -0
  562. package/dist/plugins/session-withdraw-sql.js +42 -0
  563. package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
  564. package/dist/plugins/shared-memory-store-sql.js +2 -1
  565. package/dist/plugins/shell-sentinel-owner-m48.d.ts +42 -0
  566. package/dist/plugins/shell-sentinel-owner-m48.js +9 -0
  567. package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
  568. package/dist/plugins/sql-driver.d.ts +1 -1
  569. package/dist/plugins/sql-driver.js +2 -1
  570. package/dist/plugins/sql-errors.d.ts +32 -5
  571. package/dist/plugins/sql-errors.js +55 -7
  572. package/dist/plugins/sql-json-column.d.ts +8 -7
  573. package/dist/plugins/sql-json-column.js +10 -6
  574. package/dist/plugins/stop-then-start-sentence.d.ts +16 -0
  575. package/dist/plugins/stop-then-start-sentence.js +7 -0
  576. package/dist/plugins/store-backend.d.ts +99 -16
  577. package/dist/plugins/store-backend.js +230 -65
  578. package/dist/plugins/store-contracts.d.ts +123 -33
  579. package/dist/plugins/store-contracts.js +38 -1
  580. package/dist/plugins/store-fault.d.ts +28 -2
  581. package/dist/plugins/store-fault.js +20 -2
  582. package/dist/plugins/task-attachment-store.d.ts +15 -3
  583. package/dist/plugins/task-attachment-store.js +22 -9
  584. package/dist/plugins/tidb-pool.d.ts +11 -6
  585. package/dist/plugins/tidb-pool.js +39 -18
  586. package/dist/plugins/web-search.js +5 -3
  587. package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
  588. package/dist/plugins/workflow-run-store-sql.js +11 -5
  589. package/dist/plugins/workspace-custody.d.ts +44 -0
  590. package/dist/plugins/workspace-custody.js +47 -0
  591. package/dist/principal-jwt.d.ts +4 -4
  592. package/dist/principal-jwt.js +20 -5
  593. package/dist/principal-shape.d.ts +41 -0
  594. package/dist/principal-shape.js +19 -0
  595. package/dist/project-identity.d.ts +8 -7
  596. package/dist/project-identity.js +40 -17
  597. package/dist/project-layer-key.d.ts +13 -2
  598. package/dist/project-layer-key.js +9 -1
  599. package/dist/question.d.ts +13 -23
  600. package/dist/question.js +21 -39
  601. package/dist/read-deny-floor-notice.d.ts +36 -0
  602. package/dist/read-deny-floor-notice.js +40 -0
  603. package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
  604. package/dist/request-declaration-disposition.js +39 -0
  605. package/dist/request-declaration-refusal.d.ts +35 -12
  606. package/dist/request-declaration-refusal.js +21 -9
  607. package/dist/request-form.d.ts +58 -0
  608. package/dist/request-form.js +72 -0
  609. package/dist/request-image-urls.d.ts +8 -2
  610. package/dist/request-image-urls.js +2 -1
  611. package/dist/request-images.d.ts +20 -0
  612. package/dist/request-images.js +59 -0
  613. package/dist/request-key-closure.d.ts +6 -7
  614. package/dist/request-key-closure.js +15 -2
  615. package/dist/resource-suspend.d.ts +7 -16
  616. package/dist/resource-suspend.js +1 -1
  617. package/dist/retired-name-host-notice.d.ts +21 -0
  618. package/dist/retired-name-host-notice.js +12 -0
  619. package/dist/rule-entry-list.d.ts +2 -2
  620. package/dist/rule-entry-list.js +3 -4
  621. package/dist/rule-issue-reading.d.ts +58 -0
  622. package/dist/rule-issue-reading.js +14 -0
  623. package/dist/rules-consent.d.ts +5 -3
  624. package/dist/rules-consent.js +1 -0
  625. package/dist/run-acceptance.d.ts +3 -1
  626. package/dist/run-acceptance.js +3 -0
  627. package/dist/run-cancel-card.d.ts +28 -0
  628. package/dist/run-cancel-card.js +19 -0
  629. package/dist/run-cancel-context.d.ts +10 -0
  630. package/dist/run-cancel-context.js +1 -0
  631. package/dist/run-local.d.ts +14 -6
  632. package/dist/run-local.js +117 -90
  633. package/dist/run-stale-default.d.ts +7 -0
  634. package/dist/run-stale-default.js +2 -0
  635. package/dist/runs.d.ts +56 -21
  636. package/dist/runs.js +73 -43
  637. package/dist/runtime-caps-resolver.d.ts +21 -6
  638. package/dist/runtime-caps-resolver.js +17 -4
  639. package/dist/runtime-governance.d.ts +2 -2
  640. package/dist/runtime-governance.js +5 -3
  641. package/dist/sealed-key-layout.d.ts +12 -5
  642. package/dist/sealed-key-layout.js +5 -0
  643. package/dist/sealed-key.d.ts +12 -2
  644. package/dist/sealed-key.js +115 -27
  645. package/dist/security.d.ts +128 -158
  646. package/dist/security.js +163 -59
  647. package/dist/sema-config-dir.d.ts +20 -0
  648. package/dist/sema-config-dir.js +25 -0
  649. package/dist/server-secret-env.d.ts +55 -25
  650. package/dist/server-secret-env.js +75 -22
  651. package/dist/session-agent.d.ts +3 -2
  652. package/dist/session-children-retire.d.ts +13 -8
  653. package/dist/session-children-retire.js +9 -7
  654. package/dist/session-deletion.d.ts +88 -0
  655. package/dist/session-deletion.js +8 -0
  656. package/dist/session-erase.d.ts +145 -0
  657. package/dist/session-erase.js +115 -0
  658. package/dist/session-error-wire.d.ts +5 -5
  659. package/dist/session-error-wire.js +1 -1
  660. package/dist/session-incarnation.d.ts +52 -5
  661. package/dist/session-incarnation.js +19 -2
  662. package/dist/session-policy-wire.d.ts +6 -3
  663. package/dist/session-policy-wire.js +11 -1
  664. package/dist/session-resident-background.d.ts +0 -71
  665. package/dist/session-resident-background.js +4 -3
  666. package/dist/session-row.d.ts +2 -1
  667. package/dist/session-rules-seat.d.ts +12 -0
  668. package/dist/session-rules-seat.js +19 -0
  669. package/dist/session-titler.d.ts +7 -15
  670. package/dist/session-titler.js +1 -1
  671. package/dist/session-workspace.d.ts +3 -3
  672. package/dist/spec-fields.d.ts +57 -3
  673. package/dist/spec-fields.js +72 -51
  674. package/dist/store-admission.d.ts +33 -0
  675. package/dist/store-admission.js +49 -0
  676. package/dist/store-posture.d.ts +141 -20
  677. package/dist/store-posture.js +205 -3
  678. package/dist/stored-request-hooks-m20.js +2 -2
  679. package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
  680. package/dist/stores-sql/background-agent-store-sql.js +73 -20
  681. package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
  682. package/dist/stores-sql/checkpoint-store-sql.js +78 -49
  683. package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
  684. package/dist/stores-sql/file-history-store-sql.js +3 -5
  685. package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
  686. package/dist/stores-sql/mailbox-store-sql.js +31 -32
  687. package/dist/stores-sql/pg-session-storage.d.ts +7 -5
  688. package/dist/stores-sql/pg-session-storage.js +54 -46
  689. package/dist/stores-sql/retention-store-sql.d.ts +87 -19
  690. package/dist/stores-sql/retention-store-sql.js +92 -27
  691. package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
  692. package/dist/stores-sql/session-policy-store-sql.js +44 -36
  693. package/dist/stores-sql/session-write-hooks.d.ts +12 -6
  694. package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
  695. package/dist/stores-sql/tidb-session-storage.js +13 -8
  696. package/dist/stores-sql/tidb-session-store.d.ts +36 -17
  697. package/dist/stores-sql/tidb-session-store.js +69 -39
  698. package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
  699. package/dist/stores-sql/tool-result-store-sql.js +4 -6
  700. package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
  701. package/dist/stores-sql/windowed-session-storage.js +9 -0
  702. package/dist/submission-exit.d.ts +50 -0
  703. package/dist/submission-exit.js +108 -0
  704. package/dist/task-a2a.d.ts +3 -8
  705. package/dist/task-a2a.js +28 -30
  706. package/dist/task-cwd.d.ts +43 -7
  707. package/dist/task-cwd.js +11 -0
  708. package/dist/task-mcp.d.ts +3 -3
  709. package/dist/task-mcp.js +4 -4
  710. package/dist/task-settings.d.ts +14 -10
  711. package/dist/task-settings.js +19 -7
  712. package/dist/terminal.d.ts +27 -43
  713. package/dist/terminal.js +49 -14
  714. package/dist/tool-approval.d.ts +173 -163
  715. package/dist/tool-approval.js +247 -232
  716. package/dist/trace/core-keyset-guard.d.ts +13 -6
  717. package/dist/trace/core-vocab-wire.d.ts +95 -0
  718. package/dist/trace/core-vocab-wire.js +15 -0
  719. package/dist/trace/engine-notice-wire.d.ts +24 -21
  720. package/dist/trace/engine-notice-wire.js +7 -3
  721. package/dist/trace/exit-seat.d.ts +30 -4
  722. package/dist/trace/exit-seat.js +40 -36
  723. package/dist/trace/extension-call-face.d.ts +3 -2
  724. package/dist/trace/extension-call-face.js +3 -1
  725. package/dist/trace/ledger-events.d.ts +4 -7
  726. package/dist/trace/ledger-sink.d.ts +4 -31
  727. package/dist/trace/ledger-sink.js +0 -11
  728. package/dist/trace/model-segment.d.ts +5 -5
  729. package/dist/trace/model-segment.js +5 -5
  730. package/dist/trace/project.d.ts +59 -44
  731. package/dist/trace/project.js +60 -26
  732. package/dist/trace/redact.d.ts +135 -27
  733. package/dist/trace/redact.js +884 -260
  734. package/dist/trace/self-minted-wire.d.ts +567 -20
  735. package/dist/trace/self-minted-wire.js +205 -24
  736. package/dist/trace/wire-projection-faces.d.ts +5 -6
  737. package/dist/trace/wire-projection-faces.js +2 -2
  738. package/dist/upstream-body.d.ts +23 -0
  739. package/dist/upstream-body.js +16 -0
  740. package/dist/url-refusal.d.ts +3 -3
  741. package/dist/url-refusal.js +11 -4
  742. package/dist/user-authored-text.d.ts +1 -1
  743. package/dist/user-input-ledger.d.ts +7 -8
  744. package/dist/user-input-ledger.js +1 -1
  745. package/dist/web-admin-client/apply-effective.d.ts +6 -3
  746. package/dist/web-admin-client/apply-effective.js +33 -23
  747. package/dist/web-admin-client/apply-ledger.d.ts +16 -7
  748. package/dist/web-admin-client/apply-ledger.js +5 -2
  749. package/dist/web-admin-client/center-request.d.ts +2 -2
  750. package/dist/web-admin-client/center-request.js +15 -15
  751. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  752. package/dist/web-admin-client/effective-keys.js +1 -1
  753. package/dist/web-admin-client/entry-metadata.d.ts +8 -0
  754. package/dist/web-admin-client/entry-metadata.js +13 -0
  755. package/dist/web-admin-client/http-client.d.ts +1 -1
  756. package/dist/web-admin-client/http-client.js +23 -4
  757. package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
  758. package/dist/web-admin-client/mcp-revocation.js +2 -1
  759. package/dist/web-admin-client/read-warnings.d.ts +1 -0
  760. package/dist/web-admin-client/read-warnings.js +1 -0
  761. package/dist/web-admin-client/restart-signal.js +8 -4
  762. package/dist/web-admin-client/skills-mcp.d.ts +2 -2
  763. package/dist/web-admin-client/types.d.ts +1 -2
  764. package/dist/workspace-space.d.ts +3 -2
  765. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
  766. package/docs/error-text-lexicon.json +317 -0
  767. package/package.json +8 -3
  768. package/scripts/drain-check-local.mjs +118 -147
  769. package/scripts/drain-check.mysql.sql +22 -2
  770. package/scripts/drain-check.pg.sql +22 -2
  771. package/scripts/embed-minimal.mjs +183 -0
  772. package/wire-changes/server@7.148.0.json +1517 -0
  773. package/wire-changes/server@7.149.0.json +372 -0
  774. package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
  775. package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
  776. package/dist/http/memory-layer-reply.d.ts +0 -30
  777. package/dist/http/memory-layer-reply.js +0 -24
  778. package/dist/lsp/e2b-bridge.d.ts +0 -57
  779. package/dist/lsp/e2b-bridge.js +0 -139
  780. package/dist/lsp/e2b-manager.d.ts +0 -93
  781. package/dist/lsp/e2b-manager.js +0 -178
  782. package/dist/lsp/lsp-frames.d.ts +0 -14
  783. package/dist/lsp/lsp-frames.js +0 -25
  784. package/dist/lsp/manager.d.ts +0 -129
  785. package/dist/lsp/manager.js +0 -127
  786. package/dist/lsp/types.d.ts +0 -12
  787. package/dist/lsp/types.js +0 -2
  788. package/dist/lsp/ws-transport.d.ts +0 -40
  789. package/dist/lsp/ws-transport.js +0 -210
  790. package/dist/plain-string-record.js +0 -70
@@ -3,8 +3,9 @@
3
3
  * (运维队列 / 审批决断 / 续跑腿 / 流内审批收敛器 / 起服普查)共同读的那一层 —— 引擎的 `CheckpointStore` 契约之外、本服务自己定的东西:
4
4
  * · 行形:运维队列行 {@link PendingCheckpoint}、流内审批候选行 {@link CheckpointAskCandidate}、已决回放行 {@link DecidedApprovalRecord};
5
5
  * · 读口的行绑定 {@link PendingRowBinding} 与门型两分({@link LIVE_RUN_GATE_KINDS} / {@link TERMINAL_PARK_GATE_KINDS}),两孪生同序判据 {@link pendingRowPrecedes};
6
- * · 两孪生同调的纯判据与投影:{@link queueRowGateKind}、{@link boundedToolInput}、{@link boundedRuleOffers}、
7
- * {@link approvalDecisionOfWinner}、{@link candidateIdentityOf};常量 {@link TERMINAL_BACKSTOP_MS} / {@link TERMINAL_GRACE_MS} / {@link DECIDED_REPLAY_SCAN_CAP};
6
+ * · 两孪生同调的纯判据与投影:{@link queueRowGateKind}、{@link isUnreadableSummaryForm}、{@link readRiskDescriptorBody}、{@link boundedToolInput}、{@link boundedRuleOffers}、
7
+ * {@link approvalDecisionOfWinner}、{@link candidateIdentityOf};待决行的分诊序 {@link pendingTriageOrder} / {@link queueTriageOrder}(两孪生 + 助手收件箱);
8
+ * 常量 {@link TERMINAL_BACKSTOP_MS} / {@link TERMINAL_GRACE_MS} / {@link DECIDED_REPLAY_SCAN_CAP} / {@link DENY_SWEEP_PAGE_ROWS};SLA 拒扫选行读口的行形与游标 {@link ExpiredApprovalGate} / {@link ExpiredGatePosition};
8
9
  * · ctx 两口的结局词 {@link CtxClaimRewrite} 与一次性迁移的 ctx 行改写店腿的型(随最后一条用它的迁移删,见 {@link CheckpointCtxRowsRewriter});
9
10
  * · 店拒绝契约里「一行字节读不成检查点」那一只 {@link UnreadableCheckpointRowError}(SQL 孪生抛、续跑腿认)。
10
11
  *
@@ -13,7 +14,7 @@
13
14
  * SQL 孪生的文件里;它住这里,SQL 孪生经一条点名的已知欠边借它 —— 这一条边就是阶段三搬家时「服务特有面」的清单(向引擎请托的候选,只列不发)。
14
15
  * 这里零 SQL:SQL 文本、列读法与行投影仍在 SQL 孪生里。
15
16
  */
16
- import { type Checkpoint, type CheckpointGate, type CheckpointRowVerdict, type GateOutcome, type ResolvedOutcome, type RiskDescriptor, type ToolApprovalCard } from "@sema-agent/core";
17
+ import { type Checkpoint, type CheckpointGate, type CheckpointRowVerdict, type CheckpointSummary, type GateOutcome, type ResolvedOutcome, type RiskDescriptor, type ToolApprovalCard } from "@sema-agent/core";
17
18
  import { type ParkRowFacts, type RuleOfferProjection, type SkillCardFacts } from "../approval-card.js";
18
19
  import { StoreCorruptError } from "./sql-json-column.js";
19
20
  import type { SealedCheckpointCtx } from "../http/checkpoint-ctx.js";
@@ -58,6 +59,25 @@ export declare const TERMINAL_BACKSTOP_MS: number;
58
59
  * it never meaningfully delays the eventual crash-safe GC.
59
60
  */
60
61
  export declare const TERMINAL_GRACE_MS = 3600000;
62
+ /**
63
+ * SLA 拒扫的一页(行数):每拍至多续跑尝试这么多张过期审批(每张是一次续跑 —— 拒扫的限流界)。唯一属主:两孪生选行读口的缺省页长与拒扫判「这一页满了没有」读同一个数。
64
+ */
65
+ export declare const DENY_SWEEP_PAGE_ROWS = 100;
66
+ /**
67
+ * 一张过期审批在 SLA 拒扫选行序上的位置 —— 两孪生同序:截止升序,同截止按 token 升序(SQL 孪生按列的排序规则比 token,LOCAL 孪生按 UTF-16 码元比;
68
+ * 各孪生的游标只回到它自己,所以只要各自的序与各自的「之后」谓词同一把尺子)。LOCAL 孪生的截止读不成有限数时取 `-Infinity`(引擎读作已过 ⇒ 排最前)。
69
+ * **进程内的游标**:拒扫腿拿它从上一拍读到的最后一行之后接着读,不上 wire、不落盘。
70
+ */
71
+ export interface ExpiredGatePosition {
72
+ readonly deadline: number;
73
+ readonly token: string;
74
+ }
75
+ /** SLA 拒扫选行读口(`listExpiredApprovalGates`)的一行:会话、scope、它在选行序上的位置({@link ExpiredGatePosition})。 */
76
+ export interface ExpiredApprovalGate {
77
+ readonly sessionId: string;
78
+ readonly scope: string;
79
+ readonly position: ExpiredGatePosition;
80
+ }
61
81
  /** Non-secret view of a pending checkpoint for the operator approval queue — deliberately NO token.
62
82
  *
63
83
  * 🔴 [ref]:行**顶层**另带 {@link ParkRowFacts}(`requiresRealApproval` / `ruleOffersAbsence`,真才带、缺席 ≠ false)——
@@ -97,13 +117,24 @@ export interface PendingCheckpoint extends ParkRowFacts, SkillCardFacts {
97
117
  * ([ref], 7.132.0): every park stamps it, the one-time migration M21 filled any row without it from the row's gate,
98
118
  * and a SQL row that still carries none is not listed by `listPending` (counted: `server.approvals.queue-row-gate-kind-missing`; no decide route binds it either). */
99
119
  gateKind: CheckpointGate["kind"];
100
- /** The suspended run's taskId (task_active join) — the key to the run/trace ("view task context"). */
120
+ /**
121
+ * 🔴 [ref] —— **停在这道门上的那条腿以哪个 task 在跑**(唯一写者 {@link parkedLegTaskId};两只孪生各交自己手里的两格读数):
122
+ * 引擎铸这只停驻行时记下的那条腿的登记行(core `CheckpointState.rowTaskId` —— 后台委派子代的 `a…` 句柄,`/decide` 复活它的回执上的同一个 `taskId`;
123
+ * 不是 `/v1/runs/:id` 的键)⇒ 它;否则 = 持着这一行会话认领的那条 run(run 自己的停驻;停驻 / 待审的 run 不放认领;`/v1/runs/:id` 与 trace 的键);
124
+ * 两者都没有(同步 / workflow 委派子代、终局后的纯停驻)⇒ `null`。
125
+ */
101
126
  taskId: string | null;
102
127
  /** The pending tool call's args (post-hook), redacted + bounded — for tool_approval the write payload, for a
103
128
  * durable AskUserQuestion the question itself. Lets the approval card render WITHOUT an N+1 trace.turns
104
129
  * fetch. `null` for pre-migration rows (suspended before the column existed) ⇒ consumer falls back. */
105
130
  input: unknown;
106
- createdAt: number;
131
+ /**
132
+ * 建行时刻(epoch ms)。SQL 孪生恒在场(本服务在存储体之外握着的建行时刻列)。LOCAL 孪生读引擎对这一行投的摘要(core `CheckpointSummary.createdAt`,同一可选性):
133
+ * 摘要读得出有限数才在场,读不出(存储体里不是有限数 —— 那一行判官判坏、`rowVerdict` 非 `ok`)⇒ **缺席**,从不把存储体里的原值搬上 wire。
134
+ * 排序读法见 {@link queueTriageOrder}(缺席计 0 = 档内最老)。
135
+ */
136
+ createdAt?: number;
137
+ /** 截止(epoch ms);没有截止 ⇒ `null`。LOCAL 孪生同读摘要:读不成有限数 ⇒ `null`(摘要不带它;到期两扫按引擎 `checkpointDeadlinePassed` 把它读作已过)。 */
107
138
  deadline: number | null;
108
139
  /** [ref] riskDescriptor inbox: core's INERT triage descriptor ({severity 1-5, axes, toolName, redacted
109
140
  * summary, touchedPaths}) for human/irreversible_ask gates. listPending returns the queue severity-sorted
@@ -187,6 +218,19 @@ export interface PendingCheckpoint extends ParkRowFacts, SkillCardFacts {
187
218
  */
188
219
  rowVerdict?: CheckpointRowVerdict;
189
220
  }
221
+ /**
222
+ * 🔴 [ref] —— 停驻行 {@link PendingCheckpoint.taskId} 的**唯一写者**:停在这道门上的那条腿以哪个 task 在跑。
223
+ *
224
+ * 两格读数,两只孪生各交自己手里的那一份(SQL 孪生:`checkpoint` 列的 `$.state.rowTaskId` 成员 + `task_active` 联结;local 孪生:同一行的
225
+ * `state.rowTaskId` + 文件 run 店的 `getActiveTaskId`):
226
+ * · `recorded` —— 引擎铸这只停驻行时记下的那条腿的登记行(core `CheckpointState.rowTaskId`,每个铸点盖;只在后台车道的腿上在场 ——
227
+ * 顶层 run、同步子代、workflow 子代不盖)。它与行的会话(铸停驻那条腿的会话,[ref])是同一次铸、同一条腿的身份;本服务不另读后台 agent 行、
228
+ * 不按 scope 扫、不经会话元组(行上的 `agent.id`)回填;
229
+ * · `claimHolder` —— 持着这一行会话认领的那条 run(顶层 run 引擎不盖登记行:那条腿就是 run 本身,本服务的 run 账本知道它)。
230
+ * 记录是一只非空串 ⇒ 它(行自己点名停在这道门上的那条腿;认领可能属于同会话上另一条 run)。构造上两者不同时在场:后台子代的会话不进 run 账本、不持认领。
231
+ * 记录读不成非空串(数 / 对象 / 空串 —— 被改过的行)⇒ 与没记同答:方向是少一个路由键,不放宽任何判;那一行续不续得了由它的 `rowVerdict` 另说。
232
+ */
233
+ export declare function parkedLegTaskId(recorded: unknown, claimHolder: string | null): string | null;
190
234
  /**
191
235
  * [ref]([ref] / DEBTS [ref]):session 键读口(`findPendingTokenBySession` / `peekPendingScope`)的**行绑定**。
192
236
  *
@@ -228,6 +272,14 @@ export interface PendingRowBinding {
228
272
  * 赢家卡与被消费卡恒同一张(FIFO 顺带成立)。
229
273
  */
230
274
  pick?: "newest" | "oldest";
275
+ /**
276
+ * 按哪一只会话找(缺省 `"card"`)。一张卡的行上有两个会话事实,两个问题各读一只:
277
+ * · `"card"`(缺省)—— 卡**自己的对话**(`checkpoint.session_id`):决断口 URL 里的会话、SLA 拒扫的复核、按会话唤醒 —— 地址就是卡停在的那段对话;
278
+ * · `"run"` —— 卡**归属的那条 run 的会话**(`checkpoint.host_session_id`,读法 `checkpoint-index-columns.ts` 的 `hostSessionOf`):从 run 一侧找它等着的那张卡
279
+ * (取消、steer 停放、活跃 run 409 的门材料、起服收回、本地收割探针、续跑输入回收、按 task 续跑的两扇门)。cascade 的级上卡两者不同:
280
+ * 卡在级自己现铸的对话里,归调用方的会话;其余每一张卡两者同值。
281
+ */
282
+ axis?: "card" | "run";
231
283
  }
232
284
  /** [ref]:一条**仍持有 claim 的 run** 可能停在的全部门型(= 除 `task_done` 外全部;派生自上表,不手抄)。
233
285
  * 给「按 run 行动」的读口用:cancel / steer 的 park 落点、409 `pendingGate` 材料 —— 这些腿手里有 run 行,
@@ -300,13 +352,32 @@ export declare class UnreadableCheckpointRowError extends StoreCorruptError {
300
352
  }
301
353
  /**
302
354
  * [ref] —— 运维队列行的门型:**两只孪生同一只判官**(SQL 孪生读 `gate_kind` 列 —— put 时从同一只门反范式下来的那一格,每次停驻都盖,一次性迁移 M21 把没有它的
303
- * 存量行从门子树补齐;local 孪生读快照上的门 `cp.gate.kind`)。
355
+ * 存量行从门子树补齐;local 孪生读引擎对这一行投的摘要上的 `gateKind` —— 门不是 core 登记的门型时摘要不带它)。
304
356
  * 读到的值是 NULL / 缺席 / 不是 core 登记的门型 ⇒ `undefined`:这一行**不列**(响亮:计一次 `server.approvals.queue-row-gate-kind-missing`)—— 与每一条决断口同一个读法:
305
357
  * 按门型绑定取行的读口对这种行本来就不命中(`pendingRowQuery` 的 `gate_kind IN (…)`,证不出门型就不当它是这道门),队列不再把一行谁也决不了的行投出去,
306
358
  * 也不按缺键投(消费方按 `gateKind` 路由、缺键即 fail-closed)。不整只拒:一行坏行不许让整个租户的队列(列表 500、SSE 心跳照常而队列永远停在旧帧)消失。
307
359
  * 按构造不可达(写口恒盖、M21 补齐);计数非零 = 写腿或手改出了错,按 `SELECT … WHERE status = 'pending' AND gate_kind IS NULL` 查那一行。
308
360
  */
309
361
  export declare function queueRowGateKind(kind: unknown): CheckpointGate["kind"] | undefined;
362
+ export declare function isUnreadableSummaryForm(summary: CheckpointSummary): boolean;
363
+ /**
364
+ * 运维队列行 `riskDescriptor` 那一格的**形读者**(两孪生同调这一只):SQL 孪生对 `risk_descriptor` 列解出来的体(`decodeJsonColumn`)、LOCAL 孪生对存储体里门上的
365
+ * `gate.riskDescriptor`。判到「是不是一只对象」为止 —— 描述符的键表属主在 core,core 没有导出它的验证器,手写一份就是第二份键集。读不出 ⇒ 这一行的描述符 `null` +
366
+ * 计 `server.approvals.risk-descriptor-cell-unreadable`(两孪生同一个 tag、同一失败方向;放行理由见登记表)。
367
+ */
368
+ export declare const readRiskDescriptorBody: import("./sql-json-column.js").JsonColumnReader<RiskDescriptor>;
369
+ /** 分诊序读的两格(运维队列行 = 描述符里的严重度;收件箱行 = 引擎摘要的严重度)。 */
370
+ export interface TriageKeys {
371
+ readonly severity?: number | undefined;
372
+ readonly createdAt?: number | undefined;
373
+ }
374
+ /**
375
+ * 待决停驻行的**分诊序** —— 一只比较器,运维队列两孪生({@link queueTriageOrder})与助手收件箱同调:严重度降序,同档内 `createdAt` 升序(最老在前);
376
+ * 一格缺席或读不成有限数按 0 计 —— 确定性优于「看它恰好落在哪」,也不让一个非数让整只排序失去全序。与店的返回顺序无关(core 的 `listByScope` 零顺序声明)。
377
+ */
378
+ export declare function pendingTriageOrder(a: TriageKeys, b: TriageKeys): number;
379
+ /** 运维队列行的分诊序 = {@link pendingTriageOrder} 读行上描述符的严重度(两孪生的 `listPending` 同调)。 */
380
+ export declare function queueTriageOrder(a: PendingCheckpoint, b: PendingCheckpoint): number;
310
381
  /** Redact + size-bound a pending tool call's args for persistence/serving. JSON-roundtrips so the stored shape
311
382
  * matches what the operator queue serves; oversized payloads collapse to a marker rather than bloating the row.
312
383
  * Exported for the LOCAL twin (local-checkpoint-store.ts) so the operator-queue projection can't drift. */
@@ -325,10 +396,10 @@ export interface CheckpointAskCandidate {
325
396
  * 🔴 和解三元组的第一维([ref] 件1,黑板 [ref]③①)—— checkpoint 自己带的 `sourceSessionId`(core 在
326
397
  * suspendAsk 铸行时恒填该腿的 `sessionId`)。**没有对应的列**,只能从 blob 窄读;读不出/缺席 = null。
327
398
  *
328
- * 为什么必须进候选集:读口按 `(scope, session_id, tool_call_id)` 查,而委派子代那条腿的 ask 落行时
329
- * `session_id` 记的是**投递上下文**(根会话),park 却发生在**子代自己**的 sessionId 上 —— 只靠
330
- * (toolCallId, hash) 两维,一条根腿的 park 会被一只子代的 ask 认领(摘要相同的两次同 args 调用完全
331
- * 正常)。三元组全同才算同一件事。
399
+ * 为什么必须进候选集:收敛器按 `(scope, session_id = 问的 sourceSessionId, tool_call_id)` 查,`session_id` 列是这只停车行
400
+ * 自己落在哪个会话(core 铸行时同一只变量也写进 blob 的 `sourceSessionId`)—— 列与 blob 两份陈述,身份等式比的是 blob 那一份:
401
+ * 列被外部改写 / 两份分家时,只靠 (toolCallId, hash) 两维会让别的会话的 park 被认领(摘要相同的两次同 args 调用完全正常)。
402
+ * 三元组全同才算同一件事。
332
403
  */
333
404
  sourceSessionId: string | null;
334
405
  /** 该 park 绑定的 tool call(= `pendingAction.toolCallId`)。`unparseable` 行为 null。 */
@@ -423,4 +494,6 @@ export declare function candidateIdentityOf(cp: Checkpoint): CandidateIdentity;
423
494
  * `context_absent` 持有、但会话没有 ctx 行 ⇒ 零写(不建行)。 */
424
495
  export declare const CTX_CLAIM_REWRITES: readonly ["written", "claim_released", "context_absent"];
425
496
  export type CtxClaimRewrite = (typeof CTX_CLAIM_REWRITES)[number];
497
+ /** 认领栅栏下**建或换**一行 ctx 的结局([ref];`putCtx` 的结局 —— 交认领的提交腿与续跑腿的写;不交认领恒 `written`):同一张词表去掉 `context_absent`(这一口没有行就建)。 */
498
+ export type CtxClaimPut = Exclude<CtxClaimRewrite, "context_absent">;
426
499
  //# sourceMappingURL=checkpoint-store-face.d.ts.map
@@ -1,11 +1,15 @@
1
1
  import { isGateKind, judgeCheckpointRow, MAX_RULE_TEXT_CHARS, } from "@sema-agent/core";
2
2
  import { redactDeep, redactSecrets } from "../trace/redact.js";
3
3
  import { MAX_RULE_OFFERS, MAX_RULE_OFFER_BATCH_MEMBERS, readRuleOfferList } from "../approval-card.js";
4
- import { StoreCorruptError } from "./sql-json-column.js";
4
+ import { createObjectColumnReader, StoreCorruptError } from "./sql-json-column.js";
5
5
  import { recordFailOpen } from "../observability/fail-open.js";
6
6
  const MAX_TOOL_INPUT_CHARS = 8192;
7
7
  export const TERMINAL_BACKSTOP_MS = Math.max(60_000, (Number.isFinite(Number(process.env.APPROVAL_TERMINAL_BACKSTOP_MS)) ? Number(process.env.APPROVAL_TERMINAL_BACKSTOP_MS) : 0) || 30 * 86_400_000);
8
8
  export const TERMINAL_GRACE_MS = 3_600_000;
9
+ export const DENY_SWEEP_PAGE_ROWS = 100;
10
+ export function parkedLegTaskId(recorded, claimHolder) {
11
+ return typeof recorded === "string" && recorded.length > 0 ? recorded : claimHolder;
12
+ }
9
13
  const GATE_KIND_IS_LIVE_RUN_PARK = {
10
14
  human: true,
11
15
  irreversible_ask: true,
@@ -81,6 +85,19 @@ export function queueRowGateKind(kind) {
81
85
  recordFailOpen("server.approvals.queue-row-gate-kind-missing", `gate_kind=${kind === null || kind === undefined ? "NULL" : redactSecrets(String(kind)).slice(0, 40)}`);
82
86
  return undefined;
83
87
  }
88
+ const UNREADABLE_SUMMARY_MEMBERS = new Set(["token", "rowVerdict", "sessionId", "scope", "gateKind", "createdAt", "deadline"]);
89
+ export function isUnreadableSummaryForm(summary) {
90
+ const names = UNREADABLE_SUMMARY_MEMBERS;
91
+ return summary.rowVerdict.kind !== "ok" && Object.keys(summary).every((member) => names.has(member));
92
+ }
93
+ export const readRiskDescriptorBody = createObjectColumnReader();
94
+ const triageKey = (v) => (v !== undefined && Number.isFinite(v) ? v : 0);
95
+ export function pendingTriageOrder(a, b) {
96
+ return triageKey(b.severity) - triageKey(a.severity) || triageKey(a.createdAt) - triageKey(b.createdAt);
97
+ }
98
+ export function queueTriageOrder(a, b) {
99
+ return pendingTriageOrder({ severity: a.riskDescriptor?.severity, createdAt: a.createdAt }, { severity: b.riskDescriptor?.severity, createdAt: b.createdAt });
100
+ }
84
101
  export function boundedToolInput(args) {
85
102
  if (args === undefined)
86
103
  return null;
@@ -80,6 +80,7 @@ export async function ensureTiDBDeviceSchema(pool) {
80
80
  }
81
81
  export const DEVICE_INDEXES = [
82
82
  { table: `${DEVICES_TABLE}`, name: "idx_device_owner", columns: ["owner_tenant", "owner_subject"] },
83
+ { table: `${DEVICES_TABLE}`, name: UQ_DEVICES_PUBKEY, columns: ["owner_tenant", "pubkey"], unique: true },
83
84
  { table: `${DEVICE_AUDIT_TABLE}`, name: "idx_device_audit_device", columns: ["device_id", "at"] },
84
85
  { table: `${DEVICE_AUDIT_TABLE}`, name: "idx_device_audit_event", columns: ["event", "at"] },
85
86
  ];
@@ -1,4 +1,5 @@
1
1
  import type { SqlDialect } from "./sql-driver.js";
2
+ import { StoreBootRefusalError } from "./store-contracts.js";
2
3
  /**
3
4
  * 一条索引的**声明**(纯数据)。两方言共用同一份声明 —— 这就是"一处属主"的兑现物:
4
5
  * per-store 文件各导出自己那份 `readonly IndexSpec[]`,PG 侧由该 store 的 `ensurePg*Schema` 应用,
@@ -11,7 +12,7 @@ export interface IndexSpec {
11
12
  readonly name: string;
12
13
  /** 列序(等值前缀在前、排序列在后;与 MySQL 内联 `KEY` 的列序**必须**逐字一致)。 */
13
14
  readonly columns: readonly string[];
14
- /** UNIQUE 索引(MySQL 内联 `UNIQUE KEY` 的孪生)。缺省 = 普通索引。 */
15
+ /** UNIQUE 索引(MySQL 内联 `UNIQUE KEY` / PG 表约束 `CONSTRAINT … UNIQUE` 的孪生)。缺省 = 普通索引。唯一索引多一道判形(头注「唯一索引」),列集按**集合**比。 */
15
16
  readonly unique?: boolean;
16
17
  }
17
18
  /**
@@ -28,6 +29,17 @@ export interface IndexSpec {
28
29
  * 不带参 ⇒ 这一整类接缝脆弱性结构上不存在。两方言同律,不留一边带参一边不带的不对称。
29
30
  */
30
31
  export type IndexQueryFn = (sql: string, params?: unknown[]) => Promise<unknown>;
32
+ /**
33
+ * 唯一索引的确定拒启(头注「唯一索引」)。`kind`:`shape` = 同名在场而形不对;`duplicates` = 存量重复行让建索引失败。
34
+ * 继承 {@link StoreBootRefusalError}:SQL 开库的等待窗不重试它、「库打不开」的拒句不改写它。
35
+ */
36
+ export declare class UniqueIndexRefusalError extends StoreBootRefusalError {
37
+ readonly kind: "shape" | "duplicates";
38
+ readonly spec: IndexSpec;
39
+ constructor(kind: "shape" | "duplicates", spec: IndexSpec, message: string, options?: {
40
+ readonly cause: unknown;
41
+ });
42
+ }
31
43
  /**
32
44
  * 幂等地保证一条索引在场。**这是本仓唯一允许发加索引 DDL 的地方**(SCHEMA POLICY 窄放的全部内容)。
33
45
  *
@@ -1,5 +1,7 @@
1
1
  import { recordFailOpen } from "../observability/fail-open.js";
2
2
  import { readLiveColumns } from "./schema-live-columns.js";
3
+ import { isDupKeyErrorOfWrappedQuery } from "./sql-errors.js";
4
+ import { StoreBootRefusalError } from "./store-contracts.js";
3
5
  function rowsOf(res) {
4
6
  if (Array.isArray(res)) {
5
7
  const first = res[0];
@@ -19,11 +21,120 @@ function lacksConcurrentlySupport(err) {
19
21
  return true;
20
22
  return typeof code !== "string";
21
23
  }
22
- async function pgIndexValid(q, name) {
23
- const rows = rowsOf(await q(`SELECT i.indisvalid FROM pg_index i WHERE i.indexrelid = to_regclass(${quoteLiteral(name)})`));
24
+ const EXPRESSION_PART = "<expression>";
25
+ async function pgIndexLive(q, spec) {
26
+ const rows = rowsOf(await q("SELECT i.indisvalid AS indisvalid, i.indisunique AS indisunique, " +
27
+ "(i.indpred IS NULL AND i.indexprs IS NULL) AS whole, " +
28
+ "(SELECT c.relname::text FROM pg_class c WHERE c.oid = i.indrelid) AS tbl, " +
29
+ "(SELECT n.nspname::text FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.oid = i.indrelid) AS nsp, " +
30
+ "COALESCE((SELECT string_agg(a.attname::text, ',' ORDER BY a.attname::text) FROM generate_series(0, i.indnkeyatts - 1) AS k(n) " +
31
+ "JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = i.indkey[k.n]), '') AS cols, " +
32
+ "EXISTS (SELECT 1 FROM pg_constraint k WHERE k.conindid = i.indexrelid AND k.contype = 'u') AS backs_constraint " +
33
+ "FROM pg_index i WHERE i.indexrelid = to_regclass(quote_ident((SELECT n.nspname FROM pg_class t JOIN pg_namespace n ON n.oid = t.relnamespace " +
34
+ `WHERE t.oid = to_regclass(${quoteLiteral(quoteId("pg", spec.table))}))) || '.' || quote_ident(${quoteLiteral(spec.name)}))`));
24
35
  if (rows.length === 0)
25
36
  return undefined;
26
- return rows[0].indisvalid !== false;
37
+ const row = rows[0];
38
+ const schema = typeof row.nsp === "string" ? row.nsp : undefined;
39
+ const shape = typeof row.cols === "string" && typeof row.tbl === "string" && typeof row.indisunique === "boolean"
40
+ ? {
41
+ table: row.tbl,
42
+ schema,
43
+ unique: row.indisunique,
44
+ columns: row.cols === "" ? [] : row.cols.split(","),
45
+ whole: row.whole !== false,
46
+ constraint: row.backs_constraint === true,
47
+ }
48
+ : undefined;
49
+ return { valid: row.indisvalid !== false, schema, shape };
50
+ }
51
+ async function mysqlIndexRows(q, spec) {
52
+ const rows = rowsOf(await q(`SHOW INDEX FROM ${quoteId("mysql", spec.table)} WHERE Key_name = ${quoteLiteral(spec.name)}`));
53
+ return rows.map((r) => Object.fromEntries(Object.entries(r).map(([k, v]) => [k.toLowerCase(), v])));
54
+ }
55
+ function mysqlShapeOf(spec, rows) {
56
+ if (!rows.every((r) => "column_name" in r && "non_unique" in r))
57
+ return undefined;
58
+ const keyParts = [...rows].sort((a, b) => Number(a.seq_in_index) - Number(b.seq_in_index));
59
+ return {
60
+ table: spec.table,
61
+ schema: undefined,
62
+ unique: keyParts.every((r) => Number(r.non_unique) === 0),
63
+ columns: keyParts.map((r) => (isExpressionPart(r) ? EXPRESSION_PART : r.column_name)),
64
+ whole: keyParts.every((r) => r.sub_part === null || r.sub_part === undefined),
65
+ constraint: false,
66
+ };
67
+ }
68
+ const isExpressionPart = (r) => (typeof r.expression === "string" && r.expression !== "") || typeof r.column_name !== "string";
69
+ const columnSet = (dialect, cols) => [...new Set(dialect === "mysql" ? cols.map((c) => c.toLowerCase()) : cols)].sort();
70
+ function shapeProblem(dialect, spec, live) {
71
+ const problems = [];
72
+ if (live.table !== spec.table)
73
+ problems.push(`it is on table ${live.table}`);
74
+ if (!live.unique)
75
+ problems.push("it is not UNIQUE");
76
+ if (columnSet(dialect, live.columns).join(",") !== columnSet(dialect, spec.columns).join(",")) {
77
+ problems.push(`it covers (${live.columns.length === 0 ? "no plain key column" : live.columns.join(", ")})`);
78
+ }
79
+ if (!live.whole)
80
+ problems.push(dialect === "pg" ? "it is a partial or expression index" : "it is a prefix or expression index");
81
+ return problems.length === 0 ? undefined : problems.join("; ");
82
+ }
83
+ export class UniqueIndexRefusalError extends StoreBootRefusalError {
84
+ kind;
85
+ spec;
86
+ constructor(kind, spec, message, options) {
87
+ super(message, options);
88
+ this.kind = kind;
89
+ this.spec = spec;
90
+ this.name = "UniqueIndexRefusalError";
91
+ }
92
+ }
93
+ const declaredShape = (spec) => `UNIQUE (${spec.columns.join(", ")})`;
94
+ function shapeRefusal(dialect, spec, live, problem) {
95
+ const name = quoteId(dialect, spec.name);
96
+ const where = live.schema === undefined ? "" : `${quoteId("pg", live.schema)}.`;
97
+ const drop = dialect === "mysql"
98
+ ? `ALTER TABLE ${quoteId("mysql", spec.table)} DROP INDEX ${name};`
99
+ : live.constraint
100
+ ? `ALTER TABLE ${where}${quoteId("pg", live.table)} DROP CONSTRAINT ${name};`
101
+ : `DROP INDEX CONCURRENTLY IF EXISTS ${where}${name};`;
102
+ return new UniqueIndexRefusalError("shape", spec, `ensureIndex: unique index ${spec.name} on table ${spec.table} is not the shape this build declares (${declaredShape(spec)}): ${problem} — refusing to start. ` +
103
+ "The name is taken, so the index is not rebuilt, and this build relies on it to reject duplicate rows. " +
104
+ `Way out: stop writers to ${spec.table}, run ${drop} and start again — the next start builds the index with the declared shape ` +
105
+ "(if rows already break it, that start refuses and names the duplicates). Until it is rebuilt nothing enforces the uniqueness.");
106
+ }
107
+ function duplicatesRefusal(dialect, spec, cause) {
108
+ const cols = columnList(dialect, spec);
109
+ const notNull = spec.columns.map((c) => `${quoteId(dialect, c)} IS NOT NULL`).join(" AND ");
110
+ const leftover = dialect === "pg" ? " The failed build leaves an INVALID index of that name; the next start drops and rebuilds it by itself." : "";
111
+ return new UniqueIndexRefusalError("duplicates", spec, `ensureIndex: unique index ${spec.name} on table ${spec.table} cannot be built — ${spec.table} already holds rows that share (${spec.columns.join(", ")}) — refusing to start, ` +
112
+ "because this build relies on this index to reject duplicate rows. " +
113
+ `Way out: find them with SELECT ${cols}, COUNT(*) FROM ${quoteId(dialect, spec.table)} WHERE ${notNull} GROUP BY ${cols} HAVING COUNT(*) > 1 ` +
114
+ "(rows with a NULL in any of these columns never conflict, so they are left out), remove or merge the extra rows — this build cannot choose which row survives — and start again; " +
115
+ `the next start builds the index.${leftover}`, { cause });
116
+ }
117
+ function isDuplicateKeyFailure(dialect, err) {
118
+ if (!isDupKeyErrorOfWrappedQuery(dialect, err))
119
+ return false;
120
+ switch (dialect) {
121
+ case "pg":
122
+ return Reflect.get(err, "constraint") !== "pg_class_relname_nsp_index";
123
+ case "mysql":
124
+ return true;
125
+ default: {
126
+ const _never = dialect;
127
+ throw new Error(`ensureIndex: 未知方言 ${String(_never)}`);
128
+ }
129
+ }
130
+ }
131
+ const failureOfBuild = (dialect, spec, err) => spec.unique === true && isDuplicateKeyFailure(dialect, err) ? duplicatesRefusal(dialect, spec, err) : err;
132
+ function assertUniqueShape(dialect, spec, live) {
133
+ if (live === undefined)
134
+ return;
135
+ const problem = shapeProblem(dialect, spec, live);
136
+ if (problem !== undefined)
137
+ throw shapeRefusal(dialect, spec, live, problem);
27
138
  }
28
139
  const refusal = (spec, unique, what) => `ensureIndex: PostgreSQL 索引 ${spec.name}(表 ${spec.table})${what} —— 拒绝带病启动。` +
29
140
  "(一个 INVALID 索引会让此后每一次 CREATE INDEX … IF NOT EXISTS 静默跳过它,而规划器永不使用它。)" +
@@ -35,6 +146,8 @@ export async function ensureIndex(q, dialect, spec) {
35
146
  await applyIndex(q, dialect, spec);
36
147
  }
37
148
  catch (err) {
149
+ if (err instanceof UniqueIndexRefusalError)
150
+ throw err;
38
151
  let live;
39
152
  try {
40
153
  live = await readLiveColumns(async (sql) => rowsOf(await q(sql)), dialect);
@@ -54,40 +167,60 @@ function indexColumnMissing(live, spec) {
54
167
  async function applyIndex(q, dialect, spec) {
55
168
  switch (dialect) {
56
169
  case "mysql": {
57
- const present = rowsOf(await q("SELECT 1 AS present FROM information_schema.statistics WHERE table_schema = DATABASE() " +
58
- `AND table_name = ${quoteLiteral(spec.table)} AND index_name = ${quoteLiteral(spec.name)} LIMIT 1`));
59
- if (present.length > 0)
170
+ const present = await mysqlIndexRows(q, spec);
171
+ if (present.length > 0) {
172
+ if (spec.unique === true)
173
+ assertUniqueShape("mysql", spec, mysqlShapeOf(spec, present));
60
174
  return;
61
- await q(`ALTER TABLE ${quoteId("mysql", spec.table)} ADD ${spec.unique ? "UNIQUE " : ""}INDEX ` +
62
- `${quoteId("mysql", spec.name)} (${columnList("mysql", spec)})`);
175
+ }
176
+ try {
177
+ await q(`ALTER TABLE ${quoteId("mysql", spec.table)} ADD ${spec.unique ? "UNIQUE " : ""}INDEX ` +
178
+ `${quoteId("mysql", spec.name)} (${columnList("mysql", spec)})`);
179
+ }
180
+ catch (err) {
181
+ throw failureOfBuild("mysql", spec, err);
182
+ }
63
183
  return;
64
184
  }
65
185
  case "pg": {
66
186
  const unique = spec.unique ? "UNIQUE " : "";
67
187
  const name = quoteId("pg", spec.name);
68
188
  const tail = `${unique}INDEX CONCURRENTLY IF NOT EXISTS ${name} ON ${quoteId("pg", spec.table)} (${columnList("pg", spec)})`;
189
+ const build = async (sql) => {
190
+ try {
191
+ await q(sql);
192
+ }
193
+ catch (err) {
194
+ throw failureOfBuild("pg", spec, err);
195
+ }
196
+ };
69
197
  try {
70
- await q(`CREATE ${tail}`);
198
+ await build(`CREATE ${tail}`);
71
199
  }
72
200
  catch (err) {
73
- if (!lacksConcurrentlySupport(err))
201
+ if (err instanceof UniqueIndexRefusalError || !lacksConcurrentlySupport(err))
74
202
  throw err;
75
203
  recordFailOpen("server.ensure-index.concurrently-unsupported", `${spec.table}.${spec.name}`);
76
- await q(`CREATE ${unique}INDEX IF NOT EXISTS ${name} ON ${quoteId("pg", spec.table)} (${columnList("pg", spec)})`);
204
+ await build(`CREATE ${unique}INDEX IF NOT EXISTS ${name} ON ${quoteId("pg", spec.table)} (${columnList("pg", spec)})`);
77
205
  return;
78
206
  }
79
- const valid = await pgIndexValid(q, spec.name);
80
- if (valid !== false)
207
+ let live = await pgIndexLive(q, spec);
208
+ if (live === undefined)
81
209
  return;
82
- await q(`DROP INDEX CONCURRENTLY IF EXISTS ${name}`);
83
- try {
84
- await q(`CREATE ${tail}`);
85
- }
86
- catch (err) {
87
- throw new Error(refusal(spec, unique, "重建时失败"), { cause: err });
210
+ if (!live.valid) {
211
+ await q(`DROP INDEX CONCURRENTLY IF EXISTS ${live.schema === undefined ? "" : `${quoteId("pg", live.schema)}.`}${name}`);
212
+ try {
213
+ await build(`CREATE ${tail}`);
214
+ }
215
+ catch (err) {
216
+ throw err instanceof UniqueIndexRefusalError ? err : new Error(refusal(spec, unique, "重建时失败"), { cause: err });
217
+ }
218
+ live = await pgIndexLive(q, spec);
219
+ if (live?.valid === false)
220
+ throw new Error(refusal(spec, unique, "重建后仍是 INVALID"));
88
221
  }
89
- if ((await pgIndexValid(q, spec.name)) === false)
90
- throw new Error(refusal(spec, unique, "重建后仍是 INVALID"));
222
+ if (spec.unique === true)
223
+ assertUniqueShape("pg", spec, live?.shape);
91
224
  return;
92
225
  }
93
226
  default: {
@@ -1,29 +1,47 @@
1
- /**
2
- * 两方言启动锁(`ensureSchema` / `oneTimeMigrations` 的 MySQL `GET_LOCK(?,0)` 与 PG `pg_try_advisory_lock`)的
3
- * **轮询策略唯一属主**(7.83.0 修复验证 车HC HC-1/HC-2 后收口:此前两只孪生各抄一份循环,一份改了「永不放弃」
4
- * 另一份还是「40 次放弃后无锁跑」,而 [ref] 之后无锁跑的那条腿发的是不带 `IF NOT EXISTS` 的 `ADD INDEX`,两副本
5
- * 双发 ⇒ 输的那只拒启)。方言只提供「试一次」的探针,循环、抖动、退避、进展 warn、坏连接上抛全在这里。
6
- *
7
- * 三条律:
8
- * · **按进展轮询,不按次数放弃** —— 持锁方还活着(两方言的锁都是连接级,随连接消失,不会遗留)就一直等,
9
- * 每 {@link LOCK_PROBE_WARN_EVERY} 次 warn 一行说明在等谁;**永不**无锁跑(「响亮地等」严格优于「静默地竞争 DDL」)。
10
- * · **坏连接不是争用**(HC-2,对 7.82.1 的回归):探针自己**连续**抛 {@link MAX_CONSECUTIVE_LOCK_PROBE_ERRORS} 次 =
11
- * 这条连接已不可用(`_queryable=false` / 半开 TCP),与「谁持锁」无关 ⇒ 上抛让启动响亮失败,不许无界轮。
12
- * 偶发一次抛(TiDB 悲观锁抖动)照旧继续轮,计数在一次成功探针后归零。
13
- * · 轮询间隙进程不持任何快照(每次探针是亚毫秒的独立语句)⇒ 与 PG `CREATE INDEX CONCURRENTLY` 的
14
- * `WaitForOlderSnapshots` 永不互等(理由全文见 `pg-pool.ts` `acquirePgEnsureSchemaLock` 头注)。
15
- */
16
1
  export declare const LOCK_PROBE_INITIAL_JITTER_MS = 400;
17
2
  export declare const LOCK_PROBE_WARN_EVERY = 40;
18
3
  export declare const MAX_CONSECUTIVE_LOCK_PROBE_ERRORS = 5;
19
- /** 抖动退避(~0.1s..0.4s + 至多 0.15s 抖动)—— 两方言同一条曲线。 */
4
+ /** 抖动退避(~0.1s..0.4s + 至多 0.15s 抖动)—— 启动锁的曲线。 */
20
5
  export declare function lockProbeBackoffMs(attempt: number): number;
21
6
  /**
22
- * 轮到拿到为止。`tryOnce` = 方言自己的非阻塞探针:`true` 拿到、`false` 别人持着(继续轮)、抛 = 探针本身失败。
23
- * 初始抖动把 ~20 个在 t=0 同时开火的调用方(集成套扇出 / 同步的舰队启动)铺开。
7
+ * 一把库内具名锁的身份。两方言的「名字」不同形(引擎事实,不是口味):MySQL 协议一个字符串(服务器实例**全局**,上限 64 字符),
8
+ * PG 一个 bigint 键或一对 int4 键(**每库**;单键与双键是两个互不相交的键空间)。身份由属主模块各自铸(启动锁:`tidb-pool.ts` / `pg-pool.ts`;弧锁:`adoption-log-sql.ts`),
9
+ * 本模块只负责怎么取、怎么放。
10
+ */
11
+ export type AdvisoryLockId = {
12
+ readonly dialect: "mysql";
13
+ readonly name: string;
14
+ } | {
15
+ readonly dialect: "pg";
16
+ readonly keys: readonly [number] | readonly [number, number];
17
+ };
18
+ /**
19
+ * 取锁要的最小连接面:发一句带参 SQL、读回行。锁是**连接级**的 —— 调用方必须把取、放与锁罩住的全部语句跑在**同一条**连接上。
20
+ * `SqlTxConn`(`{ rows, affected }`)与 node-pg 的 `PoolClient`(`{ rows }`)天然满足;mysql2 的 `[rows, fields]` 由调用方一行适配。
21
+ */
22
+ export interface LockConn {
23
+ query(sql: string, params: unknown[]): Promise<{
24
+ readonly rows: ReadonlyArray<Record<string, unknown>>;
25
+ }>;
26
+ }
27
+ /**
28
+ * 轮到拿到为止(启动锁的预算)。`tryOnce` = 方言自己的非阻塞探针:`true` 拿到、`false` 别人持着(继续轮)、抛 = 探针本身失败。
29
+ * 取锁调用方走 {@link acquireAdvisoryLock};本函数留给只想验循环律、不带连接的单测。
24
30
  */
25
31
  export declare function pollUntilLocked(tryOnce: () => Promise<boolean>, opts: {
26
32
  tag: string;
27
33
  label: string;
28
34
  }): Promise<void>;
35
+ /**
36
+ * 在 `conn` 上取 `id`,**轮到拿到为止**(永不无锁跑;一条探针连续抛的连接上抛成起服失败)。
37
+ * 锁是连接级的:调用方必须把锁罩住的全部语句跑在这条 `conn` 上,并用 {@link releaseAdvisoryLock} 放。
38
+ */
39
+ export declare function acquireAdvisoryLock(conn: LockConn, id: AdvisoryLockId, tag: string): Promise<void>;
40
+ /**
41
+ * 在 `conn` 上取 `id`,**最多探 `attempts` 次、每次没拿到睡 `sleepMs`**(无开跑抖动:常路零额外延迟)。
42
+ * `true` = 拿到(调用方负责放);`false` = 用尽次数仍是「别人持着」(调用方按「在飞」应答)。其余同 {@link acquireAdvisoryLock}。
43
+ */
44
+ export declare function acquireAdvisoryLockWithin(conn: LockConn, id: AdvisoryLockId, tag: string, attempts: number, sleepMs: number): Promise<boolean>;
45
+ /** {@link acquireAdvisoryLock} / {@link acquireAdvisoryLockWithin} 的释放(尽力而为 —— 锁随连接关闭自动释放;失败留一行,不盖掉真正的结果)。 */
46
+ export declare function releaseAdvisoryLock(conn: LockConn, id: AdvisoryLockId, tag: string): Promise<void>;
29
47
  //# sourceMappingURL=ensure-schema-lock-policy.d.ts.map