@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
@@ -168,6 +168,16 @@ export class SqlWorkflowRunStore {
168
168
  }
169
169
  const KIND_SERVED = "served";
170
170
  const KIND_PURGE = "purge";
171
+ export async function writeInboxPurgeFenceOn(exec, dialect, sessionId, purgedOwner, now) {
172
+ const known = purgedOwner !== undefined ? 1 : 0;
173
+ await exec.query(dialect === "mysql"
174
+ ? "INSERT INTO workflow_inbox_fence (session_id, kind, run_id, owner, owner_known, until_ms) VALUES (?,?,?,?,?,?) " +
175
+ "ON DUPLICATE KEY UPDATE owner = VALUES(owner), owner_known = VALUES(owner_known), until_ms = VALUES(until_ms)"
176
+ : "INSERT INTO workflow_inbox_fence (session_id, kind, run_id, owner, owner_known, until_ms) VALUES ($1,$2,'',$3,$4,$5) " +
177
+ "ON CONFLICT (session_id, kind, run_id) DO UPDATE SET owner = EXCLUDED.owner, owner_known = EXCLUDED.owner_known, until_ms = EXCLUDED.until_ms", dialect === "mysql"
178
+ ? [sessionId, KIND_PURGE, "", purgedOwner ?? null, known, now + PURGE_FENCE_MS]
179
+ : [sessionId, KIND_PURGE, purgedOwner ?? null, known, now + PURGE_FENCE_MS]);
180
+ }
171
181
  export class SqlWorkflowCompletionInbox {
172
182
  db;
173
183
  onWarn;
@@ -241,11 +251,7 @@ export class SqlWorkflowCompletionInbox {
241
251
  async purge(sessionId, purgedOwner) {
242
252
  const now = Date.now();
243
253
  await this.sweepFences(now);
244
- await this.db.query(this.q("INSERT INTO workflow_inbox_fence (session_id, kind, run_id, owner, owner_known, until_ms) VALUES (?,?,?,?,?,?) " +
245
- "ON DUPLICATE KEY UPDATE owner = VALUES(owner), owner_known = VALUES(owner_known), until_ms = VALUES(until_ms)", "INSERT INTO workflow_inbox_fence (session_id, kind, run_id, owner, owner_known, until_ms) VALUES ($1,$2,'',$3,$4,$5) " +
246
- "ON CONFLICT (session_id, kind, run_id) DO UPDATE SET owner = EXCLUDED.owner, owner_known = EXCLUDED.owner_known, until_ms = EXCLUDED.until_ms"), this.db.dialect === "mysql"
247
- ? [sessionId, KIND_PURGE, "", purgedOwner ?? null, purgedOwner !== undefined ? 1 : 0, now + PURGE_FENCE_MS]
248
- : [sessionId, KIND_PURGE, purgedOwner ?? null, purgedOwner !== undefined ? 1 : 0, now + PURGE_FENCE_MS]);
254
+ await writeInboxPurgeFenceOn(this.db, this.db.dialect, sessionId, purgedOwner, now);
249
255
  await this.db.query(this.q("DELETE FROM workflow_completion_inbox WHERE session_id = ?", "DELETE FROM workflow_completion_inbox WHERE session_id = $1"), [sessionId]);
250
256
  }
251
257
  async markTerminalServed(sessionId, runId) {
@@ -1,5 +1,6 @@
1
1
  import type { ApprovalHmacKey, PrincipalJwtKey } from "./auth-keys.js";
2
2
  import { type ApprovalEnvelope } from "./approval-hmac.js";
3
+ import { type Person } from "./owner-brands.js";
3
4
  /**
4
5
  * 验签允许的**时钟不一致容差**(秒)—— 本仓这条轴上的单一来源。
5
6
  *
@@ -45,8 +46,6 @@ export declare function verifyPrincipalJwt(token: string, keys: PrincipalJwtKey[
45
46
  * 形:`sha256(utf8(editedPlan))` hex —— 与 `approvalBnd` 同摘要、同编码;逐字节,不归一化(签名器与 worker
46
47
  * 必须对同一串字节达成一致,任何"归一化"都是第二个写者)。
47
48
  */
48
- /** 良构 Unicode(无孤立代理项)。`u` 旗下配对代理项是一个码点、不匹配 `\p{Surrogate}`;只有孤立的才命中。 */
49
- export declare function isWellFormedUnicode(s: string): boolean;
50
49
  export declare function editedPlanBinding(editedPlan: string): string;
51
50
  /**
52
51
  * JWT `cnf.bnd` = **「这份身份凭据被签发去决哪一张卡」**(动作身份),故只哈希前三位。
@@ -79,10 +78,11 @@ export interface SingleUseProof {
79
78
  */
80
79
  readonly acceptedBeforeMs: number;
81
80
  }
82
- /** {@link verifyDirectDoorProof} 的判决。`singleUse` 在场 = 调用方必须在改任何状态**之前**消费它一次。 */
81
+ /** {@link verifyDirectDoorProof} 的判决。`singleUse` 在场 = 调用方必须在改任何状态**之前**消费它一次。`principal` = 这一次决定的证明推出的人
82
+ * (带 `Person` 品牌:本函数是它的铸点之一 —— 决定口用它替换请求身份,`http/owner-access.ts` 的 `callerOfDecision` 按请求的场景铸决定者的主体)。 */
83
83
  export type DirectDoorProofResult = {
84
84
  ok: true;
85
- principal: string;
85
+ principal: Person;
86
86
  singleUse?: SingleUseProof;
87
87
  } | {
88
88
  ok: false;
@@ -1,5 +1,7 @@
1
1
  import { createHash, createPublicKey, verify as cryptoVerify } from "node:crypto";
2
2
  import { verifyApprovalHmac } from "./approval-hmac.js";
3
+ import { mintPerson } from "./owner-brands.js";
4
+ import { PRINCIPAL_MAX_BYTES, isWellFormedUnicode, principalShapeProblem } from "./principal-shape.js";
3
5
  export const PRINCIPAL_JWT_CLOCK_SKEW_SEC = 30;
4
6
  function b64urlToBuf(s) {
5
7
  return Buffer.from(s, "base64url");
@@ -72,9 +74,6 @@ export function verifyPrincipalJwt(token, keys, expect) {
72
74
  const bnd = typeof payload.cnf?.bnd === "string" ? payload.cnf.bnd : undefined;
73
75
  return { sub: payload.sub, bnd, acceptedBeforeMs: (Math.floor(payload.exp + skew) + 1) * 1000 };
74
76
  }
75
- export function isWellFormedUnicode(s) {
76
- return !/\p{Surrogate}/u.test(s);
77
- }
78
77
  export function editedPlanBinding(editedPlan) {
79
78
  if (!isWellFormedUnicode(editedPlan))
80
79
  throw new Error("editedPlanBinding: editedPlan is not well-formed Unicode (lone surrogate) — utf8 hashing would be lossy");
@@ -104,8 +103,24 @@ export function verifyDirectDoorProof(proof, envelope, config, opts) {
104
103
  const ok = verifyApprovalHmac(envelope, proof.mac, proof.kid, config.approvalHmacKeys);
105
104
  if (!ok)
106
105
  return { ok: false, status: 401, errorCode: "approval_mac_invalid", error: "approval envelope MAC invalid" };
106
+ const shape = principalShapeProblem(verified.sub);
107
+ switch (shape) {
108
+ case undefined:
109
+ break;
110
+ case "not_a_name":
111
+ return { ok: false, status: 400, errorCode: "principal_not_a_name", error: "principal token subject is not a principal name — the issuer must sign a visible-character identity" };
112
+ case "reserved":
113
+ return { ok: false, status: 400, errorCode: "principal_reserved", error: "principal token subject is a reserved identifier (an internal scope sentinel or a scenario subject) — the issuer must sign the person's own identifier" };
114
+ case "too_long":
115
+ return { ok: false, status: 400, errorCode: "principal_too_long", error: `principal token subject exceeds ${PRINCIPAL_MAX_BYTES} UTF-8 bytes` };
116
+ default: {
117
+ const unknownShape = shape;
118
+ throw new Error(`verifyDirectDoorProof: unknown principal shape problem ${String(unknownShape)}`);
119
+ }
120
+ }
121
+ const principal = mintPerson(verified.sub);
107
122
  return actionBinding
108
- ? { ok: true, principal: verified.sub }
109
- : { ok: true, principal: verified.sub, singleUse: { nonce: envelope.boundCallId, acceptedBeforeMs: verified.acceptedBeforeMs } };
123
+ ? { ok: true, principal }
124
+ : { ok: true, principal, singleUse: { nonce: envelope.boundCallId, acceptedBeforeMs: verified.acceptedBeforeMs } };
110
125
  }
111
126
  //# sourceMappingURL=principal-jwt.js.map
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 🔴 **主体长度的唯一定义:至多这么多个 UTF-8 字节。** 凡判「这只串当不当得了主体 / 主体身份键」的长度,一律读它、按字节数(`Buffer.byteLength(s, "utf8")`):
3
+ * 本文件的判官、收件箱的键判官(收件箱 scope 就是主体)、记忆退出名单的判、两处运维 `?scope=` 查询、规则面的运维目标、配额三表两方言的身份列宽。
4
+ * 为什么是字节:主体原样落进的最窄一类列是按字节计宽的 `VARBINARY(190)`(收件箱 / 后台子代 / 名册的键列);按字符计宽的 `VARCHAR(190)`(TiDB utf8mb4 与 PG
5
+ * 都数码点)装得下任何 190 字节的串(一个码点至少一个字节)。所以 190 字节 ≤ 「190 家族」每一只主体列,升到本尺不需要改任何既有列。
6
+ * 不同源的 190(会话 / run / 工具调用 id 列的历史宽度惯例、断路器键、跨会话信封来源位、编码后的记忆 scope 列、令牌 scope 声明)不读本常量。
7
+ */
8
+ export declare const PRINCIPAL_MAX_BYTES = 190;
9
+ /**
10
+ * 良构 Unicode(无孤立代理项)的唯一判式 —— 主体名判官的一格(下面),也是收件箱键判官与编辑计划绑定摘要的同一读法(住在叶子里,三处都能值导入、不成环)。
11
+ * `u` 旗下配对代理项是一个码点、不匹配 `\p{Surrogate}`;只有孤立的才命中。
12
+ */
13
+ export declare function isWellFormedUnicode(s: string): boolean;
14
+ /** 修1 — the SINGLE registry of internal sentinel/scope identifiers a tenant principal must never equal.
15
+ * 🔴 新增内部 sentinel scope 必须在此登记(精确值加 RESERVED_PRINCIPALS,前缀族加
16
+ * RESERVED_PRINCIPAL_PREFIXES),否则 assertPrincipalShape 会放行同名租户 = 与内部 scope 行合流的超范围面。
17
+ * Current entries (where each is minted): `"_"` = single-user/anonymous sentinel (checkpoint/sendfile/
18
+ * resource-suspend scope family); `"__none__"` = the missing-principal read placeholder of the approval
19
+ * queue faces up to 7.132.x (7.133.0 reads the anonymous group `"_"` instead; still reserved because a 7.132.x replica in the same
20
+ * rolling upgrade lists that scope for anonymous callers, so a tenant by that name would merge with them there); `"_leader"` = leader durable-approval scope
21
+ * (src/leader/wire.ts); prefix `"_leader-"` = the leader resource-suspend scope family
22
+ * (`_leader-resource-<workerId>`, src/leader/wire.ts); prefix `"_orphan:"` = the owner written on a delegated session whose
23
+ * delegation ancestors are gone (`_orphan:<sessionId>`, src/delegated-session-owner.ts) — a caller allowed to authenticate as it
24
+ * would read that transcript; prefix `"_scn:"` = a subject that carries a scenario (`_scn:<scenario>:<person>`, `owner-brands.ts` `subjectOf`) —
25
+ * a caller allowed to authenticate as it would BE another person's scenario partition. NB the `_leader-` prefix REQUIRES the hyphen — a tenant named
26
+ * `_leaderX` collides with nothing internal and stays valid (boundary pinned by test). */
27
+ export declare const RESERVED_PRINCIPALS: readonly string[];
28
+ export declare const RESERVED_PRINCIPAL_PREFIXES: readonly string[];
29
+ /** The principal-shape rule as a VERDICT (the one judge; {@link assertPrincipalShape} is its throwing reader). `undefined` = a
30
+ * principal may carry this string; otherwise which rule it breaks. A reader that only needs "can this string be anyone?" (the
31
+ * organization delivery gate's recipient: a string that breaks the rule is nobody, refused with the same bytes as an unknown
32
+ * principal) reads the verdict instead of catching the throw.
33
+ *
34
+ * Order: "is it a name at all" first — the other two rules presuppose a name (a reserved identifier / a name too wide for the
35
+ * column), and the `reserved` sentence echoes the value while the `not_a_name` sentence never does (a string that names nobody may be a
36
+ * pasted credential). An empty string is `not_a_name` here (the engine's judge says so); so is a string that is not well-formed Unicode (a lone
37
+ * surrogate is no character). A header reader that treats a blank header as "no principal" decides that before asking. `too_long` counts UTF-8 bytes
38
+ * ({@link PRINCIPAL_MAX_BYTES}). */
39
+ export type PrincipalShapeProblem = "not_a_name" | "reserved" | "too_long";
40
+ export declare function principalShapeProblem(principal: string): PrincipalShapeProblem | undefined;
41
+ //# sourceMappingURL=principal-shape.d.ts.map
@@ -0,0 +1,19 @@
1
+ import { principalNameOf } from "@sema-agent/core";
2
+ import { ORPHAN_SESSION_OWNER_PREFIX } from "./delegated-session-owner.js";
3
+ import { SCENARIO_SUBJECT_PREFIX } from "./owner-brands.js";
4
+ export const PRINCIPAL_MAX_BYTES = 190;
5
+ export function isWellFormedUnicode(s) {
6
+ return !/\p{Surrogate}/u.test(s);
7
+ }
8
+ export const RESERVED_PRINCIPALS = ["_", "__none__", "_leader"];
9
+ export const RESERVED_PRINCIPAL_PREFIXES = ["_leader-", ORPHAN_SESSION_OWNER_PREFIX, SCENARIO_SUBJECT_PREFIX];
10
+ export function principalShapeProblem(principal) {
11
+ if (principalNameOf(principal) === undefined || !isWellFormedUnicode(principal))
12
+ return "not_a_name";
13
+ if (RESERVED_PRINCIPALS.includes(principal) || RESERVED_PRINCIPAL_PREFIXES.some((p) => principal.startsWith(p)))
14
+ return "reserved";
15
+ if (Buffer.byteLength(principal, "utf8") > PRINCIPAL_MAX_BYTES)
16
+ return "too_long";
17
+ return undefined;
18
+ }
19
+ //# sourceMappingURL=principal-shape.js.map
@@ -1,4 +1,5 @@
1
1
  import { type AskQuestionRequest, type OnQuestionOutcome, type QuestionAnswer, type AskQuestion } from "@sema-agent/core";
2
+ import { type HitlTransport } from "./hitl-delivery.js";
2
3
  /** A live question frame delivered to whoever tails this run's stream. `type` IS the SSE event name (mirrors the
3
4
  * named-event convention; the payload also carries `type` so a proxy that strips event names still works). The shell
4
5
  * renders `question` as a dialog and dismisses on `question_complete`. */
@@ -23,30 +24,20 @@ export interface QuestionFrame {
23
24
  /** "question" only: `serverNowMs + expiresInMs` — absolute deadline on the server's clock. */
24
25
  expiresAtMs?: number;
25
26
  }
26
- /** The per-run context `onQuestion` recovers via ALS. `emit` delivers a frame to the run's stream; `abortSignal`
27
- * (the run's own cancel signal) releases a question parked awaiting a human when the run aborts.
27
+ /** The per-run context `onQuestion` recovers via ALS. `transport` = the leg's ONE HITL transport (shared with the elicitation
28
+ * and approval contexts of the same leg; `hitl-delivery.ts` owns the law: ledger first, then live — a frame the ledger
29
+ * cannot take never reaches the live face). `abortSignal` (the run's own cancel signal) releases a question parked
30
+ * awaiting a human when the run aborts.
28
31
  *
29
- * 🔴 ONE LAW for every leg: a question frame that enters a run's stream has a LEDGER TWIN (the row
30
- * `GET /v1/runs/:id/events` replays — a page reload recovers the open card from it); the leg decides only whether it
31
- * ALSO writes a live socket. The background leg has no socket, so its `emit` IS the durable append; the synchronous
32
- * stream leg lands the same frame in the ledger first and then writes the SSE connection (`createLedgerTwinEmit`).
33
32
  * The ledger carries the CARD, not the answer door: `POST /v1/questions/:id/respond` stays live-only (this replica's
34
- * memory, `ttlMs`), so a replayed card is answerable only until its own `expiresAtMs` and only on this replica. */
33
+ * memory, `ttlMs`), so a replayed card is answerable only until its own `expiresAtMs` and only on this replica.
34
+ * The adjudication probe ({@link QuestionCoordinator.hasLiveContext}) reads the same transport's `reachable()` — one
35
+ * reading of "can this leg's face show a card right now?". */
35
36
  export interface QuestionRunContext {
36
37
  taskId: string;
37
38
  owner: string | null;
38
- emit: (frame: QuestionFrame) => void | Promise<void>;
39
+ transport: HitlTransport<QuestionFrame>;
39
40
  abortSignal?: AbortSignal;
40
- /** OPTIONAL reachability predicate for this leg's LIVE delivery face — one reading, two consumers:
41
- * {@link QuestionCoordinator.hasLiveContext} (the park-vs-live adjudication probe) and the OPEN frame itself (a face
42
- * that cannot show the card right now refuses the ask on the spot, the same failed-delivery arm, instead of parking it
43
- * to TTL on a ledger row nobody is watching). CONSTRAINT: a leg whose face can go away WHILE the leg keeps running MUST
44
- * supply it — `/v1/tasks/stream` under `x-detach-on-disconnect: true` keeps executing inside this ALS scope after the
45
- * client left. Without the predicate the adjudication would read "live" and hand the leg to a face nobody can reach.
46
- * ABSENT ⇒ always reachable, which is exactly right for the background leg (its face IS the durable events tail,
47
- * readable whenever a client attaches). The CLOSE frame never asks it: it is a record, and it lands in the ledger twin
48
- * whether or not the socket is still there. */
49
- deliverable?: () => boolean;
50
41
  }
51
42
  /** The per-run question window the deployment owns (core caps nothing). Env: `QUESTION_MAX_CONCURRENT_PER_RUN` /
52
43
  * `QUESTION_MAX_TOTAL_PER_RUN` / `QUESTION_TTL_MS` (see `ServiceConfig.questionThrottle`). */
@@ -91,7 +82,7 @@ export declare class QuestionCoordinator {
91
82
  question: (req: AskQuestionRequest, signal?: AbortSignal) => Promise<OnQuestionOutcome>;
92
83
  /** `POST /v1/questions/:id/respond` — resolve a parked question with the shell's answer. Owner-gated with a 404 (no
93
84
  * existence oracle): a non-owner AND an unknown id (answered / expired / wrong replica) both get 404. Returns the
94
- * HTTP {status, body}; the HTTP layer owns auth (gatedPrincipal + REQUIRE_PRINCIPAL) before calling. */
85
+ * HTTP {status, body}; the HTTP layer owns auth (gatedSubject + REQUIRE_PRINCIPAL) before calling. */
95
86
  respond(id: string, principal: string | undefined, body: unknown): {
96
87
  status: number;
97
88
  body: unknown;
@@ -103,10 +94,9 @@ export declare class QuestionCoordinator {
103
94
  * resolve-spec 的 durable question policy 用它在**判决时**分腿:有活流 ⇒ allow(问活人),无 ⇒
104
95
  * ask(durable park)。ALS 让这个判断天然 per-leg,policy 组装期不必预知腿别。
105
96
  * 🔴 判据是「投递面此刻可达」而不只是「ALS 在场」(复审 A1):detach 腿断连后 run 仍在本作用域里跑,
106
- * 只判 ALS 会把一条谁也收不到的问题判成 allow——挂满 ttl 后以 unavailable 结算,非 durable 形 core
107
- * 就此合成续跑,活人再没机会答;而 park 才是它该走的腿。
108
- * 谓词缺席 ⇒ 恒可达(后台腿的 durable events tail 语义)。谓词本身抛错按不可达处理:判决面
109
- * fail-closed 到 park(park 可由运维补答,续跑掉的问题不可回收)。 */
97
+ * 只判 ALS 会把一条谁也收不到的问题判成 allow;park 才是它该走的腿。读的是本腿传输的 `reachable()`
98
+ * (有直写面 ⇒ 直写此刻活着;只有账本 ⇒ 恒真,后台腿的 durable events tail 语义;谓词读不出 ⇒ 假,判决面 fail-closed 到 park)。
99
+ * 只服务判决面:判决放行之后的开帧投递只读传输律(有账本的腿上死直写 = 卡在账本里,送到)。 */
110
100
  hasLiveContext(): boolean;
111
101
  private countersFor;
112
102
  }
package/dist/question.js CHANGED
@@ -3,17 +3,9 @@ import { uuidv7 } from "@sema-agent/core";
3
3
  import { redactDeep } from "./trace/redact.js";
4
4
  import { recordFailOpen } from "./observability/fail-open.js";
5
5
  import { refusalBody } from "./http/refusal-body.js";
6
+ import { keyAdmits, ownerCellOf, recoveredSubject } from "./owner-faces.js";
7
+ import { createHitlOpenRace } from "./hitl-delivery.js";
6
8
  const MAX_QUESTIONS_BYTES = 16384;
7
- function isFaceReachable(ctx) {
8
- if (ctx.deliverable === undefined)
9
- return true;
10
- try {
11
- return ctx.deliverable();
12
- }
13
- catch {
14
- return false;
15
- }
16
- }
17
9
  export const DEFAULT_QUESTION_THROTTLE = {
18
10
  maxConcurrentPerRun: 2,
19
11
  maxTotalPerRun: 20,
@@ -113,39 +105,29 @@ export class QuestionCoordinator {
113
105
  signal?.addEventListener("abort", onAbort, { once: true });
114
106
  ctx.abortSignal?.addEventListener("abort", onAbort, { once: true });
115
107
  this.pending.set(id, { settle, owner: ctx.owner, taskId: ctx.taskId });
116
- const emitted = (async () => {
117
- if (!isFaceReachable(ctx))
118
- throw new Error("question delivery face unreachable — the open frame has nobody to show it to");
119
- const now = Date.now();
120
- await ctx.emit({ type: "question", questionId: id, questions, serverNowMs: now, expiresInMs: this.throttle.ttlMs, expiresAtMs: now + this.throttle.ttlMs });
121
- return isFaceReachable(ctx) ? "ok" : "landed-face-gone";
122
- })()
123
- .then((r) => r, () => "failed");
124
- const delivery = await Promise.race([emitted, answerP.then(() => "stalled")]);
125
- if (delivery === "ok" || delivery === "landed-face-gone") {
108
+ const now = Date.now();
109
+ const race = createHitlOpenRace({
110
+ targets: [{ transport: ctx.transport, frame: { type: "question", questionId: id, questions, serverNowMs: now, expiresInMs: this.throttle.ttlMs, expiresAtMs: now + this.throttle.ttlMs } }],
111
+ settled: answerP,
112
+ });
113
+ const phase = await race.phase;
114
+ if (phase === "delivered") {
126
115
  rc.total += 1;
127
- if (delivery === "landed-face-gone") {
128
- recordFailOpen("server.question.open-frame-undelivered", `question=${id} face-gone-while-landing`);
129
- settle(UNAVAILABLE, "unanswered");
130
- }
131
116
  }
132
- else if (delivery === "failed") {
117
+ else if (phase === "undelivered") {
133
118
  recordFailOpen("server.question.open-frame-undelivered", `question=${id}`);
134
119
  settle(UNAVAILABLE, "unanswered");
135
120
  }
136
- const answer = await answerP;
137
- void emitted
138
- .then((result) => {
139
- if (result === "failed") {
140
- if (delivery === "stalled")
121
+ else {
122
+ void race.landing.then((late) => {
123
+ if (late === "delivered")
124
+ rc.total += 1;
125
+ else
141
126
  recordFailOpen("server.question.open-frame-undelivered", `question=${id}`);
142
- return undefined;
143
- }
144
- if (delivery === "stalled")
145
- rc.total += 1;
146
- return ctx.emit({ type: "question_complete", questionId: id, outcome: lastOutcome, serverNowMs: Date.now() });
147
- })
148
- .catch(() => recordFailOpen("server.question.complete-breadcrumb-dropped", `question=${id}`));
127
+ });
128
+ }
129
+ const answer = await answerP;
130
+ race.close({ type: "question_complete", questionId: id, outcome: lastOutcome, serverNowMs: Date.now() });
149
131
  return answer;
150
132
  };
151
133
  respond(id, principal, body) {
@@ -153,7 +135,7 @@ export class QuestionCoordinator {
153
135
  if (!parsed.ok)
154
136
  return { status: 400, body: refusalBody({ errorCode: "request.body_shape", message: parsed.error }) };
155
137
  const entry = this.pending.get(id);
156
- if (!entry || (entry.owner !== null && entry.owner !== principal)) {
138
+ if (!entry || !keyAdmits("ask.answer", { subject: recoveredSubject(principal), operator: false }, ownerCellOf(entry.owner))) {
157
139
  return { status: 404, body: refusalBody({ errorCode: "question.not_pending", message: "no pending question for this id (answered, expired, or not on this replica)" }) };
158
140
  }
159
141
  entry.settle(parsed.value, "answered");
@@ -164,7 +146,7 @@ export class QuestionCoordinator {
164
146
  }
165
147
  hasLiveContext() {
166
148
  const ctx = this.als.getStore();
167
- return ctx !== undefined && isFaceReachable(ctx);
149
+ return ctx !== undefined && ctx.transport.reachable();
168
150
  }
169
151
  countersFor(taskId) {
170
152
  let rc = this.counters.get(taskId);
@@ -6,11 +6,16 @@
6
6
  * ① **列表**:在场却不是数组 / 超过挂载上限 / 某一条不是对象 ⇒ `400 request.field_invalid`(整份拒而不是挂前 N 条 / 摘掉读不出的那条:一份被悄悄截短的声明,在发送方那里读起来是「生效了」);
7
7
  * 超上限用撞帽的唯一铸点({@link limitRefusal}),拒体带机读位一组键(`field` · `reason:"over_cap"` · `count` · `cap`);
8
8
  * ② **键名**:条目层的词表外键 ⇒ `400 request.body_shape` + `unknownKeys`(句子由各座自己写 —— 受理键表与嵌套层是座位自己的事);
9
- * ③ **键值**:每个受理键一只判官 ⇒ `400 request.field_invalid`,句子 `<坐标>.<键路径> (<subject> "<名>") is not a usable declaration — <判官原因句>. …`,不回显值;
9
+ * ③ **键值**:每个受理键一只判官 ⇒ `400 request.field_invalid`,句子 `<坐标>.<键路径>[ (<条目指认>)] is not a usable declaration — <判官原因句>. …`(条目指认由座位给:有申报名的座位 `(server "<名>")`,没有名字的座位不带),不回显值;
10
10
  * 判官答「URL 带凭据」时拒体另带机读位 `field` / `reason`({@link urlCredentialFacts})。
11
11
  * 第一处坏形即答:先列表、后条目;条目里先键名、后键值。各座只写**自己的**两件事:受理键表 + 键值判官表(以及它自己的词表外键句)。拒形、句尾、撞帽句不在座位文件里手拼 ——
12
12
  * 两份手拼的拒形迟早分岔(`a2aPeers` 上线时就是缺了这一整套,坏形换回 200 + 运维 warn,调用方以为声明生效了)。
13
13
  *
14
+ * ## 机读位(`request.field_invalid` 的每一只拒都带)
15
+ * 列表级与条目级的 `request.field_invalid` 拒体恒带 `field`(体内坐标:列表键 / `<列表>[i]` / `<列表>[i].<键路径>`),条目级(含条目不是对象)另带 `index`(条目在列表里的下标);撞帽那一形仍是撞帽的一组键,
16
+ * URL 带凭据那一形在 `field` / `reason` 之外同带 `index`。机读位只在这里铸:判官({@link DeclarationKeyJudge})只交原因,`field` 由原因的键路径铸、`index` 由骨架的循环铸 —— 座位与判官不手拼坐标。
17
+ * `request.body_shape` 的词表外键拒另有自己的机读位(`unknownKeys`,全坐标),不在这一组。
18
+ *
14
19
  * ## 射程
15
20
  * 纯值域、与租户车道无关;只在 fresh 提交腿上问(`boot/resolve-spec.ts` 的 `opts.leg`):重放存量 body 的腿走宽容读器,一个 4xx 打在 resume 上会永久砖死一条 parked 任务。
16
21
  */
@@ -19,26 +24,44 @@ import { type LimitFacts } from "./limit-refusal.js";
19
24
  import { type UrlCredentialFacts } from "./url-credential-refusal.js";
20
25
  /** 一座声明列表的名字与上限、以及拒句里要用的称呼(座位的常量,铸点只读)。 */
21
26
  export interface DeclarationSeat {
22
- /** 请求体里这张列表的键,也是机读坐标的根(`mcpServers` | `a2aPeers`)。 */
27
+ /** 请求体里这张列表的键,也是机读坐标的根(`mcpServers` | `a2aPeers` | `images`)。 */
23
28
  readonly list: string;
24
29
  /** 挂载上限(条数;超过 ⇒ 撞帽拒)。 */
25
30
  readonly cap: number;
26
- /** 一条声明所声明的东西(拒句里的单数名词:`server` | `peer`)。 */
27
- readonly subject: string;
31
+ /** 条目级拒句里条目的指认(带前导空格,接在坐标后):有申报名的座位 = ` (server "<名>")`;坐标本身唯一的座位(没有名字的条目)= 空串。 */
32
+ readonly identify: (entry: Record<string, unknown>) => string;
33
+ /** 条目级拒句的收尾句:说清「为什么整份请求被拒、而不是照坏条目办」与出路。 */
34
+ readonly entryTail: string;
28
35
  /** 「一条声明」的整称(`an MCP server declaration`)。 */
29
36
  readonly declaration: string;
30
37
  /** 「多条声明」的整称(`MCP server declarations`)。 */
31
38
  readonly declarations: string;
32
39
  }
40
+ /** 有申报名、挂在一个外部服务上的座位(`mcpServers` · `a2aPeers`)的座位常量:指认 = ` (<subject> "<名>")`,收尾句说「不挂就跑偏」。`subject` = 一条声明所声明的东西(`server` | `peer`)。 */
41
+ export declare function createMountSeat(o: {
42
+ readonly list: string;
43
+ readonly cap: number;
44
+ readonly subject: string;
45
+ readonly declaration: string;
46
+ readonly declarations: string;
47
+ }): DeclarationSeat;
33
48
  /** 一次拒绝:码 + 句 + 词表外的键名表(只在闭集那一形上在场)+ 机读位(撞帽 / URL 带凭据两形上在场)。受理口(同步 400)与探测口(`POST …/probe`)原样转述同一份。 */
34
49
  export interface DeclarationRefusal {
35
50
  readonly errorCode: "request.body_shape" | "request.field_invalid";
36
51
  readonly message: string;
37
52
  /** 词表外的键,全路径形(已清洗 + 截长 + 排序 + 封顶)。 */
38
53
  readonly unknownKeys?: readonly string[];
39
- /** 撞帽:`field` · `reason:"over_cap"` · `count` · `cap`;URL 带凭据:`field` · `reason`(判官的拒因词)。 */
40
- readonly facts?: UrlCredentialFacts | LimitFacts;
54
+ /** 机读位:撞帽 = `field` · `reason:"over_cap"` · `count` · `cap`;URL 带凭据 = `field` · `reason`(判官的拒因词)· `index`;其余 `request.field_invalid` = `field`(条目级另带 `index`)。 */
55
+ readonly facts?: DeclarationEntryFacts | LimitFacts;
41
56
  }
57
+ /** 条目判官(座位的 `judgeEntry` · 键值判官表)交回的拒:机读位只会是条目级的那一组({@link DeclarationEntryFacts}),撞帽那一形只由骨架的列表级铸 —— 所以补 `index` 的函数收窄到这一型,不靠运行期猜。 */
58
+ export type EntryRefusal = Omit<DeclarationRefusal, "facts"> & {
59
+ readonly facts?: DeclarationEntryFacts;
60
+ };
61
+ /** 列表级 / 条目级 `request.field_invalid` 拒的机读位:`field` 恒在;`index` = 条目级才有(条目在列表里的下标);URL 带凭据那一形另带判官的拒因词 `reason`。 */
62
+ export type DeclarationEntryFacts = (Pick<UrlCredentialFacts, "field"> | UrlCredentialFacts) & {
63
+ readonly index?: number;
64
+ };
42
65
  /** 一处键值坏形:键路径(相对条目)+ 判官的原因句;答「URL 带凭据」时另带判官的答案(⇒ 拒体带机读位)。 */
43
66
  export interface DeclarationKeyIssue {
44
67
  readonly path: string;
@@ -55,8 +78,8 @@ export declare function declaredName(e: unknown): string;
55
78
  export declare function declarationNameIssue(entry: Record<string, unknown>): DeclarationKeyIssue | undefined;
56
79
  /** 列表级拒句的收尾句:说清「为什么整份被拒、而不是只按读得出的那部分办」与出路(空列表 = 什么都不声明)。 */
57
80
  export declare const LIST_REFUSAL_TAIL: string;
58
- /** 列表级的一处坏形 → 拒(码恒 `request.field_invalid`)。`head` 只说位置与形的**种类**,不回显值。 */
59
- export declare function declarationListRefusal(head: string): DeclarationRefusal;
81
+ /** 列表级的一处坏形 → 拒(码恒 `request.field_invalid`,体带 `field`)。`head` 只说位置与形的**种类**,不回显值;`field` = 坏形所在的体内坐标(列表键 / `<列表>[i]`)。 */
82
+ export declare function declarationListRefusal(head: string, field: string): EntryRefusal;
60
83
  /**
61
84
  * 一处键值坏形**怎么被说出来**:体内坐标(`<条目坐标>.<键路径>`)+ 判官的原因句(只剥控制与双向字符,不回显值)。受理口的拒句与读器的丢弃因(请求腿运维 warn 的 `field` / `reason`)读**这一只** ——
62
85
  * 原因只来自判官表,组句只在这里(两边各写一份,迟早分岔)。
@@ -78,17 +101,17 @@ export declare function declarationOverCapFacts(seat: DeclarationSeat, count: nu
78
101
  * 「什么算对象」只在这里判。
79
102
  */
80
103
  export declare function declarationEntryNotObject(seat: DeclarationSeat, entry: unknown, at: string): string | undefined;
81
- /** 一处键值坏形 → 拒。**所有键同一个形**;条目名过唯一的回显清洗,读不出名字的条目用占位,坐标与原因句由 {@link declarationIssueFacts} 铸。 */
82
- export declare function declarationFieldRefusal(seat: DeclarationSeat, entry: Record<string, unknown>, at: string, issue: DeclarationKeyIssue): DeclarationRefusal;
104
+ /** 一处键值坏形 → 拒。**所有键同一个形**;条目指认由座位给({@link DeclarationSeat.identify}),坐标与原因句由 {@link declarationIssueFacts} 铸,机读位 `field`(判官答 URL 带凭据时另带 `reason`)与句子点名同一个坐标。 */
105
+ export declare function declarationFieldRefusal(seat: DeclarationSeat, entry: Record<string, unknown>, at: string, issue: DeclarationKeyIssue): EntryRefusal;
83
106
  /** 一条条目的键值判官表按受理键序问一遍,第一处坏形即返回。 */
84
107
  export declare function judgeDeclarationKeys<K extends string, E extends Record<string, unknown>>(seat: DeclarationSeat, entry: E, at: string, keys: readonly K[], judges: {
85
108
  readonly [P in K]: DeclarationKeyJudge<E>;
86
- }): DeclarationRefusal | undefined;
109
+ }): EntryRefusal | undefined;
87
110
  /**
88
111
  * 一张声明列表「能不能原样用」的回答者骨架:列表级(缺席 / `null` ⇒ 没声明;不是数组 / 超上限 / 条目不是对象)在这里,条目级交座位的 `judgeEntry`(词表外的键 → 键值)。
89
112
  * `undefined` = 能原样用(或没声明;各门自己定缺席的意思)。
90
113
  */
91
- export declare function requestDeclarationRefusal(seat: DeclarationSeat, list: unknown, judgeEntry: (entry: Record<string, unknown>, at: string) => DeclarationRefusal | undefined): DeclarationRefusal | undefined;
114
+ export declare function requestDeclarationRefusal(seat: DeclarationSeat, list: unknown, judgeEntry: (entry: Record<string, unknown>, at: string) => EntryRefusal | undefined): DeclarationRefusal | undefined;
92
115
  /** 受理口的转述:有答案 ⇒ 同步 400(码 / 句 / `unknownKeys` / 机读位原样);没有 ⇒ 什么也不做。 */
93
116
  export declare function throwDeclarationRefusal(refusal: DeclarationRefusal | undefined): void;
94
117
  //# sourceMappingURL=request-declaration-refusal.d.ts.map
@@ -3,6 +3,16 @@ import { createCodedHttpError } from "./security.js";
3
3
  import { limitRefusal } from "./limit-refusal.js";
4
4
  import { echoKeyName } from "./request-key-closure.js";
5
5
  import { urlCredentialFacts } from "./url-credential-refusal.js";
6
+ export function createMountSeat(o) {
7
+ return {
8
+ list: o.list,
9
+ cap: o.cap,
10
+ identify: (entry) => ` (${o.subject} "${echoKeyName("", declaredName(entry))}")`,
11
+ entryTail: mountedEntryTail(o.subject),
12
+ declaration: o.declaration,
13
+ declarations: o.declarations,
14
+ };
15
+ }
6
16
  export const MALFORMED_NAME = "<malformed>";
7
17
  export function declaredName(e) {
8
18
  return e && typeof e === "object" && typeof e.name === "string" && e.name !== ""
@@ -14,10 +24,10 @@ export function declarationNameIssue(entry) {
14
24
  }
15
25
  export const LIST_REFUSAL_TAIL = "The request is refused rather than acting on part of the list: declarations that silently did not apply would read as in effect to whoever sent them. " +
16
26
  "Fix the list (an empty list declares none).";
17
- export function declarationListRefusal(head) {
18
- return { errorCode: "request.field_invalid", message: `${head}. ${LIST_REFUSAL_TAIL}` };
27
+ export function declarationListRefusal(head, field) {
28
+ return { errorCode: "request.field_invalid", message: `${head}. ${LIST_REFUSAL_TAIL}`, facts: { field } };
19
29
  }
20
- function entryRefusalTail(subject) {
30
+ function mountedEntryTail(subject) {
21
31
  return (`The request is refused rather than mounting the ${subject} without it: a declaration that silently did not apply would leave the ${subject} running differently from what you declared. ` +
22
32
  "Fix the entry (an optional key may also be omitted).");
23
33
  }
@@ -32,14 +42,16 @@ export function declarationEntryNotObject(seat, entry, at) {
32
42
  return entry === null || typeof entry !== "object" || Array.isArray(entry) ? `${at} is ${describeValueShape(entry)}, not ${seat.declaration} (an object)` : undefined;
33
43
  }
34
44
  export function declarationFieldRefusal(seat, entry, at, issue) {
35
- const name = echoKeyName("", declaredName(entry));
36
45
  const { field, reason } = declarationIssueFacts(at, issue);
37
46
  return {
38
47
  errorCode: "request.field_invalid",
39
- message: `${field} (${seat.subject} "${name}") is not a usable declaration — ${reason}. ${entryRefusalTail(seat.subject)}`,
40
- ...(issue.credential === undefined ? {} : { facts: urlCredentialFacts(`${at}.${issue.path}`, issue.credential) }),
48
+ message: `${field}${seat.identify(entry)} is not a usable declaration — ${reason}. ${seat.entryTail}`,
49
+ facts: issue.credential === undefined ? { field } : urlCredentialFacts(field, issue.credential),
41
50
  };
42
51
  }
52
+ function withEntryIndex(refusal, index) {
53
+ return refusal.errorCode === "request.field_invalid" && refusal.facts !== undefined ? { ...refusal, facts: { ...refusal.facts, index } } : refusal;
54
+ }
43
55
  export function judgeDeclarationKeys(seat, entry, at, keys, judges) {
44
56
  for (const key of keys) {
45
57
  const issue = judges[key](entry, at);
@@ -52,7 +64,7 @@ export function requestDeclarationRefusal(seat, list, judgeEntry) {
52
64
  if (list === undefined || list === null)
53
65
  return undefined;
54
66
  if (!Array.isArray(list))
55
- return declarationListRefusal(`${seat.list} is ${describeValueShape(list)}, not an array of ${seat.declarations}`);
67
+ return declarationListRefusal(`${seat.list} is ${describeValueShape(list)}, not an array of ${seat.declarations}`, seat.list);
56
68
  if (list.length > seat.cap) {
57
69
  const capped = limitRefusal(seat.list, "entries", list.length, seat.cap, { tail: LIST_REFUSAL_TAIL });
58
70
  return { errorCode: "request.field_invalid", message: capped.message, facts: capped.facts };
@@ -62,10 +74,10 @@ export function requestDeclarationRefusal(seat, list, judgeEntry) {
62
74
  const at = `${seat.list}[${i}]`;
63
75
  const notObject = declarationEntryNotObject(seat, entry, at);
64
76
  if (notObject !== undefined)
65
- return declarationListRefusal(notObject);
77
+ return withEntryIndex(declarationListRefusal(notObject, at), i);
66
78
  const refusal = judgeEntry(entry, at);
67
79
  if (refusal !== undefined)
68
- return refusal;
80
+ return withEntryIndex(refusal, i);
69
81
  }
70
82
  return undefined;
71
83
  }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * **请求形的拒** —— 一条律:门先于铸。
3
+ *
4
+ * 一次提交里,判据只读**请求本身**(体 · 头里验过的主体 · 到达的腿)与**进程期不变的部署配置**(车道、主体姿态、运维旋钮 —— 不是热应用的模型面)就答得出的拒,
5
+ * 在授权器铸下任何会话行之前答(受理漏斗 `http/admission.ts` 调 {@link assertRequestFormBeforeMint}):会话店零写、撤回出口零次,壳的 `--resume` 清单里不会出现这次提交。
6
+ * 铸点之后剩下的拒,判据都要读状态 —— 会话行与它的放置、店里的内容、装配器自己装配的事实(锁集、数据根、店的接线)、热应用的模型面、主体的中心裁定、在飞状态、引擎 ——
7
+ * 由提交出口(`submission-exit.ts`)在终局应答之前条件撤回收场。两类不交,也没有第三类。
8
+ *
9
+ * 分类的单位是**拒绝点**(一处拒与守着它的判据),只看判据的输入,不看它今天住在哪一段。本文件的判官在铸点之前答过,装配器(`boot/resolve-spec.ts`)对同一只判官的复判读同一份输入
10
+ * (受理门交给装配器的那一份体 · 同一只 `ServiceConfig` 的不变字段 · 按请求记忆化的主体),答同一个结论 —— 那一读是续跑重放腿与直调嵌入方的门(它们不经受理漏斗),
11
+ * 在 HTTP 新提交腿上恒不拒。
12
+ *
13
+ * 句与码的唯一属主是各判官;本文件把装配器里原先内联的几只判(`inheritEnv` 的车道与射程、工具名清单读成空、附件句柄形、写容纳面、镜像档 × 车道)收成导出函数,
14
+ * 装配器与受理门同调;规则表的那一判与存量体重放预判共用一只组合(`http/stored-body-replay.ts` 的 `ruleTablesRefusalWithoutTaskRoot`)。
15
+ */
16
+ import type { IncomingMessage } from "node:http";
17
+ import { type TaskHostPostureScope, type TaskWriteFaceInput } from "./hosted-posture.js";
18
+ import { type ToolListSide } from "./rule-entry-list.js";
19
+ import { type Scenario } from "./owner-brands.js";
20
+ import type { PermissionMode } from "@sema-agent/core";
21
+ import type { ServiceConfig } from "./config-types.js";
22
+ import type { TaskRequestBody } from "./http/wire-types.js";
23
+ /**
24
+ * 一次提交请求的场景名从哪来(唯一读法):带场景头 ⇒ 头就是本请求的场景(分区与工具面同一个场景);体再给一个不同的 ⇒ 400 `scenario_conflict`
25
+ * (只在提交腿:读面没有体)。没带头 ⇒ 体原样(缺席 ⇒ 门走指派链)。
26
+ */
27
+ export declare function scenarioRequestedBy(headerScenario: Scenario | undefined, bodyScenario: unknown): unknown;
28
+ /**
29
+ * `inheritEnv:"all"` 的车道与射程两判(值形判在 `request-value-closure.ts` 的 `inheritEnvFieldIssue`,先于本函数):只有 host 车道消费这一位 ⇒ 别的车道 400 + 机读位
30
+ * `reason: lane_not_host`;射程读写容纳面那一只谓词(`hosted-posture.ts` 腿④)⇒ 托管 422 `request.host_posture_refused`。`"scrub"` 是缺省,任何车道受理。
31
+ */
32
+ export declare function assertInheritEnvServed(body: {
33
+ readonly inheritEnv?: unknown;
34
+ }, config: TaskHostPostureScope): void;
35
+ /** 工具名清单里读成空的条目 ⇒ 400(判与句的属主 = `rule-entry-list.ts` `inertToolListEntryOf`;`sides` 缺省 = 两个方向都判,续跑腿只判限制方向)。 */
36
+ export declare function assertToolListsReadable(body: unknown, sides?: readonly ToolListSide[]): void;
37
+ /** 体 `attachmentIds` 的形:在场就必须是至多 16 只、每只 1–64 字符的串(只判形;句柄在不在、绑不绑得上读附件店,在装配器的绑定核)。 */
38
+ export declare function assertAttachmentIdsShape(raw: unknown): void;
39
+ /** 任务层「掀开写围栏」的模式词 × 部署天花板(判据与拒因属主 `hosted-posture.ts`)⇒ 422 `request.host_posture_refused`。 */
40
+ export declare function assertWriteFaceAdmitted(mode: PermissionMode | undefined, config: TaskWriteFaceInput): void;
41
+ /**
42
+ * 体点名的每任务镜像档 × 本部署的执行车道:车道不是 k8s ⇒ 501 `capability.k8s_lane_required`(这台部署接不了每任务镜像,换部署形态才行)。
43
+ * 装配器判的是**生效**的那一档(体给的 ∨ 会话绑定的);体给了档时会话绑定不读 ⇒ 这一判只读请求与车道,受理门在铸点之前判体那一档。
44
+ */
45
+ export declare function assertImageProfileLane(profile: string | undefined, config: TaskHostPostureScope): void;
46
+ /** 体上的每任务镜像档(非空串;形在受理门的值形门判过 —— 与装配器同一读法)。 */
47
+ export declare function bodyImageProfileOf(body: {
48
+ readonly sandboxImageProfile?: unknown;
49
+ }): string | undefined;
50
+ /**
51
+ * **新提交的请求形判,铸点之前一次答完**(受理漏斗在值形门之后、授权器之前调;抛 `HttpError`,与装配器的同名判同句同码)。
52
+ * `body` = 受理门盖过入口模式章的那一份(装配器拿到的就是它)。序 = 装配器里这些判的序(一份体同时撞上两只时,先答的与修前同一只):
53
+ * 主体(场景头的三判)→ MCP 条目 → `inheritEnv` 车道 / 射程 → 工具名清单 → A2A 条目(超 32 条整份拒)→ `images` → 场景头 × 体 → `attachmentIds` 形 → 写容纳面 →
54
+ * 规则表里不靠任务根的拒(三桶 → `neverAuto`)→ 体点名的镜像档 × 车道。
55
+ * 不在这里的:装配器自己装配的事实(运维锁集、数据根、店的接线)、热应用的模型面(目录 / 名单 / 拒因表)、会话 / 店 / 中心 / 在飞 / 引擎 —— 那些判在铸点之后,拒走条件撤回。
56
+ */
57
+ export declare function assertRequestFormBeforeMint(body: TaskRequestBody, req: IncomingMessage, config: ServiceConfig): void;
58
+ //# sourceMappingURL=request-form.d.ts.map