@sema-agent/server 7.150.0 → 7.152.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 (514) hide show
  1. package/MIGRATION.md +451 -0
  2. package/README.md +15 -3
  3. package/README.zh-CN.md +10 -2
  4. package/USAGE.md +144 -87
  5. package/deploy/sema-up/README.md +11 -4
  6. package/deploy/sema-up/chart/Chart.yaml +1 -1
  7. package/deploy/sema-up/chart/templates/NOTES.txt +5 -0
  8. package/deploy/sema-up/chart/templates/_helpers.tpl +15 -16
  9. package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -3
  10. package/deploy/sema-up/chart/templates/server.yaml +5 -3
  11. package/deploy/sema-up/chart/values-full-single.yaml +3 -1
  12. package/deploy/sema-up/chart/values.yaml +8 -1
  13. package/deploy/sema-up/cluster-up.sh +7 -6
  14. package/deploy/sema-up/kube-up.sh +6 -6
  15. package/deploy/sema-up/lib/flagshape.sh +36 -8
  16. package/deploy/sema-up/lib/helm-values-cluster.py +2 -0
  17. package/deploy/sema-up/lib/helm-values-kube.py +2 -0
  18. package/deploy/sema-up/machines.example.yaml +3 -1
  19. package/deploy/sema-up/sema-up.sh +22 -16
  20. package/dist/adoption/import.js +3 -3
  21. package/dist/approval-ask-audit-store.d.ts +1 -1
  22. package/dist/approval-ask-machine.d.ts +4 -10
  23. package/dist/approval-ask-retention.d.ts +1 -1
  24. package/dist/approval-card.d.ts +12 -14
  25. package/dist/approval-gate-currency.d.ts +9 -9
  26. package/dist/approval-gate-currency.js +3 -4
  27. package/dist/approval-hmac.d.ts +17 -1
  28. package/dist/approval-hmac.js +7 -1
  29. package/dist/approval-queue-kind.d.ts +1 -1
  30. package/dist/approval.d.ts +2 -2
  31. package/dist/approval.js +2 -2
  32. package/dist/auth-bridge.d.ts +20 -0
  33. package/dist/auth-bridge.js +9 -0
  34. package/dist/background-session-reap.d.ts +1 -1
  35. package/dist/bake-runner/main.d.ts +4 -2
  36. package/dist/bind-host.d.ts +3 -6
  37. package/dist/bind-host.js +4 -7
  38. package/dist/boot/budget-tracing.js +1 -1
  39. package/dist/boot/coordinators.d.ts +1 -1
  40. package/dist/boot/coordinators.js +9 -10
  41. package/dist/boot/device-lane.js +2 -0
  42. package/dist/boot/engine-lease.d.ts +5 -0
  43. package/dist/boot/engine-lease.js +1 -0
  44. package/dist/boot/execution-env.d.ts +9 -14
  45. package/dist/boot/execution-env.js +85 -22
  46. package/dist/boot/execution-lane.js +32 -5
  47. package/dist/boot/late-binds.d.ts +8 -4
  48. package/dist/boot/late-binds.js +7 -1
  49. package/dist/boot/leader.d.ts +31 -30
  50. package/dist/boot/leader.js +38 -28
  51. package/dist/boot/leg-path-adjudication.d.ts +40 -0
  52. package/dist/boot/leg-path-adjudication.js +18 -0
  53. package/dist/boot/memory-consolidation.d.ts +3 -2
  54. package/dist/boot/memory-consolidation.js +6 -6
  55. package/dist/boot/parked-revive-gate.js +3 -15
  56. package/dist/boot/reapers.d.ts +6 -1
  57. package/dist/boot/reapers.js +13 -2
  58. package/dist/boot/resolve-spec.d.ts +3 -3
  59. package/dist/boot/resolve-spec.js +43 -48
  60. package/dist/boot/runner-deps.d.ts +46 -35
  61. package/dist/boot/runner-deps.js +94 -91
  62. package/dist/boot/session-age-out.d.ts +36 -0
  63. package/dist/boot/session-age-out.js +101 -0
  64. package/dist/boot/session-faces.d.ts +5 -14
  65. package/dist/boot/session-faces.js +9 -5
  66. package/dist/boot/shutdown.d.ts +6 -0
  67. package/dist/boot/shutdown.js +10 -4
  68. package/dist/boot/stage-01-config.js +2 -0
  69. package/dist/boot/stage-02-web-admin-pull.js +4 -5
  70. package/dist/boot/stage-05-execution-env.d.ts +5 -3
  71. package/dist/boot/stage-05-execution-env.js +3 -2
  72. package/dist/boot/stage-06-runners.d.ts +9 -4
  73. package/dist/boot/stage-06-runners.js +24 -9
  74. package/dist/boot/stage-07-capability-layer.d.ts +8 -4
  75. package/dist/boot/stage-07-capability-layer.js +3 -2
  76. package/dist/boot/stage-08-reapers.d.ts +8 -4
  77. package/dist/boot/stage-08-reapers.js +4 -2
  78. package/dist/boot/stage-09-leader.d.ts +12 -5
  79. package/dist/boot/stage-09-leader.js +14 -5
  80. package/dist/boot/stage-10-http-server.d.ts +19 -5
  81. package/dist/boot/stage-10-http-server.js +14 -21
  82. package/dist/boot/stores.js +7 -4
  83. package/dist/boot/web-admin.js +5 -8
  84. package/dist/boot/workflow-orchestration.d.ts +7 -2
  85. package/dist/boot/workflow-orchestration.js +24 -7
  86. package/dist/bounded-rotation.d.ts +29 -0
  87. package/dist/bounded-rotation.js +24 -0
  88. package/dist/capabilities/approvals-push.d.ts +3 -3
  89. package/dist/capabilities/scenarios.d.ts +28 -13
  90. package/dist/capabilities/scenarios.js +2 -2
  91. package/dist/capability-facts.d.ts +43 -32
  92. package/dist/capability-facts.js +45 -51
  93. package/dist/card-rule-offers.d.ts +32 -0
  94. package/dist/card-rule-offers.js +130 -0
  95. package/dist/center-credential.d.ts +25 -6
  96. package/dist/center-credential.js +25 -5
  97. package/dist/config-catalog.d.ts +26 -7
  98. package/dist/config-catalog.js +26 -22
  99. package/dist/config-dir-trust.js +4 -2
  100. package/dist/config-invariants.d.ts +20 -8
  101. package/dist/config-invariants.js +55 -12
  102. package/dist/config-lkg.d.ts +5 -19
  103. package/dist/config-lkg.js +8 -62
  104. package/dist/config-provider.d.ts +1 -1
  105. package/dist/config-root-migration.d.ts +2 -2
  106. package/dist/config-types.d.ts +38 -42
  107. package/dist/config.d.ts +58 -7
  108. package/dist/config.js +90 -40
  109. package/dist/control-socket.d.ts +51 -0
  110. package/dist/control-socket.js +115 -0
  111. package/dist/deployment-governance.d.ts +2 -1
  112. package/dist/deployment-shape.d.ts +9 -1
  113. package/dist/deployment-shape.js +2 -1
  114. package/dist/device-protocol.d.ts +5 -4
  115. package/dist/device-protocol.js +1 -1
  116. package/dist/device-ws-hub.d.ts +7 -0
  117. package/dist/device-ws-hub.js +10 -3
  118. package/dist/device-ws-protocol.d.ts +63 -10
  119. package/dist/device-ws-protocol.js +56 -25
  120. package/dist/elicitation.js +2 -2
  121. package/dist/engine-identity.d.ts +19 -7
  122. package/dist/engine-identity.js +10 -2
  123. package/dist/entry-mode-clamp-notice.d.ts +2 -1
  124. package/dist/entry-problems.d.ts +40 -3
  125. package/dist/entry-problems.js +3 -1
  126. package/dist/execution-env-refusal.d.ts +29 -0
  127. package/dist/execution-env-refusal.js +8 -0
  128. package/dist/execution-lane-caps.d.ts +3 -1
  129. package/dist/field-conflict.d.ts +1 -1
  130. package/dist/file-history-capture.d.ts +11 -4
  131. package/dist/file-history-capture.js +9 -6
  132. package/dist/file-history-disclosure.d.ts +7 -5
  133. package/dist/file-history-disclosure.js +7 -5
  134. package/dist/fleet/drain-entry.d.ts +4 -0
  135. package/dist/fleet/engine-signal.d.ts +12 -29
  136. package/dist/fleet/engine-signal.js +1 -7
  137. package/dist/fleet-client.js +2 -5
  138. package/dist/gate-settlement.d.ts +1 -8
  139. package/dist/gate-settlement.js +0 -4
  140. package/dist/history-anchor.js +1 -1
  141. package/dist/hitl-delivery.d.ts +2 -3
  142. package/dist/hitl-delivery.js +0 -2
  143. package/dist/hooks/hook-llm.js +4 -2
  144. package/dist/hooks/hook-runner.d.ts +3 -2
  145. package/dist/hooks/hook-runner.js +18 -3
  146. package/dist/host-decision.d.ts +11 -11
  147. package/dist/host-lsp-manager.d.ts +2 -2
  148. package/dist/http/active-run-conflict.d.ts +35 -2
  149. package/dist/http/active-run-conflict.js +48 -19
  150. package/dist/http/admission.js +17 -2
  151. package/dist/http/approval-sweeps.d.ts +1 -1
  152. package/dist/http/approval-sweeps.js +10 -7
  153. package/dist/http/checkpoint-ctx.d.ts +4 -0
  154. package/dist/http/checkpoint-ctx.js +2 -0
  155. package/dist/http/dispatch.d.ts +8 -3
  156. package/dist/http/dispatch.js +59 -32
  157. package/dist/http/durable-run-leg.js +16 -17
  158. package/dist/http/health-reader.d.ts +16 -9
  159. package/dist/http/health-reader.js +2 -1
  160. package/dist/http/health-self-report.d.ts +9 -1
  161. package/dist/http/health-self-report.js +3 -1
  162. package/dist/http/owner-access.d.ts +33 -14
  163. package/dist/http/owner-access.js +40 -10
  164. package/dist/http/principal-gate.d.ts +49 -21
  165. package/dist/http/principal-gate.js +61 -11
  166. package/dist/http/request-channel.d.ts +23 -0
  167. package/dist/http/request-channel.js +9 -0
  168. package/dist/http/request-guards.js +17 -2
  169. package/dist/http/resume-ctx-read.js +42 -3
  170. package/dist/http/resume-legs.d.ts +4 -3
  171. package/dist/http/resume-legs.js +367 -117
  172. package/dist/http/route-ctx.d.ts +91 -15
  173. package/dist/http/route-ctx.js +17 -0
  174. package/dist/http/route-table.d.ts +5 -1
  175. package/dist/http/route-table.js +4 -0
  176. package/dist/http/routes/admin-config-refresh.js +3 -3
  177. package/dist/http/routes/admin-drain.d.ts +3 -0
  178. package/dist/http/routes/admin-drain.js +7 -7
  179. package/dist/http/routes/admin-memory-optout.d.ts +1 -1
  180. package/dist/http/routes/admin-memory-optout.js +3 -3
  181. package/dist/http/routes/adoption.js +3 -5
  182. package/dist/http/routes/agents-roster.js +2 -3
  183. package/dist/http/routes/approvals-assistant.d.ts +2 -1
  184. package/dist/http/routes/approvals-assistant.js +99 -51
  185. package/dist/http/routes/background.d.ts +3 -3
  186. package/dist/http/routes/capabilities.d.ts +4 -0
  187. package/dist/http/routes/capabilities.js +38 -10
  188. package/dist/http/routes/config-catalog.js +2 -2
  189. package/dist/http/routes/devices.js +1 -1
  190. package/dist/http/routes/diagnostics.d.ts +3 -3
  191. package/dist/http/routes/diagnostics.js +19 -7
  192. package/dist/http/routes/fleet.js +10 -8
  193. package/dist/http/routes/images.js +10 -10
  194. package/dist/http/routes/memory-bundle.js +3 -3
  195. package/dist/http/routes/memory-compliance.js +3 -3
  196. package/dist/http/routes/memory-consolidation.js +2 -2
  197. package/dist/http/routes/memory-origin.js +3 -3
  198. package/dist/http/routes/memory-policy.js +2 -2
  199. package/dist/http/routes/observability.js +3 -3
  200. package/dist/http/routes/projects.d.ts +3 -2
  201. package/dist/http/routes/projects.js +4 -5
  202. package/dist/http/routes/retention-ops.js +3 -3
  203. package/dist/http/routes/rules.js +5 -5
  204. package/dist/http/routes/run-permission-mode.d.ts +2 -1
  205. package/dist/http/routes/run-permission-mode.js +2 -2
  206. package/dist/http/routes/runs.d.ts +4 -9
  207. package/dist/http/routes/runs.js +171 -65
  208. package/dist/http/routes/session-sync.d.ts +22 -9
  209. package/dist/http/routes/session-sync.js +204 -107
  210. package/dist/http/routes/sessions-list.js +13 -7
  211. package/dist/http/routes/sessions.js +30 -15
  212. package/dist/http/routes/tasks.js +46 -41
  213. package/dist/http/routes/trace-usage.js +2 -2
  214. package/dist/http/routes/workflows.js +1 -1
  215. package/dist/http/server.d.ts +30 -30
  216. package/dist/http/server.js +16 -4
  217. package/dist/http/submit-ctx.d.ts +1 -1
  218. package/dist/http/submit-ctx.js +7 -4
  219. package/dist/http/wire-types.d.ts +14 -4
  220. package/dist/human-facing-args.d.ts +33 -0
  221. package/dist/human-facing-args.js +33 -0
  222. package/dist/identity-source.d.ts +20 -3
  223. package/dist/identity-source.js +14 -0
  224. package/dist/index.d.ts +5 -1
  225. package/dist/k8s-api-credentials.d.ts +29 -0
  226. package/dist/k8s-api-credentials.js +25 -0
  227. package/dist/lane-home-probe.d.ts +3 -7
  228. package/dist/lane-home-probe.js +2 -2
  229. package/dist/leader/diffup.d.ts +19 -0
  230. package/dist/leader/diffup.js +7 -0
  231. package/dist/leader/leader.d.ts +116 -11
  232. package/dist/leader/leader.js +69 -5
  233. package/dist/leader/repair-wire.js +2 -2
  234. package/dist/leader/run-entry.d.ts +2 -1
  235. package/dist/leader/run-entry.js +1 -1
  236. package/dist/leader/wire.d.ts +42 -132
  237. package/dist/leader/wire.js +81 -67
  238. package/dist/leg-facts.d.ts +13 -5
  239. package/dist/leg-facts.js +2 -1
  240. package/dist/memory-scope.d.ts +23 -11
  241. package/dist/memory-scope.js +18 -6
  242. package/dist/memory-sync-client.d.ts +30 -2
  243. package/dist/memory-sync-client.js +16 -9
  244. package/dist/model-entry-headers.d.ts +9 -10
  245. package/dist/model-entry-headers.js +0 -4
  246. package/dist/model-entry-refusal.d.ts +7 -4
  247. package/dist/model-entry-refusal.js +11 -5
  248. package/dist/model-plane-face.d.ts +1 -1
  249. package/dist/model-plane-face.js +3 -1
  250. package/dist/model-route-endpoint.d.ts +13 -7
  251. package/dist/model-route-endpoint.js +14 -11
  252. package/dist/model-select.d.ts +22 -0
  253. package/dist/model-select.js +9 -0
  254. package/dist/model-unreachable-notice.d.ts +11 -0
  255. package/dist/model-unreachable-notice.js +4 -4
  256. package/dist/object-store-buckets.d.ts +640 -6
  257. package/dist/object-store-buckets.js +166 -0
  258. package/dist/observability/err-text.d.ts +7 -0
  259. package/dist/observability/err-text.js +5 -0
  260. package/dist/observability/fail-open.d.ts +25 -17
  261. package/dist/observability/fail-open.js +25 -17
  262. package/dist/observability/logger.js +3 -1
  263. package/dist/observability/metrics.js +1 -0
  264. package/dist/operator-roster.d.ts +68 -0
  265. package/dist/operator-roster.js +32 -0
  266. package/dist/orchestration/workflow-notify-journal.d.ts +18 -1
  267. package/dist/orchestration/workflow-notify-journal.js +12 -1
  268. package/dist/orchestration/workflow-park-decision.d.ts +70 -18
  269. package/dist/orchestration/workflow-park-decision.js +49 -10
  270. package/dist/orchestration/workflow-park-holder.d.ts +65 -0
  271. package/dist/orchestration/workflow-park-holder.js +98 -0
  272. package/dist/orchestration/workflow-record-fence.d.ts +36 -0
  273. package/dist/orchestration/workflow-record-fence.js +42 -0
  274. package/dist/outbound-dispatcher.d.ts +71 -8
  275. package/dist/outbound-dispatcher.js +48 -7
  276. package/dist/owner-faces.d.ts +2 -2
  277. package/dist/parked-decide.d.ts +106 -55
  278. package/dist/parked-decide.js +153 -117
  279. package/dist/peer-directory.d.ts +2 -2
  280. package/dist/peer-inbound-face.d.ts +2 -6
  281. package/dist/peer-inbound-face.js +0 -3
  282. package/dist/permission-mode-admission.d.ts +74 -5
  283. package/dist/permission-mode-admission.js +56 -3
  284. package/dist/plugins/adoption-log-sql.d.ts +3 -1
  285. package/dist/plugins/adoption-log-sql.js +7 -1
  286. package/dist/plugins/approval-ask-store-file.d.ts +14 -2
  287. package/dist/plugins/approval-ask-store-file.js +11 -0
  288. package/dist/plugins/approval-ask-store-memory.d.ts +10 -1
  289. package/dist/plugins/approval-ask-store-memory.js +35 -10
  290. package/dist/plugins/approval-ask-store-sql.d.ts +69 -4
  291. package/dist/plugins/approval-ask-store-sql.js +45 -5
  292. package/dist/plugins/approval-exemption-store.js +3 -0
  293. package/dist/plugins/approval-nonce-store.js +2 -0
  294. package/dist/plugins/blob-backend.d.ts +83 -7
  295. package/dist/plugins/blob-backend.js +57 -6
  296. package/dist/plugins/breaker-state-sql.js +2 -0
  297. package/dist/plugins/caching-session-store.d.ts +9 -15
  298. package/dist/plugins/caching-session-store.js +6 -0
  299. package/dist/plugins/checkpoint-index-columns.d.ts +20 -16
  300. package/dist/plugins/checkpoint-index-columns.js +3 -6
  301. package/dist/plugins/checkpoint-store-face.d.ts +119 -61
  302. package/dist/plugins/checkpoint-store-face.js +134 -55
  303. package/dist/plugins/device-store-sql.js +6 -0
  304. package/dist/plugins/error-origin.d.ts +18 -0
  305. package/dist/plugins/error-origin.js +10 -0
  306. package/dist/plugins/execution-placement-sql.js +6 -6
  307. package/dist/plugins/image-bake-store-sql.js +6 -0
  308. package/dist/plugins/image-index-sql.js +4 -0
  309. package/dist/plugins/landed-attendants.d.ts +212 -0
  310. package/dist/plugins/landed-attendants.js +161 -0
  311. package/dist/plugins/leader-run-store-sql.js +4 -0
  312. package/dist/plugins/local-checkpoint-store.d.ts +13 -3
  313. package/dist/plugins/local-checkpoint-store.js +38 -49
  314. package/dist/plugins/local-session-live-reference.d.ts +40 -0
  315. package/dist/plugins/local-session-live-reference.js +39 -0
  316. package/dist/plugins/local-session-store.d.ts +71 -33
  317. package/dist/plugins/local-session-store.js +129 -27
  318. package/dist/plugins/memory-engine-pg.js +4 -0
  319. package/dist/plugins/memory-engine-sql-apply.js +5 -2
  320. package/dist/plugins/memory-engine-tidb.js +4 -0
  321. package/dist/plugins/memory-optout-grant-store-sql.js +4 -0
  322. package/dist/plugins/memory-sync-store-pg.js +5 -0
  323. package/dist/plugins/memory-sync-store-tidb.js +5 -0
  324. package/dist/plugins/one-time-migrations.d.ts +104 -80
  325. package/dist/plugins/one-time-migrations.js +226 -132
  326. package/dist/plugins/org-delivery-quota-store.js +4 -1
  327. package/dist/plugins/outcome-ledger-sql.js +2 -0
  328. package/dist/plugins/permission-rule-store-sql.js +11 -4
  329. package/dist/plugins/pg-cost-quota.js +4 -0
  330. package/dist/plugins/pg-pool.js +35 -10
  331. package/dist/plugins/pg-rate-limiter.js +2 -0
  332. package/dist/plugins/posix-shell-fs.d.ts +6 -1
  333. package/dist/plugins/posix-shell-fs.js +4 -1
  334. package/dist/plugins/remote-env-adb.d.ts +19 -15
  335. package/dist/plugins/remote-env-adb.js +41 -15
  336. package/dist/plugins/remote-env-connect-seat.d.ts +105 -0
  337. package/dist/plugins/remote-env-connect-seat.js +72 -0
  338. package/dist/plugins/remote-env-device.d.ts +22 -5
  339. package/dist/plugins/remote-env-device.js +106 -8
  340. package/dist/plugins/remote-env-e2b.d.ts +15 -6
  341. package/dist/plugins/remote-env-e2b.js +42 -32
  342. package/dist/plugins/remote-env-file-error.js +6 -2
  343. package/dist/plugins/remote-env-host.d.ts +46 -10
  344. package/dist/plugins/remote-env-host.js +124 -52
  345. package/dist/plugins/remote-env-k8s.d.ts +109 -41
  346. package/dist/plugins/remote-env-k8s.js +160 -54
  347. package/dist/plugins/remote-env-local-docker.d.ts +13 -8
  348. package/dist/plugins/remote-env-local-docker.js +34 -41
  349. package/dist/plugins/remote-env-ssh.d.ts +18 -12
  350. package/dist/plugins/remote-env-ssh.js +60 -59
  351. package/dist/plugins/remote-shell.d.ts +98 -1
  352. package/dist/plugins/remote-shell.js +218 -0
  353. package/dist/plugins/replica-registration.d.ts +1 -1
  354. package/dist/plugins/replica-registration.js +1 -1
  355. package/dist/plugins/resume-anchor-store-sql.d.ts +11 -2
  356. package/dist/plugins/resume-anchor-store-sql.js +12 -5
  357. package/dist/plugins/retention-lane-store-sql.js +4 -0
  358. package/dist/plugins/retention-sql.d.ts +20 -2
  359. package/dist/plugins/retention-sql.js +11 -0
  360. package/dist/plugins/run-store-sql.d.ts +21 -2
  361. package/dist/plugins/run-store-sql.js +31 -7
  362. package/dist/plugins/s3-presign.d.ts +23 -0
  363. package/dist/plugins/s3-presign.js +37 -3
  364. package/dist/plugins/scenario-prefix-switch-m42.d.ts +1 -1
  365. package/dist/plugins/scenario-prefix-switch-m42.js +2 -2
  366. package/dist/plugins/scheduler-support.d.ts +2 -2
  367. package/dist/plugins/scheduler-support.js +0 -3
  368. package/dist/plugins/schema-consistency.d.ts +4 -2
  369. package/dist/plugins/schema-consistency.js +19 -2
  370. package/dist/plugins/schema-indexes.js +2 -0
  371. package/dist/plugins/send-file-ledger.d.ts +2 -2
  372. package/dist/plugins/send-file-ledger.js +5 -2
  373. package/dist/plugins/send-user-file.d.ts +3 -4
  374. package/dist/plugins/send-user-file.js +56 -52
  375. package/dist/plugins/serving-requirement.d.ts +26 -7
  376. package/dist/plugins/serving-requirement.js +11 -4
  377. package/dist/plugins/session-birth.d.ts +6 -2
  378. package/dist/plugins/session-blob-claim-token.d.ts +15 -0
  379. package/dist/plugins/session-blob-claim-token.js +20 -0
  380. package/dist/plugins/session-blob-namespace.d.ts +46 -0
  381. package/dist/plugins/session-blob-namespace.js +116 -0
  382. package/dist/plugins/session-capture-record-store-sql.js +2 -0
  383. package/dist/plugins/session-ext-table.d.ts +14 -1
  384. package/dist/plugins/session-ext-table.js +5 -1
  385. package/dist/plugins/session-row-sql.d.ts +49 -2
  386. package/dist/plugins/session-row-sql.js +56 -13
  387. package/dist/plugins/session-store-sql.d.ts +34 -18
  388. package/dist/plugins/session-store-sql.js +98 -17
  389. package/dist/plugins/shared-memory-store-sql.d.ts +1 -0
  390. package/dist/plugins/shared-memory-store-sql.js +6 -2
  391. package/dist/plugins/snapshot-bucket-presence.d.ts +25 -2
  392. package/dist/plugins/snapshot-bucket-presence.js +8 -2
  393. package/dist/plugins/sql-driver.d.ts +2 -1
  394. package/dist/plugins/sql-driver.js +18 -3
  395. package/dist/plugins/sql-errors.d.ts +11 -6
  396. package/dist/plugins/sql-errors.js +5 -6
  397. package/dist/plugins/sql-json-column.d.ts +1 -1
  398. package/dist/plugins/stop-then-start-sentence.d.ts +10 -4
  399. package/dist/plugins/stop-then-start-sentence.js +14 -10
  400. package/dist/plugins/stop-then-start.d.ts +109 -0
  401. package/dist/plugins/stop-then-start.js +104 -0
  402. package/dist/plugins/store-backend.d.ts +84 -15
  403. package/dist/plugins/store-backend.js +236 -72
  404. package/dist/plugins/store-boundary.d.ts +57 -0
  405. package/dist/plugins/store-boundary.js +139 -0
  406. package/dist/plugins/store-contracts.d.ts +17 -0
  407. package/dist/plugins/store-fault-sentence-m53.d.ts +7 -0
  408. package/dist/plugins/store-fault-sentence-m53.js +25 -0
  409. package/dist/plugins/store-fault.d.ts +26 -7
  410. package/dist/plugins/store-fault.js +18 -2
  411. package/dist/plugins/task-attachment-store.d.ts +2 -1
  412. package/dist/plugins/task-attachment-store.js +14 -1
  413. package/dist/plugins/task-list-store-sql.d.ts +2 -2
  414. package/dist/plugins/task-list-store-sql.js +10 -8
  415. package/dist/plugins/tidb-cost-quota.js +4 -0
  416. package/dist/plugins/tidb-pool.js +21 -25
  417. package/dist/plugins/tidb-rate-limiter.js +4 -0
  418. package/dist/plugins/user-input-ledger-sql.js +4 -0
  419. package/dist/plugins/workflow-run-store-sql.d.ts +28 -10
  420. package/dist/plugins/workflow-run-store-sql.js +64 -4
  421. package/dist/plugins/workspace-custody.d.ts +4 -3
  422. package/dist/plugins/workspace-fill.d.ts +4 -7
  423. package/dist/plugins/workspace-fill.js +2 -1
  424. package/dist/plugins/write-behind-counter.js +5 -0
  425. package/dist/project-context.d.ts +0 -2
  426. package/dist/project-context.js +4 -8
  427. package/dist/project-registry.d.ts +46 -0
  428. package/dist/project-registry.js +44 -0
  429. package/dist/question.d.ts +2 -1
  430. package/dist/question.js +5 -13
  431. package/dist/request-form.d.ts +6 -1
  432. package/dist/request-form.js +4 -1
  433. package/dist/request-key-closure.js +1 -1
  434. package/dist/request-value-closure.d.ts +4 -0
  435. package/dist/request-value-closure.js +10 -0
  436. package/dist/rule-issue-reading.d.ts +1 -1
  437. package/dist/rules-consent.d.ts +1 -1
  438. package/dist/run-acceptance.d.ts +3 -2
  439. package/dist/run-acceptance.js +4 -6
  440. package/dist/run-local.js +9 -9
  441. package/dist/runs.d.ts +54 -16
  442. package/dist/runs.js +67 -13
  443. package/dist/runtime-governance.d.ts +5 -4
  444. package/dist/security.d.ts +30 -32
  445. package/dist/security.js +41 -7
  446. package/dist/sema-config-dir.d.ts +2 -1
  447. package/dist/server-secret-env.d.ts +12 -10
  448. package/dist/server-secret-env.js +24 -15
  449. package/dist/session-bindings.d.ts +82 -0
  450. package/dist/session-bindings.js +18 -0
  451. package/dist/session-children-retire.d.ts +2 -2
  452. package/dist/session-children-retire.js +2 -6
  453. package/dist/session-deletion.d.ts +16 -1
  454. package/dist/session-error-wire.d.ts +3 -3
  455. package/dist/session-error-wire.js +3 -3
  456. package/dist/session-incarnation.d.ts +10 -0
  457. package/dist/session-incarnation.js +10 -1
  458. package/dist/session-kind.d.ts +57 -0
  459. package/dist/session-kind.js +22 -0
  460. package/dist/session-row.d.ts +21 -1
  461. package/dist/session-row.js +7 -1
  462. package/dist/session-sync-kernel.d.ts +24 -14
  463. package/dist/session-sync-kernel.js +3 -6
  464. package/dist/session-sync.d.ts +25 -103
  465. package/dist/session-sync.js +14 -76
  466. package/dist/session-titler.d.ts +10 -3
  467. package/dist/session-titler.js +19 -6
  468. package/dist/ssh-host-key.d.ts +5 -0
  469. package/dist/ssh-host-key.js +3 -0
  470. package/dist/stores-sql/blob-index-sql.d.ts +30 -9
  471. package/dist/stores-sql/blob-index-sql.js +40 -21
  472. package/dist/stores-sql/checkpoint-store-sql.d.ts +54 -27
  473. package/dist/stores-sql/checkpoint-store-sql.js +70 -146
  474. package/dist/stores-sql/file-history-store-sql.d.ts +113 -15
  475. package/dist/stores-sql/file-history-store-sql.js +205 -95
  476. package/dist/stores-sql/pg-session-storage.d.ts +34 -7
  477. package/dist/stores-sql/pg-session-storage.js +37 -13
  478. package/dist/stores-sql/retention-store-sql.d.ts +1 -9
  479. package/dist/stores-sql/retention-store-sql.js +5 -19
  480. package/dist/stores-sql/session-policy-store-sql.d.ts +30 -7
  481. package/dist/stores-sql/session-policy-store-sql.js +61 -44
  482. package/dist/stores-sql/session-write-hooks.d.ts +11 -0
  483. package/dist/stores-sql/tidb-session-store.d.ts +58 -7
  484. package/dist/stores-sql/tidb-session-store.js +37 -13
  485. package/dist/submission-exit.d.ts +3 -2
  486. package/dist/submission-exit.js +9 -1
  487. package/dist/task-cwd.d.ts +2 -2
  488. package/dist/task-settings.d.ts +7 -5
  489. package/dist/task-settings.js +3 -3
  490. package/dist/terminal.d.ts +33 -2
  491. package/dist/terminal.js +139 -9
  492. package/dist/tool-approval.d.ts +465 -507
  493. package/dist/tool-approval.js +606 -1222
  494. package/dist/trace/core-keyset-guard.d.ts +1 -1
  495. package/dist/trace/ledger-events.d.ts +3 -3
  496. package/dist/trace/project.d.ts +2 -3
  497. package/dist/trace/redact.js +3 -2
  498. package/dist/trace/self-minted-wire.d.ts +571 -178
  499. package/dist/trace/self-minted-wire.js +189 -56
  500. package/dist/web-admin-client/apply-effective.js +2 -2
  501. package/dist/web-admin-client/read-warnings.d.ts +2 -2
  502. package/dist/web-admin-client/read-warnings.js +1 -1
  503. package/dist/web-admin-client/types.d.ts +1 -1
  504. package/dist/workspace-space.d.ts +10 -4
  505. package/dist/workspace-space.js +4 -1
  506. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +79 -28
  507. package/package.json +7 -3
  508. package/scripts/embed-minimal.mjs +3 -3
  509. package/wire-changes/server@7.151.0.json +762 -0
  510. package/wire-changes/server@7.152.0.json +900 -0
  511. package/dist/config-d-migration.d.ts +0 -37
  512. package/dist/config-d-migration.js +0 -60
  513. package/dist/http/session-inherit-env.d.ts +0 -36
  514. package/dist/http/session-inherit-env.js +0 -6
@@ -16,6 +16,7 @@
16
16
  */
17
17
  import type { IncomingMessage, ServerResponse } from "node:http";
18
18
  import type { HostDecision } from "../host-decision.js";
19
+ import type { Refusal } from "./refusal-body.js";
19
20
  import type { EntryProblem } from "../entry-problems.js";
20
21
  import type { SessionNotifyDoor } from "../session-notify-door.js";
21
22
  import type { TaskStream, TaskSpec, TaskResult, QuestionAnswer, Checkpoint, CheckpointToken, ResumeOutcome, RunInternals, Runner, EngineNotice, PendingSteerInput } from "@sema-agent/core";
@@ -26,7 +27,9 @@ import type { ImagesLocal } from "./routes/images.js";
26
27
  import type { CapabilitiesLocal } from "./routes/capabilities.js";
27
28
  import type { SessionsLocal } from "./routes/sessions.js";
28
29
  import type { SessionSyncLocal } from "./routes/session-sync.js";
30
+ import type { OperatorPower } from "../operator-roster.js";
29
31
  import type { PlanApprovePermissionModeAfter } from "../task-settings.js";
32
+ import type { PermissionModeWrite } from "../permission-mode-admission.js";
30
33
  import type { GateSighting } from "../approval-gate-currency.js";
31
34
  import type { VerifyRoundsSpec } from "./verify-rounds.js";
32
35
  import type { RunAbort } from "../run-cancel-context.js";
@@ -36,6 +39,7 @@ import type { RootedTaskSpec } from "./execution-context.js";
36
39
  import type { GateCommitment, GateSettlementEvidence } from "../gate-settlement.js";
37
40
  import type { ResumeRestatement } from "./resume-restatement.js";
38
41
  import type { RememberLaneCannotRecord } from "../parked-decide.js";
42
+ import type { ParsedPersistRule, RuleSlotReceipt } from "../tool-approval.js";
39
43
  import type { RowWayOut } from "./resume-legs.js";
40
44
  import type { KeyCaller } from "../owner-faces.js";
41
45
  import type { Subject } from "../owner-brands.js";
@@ -156,6 +160,14 @@ export interface PreparedTaskSubmission {
156
160
  * 它能不能展示在它第一次落盘时就定了,这一跑的受理座答不了。缺席 = 体是这次请求自己的,标不标由受理座定。
157
161
  */
158
162
  bodyFromScreenedCtx?: true;
163
+ /**
164
+ * `body` 是从一份存量续跑输入里取回的(与 {@link bodyFromScreenedCtx} 同一种提交:`/decide` 的宿主新 turn)⇒ 这一跑新写的续跑输入**照抄**那一份的写据
165
+ * (`CheckpointCtx.permissionModeWrite`):这一跑没有写体顶层 `permissionMode` 那一格,只是抄了体。`stored` 缺席 = 那一份没有写据(7.152.0 之前写下的)⇒ 照缺席。
166
+ * 本位缺席 = 体是这次请求自己的 ⇒ 写据是提交写者的那一张(`submit-ctx.ts` `persistSubmissionCtx`)。
167
+ */
168
+ bodyPermissionModeWrite?: {
169
+ readonly stored: PermissionModeWrite | undefined;
170
+ };
159
171
  /**
160
172
  * 这次执行的**执行上下文**(唯一解析器 `http/execution-context.ts` `resolveExecutionContext` 的产物:根 · 住客 · 放置态 · 车道 · device 车道的设备意图)。
161
173
  * 提交门在装配之前铸(fresh);`/decide` 的宿主新 turn 交续跑折叠器铸的那一只(continuation)。每个 `runStore.createRun(` 成功点**必须**把它交给
@@ -227,6 +239,25 @@ export interface CheckpointCtx {
227
239
  * 缺席 = 没继承(含 7.150.0 之前写下的行:不回填,续跑不继承 = 那时的行为)。
228
240
  */
229
241
  projectContext?: import("../project-context.js").ProjectContext;
242
+ /**
243
+ * 这条 run 的**登记簿默认读层种子**(`project-registry.ts` 的 {@link import("../project-registry.js").MemorySeed}:种子项目 + 判出它的那一位观者)—— 新提交腿判一次:
244
+ * 这次提交带的项目对提交者可见(与 `GET /v1/projects/:id` 同一只判,观者 = 读面同一只推导)⇒ 种子;带了而判不出 ⇒ `null`(判过,无);没带项目 ⇒ 缺席。**服务端写、不来自请求体**(与 {@link memoryScope} 同为
245
+ * `body` 的兄弟键:提交腿推导、落盘,续跑原样读回)。冻结的是**观者**不是词:续跑以这一位观者经同一只可见性判重读此刻的登记(停驻期间改了词 ⇒ 新词;删了 / 换了主人 /
246
+ * 不再对他可见 ⇒ 没有种子)。写点:`buildCheckpointCtx`(提交腿那一笔,经 `persistSubmissionCtx` 读这条腿的部署事实);leader worker 的写者不带(它的体不带项目)。
247
+ * 续跑腿的写回传原 ctx / 其展开 ⇒ 随行。读者只有一只:`resume-legs.ts` `resolveResumeSpec` 把它原样递给装配器(`opts.memorySeed`)—— 续跑腿不推观者、不按 `body.projectId` 现查。
248
+ * 缺席而存体带了项目 = 本格出现之前写下的行(不回填:那时的提交腿没有判过可见性)⇒ 续跑不取种子,装配器记运维一行 `resume_memory_seed_unjudged`。
249
+ * 形只有一种读法(`frozenMemorySeedOf`,读口 `resume-ctx-read.ts`)。
250
+ */
251
+ memorySeed?: import("../project-registry.js").MemorySeed | null;
252
+ /**
253
+ * **写据**:谁写了 `body` 顶层 `permissionMode` 那一格、写下的是什么(形与规则的属主 = `permission-mode-admission.ts` 顶注「写据」)。**服务端写、不来自请求体**
254
+ * (与 {@link unattendedLeg} 同为 `body` 的兄弟键,客户端够不着)。写点:`buildCheckpointCtx`(必填键:提交写口写 `submission`;`/decide` 宿主新 turn 照抄宿主那一行的,
255
+ * 见 {@link PreparedTaskSubmission.bodyPermissionModeWrite};leader worker 写 `submission`)与改写口 `withStoredPermissionMode`(切档 `switch` · 续跑口的钳 `replay` ·
256
+ * `plan_review` 出口 `plan_review`)。续跑腿的写回传原 ctx / 其展开 ⇒ 随行。读者只有一只:续跑口 `stampReplayEntryMode`(地板在场时问「这一格是不是这块地板的出口写下的、
257
+ * 且还是它写下的那一格」)。形只有一种读法(`permissionModeWriteOf`,读口 `resume-ctx-read.ts`:读不出 ⇒ 坏体)。
258
+ * 缺席 = 7.152.0 之前写下的行(不回填:没有证据可补),或从这样的行照抄的体 ⇒ 不是出口写的,地板在场时照钳。
259
+ */
260
+ permissionModeWrite?: PermissionModeWrite;
230
261
  }
231
262
  /**
232
263
  * `/decide` 第三条车道交给宿主投递腿(wake:`DriveResumeArgs` / fresh:`DurableRunLegArgs`)的**一件**:这一跑在内存里带着的决定,
@@ -378,7 +409,8 @@ export interface DriveResumeArgs {
378
409
  /**
379
410
  * 🔴 **[ref](codex 交叉复审 r2-[medium] 验真后修):这条腿是**调用方发起**的吗?**
380
411
  *
381
- * `true` = 有人在 HTTP 上点了按钮(resume / plan_review / wake / decide / 赎回席)⇒ 吃按**付费方**
412
+ * `true` = 有人在 HTTP 上点了按钮(resume / plan_review / wake / decide / 赎回席),或这一跑交付的是一条**已受理的人的决定**
413
+ * (workflow 停驻卡的 run 收场送达把它交给宿主会话的下一跑 —— 没有请求,但花的是卡属主的钱)⇒ 吃按**付费方**
382
414
  * (卡属主)判的成本配额准入(`ownerCostQuotaDenied`)。缺席/`false` = **部署自己的结算腿**
383
415
  * (内部 D-D SLA deny-sweep)⇒ **不吃**那道门。
384
416
  *
@@ -392,9 +424,8 @@ export interface DriveResumeArgs {
392
424
  * 并且整段时间攥着会话 claim。**方向也自洽**:deny 是**停下**这条 run 的动作,为了省钱而拒绝执行「停」
393
425
  * 与 preempt 路由早就成文的那句同一条(「否则超顶租户连自己的花费都停不下来」)。
394
426
  *
395
- * 判别子取 `req` 的在场与否 —— 这在 `resumeCheckpoint` 里**已经是**「系统腿 vs 调用方腿」的既有判据
396
- * (绑定强制、parked 分流两处都写着 `req !== undefined` 与「内部 D-D SLA deny-sweep(req 缺席)豁免」),
397
- * 本位只是把同一条判据显式化成一个有名字的位,而不是让下游去猜。
427
+ * 判别子**不再**只是 `req` 的在场与否:`req` 缺席的腿有两种 —— SLA 拒扫(结算,不吃门)与 workflow 停驻卡的 run 收场送达(交付一条人的决定,
428
+ * 吃门,fail-closed)。所以本位是一个**有名字的事实**,由起腿的那一处写明(wake 腿:`req` 在场 ∨ 这一跑带着一件决定投递),下游只读这一位、不去猜 `req`。
398
429
  * ⚠️ **射程覆盖两道门**:紧邻的 fleet-lease 准入(`ownerFleetLeaseDenied`)读**同一位** —— [ref] 件⑤②
399
430
  * (codex r3-[high])把它一并改吃了 `callerInitiated`,理由与三问逐字同 cost 半场。
400
431
  * 🔴 本句是 [ref] R4 改写的(2026-09-03,7.57.0 发车前合并重扫 wf_1abaaa9a):此处原文写着「紧邻的
@@ -417,7 +448,7 @@ export interface DriveResumeArgs {
417
448
  *
418
449
  * 所以由上游把「已受理」这个事实传下来,`driveResumeLeg` 据此跳过重复协商。**安全性**:两处的键是
419
450
  * **同一个表达式**(`decodeCheckpointScope(cp.scope)`,上游门与下游 `auth.principal` 同源),射程条件也
420
- * 同一条(`req !== undefined` ⇔ `callerInitiated`)⇒ 跳过的是一次**逐字相同**的判定,不是一道门。
451
+ * 同一条(上游判过两门 ⇔ 下游 `callerInitiated`:`/decide` 与 workflow 停驻卡的 run 收场送达都在交下来之前按卡属主判过)⇒ 跳过的是一次**逐字相同**的判定,不是一道门。
421
452
  * 缺席/`false` ⇒ 照常自己判(其余三条驱动腿与 sweep 一字不变)。
422
453
  */
423
454
  ownerLeaseAdmitted?: boolean;
@@ -479,7 +510,9 @@ export interface RouteLegs {
479
510
  * 同一属主判(缺席 ⇒ 恒不造键;判据属主=server.ts 铸键点注)。 */
480
511
  decider?: KeyCaller,
481
512
  /** 续跑请求的重述键(`mcpServers` / `a2aPeers`),门读出并判过的那一份;缺席 = 冻结读法。语义属主 = `resume-restatement.ts` 顶注。 */
482
- restatement?: ResumeRestatement): Promise<ResumeCheckpointOutcome>;
513
+ restatement?: ResumeRestatement,
514
+ /** 这次决定带着「不再询问」请求({@link PersistRuleRequest})⇒ 本函数是它的**唯一铸点**,结局的 `ruleReceipt` 是它的回执({@link ResumeCheckpointOutcome})。 */
515
+ persistRule?: PersistRuleRequest): Promise<ResumeCheckpointOutcome>;
483
516
  /** 全 resume 家族的共同下半场(lease admission + 写 run log + fleet 发布)。 */
484
517
  driveResumeIntoRunLog(args: DriveResumeArgs): Promise<ResumeLegOutcome>;
485
518
  /** assistant 抢占腿的复位(gate-kind 守卫 + 行级属主复核 + 驱动)。 */
@@ -675,15 +708,15 @@ export interface RouteDeclFacts {
675
708
  * 编排器片 2 件 2:值 = 这一种计费请求的**种类**(`submit` 新工作 / `hitl-answer` 对等人的卡作答 / `resume` 续跑;闭集属主
676
709
  * `http/readiness.ts` 的 `BILLABLE_KINDS`)—— 排空与租约过期只拒 `submit`(放行闭集表 `ADMISSION_TABLE`),无凭证门不看种类。 */
677
710
  readonly billable?: import("./readiness.js").BillableKind;
678
- /** 「本条 url 在**没有任何 service credential** 的部署形下,这几个方法必须 fail-closed」。
711
+ /** 「本条 url 上这几个方法在**请求没带凭据门认的凭据**(service 凭据 / 鉴权桥验过的登录令牌;`identity-source.ts` 头注律 5)时必须 fail-closed」。
679
712
  * 判据(两个合取项)= 「授权的唯一输入是 principal 头」∧「持久改写,或爆炸半径跨租户的治理读」;
680
713
  * 逐口论证在各 `routes/*.ts` 的头注里,声明行只记结论。 */
681
714
  readonly credentialGated?: readonly RouteMethod[];
682
715
  /** 「这条 url **是**计费提交面,但它到底提不提交由**请求体里的方法**决定」—— 单 URL 多方法的
683
716
  * JSON-RPC 端点。两道**可用性** 503(drain / roster-pending)按 url 一刀切会把同端点上的纯读一起
684
717
  * 关掉,所以分派器对本行**跳过**那两道,改由域模块在写分支里施加同样的两道(文案逐字同源)。
685
- * 🔴 只豁免那两道,**不豁免安全轴**:`billable` 本身仍为 true,无 service token 那道 fail-closed
686
- * 503 照旧罩着(它判的是「这台机能不能收写」,与方法无关,且必须在解析请求体之前)。 */
718
+ * 🔴 只豁免那两道,**不豁免安全轴**:`billable` 本身仍为 true,写门那道 fail-closed
719
+ * 503 照旧罩着(它判的是「这次请求带没带过门的凭据」,与方法无关,且必须在解析请求体之前)。 */
687
720
  readonly methodDispatched?: true;
688
721
  }
689
722
  /** **可分派行**多出来的列([ref] 第三刀):身份 + 它真认的方法(+ [ref] 的订阅类)。纯门行一列都没有(见下)。 */
@@ -709,6 +742,12 @@ interface RouteDeclIdentity {
709
742
  * 不带它 —— 那条流就是 sync 腿本身(关流 = 断连语义),照旧算在飞。漏标一条订阅的方向是**多算在飞**(排空多等),不是少等。
710
743
  */
711
744
  readonly subscription?: true;
745
+ /**
746
+ * 「本路由对持这只运维权力的**非人档**开放;本口的运维门按它判」(档表 `operator-roster.ts`)。缺席 = 没声明 —— 非人档(服务主体)的身份在本路由上不算数,
747
+ * 分派层整次请求 403 `auth.principal_confined`(`principal-gate.ts` 的 `requestConfinedTier`,只扫带本列的行)。只住在可分派行上(纯门行是前缀、比任何路由都宽,
748
+ * 型上就开不出一段前缀的权力)。今天只有排空口声明 `power: "drain"`。
749
+ */
750
+ readonly power?: OperatorPower;
712
751
  }
713
752
  /**
714
753
  * **可分派行**:一条真路由。匹配式二选一 —— `path`(精确;标签**就是** path 自身,所以没有 label 列,
@@ -750,23 +789,60 @@ export interface ResumeLegOutcome {
750
789
  body: object;
751
790
  }
752
791
  /**
753
- * 「本会话不再询问」的请求 —— **两扇门同一只**:`/decide` 体上的 `remember:"session"`、应答口(`POST /v1/tool-approvals/:id/respond`)命中停驻行的
754
- * `allow_session`。铸点只有一只:{@link RouteLegs.resumeCheckpoint} —— 可记与否从**已属主校验的载入停驻行**判(`standingAnswerDurablyRecordable`,
792
+ * 「本会话不再询问」的请求 —— **两扇门同一只**:`/decide` 体上的 `remember:"session"`、决断口(`POST /v1/tasks/:taskId/asks/:askId/decision`)命中停驻行的
793
+ * `remember:"session"`。铸点只有一只:{@link RouteLegs.resumeCheckpoint} —— 可记与否从**已属主校验的载入停驻行**判(`standingAnswerDurablyRecordable`,
755
794
  * 与运维队列行的 `rememberRefused` 同一只判据)、锚由车道定(任务级 = 这个会话;bg 停驻子代 = 行的 root/host 会话)、落豁免店**只在**这次决定
756
795
  * 被证明已结清之后(`decisionCommittedOf`)、`rememberApplied` = 落没落(店抛 ⇒ `false` + warn,这次的放行不回滚)。门自己不写店、不判可记。
757
796
  * 两口唯一的差 = `laneCannotRecord`(记不住的车道上怎么答;闭集与理由的属主 = `parked-decide.ts` 的 {@link RememberLaneCannotRecord})。
758
797
  */
759
798
  export interface RememberSessionRequest {
760
- /** 豁免行的签发人(`grantedBy`)= 门已验的身份(`/decide` 的决断方 / 应答口的调用方);匿名开放部署 ⇒ `null`。 */
799
+ /** 豁免行的签发人(`grantedBy`)= 门已验的身份(`/decide` 的决断方 / 决断口的调用方);匿名开放部署 ⇒ `null`。 */
761
800
  readonly grantedBy: string | null;
762
801
  readonly laneCannotRecord: RememberLaneCannotRecord;
763
802
  }
764
- /** {@link RouteLegs.resumeCheckpoint} 的结局 = 腿的应答 + 带了「本会话放行」请求时铸点的答(`rememberApplied`:落没落)。键只在证得出提交的两条车道
765
- * (bg 停驻子代赎回 / 任务级续跑)的结清点上铸;其余出口(拒 / workflow 投递 / 抛)键缺席 ⇒ 门读作「没记住」(`=== true`)。
766
- * 这一位是进程内的结局位,不进 `body` —— 由门决定挂不挂到回执上(两扇门都只挂在这次真做了授予判定的回执上;幂等回放不挂)。 */
803
+ /**
804
+ * 决定体上「本会话放行」那一键(`remember`)的**唯一读法** —— 两扇人决口同调:有问行的卡的决断口(`POST /v1/tasks/:taskId/asks/:askId/decision`)与
805
+ * 运维队列的耐久门(`POST /v1/approvals/:sessionId/decide`)。闭集一词 `"session"`;只配 `approve`(「记住的拒」是另一种语义,不从这一键带进来)。
806
+ * 拒句与码两口逐字同一(由本读法铸);各口自己的门(直连门的签名覆盖、豁免店在场)在本读法之后各判各的。
807
+ * 拒 = 一只 {@link Refusal}(码 + 句 + 机读位在本读法一处铸,冲突形的机读位随拒同铸),两扇口原样发 `400`、不再按码二次分支。
808
+ */
809
+ export type RememberSlotReading = {
810
+ readonly kind: "absent";
811
+ } | {
812
+ readonly kind: "session";
813
+ } | {
814
+ readonly kind: "refused";
815
+ readonly refusal: Refusal;
816
+ };
817
+ /** `remember` 闭集外的拒句(`400 request.field_invalid`;两扇人决口同一句,由 {@link readRememberSlot} 铸)。 */
818
+ export declare const REMEMBER_MUST_BE_SESSION = "remember must be \"session\"";
819
+ /** `remember` 配 deny 的拒句(`400 request.field_conflict` + 机读位 `remember_decision`;同上)。 */
820
+ export declare const REMEMBER_REQUIRES_APPROVE = "remember requires decision 'approve'";
821
+ export declare function readRememberSlot(raw: unknown, decision: "approve" | "deny"): RememberSlotReading;
822
+ /**
823
+ * 「不再询问」的请求 —— **两扇门同一只**(「本会话放行」{@link RememberSessionRequest} 的孪生):`/decide` 体上的 `persistRule`、赎回席交来的那一问(活卡回决口
824
+ * 命中停驻行时卡上的 `persistRule`)。体形判官只有一只(`tool-approval.ts` 的 `readPersistRuleSlot`)。铸点只有一只:{@link RouteLegs.resumeCheckpoint} 在已属主
825
+ * 校验的载入停驻行上读这张卡的记录(有问行读问行,没有读停驻行),在结清点(`landAfterCommit`,与「本会话放行」同一读 `decisionCommittedOf`)交唯一兑付函数
826
+ * `redeemCardRule`。证不出提交 ⇒ 不兑,回执 `rulePersisted:false` + `rule_lane_unavailable`;**不 400**:规则位的成文律是「裁决本身绝不因规则没存上而改判」
827
+ * (与 `remember` 在 `/decide` 上「硬意图键,记不住就 400」刻意不同 —— 两个键各守各的成文律)。
828
+ */
829
+ export interface PersistRuleRequest {
830
+ readonly slot: ParsedPersistRule;
831
+ /** 这次决定带了 `updatedInput`(编辑放行)⇒ 兑付答 `rule_input_edited`:生效的是编辑后的调用,候选是从原始命令铸的。 */
832
+ readonly inputWasEdited: boolean;
833
+ }
834
+ /** {@link RouteLegs.resumeCheckpoint} 的结局 = 腿的应答 + 带了「本会话放行」请求时铸点的答(`rememberApplied`:落没落)+ 带了「不再询问」请求时铸点的回执(`ruleReceipt`)。
835
+ * 两位只在证得出提交的两条车道(bg 停驻子代赎回 / 任务级续跑)的结清点上铸;其余出口(拒 / workflow 投递 / 抛)缺席 ⇒ 门读作「没记住」(`=== true`)/ 规则位
836
+ * 由 {@link ruleReceiptOf} 补成「没存上」。两位都是进程内的结局位,不进 `body` —— 由门挂到这次真做了授予判定的回执上(幂等回放不挂)。 */
767
837
  export type ResumeCheckpointOutcome = ResumeLegOutcome & {
768
838
  readonly rememberApplied?: boolean;
839
+ readonly ruleReceipt?: RuleSlotReceipt;
769
840
  };
841
+ /**
842
+ * 一次带了 `persistRule` 的续跑在回执上的规则位(两扇门同调这一只:`/decide` 与赎回席)—— 结清点铸了就是它;没铸(不经结清点的出口:workflow 投递 / 证不出提交)
843
+ * ⇒ `rulePersisted:false` + `rule_lane_unavailable`(「请求带了、结局没答」只在这里补一处)。没带 ⇒ `undefined`(一个键都不加)。只在 2xx 上挂(调用方判)。
844
+ */
845
+ export declare function ruleReceiptOf(out: ResumeCheckpointOutcome, persistRule: PersistRuleRequest | undefined): RuleSlotReceipt | undefined;
770
846
  /**
771
847
  * **「决定/续跑已受理」那一枚 200 收据的单一铸点**([ref])。
772
848
  *
@@ -1,4 +1,5 @@
1
1
  import { sendJson } from "./send.js";
2
+ import { fieldConflictFacts } from "../field-conflict.js";
2
3
  export function noteResumeClientGone(res, out, logger) {
3
4
  if (out.status !== 200 || out.body.status !== "resuming")
4
5
  return;
@@ -21,6 +22,22 @@ export function assertNever(x) {
21
22
  throw new Error(`unreachable route id: ${String(x)}`);
22
23
  }
23
24
  export const ROUTE_METHOD_ORDER = ["GET", "POST", "PUT", "PATCH", "DELETE"];
25
+ export const REMEMBER_MUST_BE_SESSION = `remember must be "session"`;
26
+ export const REMEMBER_REQUIRES_APPROVE = "remember requires decision 'approve'";
27
+ export function readRememberSlot(raw, decision) {
28
+ if (raw === undefined)
29
+ return { kind: "absent" };
30
+ if (raw !== "session")
31
+ return { kind: "refused", refusal: { errorCode: "request.field_invalid", message: REMEMBER_MUST_BE_SESSION } };
32
+ if (decision !== "approve")
33
+ return { kind: "refused", refusal: { errorCode: "request.field_conflict", message: REMEMBER_REQUIRES_APPROVE, facts: fieldConflictFacts("remember_decision", ["remember", "decision"]) } };
34
+ return { kind: "session" };
35
+ }
36
+ export function ruleReceiptOf(out, persistRule) {
37
+ if (persistRule === undefined)
38
+ return undefined;
39
+ return out.ruleReceipt ?? { rulePersisted: false, ruleRefusal: "rule_lane_unavailable" };
40
+ }
24
41
  export function acceptedResumingReceipt(taskId, sessionId, evidence) {
25
42
  return { status: 200, body: { taskId, sessionId, status: "resuming", bindingEnforced: true, ...evidence } };
26
43
  }
@@ -55,6 +55,7 @@ import type { FlatServiceDeps } from "./server.js";
55
55
  import type { IncomingMessage, ServerResponse } from "node:http";
56
56
  import type { RouteDecl, RouteDispatchDecl, RouteMatch, RouteCtx, RouteMethod } from "./route-ctx.js";
57
57
  import type { BillableKind } from "./readiness.js";
58
+ import type { OperatorPower } from "../operator-roster.js";
58
59
  /** 一只域 handler 相对**全局服务凭据门**的位置。门前 = 未鉴权可达(每一只都要单独论证),门后 = 先过凭据。 */
59
60
  /**
60
61
  * 一行路由在全局服务凭据门的哪一侧、吃哪道门(闭集,三员;[ref] 起由两员拆成三员):
@@ -136,7 +137,7 @@ export declare function routeLabel(_method: string, url: string): string;
136
137
  export declare function isBillableSubmitPath(url: string): boolean;
137
138
  /** 编排器片 2 件 2:这条 url 是哪一**种**计费请求(`undefined` = 不在计费面)。声明序第一条命中的行定种类(今天每条 url 至多命中一行)。 */
138
139
  export declare function billableKindOf(url: string): BillableKind | undefined;
139
- /** [ref]([ref] 件5)—— **改写门**:不烧模型、但在没有任何 service credential 的部署形下必须
140
+ /** [ref]([ref] 件5)—— **改写门**:不烧模型、但在请求没带凭据门认的凭据时(`identity-source.ts` 头注律 5)必须
140
141
  * 与 billable / bake 两族一样 fail-closed 的写门。与 `isBillableSubmitPath` **刻意分开**:这几扇门
141
142
  * `billable=false`(零模型工作),塞进那张名单会让它们连带吃 drain 与 roster-pending 两道 503 ——
142
143
  * 而收编与规则读写在排空期/roster 未落时做完全无害。 */
@@ -144,6 +145,9 @@ export declare function isCredentialGatedRewrite(method: string, url: string): b
144
145
  /** [ref]:这次请求是不是一条**只读订阅**(`RouteDeclFacts.subscription` 那一列;方法也要对上 —— 订阅行恒只认 GET)。
145
146
  * 分派器在 admission 那一拍(第一个 await 之前)同步判它:订阅不进在飞计数,只进附着集与订阅集。 */
146
147
  export declare function isSubscriptionRequest(method: string, url: string): boolean;
148
+ /** 这次请求(方法 + 路径)命中的那一行声明的运维权力(声明行的 `power` 列;`undefined` = 没命中任何带 `power` 的行)—— 分派层的圈禁判只读这一只
149
+ * (`principal-gate.ts` 的 `requestConfinedTier`)。方法也要对上:路径命中而方法不在列的请求对非人档同答圈禁(不再区分 404 / 405)。 */
150
+ export declare function declaredPowerOf(method: string, url: string): OperatorPower | undefined;
147
151
  /** 见 `RouteDeclFacts.methodDispatched` 的头注(单 URL 多方法端点)。 */
148
152
  export declare function isMethodDispatchedSubmitPath(url: string): boolean;
149
153
  /** 一次分派查找的结果:命中的行与它的参数,外加**这条路径上所有行**的方法并集(405 的 `Allow`)。 */
@@ -122,6 +122,7 @@ const SHAPED_LABEL_DECLS = ROUTE_DECLARATIONS.filter((d) => !("path" in d) && ty
122
122
  const BILLABLE_DECLS = ROUTE_DECLARATIONS.filter((d) => d.billable !== undefined);
123
123
  const METHOD_DISPATCHED_DECLS = ROUTE_DECLARATIONS.filter((d) => d.methodDispatched === true);
124
124
  const SUBSCRIPTION_DECLS = ROUTE_DECLARATIONS.filter(isDispatchDecl).filter((d) => d.subscription === true);
125
+ const POWER_DECLS = ROUTE_DECLARATIONS.filter(isDispatchDecl).filter((d) => d.power !== undefined);
125
126
  const CREDENTIAL_GATED_BY_METHOD = (() => {
126
127
  const m = new Map();
127
128
  for (const d of ROUTE_DECLARATIONS)
@@ -156,6 +157,9 @@ export function isCredentialGatedRewrite(method, url) {
156
157
  export function isSubscriptionRequest(method, url) {
157
158
  return SUBSCRIPTION_DECLS.some((d) => d.methods.includes(method) && matchDecl(d, url) !== null);
158
159
  }
160
+ export function declaredPowerOf(method, url) {
161
+ return POWER_DECLS.find((d) => d.methods.includes(method) && matchDecl(d, url) !== null)?.power;
162
+ }
159
163
  export function isMethodDispatchedSubmitPath(url) {
160
164
  return METHOD_DISPATCHED_DECLS.some((d) => declMatches(d, url));
161
165
  }
@@ -13,11 +13,11 @@ export async function handleAdminConfigRefresh(req, res, match, ctx) {
13
13
  sendPrincipalRefusal(res, req, deps.config);
14
14
  return;
15
15
  }
16
- if (!facts.operatorLane(deps).available) {
17
- sendOperatorPrincipalsRequired(res);
16
+ if (!facts.operatorLane(deps, "operate").available) {
17
+ sendOperatorPrincipalsRequired(res, "operate");
18
18
  return;
19
19
  }
20
- if (!explicitOperatorOk(principal, deps.config)) {
20
+ if (!explicitOperatorOk(principal, deps.config, "operate")) {
21
21
  sendError(res, 403, "auth.operator_only", OPERATOR_ONLY_MESSAGE);
22
22
  return;
23
23
  }
@@ -6,6 +6,8 @@
6
6
  * 进入排空经 `drainState.enter`(收尾链装的唯一入口)。
7
7
  * · 门序 = operator 面的既有口径(`routes/retention-ops.ts` 逐字):身份 → 授权 → 验型;billable=false,**刻意不吃排空 503**
8
8
  * (排空中的重放必须能拿到 `already_draining` 回执,吃了就自锁)。
9
+ * · 授权 = 持 `drain` 权力(声明行的 `power` 列,本口的门与分派层的圈禁判读同一格):全运维档(`OPERATOR_PRINCIPALS`,持每一只权力)∪ 排空档
10
+ * (`OPERATOR_DRAIN_PRINCIPALS`,服务主体只持这一只 —— 它的身份只在本口算数,别的口 403 `auth.principal_confined`,见 `operator-roster.ts`)。
9
11
  * · 判序:体坏(含动作号不是标识符形 —— settings-schema 11 `DRAIN_ACTION_ID`)⇒ 400 `request.field_invalid`(零状态变化)→ 没有收尾链(嵌入宿主 / 测试夹具)⇒ 501 `capability.drain_state_required`
10
12
  * → 身份不符 ⇒ 409 `conflict.fleet_identity`(零状态变化;拒句点名不符的字段,不回显值)→ 入口:已在排空 / 硬停已在进行 ⇒ 200 回执
11
13
  * (这一发的期限不会被采用);这一发会进入排空而 `deadlineAt` 离进入那一拍超过 `FLEET_LEASE_OUTAGE_MAX_MS`(`config.fleetLeaseOutageMaxMs`,
@@ -24,6 +26,7 @@ export declare const ADMIN_DRAIN_ROUTES: readonly [{
24
26
  readonly id: "admin-drain";
25
27
  readonly path: "/v1/admin/drain";
26
28
  readonly methods: readonly ["POST"];
29
+ readonly power: "drain";
27
30
  }];
28
31
  type AdminDrainRouteId = RouteIdsOf<typeof ADMIN_DRAIN_ROUTES>;
29
32
  export {};
@@ -7,7 +7,7 @@ import { drainIdentityMismatches } from "../../fleet/drain-entry.js";
7
7
  import { assertNever } from "../route-ctx.js";
8
8
  import { WEB_ADMIN_ENV } from "@sema-agent/settings-schema";
9
9
  export const ADMIN_DRAIN_PATH = "/v1/admin/drain";
10
- const OPERATOR_ONLY_MESSAGE = "drain declaration is operator-only: the caller principal is not in OPERATOR_PRINCIPALS";
10
+ const OPERATOR_ONLY_MESSAGE = "drain declaration is for this deployment's operators and drain principals only: the caller principal is in neither OPERATOR_PRINCIPALS nor OPERATOR_DRAIN_PRINCIPALS";
11
11
  export async function handleAdminDrain(req, res, match, ctx) {
12
12
  const { deps } = ctx;
13
13
  switch (match.decl.id) {
@@ -17,11 +17,12 @@ export async function handleAdminDrain(req, res, match, ctx) {
17
17
  sendPrincipalRefusal(res, req, deps.config);
18
18
  return;
19
19
  }
20
- if (!facts.operatorLane(deps).available) {
21
- sendOperatorPrincipalsRequired(res);
20
+ const power = ADMIN_DRAIN_DECL.power;
21
+ if (!facts.operatorLane(deps, power).available) {
22
+ sendOperatorPrincipalsRequired(res, power);
22
23
  return;
23
24
  }
24
- if (!explicitOperatorOk(principal, deps.config)) {
25
+ if (!explicitOperatorOk(principal, deps.config, power)) {
25
26
  sendError(res, 403, "auth.operator_only", OPERATOR_ONLY_MESSAGE);
26
27
  return;
27
28
  }
@@ -59,7 +60,6 @@ export async function handleAdminDrain(req, res, match, ctx) {
59
60
  return assertNever(match.decl.id);
60
61
  }
61
62
  }
62
- export const ADMIN_DRAIN_ROUTES = [
63
- { id: "admin-drain", path: ADMIN_DRAIN_PATH, methods: ["POST"] },
64
- ];
63
+ const ADMIN_DRAIN_DECL = { id: "admin-drain", path: ADMIN_DRAIN_PATH, methods: ["POST"], power: "drain" };
64
+ export const ADMIN_DRAIN_ROUTES = [ADMIN_DRAIN_DECL];
65
65
  //# sourceMappingURL=admin-drain.js.map
@@ -26,7 +26,7 @@
26
26
  * 的调用方不该从「这台有没有授权表」上读出部署形态。
27
27
  * 🔴 四口都在 `isCredentialGatedRewrite`(server.ts)门内(codex R1-[high] 验真后补):授权的**唯一**输入是
28
28
  * principal 头 ∧ 一次调用的爆炸半径跨租户(改缺省行 = 改整台部署每个 principal 的 verdict;读面 = 全部授权行 +
29
- * operator 手写的 note)—— 无 service 凭证且未开 `ALLOW_UNAUTHED_WRITES` 的 worker 上那个头**可自造**,与
29
+ * operator 手写的 note)—— 请求没带凭据门认的凭据(且部署未开 `ALLOW_UNAUTHED_WRITES`)时那个头**可自造**,与
30
30
  * `/v1/memory/erase` / `POST /v1/memory/export` 同一条论证。
31
31
  *
32
32
  * ── 为什么缺席形是 **501 `capability.*`** 而不是 404(与 consolidation 阀门刻意分家)──────────────────
@@ -19,10 +19,10 @@ export async function handleMemoryOptOut(req, res, match, ctx) {
19
19
  }
20
20
  const fact = facts.memoryOptOutGrant(deps);
21
21
  if (!fact.available && fact.why === "operator_principals_empty") {
22
- sendOperatorPrincipalsRequired(res);
22
+ sendOperatorPrincipalsRequired(res, "operate");
23
23
  return;
24
24
  }
25
- if (!explicitOperatorOk(principal, deps.config)) {
25
+ if (!explicitOperatorOk(principal, deps.config, "operate")) {
26
26
  sendError(res, 403, "auth.operator_only", "memory opt-out grant administration is operator-only: the caller principal is not in OPERATOR_PRINCIPALS");
27
27
  return;
28
28
  }
@@ -33,7 +33,7 @@ export async function handleMemoryOptOut(req, res, match, ctx) {
33
33
  sendError(res, 501, "capability.memory_optout_grant_required", "this deployment has no memory opt-out grant table: the per-principal memory-capture opt-out authorization store lives on a SQL store backend (DB_BACKEND=mysql|pg) and the local backend deliberately keeps no companion store for forgetting — wire a SQL backend to administer opt-out grants");
34
34
  return;
35
35
  case "operator_principals_empty":
36
- sendOperatorPrincipalsRequired(res);
36
+ sendOperatorPrincipalsRequired(res, "operate");
37
37
  return;
38
38
  default:
39
39
  return assertNever(fact.why);
@@ -69,10 +69,10 @@ async function operatorLane(req, res, id, params, ctx) {
69
69
  }
70
70
  const fact = facts.adoption(deps);
71
71
  if (!fact.available && fact.why === "operator_principals_empty") {
72
- sendOperatorPrincipalsRequired(res);
72
+ sendOperatorPrincipalsRequired(res, "operate");
73
73
  return;
74
74
  }
75
- if (!explicitOperatorOk(principal, deps.config)) {
75
+ if (!explicitOperatorOk(principal, deps.config, "operate")) {
76
76
  sendError(res, 403, "auth.operator_only", "adoption is an operator-only deployment action");
77
77
  return;
78
78
  }
@@ -82,7 +82,7 @@ async function operatorLane(req, res, id, params, ctx) {
82
82
  sendAdoptionStoreRequired(res);
83
83
  return;
84
84
  case "operator_principals_empty":
85
- sendOperatorPrincipalsRequired(res);
85
+ sendOperatorPrincipalsRequired(res, "operate");
86
86
  return;
87
87
  default:
88
88
  return assertNever(fact.why);
@@ -129,8 +129,6 @@ async function operatorLane(req, res, id, params, ctx) {
129
129
  return;
130
130
  }
131
131
  const out = await runner.start(fromPrincipal, toPrincipal);
132
- if (out.kind === "receipt")
133
- await deps.toolApproval?.followRowOwners();
134
132
  sendOutcome(res, out);
135
133
  return;
136
134
  }
@@ -2,8 +2,7 @@ import { chosenAgentName } from "@sema-agent/core";
2
2
  import { sendJson, sendError } from "../send.js";
3
3
  import { gatedSubject, sendUnauthorized } from "../principal-gate.js";
4
4
  import { PRINCIPAL_MAX_BYTES } from "../../principal-shape.js";
5
- import { partsOf } from "../../owner-brands.js";
6
- import { taskSpecIdentityOf } from "../../engine-identity.js";
5
+ import { engineScopeOf } from "../../engine-identity.js";
7
6
  import { routeListFilter } from "../owner-access.js";
8
7
  import { assertNever } from "../route-ctx.js";
9
8
  import * as facts from "../../capability-facts.js";
@@ -99,7 +98,7 @@ export async function handleAgentRoster(req, res, match, ctx) {
99
98
  }
100
99
  const status = statusRaw === null ? undefined : statusRaw;
101
100
  const subject = gatedSubject(req, deps.config);
102
- const ownScope = taskSpecIdentityOf(subject === undefined ? undefined : partsOf(subject)).principal ?? "default";
101
+ const ownScope = engineScopeOf(subject);
103
102
  let scope;
104
103
  if (gateOwner !== null) {
105
104
  scope = ownScope;
@@ -118,6 +118,7 @@ export type PendingRowForWire = PendingRow & {
118
118
  governanceForced?: true;
119
119
  rememberRefused?: true;
120
120
  agent?: SessionAgent;
121
+ askId?: string;
121
122
  };
122
123
  /**
123
124
  * 🔴 [ref]-2 / [ref]②:两条 durable 读面(`GET /v1/approvals` + `/v1/approvals/stream`)的**唯一**
@@ -153,7 +154,7 @@ export declare function streamApprovals(req: IncomingMessage, res: ServerRespons
153
154
  * 缺席,流的字节与 [ref] 之前逐字相同(能力缺席 = 零变化,不是空数组)。**位置在 `pollMs` 之前**
154
155
  * 与 `governance` 同一条理由:`pollMs` 只有测试传,而本参数是每个生产调用点都必须表态的那一个。
155
156
  */
156
- live: Pick<ToolApprovalCoordinator, "listLivePending"> | undefined,
157
+ live: Pick<ToolApprovalCoordinator, "listLivePending" | "readParkedAskOfGate"> | undefined,
157
158
  /**
158
159
  * 🔴 [ref]:`pending` 车道的**第二个半场** —— 被扣的跨会话来信(`peer_inbound` 行),与 `GET /v1/approvals` 的 `pending[]`
159
160
  * **同一只**闭包({@link peerInboundRowsFor},已绑调用方自己的信箱 scope)。与停驻行同一条 delta 车道、同一对事件名