@sema-agent/server 7.150.0 → 7.152.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (514) hide show
  1. package/MIGRATION.md +451 -0
  2. package/README.md +15 -3
  3. package/README.zh-CN.md +10 -2
  4. package/USAGE.md +144 -87
  5. package/deploy/sema-up/README.md +11 -4
  6. package/deploy/sema-up/chart/Chart.yaml +1 -1
  7. package/deploy/sema-up/chart/templates/NOTES.txt +5 -0
  8. package/deploy/sema-up/chart/templates/_helpers.tpl +15 -16
  9. package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -3
  10. package/deploy/sema-up/chart/templates/server.yaml +5 -3
  11. package/deploy/sema-up/chart/values-full-single.yaml +3 -1
  12. package/deploy/sema-up/chart/values.yaml +8 -1
  13. package/deploy/sema-up/cluster-up.sh +7 -6
  14. package/deploy/sema-up/kube-up.sh +6 -6
  15. package/deploy/sema-up/lib/flagshape.sh +36 -8
  16. package/deploy/sema-up/lib/helm-values-cluster.py +2 -0
  17. package/deploy/sema-up/lib/helm-values-kube.py +2 -0
  18. package/deploy/sema-up/machines.example.yaml +3 -1
  19. package/deploy/sema-up/sema-up.sh +22 -16
  20. package/dist/adoption/import.js +3 -3
  21. package/dist/approval-ask-audit-store.d.ts +1 -1
  22. package/dist/approval-ask-machine.d.ts +4 -10
  23. package/dist/approval-ask-retention.d.ts +1 -1
  24. package/dist/approval-card.d.ts +12 -14
  25. package/dist/approval-gate-currency.d.ts +9 -9
  26. package/dist/approval-gate-currency.js +3 -4
  27. package/dist/approval-hmac.d.ts +17 -1
  28. package/dist/approval-hmac.js +7 -1
  29. package/dist/approval-queue-kind.d.ts +1 -1
  30. package/dist/approval.d.ts +2 -2
  31. package/dist/approval.js +2 -2
  32. package/dist/auth-bridge.d.ts +20 -0
  33. package/dist/auth-bridge.js +9 -0
  34. package/dist/background-session-reap.d.ts +1 -1
  35. package/dist/bake-runner/main.d.ts +4 -2
  36. package/dist/bind-host.d.ts +3 -6
  37. package/dist/bind-host.js +4 -7
  38. package/dist/boot/budget-tracing.js +1 -1
  39. package/dist/boot/coordinators.d.ts +1 -1
  40. package/dist/boot/coordinators.js +9 -10
  41. package/dist/boot/device-lane.js +2 -0
  42. package/dist/boot/engine-lease.d.ts +5 -0
  43. package/dist/boot/engine-lease.js +1 -0
  44. package/dist/boot/execution-env.d.ts +9 -14
  45. package/dist/boot/execution-env.js +85 -22
  46. package/dist/boot/execution-lane.js +32 -5
  47. package/dist/boot/late-binds.d.ts +8 -4
  48. package/dist/boot/late-binds.js +7 -1
  49. package/dist/boot/leader.d.ts +31 -30
  50. package/dist/boot/leader.js +38 -28
  51. package/dist/boot/leg-path-adjudication.d.ts +40 -0
  52. package/dist/boot/leg-path-adjudication.js +18 -0
  53. package/dist/boot/memory-consolidation.d.ts +3 -2
  54. package/dist/boot/memory-consolidation.js +6 -6
  55. package/dist/boot/parked-revive-gate.js +3 -15
  56. package/dist/boot/reapers.d.ts +6 -1
  57. package/dist/boot/reapers.js +13 -2
  58. package/dist/boot/resolve-spec.d.ts +3 -3
  59. package/dist/boot/resolve-spec.js +43 -48
  60. package/dist/boot/runner-deps.d.ts +46 -35
  61. package/dist/boot/runner-deps.js +94 -91
  62. package/dist/boot/session-age-out.d.ts +36 -0
  63. package/dist/boot/session-age-out.js +101 -0
  64. package/dist/boot/session-faces.d.ts +5 -14
  65. package/dist/boot/session-faces.js +9 -5
  66. package/dist/boot/shutdown.d.ts +6 -0
  67. package/dist/boot/shutdown.js +10 -4
  68. package/dist/boot/stage-01-config.js +2 -0
  69. package/dist/boot/stage-02-web-admin-pull.js +4 -5
  70. package/dist/boot/stage-05-execution-env.d.ts +5 -3
  71. package/dist/boot/stage-05-execution-env.js +3 -2
  72. package/dist/boot/stage-06-runners.d.ts +9 -4
  73. package/dist/boot/stage-06-runners.js +24 -9
  74. package/dist/boot/stage-07-capability-layer.d.ts +8 -4
  75. package/dist/boot/stage-07-capability-layer.js +3 -2
  76. package/dist/boot/stage-08-reapers.d.ts +8 -4
  77. package/dist/boot/stage-08-reapers.js +4 -2
  78. package/dist/boot/stage-09-leader.d.ts +12 -5
  79. package/dist/boot/stage-09-leader.js +14 -5
  80. package/dist/boot/stage-10-http-server.d.ts +19 -5
  81. package/dist/boot/stage-10-http-server.js +14 -21
  82. package/dist/boot/stores.js +7 -4
  83. package/dist/boot/web-admin.js +5 -8
  84. package/dist/boot/workflow-orchestration.d.ts +7 -2
  85. package/dist/boot/workflow-orchestration.js +24 -7
  86. package/dist/bounded-rotation.d.ts +29 -0
  87. package/dist/bounded-rotation.js +24 -0
  88. package/dist/capabilities/approvals-push.d.ts +3 -3
  89. package/dist/capabilities/scenarios.d.ts +28 -13
  90. package/dist/capabilities/scenarios.js +2 -2
  91. package/dist/capability-facts.d.ts +43 -32
  92. package/dist/capability-facts.js +45 -51
  93. package/dist/card-rule-offers.d.ts +32 -0
  94. package/dist/card-rule-offers.js +130 -0
  95. package/dist/center-credential.d.ts +25 -6
  96. package/dist/center-credential.js +25 -5
  97. package/dist/config-catalog.d.ts +26 -7
  98. package/dist/config-catalog.js +26 -22
  99. package/dist/config-dir-trust.js +4 -2
  100. package/dist/config-invariants.d.ts +20 -8
  101. package/dist/config-invariants.js +55 -12
  102. package/dist/config-lkg.d.ts +5 -19
  103. package/dist/config-lkg.js +8 -62
  104. package/dist/config-provider.d.ts +1 -1
  105. package/dist/config-root-migration.d.ts +2 -2
  106. package/dist/config-types.d.ts +38 -42
  107. package/dist/config.d.ts +58 -7
  108. package/dist/config.js +90 -40
  109. package/dist/control-socket.d.ts +51 -0
  110. package/dist/control-socket.js +115 -0
  111. package/dist/deployment-governance.d.ts +2 -1
  112. package/dist/deployment-shape.d.ts +9 -1
  113. package/dist/deployment-shape.js +2 -1
  114. package/dist/device-protocol.d.ts +5 -4
  115. package/dist/device-protocol.js +1 -1
  116. package/dist/device-ws-hub.d.ts +7 -0
  117. package/dist/device-ws-hub.js +10 -3
  118. package/dist/device-ws-protocol.d.ts +63 -10
  119. package/dist/device-ws-protocol.js +56 -25
  120. package/dist/elicitation.js +2 -2
  121. package/dist/engine-identity.d.ts +19 -7
  122. package/dist/engine-identity.js +10 -2
  123. package/dist/entry-mode-clamp-notice.d.ts +2 -1
  124. package/dist/entry-problems.d.ts +40 -3
  125. package/dist/entry-problems.js +3 -1
  126. package/dist/execution-env-refusal.d.ts +29 -0
  127. package/dist/execution-env-refusal.js +8 -0
  128. package/dist/execution-lane-caps.d.ts +3 -1
  129. package/dist/field-conflict.d.ts +1 -1
  130. package/dist/file-history-capture.d.ts +11 -4
  131. package/dist/file-history-capture.js +9 -6
  132. package/dist/file-history-disclosure.d.ts +7 -5
  133. package/dist/file-history-disclosure.js +7 -5
  134. package/dist/fleet/drain-entry.d.ts +4 -0
  135. package/dist/fleet/engine-signal.d.ts +12 -29
  136. package/dist/fleet/engine-signal.js +1 -7
  137. package/dist/fleet-client.js +2 -5
  138. package/dist/gate-settlement.d.ts +1 -8
  139. package/dist/gate-settlement.js +0 -4
  140. package/dist/history-anchor.js +1 -1
  141. package/dist/hitl-delivery.d.ts +2 -3
  142. package/dist/hitl-delivery.js +0 -2
  143. package/dist/hooks/hook-llm.js +4 -2
  144. package/dist/hooks/hook-runner.d.ts +3 -2
  145. package/dist/hooks/hook-runner.js +18 -3
  146. package/dist/host-decision.d.ts +11 -11
  147. package/dist/host-lsp-manager.d.ts +2 -2
  148. package/dist/http/active-run-conflict.d.ts +35 -2
  149. package/dist/http/active-run-conflict.js +48 -19
  150. package/dist/http/admission.js +17 -2
  151. package/dist/http/approval-sweeps.d.ts +1 -1
  152. package/dist/http/approval-sweeps.js +10 -7
  153. package/dist/http/checkpoint-ctx.d.ts +4 -0
  154. package/dist/http/checkpoint-ctx.js +2 -0
  155. package/dist/http/dispatch.d.ts +8 -3
  156. package/dist/http/dispatch.js +59 -32
  157. package/dist/http/durable-run-leg.js +16 -17
  158. package/dist/http/health-reader.d.ts +16 -9
  159. package/dist/http/health-reader.js +2 -1
  160. package/dist/http/health-self-report.d.ts +9 -1
  161. package/dist/http/health-self-report.js +3 -1
  162. package/dist/http/owner-access.d.ts +33 -14
  163. package/dist/http/owner-access.js +40 -10
  164. package/dist/http/principal-gate.d.ts +49 -21
  165. package/dist/http/principal-gate.js +61 -11
  166. package/dist/http/request-channel.d.ts +23 -0
  167. package/dist/http/request-channel.js +9 -0
  168. package/dist/http/request-guards.js +17 -2
  169. package/dist/http/resume-ctx-read.js +42 -3
  170. package/dist/http/resume-legs.d.ts +4 -3
  171. package/dist/http/resume-legs.js +367 -117
  172. package/dist/http/route-ctx.d.ts +91 -15
  173. package/dist/http/route-ctx.js +17 -0
  174. package/dist/http/route-table.d.ts +5 -1
  175. package/dist/http/route-table.js +4 -0
  176. package/dist/http/routes/admin-config-refresh.js +3 -3
  177. package/dist/http/routes/admin-drain.d.ts +3 -0
  178. package/dist/http/routes/admin-drain.js +7 -7
  179. package/dist/http/routes/admin-memory-optout.d.ts +1 -1
  180. package/dist/http/routes/admin-memory-optout.js +3 -3
  181. package/dist/http/routes/adoption.js +3 -5
  182. package/dist/http/routes/agents-roster.js +2 -3
  183. package/dist/http/routes/approvals-assistant.d.ts +2 -1
  184. package/dist/http/routes/approvals-assistant.js +99 -51
  185. package/dist/http/routes/background.d.ts +3 -3
  186. package/dist/http/routes/capabilities.d.ts +4 -0
  187. package/dist/http/routes/capabilities.js +38 -10
  188. package/dist/http/routes/config-catalog.js +2 -2
  189. package/dist/http/routes/devices.js +1 -1
  190. package/dist/http/routes/diagnostics.d.ts +3 -3
  191. package/dist/http/routes/diagnostics.js +19 -7
  192. package/dist/http/routes/fleet.js +10 -8
  193. package/dist/http/routes/images.js +10 -10
  194. package/dist/http/routes/memory-bundle.js +3 -3
  195. package/dist/http/routes/memory-compliance.js +3 -3
  196. package/dist/http/routes/memory-consolidation.js +2 -2
  197. package/dist/http/routes/memory-origin.js +3 -3
  198. package/dist/http/routes/memory-policy.js +2 -2
  199. package/dist/http/routes/observability.js +3 -3
  200. package/dist/http/routes/projects.d.ts +3 -2
  201. package/dist/http/routes/projects.js +4 -5
  202. package/dist/http/routes/retention-ops.js +3 -3
  203. package/dist/http/routes/rules.js +5 -5
  204. package/dist/http/routes/run-permission-mode.d.ts +2 -1
  205. package/dist/http/routes/run-permission-mode.js +2 -2
  206. package/dist/http/routes/runs.d.ts +4 -9
  207. package/dist/http/routes/runs.js +171 -65
  208. package/dist/http/routes/session-sync.d.ts +22 -9
  209. package/dist/http/routes/session-sync.js +204 -107
  210. package/dist/http/routes/sessions-list.js +13 -7
  211. package/dist/http/routes/sessions.js +30 -15
  212. package/dist/http/routes/tasks.js +46 -41
  213. package/dist/http/routes/trace-usage.js +2 -2
  214. package/dist/http/routes/workflows.js +1 -1
  215. package/dist/http/server.d.ts +30 -30
  216. package/dist/http/server.js +16 -4
  217. package/dist/http/submit-ctx.d.ts +1 -1
  218. package/dist/http/submit-ctx.js +7 -4
  219. package/dist/http/wire-types.d.ts +14 -4
  220. package/dist/human-facing-args.d.ts +33 -0
  221. package/dist/human-facing-args.js +33 -0
  222. package/dist/identity-source.d.ts +20 -3
  223. package/dist/identity-source.js +14 -0
  224. package/dist/index.d.ts +5 -1
  225. package/dist/k8s-api-credentials.d.ts +29 -0
  226. package/dist/k8s-api-credentials.js +25 -0
  227. package/dist/lane-home-probe.d.ts +3 -7
  228. package/dist/lane-home-probe.js +2 -2
  229. package/dist/leader/diffup.d.ts +19 -0
  230. package/dist/leader/diffup.js +7 -0
  231. package/dist/leader/leader.d.ts +116 -11
  232. package/dist/leader/leader.js +69 -5
  233. package/dist/leader/repair-wire.js +2 -2
  234. package/dist/leader/run-entry.d.ts +2 -1
  235. package/dist/leader/run-entry.js +1 -1
  236. package/dist/leader/wire.d.ts +42 -132
  237. package/dist/leader/wire.js +81 -67
  238. package/dist/leg-facts.d.ts +13 -5
  239. package/dist/leg-facts.js +2 -1
  240. package/dist/memory-scope.d.ts +23 -11
  241. package/dist/memory-scope.js +18 -6
  242. package/dist/memory-sync-client.d.ts +30 -2
  243. package/dist/memory-sync-client.js +16 -9
  244. package/dist/model-entry-headers.d.ts +9 -10
  245. package/dist/model-entry-headers.js +0 -4
  246. package/dist/model-entry-refusal.d.ts +7 -4
  247. package/dist/model-entry-refusal.js +11 -5
  248. package/dist/model-plane-face.d.ts +1 -1
  249. package/dist/model-plane-face.js +3 -1
  250. package/dist/model-route-endpoint.d.ts +13 -7
  251. package/dist/model-route-endpoint.js +14 -11
  252. package/dist/model-select.d.ts +22 -0
  253. package/dist/model-select.js +9 -0
  254. package/dist/model-unreachable-notice.d.ts +11 -0
  255. package/dist/model-unreachable-notice.js +4 -4
  256. package/dist/object-store-buckets.d.ts +640 -6
  257. package/dist/object-store-buckets.js +166 -0
  258. package/dist/observability/err-text.d.ts +7 -0
  259. package/dist/observability/err-text.js +5 -0
  260. package/dist/observability/fail-open.d.ts +25 -17
  261. package/dist/observability/fail-open.js +25 -17
  262. package/dist/observability/logger.js +3 -1
  263. package/dist/observability/metrics.js +1 -0
  264. package/dist/operator-roster.d.ts +68 -0
  265. package/dist/operator-roster.js +32 -0
  266. package/dist/orchestration/workflow-notify-journal.d.ts +18 -1
  267. package/dist/orchestration/workflow-notify-journal.js +12 -1
  268. package/dist/orchestration/workflow-park-decision.d.ts +70 -18
  269. package/dist/orchestration/workflow-park-decision.js +49 -10
  270. package/dist/orchestration/workflow-park-holder.d.ts +65 -0
  271. package/dist/orchestration/workflow-park-holder.js +98 -0
  272. package/dist/orchestration/workflow-record-fence.d.ts +36 -0
  273. package/dist/orchestration/workflow-record-fence.js +42 -0
  274. package/dist/outbound-dispatcher.d.ts +71 -8
  275. package/dist/outbound-dispatcher.js +48 -7
  276. package/dist/owner-faces.d.ts +2 -2
  277. package/dist/parked-decide.d.ts +106 -55
  278. package/dist/parked-decide.js +153 -117
  279. package/dist/peer-directory.d.ts +2 -2
  280. package/dist/peer-inbound-face.d.ts +2 -6
  281. package/dist/peer-inbound-face.js +0 -3
  282. package/dist/permission-mode-admission.d.ts +74 -5
  283. package/dist/permission-mode-admission.js +56 -3
  284. package/dist/plugins/adoption-log-sql.d.ts +3 -1
  285. package/dist/plugins/adoption-log-sql.js +7 -1
  286. package/dist/plugins/approval-ask-store-file.d.ts +14 -2
  287. package/dist/plugins/approval-ask-store-file.js +11 -0
  288. package/dist/plugins/approval-ask-store-memory.d.ts +10 -1
  289. package/dist/plugins/approval-ask-store-memory.js +35 -10
  290. package/dist/plugins/approval-ask-store-sql.d.ts +69 -4
  291. package/dist/plugins/approval-ask-store-sql.js +45 -5
  292. package/dist/plugins/approval-exemption-store.js +3 -0
  293. package/dist/plugins/approval-nonce-store.js +2 -0
  294. package/dist/plugins/blob-backend.d.ts +83 -7
  295. package/dist/plugins/blob-backend.js +57 -6
  296. package/dist/plugins/breaker-state-sql.js +2 -0
  297. package/dist/plugins/caching-session-store.d.ts +9 -15
  298. package/dist/plugins/caching-session-store.js +6 -0
  299. package/dist/plugins/checkpoint-index-columns.d.ts +20 -16
  300. package/dist/plugins/checkpoint-index-columns.js +3 -6
  301. package/dist/plugins/checkpoint-store-face.d.ts +119 -61
  302. package/dist/plugins/checkpoint-store-face.js +134 -55
  303. package/dist/plugins/device-store-sql.js +6 -0
  304. package/dist/plugins/error-origin.d.ts +18 -0
  305. package/dist/plugins/error-origin.js +10 -0
  306. package/dist/plugins/execution-placement-sql.js +6 -6
  307. package/dist/plugins/image-bake-store-sql.js +6 -0
  308. package/dist/plugins/image-index-sql.js +4 -0
  309. package/dist/plugins/landed-attendants.d.ts +212 -0
  310. package/dist/plugins/landed-attendants.js +161 -0
  311. package/dist/plugins/leader-run-store-sql.js +4 -0
  312. package/dist/plugins/local-checkpoint-store.d.ts +13 -3
  313. package/dist/plugins/local-checkpoint-store.js +38 -49
  314. package/dist/plugins/local-session-live-reference.d.ts +40 -0
  315. package/dist/plugins/local-session-live-reference.js +39 -0
  316. package/dist/plugins/local-session-store.d.ts +71 -33
  317. package/dist/plugins/local-session-store.js +129 -27
  318. package/dist/plugins/memory-engine-pg.js +4 -0
  319. package/dist/plugins/memory-engine-sql-apply.js +5 -2
  320. package/dist/plugins/memory-engine-tidb.js +4 -0
  321. package/dist/plugins/memory-optout-grant-store-sql.js +4 -0
  322. package/dist/plugins/memory-sync-store-pg.js +5 -0
  323. package/dist/plugins/memory-sync-store-tidb.js +5 -0
  324. package/dist/plugins/one-time-migrations.d.ts +104 -80
  325. package/dist/plugins/one-time-migrations.js +226 -132
  326. package/dist/plugins/org-delivery-quota-store.js +4 -1
  327. package/dist/plugins/outcome-ledger-sql.js +2 -0
  328. package/dist/plugins/permission-rule-store-sql.js +11 -4
  329. package/dist/plugins/pg-cost-quota.js +4 -0
  330. package/dist/plugins/pg-pool.js +35 -10
  331. package/dist/plugins/pg-rate-limiter.js +2 -0
  332. package/dist/plugins/posix-shell-fs.d.ts +6 -1
  333. package/dist/plugins/posix-shell-fs.js +4 -1
  334. package/dist/plugins/remote-env-adb.d.ts +19 -15
  335. package/dist/plugins/remote-env-adb.js +41 -15
  336. package/dist/plugins/remote-env-connect-seat.d.ts +105 -0
  337. package/dist/plugins/remote-env-connect-seat.js +72 -0
  338. package/dist/plugins/remote-env-device.d.ts +22 -5
  339. package/dist/plugins/remote-env-device.js +106 -8
  340. package/dist/plugins/remote-env-e2b.d.ts +15 -6
  341. package/dist/plugins/remote-env-e2b.js +42 -32
  342. package/dist/plugins/remote-env-file-error.js +6 -2
  343. package/dist/plugins/remote-env-host.d.ts +46 -10
  344. package/dist/plugins/remote-env-host.js +124 -52
  345. package/dist/plugins/remote-env-k8s.d.ts +109 -41
  346. package/dist/plugins/remote-env-k8s.js +160 -54
  347. package/dist/plugins/remote-env-local-docker.d.ts +13 -8
  348. package/dist/plugins/remote-env-local-docker.js +34 -41
  349. package/dist/plugins/remote-env-ssh.d.ts +18 -12
  350. package/dist/plugins/remote-env-ssh.js +60 -59
  351. package/dist/plugins/remote-shell.d.ts +98 -1
  352. package/dist/plugins/remote-shell.js +218 -0
  353. package/dist/plugins/replica-registration.d.ts +1 -1
  354. package/dist/plugins/replica-registration.js +1 -1
  355. package/dist/plugins/resume-anchor-store-sql.d.ts +11 -2
  356. package/dist/plugins/resume-anchor-store-sql.js +12 -5
  357. package/dist/plugins/retention-lane-store-sql.js +4 -0
  358. package/dist/plugins/retention-sql.d.ts +20 -2
  359. package/dist/plugins/retention-sql.js +11 -0
  360. package/dist/plugins/run-store-sql.d.ts +21 -2
  361. package/dist/plugins/run-store-sql.js +31 -7
  362. package/dist/plugins/s3-presign.d.ts +23 -0
  363. package/dist/plugins/s3-presign.js +37 -3
  364. package/dist/plugins/scenario-prefix-switch-m42.d.ts +1 -1
  365. package/dist/plugins/scenario-prefix-switch-m42.js +2 -2
  366. package/dist/plugins/scheduler-support.d.ts +2 -2
  367. package/dist/plugins/scheduler-support.js +0 -3
  368. package/dist/plugins/schema-consistency.d.ts +4 -2
  369. package/dist/plugins/schema-consistency.js +19 -2
  370. package/dist/plugins/schema-indexes.js +2 -0
  371. package/dist/plugins/send-file-ledger.d.ts +2 -2
  372. package/dist/plugins/send-file-ledger.js +5 -2
  373. package/dist/plugins/send-user-file.d.ts +3 -4
  374. package/dist/plugins/send-user-file.js +56 -52
  375. package/dist/plugins/serving-requirement.d.ts +26 -7
  376. package/dist/plugins/serving-requirement.js +11 -4
  377. package/dist/plugins/session-birth.d.ts +6 -2
  378. package/dist/plugins/session-blob-claim-token.d.ts +15 -0
  379. package/dist/plugins/session-blob-claim-token.js +20 -0
  380. package/dist/plugins/session-blob-namespace.d.ts +46 -0
  381. package/dist/plugins/session-blob-namespace.js +116 -0
  382. package/dist/plugins/session-capture-record-store-sql.js +2 -0
  383. package/dist/plugins/session-ext-table.d.ts +14 -1
  384. package/dist/plugins/session-ext-table.js +5 -1
  385. package/dist/plugins/session-row-sql.d.ts +49 -2
  386. package/dist/plugins/session-row-sql.js +56 -13
  387. package/dist/plugins/session-store-sql.d.ts +34 -18
  388. package/dist/plugins/session-store-sql.js +98 -17
  389. package/dist/plugins/shared-memory-store-sql.d.ts +1 -0
  390. package/dist/plugins/shared-memory-store-sql.js +6 -2
  391. package/dist/plugins/snapshot-bucket-presence.d.ts +25 -2
  392. package/dist/plugins/snapshot-bucket-presence.js +8 -2
  393. package/dist/plugins/sql-driver.d.ts +2 -1
  394. package/dist/plugins/sql-driver.js +18 -3
  395. package/dist/plugins/sql-errors.d.ts +11 -6
  396. package/dist/plugins/sql-errors.js +5 -6
  397. package/dist/plugins/sql-json-column.d.ts +1 -1
  398. package/dist/plugins/stop-then-start-sentence.d.ts +10 -4
  399. package/dist/plugins/stop-then-start-sentence.js +14 -10
  400. package/dist/plugins/stop-then-start.d.ts +109 -0
  401. package/dist/plugins/stop-then-start.js +104 -0
  402. package/dist/plugins/store-backend.d.ts +84 -15
  403. package/dist/plugins/store-backend.js +236 -72
  404. package/dist/plugins/store-boundary.d.ts +57 -0
  405. package/dist/plugins/store-boundary.js +139 -0
  406. package/dist/plugins/store-contracts.d.ts +17 -0
  407. package/dist/plugins/store-fault-sentence-m53.d.ts +7 -0
  408. package/dist/plugins/store-fault-sentence-m53.js +25 -0
  409. package/dist/plugins/store-fault.d.ts +26 -7
  410. package/dist/plugins/store-fault.js +18 -2
  411. package/dist/plugins/task-attachment-store.d.ts +2 -1
  412. package/dist/plugins/task-attachment-store.js +14 -1
  413. package/dist/plugins/task-list-store-sql.d.ts +2 -2
  414. package/dist/plugins/task-list-store-sql.js +10 -8
  415. package/dist/plugins/tidb-cost-quota.js +4 -0
  416. package/dist/plugins/tidb-pool.js +21 -25
  417. package/dist/plugins/tidb-rate-limiter.js +4 -0
  418. package/dist/plugins/user-input-ledger-sql.js +4 -0
  419. package/dist/plugins/workflow-run-store-sql.d.ts +28 -10
  420. package/dist/plugins/workflow-run-store-sql.js +64 -4
  421. package/dist/plugins/workspace-custody.d.ts +4 -3
  422. package/dist/plugins/workspace-fill.d.ts +4 -7
  423. package/dist/plugins/workspace-fill.js +2 -1
  424. package/dist/plugins/write-behind-counter.js +5 -0
  425. package/dist/project-context.d.ts +0 -2
  426. package/dist/project-context.js +4 -8
  427. package/dist/project-registry.d.ts +46 -0
  428. package/dist/project-registry.js +44 -0
  429. package/dist/question.d.ts +2 -1
  430. package/dist/question.js +5 -13
  431. package/dist/request-form.d.ts +6 -1
  432. package/dist/request-form.js +4 -1
  433. package/dist/request-key-closure.js +1 -1
  434. package/dist/request-value-closure.d.ts +4 -0
  435. package/dist/request-value-closure.js +10 -0
  436. package/dist/rule-issue-reading.d.ts +1 -1
  437. package/dist/rules-consent.d.ts +1 -1
  438. package/dist/run-acceptance.d.ts +3 -2
  439. package/dist/run-acceptance.js +4 -6
  440. package/dist/run-local.js +9 -9
  441. package/dist/runs.d.ts +54 -16
  442. package/dist/runs.js +67 -13
  443. package/dist/runtime-governance.d.ts +5 -4
  444. package/dist/security.d.ts +30 -32
  445. package/dist/security.js +41 -7
  446. package/dist/sema-config-dir.d.ts +2 -1
  447. package/dist/server-secret-env.d.ts +12 -10
  448. package/dist/server-secret-env.js +24 -15
  449. package/dist/session-bindings.d.ts +82 -0
  450. package/dist/session-bindings.js +18 -0
  451. package/dist/session-children-retire.d.ts +2 -2
  452. package/dist/session-children-retire.js +2 -6
  453. package/dist/session-deletion.d.ts +16 -1
  454. package/dist/session-error-wire.d.ts +3 -3
  455. package/dist/session-error-wire.js +3 -3
  456. package/dist/session-incarnation.d.ts +10 -0
  457. package/dist/session-incarnation.js +10 -1
  458. package/dist/session-kind.d.ts +57 -0
  459. package/dist/session-kind.js +22 -0
  460. package/dist/session-row.d.ts +21 -1
  461. package/dist/session-row.js +7 -1
  462. package/dist/session-sync-kernel.d.ts +24 -14
  463. package/dist/session-sync-kernel.js +3 -6
  464. package/dist/session-sync.d.ts +25 -103
  465. package/dist/session-sync.js +14 -76
  466. package/dist/session-titler.d.ts +10 -3
  467. package/dist/session-titler.js +19 -6
  468. package/dist/ssh-host-key.d.ts +5 -0
  469. package/dist/ssh-host-key.js +3 -0
  470. package/dist/stores-sql/blob-index-sql.d.ts +30 -9
  471. package/dist/stores-sql/blob-index-sql.js +40 -21
  472. package/dist/stores-sql/checkpoint-store-sql.d.ts +54 -27
  473. package/dist/stores-sql/checkpoint-store-sql.js +70 -146
  474. package/dist/stores-sql/file-history-store-sql.d.ts +113 -15
  475. package/dist/stores-sql/file-history-store-sql.js +205 -95
  476. package/dist/stores-sql/pg-session-storage.d.ts +34 -7
  477. package/dist/stores-sql/pg-session-storage.js +37 -13
  478. package/dist/stores-sql/retention-store-sql.d.ts +1 -9
  479. package/dist/stores-sql/retention-store-sql.js +5 -19
  480. package/dist/stores-sql/session-policy-store-sql.d.ts +30 -7
  481. package/dist/stores-sql/session-policy-store-sql.js +61 -44
  482. package/dist/stores-sql/session-write-hooks.d.ts +11 -0
  483. package/dist/stores-sql/tidb-session-store.d.ts +58 -7
  484. package/dist/stores-sql/tidb-session-store.js +37 -13
  485. package/dist/submission-exit.d.ts +3 -2
  486. package/dist/submission-exit.js +9 -1
  487. package/dist/task-cwd.d.ts +2 -2
  488. package/dist/task-settings.d.ts +7 -5
  489. package/dist/task-settings.js +3 -3
  490. package/dist/terminal.d.ts +33 -2
  491. package/dist/terminal.js +139 -9
  492. package/dist/tool-approval.d.ts +465 -507
  493. package/dist/tool-approval.js +606 -1222
  494. package/dist/trace/core-keyset-guard.d.ts +1 -1
  495. package/dist/trace/ledger-events.d.ts +3 -3
  496. package/dist/trace/project.d.ts +2 -3
  497. package/dist/trace/redact.js +3 -2
  498. package/dist/trace/self-minted-wire.d.ts +571 -178
  499. package/dist/trace/self-minted-wire.js +189 -56
  500. package/dist/web-admin-client/apply-effective.js +2 -2
  501. package/dist/web-admin-client/read-warnings.d.ts +2 -2
  502. package/dist/web-admin-client/read-warnings.js +1 -1
  503. package/dist/web-admin-client/types.d.ts +1 -1
  504. package/dist/workspace-space.d.ts +10 -4
  505. package/dist/workspace-space.js +4 -1
  506. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +79 -28
  507. package/package.json +7 -3
  508. package/scripts/embed-minimal.mjs +3 -3
  509. package/wire-changes/server@7.151.0.json +762 -0
  510. package/wire-changes/server@7.152.0.json +900 -0
  511. package/dist/config-d-migration.d.ts +0 -37
  512. package/dist/config-d-migration.js +0 -60
  513. package/dist/http/session-inherit-env.d.ts +0 -36
  514. package/dist/http/session-inherit-env.js +0 -6
@@ -14,7 +14,7 @@
14
14
  * SQL 孪生的文件里;它住这里,SQL 孪生经一条点名的已知欠边借它 —— 这一条边就是阶段三搬家时「服务特有面」的清单(向引擎请托的候选,只列不发)。
15
15
  * 这里零 SQL:SQL 文本、列读法与行投影仍在 SQL 孪生里。
16
16
  */
17
- import { type Checkpoint, type CheckpointGate, type CheckpointRowVerdict, type CheckpointSummary, type GateOutcome, type ResolvedOutcome, type RiskDescriptor, type ToolApprovalCard } from "@sema-agent/core";
17
+ import { type Checkpoint, type CheckpointGate, type CheckpointRowVerdict, type CheckpointSummary, type GateOutcome, type ResolvedOutcome, type RiskDescriptor, type RuleOffer, type ToolApprovalCard } from "@sema-agent/core";
18
18
  import { type ParkRowFacts, type RuleOfferProjection, type SkillCardFacts } from "../approval-card.js";
19
19
  import { StoreCorruptError } from "./sql-json-column.js";
20
20
  import type { SealedCheckpointCtx } from "../http/checkpoint-ctx.js";
@@ -94,7 +94,7 @@ export interface PendingCheckpoint extends ParkRowFacts, SkillCardFacts {
94
94
  * 与 `/v1/approvals/stream` 的 `pending` 帧;停驻收件 `GET /v1/assistant/inbox` 的 `inbox[]`)共用的 **join 键**,也是 409 载体 A
95
95
  * `pendingGate.checkpointId` / `terminal.paused.checkpointId` 的同一个值。**在场就是可信的那一个值,缺席就是缺席**:读法唯一 = `checkpoint-identity.ts` 的
96
96
  * `durableRowIdentity`(过信任边界 —— 不含 token、有界),没有它的行(core 5.42.0 之前停驻的老行 / 没过边界的值)**照列**、键缺席(这一行没有可 join 的身份)、
97
- * 每行计一次 `server.approvals.durable-row-checkpoint-id-missing`。两只店各读自己手里的那一份(SQL 孪生读 `checkpoint` 列的成员,LOCAL 孪生读 blob)。
97
+ * 每行计一次 `server.approvals.durable-row-checkpoint-id-missing`。两只店同读引擎对这一行字节投的摘要({@link buildQueueActionFacts});摘要读不动的行没有这一格(缺席 + 计数)。
98
98
  */
99
99
  checkpointId?: string;
100
100
  scope: string;
@@ -124,9 +124,14 @@ export interface PendingCheckpoint extends ParkRowFacts, SkillCardFacts {
124
124
  * 两者都没有(同步 / workflow 委派子代、终局后的纯停驻)⇒ `null`。
125
125
  */
126
126
  taskId: string | null;
127
- /** The pending tool call's args (post-hook), redacted + bounded — for tool_approval the write payload, for a
128
- * durable AskUserQuestion the question itself. Lets the approval card render WITHOUT an N+1 trace.turns
129
- * fetch. `null` for pre-migration rows (suspended before the column existed) ⇒ consumer falls back. */
127
+ /**
128
+ * 这一行待决调用的入参(钩子之后那一份)—— **读时投影,不是一列**:两孪生都从停驻快照 `tool_approval` 寄存臂的 `args`(续跑执行的同一份字节、同一次解码,{@link buildQueueActionFacts})读,
129
+ * 读法唯一 = {@link boundedToolInput}(`human-facing-args.ts`;与活卡 `args` 同一只判定):
130
+ * 问 / 计划卡 ⇒ 恒是**整份**的脱敏入参(停驻的 AskUserQuestion = 整只 `{ questions }`,题干与每个选项都在,审批人据它带答 decide);
131
+ * 其余动作卡与无卡的行 ⇒ 脱敏后 JSON 不超 `HUMAN_FACING_ARGS_BYTES`(32768 UTF-8 字节)时整份,超了 ⇒ 折叠标记 `{ truncated: true, bytes }`
132
+ * (`bytes` = 脱敏后 JSON 的 UTF-8 字节数;整份换标记,不带保留部分 —— 保留部分在 `riskDescriptor`);没有工具入参(非工具门)/ 入参序列化不出 /
133
+ * 快照的待决动作读不出(这样的行续跑也读不出它)⇒ `null`。卡片据它渲染,不必再 N+1 读 trace.turns。
134
+ */
130
135
  input: unknown;
131
136
  /**
132
137
  * 建行时刻(epoch ms)。SQL 孪生恒在场(本服务在存储体之外握着的建行时刻列)。LOCAL 孪生读引擎对这一行投的摘要(core `CheckpointSummary.createdAt`,同一可选性):
@@ -147,7 +152,8 @@ export interface PendingCheckpoint extends ParkRowFacts, SkillCardFacts {
147
152
  * whole-string exact `single` 在场时恒 index 0、`batch` 恒末位,core 契约基数 ≤2 —— server 侧执法帽
148
153
  * 是 `MAX_RULE_OFFERS`=4 的容忍余量,两个数的分工见该常量顶注)。
149
154
  *
150
- * 🔴 **本腿的下标不是 core 的 offer index,别把它当选择键**(5.58 复审 F-3,与契约文同批改准)。
155
+ * 🔴 **下标 = 唯一读者读出的那份数组的下标**(兑付读的规则记录同一只读者、同一份数组 ⇒ `batchOfferIndex` 选的就是记录里那一只;以下是历史段落,留作「为什么不能
156
+ * 各读各的」的证据 —— 此前本腿另有一只读者,下面那条硬条款就是它的代价)。原文:**本腿的下标不是 core 的 offer index,别把它当选择键**(5.58 复审 F-3)。
151
157
  * core 的契约原话是:丢掉不认识的成员时**必须保住每个留下来成员的原始 wire 下标**,做不到的消费端
152
158
  * 「must suppress its persistence actions entirely (fail toward asking)」。本腿走的是**后者** ——
153
159
  * {@link boundedRuleOffers} 对形不合的 offer 是**逐条丢弃并压紧**的(一条坏 offer 不该让另一条真 offer
@@ -171,10 +177,8 @@ export interface PendingCheckpoint extends ParkRowFacts, SkillCardFacts {
171
177
  * 同一条 wire 纪律([ref]②「absent nullable field is OMITTED, not null」)。存量行(本列存在之前
172
178
  * park 的)读回同样是缺席,与「这只 ask 没有候选」在消费端读法一致:本卡无此选项。
173
179
  *
174
- * 🔴 **展示用,永不参与 resume**:core 侧同款定性(「never read by the resume path, and never a rule by
175
- * itself」)。本仓耐久腿今天也没有兑付口(`/v1/approvals/:id/decide` 的体不带规则位),所以它是**分诊
176
- * 材料**不是承诺 —— 消费端渲这一格时要按「同副本活卡腿才兑得动」读(同 `ApprovalCardSchema.ruleOffers`
177
- * 顶注那条射程说明)。
180
+ * 🔴 **永不参与 resume**(core 侧同款定性:「never read by the resume path, and never a rule by itself」)—— 兑它的是运维队列决断口
181
+ * `POST /v1/approvals/:sessionId/decide` 的 `persistRule`(唯一兑付函数,在续跑腿结清点,对着这张卡铸时的记录;有问行的停驻卡队列行投的是问行上那一份)。
178
182
  */
179
183
  ruleOffers?: readonly RuleOfferProjection[];
180
184
  /**
@@ -182,16 +186,12 @@ export interface PendingCheckpoint extends ParkRowFacts, SkillCardFacts {
182
186
  * 执行载荷里含至少一个 DIRECTIONAL 格式控制符(人眼读到的顺序与真正执行的字节顺序可能不同)。
183
187
  *
184
188
  * 值**完全由 core 供**:park mint 时 core 写在 `pendingAction`(tool_approval 臂)上的那一位
185
- * (`PendingAction.hasBidiControls`,core [ref]),`put()` 在铸行
186
- * 这一刻反范式成 `checkpoint.has_bidi_controls` 列(同行 `tool_input` / `bound_input_hash` / `gate_kind` /
187
- * `risk_descriptor` / `rule_suggestions` 五列同一条「铸行时一格、读口零 blob」先例),server 不重算。
188
- * ([ref] 起本读口**确实**逐行读 blob —— 只为 {@link ParkRowFacts} 那几位,且是按「本仓不发 ALTER TABLE、
189
- * 加列 = 删库丢在飞 park」裁出来的代价,见 `listPending` 那一段;本位与五列的「铸行时一格」形不变。)
189
+ * (`PendingAction.hasBidiControls`,core [ref]),两孪生在读时经引擎派生 `checkpointIndexFacts` 从同一次整行解码取({@link buildQueueActionFacts}),server 不重算、不落列。
190
190
  *
191
191
  * 🔴 `true` **或缺席,恒不写 `false`/`null`**(core d.ts 的 OMIT 契约逐字点名 BFF:「never null, never
192
192
  * present-but-undefined, never false」):缺席 = **没检出**(干净 / core 的有界扫描没够着 / 本列诞生前
193
193
  * park 的老行),消费端**禁**读成「已确认干净」。与 `/v1/assistant/inbox` 那面的同名键同一份语义
194
- * (那面由 `summarizeCheckpoint` 对老行做投影期回填;本面读列不读 blob,老行恒缺席 —— 两面的缺席
194
+ * (那面由 `summarizeCheckpoint` 对老行做投影期回填;本面读寄存行上那一位,老行恒缺席 —— 两面的缺席
195
195
  * 集合因此不完全相等,但两面对「缺席」的读法逐字相同)。同步腿(`tool_approval` 帧 / `approval_request`
196
196
  * 卡)的对应键是 `inputHasBidi`(E-14),名字刻意不同:那一位是 server 对帧自身序列化后的 args 算的。
197
197
  *
@@ -209,14 +209,14 @@ export interface PendingCheckpoint extends ParkRowFacts, SkillCardFacts {
209
209
  approvalCard?: ToolApprovalCard;
210
210
  /**
211
211
  * 这一行**本引擎续不续得了** —— core 判官 `judgeCheckpointRow` 对这一行盘上字节的判决(core 7.62.0 [ref];与助手收件箱行的 `rowVerdict`、
212
- * 续跑在第一级读到的拒同一个读者、同一答),逐字投、本服务不重算不筛。判官要整行:SQL 孪生按 (库内算的 `checkpoint` 文本 sha256, 引擎构建)
213
- * 记忆({@link StoredRowProjectionMemo}),未命中才按令牌批读整行;LOCAL 孪生取 core 店摘要上的同一位。
212
+ * 续跑在第一级读到的拒同一个读者、同一答),逐字投、本服务不重算不筛。与这一行的其余动作事实同一次整行解码({@link buildQueueActionFacts}):
213
+ * SQL 孪生按 (库内算的 `checkpoint` 文本 sha256, 引擎构建) 记忆整份动作事实,未命中才按令牌批读整行;LOCAL 孪生取 core 店摘要上的同一位。
214
214
  * 盘上字节读不成一只检查点的行(体是 `{}`、缺 `state`、JSON 字面 `null` / 标量 / 数组 / 非 JSON)同样判:判官对任何值都答,这种行答 `damaged`,
215
215
  * 行照列(计 `server.approvals.park-row-blob-unreadable`)—— 一行坏字节只坏它自己那一行,见 {@link SqlCheckpointStore.readStoredRow}。
216
- * **在场 ⇔ 这一次列表判过这一行**:缺席只在 SQL 孪生上出现 —— 两次读之间行已离开待决,或两次读之间行的字节变了(判过的是另一份,
217
- * 不拼到这一行上;下一次列表即带)。缺席**不是** `ok`。非 `ok` 的行照列(人要看到它停在哪)。
216
+ * **恒在场**:列出的每一行都在这一次列表里判过(SQL 孪生两次读之间行已离开待决 ⇒ 不列;字节变了 ⇒ 判的就是批读那一版,行的全部动作事实同出这一版)。
217
+ * 非 `ok` 的行照列(人要看到它停在哪)。
218
218
  */
219
- rowVerdict?: CheckpointRowVerdict;
219
+ rowVerdict: CheckpointRowVerdict;
220
220
  }
221
221
  /**
222
222
  * 🔴 [ref] —— 停驻行 {@link PendingCheckpoint.taskId} 的**唯一写者**:停在这道门上的那条腿以哪个 task 在跑。
@@ -231,6 +231,62 @@ export interface PendingCheckpoint extends ParkRowFacts, SkillCardFacts {
231
231
  * 记录读不成非空串(数 / 对象 / 空串 —— 被改过的行)⇒ 与没记同答:方向是少一个路由键,不放宽任何判;那一行续不续得了由它的 `rowVerdict` 另说。
232
232
  */
233
233
  export declare function parkedLegTaskId(recorded: unknown, claimHolder: string | null): string | null;
234
+ /**
235
+ * 🔴 **运维队列行的律:行 = 行址 + 动作事实**(两孪生同一条律、同一只投影)。
236
+ *
237
+ * · **行址**(会话 / scope / 门型 / 建行时刻 / 截止 / 归属 run 的认领)取决断口找行用的那一处 —— SQL 孪生 = 列,LOCAL 孪生 = 引擎对这一行投的摘要({@link QueueRowAddress});
238
+ * · **动作事实**(工具名、调用 id、绑定两键、入参、卡、风险描述、规则候选、bidi 位、park 行事实、`checkpointId`、引擎记下的 `rowTaskId`、技能卡两位、判决)**只出自续跑执行读的那一次
239
+ * 整行解码**({@link buildQueueActionFacts});解不出(字节读不成检查点 / 引擎摘要读不动)⇒ 动作事实 `null` / 缺席,判决非 `ok`。
240
+ *
241
+ * 于是「队列显示什么」与「续跑执行什么」按构造是同一份字节的同一次 `JSON.parse`:没有第二只 parser(引擎内的成员提取),也没有第二份存储(展示用的派生列)——
242
+ * 带外改过一格列、或原文带重复键(MariaDB 文本承载上引擎内提取取先到者、`JSON.parse` 取后到者)的行,队列显示的就是将执行的那一份。
243
+ */
244
+ export interface StoredRowReading {
245
+ /** 判官对这一行字节的判决(读不成检查点的字节判官对原样文本作答;摘要读得动时 = 摘要上的那一位)。 */
246
+ readonly rowVerdict: CheckpointRowVerdict;
247
+ /** 字节解出的那一只对象(解不出 ⇒ 缺席)。 */
248
+ readonly cp?: Checkpoint;
249
+ /** 引擎对它投的摘要(没投成 ⇒ 缺席;「读不动」那一形由 {@link isUnreadableSummaryForm} 认)。 */
250
+ readonly summary?: CheckpointSummary;
251
+ }
252
+ /** 队列行上原样展开的动作事实键(型取自行形 {@link PendingCheckpoint},不另写一份)。 */
253
+ export type QueueRowActionFacts = Pick<PendingCheckpoint, "toolName" | "toolCallId" | "boundCallId" | "boundInputHash" | "input" | "riskDescriptor" | "ruleOffers" | "hasBidiControls" | "approvalCard" | "rowVerdict" | keyof ParkRowFacts | keyof SkillCardFacts>;
254
+ /**
255
+ * 一份停驻行字节的动作事实({@link buildQueueActionFacts} 的产物;纯数据,SQL 孪生按字节记忆它)。`checkpointId` / `recordedTaskId` 是**原值**:
256
+ * 前者每次列表过信任边界(`durableRowIdentity`,判据含行址上的令牌),后者每次列表与认领合成 `taskId`({@link parkedLegTaskId})—— 两者都在 {@link buildQueueRow} 里。
257
+ */
258
+ export interface QueueActionFacts {
259
+ readonly row: QueueRowActionFacts;
260
+ /** 引擎摘要上的 `checkpointId`(摘要读不动 / 没投成 ⇒ `undefined`:两孪生只读摘要,不另写形检)。 */
261
+ readonly checkpointId: unknown;
262
+ /** 引擎记下的那条腿的登记行(`state.rowTaskId` 原值;字节解不出 ⇒ `undefined`)。好行与摘要读不动的行同读(判据在 {@link parkedLegTaskId})。 */
263
+ readonly recordedTaskId: unknown;
264
+ }
265
+ /**
266
+ * 一份停驻行字节 → 它的**动作事实**(两孪生同调这一只;律见 {@link StoredRowReading})。纯数据:同一份字节、同一引擎构建答同一份(计数臂除外)。
267
+ * · 工具名 / 调用 id / 绑定 / bidi 位 / 描述 —— 引擎的派生 `checkpointIndexFacts`(写口落列用过的同一只;工具位只在 `tool_approval` 寄存臂上);
268
+ * · 入参 —— 同一只寄存臂的 `args` 交 {@link boundedToolInput}(卡 = 门上那一格,{@link parkedApprovalCard});规则候选 —— {@link boundedRuleOffers}(脱敏照跑、照计数);
269
+ * · park 行事实 —— {@link parkRowFacts};技能卡两位 —— 摘要上的 {@link skillCardFacts};`checkpointId` —— 摘要上的那一格。
270
+ * 摘要没投成或是「读不动」那一形 ⇒ 只给判决,四只可空格 `null`、其余动作事实缺席(不回存储体取任何一格);记下的 `rowTaskId` 照读解出的对象。
271
+ */
272
+ export declare function buildQueueActionFacts(read: StoredRowReading): QueueActionFacts;
273
+ /** 队列行的**行址**(两孪生各从决断口找行的那一处读:SQL = 列,LOCAL = 引擎摘要)。`token` 只进 join 键的信任边界判,**永不**上行投影。 */
274
+ export interface QueueRowAddress {
275
+ readonly token: string;
276
+ readonly sessionId: string;
277
+ readonly scope: string;
278
+ readonly gateKind: CheckpointGate["kind"];
279
+ /** 读得出有限数才在场(LOCAL 读摘要;SQL 列恒在)。 */
280
+ readonly createdAt?: number;
281
+ readonly deadline: number | null;
282
+ /** 持着这张卡所属 run 会话认领的那条 run(SQL = `task_active` 联结,LOCAL = 文件 run 店);没有 ⇒ `null`。 */
283
+ readonly claimHolder: string | null;
284
+ }
285
+ /**
286
+ * 行址 + 动作事实 → 运维队列行(两孪生同调;键序与修前同)。每个键**一个写者**:插在行址之间的五只动作事实键(工具名、调用 id、绑定两键、入参)在键序位上写一次,
287
+ * 其余动作事实({@link QueueRowActionFacts} 去掉这五只)整体接在行址之后 —— 同一键不再先写一遍、再被展开覆写一遍(值同出 `facts.row`,覆写只是第二个写者)。
288
+ */
289
+ export declare function buildQueueRow(address: QueueRowAddress, facts: QueueActionFacts): PendingCheckpoint;
234
290
  /**
235
291
  * [ref]([ref] / DEBTS [ref]):session 键读口(`findPendingTokenBySession` / `peekPendingScope`)的**行绑定**。
236
292
  *
@@ -302,43 +358,43 @@ export declare function pendingRowPrecedes(a: {
302
358
  token: string;
303
359
  }, pick?: "newest" | "oldest"): boolean;
304
360
  /**
305
- * `pendingAction.ruleOffers` 的**铸行侧**投影(mint 面,与 {@link boundedToolInput} 同位同待遇)。
306
- *
307
- * 四件事,一件都不能少:
308
- * 1. **读**(宪法 [ref] 边界必判形 / 禁裸 as-cast):blob 里的这一格是 `unknown`(旧 core / 坏行 / 未来加字段都可能)。读者只有一只 =
309
- * core `readRuleOffers`(经 `approval-card.ts` 的 {@link readRuleOfferList};core 7.55.0 [ref] P1 阶段二起,修前本仓自己一份 zod 形):读不出的**整条丢弃**
310
- * (不是整只丢弃)——一条坏 offer 不该让另一条真 offer 消失;多余键逐级剥、不拒收(上游 additive 加一键是 core 的常规做法,拒收会把「有供给」静默变成「无供给」);
311
- * 丢弃**响亮**(`server.rule-offers.offer-dropped`,修前这一腿静默)。
312
- * 2. **脱敏**:offer 文本是从**命令原文**铸出来的(`Bash(curl -H "Authorization: Bearer …")` 这种 exact
313
- * 形拼得出秘密),而 `GET /v1/approvals` 是**跨租户可见**的运维队列。落列前过 `redactSecrets` ——
314
- * 与同行 `tool_input` 在 mint 就 `redactDeep` 是**同一条**纪律(秘密从此连**落库**都不落,不是落了库再在两条读面各洗一遍)。
315
- * 3. **脱敏之后**才截长(codex 交叉复审 [medium],验真后修):`redactSecrets` 会**变长**,先按限长校验
316
- * 原文再脱敏会产出超限文本,而 SQL 腿有**回读**(列 → 本函数再跑一遍)、LOCAL 腿没有 ⇒ 同一份素材
317
- * 两个后端给出不同卡面。顺序反过来之后本函数对自己的输出**幂等**,两条腿同形。
318
- * 4. **限基数**:core 契约今天 ≤2,这里按 {@link MAX_RULE_OFFERS}(=4,server 侧容忍帽,两个数的
319
- * 分工逐字见该常量顶注)截;`batch.rules` 成员另按 {@link MAX_RULE_OFFER_BATCH_MEMBERS}(=8)截 ——
320
- * 一条被改坏/未来放宽的上游不该把运维队列的一行撑爆。两个截都是**前缀截**(保序)。
321
- * ⚠️ **但本函数整体不保原始下标**:第 1 条的「坏的逐条丢」会压紧数组 ⇒ 中间剔除后下标前移。
322
- * 本腿因此是**纯展示腿**,下标不得当选择键 —— 硬条款与它站得住的理由逐字见
323
- * {@link PendingCheckpoint.ruleOffers} 顶注(同步腿相反:那侧零逐条丢弃,下标恒等于 core 的 offer index)。
324
- * 🔴 **成员帽扣在读之前**(5.58 复审 F-2):见 {@link preboundBatchMembers} —— offer 条数那一维由
325
- * {@link MAX_RULE_OFFER_SCAN} 管,成员那一维在那之前是**无界**的。
326
- * 🔴 **扣预算在读出之后**(合并码重扫):旧序先 `slice` 再判形,于是 ≥MAX 条坏 offer 能把唯一的真
327
- * offer 挤出预算,读数是 `undefined` —— 与上面第 1 条自证的不变量(坏的丢、好的照投)正相反。扫描窗
328
- * {@link MAX_RULE_OFFER_SCAN} 仍是有界的:一条被改坏成上万条的行不该让每 3s 一拍的读路径去逐条判形。
329
- *
330
- * 🔴 `opts.countRedactions`:**两条腿都照常脱敏,只有回读腿不计数**(合并码重扫;codex 复审第一轮
331
- * 指出「回读不脱敏」会把纵深防御一起关掉,验真后按这条收)。`redactSecrets` 对自己的输出是**值幂等、
332
- * 计数不幂等**(URL-userinfo / JSON 秘密字段两条 pattern 会命中自己的输出并再计一次),而回读腿正是
333
- * `/v1/approvals/stream` 每 3s 一拍的热路径 ⇒ 每条订阅每行每拍给 `redactions_applied_total` +1,把那个
334
- * 用来识别「过度脱敏 / pattern 从不触发」的指标灌成不可读。关掉的是**计数**:重扫仍在,手改过的行 /
335
- * 将来某条写路径漏了脱敏,读面照样兜住(运维队列跨租户可见,少脱一次的代价永远不能省)。
361
+ * 「不再询问」规则 project root 的**铸卡快照席**(两只 checkpoint 店的写口 `put` 在停驻那一刻读一次,落列 `card_scope_root` / local 的快照索引)。
362
+ * 读法 = 跑这条 run 的副本的会话 cwd 登记(与活卡铸点 `ruleScopeRootFor` 同一只函数,boot 第 6 段经后端的 `bindCardScopeRoot` 绑一次)。未绑 / 答不出 ⇒ `undefined`
363
+ * ⇒ 列 NULL ⇒ 兑付不铸 scope(core 答 `scope-unresolved`:只会拒,不会放宽)。scope 从不在兑付时重推(被拒的提交也能改写会话的 cwd 登记,重推出的 root 可能比快照宽)。
364
+ */
365
+ export interface CardScopeRootSeat {
366
+ of(sessionId: string): string | undefined;
367
+ bind(read: (sessionId: string) => string | undefined): void;
368
+ }
369
+ export declare function createCardScopeRootSeat(): CardScopeRootSeat;
370
+ /**
371
+ * 一只候选的**展示变换**(逐条、1:1 保位、只改字):offer 文本是从命令原文铸出来的(`Bash(curl -H "Authorization: Bearer …")` 这种 exact 形拼得出秘密),
372
+ * 而 `GET /v1/approvals` 是跨租户可见的运维队列 ⇒ 落列 / 投影前过 `redactSecrets`,**脱敏之后**才截长(`redactSecrets` 会变长;顺序反过来本变换对自己的输出不幂等,
373
+ * SQL 腿有回读、LOCAL 腿没有 ⇒ 同一份素材两个后端两种卡面)。`observe:false` = 回读腿只脱敏不计数(`/v1/approvals/stream` 每 3 s 一拍的热路径;
374
+ * `redactSecrets` 对自己的输出值幂等、计数不幂等)。batch 成员按 {@link MAX_RULE_OFFER_BATCH_MEMBERS} 前缀截(选择键在 offer 上,成员截不动选择键)。
375
+ */
376
+ export declare function displayRuleOfferText(text: string, observe: boolean): string;
377
+ /** 一张卡候选数组的展示形(逐条 {@link displayRuleOffer},1:1 保位 ⇒ 下标与读出的那份数组同一个空间)。空 ⇒ `undefined`(无供给:键不落列、不投)。 */
378
+ export declare function displayRuleOffers(offers: readonly RuleOffer[], opts?: {
379
+ countRedactions?: boolean;
380
+ }): RuleOfferProjection[] | undefined;
381
+ /**
382
+ * 停驻行 `pendingAction.ruleOffers` 的**投影**(铸行 / 回读 / LOCAL 孪生三条腿同调)= 唯一读者 {@link readCardRuleOffers} 读出的那份数组 × 展示变换 {@link displayRuleOffers}。
383
+ * 读法不在这里(此前这里另有一只读者:超尺截长、不判派生事实 ⇒ 一只展示成目录授权、规则文本却是 Bash 放行的 offer 能在队列行上出现,同一张停驻卡的重放帧与队列行
384
+ * 下标对不上);这里只做展示。`cardTool` = 这张卡的工具(停驻行 `pendingAction.toolName` / 列 `tool_name`):派生事实一致性判「是不是这张卡的工具与卡形」要它。
385
+ * 下标:投影与停驻行的规则记录读者(`tool-approval.ts`)读的是同一只读者的同一份输出 ⇒ `batchOfferIndex` 选的就是记录里那一只。
386
+ * 回读腿(SQL 列 `rule_suggestions` 落的是展示形)不走本函数,走 {@link storedRuleOfferProjection}:读者在铸行时已跑过,列是它的输出的展示形。
336
387
  *
337
- * 返回 `undefined` = **无供给**(键不落列):core 没给、给了空数组、或整只读不出。
388
+ * 返回 `undefined` = **无供给**(键不落列):core 没给、给了空数组、整条撤回或全被丢光。
338
389
  */
339
- export declare function boundedRuleOffers(raw: unknown, opts?: {
390
+ export declare function boundedRuleOffers(raw: unknown, cardTool: string, opts?: {
340
391
  countRedactions?: boolean;
341
392
  }): RuleOfferProjection[] | undefined;
393
+ /**
394
+ * SQL 腿回读列 `checkpoint.rule_suggestions` 的投影:列上躺的是铸行时 {@link boundedRuleOffers} 的输出 ⇒ 只解码({@link decodeRuleOfferProjection})+ 再过一遍展示变换
395
+ * (纵深防御:手改过的行也不许把凭证投上跨租户队列;回读腿不计数 —— 值幂等、计数不幂等,热路径)。对铸行输出恒等(钉在 `durable-ask-attribution-keys`)。
396
+ */
397
+ export declare function storedRuleOfferProjection(raw: unknown): RuleOfferProjection[] | undefined;
342
398
  /**
343
399
  * {@link SqlCheckpointStore.get} 读到的 `checkpoint` 列字节读不成一只检查点(JSON 字面 `null` / 标量 / 数组 / 非 JSON)时抛的拒 —— 就是店的拒绝契约类
344
400
  * {@link StoreCorruptError}(`kind:"corrupt"` + 坐标,所有认它的读口原样认它),外加**引擎判官对这一格原样字节的判决**:列表面对同一格答的就是它
@@ -361,9 +417,9 @@ export declare class UnreadableCheckpointRowError extends StoreCorruptError {
361
417
  export declare function queueRowGateKind(kind: unknown): CheckpointGate["kind"] | undefined;
362
418
  export declare function isUnreadableSummaryForm(summary: CheckpointSummary): boolean;
363
419
  /**
364
- * 运维队列行 `riskDescriptor` 那一格的**形读者**(两孪生同调这一只):SQL 孪生对 `risk_descriptor` 列解出来的体(`decodeJsonColumn`)、LOCAL 孪生对存储体里门上的
365
- * `gate.riskDescriptor`。判到「是不是一只对象」为止 —— 描述符的键表属主在 core,core 没有导出它的验证器,手写一份就是第二份键集。读不出 ⇒ 这一行的描述符 `null` +
366
- * 计 `server.approvals.risk-descriptor-cell-unreadable`(两孪生同一个 tag、同一失败方向;放行理由见登记表)。
420
+ * 运维队列行 `riskDescriptor` 那一格的**形读者**:两孪生经 {@link buildQueueActionFacts} 对门上的描述符(引擎派生 `checkpointIndexFacts` 那一格)调这一只。
421
+ * 判到「是不是一只对象」为止 —— 描述符的键表属主在 core,core 没有导出它的验证器,手写一份就是第二份键集。读不出 ⇒ 这一行的描述符 `null` +
422
+ * 计 `server.approvals.risk-descriptor-cell-unreadable`(放行理由见登记表)。
367
423
  */
368
424
  export declare const readRiskDescriptorBody: import("./sql-json-column.js").JsonColumnReader<RiskDescriptor>;
369
425
  /** 分诊序读的两格(运维队列行 = 描述符里的严重度;收件箱行 = 引擎摘要的严重度)。 */
@@ -378,10 +434,12 @@ export interface TriageKeys {
378
434
  export declare function pendingTriageOrder(a: TriageKeys, b: TriageKeys): number;
379
435
  /** 运维队列行的分诊序 = {@link pendingTriageOrder} 读行上描述符的严重度(两孪生的 `listPending` 同调)。 */
380
436
  export declare function queueTriageOrder(a: PendingCheckpoint, b: PendingCheckpoint): number;
381
- /** Redact + size-bound a pending tool call's args for persistence/serving. JSON-roundtrips so the stored shape
382
- * matches what the operator queue serves; oversized payloads collapse to a marker rather than bloating the row.
383
- * Exported for the LOCAL twin (local-checkpoint-store.ts) so the operator-queue projection can't drift. */
384
- export declare function boundedToolInput(args: unknown): unknown;
437
+ /**
438
+ * 停驻行 `input` 的投影({@link PendingCheckpoint.input})—— 两孪生经 {@link buildQueueActionFacts} 在**读时**调这一只,入参取同一次整行解码的 `tool_approval` 寄存臂 `args`,
439
+ * 卡 = 门上那一格(`parkedApprovalCard`)。判定 = `human-facing-args.ts` 的 `humanFacingArgs`
440
+ * (与活卡 `args` 同一只):整份 ⇒ 脱敏后的入参;折叠 ⇒ `{ truncated: true, bytes }`;没有工具入参 / 序列化不出 ⇒ `null`。
441
+ */
442
+ export declare function boundedToolInput(args: unknown, card: ToolApprovalCard | undefined): unknown;
385
443
  /**
386
444
  * 🔴 [ref] 车5 §9 C4:`findCheckpointCandidatesForAsk` 的 typed 候选行。刻意只有对账收敛器判据 1 真需要的
387
445
  * 五件——**没有 token 之外的任何凭据面**,`token` 本身是 resume 凭据、只在服务端内部流转(同
@@ -1,15 +1,89 @@
1
- import { isGateKind, judgeCheckpointRow, MAX_RULE_TEXT_CHARS, } from "@sema-agent/core";
2
- import { redactDeep, redactSecrets } from "../trace/redact.js";
3
- import { MAX_RULE_OFFERS, MAX_RULE_OFFER_BATCH_MEMBERS, readRuleOfferList } from "../approval-card.js";
1
+ import { checkpointIndexFacts, isGateKind, judgeCheckpointRow, MAX_RULE_TEXT_CHARS, } from "@sema-agent/core";
2
+ import { redactSecrets } from "../trace/redact.js";
3
+ import { humanFacingArgs } from "../human-facing-args.js";
4
+ import { MAX_RULE_OFFER_BATCH_MEMBERS, parkRowFacts, skillCardFacts } from "../approval-card.js";
5
+ import { decodeRuleOfferProjection, readCardRuleOffers } from "../card-rule-offers.js";
6
+ import { parkedApprovalCard } from "../approval-content-kind.js";
7
+ import { durableRowIdentity } from "../checkpoint-identity.js";
4
8
  import { createObjectColumnReader, StoreCorruptError } from "./sql-json-column.js";
5
9
  import { recordFailOpen } from "../observability/fail-open.js";
6
- const MAX_TOOL_INPUT_CHARS = 8192;
7
10
  export const TERMINAL_BACKSTOP_MS = Math.max(60_000, (Number.isFinite(Number(process.env.APPROVAL_TERMINAL_BACKSTOP_MS)) ? Number(process.env.APPROVAL_TERMINAL_BACKSTOP_MS) : 0) || 30 * 86_400_000);
8
11
  export const TERMINAL_GRACE_MS = 3_600_000;
9
12
  export const DENY_SWEEP_PAGE_ROWS = 100;
10
13
  export function parkedLegTaskId(recorded, claimHolder) {
11
14
  return typeof recorded === "string" && recorded.length > 0 ? recorded : claimHolder;
12
15
  }
16
+ function queueRiskDescriptorOf(raw) {
17
+ if (raw === undefined || raw === null)
18
+ return null;
19
+ const shape = readRiskDescriptorBody(raw);
20
+ if (shape.problem === undefined)
21
+ return shape.value;
22
+ recordFailOpen("server.approvals.risk-descriptor-cell-unreadable");
23
+ return null;
24
+ }
25
+ export function buildQueueActionFacts(read) {
26
+ return immutableData(projectQueueActionFacts(read));
27
+ }
28
+ function immutableData(value) {
29
+ const freeze = (v) => {
30
+ if (typeof v !== "object" || v === null || Object.isFrozen(v))
31
+ return;
32
+ Object.freeze(v);
33
+ for (const k of Object.keys(v))
34
+ freeze(v[k]);
35
+ };
36
+ const copy = structuredClone(value);
37
+ freeze(copy);
38
+ return copy;
39
+ }
40
+ function projectQueueActionFacts(read) {
41
+ const recordedTaskId = read.cp?.state?.rowTaskId;
42
+ const { cp, summary } = read;
43
+ if (cp === undefined || summary === undefined || isUnreadableSummaryForm(summary)) {
44
+ return { row: { toolName: null, toolCallId: null, input: null, riskDescriptor: null, rowVerdict: read.rowVerdict }, checkpointId: undefined, recordedTaskId };
45
+ }
46
+ const indexed = checkpointIndexFacts(cp);
47
+ const tool = cp.pendingAction.kind === "tool_approval" ? cp.pendingAction : undefined;
48
+ const card = parkedApprovalCard(cp.gate);
49
+ const ruleOffers = typeof tool?.toolName === "string" ? boundedRuleOffers(tool.ruleOffers, tool.toolName) : undefined;
50
+ return {
51
+ row: {
52
+ toolName: indexed.toolName,
53
+ toolCallId: indexed.toolCallId,
54
+ ...(indexed.toolCallId !== null ? { boundCallId: indexed.toolCallId } : {}),
55
+ ...(indexed.boundInputHash !== null ? { boundInputHash: indexed.boundInputHash } : {}),
56
+ input: boundedToolInput(tool?.args, card),
57
+ riskDescriptor: queueRiskDescriptorOf(indexed.riskDescriptor),
58
+ ...(ruleOffers !== undefined ? { ruleOffers } : {}),
59
+ ...(indexed.hasBidiControls === true ? { hasBidiControls: true } : {}),
60
+ ...(card !== undefined ? { approvalCard: card } : {}),
61
+ ...parkRowFacts(cp.pendingAction),
62
+ ...skillCardFacts(summary),
63
+ rowVerdict: read.rowVerdict,
64
+ },
65
+ checkpointId: summary.checkpointId,
66
+ recordedTaskId,
67
+ };
68
+ }
69
+ export function buildQueueRow(address, facts) {
70
+ const { toolName, toolCallId, boundCallId, boundInputHash, input, ...rest } = facts.row;
71
+ return {
72
+ sessionId: address.sessionId,
73
+ ...durableRowIdentity("approvals-queue", facts.checkpointId, address.token),
74
+ scope: address.scope,
75
+ toolName,
76
+ toolCallId,
77
+ ...(boundCallId !== undefined ? { boundCallId } : {}),
78
+ ...(boundInputHash !== undefined ? { boundInputHash } : {}),
79
+ gateKind: address.gateKind,
80
+ taskId: parkedLegTaskId(facts.recordedTaskId, address.claimHolder),
81
+ input,
82
+ ...(address.createdAt !== undefined ? { createdAt: address.createdAt } : {}),
83
+ deadline: address.deadline,
84
+ ...rest,
85
+ };
86
+ }
13
87
  const GATE_KIND_IS_LIVE_RUN_PARK = {
14
88
  human: true,
15
89
  irreversible_ask: true,
@@ -25,52 +99,53 @@ export function pendingRowPrecedes(a, b, pick) {
25
99
  return a.createdAt < b.createdAt || (a.createdAt === b.createdAt && a.token < b.token);
26
100
  return a.createdAt > b.createdAt || (a.createdAt === b.createdAt && a.token > b.token);
27
101
  }
28
- const MAX_RULE_OFFER_SCAN = 32;
29
- function preboundBatchMembers(item) {
30
- if (typeof item !== "object" || item === null)
31
- return item;
32
- const candidate = item;
33
- if (candidate.kind !== "batch" || !Array.isArray(candidate.rules) || candidate.rules.length <= MAX_RULE_OFFER_BATCH_MEMBERS)
34
- return item;
35
- return { ...candidate, rules: candidate.rules.slice(0, MAX_RULE_OFFER_BATCH_MEMBERS) };
102
+ export function createCardScopeRootSeat() {
103
+ let read;
104
+ return {
105
+ of: (sessionId) => read?.(sessionId),
106
+ bind: (r) => {
107
+ read = r;
108
+ },
109
+ };
36
110
  }
37
- function boundedReaderInput(raw) {
38
- return Array.isArray(raw) ? raw.slice(0, MAX_RULE_OFFER_SCAN).map(preboundBatchMembers) : raw;
111
+ export function displayRuleOfferText(text, observe) {
112
+ return redactSecrets(text, { observe }).slice(0, MAX_RULE_TEXT_CHARS);
39
113
  }
40
- export function boundedRuleOffers(raw, opts = {}) {
41
- const observe = opts.countRedactions ?? true;
42
- const scrub = (text) => redactSecrets(text, { observe }).slice(0, MAX_RULE_TEXT_CHARS);
43
- const read = readRuleOfferList(boundedReaderInput(raw));
44
- const out = [];
45
- for (const { offer } of read) {
46
- if (out.length >= MAX_RULE_OFFERS)
47
- break;
48
- switch (offer.kind) {
49
- case "single":
50
- out.push({ kind: "single", rule: scrub(offer.rule), match: offer.match, command: scrub(offer.command) });
51
- break;
52
- case "batch":
53
- out.push({
54
- kind: "batch",
55
- rules: offer.rules.slice(0, MAX_RULE_OFFER_BATCH_MEMBERS).map((r) => {
56
- switch (r.kind) {
57
- case "command":
58
- return { kind: "command", rule: scrub(r.rule), match: r.match, command: scrub(r.command), segment: scrub(r.segment) };
59
- case "directoryRead":
60
- return { kind: "directoryRead", rule: scrub(r.rule), directory: scrub(r.directory), segment: scrub(r.segment) };
61
- default:
62
- throw new Error(`unknown rule-offer batch member kind: ${JSON.stringify(r)}`);
63
- }
64
- }),
65
- uncoveredSegments: offer.uncoveredSegments,
66
- ...(offer.uncoveredDetail !== undefined ? { uncoveredDetail: offer.uncoveredDetail.map((d) => ({ segment: scrub(d.segment), reason: d.reason })) } : {}),
67
- });
68
- break;
69
- default:
70
- throw new Error(`unknown rule-offer kind: ${JSON.stringify(offer)}`);
71
- }
114
+ function displayRuleOffer(offer, observe) {
115
+ const scrub = (text) => displayRuleOfferText(text, observe);
116
+ switch (offer.kind) {
117
+ case "single":
118
+ return { kind: "single", rule: scrub(offer.rule), match: offer.match, command: scrub(offer.command) };
119
+ case "batch":
120
+ return {
121
+ kind: "batch",
122
+ rules: offer.rules.slice(0, MAX_RULE_OFFER_BATCH_MEMBERS).map((r) => {
123
+ switch (r.kind) {
124
+ case "command":
125
+ return { kind: "command", rule: scrub(r.rule), match: r.match, command: scrub(r.command), segment: scrub(r.segment) };
126
+ case "directoryRead":
127
+ return { kind: "directoryRead", rule: scrub(r.rule), directory: scrub(r.directory), segment: scrub(r.segment) };
128
+ default:
129
+ throw new Error(`unknown rule-offer batch member kind: ${JSON.stringify(r)}`);
130
+ }
131
+ }),
132
+ uncoveredSegments: offer.uncoveredSegments,
133
+ ...(offer.uncoveredDetail !== undefined ? { uncoveredDetail: offer.uncoveredDetail.map((d) => ({ segment: scrub(d.segment), reason: d.reason })) } : {}),
134
+ };
135
+ default:
136
+ throw new Error(`unknown rule-offer kind: ${JSON.stringify(offer)}`);
72
137
  }
73
- return out.length > 0 ? out : undefined;
138
+ }
139
+ export function displayRuleOffers(offers, opts = {}) {
140
+ const observe = opts.countRedactions ?? true;
141
+ return offers.length > 0 ? offers.map((o) => displayRuleOffer(o, observe)) : undefined;
142
+ }
143
+ export function boundedRuleOffers(raw, cardTool, opts = {}) {
144
+ const offers = readCardRuleOffers(raw, cardTool);
145
+ return offers === undefined ? undefined : displayRuleOffers(offers, opts);
146
+ }
147
+ export function storedRuleOfferProjection(raw) {
148
+ return displayRuleOffers(decodeRuleOfferProjection(raw), { countRedactions: false });
74
149
  }
75
150
  export class UnreadableCheckpointRowError extends StoreCorruptError {
76
151
  rowVerdict;
@@ -98,16 +173,20 @@ export function pendingTriageOrder(a, b) {
98
173
  export function queueTriageOrder(a, b) {
99
174
  return pendingTriageOrder({ severity: a.riskDescriptor?.severity, createdAt: a.createdAt }, { severity: b.riskDescriptor?.severity, createdAt: b.createdAt });
100
175
  }
101
- export function boundedToolInput(args) {
176
+ export function boundedToolInput(args, card) {
102
177
  if (args === undefined)
103
178
  return null;
104
- const redacted = redactDeep(args);
105
- const json = JSON.stringify(redacted);
106
- if (json === undefined)
107
- return null;
108
- if (json.length > MAX_TOOL_INPUT_CHARS)
109
- return { truncated: true, bytes: json.length };
110
- return redacted;
179
+ const shown = humanFacingArgs(args, card);
180
+ switch (shown.kind) {
181
+ case "whole":
182
+ return shown.value;
183
+ case "omitted":
184
+ return shown.bytes === null ? null : { truncated: true, bytes: shown.bytes };
185
+ default: {
186
+ const unreachable = shown;
187
+ throw new Error(`unhandled human-facing args reading: ${JSON.stringify(unreachable)}`);
188
+ }
189
+ }
111
190
  }
112
191
  export const DECIDED_REPLAY_SCAN_CAP = 8;
113
192
  export function approvalDecisionOfWinner(winner, boundCallId) {
@@ -5,6 +5,7 @@ import { WRITABLE, boundDeviceOf, settledDeviceBindOutcome, settledDeviceRebindO
5
5
  import { bindDeviceStatement, countDeviceBindingsOn, lockRootAndReadClaim, placeWriterStatement, readPlacementOn, rebindDeviceStatement, rowsOnSqlExec, writeCellOn } from "./execution-placement-sql.js";
6
6
  import { ensureIndexes } from "./ensure-index.js";
7
7
  import { decodeJsonColumn, foldJsonColumn, jsonColumnText, readJsonObjectColumn } from "./sql-json-column.js";
8
+ import { sealStoreClass } from "./store-boundary.js";
8
9
  export const DEVICES_TABLE = "device";
9
10
  export const DEVICE_ENROLL_TOKENS_TABLE = "device_enroll_token";
10
11
  export const DEVICE_AUDIT_TABLE = "device_audit";
@@ -616,6 +617,11 @@ export class SqlDeviceStore {
616
617
  return rows.map(mapAuditRow);
617
618
  }
618
619
  }
620
+ sealStoreClass(SqlDeviceStore, "sql-device-store", {
621
+ issueEnrollToken: "exit", getEnrollToken: "exit", consumeEnrollToken: "exit", readDeviceForAdmission: "exit", getDeviceUnscoped: "exit",
622
+ listDevicesByOwner: "exit", listDevicesUnscoped: "exit", revokeDevice: "exit", acquireConnection: "exit", heartbeatConnection: "exit",
623
+ releaseConnection: "exit", placeDeviceExecution: "exit", rebindDeviceExecution: "exit", countDeviceBindings: "exit", appendAudit: "exit", listAudit: "exit",
624
+ });
619
625
  export class TiDBDeviceStore extends SqlDeviceStore {
620
626
  constructor(pool) {
621
627
  super(mysqlDriver(pool));
@@ -0,0 +1,18 @@
1
+ /**
2
+ * **错误出身记号** —— 「这只错是谁交出来的」这件事的唯一属主(叶:零 import)。词是闭集两只({@link ErrorOrigin}),读者一只:店边界 `terminal.ts` 的 `storeBoundaryFault`。
3
+ * · `driver` —— 数据库驱动交出的错。写者两只、都是池座,都只**记**(不改错误对象、不记日志、不改控制流):
4
+ * MySQL 协议 `sql-driver.ts` 的 `createCloseAwarePool`(借连接、池上其余返回承诺的成员)与守卫租约 `leaseOf`(语句与事务动词);
5
+ * PostgreSQL `pg-pool.ts` 的 `createPgPool` 拦截层(`pool.query` / `pool.connect` 与借出 client 的 `query`)。
6
+ * 边界沿 `cause` 链查它 —— 与词法扳机(码出了本仓词法)是边界的两条扳机;它补的是词法看不见的那一类:驱动交出的**无码**错。
7
+ * · `caller` —— 调用方自己的抛出物,店把它原样还给调用方(店在自己的体里已经把它与库错分开了:记忆补丁落地的 `confirm` 钩抛出物)。
8
+ * 边界见它即同一引用放行:它不是店的失败,它的类、码、身份都是调用方的(码长什么样都不换句)。写者 = 店里分开调用方抛出物的那一处(`memory-engine-sql-apply.ts`)。
9
+ *
10
+ * 为什么记号住在这只叶子里:边界函数在 `terminal.ts`,`sql-driver.ts` 的连接初始化拒句要先读边界(`terminal.ts` → `sql-driver.ts` 再反向就成环,
11
+ * 运行时值图零环由 `test/module-cycle-gate.test.ts` 守);池座、店与边界都只依赖这一张表。
12
+ */
13
+ export type ErrorOrigin = "driver" | "caller";
14
+ /** 打记号(原样交回,便于 `throw markErrorOrigin(err, "driver")`);非对象的抛出值记不了,原样交回。先打的词为准(同一只错不改出身)。 */
15
+ export declare function markErrorOrigin<E>(err: E, origin: ErrorOrigin): E;
16
+ /** 这一只对象的出身词(只看它本身;沿 `cause` 链查是读者的事);没记过 ⇒ `undefined`。 */
17
+ export declare function errorOriginOf(err: unknown): ErrorOrigin | undefined;
18
+ //# sourceMappingURL=error-origin.d.ts.map
@@ -0,0 +1,10 @@
1
+ const ORIGIN = new WeakMap();
2
+ export function markErrorOrigin(err, origin) {
3
+ if (typeof err === "object" && err !== null && !ORIGIN.has(err))
4
+ ORIGIN.set(err, origin);
5
+ return err;
6
+ }
7
+ export function errorOriginOf(err) {
8
+ return typeof err === "object" && err !== null ? ORIGIN.get(err) : undefined;
9
+ }
10
+ //# sourceMappingURL=error-origin.js.map
@@ -3,12 +3,13 @@ import { retiredExecutionLaneHintM40 } from "./execution-lane-rename-m40.js";
3
3
  import { sessionFaceFromRow } from "../session-incarnation.js";
4
4
  import { toIso } from "./sql-row-helpers.js";
5
5
  import { SESSION_EXT_TABLE, ensureSessionExtRowStatement, ensureSessionExtRowsStatement } from "./session-ext-table.js";
6
+ import { lockSessionRootOn } from "./session-row-sql.js";
6
7
  import { WRITABLE, assertPlaceableLane, boundDeviceOf, settledMirrorOutcome, settledPlaceOutcome, } from "../execution-placement.js";
8
+ import { sealStoreObject } from "./store-boundary.js";
7
9
  const WRITER = "writer";
8
10
  const MIRROR = "mirror";
9
11
  const NOT_WRITER = "(execution_role IS NULL OR execution_role <> 'writer')";
10
12
  const EXECUTION_CELL_COLUMNS = "execution_role, execution_lane, execution_device_id, execution_device_owner_tenant, execution_device_owner_subject, execution_placed_at, execution_rev";
11
- const OCCUPANT_COLUMNS = "owner, incarnation, placement_kind";
12
13
  const READING_COLUMNS = `sm.owner, sm.incarnation, sm.placement_kind, ${EXECUTION_CELL_COLUMNS.split(", ").map((c) => `se.${c}`).join(", ")}`;
13
14
  function binder(dialect) {
14
15
  const values = [];
@@ -174,9 +175,8 @@ export function placementReadingFromRow(root, row) {
174
175
  export function rowsOnSqlExec(exec) {
175
176
  return async (sql, values) => (await exec.query(sql, [...values])).rows;
176
177
  }
177
- async function lockRootOn(conn, dialect, root) {
178
- const ph = dialect === "pg" ? "$1" : "?";
179
- return (await conn(`SELECT ${OCCUPANT_COLUMNS} FROM session_meta WHERE session_id = ${ph} FOR UPDATE`, [root]))[0];
178
+ function lockRootOn(conn, dialect, root) {
179
+ return lockSessionRootOn(conn, dialect, root);
180
180
  }
181
181
  export async function readClaimOn(conn, dialect, root) {
182
182
  const ph = dialect === "pg" ? "$1" : "?";
@@ -214,7 +214,7 @@ export function createSqlExecutionPlacementSeat(db) {
214
214
  const s = readPlacementRowStatement(db.dialect, root);
215
215
  return placementReadingFromRow(root, (await db.query(s.text, [...s.values])).rows[0]);
216
216
  };
217
- return {
217
+ return sealStoreObject({
218
218
  read,
219
219
  async place(root, occupant, cell) {
220
220
  assertPlaceableLane(root, cell);
@@ -269,6 +269,6 @@ export function createSqlExecutionPlacementSeat(db) {
269
269
  conn.release();
270
270
  }
271
271
  },
272
- };
272
+ }, "sql-execution-placement-seat", { read: "exit", place: "exit", markMirror: "exit" });
273
273
  }
274
274
  //# sourceMappingURL=execution-placement-sql.js.map
@@ -7,6 +7,7 @@ import { decodeJsonColumn, decodeNullableJsonColumn, foldJsonColumn, jsonColumnT
7
7
  import {} from "./store-contracts.js";
8
8
  import { isDupKeyError } from "./sql-errors.js";
9
9
  import { ensureIndexes } from "./ensure-index.js";
10
+ import { sealStoreClass } from "./store-boundary.js";
10
11
  export const PG_IMAGE_BAKE_SCHEMA = [
11
12
  `CREATE TABLE IF NOT EXISTS image_bake (
12
13
  bake_id VARCHAR(64) COLLATE "C" NOT NULL,
@@ -521,6 +522,11 @@ export class SqlImageBake {
521
522
  }
522
523
  }
523
524
  }
525
+ sealStoreClass(SqlImageBake, "sql-image-bake", {
526
+ createBake: "exit", createBakeIfIdle: "exit", getBake: "exit", getBakeByIdem: "exit", findActiveByArgv: "exit", findActiveAny: "exit",
527
+ findNextQueuedId: "exit", claimBake: "exit", appendEvent: "exit", maxSeq: "exit", getEvents: "exit", setStatus: "exit", setState: "exit", setTerminal: "exit",
528
+ setIndexId: "exit", heartbeatLease: "exit", requestCancel: "exit", isCancelRequested: "exit", reapStaleBakes: "exit",
529
+ });
524
530
  export class TiDBImageBake extends SqlImageBake {
525
531
  constructor(pool, poolName = "standard") {
526
532
  super(mysqlDriver(pool), poolName);