@sema-agent/server 7.147.0 → 7.148.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (725) hide show
  1. package/MIGRATION.md +1039 -24
  2. package/README.md +20 -7
  3. package/README.zh-CN.md +14 -8
  4. package/USAGE.md +380 -163
  5. package/deploy/sema-up/README.md +16 -5
  6. package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
  7. package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
  8. package/deploy/sema-up/chart/values.yaml +3 -2
  9. package/deploy/sema-up/cluster-up.sh +74 -176
  10. package/deploy/sema-up/kube-up.sh +29 -49
  11. package/deploy/sema-up/lib/chart-run.sh +23 -0
  12. package/deploy/sema-up/lib/dataroot.sh +3 -3
  13. package/deploy/sema-up/lib/health.sh +62 -13
  14. package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
  15. package/deploy/sema-up/lib/helm-values-kube.py +35 -0
  16. package/deploy/sema-up/lib/regcred.py +8 -0
  17. package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
  18. package/deploy/sema-up/lib/remote/image-import.sh +6 -0
  19. package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
  20. package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
  21. package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
  22. package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
  23. package/deploy/sema-up/lib/render-stack.py +17 -0
  24. package/deploy/sema-up/lib/shell-text.sh +87 -0
  25. package/deploy/sema-up/lib/usage-flags.txt +10 -0
  26. package/deploy/sema-up/lib/usage-head.txt +1 -0
  27. package/deploy/sema-up/lib/usage-tail.txt +13 -0
  28. package/deploy/sema-up/preflight.sh +10 -8
  29. package/deploy/sema-up/sema-up.sh +14 -39
  30. package/deploy/sema-up/smoke.sh +7 -6
  31. package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
  32. package/deploy/sema-up/stack/compose.yaml +13 -1
  33. package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
  34. package/dist/adoption/plan.d.ts +24 -0
  35. package/dist/adoption/plan.js +53 -1
  36. package/dist/adoption/runner.d.ts +10 -1
  37. package/dist/adoption/runner.js +36 -16
  38. package/dist/adoption/wire.d.ts +3 -3
  39. package/dist/approval-card.d.ts +28 -30
  40. package/dist/approval-gate-currency.js +3 -2
  41. package/dist/approval-reconciler.d.ts +4 -13
  42. package/dist/approval-reconciler.js +2 -2
  43. package/dist/approval.d.ts +13 -11
  44. package/dist/approval.js +3 -3
  45. package/dist/audit.d.ts +10 -3
  46. package/dist/audit.js +15 -7
  47. package/dist/auth-bridge.d.ts +0 -14
  48. package/dist/auth-bridge.js +0 -7
  49. package/dist/auto-mode-face.d.ts +10 -7
  50. package/dist/auto-mode-face.js +7 -4
  51. package/dist/background-agent-name.d.ts +19 -1
  52. package/dist/background-agent-name.js +12 -2
  53. package/dist/background-session-reap.d.ts +1 -1
  54. package/dist/bake-runner/main.js +9 -6
  55. package/dist/bench/s1/arms.js +6 -5
  56. package/dist/bench/s1/live-deps.js +5 -2
  57. package/dist/bench/s1/run-firm.js +6 -5
  58. package/dist/bind-host.d.ts +25 -0
  59. package/dist/bind-host.js +25 -0
  60. package/dist/boot/adoption.d.ts +3 -0
  61. package/dist/boot/adoption.js +1 -0
  62. package/dist/boot/deployment-mods.d.ts +1 -1
  63. package/dist/boot/execution-env.d.ts +17 -7
  64. package/dist/boot/execution-env.js +37 -31
  65. package/dist/boot/exit-boundary.d.ts +2 -2
  66. package/dist/boot/exit-boundary.js +6 -5
  67. package/dist/boot/fatal-exit.d.ts +3 -5
  68. package/dist/boot/fatal-exit.js +2 -2
  69. package/dist/boot/leader.d.ts +15 -0
  70. package/dist/boot/leader.js +17 -15
  71. package/dist/boot/memory-consolidation.d.ts +37 -29
  72. package/dist/boot/memory-consolidation.js +11 -5
  73. package/dist/boot/org-memory.js +1 -1
  74. package/dist/boot/parked-revive-gate.js +2 -2
  75. package/dist/boot/reapers.d.ts +4 -3
  76. package/dist/boot/reapers.js +19 -16
  77. package/dist/boot/resolve-spec.d.ts +5 -3
  78. package/dist/boot/resolve-spec.js +55 -67
  79. package/dist/boot/retention-lane.d.ts +4 -4
  80. package/dist/boot/retention-lane.js +2 -2
  81. package/dist/boot/runner-deps.d.ts +28 -7
  82. package/dist/boot/runner-deps.js +11 -4
  83. package/dist/boot/runtime-caps.d.ts +2 -2
  84. package/dist/boot/runtime-caps.js +16 -2
  85. package/dist/boot/session-faces.d.ts +16 -7
  86. package/dist/boot/session-faces.js +114 -94
  87. package/dist/boot/shutdown.d.ts +5 -4
  88. package/dist/boot/shutdown.js +6 -4
  89. package/dist/boot/stage-01-config.js +9 -1
  90. package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
  91. package/dist/boot/stage-02-web-admin-pull.js +6 -1
  92. package/dist/boot/stage-03-store-backend.d.ts +3 -0
  93. package/dist/boot/stage-03-store-backend.js +4 -3
  94. package/dist/boot/stage-04-stores.d.ts +2 -0
  95. package/dist/boot/stage-04-stores.js +2 -2
  96. package/dist/boot/stage-05-execution-env.d.ts +7 -3
  97. package/dist/boot/stage-05-execution-env.js +2 -2
  98. package/dist/boot/stage-06-runners.d.ts +10 -12
  99. package/dist/boot/stage-06-runners.js +23 -15
  100. package/dist/boot/stage-07-capability-layer.d.ts +11 -8
  101. package/dist/boot/stage-07-capability-layer.js +5 -3
  102. package/dist/boot/stage-08-reapers.d.ts +11 -8
  103. package/dist/boot/stage-08-reapers.js +3 -3
  104. package/dist/boot/stage-09-leader.d.ts +12 -15
  105. package/dist/boot/stage-09-leader.js +12 -4
  106. package/dist/boot/stage-10-http-server.d.ts +12 -15
  107. package/dist/boot/stage-10-http-server.js +7 -4
  108. package/dist/boot/store-evidence.d.ts +20 -0
  109. package/dist/boot/store-evidence.js +13 -0
  110. package/dist/boot/stores.d.ts +3 -0
  111. package/dist/boot/stores.js +21 -10
  112. package/dist/boot/task-list-lane.d.ts +4 -4
  113. package/dist/boot/web-admin.d.ts +4 -2
  114. package/dist/boot/web-admin.js +55 -35
  115. package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
  116. package/dist/boot-reclaim.d.ts +3 -1
  117. package/dist/boot-reclaim.js +1 -1
  118. package/dist/brain.d.ts +7 -18
  119. package/dist/brain.js +5 -17
  120. package/dist/budget.js +6 -6
  121. package/dist/capabilities/center-plugins.d.ts +7 -1
  122. package/dist/capabilities/center-plugins.js +32 -10
  123. package/dist/capabilities/center-wiring.js +1 -1
  124. package/dist/capabilities/composite-members.d.ts +2 -2
  125. package/dist/capabilities/composite-members.js +2 -2
  126. package/dist/capabilities/repo-tools.d.ts +2 -0
  127. package/dist/capabilities/repo-tools.js +14 -12
  128. package/dist/capabilities/scenarios.d.ts +6 -15
  129. package/dist/capabilities/scenarios.js +11 -16
  130. package/dist/capabilities/skills.d.ts +1 -1
  131. package/dist/capabilities/tool-defer.d.ts +1 -1
  132. package/dist/capability-facts.d.ts +38 -11
  133. package/dist/capability-facts.js +47 -8
  134. package/dist/card-void.d.ts +4 -4
  135. package/dist/card-void.js +1 -1
  136. package/dist/center-credential-renewer.d.ts +6 -2
  137. package/dist/center-credential-renewer.js +7 -3
  138. package/dist/config-catalog.d.ts +16 -1
  139. package/dist/config-catalog.js +62 -56
  140. package/dist/config-dir-trust.d.ts +37 -4
  141. package/dist/config-dir-trust.js +88 -44
  142. package/dist/config-invariants.d.ts +42 -3
  143. package/dist/config-invariants.js +69 -5
  144. package/dist/config-lkg.d.ts +23 -1
  145. package/dist/config-lkg.js +17 -3
  146. package/dist/config-provider.d.ts +9 -9
  147. package/dist/config-provider.js +25 -110
  148. package/dist/config-pull-failure.d.ts +50 -0
  149. package/dist/config-pull-failure.js +48 -0
  150. package/dist/config-types.d.ts +26 -17
  151. package/dist/config.d.ts +8 -16
  152. package/dist/config.js +113 -47
  153. package/dist/delegated-session-owner.d.ts +1 -1
  154. package/dist/deleted-session-ids.d.ts +3 -2
  155. package/dist/deployment-governance.d.ts +3 -3
  156. package/dist/deployment-shape.d.ts +30 -4
  157. package/dist/deployment-shape.js +7 -0
  158. package/dist/egress-redirect.d.ts +25 -7
  159. package/dist/egress-redirect.js +20 -2
  160. package/dist/elicitation.d.ts +6 -5
  161. package/dist/elicitation.js +23 -22
  162. package/dist/engine-identity.d.ts +28 -0
  163. package/dist/engine-identity.js +10 -0
  164. package/dist/entry-problems.d.ts +5 -7
  165. package/dist/entry-problems.js +1 -1
  166. package/dist/env-facts.js +2 -1
  167. package/dist/env-witness.d.ts +7 -0
  168. package/dist/env-witness.js +16 -0
  169. package/dist/execution-lane-caps.d.ts +5 -18
  170. package/dist/execution-lane-caps.js +0 -22
  171. package/dist/execution-placement.d.ts +58 -18
  172. package/dist/execution-placement.js +41 -2
  173. package/dist/field-conflict.d.ts +7 -11
  174. package/dist/field-conflict.js +3 -3
  175. package/dist/file-history-capture.d.ts +3 -3
  176. package/dist/file-history-disclosure.js +1 -0
  177. package/dist/fleet/fleet-bus.d.ts +21 -3
  178. package/dist/fleet/fleet-bus.js +35 -25
  179. package/dist/fleet/fleet-reconciler.js +2 -2
  180. package/dist/fleet/serving-lease.js +3 -3
  181. package/dist/fleet-client.js +3 -3
  182. package/dist/fleet-lease.d.ts +0 -1
  183. package/dist/fleet-lease.js +4 -5
  184. package/dist/history-anchor.d.ts +23 -3
  185. package/dist/history-anchor.js +24 -4
  186. package/dist/hitl-delivery.d.ts +90 -0
  187. package/dist/hitl-delivery.js +98 -0
  188. package/dist/hooks/classic-stations.d.ts +8 -11
  189. package/dist/hooks/classic-stations.js +0 -7
  190. package/dist/hooks/hook-llm.d.ts +5 -1
  191. package/dist/hooks/hook-llm.js +24 -15
  192. package/dist/hooks/hook-runner.d.ts +67 -57
  193. package/dist/hooks/hook-runner.js +260 -186
  194. package/dist/host-lsp-manager.d.ts +22 -8
  195. package/dist/host-lsp-manager.js +4 -1
  196. package/dist/http/active-run-conflict.d.ts +2 -43
  197. package/dist/http/active-run-conflict.js +3 -7
  198. package/dist/http/admission.d.ts +4 -18
  199. package/dist/http/admission.js +75 -78
  200. package/dist/http/approval-sweeps.d.ts +3 -3
  201. package/dist/http/approval-sweeps.js +54 -30
  202. package/dist/http/caller-trust.d.ts +8 -10
  203. package/dist/http/caller-trust.js +1 -2
  204. package/dist/http/claim-heartbeat.d.ts +49 -0
  205. package/dist/http/claim-heartbeat.js +46 -0
  206. package/dist/http/claimed-run.d.ts +4 -3
  207. package/dist/http/dispatch.d.ts +8 -1
  208. package/dist/http/dispatch.js +76 -30
  209. package/dist/http/durable-run-leg.d.ts +3 -3
  210. package/dist/http/durable-run-leg.js +17 -12
  211. package/dist/http/execution-context.d.ts +17 -43
  212. package/dist/http/execution-context.js +7 -5
  213. package/dist/http/health-reader.d.ts +36 -0
  214. package/dist/http/health-reader.js +21 -0
  215. package/dist/http/health-self-report.d.ts +9 -9
  216. package/dist/http/health-self-report.js +4 -4
  217. package/dist/http/idempotency.d.ts +9 -5
  218. package/dist/http/idempotency.js +4 -4
  219. package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
  220. package/dist/http/memory-compliance-failure-reply.js +4 -2
  221. package/dist/http/memory-face-fault-reply.d.ts +67 -0
  222. package/dist/http/memory-face-fault-reply.js +71 -0
  223. package/dist/http/memory-store-refusal-reply.d.ts +1 -1
  224. package/dist/http/memory-store-refusal-reply.js +3 -0
  225. package/dist/http/owner-access.d.ts +391 -67
  226. package/dist/http/owner-access.js +371 -35
  227. package/dist/http/principal-gate.d.ts +24 -81
  228. package/dist/http/principal-gate.js +24 -68
  229. package/dist/http/refusal-body.d.ts +35 -2
  230. package/dist/http/refusal-body.js +34 -0
  231. package/dist/http/request-guards.d.ts +9 -13
  232. package/dist/http/request-guards.js +34 -68
  233. package/dist/http/resume-composition.d.ts +37 -0
  234. package/dist/http/resume-composition.js +18 -0
  235. package/dist/http/resume-ctx-read.d.ts +35 -12
  236. package/dist/http/resume-ctx-read.js +25 -6
  237. package/dist/http/resume-legs.d.ts +21 -18
  238. package/dist/http/resume-legs.js +189 -129
  239. package/dist/http/retired-skill-manifest.d.ts +1 -1
  240. package/dist/http/route-ctx.d.ts +25 -32
  241. package/dist/http/routes/a2a-serve.d.ts +43 -5
  242. package/dist/http/routes/a2a-serve.js +58 -37
  243. package/dist/http/routes/admin-config-refresh.js +2 -2
  244. package/dist/http/routes/admin-drain.js +2 -2
  245. package/dist/http/routes/admin-memory-optout.js +4 -3
  246. package/dist/http/routes/adoption.d.ts +3 -0
  247. package/dist/http/routes/adoption.js +17 -10
  248. package/dist/http/routes/agents-roster.js +13 -7
  249. package/dist/http/routes/approvals-assistant.js +70 -65
  250. package/dist/http/routes/attachments.js +2 -2
  251. package/dist/http/routes/background.d.ts +3 -3
  252. package/dist/http/routes/background.js +9 -17
  253. package/dist/http/routes/capabilities.js +15 -18
  254. package/dist/http/routes/config-catalog.js +2 -2
  255. package/dist/http/routes/devices.d.ts +3 -3
  256. package/dist/http/routes/devices.js +4 -4
  257. package/dist/http/routes/diagnostics.d.ts +27 -3
  258. package/dist/http/routes/diagnostics.js +27 -21
  259. package/dist/http/routes/engine.js +2 -2
  260. package/dist/http/routes/fleet.js +5 -3
  261. package/dist/http/routes/images.js +10 -6
  262. package/dist/http/routes/leader.d.ts +7 -2
  263. package/dist/http/routes/leader.js +12 -3
  264. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  265. package/dist/http/routes/mcp-reconnect.js +7 -15
  266. package/dist/http/routes/memory-bundle.js +4 -7
  267. package/dist/http/routes/memory-compliance.js +4 -4
  268. package/dist/http/routes/memory-consolidation.js +6 -9
  269. package/dist/http/routes/memory-origin.d.ts +2 -0
  270. package/dist/http/routes/memory-origin.js +7 -8
  271. package/dist/http/routes/memory-policy.js +17 -12
  272. package/dist/http/routes/notify-wake.js +10 -19
  273. package/dist/http/routes/observability.js +3 -3
  274. package/dist/http/routes/principal-inbox.d.ts +1 -1
  275. package/dist/http/routes/principal-inbox.js +2 -2
  276. package/dist/http/routes/projects.d.ts +1 -1
  277. package/dist/http/routes/projects.js +3 -2
  278. package/dist/http/routes/retention-ops.js +6 -9
  279. package/dist/http/routes/rules.js +20 -5
  280. package/dist/http/routes/run-memory-capture.d.ts +2 -2
  281. package/dist/http/routes/run-memory-capture.js +6 -12
  282. package/dist/http/routes/run-permission-mode.d.ts +2 -2
  283. package/dist/http/routes/run-permission-mode.js +10 -17
  284. package/dist/http/routes/runs.js +146 -231
  285. package/dist/http/routes/session-memory-sync.d.ts +2 -2
  286. package/dist/http/routes/session-memory-sync.js +7 -13
  287. package/dist/http/routes/session-sync.d.ts +4 -2
  288. package/dist/http/routes/session-sync.js +21 -20
  289. package/dist/http/routes/sessions-list.d.ts +3 -3
  290. package/dist/http/routes/sessions-list.js +9 -9
  291. package/dist/http/routes/sessions.js +87 -124
  292. package/dist/http/routes/shared-memory.js +6 -6
  293. package/dist/http/routes/side-query.js +2 -2
  294. package/dist/http/routes/tasks.js +136 -120
  295. package/dist/http/routes/trace-usage.d.ts +0 -12
  296. package/dist/http/routes/trace-usage.js +40 -46
  297. package/dist/http/routes/workflows.d.ts +39 -4
  298. package/dist/http/routes/workflows.js +42 -14
  299. package/dist/http/run-concurrency-cap.d.ts +20 -12
  300. package/dist/http/run-concurrency-cap.js +39 -26
  301. package/dist/http/run-read-face.d.ts +3 -5
  302. package/dist/http/run-read-face.js +8 -13
  303. package/dist/http/send.d.ts +12 -3
  304. package/dist/http/send.js +42 -6
  305. package/dist/http/server.d.ts +39 -40
  306. package/dist/http/server.js +36 -11
  307. package/dist/http/sse-log.d.ts +17 -10
  308. package/dist/http/sse-log.js +7 -7
  309. package/dist/http/stored-body-replay.d.ts +12 -0
  310. package/dist/http/stored-body-replay.js +2 -2
  311. package/dist/http/submit-ctx.d.ts +16 -8
  312. package/dist/http/submit-ctx.js +6 -2
  313. package/dist/http/submit-replay.d.ts +19 -6
  314. package/dist/http/submit-replay.js +18 -6
  315. package/dist/http/sync-submit-body.d.ts +3 -4
  316. package/dist/http/sync-submit-body.js +4 -5
  317. package/dist/http/wire-types.d.ts +4 -3
  318. package/dist/identity-source.d.ts +36 -5
  319. package/dist/identity-source.js +27 -0
  320. package/dist/index.d.ts +1 -0
  321. package/dist/index.js +1 -0
  322. package/dist/key-resolver.d.ts +32 -0
  323. package/dist/key-resolver.js +23 -9
  324. package/dist/leader/diffup.js +2 -1
  325. package/dist/leader/endpoint.d.ts +26 -5
  326. package/dist/leader/endpoint.js +154 -14
  327. package/dist/leader/fanout.d.ts +3 -0
  328. package/dist/leader/fanout.js +78 -63
  329. package/dist/leader/leader.d.ts +16 -0
  330. package/dist/leader/leader.js +43 -3
  331. package/dist/leader/merge.d.ts +9 -1
  332. package/dist/leader/merge.js +16 -1
  333. package/dist/leader/repair-wire.js +1 -1
  334. package/dist/leader/wire.d.ts +36 -3
  335. package/dist/leader/wire.js +59 -18
  336. package/dist/lsp-evict.d.ts +6 -4
  337. package/dist/lsp-evict.js +2 -3
  338. package/dist/memory-operator-faces.d.ts +5 -4
  339. package/dist/memory-operator-faces.js +1 -1
  340. package/dist/memory-scope.d.ts +29 -2
  341. package/dist/memory-scope.js +64 -15
  342. package/dist/memory-store-refusal.d.ts +5 -2
  343. package/dist/memory-sync-client.d.ts +3 -2
  344. package/dist/memory-sync-client.js +6 -3
  345. package/dist/model-compat.d.ts +17 -8
  346. package/dist/model-compat.js +6 -2
  347. package/dist/model-context-window.d.ts +18 -0
  348. package/dist/model-context-window.js +2 -0
  349. package/dist/model-entry-headers.d.ts +46 -4
  350. package/dist/model-entry-headers.js +2 -2
  351. package/dist/model-entry-refusal.d.ts +35 -16
  352. package/dist/model-entry-refusal.js +40 -27
  353. package/dist/model-plane-face.d.ts +19 -11
  354. package/dist/model-plane-face.js +9 -1
  355. package/dist/model-plane-probe.d.ts +2 -0
  356. package/dist/model-plane-probe.js +17 -0
  357. package/dist/model-provider.d.ts +3 -3
  358. package/dist/model-route-endpoint.d.ts +9 -5
  359. package/dist/model-route-endpoint.js +29 -7
  360. package/dist/model-select.d.ts +16 -0
  361. package/dist/model-select.js +4 -0
  362. package/dist/mountinfo.d.ts +37 -0
  363. package/dist/mountinfo.js +47 -0
  364. package/dist/namespaced-rule-name.d.ts +23 -14
  365. package/dist/namespaced-rule-name.js +8 -11
  366. package/dist/net-address.d.ts +1 -1
  367. package/dist/observability/corrupt-read-seat.d.ts +4 -4
  368. package/dist/observability/corrupt-read-seat.js +5 -3
  369. package/dist/observability/fail-open.d.ts +58 -38
  370. package/dist/observability/fail-open.js +60 -38
  371. package/dist/observability/logger.d.ts +22 -1
  372. package/dist/observability/logger.js +89 -12
  373. package/dist/observability/metrics.js +3 -4
  374. package/dist/observability/otel-exporter.js +2 -1
  375. package/dist/observability/principal-context.d.ts +14 -7
  376. package/dist/observability/principal-context.js +8 -3
  377. package/dist/observability/run-terminal.d.ts +7 -1
  378. package/dist/observability/run-terminal.js +5 -2
  379. package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
  380. package/dist/orchestration/hardened-vm-runner.js +11 -5
  381. package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
  382. package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
  383. package/dist/orchestration/hardened-vm-worker.js +2 -1
  384. package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
  385. package/dist/orchestration/workflow-completion-inbox.js +3 -2
  386. package/dist/org-delivery-gate.d.ts +5 -4
  387. package/dist/org-delivery-gate.js +7 -6
  388. package/dist/outbound-dispatcher.d.ts +1 -1
  389. package/dist/outbound-dispatcher.js +6 -12
  390. package/dist/owner-brands.d.ts +81 -0
  391. package/dist/owner-brands.js +42 -0
  392. package/dist/owner-faces.d.ts +531 -0
  393. package/dist/owner-faces.js +126 -0
  394. package/dist/parked-decide.d.ts +67 -5
  395. package/dist/parked-decide.js +127 -5
  396. package/dist/parked-revive-surface.d.ts +14 -4
  397. package/dist/parked-revive-surface.js +5 -4
  398. package/dist/peer-directory.d.ts +6 -8
  399. package/dist/peer-directory.js +3 -2
  400. package/dist/permission-rule-vocab.d.ts +53 -8
  401. package/dist/permission-rule-vocab.js +30 -2
  402. package/dist/plugins/adoption-log-sql.d.ts +0 -22
  403. package/dist/plugins/adoption-log-sql.js +5 -3
  404. package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
  405. package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
  406. package/dist/plugins/approval-ask-store-file.d.ts +18 -7
  407. package/dist/plugins/approval-ask-store-file.js +37 -14
  408. package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
  409. package/dist/plugins/approval-ask-store-memory.js +24 -10
  410. package/dist/plugins/approval-ask-store-sql.d.ts +39 -20
  411. package/dist/plugins/approval-ask-store-sql.js +41 -10
  412. package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
  413. package/dist/plugins/approval-exemption-skill-m46.js +25 -0
  414. package/dist/plugins/approval-exemption-store.d.ts +6 -1
  415. package/dist/plugins/approval-exemption-store.js +14 -0
  416. package/dist/plugins/approval-nonce-store.d.ts +39 -12
  417. package/dist/plugins/approval-nonce-store.js +72 -23
  418. package/dist/plugins/blob-backend.d.ts +2 -0
  419. package/dist/plugins/blob-backend.js +9 -6
  420. package/dist/plugins/caching-session-store.d.ts +13 -1
  421. package/dist/plugins/caching-session-store.js +43 -4
  422. package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
  423. package/dist/plugins/checkpoint-index-columns.js +36 -1
  424. package/dist/plugins/checkpoint-store-face.d.ts +83 -10
  425. package/dist/plugins/checkpoint-store-face.js +18 -1
  426. package/dist/plugins/device-store-sql.js +1 -0
  427. package/dist/plugins/ensure-index.d.ts +13 -1
  428. package/dist/plugins/ensure-index.js +154 -21
  429. package/dist/plugins/ensure-schema-lock-policy.d.ts +0 -15
  430. package/dist/plugins/ensure-schema-lock-policy.js +3 -2
  431. package/dist/plugins/file-run-store.d.ts +63 -23
  432. package/dist/plugins/file-run-store.js +138 -83
  433. package/dist/plugins/host-platform.d.ts +24 -3
  434. package/dist/plugins/host-platform.js +15 -1
  435. package/dist/plugins/image-bake-store-sql.js +2 -0
  436. package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
  437. package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
  438. package/dist/plugins/k8s-pod-reaper.js +0 -1
  439. package/dist/plugins/leader-run-store-sql.d.ts +22 -0
  440. package/dist/plugins/leader-run-store-sql.js +34 -4
  441. package/dist/plugins/local-checkpoint-store.d.ts +58 -23
  442. package/dist/plugins/local-checkpoint-store.js +195 -76
  443. package/dist/plugins/local-data-dir-modes-m39.js +2 -1
  444. package/dist/plugins/local-docker-capacity.d.ts +93 -0
  445. package/dist/plugins/local-docker-capacity.js +194 -0
  446. package/dist/plugins/local-docker-reaper.d.ts +92 -0
  447. package/dist/plugins/local-docker-reaper.js +102 -0
  448. package/dist/plugins/local-engine-high-water.d.ts +4 -2
  449. package/dist/plugins/local-engine-high-water.js +4 -1
  450. package/dist/plugins/local-session-store.d.ts +358 -125
  451. package/dist/plugins/local-session-store.js +824 -251
  452. package/dist/plugins/local-session-window.d.ts +3 -2
  453. package/dist/plugins/local-session-window.js +3 -2
  454. package/dist/plugins/local-sidecar-quarantine.js +3 -2
  455. package/dist/plugins/local-task-attachment-store.d.ts +18 -1
  456. package/dist/plugins/local-task-attachment-store.js +22 -1
  457. package/dist/plugins/memory-embedder.js +9 -7
  458. package/dist/plugins/memory-engine-pg.d.ts +3 -2
  459. package/dist/plugins/memory-engine-pg.js +14 -5
  460. package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
  461. package/dist/plugins/memory-engine-sql-apply.js +6 -8
  462. package/dist/plugins/memory-engine-tidb.d.ts +4 -2
  463. package/dist/plugins/memory-engine-tidb.js +11 -2
  464. package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
  465. package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
  466. package/dist/plugins/memory-run-store.d.ts +39 -27
  467. package/dist/plugins/memory-run-store.js +72 -70
  468. package/dist/plugins/one-time-migration-marker.d.ts +10 -0
  469. package/dist/plugins/one-time-migration-marker.js +7 -0
  470. package/dist/plugins/one-time-migrations.d.ts +186 -45
  471. package/dist/plugins/one-time-migrations.js +442 -119
  472. package/dist/plugins/org-delivery-quota-store.js +2 -1
  473. package/dist/plugins/permission-rule-store-file.d.ts +3 -3
  474. package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
  475. package/dist/plugins/permission-rule-store-sql.js +6 -86
  476. package/dist/plugins/pg-pool.d.ts +1 -31
  477. package/dist/plugins/pg-pool.js +16 -7
  478. package/dist/plugins/remote-env-e2b.d.ts +7 -25
  479. package/dist/plugins/remote-env-e2b.js +34 -25
  480. package/dist/plugins/remote-env-host.d.ts +2 -9
  481. package/dist/plugins/remote-env-host.js +34 -22
  482. package/dist/plugins/remote-env-k8s.d.ts +40 -45
  483. package/dist/plugins/remote-env-k8s.js +107 -58
  484. package/dist/plugins/remote-env-local-docker.d.ts +148 -14
  485. package/dist/plugins/remote-env-local-docker.js +367 -72
  486. package/dist/plugins/remote-scratchpad.js +4 -0
  487. package/dist/plugins/retention-deployment.d.ts +49 -17
  488. package/dist/plugins/retention-deployment.js +39 -8
  489. package/dist/plugins/run-preview-m45.d.ts +11 -0
  490. package/dist/plugins/run-preview-m45.js +19 -0
  491. package/dist/plugins/run-store-sql.d.ts +56 -68
  492. package/dist/plugins/run-store-sql.js +127 -116
  493. package/dist/plugins/s3-answer.d.ts +2 -1
  494. package/dist/plugins/sandbox-reaper.d.ts +26 -0
  495. package/dist/plugins/sandbox-reaper.js +2 -0
  496. package/dist/plugins/scenario-prefix-switch-m42.d.ts +54 -0
  497. package/dist/plugins/scenario-prefix-switch-m42.js +55 -0
  498. package/dist/plugins/scheduler-support.d.ts +16 -1
  499. package/dist/plugins/scheduler-support.js +22 -2
  500. package/dist/plugins/schema-consistency.d.ts +42 -9
  501. package/dist/plugins/schema-consistency.js +212 -11
  502. package/dist/plugins/schema-drift-sentence.d.ts +4 -1
  503. package/dist/plugins/schema-drift-sentence.js +4 -4
  504. package/dist/plugins/schema-ensure-legs.d.ts +9 -0
  505. package/dist/plugins/schema-ensure-legs.js +1 -1
  506. package/dist/plugins/schema-indexes.js +3 -0
  507. package/dist/plugins/schema-live-columns.d.ts +14 -5
  508. package/dist/plugins/schema-live-columns.js +10 -10
  509. package/dist/plugins/send-user-file.js +2 -1
  510. package/dist/plugins/session-birth.d.ts +37 -0
  511. package/dist/plugins/session-birth.js +38 -0
  512. package/dist/plugins/session-epoch-anchor.d.ts +40 -12
  513. package/dist/plugins/session-epoch-anchor.js +33 -11
  514. package/dist/plugins/session-ext-table.d.ts +27 -3
  515. package/dist/plugins/session-ext-table.js +19 -6
  516. package/dist/plugins/session-fork.d.ts +15 -1
  517. package/dist/plugins/session-fork.js +3 -0
  518. package/dist/plugins/session-ownership.d.ts +1 -1
  519. package/dist/plugins/session-placement.d.ts +22 -16
  520. package/dist/plugins/session-placement.js +15 -12
  521. package/dist/plugins/session-row-sql.d.ts +12 -0
  522. package/dist/plugins/session-row-sql.js +3 -3
  523. package/dist/plugins/session-run-rollup.d.ts +29 -0
  524. package/dist/plugins/session-run-rollup.js +40 -0
  525. package/dist/plugins/session-store-sql.d.ts +38 -12
  526. package/dist/plugins/session-store-sql.js +130 -30
  527. package/dist/plugins/session-withdraw-sql.d.ts +36 -0
  528. package/dist/plugins/session-withdraw-sql.js +42 -0
  529. package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
  530. package/dist/plugins/shared-memory-store-sql.js +2 -1
  531. package/dist/plugins/shell-sentinel-owner-m48.d.ts +20 -0
  532. package/dist/plugins/shell-sentinel-owner-m48.js +3 -0
  533. package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
  534. package/dist/plugins/sql-driver.d.ts +1 -1
  535. package/dist/plugins/sql-driver.js +2 -1
  536. package/dist/plugins/sql-errors.d.ts +32 -5
  537. package/dist/plugins/sql-errors.js +55 -7
  538. package/dist/plugins/sql-json-column.d.ts +8 -7
  539. package/dist/plugins/sql-json-column.js +10 -6
  540. package/dist/plugins/store-backend.d.ts +84 -15
  541. package/dist/plugins/store-backend.js +186 -55
  542. package/dist/plugins/store-contracts.d.ts +90 -30
  543. package/dist/plugins/store-contracts.js +22 -1
  544. package/dist/plugins/store-fault.d.ts +28 -2
  545. package/dist/plugins/store-fault.js +20 -2
  546. package/dist/plugins/task-attachment-store.d.ts +15 -3
  547. package/dist/plugins/task-attachment-store.js +22 -9
  548. package/dist/plugins/tidb-pool.js +23 -8
  549. package/dist/plugins/web-search.js +5 -3
  550. package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
  551. package/dist/plugins/workflow-run-store-sql.js +11 -5
  552. package/dist/principal-jwt.d.ts +4 -4
  553. package/dist/principal-jwt.js +20 -5
  554. package/dist/principal-shape.d.ts +41 -0
  555. package/dist/principal-shape.js +19 -0
  556. package/dist/question.d.ts +13 -23
  557. package/dist/question.js +21 -39
  558. package/dist/request-declaration-refusal.d.ts +35 -12
  559. package/dist/request-declaration-refusal.js +21 -9
  560. package/dist/request-form.d.ts +58 -0
  561. package/dist/request-form.js +72 -0
  562. package/dist/request-image-urls.d.ts +8 -2
  563. package/dist/request-image-urls.js +2 -1
  564. package/dist/request-images.d.ts +20 -0
  565. package/dist/request-images.js +59 -0
  566. package/dist/request-key-closure.d.ts +6 -7
  567. package/dist/request-key-closure.js +15 -2
  568. package/dist/resource-suspend.d.ts +7 -16
  569. package/dist/resource-suspend.js +1 -1
  570. package/dist/retired-name-host-notice.d.ts +21 -0
  571. package/dist/retired-name-host-notice.js +12 -0
  572. package/dist/rule-entry-list.d.ts +2 -2
  573. package/dist/rule-entry-list.js +3 -4
  574. package/dist/rule-issue-reading.d.ts +58 -0
  575. package/dist/rule-issue-reading.js +14 -0
  576. package/dist/rules-consent.d.ts +5 -3
  577. package/dist/rules-consent.js +1 -0
  578. package/dist/run-acceptance.d.ts +3 -1
  579. package/dist/run-acceptance.js +3 -0
  580. package/dist/run-local.d.ts +14 -6
  581. package/dist/run-local.js +92 -80
  582. package/dist/run-stale-default.d.ts +7 -0
  583. package/dist/run-stale-default.js +2 -0
  584. package/dist/runs.d.ts +26 -15
  585. package/dist/runs.js +39 -27
  586. package/dist/runtime-caps-resolver.d.ts +21 -6
  587. package/dist/runtime-caps-resolver.js +17 -4
  588. package/dist/runtime-governance.d.ts +2 -2
  589. package/dist/runtime-governance.js +5 -3
  590. package/dist/sealed-key-layout.d.ts +12 -5
  591. package/dist/sealed-key-layout.js +5 -0
  592. package/dist/sealed-key.d.ts +12 -2
  593. package/dist/sealed-key.js +115 -27
  594. package/dist/security.d.ts +128 -158
  595. package/dist/security.js +163 -59
  596. package/dist/sema-config-dir.d.ts +20 -0
  597. package/dist/sema-config-dir.js +25 -0
  598. package/dist/server-secret-env.d.ts +21 -5
  599. package/dist/server-secret-env.js +14 -4
  600. package/dist/session-children-retire.d.ts +7 -5
  601. package/dist/session-children-retire.js +7 -2
  602. package/dist/session-deletion.d.ts +88 -0
  603. package/dist/session-deletion.js +8 -0
  604. package/dist/session-erase.d.ts +145 -0
  605. package/dist/session-erase.js +115 -0
  606. package/dist/session-error-wire.d.ts +5 -5
  607. package/dist/session-error-wire.js +1 -1
  608. package/dist/session-incarnation.d.ts +52 -5
  609. package/dist/session-incarnation.js +19 -2
  610. package/dist/session-policy-wire.d.ts +6 -3
  611. package/dist/session-policy-wire.js +11 -1
  612. package/dist/session-resident-background.d.ts +0 -71
  613. package/dist/session-resident-background.js +4 -3
  614. package/dist/session-row.d.ts +2 -1
  615. package/dist/session-rules-seat.d.ts +12 -0
  616. package/dist/session-rules-seat.js +19 -0
  617. package/dist/session-titler.d.ts +7 -15
  618. package/dist/session-titler.js +1 -1
  619. package/dist/spec-fields.d.ts +57 -3
  620. package/dist/spec-fields.js +72 -51
  621. package/dist/store-posture.d.ts +136 -20
  622. package/dist/store-posture.js +188 -3
  623. package/dist/stored-request-hooks-m20.js +2 -2
  624. package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
  625. package/dist/stores-sql/background-agent-store-sql.js +73 -20
  626. package/dist/stores-sql/checkpoint-store-sql.d.ts +33 -28
  627. package/dist/stores-sql/checkpoint-store-sql.js +75 -44
  628. package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
  629. package/dist/stores-sql/mailbox-store-sql.js +31 -32
  630. package/dist/stores-sql/pg-session-storage.d.ts +7 -5
  631. package/dist/stores-sql/pg-session-storage.js +54 -46
  632. package/dist/stores-sql/retention-store-sql.d.ts +87 -19
  633. package/dist/stores-sql/retention-store-sql.js +92 -27
  634. package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
  635. package/dist/stores-sql/session-policy-store-sql.js +44 -36
  636. package/dist/stores-sql/session-write-hooks.d.ts +12 -6
  637. package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
  638. package/dist/stores-sql/tidb-session-storage.js +13 -8
  639. package/dist/stores-sql/tidb-session-store.d.ts +36 -17
  640. package/dist/stores-sql/tidb-session-store.js +69 -39
  641. package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
  642. package/dist/stores-sql/windowed-session-storage.js +9 -0
  643. package/dist/submission-exit.d.ts +50 -0
  644. package/dist/submission-exit.js +108 -0
  645. package/dist/task-a2a.d.ts +1 -1
  646. package/dist/task-a2a.js +3 -3
  647. package/dist/task-cwd.d.ts +20 -0
  648. package/dist/task-cwd.js +8 -0
  649. package/dist/task-mcp.d.ts +1 -1
  650. package/dist/task-mcp.js +3 -3
  651. package/dist/task-settings.d.ts +14 -10
  652. package/dist/task-settings.js +18 -7
  653. package/dist/terminal.d.ts +25 -43
  654. package/dist/terminal.js +31 -11
  655. package/dist/tool-approval.d.ts +131 -129
  656. package/dist/tool-approval.js +189 -193
  657. package/dist/trace/core-keyset-guard.d.ts +13 -6
  658. package/dist/trace/core-vocab-wire.d.ts +95 -0
  659. package/dist/trace/core-vocab-wire.js +15 -0
  660. package/dist/trace/exit-seat.d.ts +30 -4
  661. package/dist/trace/exit-seat.js +40 -36
  662. package/dist/trace/extension-call-face.d.ts +3 -2
  663. package/dist/trace/extension-call-face.js +3 -1
  664. package/dist/trace/ledger-events.d.ts +4 -7
  665. package/dist/trace/ledger-sink.d.ts +1 -30
  666. package/dist/trace/ledger-sink.js +0 -11
  667. package/dist/trace/model-segment.d.ts +5 -5
  668. package/dist/trace/model-segment.js +5 -5
  669. package/dist/trace/project.d.ts +55 -42
  670. package/dist/trace/project.js +52 -19
  671. package/dist/trace/redact.d.ts +123 -27
  672. package/dist/trace/redact.js +880 -260
  673. package/dist/trace/self-minted-wire.d.ts +487 -19
  674. package/dist/trace/self-minted-wire.js +172 -23
  675. package/dist/trace/wire-projection-faces.d.ts +5 -6
  676. package/dist/trace/wire-projection-faces.js +2 -2
  677. package/dist/upstream-body.d.ts +23 -0
  678. package/dist/upstream-body.js +16 -0
  679. package/dist/url-refusal.d.ts +3 -3
  680. package/dist/url-refusal.js +11 -4
  681. package/dist/user-authored-text.d.ts +1 -1
  682. package/dist/user-input-ledger.d.ts +7 -8
  683. package/dist/user-input-ledger.js +1 -1
  684. package/dist/web-admin-client/apply-effective.d.ts +6 -3
  685. package/dist/web-admin-client/apply-effective.js +13 -16
  686. package/dist/web-admin-client/apply-ledger.d.ts +16 -7
  687. package/dist/web-admin-client/apply-ledger.js +5 -2
  688. package/dist/web-admin-client/center-request.d.ts +2 -2
  689. package/dist/web-admin-client/center-request.js +15 -15
  690. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  691. package/dist/web-admin-client/effective-keys.js +1 -1
  692. package/dist/web-admin-client/entry-metadata.d.ts +8 -0
  693. package/dist/web-admin-client/entry-metadata.js +13 -0
  694. package/dist/web-admin-client/http-client.d.ts +1 -1
  695. package/dist/web-admin-client/http-client.js +23 -4
  696. package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
  697. package/dist/web-admin-client/mcp-revocation.js +2 -1
  698. package/dist/web-admin-client/read-warnings.d.ts +1 -0
  699. package/dist/web-admin-client/read-warnings.js +1 -0
  700. package/dist/web-admin-client/restart-signal.js +8 -4
  701. package/dist/web-admin-client/skills-mcp.d.ts +2 -2
  702. package/dist/web-admin-client/types.d.ts +1 -2
  703. package/dist/workspace-space.d.ts +3 -2
  704. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
  705. package/package.json +6 -3
  706. package/scripts/drain-check-local.mjs +118 -147
  707. package/scripts/drain-check.mysql.sql +22 -2
  708. package/scripts/drain-check.pg.sql +22 -2
  709. package/wire-changes/server@7.148.0.json +1517 -0
  710. package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
  711. package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
  712. package/dist/http/memory-layer-reply.d.ts +0 -30
  713. package/dist/http/memory-layer-reply.js +0 -24
  714. package/dist/lsp/e2b-bridge.d.ts +0 -57
  715. package/dist/lsp/e2b-bridge.js +0 -139
  716. package/dist/lsp/e2b-manager.d.ts +0 -93
  717. package/dist/lsp/e2b-manager.js +0 -178
  718. package/dist/lsp/lsp-frames.d.ts +0 -14
  719. package/dist/lsp/lsp-frames.js +0 -25
  720. package/dist/lsp/manager.d.ts +0 -129
  721. package/dist/lsp/manager.js +0 -127
  722. package/dist/lsp/types.d.ts +0 -12
  723. package/dist/lsp/types.js +0 -2
  724. package/dist/lsp/ws-transport.d.ts +0 -40
  725. package/dist/lsp/ws-transport.js +0 -210
@@ -1,28 +1,29 @@
1
1
  import { SessionError, materializeA2aTools, materializeMcpTools, sanitizePathComponent } from "@sema-agent/core";
2
2
  import { a2aForScenario, mcpForScenario } from "../../web-admin-client/facade.js";
3
- import { HttpError, isUuidShape, legacyUnownedSessionOk, sessionOwnerCellOf } from "../../security.js";
3
+ import { HttpError, isUuidShape } from "../../security.js";
4
4
  import { windowMessages, truncateMessageBlobs, redactSessionViewForRead } from "../../audit.js";
5
5
  import { redactSecrets } from "../../trace/redact.js";
6
6
  import { seatText } from "../../trace/exit-seat.js";
7
7
  import { recordFailOpen } from "../../observability/fail-open.js";
8
8
  import { MCP_DIAL_DEADLINE_MS, raceDeadline } from "../mcp-dial-deadline.js";
9
9
  import { sentMemoryComplianceFailure } from "../memory-compliance-failure-reply.js";
10
- import { readLayerSeat, sentMemoryLayerRefusal } from "../memory-layer-reply.js";
10
+ import { readLayerSeat, sentMemoryFaceFault } from "../memory-face-fault-reply.js";
11
11
  import { DEPLOYMENT_SHAPE_PREDICATES } from "../../deployment-shape.js";
12
12
  import { MAX_SETTINGS_OUTPUT_STYLE_CHARS, MAX_SETTINGS_ENV_VARS, MAX_SETTINGS_ENV_KEY_CHARS, MAX_SETTINGS_ENV_VALUE_CHARS } from "../../task-settings.js";
13
13
  import { readWritableSessionPermissionRules } from "../../session-policy-wire.js";
14
14
  import { sendJson, sendError, sendSessionError, sendSessionPolicyError, sseHeaders, httpErrorBody } from "../send.js";
15
- import { fleetViewOf, gatedPrincipal, explicitOperatorOk, sessionCallerOf, sessionOwnerReadable, sendPrincipalRefusal, sendUnauthorized } from "../principal-gate.js";
15
+ import { gatedPerson, gatedSubject, sendPrincipalRefusal } from "../principal-gate.js";
16
+ import { personOf } from "../../owner-brands.js";
16
17
  import { headReadOf, leafOfAdmittedHead, sessionFaceOfHead } from "../../session-incarnation.js";
17
- import { foldOwnerUnreadable, readOwnedSessionHead, runRowReadableOnSessionFace } from "../owner-access.js";
18
- import { assertNever, SESSION_NOT_FOUND_MESSAGE } from "../route-ctx.js";
18
+ import { admitSessionById, admitSessionRow, admittedAsFleet, callerEntry, callerOf, deliverVerdict, enter, judgeSessionRow, protocolEntry, readOwnerCell, refuse, seesRun, sessionRowPresent } from "../owner-access.js";
19
+ import { assertNever } from "../route-ctx.js";
19
20
  import * as facts from "../../capability-facts.js";
20
21
  import { rosterAgentId } from "./agents-roster.js";
21
22
  import { projectSessionListRow } from "./sessions-list.js";
22
23
  import { readSessionRowPatch } from "../../session-row.js";
23
24
  import { forkPathOf, resolveExecutionContext } from "../execution-context.js";
24
25
  import { executionPlacementView } from "../../execution-placement.js";
25
- import { resolveHistoryAnchor } from "../../history-anchor.js";
26
+ import { anchorReaderOf, resolveHistoryAnchor } from "../../history-anchor.js";
26
27
  import { engineRefusalAnswerOf } from "../engine-refusal.js";
27
28
  import { buildRewindFilesReply } from "../rewind-files-reply.js";
28
29
  import { ForkTargetUnsettledError, forkKeyOf } from "../../plugins/session-fork.js";
@@ -45,11 +46,11 @@ export function createSessionsLocal() {
45
46
  memoryStatusCache: new Map(),
46
47
  };
47
48
  }
48
- async function lastLegMcpFor(deps, sessionId, caller) {
49
+ async function lastLegMcpFor(deps, sessionId, entry) {
49
50
  let timer;
50
51
  try {
51
52
  return await Promise.race([
52
- readLastLegMcp(deps, sessionId, caller),
53
+ readLastLegMcp(deps, sessionId, entry),
53
54
  new Promise((r) => { timer = setTimeout(() => { recordFailOpen("server.mcp-panel.last-leg-unreadable", `ledger read exceeded ${LAST_LEG_LEDGER_TIMEOUT_MS}ms`); r(undefined); }, LAST_LEG_LEDGER_TIMEOUT_MS); }),
54
55
  ]);
55
56
  }
@@ -62,14 +63,14 @@ async function lastLegMcpFor(deps, sessionId, caller) {
62
63
  clearTimeout(timer);
63
64
  }
64
65
  }
65
- async function readLastLegMcp(deps, sessionId, caller) {
66
+ async function readLastLegMcp(deps, sessionId, entry) {
66
67
  const runStore = deps.runStore;
67
68
  if (!runStore || sessionId === null)
68
69
  return undefined;
69
70
  const latest = await runStore.latestRunForSession(sessionId);
70
71
  if (latest === undefined)
71
72
  return undefined;
72
- if (!runRowReadableOnSessionFace(deps, caller, latest.owner, "owner_or_operator"))
73
+ if (!seesRun(entry, latest.owner))
73
74
  return undefined;
74
75
  const events = await runStore.getEvents(latest.taskId, 0);
75
76
  for (let i = events.length - 1; i >= 0; i--) {
@@ -85,16 +86,12 @@ async function readLastLegMcp(deps, sessionId, caller) {
85
86
  }
86
87
  export async function handleSessions(req, res, match, ctx) {
87
88
  const { deps } = ctx;
88
- const { readJson, safeDecode, sessionOwnerOk } = ctx.helpers;
89
- const readOwnedSessionView = async (sessionAudit, sessionId, readOpts) => {
89
+ const { readJson, safeDecode } = ctx.helpers;
90
+ const readOwnedSessionView = async (entry, sessionAudit, sessionId, readOpts) => {
90
91
  const headOf = headReadOf(deps.sessionStorage);
91
92
  if (headOf !== undefined) {
92
- const owner = (await foldOwnerUnreadable(deps.logger, match.decl.id, sessionId, () => headOf(sessionId)))?.owner;
93
- if (owner === undefined) {
94
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
95
- return undefined;
96
- }
97
- if (!sessionOwnerOk(req, res, await sessionOwnerCellOf(deps.sessionStorage, sessionId, owner)))
93
+ const head = await readOwnerCell(entry, sessionId, () => headOf(sessionId));
94
+ if ((await admitSessionRow(entry, res, deps.sessionStorage, sessionId, head)) === undefined)
98
95
  return undefined;
99
96
  }
100
97
  let audit;
@@ -106,11 +103,7 @@ export async function handleSessions(req, res, match, ctx) {
106
103
  throw e;
107
104
  throw new Error(`session view read failed before ownership could be established: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
108
105
  }
109
- if (!audit) {
110
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
111
- return undefined;
112
- }
113
- if (!sessionOwnerOk(req, res, await sessionOwnerCellOf(deps.sessionStorage, sessionId, audit.owner)))
106
+ if ((await admitSessionRow(entry, res, deps.sessionStorage, sessionId, audit)) === undefined)
114
107
  return undefined;
115
108
  return audit;
116
109
  };
@@ -118,7 +111,7 @@ export async function handleSessions(req, res, match, ctx) {
118
111
  const { mcpStatusCache, a2aStatusCache } = ctx.local.sessions;
119
112
  {
120
113
  if (match.decl.id === "session-init") {
121
- const principal = gatedPrincipal(req, deps.config);
114
+ const principal = gatedSubject(req, deps.config);
122
115
  if (deps.config.requirePrincipal && !principal) {
123
116
  sendPrincipalRefusal(res, req, deps.config);
124
117
  return;
@@ -133,7 +126,7 @@ export async function handleSessions(req, res, match, ctx) {
133
126
  }
134
127
  {
135
128
  if (match.decl.id === "session-settings") {
136
- const principal = gatedPrincipal(req, deps.config);
129
+ const principal = gatedSubject(req, deps.config);
137
130
  if (deps.config.requirePrincipal && !principal) {
138
131
  sendPrincipalRefusal(res, req, deps.config);
139
132
  return;
@@ -153,13 +146,13 @@ export async function handleSessions(req, res, match, ctx) {
153
146
  }
154
147
  {
155
148
  if (match.decl.id === "session-mcp") {
156
- const caller = sessionCallerOf(req, deps);
157
- const principal = caller.principal;
149
+ const caller = callerOf(req, deps);
150
+ const principal = caller.subject === undefined ? undefined : personOf(caller.subject);
158
151
  if (deps.config.requirePrincipal && !principal) {
159
152
  sendPrincipalRefusal(res, req, deps.config);
160
153
  return;
161
154
  }
162
- const lastLegMcp = await lastLegMcpFor(deps, safeDecode(match.params.sessionId), caller);
155
+ const lastLegMcp = await lastLegMcpFor(deps, safeDecode(match.params.sessionId), protocolEntry(req, deps, "run.panel", caller));
163
156
  const ledgerHalf = lastLegMcp === undefined ? {} : { lastLegMcp };
164
157
  let scenarioName;
165
158
  try {
@@ -215,7 +208,7 @@ export async function handleSessions(req, res, match, ctx) {
215
208
  }
216
209
  {
217
210
  if (match.decl.id === "session-a2a") {
218
- const principal = gatedPrincipal(req, deps.config);
211
+ const principal = gatedPerson(req, deps.config);
219
212
  if (deps.config.requirePrincipal && !principal) {
220
213
  sendPrincipalRefusal(res, req, deps.config);
221
214
  return;
@@ -279,14 +272,12 @@ export async function handleSessions(req, res, match, ctx) {
279
272
  sendError(res, 400, "request.path_malformed", "session id segment is not valid percent-encoding");
280
273
  return;
281
274
  }
282
- const head = await foldOwnerUnreadable(deps.logger, match.decl.id, headSession, () => headOf(headSession));
283
- if (head === undefined) {
284
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
275
+ const headEntry = callerEntry(req, deps, match.decl.id);
276
+ const headRead = await readOwnerCell(headEntry, headSession, () => headOf(headSession));
277
+ const admittedHead = await admitSessionRow(headEntry, res, deps.sessionStorage, headSession, headRead);
278
+ if (admittedHead === undefined)
285
279
  return;
286
- }
287
- if (!sessionOwnerOk(req, res, await sessionOwnerCellOf(deps.sessionStorage, headSession, head.owner)))
288
- return;
289
- const leafId = leafOfAdmittedHead(head);
280
+ const leafId = leafOfAdmittedHead(admittedHead.row);
290
281
  const etag = `"${leafId ?? "empty"}"`;
291
282
  if (req.headers["if-none-match"] === etag) {
292
283
  res.writeHead(304, { etag }).end();
@@ -309,14 +300,12 @@ export async function handleSessions(req, res, match, ctx) {
309
300
  sendError(res, 400, "request.path_malformed", "session id segment is not valid percent-encoding");
310
301
  return;
311
302
  }
312
- const reading = await foldOwnerUnreadable(deps.logger, match.decl.id, placementSession, () => placementFact.seat.read(placementSession));
313
- if (reading === undefined) {
314
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
315
- return;
316
- }
317
- if (!explicitOperatorOk(gatedPrincipal(req, deps.config), deps.config) && !sessionOwnerOk(req, res, await sessionOwnerCellOf(deps.sessionStorage, placementSession, reading.occupant.owner)))
303
+ const placementEntry = callerEntry(req, deps, match.decl.id);
304
+ const reading = await readOwnerCell(placementEntry, placementSession, () => placementFact.seat.read(placementSession));
305
+ const admittedPlacement = await admitSessionRow(placementEntry, res, deps.sessionStorage, placementSession, reading === undefined ? undefined : { owner: reading.occupant.owner, cell: reading.cell });
306
+ if (admittedPlacement === undefined)
318
307
  return;
319
- sendJson(res, 200, executionPlacementView(reading.cell));
308
+ sendJson(res, 200, executionPlacementView(admittedPlacement.row.cell));
320
309
  return;
321
310
  }
322
311
  }
@@ -327,7 +316,8 @@ export async function handleSessions(req, res, match, ctx) {
327
316
  sendError(res, 501, "capability.session_store_required", "session events require a durable session store (DB_BACKEND=mysql|pg|local)");
328
317
  return;
329
318
  }
330
- const readHead = (id) => foldOwnerUnreadable(deps.logger, match.decl.id, id, () => evFact.sessionStorage.headOf(id));
319
+ const evEntry = callerEntry(req, deps, match.decl.id);
320
+ const readHead = (id) => readOwnerCell(evEntry, id, () => evFact.sessionStorage.headOf(id));
331
321
  const readOwner = async (id) => (await readHead(id))?.owner;
332
322
  const watch = evFact.watch;
333
323
  const evSession = safeDecode(match.params.sessionId);
@@ -364,7 +354,7 @@ export async function handleSessions(req, res, match, ctx) {
364
354
  return;
365
355
  }
366
356
  sse.sseOwnerLookups++;
367
- const admissionP = readHead(evSession).then(async (head) => (head === undefined ? undefined : { head, cell: await sessionOwnerCellOf(evFact.sessionStorage, evSession, head.owner) }));
357
+ const admissionP = readHead(evSession).then(async (head) => (!sessionRowPresent(head) ? undefined : { head, verdict: await judgeSessionRow(evEntry, evFact.sessionStorage, evSession, head) }));
368
358
  void admissionP.catch(() => undefined).then(() => { sse.sseOwnerLookups--; });
369
359
  let stallTimer;
370
360
  let admission;
@@ -388,15 +378,15 @@ export async function handleSessions(req, res, match, ctx) {
388
378
  }
389
379
  if (admission === undefined) {
390
380
  cleanup();
391
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
381
+ refuse(evEntry, res, "missing");
392
382
  return;
393
383
  }
394
- if (!sessionOwnerOk(req, res, admission.cell)) {
384
+ if (deliverVerdict(evEntry, res, admission.verdict) === undefined) {
395
385
  cleanup();
396
386
  return;
397
387
  }
398
388
  leafOfAdmittedHead(admission.head);
399
- const owner = admission.cell.owner;
389
+ const owner = admission.head.owner;
400
390
  const q = new URLSearchParams(match.search);
401
391
  const lastLeafId = q.get("lastLeafId");
402
392
  let first = true;
@@ -525,16 +515,15 @@ export async function handleSessions(req, res, match, ctx) {
525
515
  sendError(res, 400, "request.path_malformed", "session id segment is not valid percent-encoding");
526
516
  return;
527
517
  }
528
- if (deps.config.requirePrincipal && !gatedPrincipal(req, deps.config)) {
529
- sendPrincipalRefusal(res, req, deps.config);
518
+ const entry = enter(req, res, deps, match.decl.id);
519
+ if (entry === undefined)
530
520
  return;
531
- }
532
521
  const auditFact = facts.sessionAuditView(deps);
533
522
  if (!auditFact.available) {
534
523
  sendError(res, 501, "capability.memory_engine_required", "memory provenance and erasure are not available on this deployment — they require a wired memory engine (MEMORY_ENGINE=on) whose backend owns the engine control plane (controlPlaneRoot); the file memory backend does, the pg/mysql memory backends do not (their control plane would land on a replica's local disk)");
535
524
  return;
536
525
  }
537
- if ((await readOwnedSessionView(auditFact.sessionAudit, sessionId)) === undefined)
526
+ if ((await readOwnedSessionView(entry, auditFact.sessionAudit, sessionId)) === undefined)
538
527
  return;
539
528
  const faces = deps.memoryCompliance;
540
529
  if (faces === undefined) {
@@ -568,7 +557,9 @@ export async function handleSessions(req, res, match, ctx) {
568
557
  sendJson(res, 200, await faces.erase(input));
569
558
  }
570
559
  catch (err) {
571
- if (sentMemoryComplianceFailure(res, err, { kind: "session_owner", withheld }, deps.logger))
560
+ if (sentMemoryFaceFault(res, err, { kind: "session_owner", face: "erase", withheld }))
561
+ return;
562
+ if (sentMemoryComplianceFailure(res, err, { kind: "session_owner", face: "erase", withheld }, deps.logger))
572
563
  return;
573
564
  deps.logger?.warn?.("session_memory_erase_failed", { sessionId, err: String(err) });
574
565
  sendError(res, 500, "internal.error", "session memory erasure failed");
@@ -583,16 +574,15 @@ export async function handleSessions(req, res, match, ctx) {
583
574
  sendError(res, 400, "request.path_malformed", "session id segment is not valid percent-encoding");
584
575
  return;
585
576
  }
586
- if (deps.config.requirePrincipal && !gatedPrincipal(req, deps.config)) {
587
- sendPrincipalRefusal(res, req, deps.config);
577
+ const entry = enter(req, res, deps, match.decl.id);
578
+ if (entry === undefined)
588
579
  return;
589
- }
590
580
  const auditFact = facts.sessionAuditView(deps);
591
581
  if (!auditFact.available) {
592
582
  sendError(res, 501, "capability.memory_engine_required", "session memory status is not available on this deployment — it requires a wired memory engine (MEMORY_ENGINE=on) whose backend owns the engine control plane (controlPlaneRoot); the file memory backend does, the pg/mysql memory backends do not (their control plane would land on a replica's local disk)");
593
583
  return;
594
584
  }
595
- if ((await readOwnedSessionView(auditFact.sessionAudit, sessionId)) === undefined)
585
+ if ((await readOwnedSessionView(entry, auditFact.sessionAudit, sessionId)) === undefined)
596
586
  return;
597
587
  const face = deps.sessionMemoryStatus;
598
588
  if (face === undefined) {
@@ -636,7 +626,7 @@ export async function handleSessions(req, res, match, ctx) {
636
626
  });
637
627
  }
638
628
  catch (err) {
639
- if (sentMemoryLayerRefusal(res, err, { kind: "session_owner", withheld: (message) => deps.logger?.warn?.("session_memory_status_refused", { sessionId, err: message }) }))
629
+ if (sentMemoryFaceFault(res, err, { kind: "session_owner", face: "status", withheld: (message) => deps.logger?.warn?.("session_memory_status_refused", { sessionId, err: message }) }))
640
630
  return;
641
631
  deps.logger?.warn?.("session_memory_status_failed", { sessionId, err: String(err) });
642
632
  sendError(res, 500, "internal.error", "session memory status read failed");
@@ -651,7 +641,8 @@ export async function handleSessions(req, res, match, ctx) {
651
641
  sendError(res, 501, "capability.session_store_required", "the session audit view requires a durable session store (DB_BACKEND=mysql|pg|local)");
652
642
  return;
653
643
  }
654
- const owned = await readOwnedSessionView(auditFact.sessionAudit, match.params.sessionId, { reader: gatedPrincipal(req, deps.config) ?? null });
644
+ const viewEntry = callerEntry(req, deps, match.decl.id);
645
+ const owned = await readOwnedSessionView(viewEntry, auditFact.sessionAudit, match.params.sessionId, { reader: viewEntry.caller.subject ?? null });
655
646
  if (owned === undefined)
656
647
  return;
657
648
  if (!Array.isArray(owned.messages)) {
@@ -714,13 +705,14 @@ export async function handleSessions(req, res, match, ctx) {
714
705
  }
715
706
  const store = rowFact.sessionStorage;
716
707
  const sessionId = match.params.sessionId;
708
+ const patchEntry = callerEntry(req, deps, match.decl.id);
717
709
  const head = await store.headOf(sessionId);
718
710
  if (head === undefined) {
719
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
711
+ refuse(patchEntry, res, "missing");
720
712
  return;
721
713
  }
722
714
  const face = sessionFaceOfHead(sessionId, head);
723
- if (!sessionOwnerOk(req, res, await sessionOwnerCellOf(store, sessionId, face.owner)))
715
+ if ((await admitSessionRow(patchEntry, res, store, sessionId, face)) === undefined)
724
716
  return;
725
717
  leafOfAdmittedHead(head);
726
718
  const read = readSessionRowPatch(await readJson(req));
@@ -740,7 +732,7 @@ export async function handleSessions(req, res, match, ctx) {
740
732
  sendError(res, 409, "conflict.session_mirror", "this session is a read-only mirror of a session whose writer is elsewhere — it cannot be renamed or pinned here; fork it (forkPath) to continue here; nothing was written", { forkPath: forkPathOf(sessionId) });
741
733
  return;
742
734
  case "absent":
743
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
735
+ refuse(patchEntry, res, "missing");
744
736
  return;
745
737
  default: {
746
738
  const unknownOutcome = outcome;
@@ -782,29 +774,25 @@ export async function handleSessions(req, res, match, ctx) {
782
774
  sendError(res, 400, "request.id_invalid", "invalid session id (must be a canonical uuid)");
783
775
  return;
784
776
  }
785
- const caller = sessionCallerOf(req, deps);
786
- if (DEPLOYMENT_SHAPE_PREDICATES.principalRequired.holds(deps.config) && caller.principal === undefined) {
787
- sendPrincipalRefusal(res, req, deps.config);
777
+ const rewindEntry = enter(req, res, deps, match.decl.id);
778
+ if (rewindEntry === undefined)
788
779
  return;
789
- }
790
- const owned = await readOwnedSessionHead(deps, sessionStorage, caller, sessionId, "owner_or_operator");
791
- if (owned === undefined) {
792
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
780
+ const owned = await admitSessionById(rewindEntry, res, sessionStorage, sessionId);
781
+ if (owned === undefined)
793
782
  return;
794
- }
795
- const sessionOwner = owned.head.owner;
796
- leafOfAdmittedHead(owned.head);
783
+ const sessionOwner = owned.row.owner;
784
+ leafOfAdmittedHead(owned.row);
797
785
  const read = readRewindFilesBody(await readJson(req));
798
786
  if (read.kind === "refused") {
799
787
  sendError(res, 400, read.errorCode, read.message);
800
788
  return;
801
789
  }
802
- const execution = await resolveExecutionContext(deps, { kind: "continuation", root: sessionId, principal: sessionOwner ?? undefined });
790
+ const execution = await resolveExecutionContext(deps, { kind: "continuation", root: sessionId, principal: sessionOwner === null || sessionOwner === undefined ? undefined : personOf(sessionOwner) });
803
791
  if (execution.lane === "host" && (await presentHostWorkspaceOf(deps.perSessionCwd?.get(sessionId))) === undefined) {
804
792
  sendError(res, 409, "conflict.session_workspace_unknown", "this server process does not know a working directory for this session that it can rewind into (no prompt carrying its cwd has been submitted since the server started, or the directory that prompt named no longer exists), so nothing was rewound; submit a prompt with its cwd first, then rewind");
805
793
  return;
806
794
  }
807
- const entryId = await resolveHistoryAnchor("rewindFilesTo", anchors, sessionId, read.to, sessionOwner, "to");
795
+ const entryId = await resolveHistoryAnchor("rewindFilesTo", anchors, anchorReaderOf(req, deps, rewindEntry.caller), sessionId, read.to, sessionOwner, "to");
808
796
  const activeTaskId = await deps.runStore?.getActiveTaskId(sessionId);
809
797
  if (activeTaskId) {
810
798
  sendError(res, 409, "conflict.session_active_run", `session has an active run (${activeTaskId}); its files cannot be rewound under it — wait for that run to end (or cancel it), then rewind`, { activeTaskId });
@@ -832,27 +820,19 @@ export async function handleSessions(req, res, match, ctx) {
832
820
  return;
833
821
  }
834
822
  const fork = forkFact.sessionStorage.fork.bind(forkFact.sessionStorage);
835
- const readOwner = async (id) => (await forkFact.sessionStorage.headOf(id))?.owner;
836
- const scope = fleetViewOf(req, deps, "write");
837
- if (!scope.fleetWide && scope.gateOwner === null) {
838
- sendUnauthorized(res, "identity");
823
+ const forkEntry = enter(req, res, deps, match.decl.id);
824
+ if (forkEntry === undefined)
839
825
  return;
840
- }
841
826
  const sourceId = safeDecode(match.params.sessionId);
842
827
  if (sourceId === null || !isUuidShape(sourceId)) {
843
828
  sendError(res, 400, "request.id_invalid", "invalid session id (must be a canonical uuid)");
844
829
  return;
845
830
  }
846
- const owner = await readOwner(sourceId);
847
- if (owner === undefined) {
848
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
831
+ const forkAdmitted = await admitSessionById(forkEntry, res, forkFact.sessionStorage, sourceId);
832
+ if (forkAdmitted === undefined)
849
833
  return;
850
- }
851
- if (!scope.fleetWide && owner !== scope.gateOwner && !legacyUnownedSessionOk(deps.config, sessionCallerOf(req, deps), await sessionOwnerCellOf(forkFact.sessionStorage, sourceId, owner))) {
852
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
853
- return;
854
- }
855
- const newOwner = scope.fleetWide ? (owner ?? null) : scope.gateOwner;
834
+ const owner = forkAdmitted.row.owner;
835
+ const newOwner = admittedAsFleet(forkEntry, forkAdmitted) ? owner : (forkEntry.caller.subject ?? null);
856
836
  const keyed = readForkTarget(await readJson(req), sourceId);
857
837
  if (keyed.kind === "refused") {
858
838
  sendError(res, 400, keyed.errorCode, keyed.message, keyed.facts);
@@ -861,7 +841,7 @@ export async function handleSessions(req, res, match, ctx) {
861
841
  if (keyed.kind === "none") {
862
842
  const newId = await fork(sourceId, newOwner);
863
843
  if (newId === null) {
864
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
844
+ refuse(forkEntry, res, "missing");
865
845
  return;
866
846
  }
867
847
  sendJson(res, 200, { sessionId: newId });
@@ -884,7 +864,7 @@ export async function handleSessions(req, res, match, ctx) {
884
864
  throw e;
885
865
  }
886
866
  if (outcome === null) {
887
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
867
+ refuse(forkEntry, res, "missing");
888
868
  return;
889
869
  }
890
870
  switch (outcome.outcome) {
@@ -896,7 +876,7 @@ export async function handleSessions(req, res, match, ctx) {
896
876
  return;
897
877
  case "occupied":
898
878
  if (!outcome.sameOwner) {
899
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
879
+ refuse(forkEntry, res, "not_visible");
900
880
  return;
901
881
  }
902
882
  sendError(res, 409, "conflict.fork_id_taken", "forkId already names another session of yours (a different fork, or a session that was not created by this fork request) — pick a new forkId and forkNonce; nothing was forked", { forkId: keyed.forkId });
@@ -915,36 +895,27 @@ export async function handleSessions(req, res, match, ctx) {
915
895
  return;
916
896
  }
917
897
  const purge = deleteFact.purge;
918
- const readOwner = async (id) => (await deleteFact.sessionStorage.headOf(id))?.owner;
919
- const scope = fleetViewOf(req, deps, "write");
920
- if (!scope.fleetWide && scope.gateOwner === null) {
921
- sendUnauthorized(res, "identity");
898
+ const deleteEntry = enter(req, res, deps, match.decl.id);
899
+ if (deleteEntry === undefined)
922
900
  return;
923
- }
924
901
  const sessionId = safeDecode(match.params.sessionId);
925
902
  if (sessionId === null || !isUuidShape(sessionId)) {
926
903
  sendError(res, 400, "request.id_invalid", "invalid session id (must be a canonical uuid)");
927
904
  return;
928
905
  }
929
- const owner = await readOwner(sessionId);
930
- if (owner === undefined) {
931
- sendJson(res, 200, { deleted: false });
932
- return;
933
- }
934
- if (!scope.fleetWide && owner !== scope.gateOwner && !legacyUnownedSessionOk(deps.config, sessionCallerOf(req, deps), await sessionOwnerCellOf(deleteFact.sessionStorage, sessionId, owner))) {
935
- sendJson(res, 200, { deleted: false });
936
- return;
937
- }
938
- const activeTaskId = await deps.runStore?.getActiveTaskId(sessionId);
939
- if (activeTaskId) {
940
- sendError(res, 409, "conflict.session_active_run", "session has an active run; cancel it before deleting", { activeTaskId });
906
+ const deleteAdmitted = await admitSessionById(deleteEntry, res, deleteFact.gateStore, sessionId);
907
+ if (deleteAdmitted === undefined)
941
908
  return;
942
- }
909
+ const owner = deleteAdmitted.row.owner;
943
910
  const result = await purge(sessionId, owner);
944
911
  if ("active" in result) {
945
912
  sendError(res, 409, "conflict.session_active_run", "session has an active run; cancel it before deleting", { activeTaskId: result.active });
946
913
  return;
947
914
  }
915
+ if ("inProgress" in result) {
916
+ sendError(res, 409, "conflict.session_deleting", "the delete of this session is already under way in another request, which finishes it — the session already reads as gone and this request returns without waiting; a retry answers {deleted:false} once the delete has finished");
917
+ return;
918
+ }
948
919
  if ("childrenAlive" in result) {
949
920
  sendError(res, 409, "conflict.session_children_alive", "this session still has background agents running where this replica cannot stop them (on another replica, for example), so the delete was refused before anything was deleted — `remaining` lists their ids (the same ids `GET /v1/agents/roster` shows); retry the delete once they finish, or stop them where they run", { remaining: result.childrenAlive.map((handle) => rosterAgentId({ handle })) });
950
921
  return;
@@ -961,31 +932,23 @@ export async function handleSessions(req, res, match, ctx) {
961
932
  return;
962
933
  }
963
934
  const store = policyFact.policyStore;
964
- const readOwner = async (id) => (await policyFact.sessionStorage.headOf(id))?.owner;
965
- const principal = gatedPrincipal(req, deps.config);
966
- if (deps.config.requirePrincipal && principal === undefined) {
967
- sendUnauthorized(res, "identity");
935
+ const policyEntry = enter(req, res, deps, match.decl.id);
936
+ if (policyEntry === undefined)
968
937
  return;
969
- }
970
938
  const sessionId = safeDecode(match.params.sessionId);
971
939
  if (sessionId === null || !isUuidShape(sessionId)) {
972
940
  sendError(res, 400, "request.id_invalid", "invalid session id (must be a canonical uuid)");
973
941
  return;
974
942
  }
975
- const owner = await readOwner(sessionId);
976
- if (owner === undefined) {
977
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
943
+ const policyAdmitted = await admitSessionById(policyEntry, res, policyFact.sessionStorage, sessionId);
944
+ if (policyAdmitted === undefined)
978
945
  return;
979
- }
946
+ const owner = policyAdmitted.row.owner;
980
947
  if (owner === null) {
981
- sendError(res, 409, "conflict.session_ownerless", "this session has no recorded owner, so its rules can be neither read nor changed through this route; rules already stored for it keep applying to the runs of the principal they were stored under. Ways out: on the local backend, during the upgrade window, the first task submitted with a principal on a session written by an earlier version claims it for that principal (this route then serves its owner); or delete the session (DELETE /v1/sessions/:id), which removes its rules with it");
982
- return;
983
- }
984
- const operator = explicitOperatorOk(principal, deps.config);
985
- if (!operator && owner !== (principal ?? null)) {
986
- sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
948
+ sendError(res, 409, "conflict.session_ownerless", "this session has no recorded owner, so its rules can be neither read nor changed through this route; rules already stored for it keep applying to the runs of the principal they were stored under. Way out: delete the session (DELETE /v1/sessions/:id), which removes its rules with it");
987
949
  return;
988
950
  }
951
+ const operator = policyAdmitted.quals.has("operator");
989
952
  const target = owner;
990
953
  if (match.decl.id === "session-policy-get") {
991
954
  try {
@@ -1,6 +1,6 @@
1
1
  import { isSharedMemoryDocumentPath, SHARED_MEMORY_READ_CAP_BYTES, SharedMemoryStoreError } from "@sema-agent/core";
2
2
  import { sendJson, sendError } from "../send.js";
3
- import { gatedPrincipal, sendUnauthorized } from "../principal-gate.js";
3
+ import { gatedPerson, sendUnauthorized } from "../principal-gate.js";
4
4
  import { assertNever } from "../route-ctx.js";
5
5
  import * as facts from "../../capability-facts.js";
6
6
  const RETRY_AFTER_SEC = 10;
@@ -10,14 +10,14 @@ function refuseStore(res) {
10
10
  }
11
11
  function refuseUnavailable(res, message) {
12
12
  res.setHeader("retry-after", String(RETRY_AFTER_SEC));
13
- sendError(res, 503, "memory.shared_unavailable", "shared memory stores are unavailable", {
14
- retryAfterSec: RETRY_AFTER_SEC,
15
- ...(message !== undefined ? { detail: message } : {}),
16
- });
13
+ if (message === undefined)
14
+ sendError(res, 503, "memory.shared_unavailable", "shared memory stores are unavailable", { retryAfterSec: RETRY_AFTER_SEC });
15
+ else
16
+ sendError(res, 503, "memory.shared_unavailable", `shared memory stores are unavailable: ${message}`, { retryAfterSec: RETRY_AFTER_SEC });
17
17
  }
18
18
  async function bindSnapshot(req, res, ctx) {
19
19
  const { deps } = ctx;
20
- const principal = gatedPrincipal(req, deps.config);
20
+ const principal = gatedPerson(req, deps.config);
21
21
  if (!principal && deps.config.requirePrincipal === true) {
22
22
  sendUnauthorized(res, "identity");
23
23
  return undefined;
@@ -7,7 +7,7 @@ import { redactSecrets } from "../../trace/redact.js";
7
7
  import { errorCodeOf } from "../../observability/err-text.js";
8
8
  import { admitProviderEcho, redactErrorMessage } from "../../observability/run-terminal.js";
9
9
  import { sendJson, sendError, sendHttpError, msg } from "../send.js";
10
- import { gatedPrincipal, sendPrincipalRefusal } from "../principal-gate.js";
10
+ import { gatedPerson, sendPrincipalRefusal } from "../principal-gate.js";
11
11
  import { assertNever } from "../route-ctx.js";
12
12
  export function isCorePreflightValidationError(err) {
13
13
  return errorCodeOf(err) === "config.unknown_role";
@@ -38,7 +38,7 @@ export async function handleSideQuery(req, res, match, ctx) {
38
38
  try {
39
39
  if (rateLimited(req, res) || quotaExceeded(req, res) || (await leaseDenied(req, res)))
40
40
  return;
41
- const principal = gatedPrincipal(req, deps.config);
41
+ const principal = gatedPerson(req, deps.config);
42
42
  if (deps.config.requirePrincipal && !principal) {
43
43
  sendPrincipalRefusal(res, req, deps.config);
44
44
  return;