@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
package/dist/security.js CHANGED
@@ -1,10 +1,14 @@
1
- import { uuidv7, PROJECT_ID_REGEX, principalNameOf } from "@sema-agent/core";
1
+ import { uuidv7, PROJECT_ID_REGEX, SessionError, buildCrossSessionEnvelope, encodePeerAddress, CrossSessionCodecError } from "@sema-agent/core";
2
2
  import { DEPLOYMENT_SHAPE_PREDICATES } from "./deployment-shape.js";
3
- import { headReadOf } from "./session-incarnation.js";
3
+ import { FACES, OWNERLESS_ORDINARY_CELL, ownerCellOf, ownerlessCellWithoutRead, qualsOf, recoveredSubject, visibleOn } from "./owner-faces.js";
4
+ import { mintDurableOwnerKey, mintPerson, partsOf, personOf, scenarioNamed, subjectOf } from "./owner-brands.js";
5
+ import { deletionHeadReadOf } from "./session-incarnation.js";
4
6
  import { memoryScopeFor } from "./memory-scope.js";
5
7
  import { verifyPrincipalJwt } from "./principal-jwt.js";
6
8
  import { fieldConflictFacts } from "./field-conflict.js";
7
- import { ORPHAN_SESSION_OWNER_PREFIX } from "./delegated-session-owner.js";
9
+ import { refusalReservedKeyMessage, refusalReservedKeyOf } from "./http/refusal-body.js";
10
+ import { PRINCIPAL_MAX_BYTES, principalShapeProblem } from "./principal-shape.js";
11
+ import { birthFaceOf, withdrawFaceOf } from "./plugins/session-birth.js";
8
12
  import { NOT_A_PRINCIPAL_NAME } from "./plugins/session-ownership.js";
9
13
  export function isDestructiveSessionWrite(method, url) {
10
14
  if (method === "DELETE")
@@ -15,37 +19,66 @@ export function isDestructiveSessionWrite(method, url) {
15
19
  return /^\/v1\/sessions\/[^/]+\/(sync\/import|fork|memory\/erase)$/.test(url);
16
20
  return false;
17
21
  }
18
- export function mintPrincipal(verified) {
19
- return verified;
20
- }
21
- export function mintDurableOwnerKey(persisted) {
22
- return persisted;
22
+ export function claimCallerOf(subject, config) {
23
+ return {
24
+ subject,
25
+ operator: false,
26
+ fleet: undefined,
27
+ traceRead: false,
28
+ principalRequired: DEPLOYMENT_SHAPE_PREDICATES.principalRequired.holds(config),
29
+ multiTenant: DEPLOYMENT_SHAPE_PREDICATES.multiTenant.holds(config),
30
+ };
23
31
  }
24
- export function ownerlessRowOpen(cell, caller) {
25
- if (cell.owner !== null)
26
- return false;
27
- return !cell.placed || caller.fleet;
32
+ export const ATTACH_ABSENT_MESSAGE = "requireExistingSession: session does not exist (resume.session_not_found)";
33
+ function attachAbsentError() {
34
+ return createCodedHttpError(404, "resume.session_not_found", ATTACH_ABSENT_MESSAGE);
28
35
  }
29
36
  export async function sessionOwnerCellOf(store, sessionId, owner) {
30
37
  if (owner !== null)
31
- return { owner: mintDurableOwnerKey(owner) };
38
+ return ownerCellOf(owner);
32
39
  const placementOf = store?.placementOf;
33
40
  return { owner: null, placed: placementOf !== undefined && (await placementOf.call(store, sessionId)) !== undefined };
34
41
  }
35
- export const LEGACY_UNOWNED_AMNESTY_TENANT = "default";
36
- export function legacyUnownedSessionOk(deployment, caller, cell) {
37
- return legacyUnownedAmnestyOpen(deployment, caller.principal ?? null) && ownerlessRowOpen(cell, caller);
42
+ export async function sessionCellFor(face, caller, store, sessionId, owner) {
43
+ if (owner !== null)
44
+ return sessionOwnerCellOf(store, sessionId, owner);
45
+ const unread = ownerlessCellWithoutRead(face, caller);
46
+ if (unread !== undefined)
47
+ return unread;
48
+ try {
49
+ return await sessionOwnerCellOf(store, sessionId, null);
50
+ }
51
+ catch (e) {
52
+ if (FACES[face].placementUnreadable === "ordinary" && archiveUnreadable(e))
53
+ return OWNERLESS_ORDINARY_CELL;
54
+ throw e;
55
+ }
38
56
  }
39
- export function legacyUnownedAmnestyOpen(deployment, gateOwner) {
40
- return !DEPLOYMENT_SHAPE_PREDICATES.multiTenant.holds(deployment) && gateOwner === LEGACY_UNOWNED_AMNESTY_TENANT;
57
+ function archiveUnreadable(e) {
58
+ if (!(e instanceof SessionError))
59
+ return false;
60
+ const code = e.code;
61
+ switch (code) {
62
+ case "corrupt_session":
63
+ case "invalid_session":
64
+ return true;
65
+ case "not_found":
66
+ case "invalid_entry":
67
+ case "invalid_fork_target":
68
+ case "storage":
69
+ case "conflict":
70
+ case "placement_refused":
71
+ case "unknown":
72
+ return false;
73
+ default: {
74
+ const unknownCode = code;
75
+ throw new Error(`archiveUnreadable: unknown SessionError code ${String(unknownCode)}`);
76
+ }
77
+ }
41
78
  }
42
- export const LEGACY_SHELL_SENTINEL_OWNER = "anon:shell-live";
43
- export function sameSessionOwner(deployment, rowOwner, principal) {
44
- if (rowOwner === principal)
45
- return true;
46
- if (rowOwner === null)
47
- return legacyUnownedAmnestyOpen(deployment, principal);
48
- return !DEPLOYMENT_SHAPE_PREDICATES.principalRequired.holds(deployment) && rowOwner === LEGACY_SHELL_SENTINEL_OWNER && principal === null;
79
+ export function sameSessionOwner(deployment, rowOwner, occupant) {
80
+ const quals = qualsOf(claimCallerOf(recoveredSubject(occupant), deployment), ownerCellOf(rowOwner));
81
+ return rowOwner === null ? occupant === null || quals.has("j4") : quals.has("owner");
49
82
  }
50
83
  const UUIDV7_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
51
84
  export function isUuidV7(s) {
@@ -65,6 +98,11 @@ export class HttpError extends Error {
65
98
  code;
66
99
  extra;
67
100
  constructor(status, message, opts) {
101
+ if (opts?.extra !== undefined) {
102
+ const reserved = refusalReservedKeyOf(opts.extra);
103
+ if (reserved !== undefined)
104
+ throw new TypeError(refusalReservedKeyMessage(opts.code ?? `HTTP ${status}`, reserved));
105
+ }
68
106
  super(message);
69
107
  this.status = status;
70
108
  this.name = "HttpError";
@@ -77,10 +115,23 @@ export class HttpError extends Error {
77
115
  export function createCodedHttpError(status, errorCode, message, extra) {
78
116
  return new HttpError(status, message, extra === undefined ? { code: errorCode } : { code: errorCode, extra });
79
117
  }
80
- export function createAuthorizer(config, sessionStore) {
81
- return async ({ req, body }) => {
82
- const principal = verifiedPrincipal(req, config);
83
- if (config.requirePrincipal && !principal) {
118
+ export function createAuthorizer(config, sessionStore, logger) {
119
+ const attachRefused = (reason, subject) => {
120
+ logger?.info("owner_gate_refused", { policyFace: "session.attach", reason, principalPresent: subject !== undefined });
121
+ return attachAbsentError();
122
+ };
123
+ const birthFace = birthFaceOf(sessionStore);
124
+ const withdrawFace = withdrawFaceOf(sessionStore);
125
+ const registerNew = async (id, owner, register, onBirth) => {
126
+ if (birthFace === undefined || withdrawFace === undefined)
127
+ return register(id, owner);
128
+ const receipt = await birthFace.registerWithReceipt(id, owner);
129
+ if (receipt.minted !== undefined)
130
+ onBirth?.(receipt.minted, withdrawFace);
131
+ };
132
+ return async ({ req, body, onBirth }) => {
133
+ const subject = verifiedSubject(req, config);
134
+ if (config.requirePrincipal && !subject) {
84
135
  throw new HttpError(401, `missing principal header '${config.principalHeader}'`);
85
136
  }
86
137
  let projectId;
@@ -91,7 +142,7 @@ export function createAuthorizer(config, sessionStore) {
91
142
  projectId = body.projectId.toLowerCase();
92
143
  }
93
144
  const requireExisting = body.requireExistingSession === true;
94
- const headOf = headReadOf(sessionStore);
145
+ const headOf = deletionHeadReadOf(sessionStore);
95
146
  let head;
96
147
  const readOwner = headOf === undefined ? undefined : async (id) => {
97
148
  head = await headOf(id);
@@ -105,24 +156,20 @@ export function createAuthorizer(config, sessionStore) {
105
156
  let owner = await readOwner(requested);
106
157
  if (owner === undefined) {
107
158
  if (requireExisting) {
108
- throw createCodedHttpError(404, "resume.session_not_found", "requireExistingSession: session does not exist (resume.session_not_found)");
159
+ throw attachRefused("missing", subject);
109
160
  }
110
161
  if (register) {
111
- await register(requested, principal ?? null);
162
+ await registerNew(requested, subject ?? null, register, onBirth);
112
163
  owner = await readOwner(requested);
113
164
  }
114
165
  else if (config.requirePrincipal) {
115
166
  throw new HttpError(403, "cannot claim a caller-supplied sessionId on a multi-tenant deployment: this worker's session store cannot record session ownership, so the id would stay unowned and the next caller could attach to it. Configure a durable session backend (SESSION_BACKEND), or omit sessionId to start a new session.");
116
167
  }
117
168
  }
118
- else if (owner === null && principal !== undefined && !config.requirePrincipal && register) {
119
- await register(requested, principal);
120
- owner = await readOwner(requested);
121
- }
122
- if (owner != null && !sameSessionOwner(config, owner, principal ?? null)) {
123
- throw principal
124
- ? new HttpError(403, "session does not belong to this principal")
125
- : new HttpError(401, `session is principal-owned; missing principal header '${config.principalHeader}'`);
169
+ if (owner !== undefined) {
170
+ const claimCaller = claimCallerOf(subject, config);
171
+ if (!visibleOn("session.attach", qualsOf(claimCaller, await sessionCellFor("session.attach", claimCaller, sessionStore, requested, owner))))
172
+ throw attachRefused("not_visible", subject);
126
173
  }
127
174
  }
128
175
  else if (config.requirePrincipal) {
@@ -136,26 +183,13 @@ export function createAuthorizer(config, sessionStore) {
136
183
  }
137
184
  sessionId = uuidv7();
138
185
  if (register)
139
- await register(sessionId, principal ?? null);
186
+ await registerNew(sessionId, subject ?? null, register, onBirth);
140
187
  if (readOwner)
141
188
  await readOwner(sessionId);
142
189
  }
143
- return { principal, sessionId, memoryScope: memoryScopeFor(config, principal, projectId), resolvedProjectId: projectId, ...(head === undefined ? {} : { head }) };
190
+ return { subject, sessionId, memoryScope: memoryScopeFor(config, subject === undefined ? undefined : personOf(subject), projectId), resolvedProjectId: projectId, ...(head === undefined ? {} : { head }) };
144
191
  };
145
192
  }
146
- export const PRINCIPAL_MAX_LENGTH = 190;
147
- export const PRINCIPAL_MAX_UTF8_BYTES = PRINCIPAL_MAX_LENGTH * 3;
148
- export const RESERVED_PRINCIPALS = ["_", "__none__", "_leader"];
149
- export const RESERVED_PRINCIPAL_PREFIXES = ["_leader-", ORPHAN_SESSION_OWNER_PREFIX];
150
- export function principalShapeProblem(principal) {
151
- if (principalNameOf(principal) === undefined)
152
- return "not_a_name";
153
- if (RESERVED_PRINCIPALS.includes(principal) || RESERVED_PRINCIPAL_PREFIXES.some((p) => principal.startsWith(p)))
154
- return "reserved";
155
- if (principal.length > PRINCIPAL_MAX_LENGTH)
156
- return "too_long";
157
- return undefined;
158
- }
159
193
  export function assertPrincipalShape(principal) {
160
194
  const problem = principalShapeProblem(principal);
161
195
  switch (problem) {
@@ -166,21 +200,44 @@ export function assertPrincipalShape(principal) {
166
200
  case "reserved":
167
201
  throw createCodedHttpError(400, "principal_reserved", `principal ${JSON.stringify(principal)} is reserved (an internal scope sentinel) — authenticate with a real tenant identifier`);
168
202
  case "too_long":
169
- throw createCodedHttpError(400, "principal_too_long", `principal exceeds ${PRINCIPAL_MAX_LENGTH} characters (the scope-column width every store pins, e.g. sendfile_link.scope VARCHAR(190)); got ${principal.length}`);
203
+ throw createCodedHttpError(400, "principal_too_long", `principal exceeds ${PRINCIPAL_MAX_BYTES} UTF-8 bytes (the identity-column width every store pins, e.g. sendfile_link.scope VARCHAR(190), mailbox.scope_key VARBINARY(190)); got ${Buffer.byteLength(principal, "utf8")}`);
170
204
  default: {
171
205
  const unknownProblem = problem;
172
206
  throw new Error(`assertPrincipalShape: unknown problem ${String(unknownProblem)}`);
173
207
  }
174
208
  }
175
209
  }
210
+ export const CROSS_SESSION_FROM_SCOPE_MAX_ENCODED = 190;
211
+ export const SUBJECT_ENCODED_BUDGET = CROSS_SESSION_FROM_SCOPE_MAX_ENCODED;
212
+ export function subjectWidthExceeded(subject) {
213
+ try {
214
+ buildCrossSessionEnvelope({ from: encodePeerAddress("width-probe"), fromScope: subject }, "");
215
+ return false;
216
+ }
217
+ catch (e) {
218
+ if (e instanceof CrossSessionCodecError && e.code === "cross_session.invalid_from_scope")
219
+ return true;
220
+ throw e;
221
+ }
222
+ }
176
223
  export const CHECKPOINT_PUBLIC_SCOPE = "_";
177
224
  export const BACKGROUND_REGISTRY_ANON_SCOPE = "default";
178
225
  export function backgroundScopesForCheckpointScope(scope) {
179
226
  return scope === CHECKPOINT_PUBLIC_SCOPE ? [CHECKPOINT_PUBLIC_SCOPE, BACKGROUND_REGISTRY_ANON_SCOPE] : [scope];
180
227
  }
181
- export const encodeCheckpointScope = (principal) => principal ?? CHECKPOINT_PUBLIC_SCOPE;
182
- export const decodeCheckpointScope = (scope) => (scope === CHECKPOINT_PUBLIC_SCOPE ? undefined : scope);
228
+ export const encodeCheckpointScope = (subject) => subject ?? CHECKPOINT_PUBLIC_SCOPE;
229
+ export const decodeCheckpointScope = (scope) => (scope === CHECKPOINT_PUBLIC_SCOPE ? undefined : mintDurableOwnerKey(scope));
183
230
  export const ownerOfCheckpointScope = (scope) => decodeCheckpointScope(scope) ?? null;
231
+ export const checkpointPartsOf = (scope) => {
232
+ const key = decodeCheckpointScope(scope);
233
+ return key === undefined ? undefined : partsOf(key);
234
+ };
235
+ export function scopeCellOf(scope) {
236
+ if (typeof scope !== "string")
237
+ return undefined;
238
+ const owner = decodeCheckpointScope(scope);
239
+ return owner === undefined ? OWNERLESS_ORDINARY_CELL : { owner };
240
+ }
184
241
  export function principalFrom(req, config) {
185
242
  if (!config.principalHeader)
186
243
  return undefined;
@@ -225,7 +282,54 @@ export function ssoVerifiedPrincipalInc(req) {
225
282
  const v = SSO_PRINCIPAL_INCS.get(req);
226
283
  return v !== undefined && v.length > 0 ? v : undefined;
227
284
  }
228
- export function verifiedPrincipal(req, config) {
285
+ export function verifiedPerson(req, config) {
286
+ const verified = verifiedIdentity(req, config);
287
+ return verified === undefined ? undefined : mintPerson(verified);
288
+ }
289
+ export const SCENARIO_HEADER = "x-agent-scenario";
290
+ export function scenarioHeaderOf(req) {
291
+ const raw = req.headers[SCENARIO_HEADER];
292
+ return (Array.isArray(raw) ? raw[0] : raw)?.trim() || undefined;
293
+ }
294
+ export function scenarioWithoutPrincipalError() {
295
+ return createCodedHttpError(400, "request.scenario_without_principal", `the ${SCENARIO_HEADER} header selects a partition inside a verified person, but this request carries no verified principal — authenticate the person, or drop the header`);
296
+ }
297
+ export function scenarioHeaderUnknownError(name, known) {
298
+ return createCodedHttpError(400, "scenario_unknown", `unknown scenario ${JSON.stringify(name)} in the ${SCENARIO_HEADER} header — it is not a scenario of this deployment`, known === undefined ? undefined : { known: [...known] });
299
+ }
300
+ const REQUEST_SUBJECTS = new WeakMap();
301
+ export function verifiedSubject(req, config) {
302
+ let memo = REQUEST_SUBJECTS.get(req);
303
+ if (memo === undefined) {
304
+ try {
305
+ memo = { subject: judgeRequestSubject(req, config) };
306
+ }
307
+ catch (error) {
308
+ memo = { error };
309
+ }
310
+ REQUEST_SUBJECTS.set(req, memo);
311
+ }
312
+ if ("error" in memo)
313
+ throw memo.error;
314
+ return memo.subject;
315
+ }
316
+ function judgeRequestSubject(req, config) {
317
+ const person = verifiedPerson(req, config);
318
+ const raw = scenarioHeaderOf(req);
319
+ if (raw === undefined)
320
+ return person === undefined ? undefined : subjectOf(person);
321
+ if (person === undefined)
322
+ throw scenarioWithoutPrincipalError();
323
+ const scenario = scenarioNamed(raw);
324
+ if (scenario === undefined)
325
+ throw scenarioHeaderUnknownError(raw, undefined);
326
+ const subject = subjectOf(person, scenario);
327
+ if (subjectWidthExceeded(subject)) {
328
+ throw createCodedHttpError(400, "principal_too_long", `principal plus the ${SCENARIO_HEADER} scenario exceeds ${SUBJECT_ENCODED_BUDGET} characters once percent-encoded (the narrowest face the subject lands in: the cross-session envelope from-scope) — use a shorter principal or scenario name`);
329
+ }
330
+ return subject;
331
+ }
332
+ function verifiedIdentity(req, config) {
229
333
  const sso = ssoVerifiedPrincipal(req);
230
334
  if (sso) {
231
335
  assertPrincipalShape(sso);
@@ -1,4 +1,6 @@
1
+ import { type DeploymentShapeInput } from "./deployment-shape.js";
1
2
  import type { Logger } from "./observability/logger.js";
3
+ import type { LaunchWorkspace } from "./task-cwd.js";
2
4
  /** 部署声明的配置根(绝对路径);没声明 ⇒ `undefined`;空串 ⇒ 抛(起服拒,句子点名变量与出路)。纯读 env,不碰文件。**只有 `loadConfig` 调它**
3
5
  * (结果 = 配置席 `agentConfigDir`);别的读者读那一席。 */
4
6
  export declare function declaredSemaConfigDir(env?: NodeJS.ProcessEnv): string | undefined;
@@ -16,4 +18,22 @@ export declare function configRootOf(config: {
16
18
  export declare function provisionSemaConfigDir(config: {
17
19
  readonly agentConfigDir?: string;
18
20
  }, logger: Pick<Logger, "warn">): void;
21
+ /**
22
+ * 起服的**公告动作**(每个入口一次):配置根就是工作区、或是工作区的祖先 ⇒ warn 恰一行 `sema_config_root_encloses_workspace`;不相交(含配置根在工作区之内)⇒ 零行。**不拒启、不改任何行为。**
23
+ *
24
+ * 为什么要说:引擎缺省写保护表的 `.sema` 行在声明的配置根下同样守,根**之内**任何路径的写都过 `write_protection` 一问(allow 规则清不掉、`acceptEdits` 不放、无人值守腿直接拒)——
25
+ * 配置根是工作区的祖先时,工作区里每一次写都出这一张卡,而此前起服与首条任务零行。能不能用仍只有引擎一个判官,本服务只把这个构造说出来,不判、不铸拒句。
26
+ *
27
+ * 判法:配置根({@link configRootOf})与工作区({@link LaunchWorkspace},读链唯一属主 `task-cwd.ts` 的 `launchWorkspaceOf`)各取一次规范形后,`pathIsWithin(配置根, 工作区)`(含相等);两侧同一只规范形座。
28
+ * 读数里的两条路径是**原样拼写**(运维认得出来的那两条)。手不在本机盘上的车道(部署形表行 `sandboxPathAdjudication`:工具跑在沙箱 / 远程)不判 —— 那里的工作区不是本进程这台机的盘。
29
+ * 看不见的一半(随包文档如实写):请求体里按任务给的 `cwd` 起服时不可知,不在读链里;规范形对**尚不存在**的尾巴只比字串、不折大小写 —— 大小写不敏感的盘上,两个只差大小写且尾巴都还不存在的拼写读成两处,这一行会漏报
30
+ * (与记忆根那一判共用同一只规范形,那一判的失败方向是多报,这一判的是漏报;如实披露)。
31
+ * 句子只描述位置关系,后果限定在引擎**缺省**写保护表上:用 `WRITE_PROTECTED_TABLE_REPLACE` 去掉那一行的部署不受影响(这一行不读那张表),可忽略它。
32
+ *
33
+ * 规范形读不出(盘上竞态:探完到取值之间目录被挪走 / 搜索权限被收)⇒ 披露面不得把起服打死:响亮报另一行 `sema_config_root_workspace_check_unavailable`(类名 + 机器码),起服照常。
34
+ * 位置:HTTP 服务在装配第 2 段执行车道合成之后(读的是合成后的车道与工作区底),`run-local` 在工作区定下之后 —— 车道在这两处才定形,所以不与 {@link provisionSemaConfigDir} 同一拍。
35
+ */
36
+ export declare function announceConfigRootEnclosingWorkspace(config: {
37
+ readonly agentConfigDir?: string;
38
+ } & DeploymentShapeInput<"lane">, logger: Pick<Logger, "warn">, workspace: LaunchWorkspace, canonical?: (p: string) => string): void;
19
39
  //# sourceMappingURL=sema-config-dir.d.ts.map
@@ -1,6 +1,9 @@
1
1
  import { homedir } from "node:os";
2
2
  import { join, resolve } from "node:path";
3
3
  import { ensureDir } from "@sema-agent/core";
4
+ import { DEPLOYMENT_SHAPE_PREDICATES } from "./deployment-shape.js";
5
+ import { canonicalPathOf, pathIsWithin } from "./memory-scope.js";
6
+ import { errorCodeOf, errorKindOf } from "./observability/err-text.js";
4
7
  export function declaredSemaConfigDir(env = process.env) {
5
8
  const raw = env.SEMA_CONFIG_DIR;
6
9
  if (raw === undefined)
@@ -30,4 +33,26 @@ export function provisionSemaConfigDir(config, logger) {
30
33
  });
31
34
  }
32
35
  }
36
+ export function announceConfigRootEnclosingWorkspace(config, logger, workspace, canonical = canonicalPathOf) {
37
+ if (DEPLOYMENT_SHAPE_PREDICATES.sandboxPathAdjudication.holds(config))
38
+ return;
39
+ const configRoot = configRootOf(config);
40
+ try {
41
+ if (!pathIsWithin(configRoot, workspace.dir, canonical))
42
+ return;
43
+ }
44
+ catch (e) {
45
+ logger.warn("sema_config_root_workspace_check_unavailable", { configRoot, workspace: workspace.dir, workspaceFrom: workspace.from, errorKind: errorKindOf(e), errorCode: errorCodeOf(e) });
46
+ return;
47
+ }
48
+ logger.warn("sema_config_root_encloses_workspace", {
49
+ configRoot,
50
+ workspace: workspace.dir,
51
+ workspaceFrom: workspace.from,
52
+ note: "The configuration root (配置根, SEMA_CONFIG_DIR; default ~/.sema) is the workspace (工作区) itself or one of its ancestors. With the engine's default write-protection table, every file the agent writes " +
53
+ "inside it goes through a write-protection prompt that allow rules cannot clear, and unattended runs are refused (a deployment that replaced or disabled that table with WRITE_PROTECTED_TABLE_REPLACE " +
54
+ "is not affected and can ignore this line: it only reports where the two directories sit). This line changes nothing. Point SEMA_CONFIG_DIR at a dedicated directory outside the workspace " +
55
+ "(unset it to use ~/.sema).",
56
+ });
57
+ }
33
58
  //# sourceMappingURL=sema-config-dir.js.map
@@ -25,9 +25,10 @@
25
25
  * 与每次生效配置换代(`web-admin-client/apply-effective.ts` 本体:CAS 之后、Runner 换装与 commit 之前 —— 声明先于席位,旧世代不声明)。名单只随**落地**的世代
26
26
  * 增长(本进程 env 是 boot 期输入:一个名字一旦指过本进程的凭据,条目改名 / 删掉之后它的值仍在 env 里 ⇒ 落地过的名不退出;没落地的候选不留痕 —— 名单重判命中 / 换装拒 ⇒
27
27
  * {@link withdrawServerWithheldEnv} 撤回到换代前的集合)。声明失败(坏形名 / 运行时回填名)⇒ 引擎抛且声明保持原状:起服那次 = 拒启,换代那次 = 候选整拒(与 stage
28
- * 抛同路)。能力词 `inherit_env.own_credentials_withheld` 在本进程的事实 =
29
- * {@link ownCredentialsWithheld}:最近一次成功声明的集合 ⊇ 当前生效配置应声明的集合(活配置经 {@link bindOwnCredentialsConfig} 在 `loadConfig()` 之后绑一次;
30
- * 未绑 / 未声明 ⇒ false,事实读不到应声明集合就不答 true)。
28
+ * 抛同路)。「引擎扣没扣这些名」只有一只读法 {@link ownCredentialNamesNotWithheld}(问引擎本尊的判官,不读本文件的镜像),两个读者:
29
+ * `loadConfig()` 的**声明前提**({@link ownCredentialDeclarationRefusal}:起服表的名没全扣 ⇒ `loadConfig` 抛,拒句点名 {@link declareServerWithheldEnv} —— 「先声明」不再只是入口里的位置契约,
30
+ * 不经入口直接调 `loadConfig` 的进程〔包根嵌入方 / bench / 探针脚本〕得先声明,声明对它们才不是空的)与能力词 `inherit_env.own_credentials_withheld` 在本进程的事实
31
+ * {@link ownCredentialsWithheld}(当前生效配置应声明的名全被扣;活配置经 {@link bindOwnCredentialsConfig} 在 `loadConfig()` 之后绑一次;未绑 / 没扣 ⇒ false)。
31
32
  * · **值臂**(core 7.52.0 [ref]):声明是一张表 `{ names, values }`。`values` = 本进程持有凭据的变量此刻的值(目录 secret 名 ∪ 模型条目 `apiKeyEnv`,{@link serverCredentialValueSources}),
32
33
  * 逐个交给引擎的同一只判;引擎判「不是凭据值」的那一个不扣、名照扣、不拒启、点名一次。能力词 `inherit_env.own_credential_values_withheld` 的事实 = {@link ownCredentialValuesWithheld}(位真 ⇔ 值臂真扣)。
33
34
  * · 调用方显式传入的 env(`cfg.env` / 单次命令的 `env` / 沙箱的点名放回)不是继承,照旧原样叠在组合结果之上 —— 那是适配器自己的凭据通道。
@@ -92,8 +93,23 @@ export declare function withdrawServerWithheldEnv(): void;
92
93
  /** 把活配置交给能力位读(stage-01 / run-local 在 `loadConfig()` 之后各一次;读的是 `config.modelApiKeyEnv` 这个**属性**,commit 整表重赋值之后看到的就是新表)。 */
93
94
  export declare function bindOwnCredentialsConfig(config: Pick<ServiceConfig, "modelApiKeyEnv">): void;
94
95
  /**
95
- * 能力词 `inherit_env.own_credentials_withheld` 在本进程的事实:最近一次成功声明的名单 ⊇ 当前生效配置应声明的名单。是一次比较,不是「声明过」的旗 ——
96
- * 活表若被谁绕过声明写了新名,这里立刻 false(位不替流程担保)。没绑活配置 / 没声明过 ⇒ false(fail-closed)。
96
+ * 「引擎此刻扣不扣这些名」的**唯一读法**:给哪张表就判哪张表的应声明集合({@link serverWithheldEnvNames}),答引擎此刻**没有**扣下的那些名(空 = 全扣)。
97
+ * 读引擎本尊的判官 `inheritEnvPolicyProblem`(名单解析器 ② 判「点到本服务自有凭据名」问的同一只;按平台比名),不读本文件的镜像 `declared` ——
98
+ * 镜像只是声明口的写者状态(并集 / 深度 1 撤回),答「扣没扣」的只有引擎:引擎的声明是进程级的(换一份模块图、镜像归零,它照在)。两个读者:
99
+ * `loadConfig` 的声明前提({@link ownCredentialDeclarationRefusal},起服表 = 空表)与能力位({@link ownCredentialsWithheld},活表)。
100
+ */
101
+ export declare function ownCredentialNamesNotWithheld(modelApiKeyEnv?: ModelApiKeyEnvTable): readonly string[];
102
+ /**
103
+ * 🔴 `loadConfig()` 的前提:本进程的自有凭据名(起服表 = 目录 secret 名 ∪ 名单型旋钮名)此刻全被引擎扣下 —— 否则拒因(句子只写这一处),满足 ⇒ `undefined`。
104
+ * 名单型旋钮的自有凭据判与每一条宿主腿的扣留都读引擎此刻的声明;声明为空时判官恒答「合法」⇒ 名单点到本服务凭据照收、宿主子进程照拿,零声响。
105
+ * 三个进程入口第一步就声明(stage-01 / run-local 先于 `loadConfig()`,bake-runner 先于它自己的 env 读),所以本服务起服序里这句永远不出现;
106
+ * 它说给不经入口直接调 `loadConfig()` 的进程听(包根的嵌入方、bench、探针脚本):出路一步 —— 先调包根的 {@link declareServerWithheldEnv}。
107
+ * 回显的是变量**名**(不是值)。
108
+ */
109
+ export declare function ownCredentialDeclarationRefusal(): string | undefined;
110
+ /**
111
+ * 能力词 `inherit_env.own_credentials_withheld` 在本进程的事实:当前生效配置应声明的每一个名,引擎此刻都扣着({@link ownCredentialNamesNotWithheld} 为空)。
112
+ * 是一次比较,不是「声明过」的旗 —— 活表若被谁绕过声明写了新名,这里立刻 false(位不替流程担保)。没绑活配置 / 引擎没扣 ⇒ false(fail-closed)。
97
113
  */
98
114
  export declare function ownCredentialsWithheld(): boolean;
99
115
  /**
@@ -1,4 +1,4 @@
1
- import { declareWithheldEnv, hostChildEnv, inheritedHostEnv } from "@sema-agent/core";
1
+ import { declareWithheldEnv, hostChildEnv, inheritEnvPolicyProblem, inheritedHostEnv } from "@sema-agent/core";
2
2
  import { CONFIG_CATALOG } from "./config-catalog.js";
3
3
  import { ENV_NAME_ALLOWLIST_KNOB_NAMES } from "./env-name-allowlist-knobs.js";
4
4
  import { recordOwnCredentialValueNotWithheld, recordSecretEnvScrub } from "./observability/secret-env-scrub.js";
@@ -46,11 +46,21 @@ export function withdrawServerWithheldEnv() {
46
46
  export function bindOwnCredentialsConfig(config) {
47
47
  liveConfig = config;
48
48
  }
49
+ export function ownCredentialNamesNotWithheld(modelApiKeyEnv = NO_MODEL_ENTRIES) {
50
+ return serverWithheldEnvNames(modelApiKeyEnv).filter((name) => inheritEnvPolicyProblem([name]) === undefined);
51
+ }
52
+ export function ownCredentialDeclarationRefusal() {
53
+ const missing = ownCredentialNamesNotWithheld();
54
+ if (missing.length === 0)
55
+ return undefined;
56
+ return (`loadConfig(): this process has not declared its own credentials to the engine (${missing.length} of ${serverWithheldEnvNames().length} names are not withheld, e.g. ${missing[0]}) — ` +
57
+ "call declareServerWithheldEnv() (package root) once before loadConfig(), before any execution environment is built or any child process is started. " +
58
+ "Without it the name-list knobs' own-credential refusal and the withholding on every host child process read an empty declaration and let this service's credentials through.");
59
+ }
49
60
  export function ownCredentialsWithheld() {
50
- if (declared === undefined || liveConfig === undefined)
61
+ if (liveConfig === undefined)
51
62
  return false;
52
- const own = declared.names;
53
- return serverWithheldEnvNames(liveConfig.modelApiKeyEnv).every((name) => own.has(name));
63
+ return ownCredentialNamesNotWithheld(liveConfig.modelApiKeyEnv).length === 0;
54
64
  }
55
65
  export function ownCredentialValuesWithheld() {
56
66
  if (declared === undefined || liveConfig === undefined)
@@ -14,7 +14,7 @@
14
14
  *
15
15
  * ## 动词(core 板 [ref] ⑧⑨ 给定;本车第零步探针 `test/core-probe-parked-stop-root-access.test.ts` 真跑证实)
16
16
  * · 枚举 = `agentStore.listBySession(scope, 根会话)`(耐久行,锚 = 行的 session / parent / root 任一),并上本进程登记表里的
17
- * `activeDelegationHandles(scope, 根会话)`(没接耐久店的部署只有这一半)。scope 轴由调用方给(协调器:会话行的 `owner ?? "default"`)。
17
+ * `activeDelegationHandles(scope, 根会话)`(没接耐久店的部署只有这一半)。scope 轴由调用方给(唯一派生 {@link sessionTenantScope})。
18
18
  * · **parked** 行 ⇒ `checkpointStore.expire(token, 卡自己的 scope)`(与 core 自己的本进程仲裁器同一只 CAS)+
19
19
  * `registry.reconcileParkedAgents(stores, scope)` ⇒ 行 `failed`(stoppedBy `system`)、卡离开待决面。任何副本上都做得到 ⇒ 预检把它
20
20
  * 算作可达(前提是本部署有 checkpoint 店)。
@@ -31,7 +31,7 @@
31
31
  * 能在树活着时改根放置 / 住客的三门 —— 删除(`boot/session-faces.ts`)、换绑(`routes/devices.ts`)、导入(`routes/session-sync.ts`)—— 与显式结清口
32
32
  * `POST /v1/sessions/:id/children/retire`(`routes/background.ts`)都只经这里:**观察**只有 {@link probeSessionChildren}(同一次枚举交出活子代句柄
33
33
  * `liveChildren` 与不可达的那几只),**结清**只有 {@link retireSessionChildren}(结果交首轮观察到的句柄 `observed`);scope 只有一处取
34
- * {@link sessionChildrenScope}(会话属主 `owner ?? "default"`)。wire 上的 `children` / `remaining` 一律经名册的 id 投影出门。
34
+ * {@link sessionTenantScope}(会话的引擎租户分区)。wire 上的 `children` / `remaining` 一律经名册的 id 投影出门。
35
35
  * 子代半是**写前一次观察**:子代登记在 core 的后台子代店,写者的事务装不进这一读(认领半才是写事务内那一读,`execution-placement-sql.ts` 头注)。
36
36
  *
37
37
  * ## 循环(有上界)
@@ -85,10 +85,12 @@ export type RetireSessionChildrenOutcome = {
85
85
  readonly remainingHandles: readonly string[];
86
86
  };
87
87
  /**
88
- * 以一只根会话为根的后台子代在哪个 scope 分区里枚举 —— **唯一一处取**:会话属主 `owner ?? "default"`(删除门、换绑 / 导入两门、结清口同读;
89
- * 子代按 run 的 principal 登记、与会话属主不同源的那一形是既有缺陷,修在这里一处)。
88
+ * 一只会话的**引擎租户分区** —— **唯一一处取**:以它为根的后台子代、它的后台 shell、它的会话信箱盒,都登记在这一分区(删除门、换绑 / 导入两门、结清口、
89
+ * 删除协调器的信箱腿与 shell 收割腿、删后收尾的丢箱同读;属主串本身不是 scope)。引擎按任务规格的身份格登记,所以这里读的是**引擎交界**
90
+ * (`engine-identity.ts` 的 `taskSpecIdentityOf`)从会话属主恢复出的那一格:没带场景的会话 = 属主(逐字节同改前);带场景的会话(属主 `_scn:<场景>:<人>`)=
91
+ * 引擎登记时用的那一个值(今天是人)—— 按属主串去枚举 / 退役 / 收割会打到一个空分区。无主 ⇒ `"default"`。
90
92
  */
91
- export declare function sessionChildrenScope(owner: string | null): string;
93
+ export declare function sessionTenantScope(owner: string | null): string;
92
94
  /**
93
95
  * **可达性预检**(零写;协调器在任何破坏性步骤之前调)。parked 行在有 checkpoint 店时可达(expire + reconcile 在任何副本上都成);
94
96
  * running 行除非 {@link runsOnAnotherReplica} 都可达(`getAccessibleTask` / `agentStore.get` 都是纯读,不动任何东西)。
@@ -1,7 +1,12 @@
1
+ import { partsOf } from "./owner-brands.js";
2
+ import { recoveredSubject } from "./owner-faces.js";
3
+ import { taskSpecIdentityOf } from "./engine-identity.js";
1
4
  export const RETIRE_MAX_ROUNDS = 6;
2
5
  const RETIRE_BACKOFF_MS = [0, 25, 50, 100, 200, 400];
3
- export function sessionChildrenScope(owner) {
4
- return owner ?? "default";
6
+ export function sessionTenantScope(owner) {
7
+ if (owner === null)
8
+ return "default";
9
+ return taskSpecIdentityOf(partsOf(recoveredSubject(owner))).principal ?? "default";
5
10
  }
6
11
  async function liveChildren(deps, rootSessionId, scope) {
7
12
  const out = new Map();
@@ -0,0 +1,88 @@
1
+ /**
2
+ * **会话的三态:活 → 在删 → 没了**(删会话 × 提交只赢一个的律;规则只写在这里一次,三只会话店与删除协调器同读)。
3
+ *
4
+ * ## 律
5
+ * 一只会话行此刻是三态之一:
6
+ * · **活** —— 接受一切读写;
7
+ * · **在删** —— 一次删除已经在根行锁里判过「没有在跑的 run、属主是调用方」并立了围栏(写下自己的**删除尝试令牌**),还没删完。在删由持令牌的那一次删除**独占**:
8
+ * 删除门之外的一切读者与写者把它读作「行不在」(头读、列表、认领点的规则 L、登记 —— 撞上即「已存在」,不新建);认领落不下,于是删除级联的每一腿都只作用在一只
9
+ * 不会再起回合的会话上;
10
+ * · **没了** —— 行删掉了;同 id 的下一次登记是新住客。
11
+ * 在删**不回到活**(没有放弃删除的臂:子代可达性预检在围栏之前,终刀失败只会重试)⇒ 围栏之后立的外部围栏(会话盒墓碑)不会挡错一只活会话。
12
+ *
13
+ * ## 谁写、谁读
14
+ * · 围栏(活 → 在删 / 在删 → 在删 = 接管已死的那一次、换令牌)= {@link SessionDeletionFace.fence}:删除路**唯一**的认领判;一次仍可能活着的删除持有的行**不接管**
15
+ * (答「在删中」)—— 否则陈旧尝试与接管者交错、接管者删完而同 id 重登记之后,陈旧尝试的下一腿会落在新住客身上;
16
+ * · 终刀(在删 → 没了)= 删净一只会话的**执行体**(`src/session-erase.ts`;SQL = 执行器的 `eraseSession`,local = 会话店的删除锁节 `deleteSession(id, owner, token, legs)`):
17
+ * 根行锁里比属主、判「这一行处于本令牌的在删态」(判官 `judgeSessionWrite` 的 `erase` 词),不是 ⇒ 一行不删;是 ⇒ 同一个事务 / 锁节删完会话挂靠的全部行、行最后删;
18
+ * · 执行体之前的每一步进程面动作(不在根行锁里)之前,协调器问 {@link SessionDeletionFace.holds}:令牌被换了(另一次删除接管)⇒ 这次尝试就此停,答「被接管」;
19
+ * · 唯一收尾者 = 删除协调器:起服装配完之后按 {@link SessionDeletionFace.pending} 逐只再跑一遍(= 接管**那一只令牌**:读到之后那一次删完、同 id 重登记的新行不被碰);
20
+ * 持有者已死的在删行,重发的 DELETE 同样是接管。
21
+ * 持久面:SQL = 旁表 `session_ext.deleting_token`(列属主 `plugins/session-ext-table.ts`);local = 会话元数据边档那一格的 `deleting`。
22
+ */
23
+ /** 围栏的回执:这一次删除的令牌 + 被删的那一位住客的化身(空间回收的键;存量行没有化身 ⇒ `undefined`)。 */
24
+ export interface SessionDeletionTicket {
25
+ readonly token: string;
26
+ readonly incarnation: string | undefined;
27
+ }
28
+ /** 此刻处于在删态的一行(收尾者的输入):它的 id、属主与持有它的令牌(收尾按这一位属主、**只接管这一只令牌**再跑一遍协调器)。 */
29
+ export interface PendingSessionDeletion {
30
+ readonly sessionId: string;
31
+ readonly owner: string | null;
32
+ readonly token: string;
33
+ }
34
+ /**
35
+ * 一只在删令牌的持有者此刻在哪(协调器答,它记得本进程铸过的每一只令牌):`running` = 本进程里那一次删除还在跑;`ended` = 本进程里那一次已经结束而没删完
36
+ * (某腿失败 / 被接管)—— 死的;`elsewhere` = 不是本进程铸的(上一个进程 / 别的副本)。
37
+ */
38
+ export type DeletionHolder = "running" | "ended" | "elsewhere";
39
+ /** 围栏的选项:`holder` = 令牌持有者在哪(协调器的在飞表);`expect` = 只接管这一只令牌(收尾者;活行 / 别的令牌 ⇒ `undefined`)。 */
40
+ export interface SessionDeletionFenceOptions {
41
+ readonly holder: (token: string) => DeletionHolder;
42
+ readonly expect?: string;
43
+ }
44
+ /** 围栏的答复:回执(本次立了 / 接管了)· `inProgress`(一次仍可能活着的删除持有这一行 —— 不接管)· `undefined`(行不在 / 属主不是这一位 / 收尾者的令牌对不上)。 */
45
+ export type SessionDeletionFenceAnswer = SessionDeletionTicket | {
46
+ readonly inProgress: true;
47
+ } | undefined;
48
+ /**
49
+ * 别的进程里一次删除的令牌**多久之后**才可以被接管(SQL 多副本:另一副本上那一次删除可能还活着,本进程看不见它)—— 令牌是 uuidv7,它的时刻就是那一次尝试的起点。
50
+ * 一次删除的各腿通常几秒内跑完(子代停止有轮次上界、后台 shell 的硬杀宽限是秒级);十分钟之后仍未删完的读作那一次已死(崩溃 / 进程被杀)。
51
+ * 如实的边:一次活着却卡过十分钟的删除会被接管,它此后的每一腿之前读到令牌已换、就此停 —— 两腿之间的那一拍是披露的残余(`src/boot/session-faces.ts` 的协调器注)。
52
+ * local 数据根独占(一个数据根恒一个进程),别的进程的令牌一律是死的 ⇒ 不读这只数。
53
+ */
54
+ export declare const CROSS_PROCESS_TAKEOVER_AFTER_MS: number;
55
+ /** 一只令牌(uuidv7)的铸造时刻(ms;读不出 ⇒ `undefined`,读者按「刚铸」处置 —— 不接管)。 */
56
+ export declare function deletionTokenMintedAt(token: string): number | undefined;
57
+ /** 会话店的删除面(三只会话店各一只实现,暖缓存包装原样转发;一只能力位 —— 三个动词同在或同缺)。 */
58
+ export interface SessionDeletionFace {
59
+ /**
60
+ * 立围栏:根行锁里 ——
61
+ * · 活行 ∧ 属主是 `owner`(字面相等,`null` 与 `null` 相等)∧ 不带 `expect` ⇒ 判认领(在 ⇒ 抛 `SessionActiveRunError`,一个字节不写)、写新令牌;
62
+ * · 在删行 ∧ 属主等 ∧(不带 `expect` 或持有的就是它)⇒ 持有它的那一次**仍可能活着**(`holder` 答 `running`;SQL 另加:答 `elsewhere` 而令牌铸于
63
+ * {@link CROSS_PROCESS_TAKEOVER_AFTER_MS} 之内 —— 别的副本上那一次可能还在跑)⇒ `{ inProgress }`(不接管、不写);否则(那一次已死)⇒ **接管**:换新令牌
64
+ * (在删期间认领落不下,不再判);带 `expect` 而持有的不是它 ⇒ `undefined`;
65
+ * · 行不在 / 属主不等 / 带 `expect` 而这一行是活的 ⇒ `undefined`(一个字节不写)—— 收尾者永远不把一只活行送进在删。
66
+ */
67
+ fence(sessionId: string, owner: string | null, opts: SessionDeletionFenceOptions): Promise<SessionDeletionFenceAnswer>;
68
+ /** `token` 此刻仍是这只会话的在删令牌(无锁一读;行不在 / 活 / 别的令牌 ⇒ `false`)。 */
69
+ holds(sessionId: string, token: string): Promise<boolean>;
70
+ /** 此刻处于在删态的全部行(按 id 排序)。 */
71
+ pending(): Promise<readonly PendingSessionDeletion[]>;
72
+ }
73
+ /**
74
+ * 删除协调器的结局(`DELETE /v1/sessions/:id` 读它,一形一句):
75
+ * · `{ deleted: true }` —— 这一次删完了(终刀删掉了行);`{ deleted: false }` —— 门验过之后行已不在 / 不是这一位的(什么都没删);
76
+ * · `{ active }` —— 围栏判到认领(409 `conflict.session_active_run`,一字节没写);`{ childrenAlive }` —— 子代预检拒(409 `conflict.session_children_alive`,一字节没写);
77
+ * · `{ inProgress: true }` —— 同一只会话的另一次删除持有它(仍在跑,或接管了这一次)—— 409 `conflict.session_deleting`,由那一次删完;这次请求不再删任何东西。
78
+ */
79
+ export type SessionPurgeOutcome = {
80
+ readonly deleted: boolean;
81
+ } | {
82
+ readonly active: string;
83
+ } | {
84
+ readonly childrenAlive: readonly string[];
85
+ } | {
86
+ readonly inProgress: true;
87
+ };
88
+ //# sourceMappingURL=session-deletion.d.ts.map
@@ -0,0 +1,8 @@
1
+ export const CROSS_PROCESS_TAKEOVER_AFTER_MS = 10 * 60_000;
2
+ export function deletionTokenMintedAt(token) {
3
+ const hex = token.replace(/-/g, "");
4
+ if (!/^[0-9a-f]{32}$/i.test(hex) || hex[12] !== "7")
5
+ return undefined;
6
+ return parseInt(hex.slice(0, 12), 16);
7
+ }
8
+ //# sourceMappingURL=session-deletion.js.map