@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
@@ -4,7 +4,7 @@ import { checkAdoptionPrincipalShape, checkAdoptionWidths } from "../../adoption
4
4
  import { judgeAdoptionImportBinding, readAdoptionImportBody, runAdoptionImport } from "../../adoption/import.js";
5
5
  import { limitRefusal } from "../../limit-refusal.js";
6
6
  import { sendJson, sendError } from "../send.js";
7
- import { gatedPrincipal, explicitOperatorOk, sendOperatorPrincipalsRequired, sendPrincipalRefusal } from "../principal-gate.js";
7
+ import { gatedPerson, explicitOperatorOk, sendOperatorPrincipalsRequired, sendPrincipalRefusal } from "../principal-gate.js";
8
8
  import { assertNever } from "../route-ctx.js";
9
9
  import * as facts from "../../capability-facts.js";
10
10
  function sendOutcome(res, out) {
@@ -19,19 +19,23 @@ function sendOutcome(res, out) {
19
19
  boundTo: out.boundTo,
20
20
  });
21
21
  return;
22
+ case "tables_missing":
23
+ sendError(res, 409, "adoption.table_missing", `this deployment wires stores whose tables are absent from the database (${out.tables.join(", ")}): nothing was migrated — restart a replica so its boot creates the missing tables, then resend the same request`, {
24
+ adoptionId: out.adoptionId,
25
+ tables: out.tables,
26
+ });
27
+ return;
22
28
  case "rejected":
23
29
  switch (out.code) {
24
30
  case "adoption.destination_conflict":
25
- sendError(res, 409, "adoption.destination_conflict", "the destination principal already holds rows sharing a logical key with the source", {
31
+ sendError(res, 409, "adoption.destination_conflict", `the destination principal already holds rows sharing a logical key with the source: ${out.detail}`, {
26
32
  adoptionId: out.adoptionId,
27
- detail: out.detail,
28
33
  conflicts: out.conflicts,
29
34
  });
30
35
  return;
31
36
  case "adoption.destination_unrepresentable":
32
- sendError(res, 409, "adoption.destination_unrepresentable", "the destination principal does not fit every key this adoption would derive from it", {
37
+ sendError(res, 409, "adoption.destination_unrepresentable", `the destination principal does not fit every key this adoption would derive from it: ${out.detail}`, {
33
38
  adoptionId: out.adoptionId,
34
- detail: out.detail,
35
39
  });
36
40
  return;
37
41
  }
@@ -58,7 +62,7 @@ export async function handleAdoption(req, res, match, ctx) {
58
62
  async function operatorLane(req, res, id, params, ctx) {
59
63
  const { deps } = ctx;
60
64
  const { readJson } = ctx.helpers;
61
- const principal = gatedPrincipal(req, deps.config);
65
+ const principal = gatedPerson(req, deps.config);
62
66
  if (deps.config.requirePrincipal && !principal) {
63
67
  sendPrincipalRefusal(res, req, deps.config);
64
68
  return;
@@ -85,7 +89,8 @@ async function operatorLane(req, res, id, params, ctx) {
85
89
  }
86
90
  }
87
91
  const store = fact.backend.adoptionLog();
88
- const runner = createAdoptionRunner({ store, dialect: deps.backend?.kind === "pg" ? "pg" : "mysql", now: Date.now, logger: deps.logger });
92
+ const wiring = { memoryEngine: facts.memoryExport(deps).available, taskAttachment: deps.taskAttachmentStore !== undefined };
93
+ const runner = createAdoptionRunner({ store, dialect: deps.backend?.kind === "pg" ? "pg" : "mysql", now: Date.now, wiring, logger: deps.logger });
89
94
  switch (id) {
90
95
  case "adoption-detail": {
91
96
  const adoptionId = ctx.helpers.safeDecode(params.id);
@@ -111,12 +116,12 @@ async function operatorLane(req, res, id, params, ctx) {
111
116
  const { fromPrincipal, toPrincipal } = parsed.data;
112
117
  const badShape = checkAdoptionPrincipalShape(fromPrincipal, toPrincipal);
113
118
  if (badShape !== undefined) {
114
- sendError(res, 400, "request.field_invalid", "the adoption principals are not in a portable identity shape", { detail: badShape });
119
+ sendError(res, 400, "request.field_invalid", `the adoption principals are not in a portable identity shape: ${badShape}`);
115
120
  return;
116
121
  }
117
122
  const tooWide = checkAdoptionWidths(fromPrincipal, toPrincipal);
118
123
  if (tooWide !== undefined) {
119
- sendError(res, 400, "request.field_invalid", "the adoption principals do not fit every identity column and derived key this adoption must write", { detail: tooWide });
124
+ sendError(res, 400, "request.field_invalid", `the adoption principals do not fit every identity column and derived key this adoption must write: ${tooWide}`);
120
125
  return;
121
126
  }
122
127
  if (fromPrincipal === toPrincipal) {
@@ -124,6 +129,8 @@ async function operatorLane(req, res, id, params, ctx) {
124
129
  return;
125
130
  }
126
131
  const out = await runner.start(fromPrincipal, toPrincipal);
132
+ if (out.kind === "receipt")
133
+ await deps.toolApproval?.followRowOwners();
127
134
  sendOutcome(res, out);
128
135
  return;
129
136
  }
@@ -135,7 +142,7 @@ async function sourceLane(req, res, params, ctx) {
135
142
  const { deps } = ctx;
136
143
  if (ctx.helpers.rateLimited(req, res))
137
144
  return;
138
- const principal = gatedPrincipal(req, deps.config);
145
+ const principal = gatedPerson(req, deps.config);
139
146
  if (principal === undefined) {
140
147
  sendPrincipalRefusal(res, req, deps.config);
141
148
  return;
@@ -1,6 +1,10 @@
1
1
  import { chosenAgentName } from "@sema-agent/core";
2
2
  import { sendJson, sendError } from "../send.js";
3
- import { fleetViewOf, sendUnauthorized } from "../principal-gate.js";
3
+ import { gatedSubject, sendUnauthorized } from "../principal-gate.js";
4
+ import { PRINCIPAL_MAX_BYTES } from "../../principal-shape.js";
5
+ import { partsOf } from "../../owner-brands.js";
6
+ import { taskSpecIdentityOf } from "../../engine-identity.js";
7
+ import { routeListFilter } from "../owner-access.js";
4
8
  import { assertNever } from "../route-ctx.js";
5
9
  import * as facts from "../../capability-facts.js";
6
10
  import { backgroundAgentNameOf } from "../../background-agent-name.js";
@@ -63,7 +67,7 @@ export async function handleAgentRoster(req, res, match, ctx) {
63
67
  const { deps } = ctx;
64
68
  switch (match.decl.id) {
65
69
  case "agents-roster": {
66
- const { fleetWide, gateOwner } = fleetViewOf(req, deps, "read");
70
+ const { fleetWide, gateOwner } = routeListFilter(req, deps, match.decl.id);
67
71
  if (!fleetWide && gateOwner === null) {
68
72
  sendUnauthorized(res, "identity");
69
73
  return;
@@ -84,7 +88,7 @@ export async function handleAgentRoster(req, res, match, ctx) {
84
88
  const beforeRaw = q.get("before");
85
89
  const decoded = beforeRaw === null ? undefined : decodeCursor(beforeRaw);
86
90
  if (decoded !== undefined && !decoded.ok) {
87
- sendError(res, 400, "request.query_invalid", "before must be the opaque `nextBefore` cursor from a previous page of this endpoint", { detail: decoded.why });
91
+ sendError(res, 400, "request.query_invalid", `before must be the opaque \`nextBefore\` cursor from a previous page of this endpoint: ${decoded.why}`);
88
92
  return;
89
93
  }
90
94
  const cursor = decoded?.ok === true ? decoded.cursor : undefined;
@@ -94,19 +98,21 @@ export async function handleAgentRoster(req, res, match, ctx) {
94
98
  return;
95
99
  }
96
100
  const status = statusRaw === null ? undefined : statusRaw;
101
+ const subject = gatedSubject(req, deps.config);
102
+ const ownScope = taskSpecIdentityOf(subject === undefined ? undefined : partsOf(subject)).principal ?? "default";
97
103
  let scope;
98
104
  if (gateOwner !== null) {
99
- scope = gateOwner;
105
+ scope = ownScope;
100
106
  }
101
107
  else {
102
108
  const raw = q.get("scope");
103
109
  if (raw === null) {
104
- scope = "default";
110
+ scope = ownScope;
105
111
  }
106
112
  else {
107
113
  const s = raw.trim();
108
- if (s === "" || s.length > 190) {
109
- sendError(res, 400, "request.query_invalid", "scope must be a non-blank tenant principal of at most 190 characters");
114
+ if (s === "" || Buffer.byteLength(s, "utf8") > PRINCIPAL_MAX_BYTES) {
115
+ sendError(res, 400, "request.query_invalid", `scope must be a non-blank tenant principal of at most ${PRINCIPAL_MAX_BYTES} UTF-8 bytes (the principal length every identity column holds)`);
110
116
  return;
111
117
  }
112
118
  scope = s;
@@ -3,13 +3,16 @@ import { skillCardFacts } from "../../approval-card.js";
3
3
  import { hostDecisionFacts, readDecider, retiredDecisionKeyFacts, DECIDED_BY_NOT_IN_PROOF } from "../../host-decision.js";
4
4
  import { sameExecutionRecord } from "@sema-agent/core";
5
5
  import { findParkedAgentForCheckpoint } from "../../parked-decide.js";
6
- import { DECIDED_REPLAY_SCAN_CAP } from "../../plugins/checkpoint-store-face.js";
6
+ import { DECIDED_REPLAY_SCAN_CAP, pendingTriageOrder } from "../../plugins/checkpoint-store-face.js";
7
7
  import { approvalPayloadFingerprint } from "../../plugins/approval-payload-fingerprint.js";
8
8
  import { carriesDeploymentListQuestion, standingAnswerDurablyRecordable } from "../../tool-approval.js";
9
9
  import { APPROVAL_GATE_KINDS } from "../../approval-content-kind.js";
10
10
  import { isParkedRunStatus } from "../../plugins/store-contracts.js";
11
- import { principalFrom, decodeCheckpointScope, ownerOfCheckpointScope, CHECKPOINT_PUBLIC_SCOPE, PRINCIPAL_TOKEN_HEADER, APPROVAL_MAC_HEADER, APPROVAL_MAC_KID_HEADER } from "../../security.js";
12
- import { editedPlanBinding, isWellFormedUnicode, verifyDirectDoorProof } from "../../principal-jwt.js";
11
+ import { principalFrom, ownerOfCheckpointScope, scopeCellOf, CHECKPOINT_PUBLIC_SCOPE, PRINCIPAL_TOKEN_HEADER, APPROVAL_MAC_HEADER, APPROVAL_MAC_KID_HEADER } from "../../security.js";
12
+ import { keyAdmits } from "../../owner-faces.js";
13
+ import { personOf } from "../../owner-brands.js";
14
+ import { editedPlanBinding, verifyDirectDoorProof } from "../../principal-jwt.js";
15
+ import { isWellFormedUnicode } from "../../principal-shape.js";
13
16
  import { MAX_APPROVAL_REASON_CHARS, projectQuestionAnswer, questionAnswerFromProjection } from "../../approval-hmac.js";
14
17
  import { PLAN_APPROVE_PERMISSION_MODES_AFTER, isPlanApprovePermissionModeAfter, planReviewDecisionExitsPlan, storedBodyPermissionMode } from "../../task-settings.js";
15
18
  import { MAX_APPROVAL_NONCE_CHARS } from "../../plugins/approval-nonce-store.js";
@@ -19,8 +22,8 @@ import { buildRunName } from "../../fleet/fleet-bus.js";
19
22
  import { sleep } from "../sse-log.js";
20
23
  import { bindSseLifecycle } from "../sse-lifecycle.js";
21
24
  import { sendJson, sendError, sseHeaders, logRequestError, SSE_MAX_STREAM_MS, SSE_HEARTBEAT_IDLE_MS } from "../send.js";
22
- import { gatedPrincipal, explicitOperatorOk, sendPrincipalRefusal, sessionCallerOf } from "../principal-gate.js";
23
- import { readOwnedRun, readOwnedSession } from "../owner-access.js";
25
+ import { gatedSubject, explicitOperatorOk, sendPrincipalRefusal } from "../principal-gate.js";
26
+ import { admitRunById, admitSessionById, callerEntry, callerOf, callerOfDecision, deciderSubjectOf, enter, judgeRun, protocolEntry, readVisibleRun, refuse, withCaller } from "../owner-access.js";
24
27
  import { governanceOriginOf } from "../../runtime-governance.js";
25
28
  import { deploymentListAsks } from "../../approval.js";
26
29
  import { grantBindingOf } from "../../standing-answer-grant.js";
@@ -215,7 +218,7 @@ export function checkQuestionAnswer(v) {
215
218
  return shapeOk ? { ok: true, value: v } : { ok: false, kind: "shape" };
216
219
  }
217
220
  async function decideIdempotentReplay(cs, args) {
218
- const { sessionId, out, binding, decision, payload, deciderPrincipal, explicitOperator, warn } = args;
221
+ const { sessionId, out, binding, decision, payload, decider, warn } = args;
219
222
  if (out.status !== 404 || out.body.errorCode !== "not_found.approval")
220
223
  return undefined;
221
224
  const boundCallId = binding.boundCallId;
@@ -238,12 +241,9 @@ async function decideIdempotentReplay(cs, args) {
238
241
  for (const row of rows) {
239
242
  if (row.decision === null)
240
243
  return undefined;
241
- if (!explicitOperator) {
242
- const owner = decodeCheckpointScope(row.scope);
243
- if (owner !== undefined && owner !== deciderPrincipal) {
244
- warn("decide_replay_scope_mismatch", { sessionId });
245
- return undefined;
246
- }
244
+ if (!keyAdmits("scope.decide", decider, scopeCellOf(row.scope))) {
245
+ warn("decide_replay_scope_mismatch", { sessionId });
246
+ return undefined;
247
247
  }
248
248
  if (binding.boundInputHash === undefined || row.boundInputHash !== binding.boundInputHash)
249
249
  return undefined;
@@ -279,9 +279,9 @@ async function decideIdempotentReplay(cs, args) {
279
279
  },
280
280
  };
281
281
  }
282
- async function gateObjectivePreview(reader, runStore, agentStore, gate) {
283
- const previewOf = async (taskId) => readOwnedRun(reader.config, runStore, reader.principal, taskId, "owner_or_operator");
284
- const own = (await runStore.getActiveTaskId(gate.sessionId)) ?? (await runStore.latestRunForSession(gate.sessionId))?.taskId;
282
+ async function gateObjectivePreview(reader, runStore, agentStore, gate, runSessionId) {
283
+ const previewOf = (taskId) => readVisibleRun(reader, runStore, taskId);
284
+ const own = typeof runSessionId === "string" ? ((await runStore.getActiveTaskId(runSessionId)) ?? (await runStore.latestRunForSession(runSessionId))?.taskId) : undefined;
285
285
  if (own !== undefined)
286
286
  return (await previewOf(own))?.objectivePreview ?? null;
287
287
  if (agentStore === undefined)
@@ -311,8 +311,8 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
311
311
  return;
312
312
  }
313
313
  const cs = park.checkpointStore;
314
- const principal = gatedPrincipal(req, deps.config);
315
- const operator = explicitOperatorOk(principal, deps.config);
314
+ const principal = gatedSubject(req, deps.config);
315
+ const operator = explicitOperatorOk(principal === undefined ? undefined : personOf(principal), deps.config);
316
316
  const ownScope = principal ?? CHECKPOINT_PUBLIC_SCOPE;
317
317
  if (match.decl.id === "approvals-stream") {
318
318
  const ownerParam = operator ? (new URLSearchParams(match.search).get("owner") ?? undefined) : undefined;
@@ -354,16 +354,15 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
354
354
  sendError(res, 400, "request.path_malformed", "malformed id (invalid percent-encoding)");
355
355
  return;
356
356
  }
357
- if (!explicitOperatorOk(principal, deps.config)) {
357
+ const exEntry = callerEntry(req, deps, match.decl.id);
358
+ if (!exEntry.caller.operator) {
358
359
  const owned = facts.sessionOwnership(deps);
359
360
  if (!owned.available) {
360
361
  sendError(res, 501, "capability.session_store_required", "approval exemptions require a session-store backend");
361
362
  return;
362
363
  }
363
- if ((await readOwnedSession(deps, owned.sessionStorage, sessionCallerOf(req, deps), exSessionId, "owner")) === undefined) {
364
- sendError(res, 404, "not_found.session", "not found");
364
+ if ((await admitSessionById(exEntry, res, owned.sessionStorage, exSessionId)) === undefined)
365
365
  return;
366
- }
367
366
  }
368
367
  if (match.decl.id === "approval-exemptions-list") {
369
368
  if (exToolName !== undefined) {
@@ -398,11 +397,12 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
398
397
  }
399
398
  const ledger = facts.durableRuns(deps);
400
399
  const agentStore = deps.backgroundAgentStore;
400
+ const previewEntry = protocolEntry(req, deps, "run.preview", callerOf(req, deps));
401
401
  const inbox = (await Promise.all(summaries.map(async (s) => {
402
402
  let objective = null;
403
403
  if (ledger.available) {
404
404
  try {
405
- objective = await gateObjectivePreview({ config: deps.config, principal }, ledger.runStore, agentStore, s);
405
+ objective = await gateObjectivePreview(previewEntry, ledger.runStore, agentStore, s, await cs.hostSessionOfCard(s.token));
406
406
  }
407
407
  catch (err) {
408
408
  recordFailOpen("server.assistant-inbox.objective-preview-unreadable", `run row read for the inbox row of session ${JSON.stringify(s.sessionId)} failed: ${err instanceof Error ? err.message : String(err)}`);
@@ -428,11 +428,12 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
428
428
  ...(s.boundGrantDigest !== undefined ? { boundGrantDigest: s.boundGrantDigest } : {}),
429
429
  ...skillCardFacts(s),
430
430
  ...(s.boundGrantAbsence !== undefined ? { boundGrantAbsence: s.boundGrantAbsence } : {}),
431
+ ...(s.runOrigin !== undefined ? { runOrigin: s.runOrigin } : {}),
431
432
  objective,
432
433
  input,
433
434
  };
434
435
  })))
435
- .sort((a, b) => (b.severity ?? 0) - (a.severity ?? 0) || (a.createdAt ?? 0) - (b.createdAt ?? 0));
436
+ .sort(pendingTriageOrder);
436
437
  sendJson(res, 200, { inbox });
437
438
  return;
438
439
  }
@@ -453,7 +454,13 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
453
454
  sendApprovalsReadFailure(req, res, deps.logger, err);
454
455
  return;
455
456
  }
456
- const byGate = new Map(summaries.map((s) => [s.sessionId, s]));
457
+ const hosts = await Promise.all(summaries.map((s) => cs.hostSessionOfCard(s.token)));
458
+ const byGate = new Map();
459
+ summaries.forEach((s, i) => {
460
+ const host = hosts[i];
461
+ if (typeof host === "string")
462
+ byGate.set(host, s);
463
+ });
457
464
  const runs = await runStore.listRuns({ owner: ownerOfCheckpointScope(scope), limit: 100 });
458
465
  const tasks = runs
459
466
  .filter((r) => r.status === "running" || isParkedRunStatus(r.status))
@@ -482,20 +489,18 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
482
489
  return;
483
490
  }
484
491
  const runStore = runs.runStore;
485
- if (deps.config.requirePrincipal && principal === undefined) {
486
- sendPrincipalRefusal(res, req, deps.config);
492
+ const preemptEntry = enter(req, res, deps, match.decl.id);
493
+ if (preemptEntry === undefined)
487
494
  return;
488
- }
489
495
  if (!deps.config.resourceSuspend) {
490
496
  sendError(res, 501, "feature.preemption_disabled", "preemption not enabled on this worker (needs RESOURCE_SUSPEND=true + a durable checkpoint store)");
491
497
  return;
492
498
  }
493
499
  const taskId = match.params.taskId;
494
- const run = await readOwnedRun(deps.config, runStore, principal, taskId, "owner_or_operator");
495
- if (!run) {
496
- sendError(res, 404, "not_found.run", "task not found");
500
+ const preemptAdmitted = (await admitRunById(preemptEntry, res, runStore, taskId));
501
+ if (preemptAdmitted === undefined)
497
502
  return;
498
- }
503
+ const run = preemptAdmitted.row;
499
504
  if (run.status === "running") {
500
505
  const ownedHere = run.instanceId != null && run.instanceId === deps.instanceId;
501
506
  if (ownedHere && !preemptableRuns.has(taskId)) {
@@ -541,23 +546,17 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
541
546
  return;
542
547
  }
543
548
  const runStore = runs.runStore;
544
- if (deps.config.requirePrincipal && principal === undefined) {
545
- sendPrincipalRefusal(res, req, deps.config);
549
+ const resumeEntry = enter(req, res, deps, match.decl.id);
550
+ if (resumeEntry === undefined)
546
551
  return;
547
- }
548
552
  const restatement = readResumeRestatement(await readJson(req));
549
553
  const taskId = match.params.taskId;
550
- const run = await runStore.getRun(taskId);
551
- if (!run) {
552
- sendError(res, 404, "not_found.run", "task not found");
553
- return;
554
- }
555
- const explicitOperator = explicitOperatorOk(principal, deps.config);
556
- if (!explicitOperator && run.owner !== null && run.owner !== principal) {
557
- sendError(res, 404, "not_found.run", "task not found");
554
+ const resumeAdmitted = (await admitRunById(resumeEntry, res, runStore, taskId));
555
+ if (resumeAdmitted === undefined)
558
556
  return;
559
- }
560
- const out = await resumePreempted(run.sessionId, req, true, { principal, explicitOperator }, restatement);
557
+ const run = resumeAdmitted.row;
558
+ const explicitOperator = resumeAdmitted.quals.has("operator");
559
+ const out = await resumePreempted(run.sessionId, req, true, { subject: resumeEntry.caller.subject, operator: explicitOperator }, restatement);
561
560
  sendResumeOutcome(res, out, deps.logger);
562
561
  return;
563
562
  }
@@ -660,17 +659,15 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
660
659
  }
661
660
  }
662
661
  const sighting = typeof body.checkpointId === "string" ? { face: "checkpointId", value: body.checkpointId } : undefined;
662
+ const decisionEntry = callerEntry(req, deps, match.decl.id);
663
663
  const run = await runStore.getRun(taskId);
664
664
  if (!run) {
665
- if (deps.config.directDoorActive) {
666
- sendError(res, 401, "principal_unverified", "principal proof required");
667
- return;
668
- }
669
- deps.logger?.info?.("decide_404", { reason: "no-row", taskId, principalPresent: principal !== undefined });
670
- sendError(res, 404, "not_found.run", "task not found");
665
+ if (!deps.config.directDoorActive)
666
+ deps.logger?.info?.("decide_404", { reason: "no-row", taskId, principalPresent: principal !== undefined });
667
+ refuse(decisionEntry, res, "missing");
671
668
  return;
672
669
  }
673
- let deciderPrincipal = principal;
670
+ let deciderPrincipal = principal === undefined ? undefined : personOf(principal);
674
671
  let singleUse;
675
672
  if (deps.config.directDoorActive) {
676
673
  const store = deps.approvalNonceStore;
@@ -695,13 +692,15 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
695
692
  deciderPrincipal = proof.principal;
696
693
  singleUse = proof.singleUse === undefined ? undefined : { proof: proof.singleUse, store };
697
694
  }
698
- const explicitOperator = explicitOperatorOk(deciderPrincipal, deps.config);
699
- if (!explicitOperator && run.owner !== null && run.owner !== deciderPrincipal) {
695
+ const deciderEntry = withCaller(decisionEntry, callerOfDecision(decisionEntry.caller, deciderPrincipal, deps.config));
696
+ const decisionAdmitted = judgeRun(deciderEntry, run);
697
+ if (decisionAdmitted === undefined) {
700
698
  deps.logger?.info?.("decide_404", { reason: "owner-mismatch", taskId, principalPresent: principal !== undefined });
701
- sendError(res, 404, "not_found.run", "task not found");
699
+ refuse(deciderEntry, res, "not_visible");
702
700
  return;
703
701
  }
704
- const plan = await preparePlanReview(run.sessionId, { taskId, principalPresent: principal !== undefined }, { principal: deciderPrincipal, explicitOperator }, sighting, restated.restatement);
702
+ const explicitOperator = decisionAdmitted.quals.has("operator");
703
+ const plan = await preparePlanReview(run.sessionId, { taskId, principalPresent: principal !== undefined }, { subject: deciderSubjectOf(principal, deciderPrincipal), operator: explicitOperator }, sighting, restated.restatement);
705
704
  if (!plan.ok) {
706
705
  sendResumeOutcome(res, plan.answer, deps.logger);
707
706
  return;
@@ -862,7 +861,7 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
862
861
  updatedInput: body.updatedInput,
863
862
  ...(typeof body.feedback === "string" ? { feedback: body.feedback } : {}),
864
863
  };
865
- let deciderPrincipal = principal;
864
+ let deciderPrincipal = principal === undefined ? undefined : personOf(principal);
866
865
  if (deps.config.directDoorActive) {
867
866
  const hdr = (n) => {
868
867
  const h = req.headers[n];
@@ -881,19 +880,17 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
881
880
  }
882
881
  deciderPrincipal = proof.principal;
883
882
  }
884
- const explicitOperator = explicitOperatorOk(deciderPrincipal, deps.config);
885
- if (!explicitOperator) {
883
+ const deciderCaller = { subject: deciderSubjectOf(principal, deciderPrincipal), operator: explicitOperatorOk(deciderPrincipal, deps.config) };
884
+ if (!deciderCaller.operator) {
886
885
  const cpScope = await cs
887
886
  .peekPendingScope(sessionId, { gateKinds: APPROVAL_GATE_KINDS })
888
887
  .then((s) => (s === undefined ? cs.peekPendingScope(sessionId) : s));
889
- const decodedCpScope = cpScope != null ? decodeCheckpointScope(cpScope) : undefined;
890
- const ownsIt = cpScope == null || decodedCpScope === undefined || decodedCpScope === deciderPrincipal;
891
- if (!ownsIt) {
888
+ if (!keyAdmits("scope.decide", deciderCaller, scopeCellOf(cpScope ?? CHECKPOINT_PUBLIC_SCOPE))) {
892
889
  sendError(res, 404, "not_found.approval", "approval not found");
893
890
  return;
894
891
  }
895
892
  }
896
- const out = await resumeCheckpoint(sessionId, decision, body.reason ?? undefined, hostDecisionFacts(decider, deciderPrincipal), req, answer, binding, remember ? { grantedBy: deciderPrincipal ?? null, laneCannotRecord: "refuse" } : undefined, true, { principal: deciderPrincipal, explicitOperator }, restated.restatement);
893
+ const out = await resumeCheckpoint(sessionId, decision, body.reason ?? undefined, hostDecisionFacts(decider, deciderPrincipal), req, answer, binding, remember ? { grantedBy: deciderPrincipal ?? null, laneCannotRecord: "refuse" } : undefined, true, deciderCaller, restated.restatement);
897
894
  const replay = await decideIdempotentReplay(cs, {
898
895
  sessionId,
899
896
  out,
@@ -905,8 +902,7 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
905
902
  ...((r) => (r !== undefined ? { reason: r } : {}))(decisionReasonOf(body)),
906
903
  ...(binding.feedback !== undefined ? { feedback: binding.feedback } : {}),
907
904
  },
908
- deciderPrincipal,
909
- explicitOperator,
905
+ decider: deciderCaller,
910
906
  warn: (event, fields) => deps.logger?.warn?.(event, fields),
911
907
  });
912
908
  if (replay !== undefined) {
@@ -983,6 +979,8 @@ function approvalsReadFailureOf(err) {
983
979
  case "deployment":
984
980
  case "unclassified":
985
981
  return "approvals.read_unavailable";
982
+ case "defect":
983
+ return "internal.error";
986
984
  default: {
987
985
  const unhandled = fault;
988
986
  throw new Error(`store fault class without an approvals read answer: ${String(unhandled)}`);
@@ -990,15 +988,18 @@ function approvalsReadFailureOf(err) {
990
988
  }
991
989
  }
992
990
  function sendApprovalsReadFailure(req, res, logger, err) {
993
- logRequestError(logger, req, err);
994
991
  const failure = approvalsReadFailureOf(err);
995
992
  switch (failure) {
996
993
  case "approvals.read_corrupt":
994
+ logRequestError(logger, req, err);
997
995
  sendError(res, 500, "approvals.read_corrupt", "a stored approval row cannot be read - retrying this request will fail the same way until an operator repairs or removes the row");
998
996
  return;
999
997
  case "approvals.read_unavailable":
998
+ logRequestError(logger, req, err);
1000
999
  sendError(res, 503, "approvals.read_unavailable", "the approvals queue could not be read right now - retry this request; until a read succeeds, this answer does not mean nothing is pending");
1001
1000
  return;
1001
+ case "internal.error":
1002
+ throw err;
1002
1003
  default: {
1003
1004
  const unhandled = failure;
1004
1005
  throw new Error(`approvals read failure word without an answer: ${String(unhandled)}`);
@@ -1136,6 +1137,10 @@ export async function streamApprovals(req, res, cs, live, peerInbound, sessions,
1136
1137
  if (!res.writableEnded)
1137
1138
  res.write(`event: error\ndata: ${JSON.stringify({ type: "error", errorCode: "approvals.read_unavailable", message: "the approvals queue could not be read - this stream stays open and retries on its next poll; until a read succeeds, silence here does not mean nothing is pending" })}\n\n`);
1138
1139
  break;
1140
+ case "internal.error":
1141
+ if (!res.writableEnded)
1142
+ res.write(`event: error\ndata: ${JSON.stringify({ type: "error", errorCode: "internal.error", message: "the approvals queue could not be read because of an internal error - this stream is closing; reconnecting will fail the same way until the server is fixed" })}\n\n`);
1143
+ throw err;
1139
1144
  default: {
1140
1145
  const unhandled = failure;
1141
1146
  throw new Error(`approvals read failure word without a stream answer: ${String(unhandled)}`);
@@ -2,7 +2,7 @@ import { createHash } from "node:crypto";
2
2
  import { uuidv7, sanitizePathComponent } from "@sema-agent/core";
3
3
  import { HttpError } from "../../security.js";
4
4
  import { sendJson, sendError } from "../send.js";
5
- import { gatedPrincipal, sendPrincipalRefusal } from "../principal-gate.js";
5
+ import { gatedSubject, sendPrincipalRefusal } from "../principal-gate.js";
6
6
  import { assertNever } from "../route-ctx.js";
7
7
  import { attachmentKindOf, readProjectBundle } from "../../project-bundle.js";
8
8
  export async function handleAttachments(req, res, match, ctx) {
@@ -17,7 +17,7 @@ export async function handleAttachments(req, res, match, ctx) {
17
17
  sendError(res, 501, "capability.attachment_store_required", "attachment store not configured");
18
18
  return;
19
19
  }
20
- const principal = gatedPrincipal(req, deps.config);
20
+ const principal = gatedSubject(req, deps.config);
21
21
  if (deps.config.requirePrincipal && principal === undefined) {
22
22
  sendPrincipalRefusal(res, req, deps.config);
23
23
  return;
@@ -31,7 +31,7 @@
31
31
  * ── 结清口:子代结清只有一只协调器 ─────────────────────────────────────────────────────────────────
32
32
  * `POST /v1/sessions/:id/children/retire`(无体)→ 200 `{ children: string[] }`:**显式**结清以本会话为根的后台子代(running 停掉、parked
33
33
  * 作废卡并对账翻终态),与 `DELETE /v1/sessions/:id` 同调**一只**预检 `probeSessionChildren` 与**一只**协调器 `retireSessionChildren`
34
- * (`session-children-retire.ts`)、同一个 scope(`sessionChildrenScope`)。预检有本副本结束不了的 ⇒ 409 `conflict.session_children_alive{remaining}`
34
+ * (`session-children-retire.ts`)、同一个 scope(`sessionTenantScope`)。预检有本副本结束不了的 ⇒ 409 `conflict.session_children_alive{remaining}`
35
35
  * (与删除门同码同投影,一只都不动);停不净(时序失败)⇒ 与删除门同一失败契约(通用 500,重试收敛)。`children` = 首轮观察到、且已全部
36
36
  * 结清的子代,每项经名册的 id 投影 `rosterAgentId`(与换绑 / 导入两门 409 体的 `children` 同形同投影)。它不判根认领(停止口也不判):
37
37
  * 根 run 活着时它可再派子代 —— 由换绑 / 导入门写事务内的认领读兜。鉴权 / 限流 / 无凭据写门与停止口同。
@@ -39,7 +39,7 @@
39
39
  * 「把树结清」是两个意图、两只口。
40
40
  *
41
41
  * 🔴 **停止口在无凭据写门内**(`credentialGated: ["POST"]`;车OL F1 = 7.102.0 合并复审 gpt-6 腿 [high]):门的两个合取项它都中
42
- * —— ① 授权的唯一输入是 principal 头(属主判 `sessionOwnerOk` 与 operator 臂 `explicitOperatorOk` 读的都是 `gatedPrincipal`,
42
+ * —— ① 授权的唯一输入是 principal 头(属主判 `admitSessionRow` 与 operator 臂 `explicitOperatorOk` 读的都是 `gatedSubject`,
43
43
  * 无 service 凭证的部署上它收调用方自报的头);② 不可撤销、爆炸半径跨租户(知道会话 id + 自报它的属主 ⇒ 停掉那个会话的后台
44
44
  * 进程,`includeRetained:true` 连显式 retain 的活服务一起停)。于是无 service 凭证且未开 `ALLOW_UNAUTHED_WRITES` 的部署上它与
45
45
  * 其余改写门同码同句 503 `auth.service_token_required`(在路由之前,`dispatch.ts` 那一道),同一只会话级收敛函数的另一个调用点
@@ -49,7 +49,7 @@
49
49
  */
50
50
  import type { IncomingMessage, ServerResponse } from "node:http";
51
51
  import { type TaskRegistry, type BackgroundShellHardKillReceipt } from "@sema-agent/core";
52
- import { type RouteCtx, type RouteMatch, type RouteIdsOf } from "../route-ctx.js";
52
+ import type { RouteCtx, RouteMatch, RouteIdsOf } from "../route-ctx.js";
53
53
  /** `description` 的显示截断(模型描述通常一句话;回落的命令文本可能是一整段脚本)。 */
54
54
  export declare const DESCRIPTION_MAX = 500;
55
55
  /** core `list()` 的行型(从唯一的消费位取,不抄结构)。 */
@@ -1,15 +1,13 @@
1
1
  import { z } from "zod";
2
2
  import { defaultTaskRegistry } from "@sema-agent/core";
3
3
  import { reapSessionBackgroundHard } from "../../background-session-reap.js";
4
- import { probeSessionChildren, retireSessionChildren, sessionChildrenScope, SessionChildrenStopIncompleteError } from "../../session-children-retire.js";
4
+ import { probeSessionChildren, retireSessionChildren, sessionTenantScope, SessionChildrenStopIncompleteError } from "../../session-children-retire.js";
5
5
  import { rosterAgentId } from "./agents-roster.js";
6
6
  import { redactSecrets } from "../../trace/redact.js";
7
7
  import { sendJson, sendError } from "../send.js";
8
- import { gatedPrincipal, explicitOperatorOk, sendPrincipalRefusal } from "../principal-gate.js";
9
- import {} from "../route-ctx.js";
10
- import { assertNever, SESSION_NOT_FOUND_MESSAGE } from "../route-ctx.js";
8
+ import { admitSessionById, enter } from "../owner-access.js";
9
+ import { assertNever } from "../route-ctx.js";
11
10
  import * as facts from "../../capability-facts.js";
12
- import { sessionOwnerCellOf } from "../../security.js";
13
11
  const LIST_LIMIT = 500;
14
12
  export const DESCRIPTION_MAX = 500;
15
13
  const ROW_KEY_DISPOSITION = {
@@ -50,11 +48,9 @@ export async function handleBackground(req, res, match, ctx) {
50
48
  const id = match.decl.id;
51
49
  if ((id === "session-background-stop" || id === "session-children-retire") && ctx.helpers.rateLimited(req, res))
52
50
  return;
53
- const principal = gatedPrincipal(req, deps.config);
54
- if (deps.config.requirePrincipal && principal === undefined) {
55
- sendPrincipalRefusal(res, req, deps.config);
51
+ const entry = enter(req, res, deps, id);
52
+ if (entry === undefined)
56
53
  return;
57
- }
58
54
  let includeRetained = false;
59
55
  if (id === "session-background-stop") {
60
56
  const parsed = StopBodySchema.safeParse((await ctx.helpers.readJson(req)) ?? {});
@@ -74,15 +70,11 @@ export async function handleBackground(req, res, match, ctx) {
74
70
  sendError(res, 501, "capability.session_ownership_required", "the session background faces require the session-ownership face (sessionStorage.headOf)");
75
71
  return;
76
72
  }
77
- const owner = (await owned.sessionStorage.headOf(sessionId))?.owner;
78
- if (owner === undefined) {
79
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
80
- return;
81
- }
82
- const operator = explicitOperatorOk(principal, deps.config);
83
- if (!operator && !ctx.helpers.sessionOwnerOk(req, res, await sessionOwnerCellOf(owned.sessionStorage, sessionId, owner)))
73
+ const admitted = await admitSessionById(entry, res, owned.sessionStorage, sessionId);
74
+ if (admitted === undefined)
84
75
  return;
85
- const scope = sessionChildrenScope(owner);
76
+ const owner = admitted.row.owner;
77
+ const scope = sessionTenantScope(owner);
86
78
  switch (id) {
87
79
  case "session-background-list": {
88
80
  const rows = defaultTaskRegistry.list({ owner: sessionId, sessionId, scope }, { limit: LIST_LIMIT }).map(projectRow);