@sema-agent/server 7.132.0 → 7.134.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 (473) hide show
  1. package/MIGRATION.md +353 -0
  2. package/README.md +8 -9
  3. package/README.zh-CN.md +7 -6
  4. package/USAGE.md +301 -64
  5. package/deploy/sema-up/README.md +35 -1
  6. package/deploy/sema-up/chart/Chart.yaml +1 -1
  7. package/deploy/sema-up/chart/templates/NOTES.txt +15 -0
  8. package/deploy/sema-up/chart/templates/_helpers.tpl +129 -0
  9. package/deploy/sema-up/chart/templates/sealed-key.yaml +24 -0
  10. package/deploy/sema-up/chart/templates/server-v4pro.yaml +19 -2
  11. package/deploy/sema-up/chart/templates/server.yaml +19 -2
  12. package/deploy/sema-up/chart/values-full-single.yaml +5 -1
  13. package/deploy/sema-up/chart/values.yaml +34 -0
  14. package/deploy/sema-up/stack/compose.yaml +3 -0
  15. package/deploy/sema-up/stack/sema-stack-cluster.yaml +4 -2
  16. package/dist/adoption/plan.d.ts +3 -2
  17. package/dist/adoption/plan.js +7 -5
  18. package/dist/adoption/runner.js +3 -10
  19. package/dist/adoption/sql.d.ts +3 -2
  20. package/dist/adoption/sql.js +3 -5
  21. package/dist/adoption/wire.d.ts +4 -1
  22. package/dist/adoption/wire.js +1 -0
  23. package/dist/approval-ask-audit-store.d.ts +32 -14
  24. package/dist/approval-ask-audit-store.js +272 -74
  25. package/dist/approval-ask-machine.d.ts +15 -0
  26. package/dist/approval-ask-machine.js +6 -0
  27. package/dist/approval-ask-retention.d.ts +136 -0
  28. package/dist/approval-ask-retention.js +102 -0
  29. package/dist/approval-card.d.ts +83 -23
  30. package/dist/approval-card.js +45 -15
  31. package/dist/approval-content-kind.d.ts +5 -2
  32. package/dist/approval-content-kind.js +16 -3
  33. package/dist/approval-deny-reasons.d.ts +1 -1
  34. package/dist/approval-gate-currency.d.ts +72 -0
  35. package/dist/approval-gate-currency.js +94 -0
  36. package/dist/approval.d.ts +15 -0
  37. package/dist/approval.js +55 -17
  38. package/dist/audit.d.ts +27 -10
  39. package/dist/audit.js +12 -16
  40. package/dist/bake-runner/main.js +3 -2
  41. package/dist/boot/coordinators.d.ts +6 -1
  42. package/dist/boot/coordinators.js +6 -3
  43. package/dist/boot/deferred-sandbox-path-env.js +1 -1
  44. package/dist/boot/execution-env.js +9 -7
  45. package/dist/boot/execution-lane.js +11 -0
  46. package/dist/boot/leader.d.ts +2 -0
  47. package/dist/boot/leader.js +4 -1
  48. package/dist/boot/memory-boundary.js +2 -2
  49. package/dist/boot/memory-consolidation.d.ts +5 -4
  50. package/dist/boot/memory-consolidation.js +7 -6
  51. package/dist/boot/org-delivery.d.ts +28 -0
  52. package/dist/boot/org-delivery.js +20 -0
  53. package/dist/boot/read-deny-anchor-audit.js +2 -2
  54. package/dist/boot/reapers.d.ts +3 -0
  55. package/dist/boot/reapers.js +21 -1
  56. package/dist/boot/resolve-spec.d.ts +3 -0
  57. package/dist/boot/resolve-spec.js +60 -81
  58. package/dist/boot/runner-deps.d.ts +18 -5
  59. package/dist/boot/runner-deps.js +10 -0
  60. package/dist/boot/session-faces.d.ts +1 -0
  61. package/dist/boot/session-faces.js +4 -2
  62. package/dist/boot/stage-02-web-admin-pull.js +4 -1
  63. package/dist/boot/stage-06-runners.d.ts +6 -3
  64. package/dist/boot/stage-06-runners.js +20 -4
  65. package/dist/boot/stage-07-capability-layer.d.ts +4 -1
  66. package/dist/boot/stage-07-capability-layer.js +24 -3
  67. package/dist/boot/stage-08-reapers.d.ts +4 -1
  68. package/dist/boot/stage-08-reapers.js +2 -2
  69. package/dist/boot/stage-09-leader.d.ts +5 -1
  70. package/dist/boot/stage-09-leader.js +2 -2
  71. package/dist/boot/stage-10-http-server.d.ts +5 -1
  72. package/dist/boot/stage-10-http-server.js +6 -6
  73. package/dist/boot/stores.d.ts +8 -0
  74. package/dist/boot/stores.js +10 -14
  75. package/dist/boot/web-admin.d.ts +10 -0
  76. package/dist/boot/web-admin.js +162 -65
  77. package/dist/boot/workflow-orchestration.d.ts +2 -0
  78. package/dist/boot/workflow-orchestration.js +2 -1
  79. package/dist/brain.js +8 -3
  80. package/dist/breaker-key.d.ts +6 -0
  81. package/dist/breaker-key.js +29 -0
  82. package/dist/budget.js +5 -1
  83. package/dist/caller-text-echo.d.ts +11 -6
  84. package/dist/caller-text-echo.js +10 -12
  85. package/dist/canonical-json.d.ts +2 -41
  86. package/dist/canonical-json.js +2 -13
  87. package/dist/capabilities/center-plugins.d.ts +7 -0
  88. package/dist/capabilities/center-plugins.js +1 -1
  89. package/dist/capabilities/composite-members.d.ts +1 -1
  90. package/dist/capabilities/composite-members.js +1 -1
  91. package/dist/capabilities/execution-lane.js +2 -2
  92. package/dist/capabilities/hands-lane.d.ts +21 -0
  93. package/dist/capabilities/hands-lane.js +10 -0
  94. package/dist/capabilities/mcp-probe.d.ts +36 -4
  95. package/dist/capabilities/mcp-probe.js +29 -6
  96. package/dist/capabilities/scenarios.d.ts +63 -7
  97. package/dist/capabilities/scenarios.js +39 -7
  98. package/dist/capability-facts.d.ts +36 -4
  99. package/dist/capability-facts.js +30 -4
  100. package/dist/center-config-tier.d.ts +69 -0
  101. package/dist/center-config-tier.js +42 -0
  102. package/dist/checkpoint-ctx-seal-m28.d.ts +42 -0
  103. package/dist/checkpoint-ctx-seal-m28.js +19 -0
  104. package/dist/checkpoint-identity.d.ts +16 -0
  105. package/dist/checkpoint-identity.js +19 -0
  106. package/dist/config-catalog.d.ts +17 -10
  107. package/dist/config-catalog.js +43 -28
  108. package/dist/config-d-migration.d.ts +3 -1
  109. package/dist/config-d-migration.js +2 -2
  110. package/dist/config-dir-trust.d.ts +114 -0
  111. package/dist/config-dir-trust.js +388 -0
  112. package/dist/config-invariants.d.ts +18 -5
  113. package/dist/config-invariants.js +35 -3
  114. package/dist/config-provider.d.ts +6 -1
  115. package/dist/config-provider.js +6 -2
  116. package/dist/config-types.d.ts +71 -14
  117. package/dist/config-types.js +8 -0
  118. package/dist/config.d.ts +13 -0
  119. package/dist/config.js +121 -59
  120. package/dist/delegated-session-owner.d.ts +185 -0
  121. package/dist/delegated-session-owner.js +119 -0
  122. package/dist/device-protocol.d.ts +5 -3
  123. package/dist/device-protocol.js +1 -1
  124. package/dist/device-ws-hub.js +21 -2
  125. package/dist/device-ws-protocol.d.ts +70 -6
  126. package/dist/device-ws-protocol.js +50 -23
  127. package/dist/elicitation.js +3 -2
  128. package/dist/entry-problems.d.ts +34 -0
  129. package/dist/entry-problems.js +14 -0
  130. package/dist/execution-lane-caps.d.ts +49 -10
  131. package/dist/execution-lane-caps.js +43 -4
  132. package/dist/field-conflict.d.ts +44 -0
  133. package/dist/field-conflict.js +21 -0
  134. package/dist/file-history-disclosure.d.ts +34 -5
  135. package/dist/file-history-disclosure.js +2 -2
  136. package/dist/fleet/fleet-bus.d.ts +84 -6
  137. package/dist/fleet/fleet-bus.js +42 -9
  138. package/dist/hooks/classic-stations.d.ts +10 -5
  139. package/dist/hooks/classic-stations.js +4 -4
  140. package/dist/hooks/command-spawn.d.ts +57 -0
  141. package/dist/hooks/command-spawn.js +139 -0
  142. package/dist/hooks/hook-llm.js +2 -2
  143. package/dist/hooks/hook-runner.d.ts +127 -25
  144. package/dist/hooks/hook-runner.js +668 -287
  145. package/dist/hooks/hook-source.d.ts +44 -0
  146. package/dist/hooks/hook-source.js +40 -0
  147. package/dist/http/active-run-conflict.d.ts +5 -13
  148. package/dist/http/active-run-conflict.js +17 -27
  149. package/dist/http/admission.js +111 -60
  150. package/dist/http/approval-sweeps.js +58 -19
  151. package/dist/http/caller-trust.d.ts +77 -0
  152. package/dist/http/caller-trust.js +143 -0
  153. package/dist/http/checkpoint-ctx.d.ts +173 -18
  154. package/dist/http/checkpoint-ctx.js +171 -12
  155. package/dist/http/claimed-run.d.ts +4 -3
  156. package/dist/http/device-placement.d.ts +2 -4
  157. package/dist/http/device-placement.js +2 -1
  158. package/dist/http/dispatch.js +13 -7
  159. package/dist/http/durable-run-leg.d.ts +4 -32
  160. package/dist/http/durable-run-leg.js +37 -12
  161. package/dist/http/idempotency.d.ts +2 -2
  162. package/dist/http/idempotency.js +2 -2
  163. package/dist/http/owner-access.d.ts +56 -0
  164. package/dist/http/owner-access.js +42 -0
  165. package/dist/http/principal-gate.d.ts +78 -27
  166. package/dist/http/principal-gate.js +64 -14
  167. package/dist/http/readiness.d.ts +11 -5
  168. package/dist/http/readiness.js +10 -3
  169. package/dist/http/refusal-body.d.ts +12 -0
  170. package/dist/http/refusal-body.js +11 -0
  171. package/dist/http/request-guards.d.ts +16 -32
  172. package/dist/http/request-guards.js +31 -30
  173. package/dist/http/resume-ctx-read.d.ts +50 -6
  174. package/dist/http/resume-ctx-read.js +33 -7
  175. package/dist/http/resume-legs.d.ts +5 -5
  176. package/dist/http/resume-legs.js +163 -91
  177. package/dist/http/retired-service-deps.d.ts +43 -0
  178. package/dist/http/retired-service-deps.js +18 -0
  179. package/dist/http/route-ctx.d.ts +44 -37
  180. package/dist/http/route-ctx.js +4 -0
  181. package/dist/http/route-table.js +2 -0
  182. package/dist/http/routes/a2a-serve.js +3 -4
  183. package/dist/http/routes/admin-config-refresh.js +1 -1
  184. package/dist/http/routes/admin-drain.js +1 -1
  185. package/dist/http/routes/admin-memory-optout.js +5 -1
  186. package/dist/http/routes/adoption.js +2 -9
  187. package/dist/http/routes/agents-roster.js +2 -3
  188. package/dist/http/routes/approvals-assistant.js +91 -56
  189. package/dist/http/routes/background.js +3 -2
  190. package/dist/http/routes/capabilities.js +20 -4
  191. package/dist/http/routes/config-catalog.d.ts +3 -3
  192. package/dist/http/routes/config-catalog.js +1 -1
  193. package/dist/http/routes/devices.js +3 -17
  194. package/dist/http/routes/diagnostics.d.ts +3 -3
  195. package/dist/http/routes/diagnostics.js +6 -2
  196. package/dist/http/routes/fleet.js +4 -4
  197. package/dist/http/routes/images.js +6 -7
  198. package/dist/http/routes/leader.js +1 -8
  199. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  200. package/dist/http/routes/mcp-reconnect.js +3 -2
  201. package/dist/http/routes/memory-bundle.js +1 -1
  202. package/dist/http/routes/memory-compliance.js +1 -1
  203. package/dist/http/routes/memory-consolidation.js +1 -1
  204. package/dist/http/routes/memory-origin.d.ts +1 -1
  205. package/dist/http/routes/memory-origin.js +1 -1
  206. package/dist/http/routes/memory-policy.d.ts +1 -1
  207. package/dist/http/routes/memory-policy.js +3 -2
  208. package/dist/http/routes/notify-wake.js +8 -21
  209. package/dist/http/routes/observability.js +2 -2
  210. package/dist/http/routes/principal-inbox.d.ts +39 -0
  211. package/dist/http/routes/principal-inbox.js +76 -0
  212. package/dist/http/routes/retention-ops.js +2 -9
  213. package/dist/http/routes/rules.js +9 -22
  214. package/dist/http/routes/runs.d.ts +5 -0
  215. package/dist/http/routes/runs.js +63 -115
  216. package/dist/http/routes/session-sync.d.ts +3 -2
  217. package/dist/http/routes/session-sync.js +53 -48
  218. package/dist/http/routes/sessions-list.d.ts +1 -1
  219. package/dist/http/routes/sessions-list.js +3 -4
  220. package/dist/http/routes/sessions.js +33 -43
  221. package/dist/http/routes/side-query.js +6 -4
  222. package/dist/http/routes/tasks.js +71 -30
  223. package/dist/http/routes/trace-usage.js +7 -9
  224. package/dist/http/routes/workflows.d.ts +351 -0
  225. package/dist/http/routes/workflows.js +153 -119
  226. package/dist/http/run-declared-families.d.ts +16 -0
  227. package/dist/http/run-declared-families.js +12 -0
  228. package/dist/http/send.d.ts +24 -3
  229. package/dist/http/send.js +14 -2
  230. package/dist/http/server.d.ts +23 -18
  231. package/dist/http/server.js +20 -15
  232. package/dist/http/stored-body-replay.js +17 -4
  233. package/dist/http/submit-ctx.d.ts +4 -3
  234. package/dist/http/submit-ctx.js +23 -6
  235. package/dist/http/submit-replay.d.ts +4 -3
  236. package/dist/http/submit-replay.js +5 -4
  237. package/dist/http/wire-types.d.ts +17 -10
  238. package/dist/index.d.ts +3 -1
  239. package/dist/index.js +1 -1
  240. package/dist/lane-home-probe.d.ts +78 -9
  241. package/dist/lane-home-probe.js +78 -12
  242. package/dist/leader/endpoint.d.ts +4 -1
  243. package/dist/leader/endpoint.js +11 -10
  244. package/dist/leader/wire.d.ts +4 -0
  245. package/dist/leader/wire.js +8 -7
  246. package/dist/limit-refusal.d.ts +17 -5
  247. package/dist/limit-refusal.js +4 -1
  248. package/dist/main.js +1 -1
  249. package/dist/mcp-assertion-header.d.ts +31 -10
  250. package/dist/mcp-assertion-header.js +10 -3
  251. package/dist/memory-origin-fence.js +2 -2
  252. package/dist/memory-project-layer.d.ts +37 -0
  253. package/dist/memory-project-layer.js +46 -0
  254. package/dist/memory-scope.d.ts +23 -16
  255. package/dist/memory-scope.js +24 -8
  256. package/dist/memory-sync-client.d.ts +27 -13
  257. package/dist/memory-sync-client.js +107 -18
  258. package/dist/model-compat.d.ts +1 -1
  259. package/dist/model-entry-refusal.d.ts +9 -1
  260. package/dist/model-entry-refusal.js +6 -1
  261. package/dist/model-plane-face.d.ts +51 -0
  262. package/dist/model-plane-face.js +24 -0
  263. package/dist/model-provider.d.ts +5 -0
  264. package/dist/model-provider.js +4 -2
  265. package/dist/model-route-endpoint.d.ts +8 -11
  266. package/dist/model-route-endpoint.js +4 -7
  267. package/dist/model-route-env.d.ts +22 -0
  268. package/dist/model-route-env.js +2 -0
  269. package/dist/model-route-gap.d.ts +60 -30
  270. package/dist/model-route-gap.js +21 -15
  271. package/dist/observability/corrupt-read-seat.d.ts +7 -0
  272. package/dist/observability/corrupt-read-seat.js +9 -0
  273. package/dist/observability/err-text.d.ts +6 -0
  274. package/dist/observability/err-text.js +18 -4
  275. package/dist/observability/fail-open.d.ts +35 -9
  276. package/dist/observability/fail-open.js +35 -9
  277. package/dist/observability/metrics.js +1 -0
  278. package/dist/observability/prompt-manifest.d.ts +22 -25
  279. package/dist/observability/prompt-manifest.js +54 -50
  280. package/dist/observability/tool-trace.js +9 -10
  281. package/dist/operator-ask.d.ts +10 -0
  282. package/dist/operator-ask.js +3 -0
  283. package/dist/orchestration/workflow-agent-session-index.d.ts +12 -12
  284. package/dist/orchestration/workflow-agent-session-index.js +9 -13
  285. package/dist/orchestration/workflow-completion-inbox.d.ts +42 -15
  286. package/dist/orchestration/workflow-completion-inbox.js +13 -0
  287. package/dist/orchestration/workflow-notify-journal.d.ts +13 -32
  288. package/dist/orchestration/workflow-notify-journal.js +27 -34
  289. package/dist/orchestration/workflow-park-decision.d.ts +89 -0
  290. package/dist/orchestration/workflow-park-decision.js +119 -0
  291. package/dist/org-delivery-gate.d.ts +81 -0
  292. package/dist/org-delivery-gate.js +59 -0
  293. package/dist/panel-tool-names.d.ts +23 -0
  294. package/dist/panel-tool-names.js +8 -0
  295. package/dist/parked-decide.d.ts +43 -11
  296. package/dist/parked-decide.js +100 -51
  297. package/dist/parked-revive-surface.d.ts +9 -2
  298. package/dist/parked-revive-surface.js +11 -8
  299. package/dist/permission-rule-list.d.ts +1 -1
  300. package/dist/permission-rule-list.js +2 -2
  301. package/dist/permission-rule-vocab.d.ts +1 -23
  302. package/dist/permission-rule-vocab.js +0 -13
  303. package/dist/plugins/approval-ask-store-file.d.ts +16 -1
  304. package/dist/plugins/approval-ask-store-file.js +21 -0
  305. package/dist/plugins/approval-ask-store-memory.d.ts +18 -1
  306. package/dist/plugins/approval-ask-store-memory.js +34 -2
  307. package/dist/plugins/approval-ask-store-sql.d.ts +25 -0
  308. package/dist/plugins/approval-ask-store-sql.js +37 -1
  309. package/dist/plugins/approval-payload-fingerprint.d.ts +14 -6
  310. package/dist/plugins/approval-payload-fingerprint.js +1 -1
  311. package/dist/plugins/blob-backend.d.ts +38 -25
  312. package/dist/plugins/blob-backend.js +29 -19
  313. package/dist/plugins/breaker-state-sql.d.ts +2 -2
  314. package/dist/plugins/breaker-state-sql.js +4 -4
  315. package/dist/plugins/caching-session-store.d.ts +4 -1
  316. package/dist/plugins/caching-session-store.js +7 -3
  317. package/dist/plugins/checkpoint-store-sql.d.ts +36 -1
  318. package/dist/plugins/checkpoint-store-sql.js +65 -3
  319. package/dist/plugins/file-history-store-sql.d.ts +5 -2
  320. package/dist/plugins/file-history-store-sql.js +3 -1
  321. package/dist/plugins/file-run-store.d.ts +5 -13
  322. package/dist/plugins/file-run-store.js +9 -0
  323. package/dist/plugins/fork-routing-session-store.d.ts +9 -1
  324. package/dist/plugins/fork-routing-session-store.js +12 -1
  325. package/dist/plugins/host-platform.d.ts +2 -0
  326. package/dist/plugins/host-platform.js +2 -1
  327. package/dist/plugins/local-checkpoint-store.d.ts +15 -2
  328. package/dist/plugins/local-checkpoint-store.js +32 -1
  329. package/dist/plugins/local-session-store.d.ts +13 -10
  330. package/dist/plugins/local-session-store.js +23 -14
  331. package/dist/plugins/local-session-window.d.ts +45 -0
  332. package/dist/plugins/local-session-window.js +38 -0
  333. package/dist/plugins/mailbox-recipient-lifecycle.d.ts +3 -2
  334. package/dist/plugins/mailbox-store-sql.d.ts +30 -48
  335. package/dist/plugins/mailbox-store-sql.js +77 -52
  336. package/dist/plugins/memory-embedder-fingerprint.js +2 -1
  337. package/dist/plugins/memory-run-store.d.ts +5 -13
  338. package/dist/plugins/memory-run-store.js +8 -0
  339. package/dist/plugins/one-time-migrations.d.ts +121 -5
  340. package/dist/plugins/one-time-migrations.js +332 -8
  341. package/dist/plugins/org-delivery-quota-store.d.ts +123 -0
  342. package/dist/plugins/org-delivery-quota-store.js +228 -0
  343. package/dist/plugins/permission-rule-store-file.js +10 -6
  344. package/dist/plugins/permission-rule-store-sql.js +8 -8
  345. package/dist/plugins/pg-pool.js +39 -7
  346. package/dist/plugins/pg-session-storage.d.ts +18 -5
  347. package/dist/plugins/pg-session-storage.js +68 -23
  348. package/dist/plugins/remote-env-adb.d.ts +6 -12
  349. package/dist/plugins/remote-env-adb.js +12 -2
  350. package/dist/plugins/remote-env-device.d.ts +14 -7
  351. package/dist/plugins/remote-env-device.js +23 -15
  352. package/dist/plugins/remote-env-k8s.d.ts +8 -12
  353. package/dist/plugins/remote-env-k8s.js +23 -5
  354. package/dist/plugins/remote-env-local-docker.d.ts +10 -15
  355. package/dist/plugins/remote-env-local-docker.js +12 -9
  356. package/dist/plugins/remote-env-ssh.d.ts +10 -16
  357. package/dist/plugins/remote-env-ssh.js +17 -11
  358. package/dist/plugins/run-store-sql.d.ts +16 -14
  359. package/dist/plugins/run-store-sql.js +22 -2
  360. package/dist/plugins/schema-indexes.js +2 -0
  361. package/dist/plugins/send-user-file.js +2 -2
  362. package/dist/plugins/session-epoch-anchor.d.ts +32 -6
  363. package/dist/plugins/session-epoch-anchor.js +2 -3
  364. package/dist/plugins/session-ownership.d.ts +11 -0
  365. package/dist/plugins/session-ownership.js +11 -0
  366. package/dist/plugins/session-placement.d.ts +12 -14
  367. package/dist/plugins/session-placement.js +2 -15
  368. package/dist/plugins/session-store.d.ts +18 -8
  369. package/dist/plugins/session-store.js +15 -4
  370. package/dist/plugins/sql-driver.d.ts +74 -11
  371. package/dist/plugins/sql-driver.js +210 -12
  372. package/dist/plugins/sql-errors.d.ts +23 -0
  373. package/dist/plugins/sql-errors.js +21 -0
  374. package/dist/plugins/store-backend.d.ts +36 -1
  375. package/dist/plugins/store-backend.js +40 -14
  376. package/dist/plugins/store-contracts.d.ts +42 -0
  377. package/dist/plugins/store-contracts.js +1 -0
  378. package/dist/plugins/tidb-pool.d.ts +6 -1
  379. package/dist/plugins/tidb-pool.js +44 -10
  380. package/dist/plugins/tidb-session-storage.d.ts +3 -2
  381. package/dist/plugins/tidb-session-storage.js +2 -2
  382. package/dist/plugins/tidb-session-store.d.ts +25 -5
  383. package/dist/plugins/tidb-session-store.js +67 -21
  384. package/dist/plugins/workflow-journal-store-sql.d.ts +73 -19
  385. package/dist/plugins/workflow-journal-store-sql.js +19 -6
  386. package/dist/plugins/workflow-run-store-sql.d.ts +30 -8
  387. package/dist/plugins/workflow-run-store-sql.js +50 -9
  388. package/dist/posture-source.d.ts +18 -10
  389. package/dist/posture-source.js +4 -1
  390. package/dist/project-identity.d.ts +45 -6
  391. package/dist/project-identity.js +162 -8
  392. package/dist/project-layer-key.d.ts +28 -0
  393. package/dist/project-layer-key.js +29 -0
  394. package/dist/question.js +3 -2
  395. package/dist/read-deny-entry.d.ts +25 -0
  396. package/dist/read-deny-entry.js +12 -0
  397. package/dist/read-face-posture.d.ts +37 -11
  398. package/dist/read-face-posture.js +32 -3
  399. package/dist/request-key-closure.d.ts +7 -0
  400. package/dist/request-key-closure.js +9 -1
  401. package/dist/request-tool-axes.d.ts +12 -0
  402. package/dist/request-tool-axes.js +20 -0
  403. package/dist/request-value-closure.d.ts +5 -0
  404. package/dist/request-value-closure.js +11 -3
  405. package/dist/rule-entry-list.d.ts +26 -2
  406. package/dist/rule-entry-list.js +72 -12
  407. package/dist/rules-consent.js +3 -4
  408. package/dist/run-acceptance.d.ts +19 -3
  409. package/dist/run-acceptance.js +13 -1
  410. package/dist/run-local.js +37 -6
  411. package/dist/runs.d.ts +12 -10
  412. package/dist/runs.js +25 -6
  413. package/dist/runtime-caps-resolver.d.ts +16 -6
  414. package/dist/runtime-caps-resolver.js +18 -5
  415. package/dist/sandbox-pkg-source.d.ts +19 -1
  416. package/dist/sandbox-pkg-source.js +29 -7
  417. package/dist/sealed-key.d.ts +32 -0
  418. package/dist/sealed-key.js +55 -1
  419. package/dist/security.d.ts +95 -15
  420. package/dist/security.js +52 -9
  421. package/dist/session-error-wire.d.ts +31 -7
  422. package/dist/session-error-wire.js +9 -2
  423. package/dist/session-sync-kernel.d.ts +37 -10
  424. package/dist/session-sync-kernel.js +10 -0
  425. package/dist/session-titled-frame.d.ts +33 -0
  426. package/dist/session-titled-frame.js +4 -0
  427. package/dist/session-titler.d.ts +9 -1
  428. package/dist/session-titler.js +15 -4
  429. package/dist/spec-fields.js +21 -2
  430. package/dist/sql-engine-posture.d.ts +3 -1
  431. package/dist/task-a2a.js +4 -3
  432. package/dist/task-cwd.d.ts +1 -1
  433. package/dist/task-mcp.d.ts +5 -5
  434. package/dist/task-mcp.js +27 -74
  435. package/dist/task-settings.d.ts +93 -88
  436. package/dist/task-settings.js +71 -63
  437. package/dist/text-bidi.d.ts +0 -4
  438. package/dist/text-bidi.js +1 -3
  439. package/dist/tighten-only-seats.d.ts +150 -0
  440. package/dist/tighten-only-seats.js +196 -0
  441. package/dist/tool-approval.d.ts +451 -136
  442. package/dist/tool-approval.js +733 -256
  443. package/dist/tool-rule-names.d.ts +6 -0
  444. package/dist/trace/core-keyset-guard.d.ts +108 -25
  445. package/dist/trace/exit-seat.d.ts +40 -0
  446. package/dist/trace/exit-seat.js +130 -0
  447. package/dist/trace/ledger-events.d.ts +6 -3
  448. package/dist/trace/project.d.ts +98 -13
  449. package/dist/trace/project.js +57 -32
  450. package/dist/trace/projection-table.d.ts +100 -0
  451. package/dist/trace/projection-table.js +130 -0
  452. package/dist/trace/redact.d.ts +57 -0
  453. package/dist/trace/redact.js +962 -168
  454. package/dist/trace/self-minted-wire.d.ts +349 -1
  455. package/dist/trace/self-minted-wire.js +118 -1
  456. package/dist/trace/wire-projection-faces.d.ts +304 -2
  457. package/dist/trace/wire-projection-faces.js +160 -13
  458. package/dist/url-refusal.js +2 -0
  459. package/dist/web-admin-client/apply-effective.d.ts +12 -0
  460. package/dist/web-admin-client/apply-effective.js +56 -5
  461. package/dist/web-admin-client/facade.d.ts +1 -1
  462. package/dist/web-admin-client/facade.js +1 -1
  463. package/dist/web-admin-client/read-face.js +5 -9
  464. package/dist/web-admin-client/skills-mcp.d.ts +1 -1
  465. package/dist/web-admin-client/skills-mcp.js +6 -8
  466. package/dist/web-admin-client/types.d.ts +1 -1
  467. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +57 -9
  468. package/package.json +8 -4
  469. package/scripts/drain-check-local.mjs +34 -2
  470. package/scripts/drain-check.mysql.sql +20 -2
  471. package/scripts/drain-check.pg.sql +20 -2
  472. package/dist/mcp-tool-faces.d.ts +0 -69
  473. package/dist/mcp-tool-faces.js +0 -106
@@ -0,0 +1,136 @@
1
+ /**
2
+ * **审批账本的留存律**(一处成文;问账三形 + local 审计账同一条)。
3
+ *
4
+ * ## 律
5
+ * 一问一旦**结了**,且它**最后一次动静**早于 `now − APPROVAL_ASK_RETENTION_MS`,它在审批账本里的全部记录就在维护拍上**整问**删掉;
6
+ * 没结的问永不按龄删;删只删整问,从不改写留下的记录;每次真删了东西都有读数。`APPROVAL_ASK_RETENTION_MS=0` = 不删(永久保留)。
7
+ *
8
+ * **「结了」= 该问在它那本账里到了终局,且它挂靠的东西都不再能动**。后半句对两本账同一条:
9
+ * · **挂靠**:问行 / 审计组上的三格 —— 发起它的 run(`task_id`)、宿主会话(`session_id`)、发问那条腿的会话(`source_task_id`);
10
+ * · **还能动**:run 账上 `RUN_STATUS_CLASS` 的 live / parked 两类(跑着、停驻在门上);后台子代账上 running / parked 的子代(子代的问
11
+ * 记在**宿主** run 与宿主会话名下 —— 继承链闭包携宿主身份 —— 而子代可以比宿主 run 活得久,所以子代的宿主 run、宿主会话与它自己的会话
12
+ * 都算挂靠);以及 checkpoint 店里**每一只待决的 checkpoint**(停驻不论是谁的 —— run、后台子代、workflow 子代 —— 都是一只待决 checkpoint,
13
+ * 它的会话 = 停驻那条腿的会话 = 那条腿上问行的 `source_task_id`):一个来源盖住所有停驻,不必逐个枚举会停驻的东西。
14
+ * 还能动的东西会回读或续写它挂靠的问 —— 会话授权的争议判据按「这次调用在这条腿上有没有行」读问账(没有行 = 从没问过 ⇒ 一揽子放行可以
15
+ * 代答;拒绝行若被删,就成了代答),停驻问的迟到结算要审计账里那一问的前置事实。所以一次清扫先列出还能动的东西的挂靠集
16
+ * ({@link collectMovableAnchors}),两本账都把挂靠在集里的问整只跳过。
17
+ * 前半句各账一句,判据都住在各自的属主里(本文件不复述,只排期与读数):
18
+ * · 问账(Memory / File / SQL 三形同两只动词,各是一条语句):`reapSettledAsks` —— 行在终态(`ASK_TERMINAL`)且不是 provisional
19
+ * (版本化补偿还能改它)∧ `updatedAtMs` 早于 cutoff ∧ run 不在还能动的集里;`reapEmptyBatches` —— 批是问的容器,批里已经没有问
20
+ * ∧ 批自己的 `updatedAtMs` 也早于 cutoff 才删。
21
+ * · 审计账(`FileApprovalAskAuditStore.rotateOlderThan`,local 车道):这一问不再欠下一次起服收敛一个答案(起服收敛的判官此刻不会把它收成孤儿)
22
+ * ∧ run 不在还能动的集里 ∧ 该问所有记录里最晚的时刻早于 cutoff ⇒ 整问的行一起离开文件,留下的行逐字节不变。
23
+ *
24
+ * ## 为什么挂在维护 tick 上、而不是托管留存车道
25
+ * 那条车道(`boot/retention-lane.ts`)只认 SQL 后端、缺省关,在 local 上根本不存在 —— 用它就做不到「File 与 SQL 同一条律、缺省生效」。
26
+ * 维护 tick 是所有按龄删行的腿的宿主(多副本各扫各的、幂等):问账的删除谓词是纯行谓词,两副本同扫只是一方删到零行。
27
+ *
28
+ * ## 节律
29
+ * 一次清扫至多每 {@link APPROVAL_ASK_RETENTION_PASS_MS} 一次(首拍即跑):窗以天计,清扫的迟到以小时计,无关紧要;而一次清扫的成本
30
+ * (SQL 上按状态扫终态行、local 上重读并重写审计账)不该每分钟付一次。问账一批至多 {@link APPROVAL_ASK_REAP_BATCH} 只,一次清扫内连删到
31
+ * 不满一批为止(积压按批渐进清空,每条语句都短)。
32
+ *
33
+ * ## 读数
34
+ * 每条语句(一次店动词调用)要么删了并交回删掉的行数、要么一行没删就抛 —— 读数按语句累计、计数器按语句当场加,一次清扫半途失败时
35
+ * 已经删掉的照样进 `approval_ask_retention_swept`(带 `incomplete: true`),错误再抛给维护 tick 的节流 catch。删掉的行没有第二次读数的机会。
36
+ */
37
+ import type { ApprovalAskStore } from "./plugins/approval-ask-store-sql.js";
38
+ import type { FileApprovalAskAuditStore } from "./approval-ask-audit-store.js";
39
+ import type { Logger } from "./observability/logger.js";
40
+ import type { Metrics } from "./observability/metrics.js";
41
+ import type { BackgroundAgentRecord } from "@sema-agent/core";
42
+ /** 缺省保留窗:30 天。 */
43
+ export declare const APPROVAL_ASK_RETENTION_DEFAULT_MS: number;
44
+ /**
45
+ * 正值的下限:1 天(低于即钳到 1 天并点名)。还能动的 run 的问本来就不删(见文件头);下限管的是**刚结束**的 run:
46
+ * 客户端在 run 结束后还可能对它的卡做幂等重试 / 晚答(决断口回放首决、晚答口回 409 / 410 而不是 404),一天吸收这一段。
47
+ */
48
+ export declare const APPROVAL_ASK_RETENTION_FLOOR_MS = 86400000;
49
+ /** 两次清扫之间的最短间隔(见文件头「节律」)。 */
50
+ export declare const APPROVAL_ASK_RETENTION_PASS_MS = 3600000;
51
+ /** 问账一批至多删多少只问(批行同界);列 run 账时的一页也取这个数。 */
52
+ export declare const APPROVAL_ASK_REAP_BATCH = 500;
53
+ /**
54
+ * 「还能动」的 run 状态词 —— 从 `RUN_STATUS_CLASS` 派生(parked 类在前、live 类在后),不手抄词表:run 账加一个词,它当场归一类。
55
+ * 🔴 **次序是承重的**(codex 验证轮 V2 / 验证二轮 W2):run 账按状态一词一查,两次查询之间 run 可以换态。停驻 → 跑着 → 再停驻:
56
+ * 途中被**续跑**(parked → live)的 run 在跑着那一查里在;续跑**失败退回**停驻(parked → live → parked,`resume-legs` 的可重试拒臂把 run 放回
57
+ * suspended、checkpoint 不换)在末一查里在。只在途中「跑着 → 停驻 → 跑着」两头都漏 —— 它无害:停驻之后的问只会更新(停驻那一刻的问比
58
+ * cutoff 新),早于 cutoff 的旧问属于已经结束的腿(续跑换新 legKey,争议判据按腿读),迟到决议也早在那些腿续跑时就受理过了;停驻本身另由
59
+ * 待决 checkpoint 那一源盖住。漏一条还要途中换三次态以上。
60
+ */
61
+ export declare const MOVABLE_RUN_STATUSES: readonly string[];
62
+ /** 审计账一次轮转的读数:删掉的问数 / 删掉的行数(含无主的腿记录)/ 留下的行数。 */
63
+ export interface AuditRotationReading {
64
+ droppedAsks: number;
65
+ droppedRecords: number;
66
+ keptRecords: number;
67
+ }
68
+ /** 一次清扫的读数(进 `approval_ask_retention_swept` 行)。 */
69
+ export interface ApprovalAskRetentionReading {
70
+ cutoffMs: number;
71
+ asks: number;
72
+ batches: number;
73
+ auditAsks: number;
74
+ auditRecords: number;
75
+ }
76
+ /** 问账 / 审计账 / run 账各自的窄口(测试用字面量驱动同一段生产代码;生产传整只店)。 */
77
+ export type ApprovalAskReapPort = Pick<ApprovalAskStore, "reapSettledAsks" | "reapEmptyBatches">;
78
+ export type AuditRotationPort = Pick<FileApprovalAskAuditStore, "rotateOlderThan">;
79
+ export interface MovableRunPort {
80
+ listRuns(opts: {
81
+ status?: string;
82
+ limit: number;
83
+ cursor?: {
84
+ createdAt: string;
85
+ taskId: string;
86
+ };
87
+ }): Promise<ReadonlyArray<{
88
+ taskId: string;
89
+ sessionId: string;
90
+ createdAt: string;
91
+ }>>;
92
+ }
93
+ /** checkpoint 店的窄口:每一只待决 checkpoint 的会话(不按门型过滤 —— 运维队列 `listPending` 会藏起门型读不出、却仍能被决的行)。 */
94
+ export interface MovableCheckpointPort {
95
+ listPendingSessionIds(): Promise<readonly string[]>;
96
+ }
97
+ /** 后台子代账的窄口(core `BackgroundAgentStore` 的两只运维面)。 */
98
+ export interface MovableBackgroundAgentPort {
99
+ listScopes?(): Promise<string[]>;
100
+ listByScope(scope: string): Promise<ReadonlyArray<{
101
+ owner: string;
102
+ sessionId?: string;
103
+ parentSessionId?: string;
104
+ rootSessionId?: string;
105
+ status: BackgroundAgentRecord["status"];
106
+ }>>;
107
+ }
108
+ /**
109
+ * 还能动的东西的**挂靠集**(见文件头):run 账上每个 {@link MOVABLE_RUN_STATUSES} 词按 `listRuns` 的键集游标翻页列全,收 run id 与它的会话;
110
+ * 后台子代账逐 scope 一次列全(不带状态过滤 ⇒ 每个 scope 一次快照,子代在两种能动态之间换不会漏),能动的子代收它的 owner(task 作用域 =
111
+ * 宿主 run;会话作用域 = 会话)、宿主会话两格与它自己的会话;checkpoint 店的待决行一次列全,收它的会话。任一账读不出 ⇒ 抛 ⇒ 这次清扫
112
+ * 一行不删(证不出哪些不能动,就不删);
113
+ * 子代账在场却枚举不了 scope(缺 `listScopes`)同样抛。列与删之间新起的东西,它的问都比 cutoff 新,不会被删;终局不会回到能动。
114
+ */
115
+ export declare function collectMovableAnchors(input: {
116
+ runs: MovableRunPort;
117
+ backgroundAgents: MovableBackgroundAgentPort | undefined;
118
+ /** 缺席 = 本部署没有后端(没有可列的停驻;后端在场就一定交得出读口 —— `StoreBackend.checkpointReadView` 必选,没有 checkpoint 店的后端交恒空读口)。调用方取后端自己的那只读口,不看这一世开没开 durable 停驻 —— 前世 / 别的副本留下的停驻照样在店里。 */
119
+ checkpoints: MovableCheckpointPort | undefined;
120
+ }): Promise<ReadonlySet<string>>;
121
+ /**
122
+ * 一次清扫:先列还能动的东西的挂靠集,再用同一个 cutoff 与同一只集敲问账(问 / 批各按批删到不满一批)、再轮转审计账。每条语句的删除数当场进计数
123
+ * `approval_ask_retention_rows_deleted_total{ledger}`;真删了东西 ⇒ 一行 `approval_ask_retention_swept`(半途失败也打,带 `incomplete: true`,
124
+ * 然后把错误原样抛给调用方 —— 维护 tick 的具名节流 catch 接住,连败即 warn)。
125
+ */
126
+ export declare function runApprovalAskRetentionPass(input: {
127
+ askStore: ApprovalAskReapPort | undefined;
128
+ audit: AuditRotationPort | undefined;
129
+ runs: MovableRunPort;
130
+ backgroundAgents: MovableBackgroundAgentPort | undefined;
131
+ checkpoints: MovableCheckpointPort | undefined;
132
+ cutoffMs: number;
133
+ logger: Pick<Logger, "info">;
134
+ metrics: Pick<Metrics, "inc">;
135
+ }): Promise<ApprovalAskRetentionReading>;
136
+ //# sourceMappingURL=approval-ask-retention.d.ts.map
@@ -0,0 +1,102 @@
1
+ import { RUN_STATUS_CLASS } from "./plugins/store-contracts.js";
2
+ export const APPROVAL_ASK_RETENTION_DEFAULT_MS = 30 * 86_400_000;
3
+ export const APPROVAL_ASK_RETENTION_FLOOR_MS = 86_400_000;
4
+ export const APPROVAL_ASK_RETENTION_PASS_MS = 3_600_000;
5
+ export const APPROVAL_ASK_REAP_BATCH = 500;
6
+ export const MOVABLE_RUN_STATUSES = [
7
+ ...Object.entries(RUN_STATUS_CLASS).filter(([, cls]) => cls === "parked"),
8
+ ...Object.entries(RUN_STATUS_CLASS).filter(([, cls]) => cls === "live"),
9
+ ...Object.entries(RUN_STATUS_CLASS).filter(([, cls]) => cls === "parked"),
10
+ ].map(([status]) => status);
11
+ const BACKGROUND_AGENT_MOVABLE = {
12
+ running: true,
13
+ parked: true,
14
+ completed: false,
15
+ failed: false,
16
+ killed: false,
17
+ };
18
+ export async function collectMovableAnchors(input) {
19
+ const anchors = new Set();
20
+ for (const status of MOVABLE_RUN_STATUSES) {
21
+ let cursor;
22
+ for (;;) {
23
+ const page = await input.runs.listRuns({ status, limit: APPROVAL_ASK_REAP_BATCH, ...(cursor !== undefined ? { cursor } : {}) });
24
+ for (const r of page) {
25
+ anchors.add(r.taskId);
26
+ anchors.add(r.sessionId);
27
+ }
28
+ const last = page[page.length - 1];
29
+ if (page.length < APPROVAL_ASK_REAP_BATCH || last === undefined)
30
+ break;
31
+ cursor = { createdAt: last.createdAt, taskId: last.taskId };
32
+ }
33
+ }
34
+ const agents = input.backgroundAgents;
35
+ if (agents !== undefined) {
36
+ if (agents.listScopes === undefined) {
37
+ throw new Error("approval ledger retention: the background-agent store cannot enumerate its scopes (no listScopes) — cannot prove which delegated children can no longer move, so nothing is aged out this pass");
38
+ }
39
+ for (const scope of await agents.listScopes()) {
40
+ for (const row of await agents.listByScope(scope)) {
41
+ if (!BACKGROUND_AGENT_MOVABLE[row.status])
42
+ continue;
43
+ for (const anchor of [row.owner, row.sessionId, row.parentSessionId, row.rootSessionId])
44
+ if (anchor !== undefined)
45
+ anchors.add(anchor);
46
+ }
47
+ }
48
+ }
49
+ if (input.checkpoints !== undefined)
50
+ for (const sessionId of await input.checkpoints.listPendingSessionIds())
51
+ anchors.add(sessionId);
52
+ return anchors;
53
+ }
54
+ export async function runApprovalAskRetentionPass(input) {
55
+ const { askStore, audit, runs, backgroundAgents, checkpoints, cutoffMs, logger, metrics } = input;
56
+ const reading = { cutoffMs, asks: 0, batches: 0, auditAsks: 0, auditRecords: 0 };
57
+ const count = (ledger, n) => {
58
+ if (n > 0)
59
+ metrics.inc("approval_ask_retention_rows_deleted_total", { ledger }, n);
60
+ };
61
+ const report = (incomplete) => {
62
+ if (reading.asks === 0 && reading.batches === 0 && reading.auditRecords === 0)
63
+ return;
64
+ logger.info("approval_ask_retention_swept", {
65
+ ...reading,
66
+ ...(incomplete ? { incomplete: true } : {}),
67
+ note: "settled approval asks quiet for longer than APPROVAL_ASK_RETENTION_MS, with nothing they hang off (their run, host session or asking leg's session) still able to move, were deleted whole from the approval ledgers (ask rows, emptied batches, and their audit-ledger records); records that remain are byte-for-byte unchanged. Set APPROVAL_ASK_RETENTION_MS=0 to keep everything.",
68
+ });
69
+ };
70
+ try {
71
+ const movable = await collectMovableAnchors({ runs, backgroundAgents, checkpoints });
72
+ if (askStore !== undefined) {
73
+ for (;;) {
74
+ const n = await askStore.reapSettledAsks(cutoffMs, APPROVAL_ASK_REAP_BATCH, movable);
75
+ reading.asks += n;
76
+ count("asks", n);
77
+ if (n < APPROVAL_ASK_REAP_BATCH)
78
+ break;
79
+ }
80
+ for (;;) {
81
+ const n = await askStore.reapEmptyBatches(cutoffMs, APPROVAL_ASK_REAP_BATCH);
82
+ reading.batches += n;
83
+ count("batches", n);
84
+ if (n < APPROVAL_ASK_REAP_BATCH)
85
+ break;
86
+ }
87
+ }
88
+ if (audit !== undefined) {
89
+ const rotated = audit.rotateOlderThan(cutoffMs, movable);
90
+ reading.auditAsks += rotated.droppedAsks;
91
+ reading.auditRecords += rotated.droppedRecords;
92
+ count("audit", rotated.droppedRecords);
93
+ }
94
+ }
95
+ catch (err) {
96
+ report(true);
97
+ throw err;
98
+ }
99
+ report(false);
100
+ return reading;
101
+ }
102
+ //# sourceMappingURL=approval-ask-retention.js.map
@@ -23,6 +23,8 @@
23
23
  import { z } from "zod";
24
24
  import { ALLOW_RULE_MEMBERS, READ_ROOT_CANDIDATE_DIR_MAX, type AskClass, type AskEvidenceAbsence, type PendingAction as CorePendingAction, type ReadRootGrantCandidate, type ResumeStartupCause, type RuleOffer, type RuleOffersAbsence as CoreRuleOffersAbsence, type SteerReplayFacet } from "@sema-agent/core";
25
25
  import type { AskRow } from "./plugins/approval-ask-store-sql.js";
26
+ import type { SettleCause, SettleOutcome } from "./approval-deny-reasons.js";
27
+ import type { ToolApprovalFrame } from "./tool-approval.js";
26
28
  /** 模型自由文本(`sourceAgentName` / `delegation.agentName`)的限长(设计稿 §6.2)。设计 §3.1 把
27
29
  * 「限长 + 脱敏」写成 **server 新增责任**(引擎无此层):spawning model 挑的名字是自由文本,
28
30
  * 不能指望壳去截——一条 100KB 的 agentName 在 server 侧就该被拒,而不是变成一张撑爆呈卡面的卡。 */
@@ -82,8 +84,8 @@ export declare const RuleOfferSchema: z.ZodUnion<readonly [z.ZodObject<{
82
84
  rule: z.ZodString;
83
85
  match: z.ZodEnum<{
84
86
  name: "name";
85
- path: "path";
86
87
  host: "host";
88
+ path: "path";
87
89
  exact: "exact";
88
90
  prefix: "prefix";
89
91
  wildcard: "wildcard";
@@ -99,8 +101,8 @@ export declare const RuleOfferSchema: z.ZodUnion<readonly [z.ZodObject<{
99
101
  rule: z.ZodString;
100
102
  match: z.ZodEnum<{
101
103
  name: "name";
102
- path: "path";
103
104
  host: "host";
105
+ path: "path";
104
106
  exact: "exact";
105
107
  prefix: "prefix";
106
108
  wildcard: "wildcard";
@@ -167,8 +169,8 @@ export declare const RuleOfferRawSchema: z.ZodUnion<readonly [z.ZodObject<{
167
169
  rule: z.ZodString;
168
170
  match: z.ZodEnum<{
169
171
  name: "name";
170
- path: "path";
171
172
  host: "host";
173
+ path: "path";
172
174
  exact: "exact";
173
175
  prefix: "prefix";
174
176
  wildcard: "wildcard";
@@ -184,8 +186,8 @@ export declare const RuleOfferRawSchema: z.ZodUnion<readonly [z.ZodObject<{
184
186
  rule: z.ZodString;
185
187
  match: z.ZodEnum<{
186
188
  name: "name";
187
- path: "path";
188
189
  host: "host";
190
+ path: "path";
189
191
  exact: "exact";
190
192
  prefix: "prefix";
191
193
  wildcard: "wildcard";
@@ -631,8 +633,8 @@ export declare const ApprovalCardSchema: z.ZodObject<{
631
633
  rule: z.ZodString;
632
634
  match: z.ZodEnum<{
633
635
  name: "name";
634
- path: "path";
635
636
  host: "host";
637
+ path: "path";
636
638
  exact: "exact";
637
639
  prefix: "prefix";
638
640
  wildcard: "wildcard";
@@ -648,8 +650,8 @@ export declare const ApprovalCardSchema: z.ZodObject<{
648
650
  rule: z.ZodString;
649
651
  match: z.ZodEnum<{
650
652
  name: "name";
651
- path: "path";
652
653
  host: "host";
654
+ path: "path";
653
655
  exact: "exact";
654
656
  prefix: "prefix";
655
657
  wildcard: "wildcard";
@@ -715,8 +717,8 @@ export declare const ApprovalCardSchema: z.ZodObject<{
715
717
  }, z.core.$strict>>>;
716
718
  personalRuleDotsAbsent: z.ZodOptional<z.ZodCustom<AskEvidenceAbsence, AskEvidenceAbsence>>;
717
719
  }, z.core.$strict>>;
718
- askClass: z.ZodOptional<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>;
719
- classes: z.ZodOptional<z.ZodArray<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>>;
720
+ askClass: z.ZodOptional<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>;
721
+ classes: z.ZodOptional<z.ZodArray<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>>;
720
722
  fromSubagent: z.ZodOptional<z.ZodLiteral<true>>;
721
723
  sourceTaskId: z.ZodOptional<z.ZodString>;
722
724
  sourceAgentName: z.ZodOptional<z.ZodString>;
@@ -728,10 +730,13 @@ export declare const ApprovalCardSchema: z.ZodObject<{
728
730
  }, z.core.$strict>;
729
731
  export type ApprovalCard = z.infer<typeof ApprovalCardSchema>;
730
732
  /**
731
- * `approval_ask.card_json` 里真正存的东西(设计稿 §6.2)。存**信封**而不是裸卡的理由:重放帧要回填
732
- * 车2 铸的 `approvalId`(wire 面的回决通道桥 + 消费端与并行 `tool_approval` 帧的去重键),而它不属于
733
- * 「卡的内容」——放进卡里会让 schema 的语义边界糊掉。`schemaVersion` 是形的版本闩(与行上的
733
+ * `approval_ask.card_json` 里真正存的东西(设计稿 §6.2)。`schemaVersion` 是形的版本闩(与行上的
734
734
  * `schema_version` 列同值,列供 SQL 侧过滤,信封里这份供读面在解出内容**之前**判形)。
735
+ *
736
+ * `approvalId` = 这张卡**呈出时**的 wire 身份。7.133.0 起它恒等于行的键 `askId`(一只 ask 一只 wire 身份),本服务的活读者(重放帧 /
737
+ * 应答口 / 读口)一律读行的键、不读这一格;写它是给滚动升级窗里上一版的副本(它们的 strict 信封 schema 要求这一格并照它重放)。
738
+ * 唯一读这一格的是 local 车道的启动收敛 —— 拿它去审计账里查前世这只 ask 的成因:审计行记的就是当时呈出的那个 id
739
+ * (更早写下的行上是当年的登记本地 id)。
735
740
  */
736
741
  export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
737
742
  schemaVersion: z.ZodLiteral<1>;
@@ -766,8 +771,8 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
766
771
  rule: z.ZodString;
767
772
  match: z.ZodEnum<{
768
773
  name: "name";
769
- path: "path";
770
774
  host: "host";
775
+ path: "path";
771
776
  exact: "exact";
772
777
  prefix: "prefix";
773
778
  wildcard: "wildcard";
@@ -783,8 +788,8 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
783
788
  rule: z.ZodString;
784
789
  match: z.ZodEnum<{
785
790
  name: "name";
786
- path: "path";
787
791
  host: "host";
792
+ path: "path";
788
793
  exact: "exact";
789
794
  prefix: "prefix";
790
795
  wildcard: "wildcard";
@@ -850,8 +855,8 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
850
855
  }, z.core.$strict>>>;
851
856
  personalRuleDotsAbsent: z.ZodOptional<z.ZodCustom<AskEvidenceAbsence, AskEvidenceAbsence>>;
852
857
  }, z.core.$strict>>;
853
- askClass: z.ZodOptional<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>;
854
- classes: z.ZodOptional<z.ZodArray<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>>;
858
+ askClass: z.ZodOptional<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>;
859
+ classes: z.ZodOptional<z.ZodArray<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>>;
855
860
  fromSubagent: z.ZodOptional<z.ZodLiteral<true>>;
856
861
  sourceTaskId: z.ZodOptional<z.ZodString>;
857
862
  sourceAgentName: z.ZodOptional<z.ZodString>;
@@ -958,16 +963,33 @@ export declare function buildApprovalRequestFrame(input: {
958
963
  card: ApprovalCard;
959
964
  expiresAtMs: number;
960
965
  nowMs: number;
966
+ live: ApprovalRequestLiveFacts;
961
967
  }): ApprovalRequestFrame;
962
968
  /**
963
- * [ref] §3.1 的呈卡帧(设计稿 §4.1 逐字)。
969
+ * 🔴 **呈卡帧的活面事实座**(呈卡腿上旧族退役之后,开卡帧的全部事实都由本族承载)。
970
+ *
971
+ * 这十个座是活卡帧 `tool_approval` 上有、而卡(`ApprovalCardSchema`,`card_json` 的耐久信封)上**没有**的那几位:
972
+ * 卡外的事实此前只骑活卡帧,呈卡腿的消费方靠「两帧按 approvalId 合读」拿到它们。呈卡腿自此只发本族帧 ⇒ 它们挪到**活铸**的
973
+ * 呈卡帧顶层,同名同型同值 —— 值取自同一只帧对象(活卡帧的那一次铸定,`tool-approval.ts` 的 `askBroadcast`),本仓不另算一遍。
964
974
  *
965
- * 与既有 `tool_approval` 帧是**并行加帧、不替换**(§4.2):存量壳只认旧帧,新帧是闭集加员;两帧同带
966
- * `approvalId`,消费端据它去重。
975
+ * 在场面与它们在活卡帧上的在场面**逐字相同**:只在活铸的帧上,断连重放帧({@link buildReplayFrame},从 `card_json` 回读)上恒缺席 ——
976
+ * 活卡帧从来不重放,卡外事实也从来不在重放面上;是否把其中某几位收进卡(耐久、随重放)是另一件事,各自要过 `.strict()` 信封的回滚窗判断
977
+ * (`readRootCandidate` 有不进卡的硬理由:耐久面兑现不了它,见活卡帧该座顶注)。
967
978
  *
968
- * 🔴 铸造/发射**不在刀 3c**(那是 3b 的域)。本文件只出「持久行 → 帧」的重放投影 `buildReplayFrame`。
979
+ * `requiresRealApproval` 不在表里:卡上 `risk.requiresRealApproval` 是同一个事实(铸卡第三参就是它),一个事实一个读法。
969
980
  */
970
- export interface ApprovalRequestFrame {
981
+ export declare const APPROVAL_REQUEST_LIVE_FACT_KEYS: readonly ["mandated", "mandate", "origin", "boundGrantDigest", "boundGrants", "classifierNoRuling", "boundGrantAbsence", "approvalCard", "readRootCandidate", "probeReason"];
982
+ /** 呈卡帧活面事实座的类型面 = 活卡帧同名座的 `Pick`(同型由构造保证,不手抄)。 */
983
+ export type ApprovalRequestLiveFacts = Pick<ToolApprovalFrame, (typeof APPROVAL_REQUEST_LIVE_FACT_KEYS)[number]>;
984
+ /**
985
+ * [ref] §3.1 的呈卡帧(设计稿 §4.1 逐字)。
986
+ *
987
+ * 🔴 **一条腿一个帧族**:呈卡协议在一条腿上场(腿的审批上下文接了 `emitCard`)⇒ 这条腿上一只 ask 的开卡 / 消卡 / 撤卡只走本族
988
+ * (`approval_request` / {@link ApprovalCompleteFrame} / {@link ApprovalRevokeFrame}),旧族 `tool_approval` / `tool_approval_complete`
989
+ * 一帧都不发;协议未上场的腿只发旧族。同一只 ask 在同一条腿上不再有两种开卡帧,消费方不再按 `approvalId` 去重。
990
+ * 开卡的全部事实因此在本帧上:卡(`card`,耐久信封)+ 活面事实座({@link ApprovalRequestLiveFacts},只在活铸的帧上)。
991
+ */
992
+ export interface ApprovalRequestFrame extends ApprovalRequestLiveFacts {
971
993
  /** = SSE 具名事件名(与 `tool_approval` 同约定)。 */
972
994
  type: "approval_request";
973
995
  schemaVersion: 1;
@@ -984,12 +1006,50 @@ export interface ApprovalRequestFrame {
984
1006
  expiresAtMs: number;
985
1007
  serverNowMs: number;
986
1008
  /**
987
- * server 扩(不在设计字面):车4 落地前的**回决通道桥**——现行
988
- * `POST /v1/tool-approvals/:id/respond` 的 id。也是消费端把本帧与并行的 `tool_approval` 帧去重的键。
989
- * 车4 上线后仍保留(旧壳过渡窗)。
1009
+ * server 扩(不在设计字面):`POST /v1/tool-approvals/:id/respond` / `GET /v1/tool-approvals/:id` 的 id —— **恒等于 `askId`**(行的键就是这只 ask
1010
+ * 唯一的 wire 身份;本族的消卡帧({@link ApprovalCompleteFrame})同带它)。
990
1011
  */
991
1012
  approvalId: string;
992
1013
  }
1014
+ /**
1015
+ * 呈卡族的**单卡消卡帧**(`approval_complete`)—— 一只 ask 落定时发给每一条**收到过它的呈卡帧**的呈卡腿连接。
1016
+ *
1017
+ * 语义与旧族 `tool_approval_complete` 逐字同一件事(同一次 settle 的同一份判决:`outcome` 三词、非人结局的 `cause`、park 路由的
1018
+ * `parked`),只是它属于本族:键与开卡帧对位(`askId` / `taskId` / `approvalId`,开卡帧上有的身份这里都有),消卡按开卡那一帧的键。
1019
+ * 与 {@link ApprovalRevokeFrame} 的分工:撤卡帧是**批级**的(兄弟被赢家连坐成 `VOID` 的那一批,名单 = 那一次原子事务的行集,
1020
+ * 不带逐卡终局);本帧是**单卡**的终局(人答 / 窗到期 / park 路由 / 取消 …)。同一只 ask 两帧都可能收到(被撤的兄弟自己的
1021
+ * 登记也按 settle 收场)—— 按 `askId` 清卡即可,两帧不冲突。
1022
+ *
1023
+ * 投递口 = 开卡帧的同一只口(`ToolApprovalRunContext.emitCard`):卡帧在哪,消卡帧就在哪(sync 腿 live + detach 账本,bg / resume 腿账本)。
1024
+ * 门 = 这条连接的**开卡帧真的送达过**(没见过开卡帧的连接收到消卡帧就是孤儿 close,与旧族同一条门)。
1025
+ */
1026
+ export interface ApprovalCompleteFrame {
1027
+ /** = SSE 具名事件名(同 `approval_request` 约定)。 */
1028
+ type: "approval_complete";
1029
+ schemaVersion: 1;
1030
+ askId: string;
1031
+ taskId: string;
1032
+ approvalId: string;
1033
+ /** 这只 ask 怎么落定 —— 与审计 settle 行 `outcome` 同三词(`allowed` / `denied` = 一次决议;`expired` = 非人结局)。 */
1034
+ outcome: SettleOutcome;
1035
+ /** 非人结局的成因(与审计 settle 行 `cause` 同一个词);人答缺席。缺席不是证据。 */
1036
+ cause?: SettleCause;
1037
+ /** 这只 ask 按 park 路由收尾(行已转 PARKING / PARKED、迟到回决可达)。缺席 = 无证据,禁读作真拒。 */
1038
+ parked?: true;
1039
+ serverNowMs: number;
1040
+ }
1041
+ /** 单卡消卡帧的纯构造(`build*`:纯数据)。可选座只在有值时写键。 */
1042
+ export declare function buildApprovalCompleteFrame(input: {
1043
+ askId: string;
1044
+ taskId: string;
1045
+ approvalId: string;
1046
+ outcome: SettleOutcome;
1047
+ cause?: SettleCause;
1048
+ parked: boolean;
1049
+ nowMs: number;
1050
+ }): ApprovalCompleteFrame;
1051
+ /** 呈卡腿的单卡帧(开卡 / 消卡)—— `ToolApprovalRunContext.emitCard` 的入参形。 */
1052
+ export type ApprovalCardLegFrame = ApprovalRequestFrame | ApprovalCompleteFrame;
993
1053
  /**
994
1054
  * [ref] §3.3 的**批级撤卡帧**(车6;设计稿 §3 逐字)。
995
1055
  *
@@ -1,9 +1,9 @@
1
1
  import { z } from "zod";
2
- import { ALLOW_RULE_MEMBERS, ASK_EVIDENCE_ABSENCE_VALUES, BOUND_GRANT_ABSENCES, MAX_RULE_TEXT_CHARS, READ_ROOT_CANDIDATE_DIR_MAX, RESUME_STARTUP_CAUSES, RULE_OFFERS_ABSENCES, STEER_REPLAY_FACETS, isAskClass, isAskOrigin, isAutoModeFallbackCause, isMintableProbeReason, isPersistedRuleMandate, screenAskClassMembers } from "@sema-agent/core";
2
+ import { ALLOW_RULE_MEMBERS, ASK_EVIDENCE_ABSENCE_VALUES, BOUND_GRANT_ABSENCES, MAX_RULE_TEXT_CHARS, PERSISTED_RULE_MATCHES, UNCOVERED_SEGMENT_REASONS, READ_ROOT_CANDIDATE_DIR_MAX, RESUME_STARTUP_CAUSES, RULE_OFFERS_ABSENCES, STEER_REPLAY_FACETS, isAskClass, isAskOrigin, isAutoModeFallbackCause, isMintableProbeReason, isPersistedRuleMandate, screenAskClassMembers } from "@sema-agent/core";
3
3
  import { redactSecrets } from "./trace/redact.js";
4
4
  import { recordFailOpen } from "./observability/fail-open.js";
5
+ import { capText } from "./caller-text-echo.js";
5
6
  import { retireParkArmWords, retireStoredCardWords } from "./retired-card-words.js";
6
- import { PERSISTED_RULE_MATCHES, UNCOVERED_SEGMENT_REASONS } from "./permission-rule-vocab.js";
7
7
  export const MAX_AGENT_NAME = 200;
8
8
  const MAX_IDENT = 200;
9
9
  export const MAX_RULE_OFFERS = 4;
@@ -450,11 +450,6 @@ const RiskAxesEnvelopeSchema = z.object({
450
450
  })
451
451
  .optional(),
452
452
  });
453
- function clip(s, max) {
454
- if (s === undefined)
455
- return undefined;
456
- return s.length > max ? s.slice(0, max) : s;
457
- }
458
453
  export function buildApprovalCard(source, req, requiresRealApproval) {
459
454
  const axes = RiskAxesEnvelopeSchema.safeParse(req);
460
455
  const riskAxes = axes.success ? axes.data.riskAxes : undefined;
@@ -463,13 +458,13 @@ export function buildApprovalCard(source, req, requiresRealApproval) {
463
458
  const ruleOffersAbsence = readRuleOffersAbsence(req);
464
459
  const denialLimitFallback = readDenialLimitFallback(req);
465
460
  const askClassPair = readAskClassPair(source);
466
- const toolCallId = clip(source.toolCallId, MAX_IDENT);
467
- const sourceTaskId = clip(source.sourceTaskId, MAX_IDENT);
468
- const sourceAgentName = clip(source.sourceAgentName, MAX_AGENT_NAME);
461
+ const toolCallId = capText(source.toolCallId, MAX_IDENT);
462
+ const sourceTaskId = capText(source.sourceTaskId, MAX_IDENT);
463
+ const sourceAgentName = capText(source.sourceAgentName, MAX_AGENT_NAME);
469
464
  const allowRuleShadowed = readAllowRuleShadowed(req);
470
465
  return {
471
- toolName: clip(source.toolName, MAX_IDENT) ?? "",
472
- message: clip(source.message, MAX_MESSAGE) ?? "",
466
+ toolName: capText(source.toolName, MAX_IDENT) ?? "",
467
+ message: capText(source.message, MAX_MESSAGE) ?? "",
473
468
  ...(source.argsOmitted === true ? { argsOmitted: true } : source.args !== undefined ? { args: source.args } : {}),
474
469
  ...(toolCallId !== undefined ? { toolCallId } : {}),
475
470
  risk: {
@@ -493,9 +488,9 @@ export function buildApprovalCard(source, req, requiresRealApproval) {
493
488
  ...(source.delegation
494
489
  ? {
495
490
  delegation: {
496
- parentToolCallId: clip(source.delegation.parentToolCallId, MAX_IDENT) ?? "",
491
+ parentToolCallId: capText(source.delegation.parentToolCallId, MAX_IDENT) ?? "",
497
492
  depth: source.delegation.depth,
498
- ...(source.delegation.agentName !== undefined ? { agentName: clip(source.delegation.agentName, MAX_AGENT_NAME) ?? "" } : {}),
493
+ ...(source.delegation.agentName !== undefined ? { agentName: capText(source.delegation.agentName, MAX_AGENT_NAME) ?? "" } : {}),
499
494
  },
500
495
  }
501
496
  : {}),
@@ -532,6 +527,41 @@ export function buildApprovalRequestFrame(input) {
532
527
  expiresInMs: Math.max(0, input.expiresAtMs - input.nowMs),
533
528
  serverNowMs: input.nowMs,
534
529
  approvalId: input.approvalId,
530
+ ...pickApprovalRequestLiveFacts(input.live),
531
+ };
532
+ }
533
+ export const APPROVAL_REQUEST_LIVE_FACT_KEYS = [
534
+ "mandated",
535
+ "mandate",
536
+ "origin",
537
+ "boundGrantDigest",
538
+ "boundGrants",
539
+ "classifierNoRuling",
540
+ "boundGrantAbsence",
541
+ "approvalCard",
542
+ "readRootCandidate",
543
+ "probeReason",
544
+ ];
545
+ function pickApprovalRequestLiveFacts(src) {
546
+ const out = {};
547
+ for (const key of APPROVAL_REQUEST_LIVE_FACT_KEYS) {
548
+ const v = src[key];
549
+ if (v !== undefined)
550
+ out[key] = v;
551
+ }
552
+ return out;
553
+ }
554
+ export function buildApprovalCompleteFrame(input) {
555
+ return {
556
+ type: "approval_complete",
557
+ schemaVersion: 1,
558
+ askId: input.askId,
559
+ taskId: input.taskId,
560
+ approvalId: input.approvalId,
561
+ outcome: input.outcome,
562
+ ...(input.cause !== undefined ? { cause: input.cause } : {}),
563
+ ...(input.parked ? { parked: true } : {}),
564
+ serverNowMs: input.nowMs,
535
565
  };
536
566
  }
537
567
  export function buildRevokeFrame(batchId, askIds, reason, serverNowMs, originTaskId) {
@@ -551,7 +581,7 @@ export function buildReplayFrame(row, nowMs) {
551
581
  expiresAtMs: row.expiresAtMs,
552
582
  expiresInMs: Math.max(0, row.expiresAtMs - nowMs),
553
583
  serverNowMs: nowMs,
554
- approvalId: parsed.approvalId,
584
+ approvalId: row.askId,
555
585
  };
556
586
  }
557
587
  export function storedCardDemandsAPerson(cardJson) {
@@ -32,8 +32,11 @@ export interface ParkedGateFace {
32
32
  readonly approvalCard?: unknown;
33
33
  }
34
34
  /**
35
- * 停驻行的卡 = core `summarizeCheckpoint` 投给 `CheckpointSummary.approvalCard` 的那一个词:只在审批门(门型的寄存臂是
36
- * `tool_approval`,读 core `PAUSE_REGISTRY`)上读,词经 {@link readApprovalCard}。非审批门(计划审阅 / 资源 / 收尾)恒无卡。
35
+ * 停驻行的卡 —— 读法只有引擎那一只:core 包根导出 `parkedApprovalCardOf(gate)`(core 7.54.0 #1468 K2;审批门 = 门型的寄存臂是 `tool_approval`,
36
+ * 只在那里读卡,只有闭集成员算卡)。四态逐一处置(穷举 `switch`:core 加一态 ⇒ 编译红):`card` ⇒ 那个词;`no_card` / `not_approval` ⇒ 无卡;
37
+ * `unknown_word`(引擎交回**未经筛**的存储原值)⇒ 无卡 + 响亮:计一次 `server.approval-card.closed-word-out-of-set`(与 {@link readApprovalCard} 同一只计数、
38
+ * 同一只回显口径 —— 截 40、脱敏,对象只报形名)。修前本函数自己判「是不是审批门」(读 `PAUSE_REGISTRY` 的寄存臂)再交 {@link readApprovalCard},
39
+ * 与引擎的 `summarizeCheckpoint` 是两份读法。
37
40
  */
38
41
  export declare function parkedApprovalCard(gate: ParkedGateFace | undefined): ToolApprovalCard | undefined;
39
42
  /**
@@ -1,5 +1,5 @@
1
1
  export { ASK_USER_QUESTION_TOOL_NAME } from "@sema-agent/core";
2
- import { PAUSE_REGISTRY, TOOL_APPROVAL_CARDS, facetOf, isGateKind } from "@sema-agent/core";
2
+ import { TOOL_APPROVAL_CARDS, facetOf, isGateKind, parkedApprovalCardOf } from "@sema-agent/core";
3
3
  import { recordFailOpen } from "./observability/fail-open.js";
4
4
  import { redactSecrets } from "./trace/redact.js";
5
5
  export function readApprovalCard(raw) {
@@ -13,9 +13,22 @@ export function readApprovalCard(raw) {
13
13
  return undefined;
14
14
  }
15
15
  export function parkedApprovalCard(gate) {
16
- if (gate === undefined || !isGateKind(gate.kind) || PAUSE_REGISTRY[gate.kind].pending !== "tool_approval")
16
+ if (gate === undefined)
17
17
  return undefined;
18
- return readApprovalCard(gate.approvalCard);
18
+ const reading = parkedApprovalCardOf({ kind: gate.kind, approvalCard: gate.approvalCard });
19
+ switch (reading.kind) {
20
+ case "card":
21
+ return reading.card;
22
+ case "no_card":
23
+ case "not_approval":
24
+ return undefined;
25
+ case "unknown_word":
26
+ return readApprovalCard(reading.word);
27
+ default: {
28
+ const unreachable = reading;
29
+ throw new Error(`unhandled parked approval card reading: ${JSON.stringify(unreachable)}`);
30
+ }
31
+ }
19
32
  }
20
33
  export function parkedFacetOf(gate) {
21
34
  return gate !== undefined && isGateKind(gate.kind) ? facetOf({ kind: gate.kind, approvalCard: gate.approvalCard }) : undefined;
@@ -46,7 +46,7 @@ export declare const APPROVAL_ENDING_CAUSES: {
46
46
  /** 承载这张卡的流没了:断连强转 park(`parkOpenAsksForTask`,断连臂的事实 = 这个 wire run 的承载流断了;卡曾送达过,只是不会再有人从那条流上答它)。 */
47
47
  readonly STREAM_DISCONNECTED: "stream_disconnected";
48
48
  /**
49
- * 这张卡呈不出去:兜底臂(行不可用 / 身份不定 / 悬挂无行,`unattendedOutcome` 的 `persisted_row_unusable` / `ensure_indeterminate` / `unreached_no_row`)—— 持久行证不出属主或读不成,
49
+ * 这张卡呈不出去:兜底臂(行不可用 / 身份不定 / 无行且无旧族腿可呈,`unattendedOutcome` 的 `persisted_row_unusable` / `ensure_indeterminate` / `no_row_no_presenter`)—— 持久行证不出属主或读不成,
50
50
  * 本次登记根本没把卡呈到任何投递面;同 askId 的其余本地登记按这个词随行收场。与 `broadcast_lost`(emit 零接收)是两个事实。
51
51
  */
52
52
  readonly UNDELIVERABLE: "undeliverable";