@sema-agent/server 7.132.0 → 7.133.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 (402) hide show
  1. package/MIGRATION.md +266 -0
  2. package/README.md +8 -9
  3. package/README.zh-CN.md +7 -6
  4. package/USAGE.md +174 -55
  5. package/deploy/sema-up/README.md +19 -1
  6. package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -2
  7. package/deploy/sema-up/chart/templates/server.yaml +5 -2
  8. package/deploy/sema-up/stack/compose.yaml +3 -0
  9. package/deploy/sema-up/stack/sema-stack-cluster.yaml +4 -2
  10. package/dist/adoption/plan.d.ts +3 -2
  11. package/dist/adoption/plan.js +7 -5
  12. package/dist/adoption/runner.js +3 -10
  13. package/dist/adoption/sql.d.ts +3 -2
  14. package/dist/adoption/sql.js +3 -5
  15. package/dist/adoption/wire.d.ts +4 -1
  16. package/dist/adoption/wire.js +1 -0
  17. package/dist/approval-ask-audit-store.d.ts +31 -13
  18. package/dist/approval-ask-audit-store.js +272 -74
  19. package/dist/approval-ask-machine.d.ts +15 -0
  20. package/dist/approval-ask-machine.js +6 -0
  21. package/dist/approval-ask-retention.d.ts +136 -0
  22. package/dist/approval-ask-retention.js +102 -0
  23. package/dist/approval-card.d.ts +79 -19
  24. package/dist/approval-card.js +44 -13
  25. package/dist/approval-deny-reasons.d.ts +1 -1
  26. package/dist/approval.d.ts +9 -0
  27. package/dist/approval.js +24 -3
  28. package/dist/audit.d.ts +27 -10
  29. package/dist/audit.js +12 -16
  30. package/dist/bake-runner/main.js +3 -2
  31. package/dist/boot/deferred-sandbox-path-env.js +1 -1
  32. package/dist/boot/execution-env.js +9 -7
  33. package/dist/boot/execution-lane.js +11 -0
  34. package/dist/boot/leader.js +2 -0
  35. package/dist/boot/memory-boundary.js +2 -2
  36. package/dist/boot/memory-consolidation.d.ts +5 -4
  37. package/dist/boot/memory-consolidation.js +7 -6
  38. package/dist/boot/org-delivery.d.ts +28 -0
  39. package/dist/boot/org-delivery.js +20 -0
  40. package/dist/boot/reapers.d.ts +3 -0
  41. package/dist/boot/reapers.js +21 -1
  42. package/dist/boot/resolve-spec.d.ts +3 -0
  43. package/dist/boot/resolve-spec.js +60 -81
  44. package/dist/boot/runner-deps.js +1 -0
  45. package/dist/boot/session-faces.d.ts +1 -0
  46. package/dist/boot/session-faces.js +4 -2
  47. package/dist/boot/stage-02-web-admin-pull.js +4 -1
  48. package/dist/boot/stage-06-runners.d.ts +2 -0
  49. package/dist/boot/stage-06-runners.js +6 -3
  50. package/dist/boot/stage-07-capability-layer.d.ts +2 -0
  51. package/dist/boot/stage-07-capability-layer.js +24 -3
  52. package/dist/boot/stage-08-reapers.d.ts +2 -0
  53. package/dist/boot/stage-08-reapers.js +2 -2
  54. package/dist/boot/stage-09-leader.d.ts +3 -0
  55. package/dist/boot/stage-10-http-server.d.ts +3 -0
  56. package/dist/boot/stage-10-http-server.js +5 -6
  57. package/dist/boot/stores.js +2 -2
  58. package/dist/boot/web-admin.d.ts +4 -0
  59. package/dist/boot/web-admin.js +151 -63
  60. package/dist/boot/workflow-orchestration.d.ts +2 -0
  61. package/dist/boot/workflow-orchestration.js +2 -1
  62. package/dist/brain.js +8 -3
  63. package/dist/breaker-key.d.ts +6 -0
  64. package/dist/breaker-key.js +29 -0
  65. package/dist/caller-text-echo.d.ts +9 -6
  66. package/dist/caller-text-echo.js +8 -11
  67. package/dist/capabilities/center-plugins.d.ts +7 -0
  68. package/dist/capabilities/center-plugins.js +1 -1
  69. package/dist/capabilities/composite-members.d.ts +1 -1
  70. package/dist/capabilities/composite-members.js +1 -1
  71. package/dist/capabilities/execution-lane.js +2 -2
  72. package/dist/capabilities/hands-lane.d.ts +21 -0
  73. package/dist/capabilities/hands-lane.js +10 -0
  74. package/dist/capabilities/mcp-probe.d.ts +36 -4
  75. package/dist/capabilities/mcp-probe.js +27 -4
  76. package/dist/capabilities/scenarios.d.ts +63 -7
  77. package/dist/capabilities/scenarios.js +39 -7
  78. package/dist/capability-facts.d.ts +34 -4
  79. package/dist/capability-facts.js +28 -2
  80. package/dist/center-config-tier.d.ts +69 -0
  81. package/dist/center-config-tier.js +42 -0
  82. package/dist/checkpoint-identity.d.ts +16 -0
  83. package/dist/checkpoint-identity.js +19 -0
  84. package/dist/config-catalog.d.ts +17 -10
  85. package/dist/config-catalog.js +43 -28
  86. package/dist/config-d-migration.d.ts +3 -1
  87. package/dist/config-d-migration.js +2 -2
  88. package/dist/config-dir-trust.d.ts +114 -0
  89. package/dist/config-dir-trust.js +388 -0
  90. package/dist/config-invariants.d.ts +18 -5
  91. package/dist/config-invariants.js +35 -3
  92. package/dist/config-provider.d.ts +6 -1
  93. package/dist/config-provider.js +6 -2
  94. package/dist/config-types.d.ts +71 -14
  95. package/dist/config-types.js +8 -0
  96. package/dist/config.d.ts +13 -0
  97. package/dist/config.js +121 -59
  98. package/dist/delegated-session-owner.d.ts +185 -0
  99. package/dist/delegated-session-owner.js +119 -0
  100. package/dist/device-protocol.d.ts +5 -3
  101. package/dist/device-protocol.js +1 -1
  102. package/dist/device-ws-hub.js +21 -2
  103. package/dist/device-ws-protocol.d.ts +70 -6
  104. package/dist/device-ws-protocol.js +50 -23
  105. package/dist/elicitation.js +3 -2
  106. package/dist/entry-problems.d.ts +34 -0
  107. package/dist/entry-problems.js +14 -0
  108. package/dist/execution-lane-caps.d.ts +49 -10
  109. package/dist/execution-lane-caps.js +43 -4
  110. package/dist/field-conflict.d.ts +43 -0
  111. package/dist/field-conflict.js +20 -0
  112. package/dist/fleet/fleet-bus.d.ts +80 -6
  113. package/dist/fleet/fleet-bus.js +41 -9
  114. package/dist/hooks/classic-stations.d.ts +10 -5
  115. package/dist/hooks/classic-stations.js +4 -4
  116. package/dist/hooks/command-spawn.d.ts +57 -0
  117. package/dist/hooks/command-spawn.js +139 -0
  118. package/dist/hooks/hook-llm.js +2 -2
  119. package/dist/hooks/hook-runner.d.ts +127 -25
  120. package/dist/hooks/hook-runner.js +668 -287
  121. package/dist/hooks/hook-source.d.ts +44 -0
  122. package/dist/hooks/hook-source.js +40 -0
  123. package/dist/http/active-run-conflict.d.ts +5 -13
  124. package/dist/http/active-run-conflict.js +17 -27
  125. package/dist/http/admission.js +103 -60
  126. package/dist/http/approval-sweeps.js +55 -18
  127. package/dist/http/caller-trust.d.ts +77 -0
  128. package/dist/http/caller-trust.js +143 -0
  129. package/dist/http/checkpoint-ctx.d.ts +16 -16
  130. package/dist/http/checkpoint-ctx.js +13 -10
  131. package/dist/http/claimed-run.d.ts +4 -3
  132. package/dist/http/device-placement.d.ts +2 -4
  133. package/dist/http/device-placement.js +2 -1
  134. package/dist/http/dispatch.js +10 -4
  135. package/dist/http/durable-run-leg.d.ts +4 -32
  136. package/dist/http/durable-run-leg.js +34 -10
  137. package/dist/http/owner-access.d.ts +56 -0
  138. package/dist/http/owner-access.js +42 -0
  139. package/dist/http/principal-gate.d.ts +48 -23
  140. package/dist/http/principal-gate.js +39 -12
  141. package/dist/http/readiness.d.ts +11 -5
  142. package/dist/http/readiness.js +10 -3
  143. package/dist/http/request-guards.d.ts +16 -23
  144. package/dist/http/request-guards.js +30 -15
  145. package/dist/http/resume-ctx-read.d.ts +2 -5
  146. package/dist/http/resume-ctx-read.js +7 -4
  147. package/dist/http/resume-legs.d.ts +3 -4
  148. package/dist/http/resume-legs.js +126 -69
  149. package/dist/http/retired-service-deps.d.ts +43 -0
  150. package/dist/http/retired-service-deps.js +18 -0
  151. package/dist/http/route-ctx.d.ts +44 -28
  152. package/dist/http/route-ctx.js +4 -0
  153. package/dist/http/route-table.js +2 -0
  154. package/dist/http/routes/a2a-serve.js +3 -4
  155. package/dist/http/routes/admin-config-refresh.js +1 -1
  156. package/dist/http/routes/admin-drain.js +1 -1
  157. package/dist/http/routes/admin-memory-optout.js +5 -1
  158. package/dist/http/routes/adoption.js +2 -9
  159. package/dist/http/routes/approvals-assistant.js +49 -48
  160. package/dist/http/routes/background.js +3 -2
  161. package/dist/http/routes/capabilities.js +20 -4
  162. package/dist/http/routes/config-catalog.d.ts +3 -3
  163. package/dist/http/routes/config-catalog.js +1 -1
  164. package/dist/http/routes/devices.js +3 -17
  165. package/dist/http/routes/diagnostics.js +5 -1
  166. package/dist/http/routes/images.js +6 -7
  167. package/dist/http/routes/leader.js +1 -8
  168. package/dist/http/routes/mcp-reconnect.d.ts +1 -1
  169. package/dist/http/routes/mcp-reconnect.js +3 -2
  170. package/dist/http/routes/memory-bundle.js +1 -1
  171. package/dist/http/routes/memory-compliance.js +1 -1
  172. package/dist/http/routes/memory-consolidation.js +1 -1
  173. package/dist/http/routes/memory-origin.js +1 -1
  174. package/dist/http/routes/memory-policy.d.ts +1 -1
  175. package/dist/http/routes/memory-policy.js +3 -2
  176. package/dist/http/routes/notify-wake.js +8 -21
  177. package/dist/http/routes/observability.js +2 -2
  178. package/dist/http/routes/principal-inbox.d.ts +39 -0
  179. package/dist/http/routes/principal-inbox.js +76 -0
  180. package/dist/http/routes/retention-ops.js +2 -9
  181. package/dist/http/routes/rules.js +5 -18
  182. package/dist/http/routes/runs.d.ts +5 -0
  183. package/dist/http/routes/runs.js +33 -106
  184. package/dist/http/routes/session-sync.js +15 -28
  185. package/dist/http/routes/sessions.js +30 -40
  186. package/dist/http/routes/side-query.js +6 -4
  187. package/dist/http/routes/tasks.js +50 -14
  188. package/dist/http/routes/workflows.d.ts +351 -0
  189. package/dist/http/routes/workflows.js +153 -119
  190. package/dist/http/send.d.ts +24 -3
  191. package/dist/http/send.js +14 -2
  192. package/dist/http/server.d.ts +17 -18
  193. package/dist/http/server.js +15 -13
  194. package/dist/http/stored-body-replay.js +17 -4
  195. package/dist/http/submit-ctx.js +4 -3
  196. package/dist/http/submit-replay.d.ts +4 -3
  197. package/dist/http/submit-replay.js +5 -4
  198. package/dist/http/wire-types.d.ts +10 -7
  199. package/dist/index.d.ts +1 -1
  200. package/dist/index.js +0 -1
  201. package/dist/lane-home-probe.d.ts +78 -9
  202. package/dist/lane-home-probe.js +78 -12
  203. package/dist/leader/endpoint.d.ts +4 -1
  204. package/dist/leader/endpoint.js +11 -10
  205. package/dist/limit-refusal.d.ts +17 -5
  206. package/dist/limit-refusal.js +4 -1
  207. package/dist/mcp-assertion-header.d.ts +31 -10
  208. package/dist/mcp-assertion-header.js +10 -3
  209. package/dist/mcp-tool-faces.js +1 -3
  210. package/dist/memory-project-layer.d.ts +37 -0
  211. package/dist/memory-project-layer.js +46 -0
  212. package/dist/memory-scope.d.ts +23 -16
  213. package/dist/memory-scope.js +24 -8
  214. package/dist/memory-sync-client.d.ts +27 -13
  215. package/dist/memory-sync-client.js +107 -18
  216. package/dist/model-entry-refusal.d.ts +9 -1
  217. package/dist/model-entry-refusal.js +6 -1
  218. package/dist/model-plane-face.d.ts +51 -0
  219. package/dist/model-plane-face.js +24 -0
  220. package/dist/model-provider.d.ts +5 -0
  221. package/dist/model-provider.js +4 -2
  222. package/dist/model-route-endpoint.d.ts +8 -11
  223. package/dist/model-route-endpoint.js +4 -7
  224. package/dist/model-route-env.d.ts +22 -0
  225. package/dist/model-route-env.js +2 -0
  226. package/dist/model-route-gap.d.ts +60 -30
  227. package/dist/model-route-gap.js +21 -15
  228. package/dist/observability/corrupt-read-seat.d.ts +7 -0
  229. package/dist/observability/corrupt-read-seat.js +9 -0
  230. package/dist/observability/err-text.d.ts +6 -0
  231. package/dist/observability/err-text.js +18 -4
  232. package/dist/observability/fail-open.d.ts +35 -9
  233. package/dist/observability/fail-open.js +35 -9
  234. package/dist/observability/metrics.js +1 -0
  235. package/dist/observability/prompt-manifest.d.ts +3 -17
  236. package/dist/observability/prompt-manifest.js +45 -42
  237. package/dist/observability/tool-trace.js +9 -9
  238. package/dist/operator-ask.d.ts +10 -0
  239. package/dist/operator-ask.js +3 -0
  240. package/dist/orchestration/workflow-agent-session-index.d.ts +12 -12
  241. package/dist/orchestration/workflow-agent-session-index.js +9 -13
  242. package/dist/orchestration/workflow-completion-inbox.d.ts +42 -15
  243. package/dist/orchestration/workflow-completion-inbox.js +13 -0
  244. package/dist/orchestration/workflow-notify-journal.d.ts +13 -32
  245. package/dist/orchestration/workflow-notify-journal.js +27 -34
  246. package/dist/orchestration/workflow-park-decision.d.ts +89 -0
  247. package/dist/orchestration/workflow-park-decision.js +118 -0
  248. package/dist/org-delivery-gate.d.ts +81 -0
  249. package/dist/org-delivery-gate.js +59 -0
  250. package/dist/panel-tool-names.d.ts +23 -0
  251. package/dist/panel-tool-names.js +8 -0
  252. package/dist/parked-decide.d.ts +39 -6
  253. package/dist/parked-decide.js +98 -51
  254. package/dist/parked-revive-surface.d.ts +9 -2
  255. package/dist/parked-revive-surface.js +11 -8
  256. package/dist/permission-rule-list.d.ts +1 -1
  257. package/dist/permission-rule-list.js +2 -2
  258. package/dist/plugins/approval-ask-store-file.d.ts +16 -1
  259. package/dist/plugins/approval-ask-store-file.js +21 -0
  260. package/dist/plugins/approval-ask-store-memory.d.ts +18 -1
  261. package/dist/plugins/approval-ask-store-memory.js +34 -2
  262. package/dist/plugins/approval-ask-store-sql.d.ts +25 -0
  263. package/dist/plugins/approval-ask-store-sql.js +37 -1
  264. package/dist/plugins/blob-backend.d.ts +38 -25
  265. package/dist/plugins/blob-backend.js +29 -19
  266. package/dist/plugins/breaker-state-sql.d.ts +2 -2
  267. package/dist/plugins/breaker-state-sql.js +4 -4
  268. package/dist/plugins/caching-session-store.d.ts +3 -0
  269. package/dist/plugins/caching-session-store.js +3 -0
  270. package/dist/plugins/checkpoint-store-sql.d.ts +14 -0
  271. package/dist/plugins/checkpoint-store-sql.js +20 -2
  272. package/dist/plugins/file-history-store-sql.d.ts +5 -2
  273. package/dist/plugins/file-history-store-sql.js +3 -1
  274. package/dist/plugins/file-run-store.d.ts +5 -13
  275. package/dist/plugins/file-run-store.js +9 -0
  276. package/dist/plugins/fork-routing-session-store.d.ts +9 -1
  277. package/dist/plugins/fork-routing-session-store.js +12 -1
  278. package/dist/plugins/host-platform.d.ts +2 -0
  279. package/dist/plugins/host-platform.js +2 -1
  280. package/dist/plugins/local-checkpoint-store.d.ts +2 -0
  281. package/dist/plugins/local-checkpoint-store.js +6 -1
  282. package/dist/plugins/local-session-store.d.ts +1 -1
  283. package/dist/plugins/local-session-window.d.ts +39 -0
  284. package/dist/plugins/local-session-window.js +54 -0
  285. package/dist/plugins/mailbox-recipient-lifecycle.d.ts +3 -2
  286. package/dist/plugins/mailbox-store-sql.d.ts +30 -48
  287. package/dist/plugins/mailbox-store-sql.js +77 -52
  288. package/dist/plugins/memory-embedder-fingerprint.js +2 -1
  289. package/dist/plugins/memory-run-store.d.ts +5 -13
  290. package/dist/plugins/memory-run-store.js +8 -0
  291. package/dist/plugins/one-time-migrations.d.ts +110 -5
  292. package/dist/plugins/one-time-migrations.js +320 -8
  293. package/dist/plugins/org-delivery-quota-store.d.ts +123 -0
  294. package/dist/plugins/org-delivery-quota-store.js +228 -0
  295. package/dist/plugins/pg-pool.js +39 -7
  296. package/dist/plugins/pg-session-storage.d.ts +17 -4
  297. package/dist/plugins/pg-session-storage.js +29 -6
  298. package/dist/plugins/remote-env-adb.d.ts +6 -12
  299. package/dist/plugins/remote-env-adb.js +12 -2
  300. package/dist/plugins/remote-env-k8s.d.ts +8 -12
  301. package/dist/plugins/remote-env-k8s.js +23 -5
  302. package/dist/plugins/remote-env-local-docker.d.ts +10 -15
  303. package/dist/plugins/remote-env-local-docker.js +12 -9
  304. package/dist/plugins/remote-env-ssh.d.ts +10 -16
  305. package/dist/plugins/remote-env-ssh.js +17 -11
  306. package/dist/plugins/run-store-sql.d.ts +16 -14
  307. package/dist/plugins/run-store-sql.js +22 -2
  308. package/dist/plugins/schema-indexes.js +2 -0
  309. package/dist/plugins/send-user-file.js +2 -2
  310. package/dist/plugins/session-epoch-anchor.d.ts +32 -6
  311. package/dist/plugins/session-epoch-anchor.js +2 -3
  312. package/dist/plugins/session-store.d.ts +18 -8
  313. package/dist/plugins/session-store.js +15 -4
  314. package/dist/plugins/sql-driver.d.ts +74 -11
  315. package/dist/plugins/sql-driver.js +210 -12
  316. package/dist/plugins/sql-errors.d.ts +23 -0
  317. package/dist/plugins/sql-errors.js +21 -0
  318. package/dist/plugins/store-backend.d.ts +36 -1
  319. package/dist/plugins/store-backend.js +40 -14
  320. package/dist/plugins/store-contracts.d.ts +42 -0
  321. package/dist/plugins/store-contracts.js +1 -0
  322. package/dist/plugins/tidb-pool.d.ts +6 -1
  323. package/dist/plugins/tidb-pool.js +44 -10
  324. package/dist/plugins/tidb-session-storage.d.ts +3 -2
  325. package/dist/plugins/tidb-session-storage.js +2 -2
  326. package/dist/plugins/tidb-session-store.d.ts +24 -4
  327. package/dist/plugins/tidb-session-store.js +28 -4
  328. package/dist/plugins/workflow-journal-store-sql.d.ts +73 -19
  329. package/dist/plugins/workflow-journal-store-sql.js +19 -6
  330. package/dist/plugins/workflow-run-store-sql.d.ts +30 -8
  331. package/dist/plugins/workflow-run-store-sql.js +50 -9
  332. package/dist/posture-source.d.ts +18 -10
  333. package/dist/posture-source.js +4 -1
  334. package/dist/project-identity.d.ts +45 -6
  335. package/dist/project-identity.js +162 -8
  336. package/dist/project-layer-key.d.ts +28 -0
  337. package/dist/project-layer-key.js +29 -0
  338. package/dist/question.js +3 -2
  339. package/dist/read-deny-entry.d.ts +25 -0
  340. package/dist/read-deny-entry.js +12 -0
  341. package/dist/read-face-posture.d.ts +37 -11
  342. package/dist/read-face-posture.js +32 -3
  343. package/dist/request-key-closure.d.ts +7 -0
  344. package/dist/request-key-closure.js +9 -1
  345. package/dist/request-value-closure.d.ts +5 -0
  346. package/dist/request-value-closure.js +11 -3
  347. package/dist/rule-entry-list.d.ts +26 -2
  348. package/dist/rule-entry-list.js +72 -12
  349. package/dist/rules-consent.js +3 -4
  350. package/dist/run-acceptance.d.ts +19 -3
  351. package/dist/run-acceptance.js +13 -1
  352. package/dist/run-local.js +36 -6
  353. package/dist/runs.d.ts +10 -9
  354. package/dist/runs.js +21 -3
  355. package/dist/runtime-caps-resolver.d.ts +16 -6
  356. package/dist/runtime-caps-resolver.js +18 -5
  357. package/dist/sandbox-pkg-source.d.ts +19 -1
  358. package/dist/sandbox-pkg-source.js +29 -7
  359. package/dist/security.d.ts +87 -9
  360. package/dist/security.js +52 -9
  361. package/dist/session-error-wire.d.ts +19 -2
  362. package/dist/session-error-wire.js +5 -1
  363. package/dist/session-titled-frame.d.ts +33 -0
  364. package/dist/session-titled-frame.js +4 -0
  365. package/dist/session-titler.d.ts +9 -1
  366. package/dist/session-titler.js +15 -4
  367. package/dist/spec-fields.js +21 -2
  368. package/dist/sql-engine-posture.d.ts +3 -1
  369. package/dist/task-cwd.d.ts +1 -1
  370. package/dist/task-mcp.d.ts +3 -3
  371. package/dist/task-mcp.js +7 -66
  372. package/dist/task-settings.d.ts +89 -88
  373. package/dist/task-settings.js +71 -63
  374. package/dist/text-bidi.d.ts +0 -4
  375. package/dist/text-bidi.js +1 -3
  376. package/dist/tighten-only-seats.d.ts +150 -0
  377. package/dist/tighten-only-seats.js +196 -0
  378. package/dist/tool-approval.d.ts +303 -87
  379. package/dist/tool-approval.js +623 -239
  380. package/dist/trace/core-keyset-guard.d.ts +104 -22
  381. package/dist/trace/exit-seat.d.ts +28 -0
  382. package/dist/trace/exit-seat.js +76 -0
  383. package/dist/trace/ledger-events.d.ts +3 -2
  384. package/dist/trace/project.d.ts +80 -12
  385. package/dist/trace/project.js +41 -28
  386. package/dist/trace/projection-table.d.ts +100 -0
  387. package/dist/trace/projection-table.js +130 -0
  388. package/dist/trace/redact.d.ts +54 -0
  389. package/dist/trace/redact.js +778 -152
  390. package/dist/trace/self-minted-wire.d.ts +345 -1
  391. package/dist/trace/self-minted-wire.js +117 -1
  392. package/dist/trace/wire-projection-faces.d.ts +298 -2
  393. package/dist/trace/wire-projection-faces.js +154 -13
  394. package/dist/url-refusal.js +2 -0
  395. package/dist/web-admin-client/apply-effective.d.ts +12 -0
  396. package/dist/web-admin-client/apply-effective.js +56 -5
  397. package/dist/web-admin-client/facade.d.ts +1 -1
  398. package/dist/web-admin-client/facade.js +1 -1
  399. package/dist/web-admin-client/read-face.js +5 -9
  400. package/dist/web-admin-client/skills-mcp.js +4 -5
  401. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +57 -9
  402. package/package.json +7 -3
@@ -62,7 +62,7 @@ summary 会打印手动接法。
62
62
  | `--gateway=URL` | — | 模型网关 baseURL(OpenAI 兼容);带 agent 的档必需 |
63
63
  | `--model=ID` | `deepseek-v4-flash` | 模型 id |
64
64
  | `--model-key=K` | — | 模型 API key(也可 -f 里 MODEL_API_KEY) |
65
- | `--sandbox=LANE` | single→`host`;multi→`e2b-cloud` | `host`/`e2b-cloud`(full-single / local-plus)。**执行车道**=agent 的手落在哪里,不点名就是没有手;词表与必需键的单一属主=`lib/lanes.json`。`kata`/`runc`/`e2b-self` 已退役(compose 路径对它们零接线),收到即非零退出并指路。kube 路径(full-cluster)**不选词**:runtime 按 runtimeClass `kata-qemu` 在不在自动定,车道恒 `REMOTE_EXEC=k8s` |
65
+ | `--sandbox=LANE` | 按 `--users` 取表缺省(见下「执行车道」) | **执行车道**=agent 的手落在哪里,不点名就是没有手。词表、缺省、各车道运维自备的键、已退役的词都在下面「执行车道」一节(由车道表生成,单一属主=`lib/lanes.json`)。kube 路径(full-cluster)**不选词**:runtime 按 runtimeClass `kata-qemu` 在不在自动定 |
66
66
  | `--registry=true\|false` | `true`(local-plus `false`) | 配置中心网站开关;**只收 `true` / `false`**(`yes` / `1` / `on` 在建任何目录之前拒 —— 7.104.0 之前它们被静默当成关) |
67
67
  | `--registry-image=REF` | — | sema-registry 镜像(registry=true 必需) |
68
68
  | `--git=MODE` | `none` | `none`/`provision`/`connect` |
@@ -78,6 +78,24 @@ summary 会打印手动接法。
78
78
  | `--teardown` / `--teardown-volumes` | — | 卸载(留数据 / 连卷删) |
79
79
  | `--skip-preflight` | — | 跳过预检(不建议) |
80
80
 
81
+ ### 执行车道(`--sandbox`)
82
+
83
+ <!-- @generated-begin sandbox-lanes -->
84
+ 本节由车道表 `lib/lanes.json` 生成(仓内门禁保证与表逐字一致),不要手改。
85
+
86
+ **执行车道**=agent 的手落在哪里,不点名就是没有手。`--sandbox` 只在 compose 路径(full-single / local-plus)选词;kube 路径(full-cluster)**不选词**。不点名时按 `--users` 取表里第一条允许该租户形的词:`--users=single` → `host`;`--users=multi` → `e2b-cloud`。
87
+
88
+ - **`host`**(compose 路径) — 可选 `--users`:`single`;落盘 `REMOTE_EXEC=host`;运维自备的键:无;隔离:`unsupported`。server 容器本身就是沙箱:agent 的手落在这只容器里(worktree 隔离在、OS 级隔离不在)。只给单用户 —— 多租户下一个租户的输入会把手指向另一个租户的文件与进程。
89
+ - **`e2b-cloud`**(compose 路径) — 可选 `--users`:`single` / `multi`;落盘 `REMOTE_EXEC=e2b`;运维自备的键:`E2B_API_KEY`;隔离:`supported`。E2B 云沙箱:每任务一只 microVM。E2B_API_KEY 由运维自备(sema-up 只登记键名,绝不写值)。
90
+ - **kube 路径(不选词)** — 可选 `--users`:`single` / `multi`;落盘 `REMOTE_EXEC=k8s`;运维自备的键:`K8S_SANDBOX_IMAGE`;隔离:`supported`。kube 路径**不选词**:runtime 由 kube-up.sh 按 runtimeClass `kata-qemu` 在不在自动定(在 ⇒ kata VM,不在 ⇒ runc 容器),沙箱镜像由 chart/清单给。本行只为对表(能力表 / 必需键 / REQUIRE_EXECUTION_LANE 三面),不进 --sandbox 词表。
91
+
92
+ 已退役的词(收到即非零退出并指路):
93
+
94
+ - **`kata`** — 已退役。compose 路径对 kata 零接线:选了它 .env 里不会出现任何 REMOTE_EXEC,core 落 StubExecutionEnv ⇒ 起来的 worker 一只手都没有。有 KVM 的机器上它还曾是默认值,所以这是最贵的一个死词。 改用:要 VM 级隔离走 kube 路径:sema-up.sh --profile=full-cluster(runtimeClass kata-qemu 在场即自动用 kata,不在场退 runc);留在单机 compose 上就选 host 或 e2b-cloud。
95
+ - **`runc`** — 已退役。同 kata:compose 路径对它零接线,选了等于没选车道(无手)。 改用:单机 compose 上「容器隔离」的真形就是 host(server 容器自己);要独立沙箱容器走 kube 路径 --profile=full-cluster。
96
+ - **`e2b-self`** — 已退役。自托管 E2B 端点从未接线:它只在 preflight 文案与 machines.yaml 模板里出现过,没有任何一处把它翻成 REMOTE_EXEC。 改用:先用 e2b-cloud(填 E2B_API_KEY);自托管端点的接线尚未排期。
97
+ <!-- @generated-end sandbox-lanes -->
98
+
81
99
  ### 取值旗的形(7.104.0)
82
100
 
83
101
  一条规则:**每只取值旗都过形判**,不合 ⇒ 在建任何目录、写任何文件之前非零退出,拒句点名旗、收到的值、合法形。
@@ -59,10 +59,13 @@ spec:
59
59
  {{/* 租户姿态与主 worker 同值(文件头「同 env 面」的承诺;修前缺席 ⇒ 主 worker 多租时本只仍单用户)。 */}}
60
60
  - { name: REQUIRE_PRINCIPAL, value: {{ .Values.server.requirePrincipal | default "false" | quote }} }
61
61
  - { name: SANDBOX_PKG_SOURCE, value: {{ .Values.server.sandboxPkgSource | quote }} }
62
- - { name: REMOTE_EXEC, value: k8s }
63
62
  {{/* 车道点名了就显式表态「这台有手」——REQUIRE_EXECUTION_LANE 让「车道被谁改没了」
64
- 变成拒启而不是安静的无手 worker。server 侧默认仍 off,sema-up 产物一律写 true。 */}}
63
+ 变成拒启而不是安静的无手 worker。server 侧默认仍 off,sema-up 产物一律写 true。
64
+ 下面圈起来的两行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
65
+ {{/* @generated-begin kube-lane-env */}}
66
+ - { name: REMOTE_EXEC, value: "k8s" }
65
67
  - { name: REQUIRE_EXECUTION_LANE, value: "true" }
68
+ {{/* @generated-end kube-lane-env */}}
66
69
  - { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
67
70
  {{- if .Values.server.k8sInsecureTls }}
68
71
  - { name: K8S_INSECURE_TLS, value: "true" }
@@ -70,10 +70,13 @@ spec:
70
70
  - { name: MODEL_VISION, value: {{ .Values.server.modelVision | quote }} }
71
71
  - { name: REQUIRE_PRINCIPAL, value: {{ .Values.server.requirePrincipal | default "false" | quote }} }
72
72
  - { name: SANDBOX_PKG_SOURCE, value: {{ .Values.server.sandboxPkgSource | quote }} }
73
- - { name: REMOTE_EXEC, value: k8s }
74
73
  {{/* 车道点名了就显式表态「这台有手」——REQUIRE_EXECUTION_LANE 让「车道被谁改没了」
75
- 变成拒启而不是安静的无手 worker。server 侧默认仍 off,sema-up 产物一律写 true。 */}}
74
+ 变成拒启而不是安静的无手 worker。server 侧默认仍 off,sema-up 产物一律写 true。
75
+ 下面圈起来的两行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
76
+ {{/* @generated-begin kube-lane-env */}}
77
+ - { name: REMOTE_EXEC, value: "k8s" }
76
78
  - { name: REQUIRE_EXECUTION_LANE, value: "true" }
79
+ {{/* @generated-end kube-lane-env */}}
77
80
  - { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
78
81
  {{- if .Values.server.k8sInsecureTls }}
79
82
  - { name: K8S_INSECURE_TLS, value: "true" }
@@ -97,9 +97,12 @@ services:
97
97
  # 执行车道:值由 sema-up.sh 从 lib/lanes.json 渲进 .env(resetk,每次重写)。
98
98
  # `REQUIRE_EXECUTION_LANE` 缺省 true —— 手工起这份 compose 而没点名车道时,server 拒启
99
99
  # 并说「没有手」,而不是安静地起成一个什么都干不了的 worker。
100
+ # 下面圈起来的几行(车道键、缺省、compose 路径上各车道运维自备的键)由车道表生成,不要手改。
101
+ # @generated-begin lane-env
100
102
  REMOTE_EXEC: ${REMOTE_EXEC:-}
101
103
  REQUIRE_EXECUTION_LANE: ${REQUIRE_EXECUTION_LANE:-true}
102
104
  E2B_API_KEY: ${E2B_API_KEY:-}
105
+ # @generated-end lane-env
103
106
  ports:
104
107
  - "${SERVER_BIND:-0.0.0.0}:${SERVER_PORT:-8090}:8090"
105
108
 
@@ -198,9 +198,11 @@ spec:
198
198
  # 租户姿态与 chart 主 worker 同值(cluster-up 由 --users 渲:multi ⇒ true,否则 false);修前整块缺席 ⇒ 恒单用户
199
199
  - { name: REQUIRE_PRINCIPAL, value: "__REQUIRE_PRINCIPAL__" }
200
200
  - { name: SANDBOX_PKG_SOURCE, value: "__PKG_SOURCE__" }
201
- - { name: REMOTE_EXEC, value: k8s }
202
- # 显式表态「这台有手」(车道被改没了 ⇒ 拒启,不是安静的无手 worker)
201
+ # 显式表态「这台有手」(车道被改没了 ⇒ 拒启,不是安静的无手 worker);下面圈起来的两行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改
202
+ # @generated-begin kube-lane-env
203
+ - { name: REMOTE_EXEC, value: "k8s" }
203
204
  - { name: REQUIRE_EXECUTION_LANE, value: "true" }
205
+ # @generated-end kube-lane-env
204
206
  - { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
205
207
  - { name: K8S_INSECURE_TLS, value: "true" }
206
208
  - { name: K8S_NAMESPACE, value: sema-sandbox }
@@ -160,7 +160,8 @@ export declare function checkAdoptionPrincipalShape(fromPrincipal: string, toPri
160
160
  * 纯函数(零 I/O),所以校验发生在任何库动作之前。
161
161
  */
162
162
  export declare function checkAdoptionWidths(fromPrincipal: string, toPrincipal: string): string | undefined;
163
- /** `proj:` / `userproj:` 键的 tenant 段前缀(值对由 DISTINCT 扫描按前缀解出)。 */
163
+ /** 两段键的 tenant / 属主段前缀(值对由 DISTINCT 扫描按前缀解出;扫描 SQL 的前缀臂由本表生成,一处):`proj:` / `userproj:`(core 文法)
164
+ * 与单用户项目层 `userrepo:`(S-640,文法 `project-layer-key.ts`:属主段 = principal 的段编码)。 */
164
165
  export declare const MEMORY_PROJECT_SCOPE_PREFIXES: readonly string[];
165
166
  /**
166
167
  * 一根身份轴上,「旧值 → 新值」的**值对**。`verbatim` 轴恒只有一对;`memory-scope` 轴的对数 =
@@ -175,7 +176,7 @@ export declare function buildVerbatimPair(fromPrincipal: string, toPrincipal: st
175
176
  /**
176
177
  * memory scope 键的重写(纯函数,给扫描出来的每个 scope 值算新值)。
177
178
  * · `user:<enc(from)>` ⇒ `user:<enc(to)>`(逐字等值);
178
- * · `proj:<enc(from)>/…` / `userproj:<enc(from)>/…` ⇒ 只换 tenant 段,项目段原样;
179
+ * · `proj:<enc(from)>/…` / `userproj:<enc(from)>/…` / `userrepo:<enc(from)>/…` ⇒ 只换 tenant / 属主段,项目段原样;
179
180
  * · 其它(`org:` 组织盘、无前缀的旧不透明键)⇒ `undefined` = **不属这个 principal,不动**。
180
181
  *
181
182
  * 🔴 为什么不用 `LIKE '<prefix>%'`:段是**百分号编码**的(`user%3Aweb-demo`),`%` 在 LIKE 里是通配符,
@@ -1,4 +1,5 @@
1
1
  import { formatUserScope, encodeScopeSegment, SCOPE_SEGMENT_MAX_ENCODED } from "@sema-agent/core";
2
+ import { PROJECT_LAYER_KEY_PREFIX } from "../project-layer-key.js";
2
3
  export const REBIND_LEGS = [
3
4
  {
4
5
  leg: "session_meta#owner",
@@ -213,15 +214,15 @@ export const REBIND_LEGS = [
213
214
  why: "workflow run 行的 scope 分区(scope = `principal ?? \"default\"`)。183 §4.2 D4:不变量属 update 动词面,存储层迁移豁免",
214
215
  },
215
216
  {
216
- leg: "workflow_journal#scope",
217
- table: "workflow_journal",
217
+ leg: "workflow_journal_owner#scope",
218
+ table: "workflow_journal_owner",
218
219
  kind: "bulk-rebind",
219
220
  action: "bucket-rebind",
220
221
  columns: ["scope"],
221
222
  matchColumn: "scope",
222
223
  encoding: "verbatim",
223
224
  residualKey: undefined,
224
- why: "resume 重放日志的 scope 守卫列 —— 与 run 行**同事务**(错配会让 load 守卫拒掉整条 resume)",
225
+ why: "resume 重放日志的属主 scope(S-197 起一条 run 只记在这一行,journal 行上不再有 scope 列;读写两面都经它判)—— 与 run 行**同事务**(错配会让 load 的墙拒掉整条 resume、append 的墙拒掉续写)",
225
226
  },
226
227
  {
227
228
  leg: "workflow_agent_session#scope",
@@ -320,7 +321,7 @@ export const REBIND_LEGS = [
320
321
  matchColumn: "scope",
321
322
  encoding: "memory-scope",
322
323
  residualKey: ["slug"],
323
- why: "记忆条目盘(user:/proj:/userproj: 三形键的 tenant 段 = principal)",
324
+ why: "记忆条目盘(user:/proj:/userproj:/userrepo: 四形键的 tenant / 属主段 = principal)",
324
325
  },
325
326
  {
326
327
  leg: "agent_memory_engine_cursor#scope",
@@ -406,6 +407,7 @@ export const NOT_MIGRATED_BY_DESIGN = [
406
407
  { face: "usage-window", ruling: "D1", reason: "deployment token-governance window (usage_window): a windowed governance transient — not carried, recounted from zero" },
407
408
  { face: "cost-quota", ruling: "D1", reason: "per-window cumulative spend counter (cost_quota.scope_key) — same windowed-transient class as usage-window" },
408
409
  { face: "rate-limit", ruling: "D1", reason: "per-window request counter (rate_limit.limit_key) — same windowed-transient class as usage-window" },
410
+ { face: "org-delivery-quota", ruling: "D1", reason: "per-hour cross-principal delivery counters (org_delivery_sender_quota.from_scope / org_delivery_pair_quota.from_scope,to_scope / org_delivery_recipient_quota.to_scope) — same windowed-transient class as usage-window; carrying them would hand the new identity the old window's remaining budget" },
409
411
  { face: "approval-exemption-grantor", ruling: "D2", reason: "approval_exemption.granted_by is a historical fact (who granted this exemption), not a live authorization axis" },
410
412
  { face: "approval-ask-decision-actor", ruling: "D2", reason: "approval_ask.decision_actor / decision_note record who decided — historical audit fields, never rewritten" },
411
413
  { face: "image-bake-requested-by", ruling: "D2", reason: "image_bake.requested_by records who requested the build — historical audit field" },
@@ -471,7 +473,7 @@ export function checkAdoptionWidths(fromPrincipal, toPrincipal) {
471
473
  }
472
474
  return undefined;
473
475
  }
474
- export const MEMORY_PROJECT_SCOPE_PREFIXES = ["proj:", "userproj:"];
476
+ export const MEMORY_PROJECT_SCOPE_PREFIXES = ["proj:", "userproj:", PROJECT_LAYER_KEY_PREFIX];
475
477
  export function buildVerbatimPair(fromPrincipal, toPrincipal) {
476
478
  return { from: fromPrincipal, to: toPrincipal };
477
479
  }
@@ -3,7 +3,7 @@ import { ADOPTION_PHASE, adoptionLockName, } from "../plugins/adoption-log-sql.j
3
3
  import { policyKeyFor } from "../plugins/session-policy-store-sql.js";
4
4
  import { buildRuleOwnerKey } from "../plugins/permission-rule-store-sql.js";
5
5
  import { withAdoptionQuiesce } from "./quiesce.js";
6
- import { AFFECTED_CONFIG_TEMPLATES, MEMORY_SCOPE_MAX_CHARS, NOT_MIGRATED_BY_DESIGN, REBIND_LEGS, buildVerbatimPair, rewriteMemoryScope, } from "./plan.js";
6
+ import { AFFECTED_CONFIG_TEMPLATES, MEMORY_PROJECT_SCOPE_PREFIXES, MEMORY_SCOPE_MAX_CHARS, NOT_MIGRATED_BY_DESIGN, REBIND_LEGS, buildVerbatimPair, rewriteMemoryScope, } from "./plan.js";
7
7
  import { buildBlobScanSql, buildBlobWriteSql, buildConflictProbeSql, buildMemoryScopeScanSql, buildResidualCountSql, buildRebindSql, buildRuleOwnerRekeySql, buildSessionPolicyRewriteSql, buildSessionPolicyScanSql, } from "./sql.js";
8
8
  import { AdoptionConfigsSchema, AdoptionLegsSchema, AdoptionReceiptSchema, AdoptionRejectDetailSchema, AdoptionReportSchema, } from "./wire.js";
9
9
  import { formatUserScope, encodeScopeSegment } from "@sema-agent/core";
@@ -24,15 +24,8 @@ async function resolveValuePairs(exec, dialect, leg, fromPrincipal, toPrincipal)
24
24
  ];
25
25
  }
26
26
  const seg = encodeScopeSegment(fromPrincipal);
27
- const projHead = `proj:${seg}/`;
28
- const userProjHead = `userproj:${seg}/`;
29
- const res = await exec.query(buildMemoryScopeScanSql(dialect, leg.table), [
30
- formatUserScope(fromPrincipal),
31
- projHead.length,
32
- projHead,
33
- userProjHead.length,
34
- userProjHead,
35
- ]);
27
+ const heads = MEMORY_PROJECT_SCOPE_PREFIXES.map((prefix) => `${prefix}${seg}/`);
28
+ const res = await exec.query(buildMemoryScopeScanSql(dialect, leg.table, heads.length), [formatUserScope(fromPrincipal), ...heads.flatMap((head) => [head.length, head])]);
36
29
  const pairs = [];
37
30
  for (const row of res.rows) {
38
31
  const scope = String(row.scope);
@@ -42,9 +42,10 @@ export declare function buildRebindSql(dialect: SqlDialect, leg: RebindLegSpec):
42
42
  * LIKE 里是通配符 —— 不逐字符转义就会误命中别的租户的盘(**跨租户误迁**,不是性能问题)。`LEFT(col, n) = ?`
43
43
  * 是纯等值比较,没有元字符面,两方言同形。
44
44
  *
45
- * 参数序:`[userScope, projHead.length, projHead, userProjHead.length, userProjHead]`。
45
+ * 前缀臂数 = `prefixCount`(调用方传 `MEMORY_PROJECT_SCOPE_PREFIXES.length` —— 臂由词表生成,词表长一员 SQL 跟着长一臂,不手写第二份)。
46
+ * 参数序:`[userScope, head₁.length, head₁, head₂.length, head₂, …]`。
46
47
  */
47
- export declare function buildMemoryScopeScanSql(dialect: SqlDialect, table: string): string;
48
+ export declare function buildMemoryScopeScanSql(dialect: SqlDialect, table: string, prefixCount: number): string;
48
49
  /**
49
50
  * 残留计数:某条腿上**仍挂在旧身份名下**的行数。参数序:`[fromValue]`。
50
51
  *
@@ -10,11 +10,9 @@ export function buildRebindSql(dialect, leg) {
10
10
  const sets = leg.columns.map((c, i) => `${c} = ${ph(dialect, i + 1)}`).join(", ");
11
11
  return `UPDATE ${leg.table} SET ${sets} WHERE ${leg.matchColumn} = ${ph(dialect, leg.columns.length + 1)}`;
12
12
  }
13
- export function buildMemoryScopeScanSql(dialect, table) {
14
- return (`SELECT DISTINCT scope FROM ${table}` +
15
- ` WHERE scope = ${ph(dialect, 1)}` +
16
- ` OR LEFT(scope, ${ph(dialect, 2)}) = ${ph(dialect, 3)}` +
17
- ` OR LEFT(scope, ${ph(dialect, 4)}) = ${ph(dialect, 5)}`);
13
+ export function buildMemoryScopeScanSql(dialect, table, prefixCount) {
14
+ const arms = Array.from({ length: prefixCount }, (_, i) => ` OR LEFT(scope, ${ph(dialect, 2 + 2 * i)}) = ${ph(dialect, 3 + 2 * i)}`).join("");
15
+ return `SELECT DISTINCT scope FROM ${table} WHERE scope = ${ph(dialect, 1)}${arms}`;
18
16
  }
19
17
  export function buildResidualCountSql(dialect, table, matchColumns) {
20
18
  const where = matchColumns.map((c, i) => `${c} = ${ph(dialect, i + 1)}`).join(" OR ");
@@ -67,13 +67,14 @@ export type AdoptionConfigEntry = z.infer<typeof AdoptionConfigEntrySchema>;
67
67
  * 🔴 这是**冻结的闭集**(下游按成员名写正向断言)。改名/删员 = wire 破坏;新增 = 新行为面,要先过三问。
68
68
  * 判据形见 183 §10.5:「按设计不迁」与「漏了没迁」在黑盒上必须可分,所以它是**正向声明**而不是沉默。
69
69
  */
70
- export declare const NOT_MIGRATED_FACES: readonly ["usage-window", "cost-quota", "rate-limit", "approval-exemption-grantor", "approval-ask-decision-actor", "image-bake-requested-by", "permission-rule-approval-history", "permission-rule-import-ticket"];
70
+ export declare const NOT_MIGRATED_FACES: readonly ["usage-window", "cost-quota", "rate-limit", "org-delivery-quota", "approval-exemption-grantor", "approval-ask-decision-actor", "image-bake-requested-by", "permission-rule-approval-history", "permission-rule-import-ticket"];
71
71
  export type NotMigratedFace = (typeof NOT_MIGRATED_FACES)[number];
72
72
  export declare const AdoptionNotMigratedSchema: z.ZodObject<{
73
73
  face: z.ZodEnum<{
74
74
  "usage-window": "usage-window";
75
75
  "cost-quota": "cost-quota";
76
76
  "rate-limit": "rate-limit";
77
+ "org-delivery-quota": "org-delivery-quota";
77
78
  "approval-exemption-grantor": "approval-exemption-grantor";
78
79
  "approval-ask-decision-actor": "approval-ask-decision-actor";
79
80
  "image-bake-requested-by": "image-bake-requested-by";
@@ -122,6 +123,7 @@ export declare const AdoptionReportSchema: z.ZodObject<{
122
123
  "usage-window": "usage-window";
123
124
  "cost-quota": "cost-quota";
124
125
  "rate-limit": "rate-limit";
126
+ "org-delivery-quota": "org-delivery-quota";
125
127
  "approval-exemption-grantor": "approval-exemption-grantor";
126
128
  "approval-ask-decision-actor": "approval-ask-decision-actor";
127
129
  "image-bake-requested-by": "image-bake-requested-by";
@@ -183,6 +185,7 @@ export declare const AdoptionReceiptSchema: z.ZodObject<{
183
185
  "usage-window": "usage-window";
184
186
  "cost-quota": "cost-quota";
185
187
  "rate-limit": "rate-limit";
188
+ "org-delivery-quota": "org-delivery-quota";
186
189
  "approval-exemption-grantor": "approval-exemption-grantor";
187
190
  "approval-ask-decision-actor": "approval-ask-decision-actor";
188
191
  "image-bake-requested-by": "image-bake-requested-by";
@@ -23,6 +23,7 @@ export const NOT_MIGRATED_FACES = [
23
23
  "usage-window",
24
24
  "cost-quota",
25
25
  "rate-limit",
26
+ "org-delivery-quota",
26
27
  "approval-exemption-grantor",
27
28
  "approval-ask-decision-actor",
28
29
  "image-bake-requested-by",
@@ -166,11 +166,16 @@
166
166
  * 同源(`store-backend.ts:780` 的 `config.localDataRoot`),数据落 `<root>/approval-ask-audit/`。
167
167
  *
168
168
  * ## 体量与保留
169
- * 只在真出卡时写(人批一次 = 3 行),量级 = 人的手速;账本只增不删,压缩是未来件(workflow-notify
170
- * journal 同款成文)。读面列表按收敛时刻新前旧后、上限 {@link CRASH_CONVERGED_LIST_MAX}(有界 wire)。
169
+ * 只在真出卡时写(人批一次 = 3 行),量级 = 人的手速。保留 = 审批账本的留存律(律一处成文在 `approval-ask-retention.ts`;维护 tick 按
170
+ * `APPROVAL_ASK_RETENTION_MS` 调 {@link FileApprovalAskAuditStore.rotateOlderThan}):**整问**删 —— 一问不再欠下一次起服收敛一个答案
171
+ * (下面的收敛判官此刻不会把它收成孤儿)且它所有记录里最晚的时刻早于 cutoff,它的全部行(铸造 / 决议 / 收敛 / 迟到结算)一起离开文件;
172
+ * 腿记录(按 taskId)只在没有任何留下的问还认它、且它自己也过窗时才删,于是留下的问的收敛投影(成因 / `resumeSafe`)一字不变;
173
+ * 认不出的行证不出到期,原样留;发起它的 run 还能动(跑着 / 停驻)的问也留。**只删不改**:留下的行逐字节写回(原子换文件,0o600),删了多少进读数行。
174
+ * 读面列表按收敛时刻新前旧后、上限 {@link CRASH_CONVERGED_LIST_MAX}(有界 wire)。
171
175
  */
172
176
  import type { HostDecision } from "./host-decision.js";
173
177
  import { AppendLog } from "@sema-agent/core";
178
+ import type { AuditRotationReading } from "./approval-ask-retention.js";
174
179
  import { SETTLE_OUTCOME, type HolderGoneCause, type SettleCause } from "./approval-deny-reasons.js";
175
180
  /** 数据子目录名(挂在 local 数据根下,与 `workflow-notify/` 同层同形)。 */
176
181
  export declare const APPROVAL_ASK_AUDIT_DIR = "approval-ask-audit";
@@ -328,6 +333,8 @@ export declare class FileApprovalAskAuditStore implements ApprovalAskAuditSink,
328
333
  private log;
329
334
  /** 追加口的铸造座(测试注入席:单条写失败 / 半写的确定性构造;生产恒缺省 = `new AppendLog(path)`)。 */
330
335
  private readonly openLog;
336
+ /** 轮转换文件之后的目录 fsync(测试注入席:失败的确定性构造;生产恒缺省 = {@link fsyncDirectory})。 */
337
+ private readonly fsyncDir;
331
338
  /** boot 重放快照(冻结于构造时刻 = 前世账本;本进程新写的行不进它 —— 收敛只对前世行)。 */
332
339
  private readonly replayed;
333
340
  /** 前世账本里的腿闭事件(taskId + 行序;decided 臂按「决议行之后」判)。 */
@@ -369,12 +376,12 @@ export declare class FileApprovalAskAuditStore implements ApprovalAskAuditSink,
369
376
  */
370
377
  constructor(root: string, internals?: {
371
378
  appendLog?: (path: string) => AuditAppendPort;
379
+ fsyncDir?: (dir: string) => void;
372
380
  });
373
381
  /** 重放的坏值计数(`convergeCrashedAsks().corruptLines`):重放属主跳过的坏行(撕尾不计)+ 成因词表外的行(行在、结清照认,坏值照样计数)。 */
374
382
  private corruptLines;
375
383
  /** 重放前世账本(共用口 `replayJsonlSkipping`):撕尾 = 未落完的写,静默跳过;坏行跳过 + 逐条计数 / 探针;坏行数另暴露给收敛日志。 */
376
384
  private replay;
377
- private group;
378
385
  /** append + fsync(逐行落盘:进程猝死不丢已记的行 —— 本店的全部价值就在崩溃时刻;写口 = 共用的 `AppendLog`:单次 `writeSync` 一行、末段在打开与每次追加前修(撕尾截、完整末行补换行)、失败的写截回开写处)。
379
386
  * 运行期失败**响亮不阻断**:审批可用性不押在审计盘上(盘满/只读时人还得能批),但丢行必须在遥测
380
387
  * 显形([ref] 三件套,census 登记行同批)。
@@ -445,18 +452,29 @@ export declare class FileApprovalAskAuditStore implements ApprovalAskAuditSink,
445
452
  /** S-929 收敛行的成因注(判据见头注「收敛行的 `cause`」):组的最后一个事件行之后、收敛行(若已收敛)之前,有本 taskId 的
446
453
  * 有序关停记号 ⇒ `shutdown_before_park`;否则 `crashed_before_park`。 */
447
454
  private causeOf;
448
- /**
449
- * 🔴 **S-945([ref])—— 腿证据只对被追踪的 ask 行作数**:一处成文,三处读(pending 臂的腿闭反证门 / decided 臂 / 收敛行成因注)。
450
- * 腿闭行与有序关停记号都只按 `taskId` 落;委派 / 后台子代 ask 行的 `taskId` 是**宿主** run(出处),承载它的不是宿主腿(铸造时
451
- * `legTracked:false`)⇒ 宿主腿的这两类记录对它什么都不证明(修前反证门不看 `legTracked`:宿主腿闭把子代未结清卡判成 inconsistent、不列孤儿)。
452
- * 返回 `undefined` = 这一行没有可作证的腿;否则 = 本 taskId 在 `(afterLine, beforeLine)` 之间有没有该类记录。
453
- */
454
- private legEvidence;
455
455
  private projectRow;
456
- /** scope 门与 `listLivePending` 逐字同律:`undefined` = operator 全量(含 owner null 行);串 = 只见
457
- * `owner === scope` 的行(null-owner 行对 principal 不可见,fail-closed 宁少列不超范围;`"__none__"`
458
- * 未鉴权哨兵自然恒空)。 */
456
+ /** scope 门与 `listLivePending` 逐字同律(同一只 checkpoint scope 解码):`undefined` = operator 全量(含 owner null 行);
457
+ * `_` = 匿名那一组 = owner null 的行;其余串 = 只见 `owner === scope` 的行(null-owner 行对具名主体不列,宁少列不超范围)。 */
459
458
  listCrashConverged(scope: string | undefined): CrashConvergedRow[];
459
+ /**
460
+ * **留存轮转**(审批账本留存律的审计账半场;律一处成文在 `approval-ask-retention.ts`,判据见头注「体量与保留」)。维护 tick 是唯一调用方。
461
+ *
462
+ * 读的是**文件**(前世 + 本进程两段账,行序即语义序),不是构造时冻结的前世快照:本进程铸的问要按它此刻在盘上的样子判「结了没有」。
463
+ * 判「结了」= 它挂靠的格(铸造行的 `taskId` / `sessionId` / `sourceTaskId`)都不在 `keepAnchors`(还能动的东西的挂靠集,由清扫从 run 账与
464
+ * 后台子代账列出)∧ {@link judgeOrphan} 此刻不欠它答案 —— 停驻 run / 能动子代的问(窗到期转 durable、迟到结算还要这组前置事实)、活卡
465
+ * (铸了没决)与批了腿没闭的问多老都留。删的单位是**整问**:
466
+ * · 一问的最后动静 = 它所有记录(铸造 / 决议 / 收敛 / 迟到结算)里最晚的时刻;早于 cutoff ∧ 不欠答案 ⇒ 这一问的全部行删;
467
+ * · 腿记录(按 taskId)只在它自己也早于 cutoff ∧ 没有任何留下的问是这个 taskId ∧ 这个 taskId 不在挂靠集时才删 —— 留下的问的收敛投影(成因 / `resumeSafe`)读得到的腿证据一条不少;
468
+ * · 身份说不清的迟到结算(`approvalId:null`)按它自己的时刻;认不出的行(腐行 / 词表外)证不出到期 ⇒ 原样留;
469
+ * 末尾没换行的那一段原样留在末尾(不补换行),由追加口下次打开时按 core 的同一只判词修(解析成对象补换行、撕尾截断)。
470
+ * 只删不改:留下的每一行按**原字节**写回(按换行字节切段,不经解码 —— 非 UTF-8 的字节一个不变),原子换文件({@link replaceFileBytes}:
471
+ * 0o600;换上之前失败 ⇒ 原文件原样,错误抛给维护 tick 的节流 catch;换上之后只剩目录 fsync,失败走 F 类 tag、读数照交);
472
+ * 追加口先收,下一次 append 在新文件上惰性重开。没有可删的行 ⇒ 文件一字不动、不重写。
473
+ *
474
+ * 内存同步剪:被删的问离开迟到结算的反查索引(之后对它的迟到决议证不出「窗到期已转 durable」⇒ 一行不写 —— 盘上查无前置事实的行不许写)、
475
+ * 离开 `crashConverged` 读面与前世快照。前世快照里留下的组与腿记录的行序不动(它们只在起服收敛那一拍被读,彼此仍自洽)。
476
+ */
477
+ rotateOlderThan(cutoffMs: number, keepAnchors: ReadonlySet<string>): AuditRotationReading;
460
478
  /** 收追加口(优雅关闭腿;SIGKILL 下不跑也不丢 —— 每行已 fsync)。core `AppendLog.close()` 自己吞 `closeSync` 的错、不抛(全函数),本店不再包 catch。 */
461
479
  close(): void;
462
480
  }