@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
@@ -15,7 +15,7 @@ import { type BackgroundAgentRecord, type BackgroundAgentStore, type CheckpointS
15
15
  import type { ParkedReviveSurfaceFactory } from "./parked-revive-surface.js";
16
16
  import type { RebuiltInheritedGate } from "./boot/parked-revive-gate.js";
17
17
  import { type WorkflowRunParkKey, type WorkflowAgentSessionIndex } from "./orchestration/workflow-agent-session-index.js";
18
- import type { WorkflowParkDecisionStore, WorkflowParkOutcome } from "./orchestration/workflow-park-decision.js";
18
+ import type { HolderFenceVerdict, WorkflowParkDecision, WorkflowParkDecisionStore, WorkflowParkOutcome } from "./orchestration/workflow-park-decision.js";
19
19
  import { type ApprovalLegOrigin } from "./approval-leg-origin.js";
20
20
  import type { SessionFace } from "./session-incarnation.js";
21
21
  import { type CardSettlePort } from "./card-settle-stored-scope.js";
@@ -127,16 +127,43 @@ type ParkedResumeEntry = NonNullable<RunInternals["workflowParkedResume"]>[numbe
127
127
  * 产物原样摊进那一跑的 `RunInternals`(部署方铸的 TRUSTED internals:不是 `TaskSpec` 字段、不是工具参数 —— 模型永远不能自己决定一次审批)。
128
128
  *
129
129
  * 产物 = 调用方自己带的那一份(`carried`:`/decide` 的投递跑带着它刚受理、行还没落的那条决定)∪ 这个会话的决定行(律与寿命的属主 =
130
- * `orchestration/workflow-park-decision.ts` 文件头),同一张卡以 `carried` 为准(它是要取代行上旧决定的那一个)。行这一侧逐条:
131
- * · 子代卡此刻**仍 pending** 才供:读回 `null` / 状态不是 `pending` ⇒ 不供(引擎对「记着停驻、卡却已不 pending」的序数,有条目 ⇒ 当确认
132
- * 结算、没条目 ⇒ 拒续跑 —— 供一条过期条目会把后者改成前者);读卡抛 ⇒ 不供并计 `server.workflow-park-decision.card-unreadable`
133
- * (这一读失败不代表引擎随后的那一读也失败;不供的方向是这一跑不带它、行留着给下一跑 —— 绝不把它变成一次确认);
134
- * · 投递目标 = 这张卡**当下**的持有者 run(`findParkOrigin`,与 `/decide` 路由同一只判官):持有者判不出唯一一条(分叉 / 证不了 / 卡
135
- * 已在新 token 下再停)⇒ 不供(引擎只把条目交给 `resumeFromRunId` 恰是持有者的续跑;没有唯一持有者就没有可交付的那一跑)。
130
+ * `orchestration/workflow-park-decision.ts` 文件头),同一张卡以 `carried` 为准(它是要取代行上旧决定的那一个)。行这一侧逐条经
131
+ * {@link deliverableEntryOf}(子代卡仍 pending ∧ 当下持有者;引擎只把条目交给 `resumeFromRunId` 恰是持有者的续跑)。
136
132
  * 决定店读抛(local 账本闸合上 / SQL 一行坏体)⇒ 与读卡失败同律:这一店当「没有可供的行」,只交回 `carried`,计 `server.workflow-park-decision.store-unreadable`
137
133
  * (不跳过坏行照供其余:读不出的那一行可能正是取代了旧决定的那一笔;不拒起跑:不供是安全方向,卡仍 pending、可再决)。决定的写口照旧由店闸住。
138
134
  */
139
135
  export declare function heldWorkflowParkDecisions(sources: HeldWorkflowParkDecisionSources, hostSessionId: string, carried?: readonly ParkedResumeEntry[]): Promise<Pick<RunInternals, "workflowParkedResume">>;
136
+ /**
137
+ * 一条决定行此刻的可交付性(闭集):
138
+ * · `deliverable` —— 交给引擎的那一条 + 它的当下持有者 + 子代那张卡此刻的存储行(仍 pending;属主 scope 与子会话 —— 收场送达按它判内部授权);
139
+ * · `not_deliverable` —— 卡已不 pending / 读回 `null` / 判不出唯一的当下持有者(分叉 / 证不了 / 卡已在新 token 下再停);
140
+ * · `unreadable` —— 卡或持有者此刻读不出(店抛)。三个读者各按自己的语义处置:起跑读者 = 这一跑不带它;拉取腿 = 下一拍;收场送达 = 重投。
141
+ */
142
+ export type DeliverableParkDecision = {
143
+ readonly kind: "deliverable";
144
+ readonly entry: ParkedResumeEntry;
145
+ readonly origin: Extract<ParkOrigin, {
146
+ kind: "workflow";
147
+ }>;
148
+ readonly card: {
149
+ readonly scope: string;
150
+ readonly sessionId: string;
151
+ };
152
+ } | {
153
+ readonly kind: "not_deliverable";
154
+ } | {
155
+ readonly kind: "unreadable";
156
+ };
157
+ /**
158
+ * 🔴 **一条决定行此刻可不可交付、交给谁 —— 逐行判的唯一一只**(交付行的三方同读:起跑读者 {@link heldWorkflowParkDecisions}、持有进程的拉取腿、run 收场送达):
159
+ * · 子代卡此刻**仍 pending** 才交付:读回 `null` / 状态不是 `pending` ⇒ 不交付(引擎对「记着停驻、卡却已不 pending」的序数,有条目 ⇒ 当确认结算、没条目 ⇒ 拒续跑 ——
160
+ * 交一条过期条目会把后者改成前者);
161
+ * · 投递目标 = 这张卡**当下**的持有者 run(与 `/decide` 路由同一只判官 `routeWorkflowPark`):判不出唯一一条 ⇒ 不交付;
162
+ * · 卡或持有者读不出 ⇒ `unreadable`,计 `server.workflow-park-decision.card-unreadable`(这一读失败不代表引擎随后那一读也失败;不交付的方向是这一次不带它、行留着 ——
163
+ * 绝不把它变成一次确认)。
164
+ * 不读行上的承运者(`deliveredTaskId`):承运者是谁与「此刻交给谁」无关。
165
+ */
166
+ export declare function deliverableEntryOf(sources: Required<Pick<HeldWorkflowParkDecisionSources, "checkpointStore" | "workflowAgentSessionIndex" | "workflowRunStore">>, row: WorkflowParkDecision): Promise<DeliverableParkDecision>;
140
167
  /**
141
168
  * pending checkpoint → parked bg 行匹配。
142
169
  *
@@ -223,7 +250,7 @@ export interface ParkedDecideDeps {
223
250
  * 「本会话放行」落在**记不住的车道**上怎么答(闭集;两扇门之间唯一允许的差 —— 其余两口同读同答,铸点只有续跑腿一只):
224
251
  * · `refuse` —— `/decide` 体上的 `remember:"session"`:那是一个硬意图键,认领之前 400 点名车道(`decide.workflow_remember_unsupported` /
225
252
  * `decide.parked_remember_unsupported`),去掉它再决即可,零副作用;
226
- * · `decide_once` —— 应答口命中停驻行的 `allow_session`:那是卡上的一个选项,主内容是「放行」。照常放行这一次、不落豁免、回执
253
+ * · `decide_once` —— 决断口命中停驻行的 `remember:"session"`(7.151.x 及以前是应答口的 `allow_session`):那是卡上的一个选项,主内容是「放行」。照常放行这一次、不落豁免、回执
227
254
  * `rememberApplied:false` —— 与活卡上「记不住的卡点 allow_session」同一答法;不把一次已经成立的批准改成 400(窗到期那一拍的按键今天是成的)。
228
255
  * 记不住的车道 = workflow 车道(它的 200 证不出引擎已提交这次决定)、无会话锚的 bg 停驻行(豁免无处可锚)。
229
256
  */
@@ -256,7 +283,7 @@ export interface ParkedDecideRequest {
256
283
  /** D-1 决断绑定:决断方点名它看到的那一对(必在 —— 续跑腿的判官 `decidedActionOf` 判过才交下来)与决定体的其余两位;
257
284
  * server 绝不重算、绝不从停驻行补,core resume 侧做 fail-closed 等值校验 —— 与 legacy 腿同姿势。 */
258
285
  binding: Omit<DecideBinding, "checkpointToken" | "boundCallId" | "boundInputHash"> & DecidedAction;
259
- /** 这次决定带着「本会话放行」请求(`/decide` 的 `remember:"session"` / 应答口命中停驻行的 `allow_session`,两口同一只请求;
286
+ /** 这次决定带着「本会话放行」请求(`/decide` 的 `remember:"session"` / 决断口命中停驻行的 `remember:"session"`,两口同一只请求;
260
287
  * 铸点 = 续跑腿 `resumeCheckpoint`)时,续跑腿交下来的**锚点记录器** + 记不住时怎么答({@link ParkedRemember})。 */
261
288
  remember?: ParkedRemember;
262
289
  /** [ref](core 5.7.0,F6 翻案):AskUserQuestion 的 approve 携操作员答案——原样透传进
@@ -309,10 +336,10 @@ export declare function buildParkedResumeOutcome(req: ParkedDecideRequest): Work
309
336
  /**
310
337
  * [ref] 车CM —— **第三条车道的计划**(纯函数;驱动本身归 resume 家族的那条腿,见下方「为什么不自建驱动」)。
311
338
  *
312
- * 🔴 **这份计划先交给持有这张卡的那条活 run**({@link deliverToHoldingRun}):run 仍在本进程里跑 ⇒ 决定由引擎在原 run 里用上,
313
- * 下面的续跑车道一步都不走;只有那条 run 已不能收决定(本进程里没有它在跑 / 它已挂起收场)时,计划才按下文落到续跑车道。
314
- * 判决 / 宿主两只拒臂在交给活 run 之前判:`remember` 拒的理由两条去路同真(两者的 200 都证不出引擎已提交);
315
- * 本服务只经会话的 Workflow 工具起 workflow,活在本进程里的 run 恒有发起会话 ⇒ 宿主拒臂只拦得住续跑车道上那种 run。
339
+ * 🔴 **持有这张卡的 run 仍读作 `running` ⇒ 这份计划先进记录栅栏**(唯一仲裁点;`orchestration/workflow-park-decision.ts` 文件头的律):决定行落在那条 run 的
340
+ * 记录行锁里,交给引擎由跑那条 run 的进程做({@link answerOfHolderRedeem} / 持有进程的拉取腿 / run 收场送达),下面的续跑车道一步都不走;
341
+ * 只有记录已不读作 `running` 时,计划才按下文落到续跑车道。判决 / 宿主两只拒臂在进栅栏之前判:`remember` 拒的理由两条去路同真(两者的 200 都证不出引擎已提交);
342
+ * 本服务只经会话的 Workflow 工具起 workflow,读作 `running` 的 run 恒有发起会话 ⇒ 宿主拒臂只拦得住续跑车道上那种 run。
316
343
  *
317
344
  * ## 这条车道为什么长这样(亲读 core 实现后的结论,不是从类型面推的)
318
345
  * 任务书原案是「server 直接 `startWorkflow({resumeFromRunId, parkedResume})`」。亲读安装的 core
@@ -390,57 +417,81 @@ export declare function planWorkflowParkedDecide(origin: Extract<ParkOrigin, {
390
417
  kind: "workflow";
391
418
  }>, req: ParkedDecideRequest): WorkflowParkedDecidePlan;
392
419
  /**
393
- * **持有这张卡的那条 run 还在本进程里跑吗 —— 在跑就把决定交给它**(workflow 停驻卡的唯一一种去法的前半;后半是续跑车道)。
420
+ * 续跑车道交给宿主模型的**指路**(`/decide` 的计划与 run 收场送达同一只;两条交付续跑车道的路读同一份文本)。
421
+ * 消息是给宿主模型的**指路**,不是能力:决定本身走 internals 的可信通道(模型永远不能自己决定审批)。
394
422
  *
395
- * ## 律(一条)
396
- * 一张 workflow 子代停驻卡的决定先交给持有它的那条 run:引擎根导出 `redeemWorkflowParks(runId, run.scope, [条目])` 是「这张停驻怎么处置」的唯一读法
397
- * (它查本进程的活 run 表;别的进程里的 run 它答 `not_active`)。引擎答 run 已不能收(`not_active`;`suspending` 且它的 `ended` 已落定)⇒
398
- * 交回 `resume_lane`,调用方照计划走续跑车道;其余每一个答词都在这里落成这次决断的应答,续跑车道一步不走 ——
399
- * 同一张卡在同一时刻只有一条去路(活 run 上把决定交给模型去调 `Workflow({resumeFromRunId})` 那一读法退役:引擎的 fork 守卫拒它)。
423
+ * 🔴 **本服务唯一的 `trusted: true` 铸点**。文本框架只看文本出自谁,不看按下按钮的是谁:这段话是**服务自己铸的**
424
+ * (下面三个结构位,没有一个字来自调用方),所以以系统源投递 —— 不论决定者是不是运维(wake 腿 `resumeWake` 原样转交,
425
+ * 不再从决定者身份推)。调用方的话(HTTP steer / `/wake` 的正文、hook 输出)恒 `trusted: false`;
426
+ * 结构钉 `test/steer-text-framing.test.ts` 普查全仓只此一处。
400
427
  *
401
- * ## 条目
402
- * 决定恒带结局(`{ token, outcome }`)。**带续跑重述键时送引擎的确认动词**(`{ token }`:确认从不授权驱动,卡仍 pending 时引擎答 `kept_parked`、
403
- * 停驻原样留下)—— 重述键只盖得到续跑车道的重建输入,活 run 上的子代带着它停驻时的表继续,所以活 run 在 ⇒ 400 拒(与后台子代同一个码);
404
- * run 不在 ⇒ 续跑车道照带重述键。「活不活」只问引擎这一处,不读第二只判官。确认不是无副作用的探针:卡恰在此刻已不待决 ⇒ 引擎把那一调结算成失败(`settled`,
405
- * 与任何决定撞上同一形同一个结局)⇒ 答 409 `decide.gate_moved`。
428
+ * 🔴 **只含结构位**(7.69.0 合并重扫 c1,安全轴)。core 对 `trusted:true` 的 steer 走 `formatHookFeedback` ⇒ 铸成**带 mark 的**
429
+ * `<system-reminder>`,而那个 mark 正是 core 教模型「带 mark 的才是引擎权威」的防冒名位。所以进这条
430
+ * 文本的每一个字都必须是 server/引擎自己能负责的事实:`runId`(引擎铸的 `w*`)、`callKey`
431
+ * (引擎铸的 `ordinal:specIdentityHash`)、判决词二选一。
432
+ * 🔴 **[ref] 之后这条纪律不再需要一条「别内插 label」的特判**:出身实体换成了记录上的 `parks[]` 条目,
433
+ * 而那是一只 **KEYS ONLY** 的对象(`callKey` / `sessionId` / `token` / `originRunId`,core 顶注逐字),
434
+ * 结构上就没有 LLM 撰写的位可插。人要读 label,读面已经有了(`GET /v1/workflows/:id` 的 agents[].label,
435
+ * 那条既有投影带脱敏);这里**不**再铸第二份清洗——少一条规则,而不是多一条。
406
436
  *
407
- * ## 答词 → 应答(闭集,`switch` 穷尽;引擎加词 ⇒ 编译红)
408
- * · `driving` —— 驱动起步 ⇒ 200 {@link parkedChildResumedReceipt}(**无**结清证据:resolve CAS 在驱动里才发生,本回执证不出提交);回执记进
409
- * {@link LIVE_REDEEM_RECEIPTS}(寿命 = 这条 run 在本进程里活着),供同一决定重点一次时回放;
410
- * · `already_taken` —— 这条 run 先前已收下这张卡的一个决定(驱动可能还在等并发槽,卡此刻仍 pending)⇒ 簿里同一决定(指纹相等)⇒ 原样回放首张回执;
411
- * 否则(另一个决定)⇒ 409 `decide.claim_lost`(与后台子代并发决断同码);
412
- * · `settled` —— 卡在本次决断之下已离开 pending(到期 / 别处结清),这个决定没被用上(那一调以 `workflow.park_not_pending` 失败)⇒
413
- * 409 `decide.gate_moved`(后台子代对同一事实的既有答;答 200 = 把「卡已到期」说成「你的批准已受理」);
414
- * · `not_parked_here`—— 这条 run 此刻不在这张卡上等(正在收场 / 一个并发决断正拿着它)⇒ 409 `decide.gate_moved`;
415
- * · `unreadable` —— checkpoint 店的字此刻读不出,停驻原样留下 ⇒ 503 `decide.store_unreachable`(重试);
416
- * · `kept_parked` —— 只在送的是确认时可达 ⇒ 400 `decide.parked_restatement_unsupported`;送的是决定时引擎不会答它 ⇒ 抛(500);
417
- * · `not_armed` —— run 没有 checkpoint 座就不可能停驻出这张卡 ⇒ 抛(500,引擎不变量破;不猜一条去路)。
437
+ * 🔴 **为什么点名「同一份脚本源」**([ref] 真跑撞获,亲读 core 后成文):`resumeFromRunId` **不是**
438
+ * 自足入参 —— 安装的 core `dist/orchestration/run-workflow-tool.js` 在解析完 scriptPath/script/name
439
+ * 三选一之后就 `structuredError("Must provide script, name, or scriptPath")`(那一臂对带不带
440
+ * `resumeFromRunId` 一视同仁),它的 schema 描述逐字也是「resume a PRIOR run of the **SAME script**」。
441
+ * 修前这句话只说 `resumeFromRunId`,照着念的宿主会拿到那条结构化错误,而这条车道**是**这条审批唯一的
442
+ * 投递腿 ⇒ 决定送到了、兑不出来。文本是两条腿(wake / fresh)共用的那一份,改在这里 = 改在唯一属主上。
418
443
  */
419
- export type WorkflowLiveDelivery = {
420
- readonly kind: "answered";
421
- readonly answer: ParkedDecideResult;
422
- } | {
423
- readonly kind: "resume_lane";
444
+ export declare function workflowParkGuidance(runId: string, callKey: string, decision: "approve" | "deny"): {
445
+ text: string;
446
+ trusted: true;
424
447
  };
425
- /** 交给活 run 的那一次决定(计划已过两只拒臂;`fingerprint` = 决定行的同一只同一性判据 `parkDecisionFingerprint`,含重述键)。 */
426
- export interface WorkflowLiveDecision {
448
+ /** 交给持有这张卡的那条 run 的一次决定(计划已过两只拒臂)。 */
449
+ export interface WorkflowHolderDecision {
427
450
  readonly token: CheckpointToken;
428
451
  readonly outcome: WorkflowParkOutcome;
429
452
  readonly decision: "approve" | "deny";
430
- readonly fingerprint: string;
431
- readonly restated: boolean;
432
453
  }
433
- /** 一条活 run 的身份 + 它在本进程里收场的那一刻(读法 = 引擎的观察通道走完;run 不在本进程里跑 ⇒ 立即落定)。 */
434
- export interface HoldingRun {
435
- readonly id: string;
436
- readonly ended: () => Promise<void>;
437
- }
438
- /** 把决定交给持有这张卡的活 run(律见 {@link WorkflowLiveDelivery})。 */
439
- export declare function deliverToHoldingRun(origin: Extract<ParkOrigin, {
440
- kind: "workflow";
441
- }>, d: WorkflowLiveDecision): Promise<WorkflowLiveDelivery>;
442
- /** 引擎的答 → 这次决断的应答(纯读法 + 回执簿;`suspending` 等它的 `ended` 落定)。导出给答词表的钉。 */
443
- export declare function answerOfParkDelivery(delivery: WorkflowParkDelivery, run: HoldingRun, d: WorkflowLiveDecision): Promise<WorkflowLiveDelivery>;
454
+ /**
455
+ * 🔴 **把行上的决定交给引擎的唯一调用点**(`redeemWorkflowParks`,引擎对「这张停驻怎么处置」的唯一读法):两个调用方 —— 记录栅栏立住之后 `/decide` 的本进程快路
456
+ * ({@link answerOfHolderRedeem})与持有进程的拉取腿({@link holderPullDisposition})。恒送一个**决定**(`{ token, outcome }`):重述键在记录栅栏里判(`restated` 结局),
457
+ * 不再送引擎的确认动词去探「活不活」。引擎只查本进程:run 不在这里跑 ⇒ `not_active`(决定行已立住,交付归持有进程的拉取或收场送达)。
458
+ */
459
+ export declare function redeemHere(runId: string, scope: string, d: Pick<WorkflowHolderDecision, "token" | "outcome">): Promise<WorkflowParkDelivery>;
460
+ /**
461
+ * 记录栅栏三只零写拒结局 → 应答(闭集;`stands` / `not_running` 不在本表:前者进 {@link answerOfHolderRedeem},后者走续跑车道)。码全是既有码。
462
+ * · `not_held` —— run 仍在跑,已不持有这张卡(改停驻 / 已被驱动)⇒ 409 `decide.gate_moved`;
463
+ * · `restated` —— 决断带 `mcpServers` / `a2aPeers`,而持有它的 run 仍在跑(子代带着 run 已有的表继续)⇒ 400 `decide.parked_restatement_unsupported`,卡留 pending;
464
+ * · `other_decision` —— 行上已是另一个决定(先受理者立)⇒ 409 `decide.claim_lost`。
465
+ */
466
+ export declare function answerOfHolderFence(verdict: Exclude<HolderFenceVerdict, "stands" | "not_running">, runId: string): ParkedDecideResult;
467
+ /** 记录栅栏这一段店没答出来(读记录 / 落行 / 锁定读)⇒ 503 `decide.store_unreachable`:什么都没决,持有这张卡的 run 照旧等着,重试。 */
468
+ export declare function holderFenceFaultAnswer(runId: string): ParkedDecideResult;
469
+ /**
470
+ * **记录栅栏立住之后,`/decide` 的本进程快路**:引擎对 {@link redeemHere} 的答 → 这次决断的应答(闭集,`switch` 穷尽;引擎加词 ⇒ 编译红)。
471
+ * 决定已在唯一仲裁点上立住 ⇒ 除「卡在本次决断之下已离开 pending」外,一律答同一张 200 回执({@link parkedChildResumedReceipt},无结清证据);本口**不**再等 `ended`、
472
+ * **不**再起续跑车道 —— 写了行的一方从不起宿主一跑,交付由持有进程的拉取(下一个维护拍)或 run 的收场送达完成。
473
+ * · `live`/`driving`、`live`/`already_taken` ⇒ 200(单一仲裁之下,run 收下过的只可能是这同一个决定);
474
+ * · `live`/`settled` ⇒ 409 `decide.gate_moved`(卡已离开 pending,这个决定没被用上;行惰性 —— 读者只供 pending 卡);
475
+ * · `not_active`、`suspending`、`live`/`not_parked_here`、`live`/`unreadable` ⇒ 200(run 在别处跑 / 正在收场 / 本进程此刻读不出卡:行立住了,交付在后);
476
+ * · `live`/`kept_parked` ⇒ 抛(送的是决定,引擎只对确认答它);`not_armed` ⇒ 抛(run 没有 checkpoint 座就停驻不出这张卡,引擎不变量破)。
477
+ * 「收场窗」的判放在管道事实上:run 收场之后由收场送达把行交给续跑车道,本表不读 `not_active` 的字面去区分「在别处跑」与「本进程收场中」。
478
+ */
479
+ export declare function answerOfHolderRedeem(delivery: WorkflowParkDelivery, runId: string, decision: "approve" | "deny"): ParkedDecideResult;
480
+ /**
481
+ * 持有进程的拉取腿对 {@link redeemHere} 的答的处置(闭集,`switch` 穷尽):
482
+ * · `delivered` —— `driving` / `already_taken` / `settled`:引擎收下了(或卡已离开 pending、行惰性);
483
+ * · `next_beat` —— `not_parked_here` / `unreadable`:此刻交不进去,行留着,下一拍再来;
484
+ * · `left` —— `suspending` / `not_active`:run 正在收场 / 已不在本进程,交付归 run 的收场送达;
485
+ * · 抛 —— `kept_parked` / `not_armed`(与 {@link answerOfHolderRedeem} 同两只不变量)。
486
+ */
487
+ export type HolderPullDisposition = "delivered" | "next_beat" | "left";
488
+ export declare function holderPullDisposition(delivery: WorkflowParkDelivery, runId: string): HolderPullDisposition;
489
+ /**
490
+ * 引擎的观察通道走完 = 这条 run 在本进程里收场了(`subscribeWorkflow` 在 run 收场的最后一步关闭;不在本进程里跑的 run 一开始就是空的 ⇒ 立即落定)。
491
+ * 三个读者:持有进程的视图(执行器寿命,`workflow-park-holder.ts`)、续跑车道开跑之前那一等(收场窗里引擎答 `not_active` 而 run 仍登记在跑,
492
+ * 宿主一跑的续跑会撞 fork 守卫 ⇒ 先等它走完)。core 的观察队列只关不拒。
493
+ */
494
+ export declare function runChannelEnded(runId: string, scope: string): Promise<void>;
444
495
  /**
445
496
  * `/decide` parked 赎回腿([ref] 件3d server 半场;[ref]/[ref]/[ref] core 裁定形)。
446
497
  *
@@ -30,36 +30,39 @@ export async function findParkOrigin(sources, cp) {
30
30
  if (index === undefined || runStore === undefined)
31
31
  return undefined;
32
32
  try {
33
- const pointers = await index.listByAgentSession(cp.sessionId);
34
- if (pointers.length === 0)
35
- return undefined;
36
- const runs = [];
37
- for (const runId of new Set(pointers.map((p) => p.runId))) {
38
- const run = await runStore.get(runId);
39
- if (run !== null)
40
- runs.push(run);
41
- }
42
- const route = routeWorkflowPark(cp.sessionId, runs);
43
- switch (route.kind) {
44
- case "held":
45
- return route.park.token === cp.token ? { kind: "workflow", runId: route.runId, run: route.run, park: route.park } : undefined;
46
- case "forked":
47
- return { kind: "workflow_park_forked", runIds: route.runIds };
48
- case "unproven":
49
- return { kind: "workflow_parks_unreadable", runId: route.runId, run: route.run, ...(route.readableHolderRunId !== undefined ? { readableHolderRunId: route.readableHolderRunId } : {}) };
50
- case "none":
51
- return undefined;
52
- default: {
53
- const unhandled = route;
54
- throw new Error(`unhandled workflow park route: ${JSON.stringify(unhandled)}`);
55
- }
56
- }
33
+ return await routeWorkflowOrigin(index, runStore, cp);
57
34
  }
58
35
  catch (e) {
59
36
  quiet(sources.warn, "workflow_park_probe_failed", { error: e instanceof Error ? e.message : String(e) });
60
37
  return undefined;
61
38
  }
62
39
  }
40
+ async function routeWorkflowOrigin(index, runStore, cp) {
41
+ const pointers = await index.listByAgentSession(cp.sessionId);
42
+ if (pointers.length === 0)
43
+ return undefined;
44
+ const runs = [];
45
+ for (const runId of new Set(pointers.map((p) => p.runId))) {
46
+ const run = await runStore.get(runId);
47
+ if (run !== null)
48
+ runs.push(run);
49
+ }
50
+ const route = routeWorkflowPark(cp.sessionId, runs);
51
+ switch (route.kind) {
52
+ case "held":
53
+ return route.park.token === cp.token ? { kind: "workflow", runId: route.runId, run: route.run, park: route.park } : undefined;
54
+ case "forked":
55
+ return { kind: "workflow_park_forked", runIds: route.runIds };
56
+ case "unproven":
57
+ return { kind: "workflow_parks_unreadable", runId: route.runId, run: route.run, ...(route.readableHolderRunId !== undefined ? { readableHolderRunId: route.readableHolderRunId } : {}) };
58
+ case "none":
59
+ return undefined;
60
+ default: {
61
+ const unhandled = route;
62
+ throw new Error(`unhandled workflow park route: ${JSON.stringify(unhandled)}`);
63
+ }
64
+ }
65
+ }
63
66
  export async function heldWorkflowParkDecisions(sources, hostSessionId, carried) {
64
67
  const entries = [...(carried ?? [])];
65
68
  const { workflowParkDecisions: decisions, checkpointStore: cs, workflowAgentSessionIndex: workflowIndex, workflowRunStore } = sources;
@@ -73,20 +76,38 @@ export async function heldWorkflowParkDecisions(sources, hostSessionId, carried)
73
76
  for (const row of held.rows) {
74
77
  if (own.has(String(row.token)))
75
78
  continue;
76
- const card = await cs.get(row.token).then((cp) => ({ cp }), (err) => ({ err }));
77
- if ("err" in card) {
78
- recordFailOpen("server.workflow-park-decision.card-unreadable", `runId=${row.runId} err=${card.err instanceof Error ? card.err.message : String(card.err)}`);
79
- continue;
80
- }
81
- if (card.cp === null || card.cp.status !== "pending")
82
- continue;
83
- const origin = await findParkOrigin({ workflowIndex, workflowRunStore }, { token: row.token, scope: card.cp.scope, sessionId: card.cp.sessionId });
84
- if (origin?.kind === "workflow")
85
- entries.push({ runId: origin.runId, token: row.token, outcome: row.outcome });
79
+ const deliverable = await deliverableEntryOf({ checkpointStore: cs, workflowAgentSessionIndex: workflowIndex, workflowRunStore }, row);
80
+ if (deliverable.kind === "deliverable")
81
+ entries.push(deliverable.entry);
86
82
  }
87
83
  }
88
84
  return entries.length > 0 ? { workflowParkedResume: entries } : {};
89
85
  }
86
+ export async function deliverableEntryOf(sources, row) {
87
+ const unreadable = (step, err) => {
88
+ recordFailOpen("server.workflow-park-decision.card-unreadable", `step=${step} runId=${row.runId} err=${err instanceof Error ? err.message : String(err)}`);
89
+ return { kind: "unreadable" };
90
+ };
91
+ let cp;
92
+ try {
93
+ cp = await sources.checkpointStore.get(row.token);
94
+ }
95
+ catch (err) {
96
+ return unreadable("card", err);
97
+ }
98
+ if (cp === null || cp.status !== "pending")
99
+ return { kind: "not_deliverable" };
100
+ let origin;
101
+ try {
102
+ origin = await routeWorkflowOrigin(sources.workflowAgentSessionIndex, sources.workflowRunStore, { token: row.token, sessionId: cp.sessionId });
103
+ }
104
+ catch (err) {
105
+ return unreadable("holder", err);
106
+ }
107
+ if (origin?.kind !== "workflow")
108
+ return { kind: "not_deliverable" };
109
+ return { kind: "deliverable", entry: { runId: origin.runId, token: row.token, outcome: row.outcome }, origin, card: { scope: cp.scope, sessionId: cp.sessionId } };
110
+ }
90
111
  function quiet(warn, event, fields) {
91
112
  try {
92
113
  warn?.(event, fields);
@@ -224,63 +245,87 @@ export function planWorkflowParkedDecide(origin, req) {
224
245
  },
225
246
  };
226
247
  }
227
- const verdict = req.decision === "approve" ? "APPROVED" : "DENIED";
228
248
  return {
229
249
  ok: true,
230
250
  hostSessionId,
231
251
  runId: origin.runId,
232
252
  outcome: buildParkedResumeOutcome(req),
233
- message: {
234
- text: `The human approval that workflow run "${origin.runId}" parked on (agent callKey "${origin.park.callKey}") has been ${verdict}. ` +
235
- `Resume that run now: re-invoke Workflow with the SAME script source you launched it from (script / name / scriptPath) ` +
236
- `AND resumeFromRunId: "${origin.runId}" — the decision is already held by the deployment and will be applied to the parked ` +
237
- `agent; completed steps replay from the journal. Do not re-issue the original call.`,
238
- trusted: true,
239
- },
253
+ message: workflowParkGuidance(origin.runId, origin.park.callKey, req.decision),
240
254
  };
241
255
  }
256
+ export function workflowParkGuidance(runId, callKey, decision) {
257
+ const verdict = decision === "approve" ? "APPROVED" : "DENIED";
258
+ return {
259
+ text: `The human approval that workflow run "${runId}" parked on (agent callKey "${callKey}") has been ${verdict}. ` +
260
+ `Resume that run now: re-invoke Workflow with the SAME script source you launched it from (script / name / scriptPath) ` +
261
+ `AND resumeFromRunId: "${runId}" — the decision is already held by the deployment and will be applied to the parked ` +
262
+ `agent; completed steps replay from the journal. Do not re-issue the original call.`,
263
+ trusted: true,
264
+ };
265
+ }
266
+ export function redeemHere(runId, scope, d) {
267
+ return redeemWorkflowParks(runId, scope, [{ token: d.token, outcome: d.outcome }]);
268
+ }
242
269
  function parkedChildResumedReceipt(taskId, decision, evidence) {
243
270
  return { status: 200, body: { taskId, status: "resuming", decision, ...evidence } };
244
271
  }
245
- const LIVE_REDEEM_RECEIPTS = new Map();
246
- async function runChannelEnded(runId, scope) {
247
- const channel = subscribeWorkflow(runId, scope)[Symbol.asyncIterator]();
248
- while (!(await channel.next()).done) {
249
- }
250
- }
251
- function holdLiveReceipt(run, token, fingerprint, answer) {
252
- let byToken = LIVE_REDEEM_RECEIPTS.get(run.id);
253
- if (byToken === undefined) {
254
- byToken = new Map();
255
- LIVE_REDEEM_RECEIPTS.set(run.id, byToken);
256
- const book = byToken;
257
- const drop = () => {
258
- if (LIVE_REDEEM_RECEIPTS.get(run.id) === book)
259
- LIVE_REDEEM_RECEIPTS.delete(run.id);
260
- };
261
- void run.ended().then(drop, (err) => {
262
- recordFailOpen("server.workflow-live-receipt.channel-unreadable", `runId=${run.id} err=${err instanceof Error ? err.message : String(err)}`);
263
- drop();
264
- });
272
+ export function answerOfHolderFence(verdict, runId) {
273
+ switch (verdict) {
274
+ case "not_held":
275
+ return { status: 409, body: refusalBody({ errorCode: "decide.gate_moved", message: "the approval gate moved under this decide (re-parked or already settled) — re-check the pending list", facts: { runId } }) };
276
+ case "restated":
277
+ return {
278
+ status: 400,
279
+ body: refusalBody({
280
+ errorCode: "decide.parked_restatement_unsupported",
281
+ message: "mcpServers / a2aPeers cannot be applied: the run this approval belongs to is still running, and its waiting step continues with the MCP / A2A tables the run already has — re-issue the decide without them to continue it that way",
282
+ facts: { runId },
283
+ }),
284
+ };
285
+ case "other_decision":
286
+ return {
287
+ status: 409,
288
+ body: refusalBody({
289
+ errorCode: "decide.claim_lost",
290
+ message: "another decision for this approval was already handed to the run that is waiting on it and is being applied — re-check the pending list",
291
+ facts: { runId },
292
+ }),
293
+ };
294
+ default: {
295
+ const unhandled = verdict;
296
+ throw new Error(`unhandled workflow holder fence verdict: ${String(unhandled)}`);
297
+ }
265
298
  }
266
- byToken.set(token, { fingerprint, answer });
267
299
  }
268
- const copyOf = (r) => ({ status: r.status, body: { ...r.body } });
269
- export async function deliverToHoldingRun(origin, d) {
270
- const entry = d.restated ? { token: d.token } : { token: d.token, outcome: d.outcome };
271
- const scope = origin.run.scope;
272
- return answerOfParkDelivery(await redeemWorkflowParks(origin.runId, scope, [entry]), { id: origin.runId, ended: () => runChannelEnded(origin.runId, scope) }, d);
300
+ export function holderFenceFaultAnswer(runId) {
301
+ return { status: 503, body: refusalBody({ errorCode: "decide.store_unreachable", message: "the state of this approval could not be read just now, so the run waiting on it kept waiting and nothing was decided — retry", facts: { runId } }) };
273
302
  }
274
- export async function answerOfParkDelivery(delivery, run, d) {
275
- const runId = run.id;
303
+ export function answerOfHolderRedeem(delivery, runId, decision) {
304
+ const receipt = () => parkedChildResumedReceipt(runId, decision, NO_SETTLEMENT_EVIDENCE);
276
305
  switch (delivery.kind) {
277
- case "live":
278
- return { kind: "answered", answer: answerOfLiveResult(delivery.results[0], run, d) };
306
+ case "live": {
307
+ const word = delivery.results[0];
308
+ if (word === undefined)
309
+ throw new Error(`workflow run ${runId} answered a live delivery without a result for the one decision it was handed`);
310
+ switch (word) {
311
+ case "driving":
312
+ case "already_taken":
313
+ case "not_parked_here":
314
+ case "unreadable":
315
+ return receipt();
316
+ case "settled":
317
+ return answerOfHolderFence("not_held", runId);
318
+ case "kept_parked":
319
+ throw new Error(`workflow run ${runId} kept a parked call that was handed a decision — the engine keeps a park only on an acknowledgement`);
320
+ default: {
321
+ const unhandled = word;
322
+ throw new Error(`unhandled workflow park delivery result: ${String(unhandled)}`);
323
+ }
324
+ }
325
+ }
279
326
  case "suspending":
280
- await delivery.ended;
281
- return { kind: "resume_lane" };
282
327
  case "not_active":
283
- return { kind: "resume_lane" };
328
+ return receipt();
284
329
  case "not_armed":
285
330
  throw new Error(`workflow run ${runId} answered not_armed to a decision for a card it holds — a run without a checkpoint seat cannot have parked one; refusing to guess where the decision goes`);
286
331
  default: {
@@ -289,53 +334,44 @@ export async function answerOfParkDelivery(delivery, run, d) {
289
334
  }
290
335
  }
291
336
  }
292
- function answerOfLiveResult(word, run, d) {
293
- const runId = run.id;
294
- if (word === undefined)
295
- throw new Error(`workflow run ${runId} answered a live delivery without a result for the one decision it was handed`);
296
- switch (word) {
297
- case "driving": {
298
- if (d.restated)
299
- throw new Error(`workflow run ${runId} drove a parked call on an acknowledgement — an acknowledgement never authorizes a drive`);
300
- const answer = parkedChildResumedReceipt(runId, d.decision, NO_SETTLEMENT_EVIDENCE);
301
- holdLiveReceipt(run, d.token, d.fingerprint, answer);
302
- return copyOf(answer);
303
- }
304
- case "already_taken": {
305
- const held = LIVE_REDEEM_RECEIPTS.get(runId)?.get(d.token);
306
- if (held !== undefined && held.fingerprint === d.fingerprint)
307
- return copyOf(held.answer);
308
- return {
309
- status: 409,
310
- body: refusalBody({
311
- errorCode: "decide.claim_lost",
312
- message: "another decision for this approval was already handed to the run that is waiting on it and is being applied — re-check the pending list",
313
- facts: { runId },
314
- }),
315
- };
337
+ export function holderPullDisposition(delivery, runId) {
338
+ switch (delivery.kind) {
339
+ case "live": {
340
+ const word = delivery.results[0];
341
+ if (word === undefined)
342
+ throw new Error(`workflow run ${runId} answered a live delivery without a result for the one decision it was handed`);
343
+ switch (word) {
344
+ case "driving":
345
+ case "already_taken":
346
+ case "settled":
347
+ return "delivered";
348
+ case "not_parked_here":
349
+ case "unreadable":
350
+ return "next_beat";
351
+ case "kept_parked":
352
+ throw new Error(`workflow run ${runId} kept a parked call that was handed a decision — the engine keeps a park only on an acknowledgement`);
353
+ default: {
354
+ const unhandled = word;
355
+ throw new Error(`unhandled workflow park delivery result: ${String(unhandled)}`);
356
+ }
357
+ }
316
358
  }
317
- case "settled":
318
- case "not_parked_here":
319
- return { status: 409, body: refusalBody({ errorCode: "decide.gate_moved", message: "the approval gate moved under this decide (re-parked or already settled) — re-check the pending list", facts: { runId } }) };
320
- case "unreadable":
321
- return { status: 503, body: refusalBody({ errorCode: "decide.store_unreachable", message: "the state of this approval could not be read just now, so the run waiting on it kept waiting and nothing was decided — retry", facts: { runId } }) };
322
- case "kept_parked":
323
- if (!d.restated)
324
- throw new Error(`workflow run ${runId} kept a parked call that was handed a decision — the engine keeps a park only on an acknowledgement`);
325
- return {
326
- status: 400,
327
- body: refusalBody({
328
- errorCode: "decide.parked_restatement_unsupported",
329
- message: "mcpServers / a2aPeers cannot be applied: the run this approval belongs to is still running, and its waiting step continues with the MCP / A2A tables the run already has — re-issue the decide without them to continue it that way",
330
- facts: { runId },
331
- }),
332
- };
359
+ case "suspending":
360
+ case "not_active":
361
+ return "left";
362
+ case "not_armed":
363
+ throw new Error(`workflow run ${runId} answered not_armed to a decision for a card it holds — a run without a checkpoint seat cannot have parked one`);
333
364
  default: {
334
- const unhandled = word;
335
- throw new Error(`unhandled workflow park delivery result: ${String(unhandled)}`);
365
+ const unhandled = delivery;
366
+ throw new Error(`unhandled workflow park delivery: ${JSON.stringify(unhandled)}`);
336
367
  }
337
368
  }
338
369
  }
370
+ export async function runChannelEnded(runId, scope) {
371
+ const channel = subscribeWorkflow(runId, scope)[Symbol.asyncIterator]();
372
+ while (!(await channel.next()).done) {
373
+ }
374
+ }
339
375
  function sessionGone(taskId) {
340
376
  return {
341
377
  status: 409,
@@ -37,8 +37,8 @@
37
37
  *
38
38
  * ## scope 轴
39
39
  *
40
- * core 递进来的 `access.scope` = `taskScope` = `internals?.registryScope ?? spec.principal ?? "default"`
41
- * (core `prepare-task.js`)× server `resolve-spec.ts:701 principal: auth?.principal` ⇒ **裸 principal 串**,
40
+ * core 递进来的 `access.scope` = 引擎的任务 scope(core 写侧规则与本仓的唯一换算见 `engine-identity.ts` 的 `engineScopeOf` 头注)
41
+ * × 落点 `taskSpecIdentityOf` 只写人 ⇒ **裸 principal 串**,
42
42
  * 无 principal 的部署上是字面量 `"default"`,而同一情形下 `session_meta.owner` 是 SQL NULL ——
43
43
  * 这正是窄互认臂(`LEGACY_UNOWNED_AMNESTY_TENANT === "default"`)要接住的那一格,不必另铸编解码。
44
44
  *
@@ -11,8 +11,8 @@
11
11
  * receipt / 投递 / 到期计时都是 core 绑在队列上的 sink(引擎在 run 的 drain 里自己 `configure`,宿主**不**接 sink —— 接了就是第二个写者)。
12
12
  * 本面只做两件事:把队列里等人审的卡(见下「只有人能答的卡」)投成 `pending[]` 的 `peer_inbound` 行;把决断口的 approve / deny 原样交给 `settle`。
13
13
  * 没有行店、没有落账:一张卡在不在、谁赢了 CAS、结局是什么,全是 core 的读数。
14
- * · **属主 = 收信方**:列与决都只在调用方**自己**的信箱 scope 里找队列(`peerHeldQueueIfAny(调用方 scope, …)`;scope 读法与 core 的
15
- * `taskScope = spec.principal ?? "default"` 同一条,见 {@link peerBoxScope})—— 别人的卡结构上取不到,决断口答的 404 与「没有这张卡」同码同文。
14
+ * · **属主 = 收信方**:列与决都只在调用方**自己**的信箱 scope 里找队列(`peerHeldQueueIfAny(调用方 scope, …)`;core 按收信 run 的任务 scope 开队列,
15
+ * 调用方那一格只经唯一换算 `engine-identity.ts` 的 `engineScopeOfOwner` 读,路由在调用点换好再交进来)—— 别人的卡结构上取不到,决断口答的 404 与「没有这张卡」同码同文。
16
16
  * 显式 operator **没有**额外射程:一封信是收信人的,不是运维治理面(与停驻门「operator 可决任意行」刻意不同,决断口按族分臂)。
17
17
  * · **只有人能答的卡才进审批席**(core `PEER_HELD_REVIEW_CAUSES`:`mode-mismatch` / `no-mode-asserted` / `invalid-mode-attestation` —— 权限档
18
18
  * 对等判扣下的信;CC 只对这几个成因开审阅框与到期计时,cli309.js:36111–36116 的句子逐条:`managed-setting` / `repo-setting` / `explicit-setting`
@@ -41,10 +41,6 @@
41
41
  */
42
42
  import { type PeerHeldEntry, type PeerHeldSettleOutcome } from "@sema-agent/core";
43
43
  import { type PeerInboundLane } from "./org-delivery-gate.js";
44
- /**
45
- * 调用方 principal 的信箱 scope —— core 写侧 `taskScope = spec.principal ?? "default"` 的同一条读法(无主 ⇒ `"default"`)。列 / 决都按它找队列。
46
- */
47
- export declare function peerBoxScope(principal: string | null | undefined): string;
48
44
  /** 决断口 id 的坐标(id 是它的唯一拼法,见 {@link peerInboundIdOf})。 */
49
45
  export interface PeerInboundCoord {
50
46
  readonly sessionId: string;
@@ -3,9 +3,6 @@ import { PEER_INBOUND_LANES, boxOfLane, laneOfBox } from "./org-delivery-gate.js
3
3
  import { PEER_INBOUND_ID_PREFIX } from "./approval-queue-kind.js";
4
4
  import { recordFailOpen } from "./observability/fail-open.js";
5
5
  import { seatText } from "./trace/exit-seat.js";
6
- export function peerBoxScope(principal) {
7
- return principal ?? "default";
8
- }
9
6
  export function peerInboundIdOf(c) {
10
7
  return `${PEER_INBOUND_ID_PREFIX}${c.sessionId}:${c.lane}:${c.seq}`;
11
8
  }