@sema-agent/server 7.149.0 → 7.151.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 (441) hide show
  1. package/MIGRATION.md +307 -9
  2. package/README.md +1 -1
  3. package/README.zh-CN.md +1 -1
  4. package/USAGE.md +92 -40
  5. package/deploy/sema-up/README.md +7 -1
  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 +1 -0
  14. package/deploy/sema-up/kube-up.sh +1 -1
  15. package/deploy/sema-up/lib/flagshape.sh +1 -1
  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/dist/adoption/import.js +3 -3
  19. package/dist/approval-ask-machine.d.ts +1 -1
  20. package/dist/approval-card.d.ts +3 -3
  21. package/dist/approval-gate-currency.d.ts +2 -2
  22. package/dist/audit.d.ts +1 -1
  23. package/dist/audit.js +2 -2
  24. package/dist/auth-bridge.d.ts +20 -0
  25. package/dist/auth-bridge.js +9 -0
  26. package/dist/background-session-reap.d.ts +2 -2
  27. package/dist/bake-runner/main.d.ts +4 -2
  28. package/dist/bind-host.d.ts +2 -3
  29. package/dist/bind-host.js +2 -4
  30. package/dist/boot/budget-tracing.js +1 -1
  31. package/dist/boot/deferred-sandbox-path-env.d.ts +5 -3
  32. package/dist/boot/deferred-sandbox-path-env.js +1 -2
  33. package/dist/boot/engine-lease.d.ts +5 -0
  34. package/dist/boot/engine-lease.js +1 -0
  35. package/dist/boot/execution-env.d.ts +8 -14
  36. package/dist/boot/execution-env.js +54 -17
  37. package/dist/boot/execution-lane.js +32 -5
  38. package/dist/boot/late-binds.d.ts +8 -4
  39. package/dist/boot/late-binds.js +7 -1
  40. package/dist/boot/memory-consolidation.d.ts +3 -2
  41. package/dist/boot/memory-consolidation.js +6 -6
  42. package/dist/boot/parked-revive-gate.d.ts +5 -5
  43. package/dist/boot/parked-revive-gate.js +2 -3
  44. package/dist/boot/reapers.d.ts +5 -0
  45. package/dist/boot/reapers.js +12 -1
  46. package/dist/boot/resolve-spec.d.ts +7 -8
  47. package/dist/boot/resolve-spec.js +80 -35
  48. package/dist/boot/retention-lane.d.ts +1 -1
  49. package/dist/boot/runner-deps.d.ts +9 -2
  50. package/dist/boot/runner-deps.js +3 -3
  51. package/dist/boot/session-age-out.d.ts +36 -0
  52. package/dist/boot/session-age-out.js +101 -0
  53. package/dist/boot/session-faces.d.ts +5 -14
  54. package/dist/boot/session-faces.js +28 -24
  55. package/dist/boot/stage-01-config.js +2 -0
  56. package/dist/boot/stage-03-store-backend.js +2 -2
  57. package/dist/boot/stage-05-execution-env.d.ts +5 -3
  58. package/dist/boot/stage-05-execution-env.js +2 -2
  59. package/dist/boot/stage-06-runners.d.ts +7 -4
  60. package/dist/boot/stage-06-runners.js +16 -8
  61. package/dist/boot/stage-07-capability-layer.d.ts +7 -4
  62. package/dist/boot/stage-07-capability-layer.js +3 -2
  63. package/dist/boot/stage-08-reapers.d.ts +7 -4
  64. package/dist/boot/stage-08-reapers.js +4 -2
  65. package/dist/boot/stage-09-leader.d.ts +11 -5
  66. package/dist/boot/stage-09-leader.js +12 -3
  67. package/dist/boot/stage-10-http-server.d.ts +44 -6
  68. package/dist/boot/stage-10-http-server.js +12 -10
  69. package/dist/boot/web-admin.d.ts +1 -1
  70. package/dist/boot/web-admin.js +3 -1
  71. package/dist/boot/workflow-orchestration.d.ts +7 -2
  72. package/dist/boot/workflow-orchestration.js +24 -7
  73. package/dist/bounded-rotation.d.ts +29 -0
  74. package/dist/bounded-rotation.js +24 -0
  75. package/dist/capability-facts.d.ts +84 -66
  76. package/dist/capability-facts.js +58 -41
  77. package/dist/center-credential.d.ts +25 -6
  78. package/dist/center-credential.js +25 -5
  79. package/dist/config-catalog.d.ts +26 -7
  80. package/dist/config-catalog.js +15 -12
  81. package/dist/config-invariants.d.ts +2 -1
  82. package/dist/config-invariants.js +4 -4
  83. package/dist/config-types.d.ts +22 -15
  84. package/dist/config.d.ts +51 -2
  85. package/dist/config.js +35 -24
  86. package/dist/deployment-governance.d.ts +7 -28
  87. package/dist/deployment-governance.js +1 -14
  88. package/dist/deployment-shape.d.ts +9 -1
  89. package/dist/deployment-shape.js +2 -1
  90. package/dist/device-protocol.d.ts +5 -4
  91. package/dist/device-protocol.js +1 -1
  92. package/dist/device-ws-hub.d.ts +1 -0
  93. package/dist/device-ws-hub.js +66 -29
  94. package/dist/device-ws-protocol.d.ts +79 -12
  95. package/dist/device-ws-protocol.js +64 -26
  96. package/dist/engine-identity.d.ts +23 -5
  97. package/dist/engine-identity.js +13 -0
  98. package/dist/entry-mode-clamp-notice.d.ts +2 -1
  99. package/dist/execution-env-refusal.d.ts +23 -0
  100. package/dist/execution-env-refusal.js +5 -0
  101. package/dist/execution-lane-caps.d.ts +3 -1
  102. package/dist/field-conflict.d.ts +3 -3
  103. package/dist/file-history-capture.d.ts +11 -4
  104. package/dist/file-history-capture.js +9 -6
  105. package/dist/file-history-disclosure.d.ts +7 -5
  106. package/dist/file-history-disclosure.js +7 -5
  107. package/dist/fleet/drain-entry.d.ts +4 -0
  108. package/dist/fleet/engine-signal.d.ts +14 -1
  109. package/dist/fleet/engine-signal.js +5 -1
  110. package/dist/fleet/fleet-reconciler.d.ts +1 -1
  111. package/dist/fleet/serving-lease.d.ts +18 -3
  112. package/dist/fleet/serving-lease.js +81 -35
  113. package/dist/fleet-client.d.ts +13 -11
  114. package/dist/fleet-client.js +53 -33
  115. package/dist/history-anchor.js +1 -1
  116. package/dist/hitl-delivery.d.ts +1 -3
  117. package/dist/hitl-delivery.js +1 -1
  118. package/dist/hooks/hook-runner.js +2 -2
  119. package/dist/host-lsp-manager.d.ts +2 -2
  120. package/dist/http/active-run-conflict.d.ts +3 -7
  121. package/dist/http/active-run-conflict.js +2 -2
  122. package/dist/http/admission.js +19 -4
  123. package/dist/http/approval-sweeps.js +7 -6
  124. package/dist/http/caller-trust.d.ts +2 -2
  125. package/dist/http/caller-trust.js +3 -3
  126. package/dist/http/checkpoint-ctx.d.ts +20 -63
  127. package/dist/http/checkpoint-ctx.js +2 -24
  128. package/dist/http/claim-heartbeat.d.ts +4 -4
  129. package/dist/http/claim-heartbeat.js +3 -3
  130. package/dist/http/dispatch.d.ts +2 -1
  131. package/dist/http/dispatch.js +36 -29
  132. package/dist/http/durable-run-leg.js +17 -17
  133. package/dist/http/health-self-report.d.ts +9 -1
  134. package/dist/http/health-self-report.js +2 -0
  135. package/dist/http/owner-access.d.ts +264 -20
  136. package/dist/http/owner-access.js +215 -5
  137. package/dist/http/readiness.d.ts +4 -2
  138. package/dist/http/resume-ctx-read.js +38 -1
  139. package/dist/http/resume-legs.d.ts +2 -1
  140. package/dist/http/resume-legs.js +273 -89
  141. package/dist/http/route-ctx.d.ts +41 -19
  142. package/dist/http/route-table.d.ts +1 -1
  143. package/dist/http/routes/a2a-serve.js +15 -14
  144. package/dist/http/routes/admin-memory-optout.d.ts +1 -1
  145. package/dist/http/routes/agents-roster.js +2 -3
  146. package/dist/http/routes/approvals-assistant.d.ts +3 -2
  147. package/dist/http/routes/approvals-assistant.js +12 -12
  148. package/dist/http/routes/background.d.ts +3 -3
  149. package/dist/http/routes/capabilities.js +10 -6
  150. package/dist/http/routes/config-catalog.d.ts +1 -1
  151. package/dist/http/routes/fleet.js +10 -8
  152. package/dist/http/routes/mcp-reconnect.js +2 -2
  153. package/dist/http/routes/memory-origin.d.ts +1 -1
  154. package/dist/http/routes/notify-wake.js +2 -3
  155. package/dist/http/routes/projects.d.ts +4 -2
  156. package/dist/http/routes/projects.js +7 -6
  157. package/dist/http/routes/retention-ops.d.ts +1 -1
  158. package/dist/http/routes/run-permission-mode.d.ts +1 -1
  159. package/dist/http/routes/run-permission-mode.js +2 -2
  160. package/dist/http/routes/runs.d.ts +1 -1
  161. package/dist/http/routes/runs.js +125 -66
  162. package/dist/http/routes/session-memory-sync.js +4 -5
  163. package/dist/http/routes/session-sync.d.ts +4 -3
  164. package/dist/http/routes/session-sync.js +174 -83
  165. package/dist/http/routes/sessions-list.js +13 -7
  166. package/dist/http/routes/sessions.d.ts +1 -1
  167. package/dist/http/routes/sessions.js +26 -48
  168. package/dist/http/routes/tasks.js +38 -23
  169. package/dist/http/routes/trace-usage.js +14 -14
  170. package/dist/http/routes/workflows.d.ts +1 -0
  171. package/dist/http/routes/workflows.js +20 -38
  172. package/dist/http/server.d.ts +28 -30
  173. package/dist/http/server.js +7 -3
  174. package/dist/http/stored-body-replay.d.ts +3 -24
  175. package/dist/http/stored-body-replay.js +2 -12
  176. package/dist/http/submit-ctx.d.ts +1 -2
  177. package/dist/http/submit-ctx.js +8 -6
  178. package/dist/http/submit-replay.d.ts +15 -2
  179. package/dist/http/submit-replay.js +10 -4
  180. package/dist/http/wire-types.d.ts +19 -6
  181. package/dist/identity-source.d.ts +20 -3
  182. package/dist/identity-source.js +14 -0
  183. package/dist/index.d.ts +4 -0
  184. package/dist/lane-home-probe.d.ts +3 -7
  185. package/dist/lane-home-probe.js +0 -1
  186. package/dist/leader/endpoint.js +9 -8
  187. package/dist/leader/leader.d.ts +2 -1
  188. package/dist/leg-facts.d.ts +19 -5
  189. package/dist/leg-facts.js +3 -1
  190. package/dist/mcp-authorization-face.d.ts +18 -14
  191. package/dist/mcp-authorization-face.js +3 -2
  192. package/dist/memory-scope.d.ts +5 -4
  193. package/dist/memory-scope.js +4 -4
  194. package/dist/memory-store-refusal.d.ts +1 -1
  195. package/dist/memory-sync-client.d.ts +30 -2
  196. package/dist/memory-sync-client.js +16 -9
  197. package/dist/observability/corrupt-read-seat.d.ts +1 -1
  198. package/dist/observability/err-text.d.ts +7 -0
  199. package/dist/observability/err-text.js +5 -0
  200. package/dist/observability/fail-open.d.ts +12 -8
  201. package/dist/observability/fail-open.js +12 -8
  202. package/dist/observability/logger.d.ts +7 -0
  203. package/dist/observability/logger.js +3 -1
  204. package/dist/observability/metrics.js +1 -0
  205. package/dist/observability/run-terminal.d.ts +1 -1
  206. package/dist/orchestration/workflow-notify-journal.d.ts +18 -1
  207. package/dist/orchestration/workflow-notify-journal.js +12 -1
  208. package/dist/orchestration/workflow-park-decision.d.ts +70 -18
  209. package/dist/orchestration/workflow-park-decision.js +49 -10
  210. package/dist/orchestration/workflow-park-holder.d.ts +65 -0
  211. package/dist/orchestration/workflow-park-holder.js +98 -0
  212. package/dist/orchestration/workflow-record-fence.d.ts +36 -0
  213. package/dist/orchestration/workflow-record-fence.js +42 -0
  214. package/dist/owner-faces.d.ts +28 -4
  215. package/dist/owner-faces.js +2 -0
  216. package/dist/parked-decide.d.ts +104 -53
  217. package/dist/parked-decide.js +153 -117
  218. package/dist/peer-directory.d.ts +2 -2
  219. package/dist/peer-inbound-face.d.ts +2 -6
  220. package/dist/peer-inbound-face.js +0 -3
  221. package/dist/peer-seat.d.ts +1 -1
  222. package/dist/peer-seat.js +52 -59
  223. package/dist/permission-mode-admission.d.ts +41 -5
  224. package/dist/permission-mode-admission.js +29 -3
  225. package/dist/plugins/adoption-log-sql.d.ts +3 -1
  226. package/dist/plugins/adoption-log-sql.js +7 -1
  227. package/dist/plugins/approval-ask-store-file.d.ts +10 -2
  228. package/dist/plugins/approval-ask-store-file.js +8 -0
  229. package/dist/plugins/approval-ask-store-memory.d.ts +6 -1
  230. package/dist/plugins/approval-ask-store-memory.js +28 -9
  231. package/dist/plugins/approval-ask-store-sql.d.ts +43 -2
  232. package/dist/plugins/approval-ask-store-sql.js +34 -5
  233. package/dist/plugins/approval-exemption-store.js +3 -0
  234. package/dist/plugins/approval-nonce-store.js +2 -0
  235. package/dist/plugins/breaker-state-sql.js +2 -0
  236. package/dist/plugins/caching-session-store.d.ts +9 -15
  237. package/dist/plugins/caching-session-store.js +6 -0
  238. package/dist/plugins/device-store-sql.js +6 -0
  239. package/dist/plugins/error-origin.d.ts +18 -0
  240. package/dist/plugins/error-origin.js +10 -0
  241. package/dist/plugins/exec-path-law.d.ts +34 -0
  242. package/dist/plugins/exec-path-law.js +13 -0
  243. package/dist/plugins/execution-placement-sql.js +6 -6
  244. package/dist/plugins/file-run-store.js +1 -1
  245. package/dist/plugins/image-bake-store-sql.js +6 -0
  246. package/dist/plugins/image-index-sql.js +4 -0
  247. package/dist/plugins/landed-attendants.d.ts +212 -0
  248. package/dist/plugins/landed-attendants.js +161 -0
  249. package/dist/plugins/leader-run-store-sql.js +4 -0
  250. package/dist/plugins/local-checkpoint-store.d.ts +4 -1
  251. package/dist/plugins/local-checkpoint-store.js +3 -0
  252. package/dist/plugins/local-session-live-reference.d.ts +40 -0
  253. package/dist/plugins/local-session-live-reference.js +39 -0
  254. package/dist/plugins/local-session-store.d.ts +71 -33
  255. package/dist/plugins/local-session-store.js +129 -27
  256. package/dist/plugins/memory-engine-pg.js +4 -0
  257. package/dist/plugins/memory-engine-sql-apply.js +5 -2
  258. package/dist/plugins/memory-engine-tidb.js +4 -0
  259. package/dist/plugins/memory-optout-grant-store-sql.js +4 -0
  260. package/dist/plugins/memory-run-store.js +1 -1
  261. package/dist/plugins/memory-sync-store-pg.js +5 -0
  262. package/dist/plugins/memory-sync-store-tidb.js +5 -0
  263. package/dist/plugins/one-time-migrations.d.ts +80 -61
  264. package/dist/plugins/one-time-migrations.js +241 -104
  265. package/dist/plugins/org-delivery-quota-store.js +4 -1
  266. package/dist/plugins/outcome-ledger-sql.js +2 -0
  267. package/dist/plugins/permission-rule-store-sql.js +11 -4
  268. package/dist/plugins/pg-cost-quota.js +4 -0
  269. package/dist/plugins/pg-pool.js +28 -1
  270. package/dist/plugins/pg-rate-limiter.js +2 -0
  271. package/dist/plugins/posix-shell-fs.d.ts +6 -1
  272. package/dist/plugins/posix-shell-fs.js +8 -3
  273. package/dist/plugins/remote-env-adb.d.ts +19 -15
  274. package/dist/plugins/remote-env-adb.js +44 -17
  275. package/dist/plugins/remote-env-connect-seat.d.ts +105 -0
  276. package/dist/plugins/remote-env-connect-seat.js +72 -0
  277. package/dist/plugins/remote-env-device.d.ts +22 -5
  278. package/dist/plugins/remote-env-device.js +114 -14
  279. package/dist/plugins/remote-env-e2b.d.ts +18 -7
  280. package/dist/plugins/remote-env-e2b.js +53 -40
  281. package/dist/plugins/remote-env-file-error.js +6 -2
  282. package/dist/plugins/remote-env-host.d.ts +18 -1
  283. package/dist/plugins/remote-env-host.js +48 -47
  284. package/dist/plugins/remote-env-k8s.d.ts +41 -39
  285. package/dist/plugins/remote-env-k8s.js +56 -32
  286. package/dist/plugins/remote-env-local-docker.d.ts +13 -8
  287. package/dist/plugins/remote-env-local-docker.js +37 -43
  288. package/dist/plugins/remote-env-ssh.d.ts +18 -12
  289. package/dist/plugins/remote-env-ssh.js +64 -62
  290. package/dist/plugins/remote-shell.d.ts +101 -2
  291. package/dist/plugins/remote-shell.js +221 -3
  292. package/dist/plugins/replica-registration.d.ts +35 -0
  293. package/dist/plugins/replica-registration.js +48 -0
  294. package/dist/plugins/resume-anchor-store-sql.d.ts +11 -2
  295. package/dist/plugins/resume-anchor-store-sql.js +12 -5
  296. package/dist/plugins/retention-lane-store-sql.d.ts +1 -1
  297. package/dist/plugins/retention-lane-store-sql.js +4 -0
  298. package/dist/plugins/retention-sql.d.ts +20 -2
  299. package/dist/plugins/retention-sql.js +11 -0
  300. package/dist/plugins/run-store-sql.d.ts +22 -3
  301. package/dist/plugins/run-store-sql.js +33 -9
  302. package/dist/plugins/scenario-prefix-switch-m42.d.ts +6 -12
  303. package/dist/plugins/scenario-prefix-switch-m42.js +7 -5
  304. package/dist/plugins/schema-consistency.d.ts +9 -5
  305. package/dist/plugins/schema-consistency.js +48 -18
  306. package/dist/plugins/schema-drift-sentence.js +1 -1
  307. package/dist/plugins/send-file-ledger.js +3 -0
  308. package/dist/plugins/serving-requirement.d.ts +68 -0
  309. package/dist/plugins/serving-requirement.js +60 -0
  310. package/dist/plugins/session-birth.d.ts +6 -2
  311. package/dist/plugins/session-capture-record-store-sql.js +2 -0
  312. package/dist/plugins/session-ext-table.d.ts +14 -1
  313. package/dist/plugins/session-ext-table.js +5 -1
  314. package/dist/plugins/session-row-sql.d.ts +49 -2
  315. package/dist/plugins/session-row-sql.js +56 -13
  316. package/dist/plugins/session-store-sql.d.ts +34 -18
  317. package/dist/plugins/session-store-sql.js +98 -17
  318. package/dist/plugins/shared-memory-store-sql.d.ts +1 -0
  319. package/dist/plugins/shared-memory-store-sql.js +6 -2
  320. package/dist/plugins/sql-driver.d.ts +2 -1
  321. package/dist/plugins/sql-driver.js +18 -3
  322. package/dist/plugins/sql-errors.d.ts +11 -6
  323. package/dist/plugins/sql-errors.js +5 -6
  324. package/dist/plugins/stop-then-start-sentence.d.ts +48 -3
  325. package/dist/plugins/stop-then-start-sentence.js +48 -0
  326. package/dist/plugins/stop-then-start.d.ts +109 -0
  327. package/dist/plugins/stop-then-start.js +104 -0
  328. package/dist/plugins/store-backend.d.ts +40 -13
  329. package/dist/plugins/store-backend.js +169 -27
  330. package/dist/plugins/store-boundary.d.ts +57 -0
  331. package/dist/plugins/store-boundary.js +139 -0
  332. package/dist/plugins/store-contracts.d.ts +29 -2
  333. package/dist/plugins/store-contracts.js +3 -0
  334. package/dist/plugins/store-fault-sentence-m53.d.ts +7 -0
  335. package/dist/plugins/store-fault-sentence-m53.js +25 -0
  336. package/dist/plugins/store-fault.d.ts +26 -7
  337. package/dist/plugins/store-fault.js +18 -2
  338. package/dist/plugins/task-attachment-store.js +9 -0
  339. package/dist/plugins/task-list-store-sql.d.ts +2 -2
  340. package/dist/plugins/task-list-store-sql.js +10 -8
  341. package/dist/plugins/tidb-cost-quota.js +4 -0
  342. package/dist/plugins/tidb-pool.js +6 -1
  343. package/dist/plugins/tidb-rate-limiter.js +4 -0
  344. package/dist/plugins/user-input-ledger-sql.js +4 -0
  345. package/dist/plugins/workflow-run-store-sql.d.ts +28 -10
  346. package/dist/plugins/workflow-run-store-sql.js +64 -4
  347. package/dist/plugins/workspace-fill.d.ts +4 -7
  348. package/dist/plugins/workspace-fill.js +2 -1
  349. package/dist/plugins/write-behind-counter.js +5 -0
  350. package/dist/process-instance.d.ts +3 -0
  351. package/dist/process-instance.js +7 -0
  352. package/dist/project-context.d.ts +64 -0
  353. package/dist/project-context.js +66 -0
  354. package/dist/project-registry.d.ts +46 -0
  355. package/dist/project-registry.js +44 -0
  356. package/dist/question.d.ts +9 -21
  357. package/dist/question.js +28 -19
  358. package/dist/request-key-closure.js +1 -1
  359. package/dist/request-value-closure.d.ts +4 -0
  360. package/dist/request-value-closure.js +10 -0
  361. package/dist/run-acceptance.d.ts +3 -2
  362. package/dist/run-acceptance.js +4 -6
  363. package/dist/run-cancel-card.d.ts +1 -1
  364. package/dist/run-cancel-card.js +2 -1
  365. package/dist/run-local.js +1 -0
  366. package/dist/runs.d.ts +37 -8
  367. package/dist/runs.js +53 -12
  368. package/dist/runtime-governance.d.ts +5 -4
  369. package/dist/security.d.ts +31 -33
  370. package/dist/security.js +41 -7
  371. package/dist/server-secret-env.d.ts +12 -10
  372. package/dist/server-secret-env.js +24 -15
  373. package/dist/session-agent.d.ts +1 -10
  374. package/dist/session-agent.js +0 -6
  375. package/dist/session-bindings.d.ts +82 -0
  376. package/dist/session-bindings.js +18 -0
  377. package/dist/session-children-retire.d.ts +2 -2
  378. package/dist/session-children-retire.js +2 -6
  379. package/dist/session-deletion.d.ts +16 -1
  380. package/dist/session-error-wire.d.ts +3 -3
  381. package/dist/session-error-wire.js +3 -3
  382. package/dist/session-incarnation.d.ts +28 -4
  383. package/dist/session-incarnation.js +14 -2
  384. package/dist/session-kind.d.ts +57 -0
  385. package/dist/session-kind.js +22 -0
  386. package/dist/session-notify-door.d.ts +4 -4
  387. package/dist/session-notify-door.js +5 -6
  388. package/dist/session-row.d.ts +21 -1
  389. package/dist/session-row.js +7 -1
  390. package/dist/session-rules-seat.d.ts +4 -3
  391. package/dist/session-rules-seat.js +3 -11
  392. package/dist/session-sync-kernel.d.ts +24 -14
  393. package/dist/session-sync-kernel.js +3 -6
  394. package/dist/session-sync.d.ts +4 -98
  395. package/dist/session-sync.js +4 -74
  396. package/dist/session-titler.d.ts +10 -3
  397. package/dist/session-titler.js +19 -6
  398. package/dist/ssh-host-key.d.ts +5 -0
  399. package/dist/ssh-host-key.js +3 -0
  400. package/dist/stores-sql/checkpoint-store-sql.d.ts +21 -2
  401. package/dist/stores-sql/checkpoint-store-sql.js +106 -18
  402. package/dist/stores-sql/file-history-store-sql.d.ts +52 -2
  403. package/dist/stores-sql/file-history-store-sql.js +108 -70
  404. package/dist/stores-sql/pg-session-storage.d.ts +34 -7
  405. package/dist/stores-sql/pg-session-storage.js +37 -13
  406. package/dist/stores-sql/retention-store-sql.d.ts +2 -10
  407. package/dist/stores-sql/retention-store-sql.js +2 -10
  408. package/dist/stores-sql/session-policy-store-sql.d.ts +30 -7
  409. package/dist/stores-sql/session-policy-store-sql.js +61 -44
  410. package/dist/stores-sql/session-write-hooks.d.ts +11 -0
  411. package/dist/stores-sql/tidb-session-store.d.ts +58 -7
  412. package/dist/stores-sql/tidb-session-store.js +37 -13
  413. package/dist/submission-exit.d.ts +3 -2
  414. package/dist/submission-exit.js +9 -1
  415. package/dist/task-cwd.d.ts +6 -5
  416. package/dist/task-settings.d.ts +19 -5
  417. package/dist/task-settings.js +13 -7
  418. package/dist/terminal.d.ts +33 -2
  419. package/dist/terminal.js +139 -9
  420. package/dist/tool-approval.d.ts +147 -12
  421. package/dist/tool-approval.js +206 -109
  422. package/dist/trace/engine-notice-wire.d.ts +14 -0
  423. package/dist/trace/engine-notice-wire.js +18 -1
  424. package/dist/trace/project.d.ts +4 -3
  425. package/dist/trace/project.js +3 -2
  426. package/dist/trace/projection-table.d.ts +33 -2
  427. package/dist/trace/self-minted-wire.d.ts +422 -26
  428. package/dist/trace/self-minted-wire.js +149 -23
  429. package/dist/trace/tool-card.d.ts +3 -0
  430. package/dist/trace/tool-card.js +24 -0
  431. package/dist/trace/tool-output-media.d.ts +2 -1
  432. package/dist/unattended-permission-mode.d.ts +1 -1
  433. package/dist/web-admin-client/apply-effective.d.ts +1 -1
  434. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  435. package/dist/web-admin-client/skills-mcp.d.ts +1 -1
  436. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +120 -41
  437. package/package.json +3 -3
  438. package/wire-changes/server@7.150.0.json +335 -0
  439. package/wire-changes/server@7.151.0.json +762 -0
  440. package/dist/http/session-inherit-env.d.ts +0 -36
  441. package/dist/http/session-inherit-env.js +0 -6
@@ -0,0 +1,98 @@
1
+ import { boundedRotation } from "../bounded-rotation.js";
2
+ import { recordFailOpen } from "../observability/fail-open.js";
3
+ import { deliverableEntryOf, holderPullDisposition, redeemHere, runChannelEnded } from "../parked-decide.js";
4
+ import { heldParksOf, readRunParks } from "./workflow-agent-session-index.js";
5
+ export class HeldParksHere {
6
+ ended;
7
+ runs = new Map();
8
+ constructor(ended = runChannelEnded) {
9
+ this.ended = ended;
10
+ }
11
+ noteLanded(runId, run) {
12
+ const parks = readRunParks(run);
13
+ if (parks === undefined)
14
+ return;
15
+ const tokens = heldParksOf(runId, parks).map((p) => p.token);
16
+ if (this.runs.has(runId)) {
17
+ this.runs.set(runId, { runId, scope: run.scope, tokens });
18
+ return;
19
+ }
20
+ if (tokens.length === 0)
21
+ return;
22
+ const entry = { runId, scope: run.scope, tokens };
23
+ this.runs.set(runId, entry);
24
+ const drop = () => void this.runs.delete(runId);
25
+ void this.ended(runId, run.scope).then(drop, (err) => {
26
+ recordFailOpen("server.workflow-park-holder.read-failed", `step=channel runId=${runId} err=${err instanceof Error ? err.message : String(err)}`);
27
+ drop();
28
+ });
29
+ }
30
+ candidates() {
31
+ return [...this.runs.values()];
32
+ }
33
+ }
34
+ export const HOLDER_PULL_MAX_PER_TICK = 64;
35
+ export const HOLDER_PULL_BUDGET_MS = 5_000;
36
+ export const HOLDER_PULL_READ_TIMEOUT_MS = 2_000;
37
+ function within(p, ms, what) {
38
+ let timer;
39
+ const timeout = new Promise((_, reject) => {
40
+ timer = setTimeout(() => reject(new Error(`${what} did not answer within ${ms}ms`)), ms);
41
+ timer.unref?.();
42
+ });
43
+ p.catch(() => undefined);
44
+ return Promise.race([p, timeout]).finally(() => clearTimeout(timer));
45
+ }
46
+ export function createWorkflowParkHolderPull(deps) {
47
+ const cursor = { offset: 0 };
48
+ const sources = { checkpointStore: deps.checkpointStore, workflowAgentSessionIndex: deps.workflowAgentSessionIndex, workflowRunStore: deps.workflowRunStore };
49
+ return async () => {
50
+ const items = deps.held.candidates().flatMap((r) => r.tokens.map((token) => ({ runId: r.runId, scope: r.scope, token })));
51
+ let delivered = 0;
52
+ let nextBeat = 0;
53
+ let left = 0;
54
+ const { visited, backlog, truncated } = await boundedRotation([{ items, cursor }], { maxPerTick: HOLDER_PULL_MAX_PER_TICK, budgetMs: HOLDER_PULL_BUDGET_MS }, async ({ runId, scope, token }) => {
55
+ let row;
56
+ try {
57
+ row = await within(deps.decisions.get(token), HOLDER_PULL_READ_TIMEOUT_MS, "workflow park decision read");
58
+ }
59
+ catch (err) {
60
+ recordFailOpen("server.workflow-park-holder.read-failed", `step=decision runId=${runId} err=${err instanceof Error ? err.message : String(err)}`);
61
+ return;
62
+ }
63
+ if (row === null)
64
+ return;
65
+ let deliverable;
66
+ try {
67
+ deliverable = await within(deliverableEntryOf(sources, row), HOLDER_PULL_READ_TIMEOUT_MS, "workflow park card read");
68
+ }
69
+ catch (err) {
70
+ recordFailOpen("server.workflow-park-holder.read-failed", `step=card runId=${runId} err=${err instanceof Error ? err.message : String(err)}`);
71
+ return;
72
+ }
73
+ if (deliverable.kind !== "deliverable" || deliverable.entry.runId !== runId)
74
+ return;
75
+ const disposition = holderPullDisposition(await redeemHere(runId, scope, { token, outcome: row.outcome }), runId);
76
+ switch (disposition) {
77
+ case "delivered":
78
+ delivered++;
79
+ return;
80
+ case "next_beat":
81
+ nextBeat++;
82
+ return;
83
+ case "left":
84
+ left++;
85
+ return;
86
+ default: {
87
+ const unhandled = disposition;
88
+ throw new Error(`unhandled holder pull disposition: ${String(unhandled)}`);
89
+ }
90
+ }
91
+ }, deps.now);
92
+ if (truncated) {
93
+ deps.warn?.("workflow_park_holder_pull_truncated", { polled: visited, delivered, backlog, maxPerTick: HOLDER_PULL_MAX_PER_TICK, budgetMs: HOLDER_PULL_BUDGET_MS, resumeFromOffset: cursor.offset });
94
+ }
95
+ return { polled: visited, delivered, nextBeat, left, backlog, truncated };
96
+ };
97
+ }
98
+ //# sourceMappingURL=workflow-park-holder.js.map
@@ -0,0 +1,36 @@
1
+ /**
2
+ * **workflow 记录的进程内记录栅栏**(local 后端:File / InMemory 记录店;SQL 孪生是 `SqlWorkflowRunStore.whileRunning` 的行锁事务)。
3
+ *
4
+ * ## 为什么在基店外包一层
5
+ * 持有一张停驻卡的 run 仍读作 `running` 时,决定行落在「这条 run 的记录仍在跑、仍持有这张卡」的原子段里(律的属主 = `workflow-park-decision.ts` 文件头)。
6
+ * 这一段要与这条 run 的**每一笔**记录写串行 —— 否则「判出在跑 → 落行」之间插进引擎的终态写,run 收场送达读不到这一行,决定被丢在已收场的 run 上。
7
+ * 本服务的记录写者有两个:引擎(经 journaling 装饰器 `JournalingWorkflowRunStore`)与 notify 门的收养翻转(`WorkflowNotifyGate.recover` 经基店翻 `running → failed`);
8
+ * core File 店的锁是它私有的。⇒ 互斥不能只放在 journaling 装饰器上:放在**基店外的这一只装饰器**里,两只写者都经它写,它就是本进程全部记录写者的同一只互斥。
9
+ *
10
+ * ## 律
11
+ * 按 runId 互斥:`put` / `update` / {@link FencedWorkflowRecordStore.whileRunning} 对同一条 run 一个接一个(先到先走);读(`get` / `listByScope`)与收割(只删终态行)
12
+ * 不进互斥(本装饰器不出按会话删那一口:与它所在的 journaling 装饰器同一个答案)。`whileRunning` 的 `fn` 是同步的(型上不许把写挪到段外),段里不许再经本店写同一条 run(会自锁)。
13
+ * 互斥只排同一进程里的写;SQL 后端的跨副本串行由行锁担(那里没有本装饰器)。
14
+ */
15
+ import type { WorkflowRun, WorkflowRunStore } from "@sema-agent/core";
16
+ import type { InProcessRecordFence, RecordFenced } from "./workflow-park-decision.js";
17
+ export declare class FencedWorkflowRecordStore implements WorkflowRunStore, InProcessRecordFence {
18
+ private readonly inner;
19
+ /** runId → 这条 run 上最后一段的落定(链尾);链空了就摘掉(有界 = 此刻有段在排的 run 数)。 */
20
+ private readonly tails;
21
+ constructor(inner: WorkflowRunStore);
22
+ /** 同一条 run 上的段一个接一个:等前一段落定(成败都算落定)再走本段。 */
23
+ private serial;
24
+ put(id: string, run: WorkflowRun): Promise<void>;
25
+ update(id: string, scope: string, run: WorkflowRun, expect?: {
26
+ rev: number;
27
+ }): Promise<boolean>;
28
+ whileRunning<T>(runId: string, fn: (run: WorkflowRun) => T): Promise<RecordFenced<T>>;
29
+ get(id: string): Promise<WorkflowRun | null>;
30
+ listByScope(...args: Parameters<WorkflowRunStore["listByScope"]>): ReturnType<WorkflowRunStore["listByScope"]>;
31
+ reap(scope: string, now: number, opts?: {
32
+ maxAgeMs?: number;
33
+ keep?: number;
34
+ }): Promise<number>;
35
+ }
36
+ //# sourceMappingURL=workflow-record-fence.d.ts.map
@@ -0,0 +1,42 @@
1
+ export class FencedWorkflowRecordStore {
2
+ inner;
3
+ tails = new Map();
4
+ constructor(inner) {
5
+ this.inner = inner;
6
+ }
7
+ serial(runId, segment) {
8
+ const before = this.tails.get(runId) ?? Promise.resolve();
9
+ const result = before.then(segment);
10
+ const tail = result.then(() => undefined, () => undefined);
11
+ this.tails.set(runId, tail);
12
+ void tail.then(() => {
13
+ if (this.tails.get(runId) === tail)
14
+ this.tails.delete(runId);
15
+ });
16
+ return result;
17
+ }
18
+ put(id, run) {
19
+ return this.serial(id, () => this.inner.put(id, run));
20
+ }
21
+ update(id, scope, run, expect) {
22
+ return this.serial(id, () => this.inner.update(id, scope, run, expect));
23
+ }
24
+ whileRunning(runId, fn) {
25
+ return this.serial(runId, async () => {
26
+ const run = await this.inner.get(runId);
27
+ if (run === null || run.status !== "running")
28
+ return { running: false };
29
+ return { running: true, value: fn(run) };
30
+ });
31
+ }
32
+ get(id) {
33
+ return this.inner.get(id);
34
+ }
35
+ listByScope(...args) {
36
+ return this.inner.listByScope(...args);
37
+ }
38
+ reap(scope, now, opts) {
39
+ return this.inner.reap(scope, now, opts);
40
+ }
41
+ }
42
+ //# sourceMappingURL=workflow-record-fence.js.map
@@ -52,7 +52,7 @@ export interface Caller {
52
52
  readonly principalRequired: boolean;
53
53
  readonly multiTenant: boolean;
54
54
  }
55
- /** 单机形下 core 写侧 `spec.principal ?? "default"` 铸出的租户键(壳随请求带的那一个):`j4` 一格的调用方条件。它是单机形的真租户键,不是哨兵。 */
55
+ /** 单机形下 core 写侧给匿名任务落的那一格租户键(壳随请求带的那一个;换算 = `engine-identity.ts` 的 `engineScopeOf`):`j4` 一格的调用方条件。它是单机形的真租户键,不是哨兵。 */
56
56
  export declare const LEGACY_UNOWNED_AMNESTY_TENANT = "default";
57
57
  /**
58
58
  * 🔴 **调用方与行属主之间唯一的桥**:两个品牌在类型上不可比(`Subject === DurableOwnerKey` 编译红),只在这里按字节比。调用方一侧是**主体**(分区键):
@@ -112,9 +112,10 @@ export type FaceDoor = "P401" | "I401" | "I401r" | "none";
112
112
  * · `deleted_false` —— 200 `{deleted:false}`(删除口幂等形:没删到东西);
113
113
  * · `run_exists` —— 409 `conflict.run_exists`(提交重放:这把键 / 这只 taskId 已被占用);
114
114
  * · `attach_absent` —— 404 `resume.session_not_found`「requireExistingSession: session does not exist …」(提交挂接:认领面没有「没有就建」可镜像,占用 = 不存在那一体);
115
+ * · `workflow_missing` —— 404 `not_found.workflow` "workflow not found"(工作流按 id 四口;没有 / 看不见 / 会话断言不符同体);
115
116
  * · `omit` —— 本模块不下发:调用点把「看不见」当「没有」走它自己的缺席路径(协议口的 RpcError / leader 404 / 嵌套可选字段省略)。
116
117
  */
117
- export type FaceProjection = "run_missing" | "task_missing" | "decision_missing" | "session_missing" | "exemption_missing" | "deleted_false" | "run_exists" | "attach_absent" | "omit";
118
+ export type FaceProjection = "run_missing" | "task_missing" | "decision_missing" | "session_missing" | "exemption_missing" | "deleted_false" | "workflow_missing" | "run_exists" | "attach_absent" | "omit";
118
119
  /** 属主读不出(会话店交出具名拒「属主读不出」)时本口怎么读:`fold` = 读作没有这一行(同一只投影,原故障进运维日志一行);`raise` = 原故障照常上抛。 */
119
120
  export type FaceUnreadable = "fold" | "raise";
120
121
  /**
@@ -126,8 +127,8 @@ export type FaceUnreadable = "fold" | "raise";
126
127
  */
127
128
  export type FacePlacementUnreadable = "raise" | "ordinary";
128
129
  export interface Face {
129
- /** 行的种类:run / 会话行(路由经 `http/owner-access.ts` 的门判)、停驻行 scope 列(`scope`)、ask 行 / 活登记 / 活问(`ask`)、收件条目(`inbox`)、列表面(`list`)。 */
130
- readonly resource: "run" | "session" | "scope" | "ask" | "inbox" | "list";
130
+ /** 行的种类:run / 会话行(路由经 `http/owner-access.ts` 的门判)、工作流行(`workflow`:属主 = 引擎写下的 `scope` 列)、停驻行 scope 列(`scope`)、ask 行 / 活登记 / 活问(`ask`)、收件条目(`inbox`)、列表面(`list`)。 */
131
+ readonly resource: "run" | "session" | "workflow" | "scope" | "ask" | "inbox" | "list";
131
132
  /** 行资格里本口放哪几格。 */
132
133
  readonly grants: readonly RowQual[];
133
134
  /** fleet 资格里本口放哪几格(D1 列,见模块头注)。 */
@@ -385,6 +386,26 @@ export declare const FACES: {
385
386
  readonly unreadable: "raise";
386
387
  readonly placementUnreadable: "ordinary";
387
388
  };
389
+ readonly "workflow.read": {
390
+ readonly resource: "workflow";
391
+ readonly grants: readonly ["owner"];
392
+ readonly fleet: readonly [];
393
+ readonly operator: false;
394
+ readonly door: "P401";
395
+ readonly projection: "workflow_missing";
396
+ readonly unreadable: "raise";
397
+ readonly placementUnreadable: "raise";
398
+ };
399
+ readonly "workflow.steer": {
400
+ readonly resource: "workflow";
401
+ readonly grants: readonly ["owner"];
402
+ readonly fleet: readonly [];
403
+ readonly operator: false;
404
+ readonly door: "P401";
405
+ readonly projection: "workflow_missing";
406
+ readonly unreadable: "raise";
407
+ readonly placementUnreadable: "raise";
408
+ };
388
409
  readonly "scope.decide": {
389
410
  readonly resource: "scope";
390
411
  readonly grants: readonly ["owner", "open"];
@@ -456,6 +477,9 @@ export type SessionFaceId = {
456
477
  export type ListFaceId = {
457
478
  [F in FaceId]: (typeof FACES)[F]["resource"] extends "list" ? F : never;
458
479
  }[FaceId];
480
+ export type WorkflowFaceId = {
481
+ [F in FaceId]: (typeof FACES)[F]["resource"] extends "workflow" ? F : never;
482
+ }[FaceId];
459
483
  /**
460
484
  * **只看「验过的主体 + 运维位」的面**(派生型:行资格 ⊆ {owner, open} ∧ fleet 列空):这几只面的可见性与部署形、fleet 事实都无关 ——
461
485
  * 面表里给其中一行加上 `j4` / 任一 fleet 格,它就掉出本型,{@link keyAdmits} 的调用点编译红(那时它要一只完整的 {@link Caller})。
@@ -74,6 +74,8 @@ export const FACES = {
74
74
  "session.policy": { resource: "session", grants: ["owner", "open", "anon_tree"], fleet: ["dev_open"], operator: true, door: "I401r", projection: "session_missing", unreadable: "raise", placementUnreadable: "ordinary" },
75
75
  "session.notify": { resource: "session", grants: ["owner", "open", "anon_tree"], fleet: ["dev_open"], operator: true, door: "P401", projection: "session_missing", unreadable: "raise", placementUnreadable: "raise" },
76
76
  "session.attach": { resource: "session", grants: ["owner", "open"], fleet: [], operator: false, door: "none", projection: "attach_absent", unreadable: "raise", placementUnreadable: "ordinary" },
77
+ "workflow.read": { resource: "workflow", grants: ["owner"], fleet: [], operator: false, door: "P401", projection: "workflow_missing", unreadable: "raise", placementUnreadable: "raise" },
78
+ "workflow.steer": { resource: "workflow", grants: ["owner"], fleet: [], operator: false, door: "P401", projection: "workflow_missing", unreadable: "raise", placementUnreadable: "raise" },
77
79
  "scope.decide": { resource: "scope", grants: ["owner", "open"], fleet: [], operator: true, door: "none", projection: "omit", unreadable: "raise", placementUnreadable: "raise" },
78
80
  "ask.decide": { resource: "ask", grants: ["owner", "open"], fleet: [], operator: true, door: "none", projection: "omit", unreadable: "raise", placementUnreadable: "raise" },
79
81
  "ask.answer": { resource: "ask", grants: ["owner", "open"], fleet: [], operator: false, door: "none", projection: "omit", unreadable: "raise", placementUnreadable: "raise" },
@@ -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
  *
@@ -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
  *