@sema-agent/server 7.149.0 → 7.151.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/MIGRATION.md +307 -9
  2. package/README.md +1 -1
  3. package/README.zh-CN.md +1 -1
  4. package/USAGE.md +92 -40
  5. package/deploy/sema-up/README.md +7 -1
  6. package/deploy/sema-up/chart/Chart.yaml +1 -1
  7. package/deploy/sema-up/chart/templates/NOTES.txt +5 -0
  8. package/deploy/sema-up/chart/templates/_helpers.tpl +15 -16
  9. package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -3
  10. package/deploy/sema-up/chart/templates/server.yaml +5 -3
  11. package/deploy/sema-up/chart/values-full-single.yaml +3 -1
  12. package/deploy/sema-up/chart/values.yaml +8 -1
  13. package/deploy/sema-up/cluster-up.sh +1 -0
  14. package/deploy/sema-up/kube-up.sh +1 -1
  15. package/deploy/sema-up/lib/flagshape.sh +1 -1
  16. package/deploy/sema-up/lib/helm-values-cluster.py +2 -0
  17. package/deploy/sema-up/lib/helm-values-kube.py +2 -0
  18. package/dist/adoption/import.js +3 -3
  19. package/dist/approval-ask-machine.d.ts +1 -1
  20. package/dist/approval-card.d.ts +3 -3
  21. package/dist/approval-gate-currency.d.ts +2 -2
  22. package/dist/audit.d.ts +1 -1
  23. package/dist/audit.js +2 -2
  24. package/dist/auth-bridge.d.ts +20 -0
  25. package/dist/auth-bridge.js +9 -0
  26. package/dist/background-session-reap.d.ts +2 -2
  27. package/dist/bake-runner/main.d.ts +4 -2
  28. package/dist/bind-host.d.ts +2 -3
  29. package/dist/bind-host.js +2 -4
  30. package/dist/boot/budget-tracing.js +1 -1
  31. package/dist/boot/deferred-sandbox-path-env.d.ts +5 -3
  32. package/dist/boot/deferred-sandbox-path-env.js +1 -2
  33. package/dist/boot/engine-lease.d.ts +5 -0
  34. package/dist/boot/engine-lease.js +1 -0
  35. package/dist/boot/execution-env.d.ts +8 -14
  36. package/dist/boot/execution-env.js +54 -17
  37. package/dist/boot/execution-lane.js +32 -5
  38. package/dist/boot/late-binds.d.ts +8 -4
  39. package/dist/boot/late-binds.js +7 -1
  40. package/dist/boot/memory-consolidation.d.ts +3 -2
  41. package/dist/boot/memory-consolidation.js +6 -6
  42. package/dist/boot/parked-revive-gate.d.ts +5 -5
  43. package/dist/boot/parked-revive-gate.js +2 -3
  44. package/dist/boot/reapers.d.ts +5 -0
  45. package/dist/boot/reapers.js +12 -1
  46. package/dist/boot/resolve-spec.d.ts +7 -8
  47. package/dist/boot/resolve-spec.js +80 -35
  48. package/dist/boot/retention-lane.d.ts +1 -1
  49. package/dist/boot/runner-deps.d.ts +9 -2
  50. package/dist/boot/runner-deps.js +3 -3
  51. package/dist/boot/session-age-out.d.ts +36 -0
  52. package/dist/boot/session-age-out.js +101 -0
  53. package/dist/boot/session-faces.d.ts +5 -14
  54. package/dist/boot/session-faces.js +28 -24
  55. package/dist/boot/stage-01-config.js +2 -0
  56. package/dist/boot/stage-03-store-backend.js +2 -2
  57. package/dist/boot/stage-05-execution-env.d.ts +5 -3
  58. package/dist/boot/stage-05-execution-env.js +2 -2
  59. package/dist/boot/stage-06-runners.d.ts +7 -4
  60. package/dist/boot/stage-06-runners.js +16 -8
  61. package/dist/boot/stage-07-capability-layer.d.ts +7 -4
  62. package/dist/boot/stage-07-capability-layer.js +3 -2
  63. package/dist/boot/stage-08-reapers.d.ts +7 -4
  64. package/dist/boot/stage-08-reapers.js +4 -2
  65. package/dist/boot/stage-09-leader.d.ts +11 -5
  66. package/dist/boot/stage-09-leader.js +12 -3
  67. package/dist/boot/stage-10-http-server.d.ts +44 -6
  68. package/dist/boot/stage-10-http-server.js +12 -10
  69. package/dist/boot/web-admin.d.ts +1 -1
  70. package/dist/boot/web-admin.js +3 -1
  71. package/dist/boot/workflow-orchestration.d.ts +7 -2
  72. package/dist/boot/workflow-orchestration.js +24 -7
  73. package/dist/bounded-rotation.d.ts +29 -0
  74. package/dist/bounded-rotation.js +24 -0
  75. package/dist/capability-facts.d.ts +84 -66
  76. package/dist/capability-facts.js +58 -41
  77. package/dist/center-credential.d.ts +25 -6
  78. package/dist/center-credential.js +25 -5
  79. package/dist/config-catalog.d.ts +26 -7
  80. package/dist/config-catalog.js +15 -12
  81. package/dist/config-invariants.d.ts +2 -1
  82. package/dist/config-invariants.js +4 -4
  83. package/dist/config-types.d.ts +22 -15
  84. package/dist/config.d.ts +51 -2
  85. package/dist/config.js +35 -24
  86. package/dist/deployment-governance.d.ts +7 -28
  87. package/dist/deployment-governance.js +1 -14
  88. package/dist/deployment-shape.d.ts +9 -1
  89. package/dist/deployment-shape.js +2 -1
  90. package/dist/device-protocol.d.ts +5 -4
  91. package/dist/device-protocol.js +1 -1
  92. package/dist/device-ws-hub.d.ts +1 -0
  93. package/dist/device-ws-hub.js +66 -29
  94. package/dist/device-ws-protocol.d.ts +79 -12
  95. package/dist/device-ws-protocol.js +64 -26
  96. package/dist/engine-identity.d.ts +23 -5
  97. package/dist/engine-identity.js +13 -0
  98. package/dist/entry-mode-clamp-notice.d.ts +2 -1
  99. package/dist/execution-env-refusal.d.ts +23 -0
  100. package/dist/execution-env-refusal.js +5 -0
  101. package/dist/execution-lane-caps.d.ts +3 -1
  102. package/dist/field-conflict.d.ts +3 -3
  103. package/dist/file-history-capture.d.ts +11 -4
  104. package/dist/file-history-capture.js +9 -6
  105. package/dist/file-history-disclosure.d.ts +7 -5
  106. package/dist/file-history-disclosure.js +7 -5
  107. package/dist/fleet/drain-entry.d.ts +4 -0
  108. package/dist/fleet/engine-signal.d.ts +14 -1
  109. package/dist/fleet/engine-signal.js +5 -1
  110. package/dist/fleet/fleet-reconciler.d.ts +1 -1
  111. package/dist/fleet/serving-lease.d.ts +18 -3
  112. package/dist/fleet/serving-lease.js +81 -35
  113. package/dist/fleet-client.d.ts +13 -11
  114. package/dist/fleet-client.js +53 -33
  115. package/dist/history-anchor.js +1 -1
  116. package/dist/hitl-delivery.d.ts +1 -3
  117. package/dist/hitl-delivery.js +1 -1
  118. package/dist/hooks/hook-runner.js +2 -2
  119. package/dist/host-lsp-manager.d.ts +2 -2
  120. package/dist/http/active-run-conflict.d.ts +3 -7
  121. package/dist/http/active-run-conflict.js +2 -2
  122. package/dist/http/admission.js +19 -4
  123. package/dist/http/approval-sweeps.js +7 -6
  124. package/dist/http/caller-trust.d.ts +2 -2
  125. package/dist/http/caller-trust.js +3 -3
  126. package/dist/http/checkpoint-ctx.d.ts +20 -63
  127. package/dist/http/checkpoint-ctx.js +2 -24
  128. package/dist/http/claim-heartbeat.d.ts +4 -4
  129. package/dist/http/claim-heartbeat.js +3 -3
  130. package/dist/http/dispatch.d.ts +2 -1
  131. package/dist/http/dispatch.js +36 -29
  132. package/dist/http/durable-run-leg.js +17 -17
  133. package/dist/http/health-self-report.d.ts +9 -1
  134. package/dist/http/health-self-report.js +2 -0
  135. package/dist/http/owner-access.d.ts +264 -20
  136. package/dist/http/owner-access.js +215 -5
  137. package/dist/http/readiness.d.ts +4 -2
  138. package/dist/http/resume-ctx-read.js +38 -1
  139. package/dist/http/resume-legs.d.ts +2 -1
  140. package/dist/http/resume-legs.js +273 -89
  141. package/dist/http/route-ctx.d.ts +41 -19
  142. package/dist/http/route-table.d.ts +1 -1
  143. package/dist/http/routes/a2a-serve.js +15 -14
  144. package/dist/http/routes/admin-memory-optout.d.ts +1 -1
  145. package/dist/http/routes/agents-roster.js +2 -3
  146. package/dist/http/routes/approvals-assistant.d.ts +3 -2
  147. package/dist/http/routes/approvals-assistant.js +12 -12
  148. package/dist/http/routes/background.d.ts +3 -3
  149. package/dist/http/routes/capabilities.js +10 -6
  150. package/dist/http/routes/config-catalog.d.ts +1 -1
  151. package/dist/http/routes/fleet.js +10 -8
  152. package/dist/http/routes/mcp-reconnect.js +2 -2
  153. package/dist/http/routes/memory-origin.d.ts +1 -1
  154. package/dist/http/routes/notify-wake.js +2 -3
  155. package/dist/http/routes/projects.d.ts +4 -2
  156. package/dist/http/routes/projects.js +7 -6
  157. package/dist/http/routes/retention-ops.d.ts +1 -1
  158. package/dist/http/routes/run-permission-mode.d.ts +1 -1
  159. package/dist/http/routes/run-permission-mode.js +2 -2
  160. package/dist/http/routes/runs.d.ts +1 -1
  161. package/dist/http/routes/runs.js +125 -66
  162. package/dist/http/routes/session-memory-sync.js +4 -5
  163. package/dist/http/routes/session-sync.d.ts +4 -3
  164. package/dist/http/routes/session-sync.js +174 -83
  165. package/dist/http/routes/sessions-list.js +13 -7
  166. package/dist/http/routes/sessions.d.ts +1 -1
  167. package/dist/http/routes/sessions.js +26 -48
  168. package/dist/http/routes/tasks.js +38 -23
  169. package/dist/http/routes/trace-usage.js +14 -14
  170. package/dist/http/routes/workflows.d.ts +1 -0
  171. package/dist/http/routes/workflows.js +20 -38
  172. package/dist/http/server.d.ts +28 -30
  173. package/dist/http/server.js +7 -3
  174. package/dist/http/stored-body-replay.d.ts +3 -24
  175. package/dist/http/stored-body-replay.js +2 -12
  176. package/dist/http/submit-ctx.d.ts +1 -2
  177. package/dist/http/submit-ctx.js +8 -6
  178. package/dist/http/submit-replay.d.ts +15 -2
  179. package/dist/http/submit-replay.js +10 -4
  180. package/dist/http/wire-types.d.ts +19 -6
  181. package/dist/identity-source.d.ts +20 -3
  182. package/dist/identity-source.js +14 -0
  183. package/dist/index.d.ts +4 -0
  184. package/dist/lane-home-probe.d.ts +3 -7
  185. package/dist/lane-home-probe.js +0 -1
  186. package/dist/leader/endpoint.js +9 -8
  187. package/dist/leader/leader.d.ts +2 -1
  188. package/dist/leg-facts.d.ts +19 -5
  189. package/dist/leg-facts.js +3 -1
  190. package/dist/mcp-authorization-face.d.ts +18 -14
  191. package/dist/mcp-authorization-face.js +3 -2
  192. package/dist/memory-scope.d.ts +5 -4
  193. package/dist/memory-scope.js +4 -4
  194. package/dist/memory-store-refusal.d.ts +1 -1
  195. package/dist/memory-sync-client.d.ts +30 -2
  196. package/dist/memory-sync-client.js +16 -9
  197. package/dist/observability/corrupt-read-seat.d.ts +1 -1
  198. package/dist/observability/err-text.d.ts +7 -0
  199. package/dist/observability/err-text.js +5 -0
  200. package/dist/observability/fail-open.d.ts +12 -8
  201. package/dist/observability/fail-open.js +12 -8
  202. package/dist/observability/logger.d.ts +7 -0
  203. package/dist/observability/logger.js +3 -1
  204. package/dist/observability/metrics.js +1 -0
  205. package/dist/observability/run-terminal.d.ts +1 -1
  206. package/dist/orchestration/workflow-notify-journal.d.ts +18 -1
  207. package/dist/orchestration/workflow-notify-journal.js +12 -1
  208. package/dist/orchestration/workflow-park-decision.d.ts +70 -18
  209. package/dist/orchestration/workflow-park-decision.js +49 -10
  210. package/dist/orchestration/workflow-park-holder.d.ts +65 -0
  211. package/dist/orchestration/workflow-park-holder.js +98 -0
  212. package/dist/orchestration/workflow-record-fence.d.ts +36 -0
  213. package/dist/orchestration/workflow-record-fence.js +42 -0
  214. package/dist/owner-faces.d.ts +28 -4
  215. package/dist/owner-faces.js +2 -0
  216. package/dist/parked-decide.d.ts +104 -53
  217. package/dist/parked-decide.js +153 -117
  218. package/dist/peer-directory.d.ts +2 -2
  219. package/dist/peer-inbound-face.d.ts +2 -6
  220. package/dist/peer-inbound-face.js +0 -3
  221. package/dist/peer-seat.d.ts +1 -1
  222. package/dist/peer-seat.js +52 -59
  223. package/dist/permission-mode-admission.d.ts +41 -5
  224. package/dist/permission-mode-admission.js +29 -3
  225. package/dist/plugins/adoption-log-sql.d.ts +3 -1
  226. package/dist/plugins/adoption-log-sql.js +7 -1
  227. package/dist/plugins/approval-ask-store-file.d.ts +10 -2
  228. package/dist/plugins/approval-ask-store-file.js +8 -0
  229. package/dist/plugins/approval-ask-store-memory.d.ts +6 -1
  230. package/dist/plugins/approval-ask-store-memory.js +28 -9
  231. package/dist/plugins/approval-ask-store-sql.d.ts +43 -2
  232. package/dist/plugins/approval-ask-store-sql.js +34 -5
  233. package/dist/plugins/approval-exemption-store.js +3 -0
  234. package/dist/plugins/approval-nonce-store.js +2 -0
  235. package/dist/plugins/breaker-state-sql.js +2 -0
  236. package/dist/plugins/caching-session-store.d.ts +9 -15
  237. package/dist/plugins/caching-session-store.js +6 -0
  238. package/dist/plugins/device-store-sql.js +6 -0
  239. package/dist/plugins/error-origin.d.ts +18 -0
  240. package/dist/plugins/error-origin.js +10 -0
  241. package/dist/plugins/exec-path-law.d.ts +34 -0
  242. package/dist/plugins/exec-path-law.js +13 -0
  243. package/dist/plugins/execution-placement-sql.js +6 -6
  244. package/dist/plugins/file-run-store.js +1 -1
  245. package/dist/plugins/image-bake-store-sql.js +6 -0
  246. package/dist/plugins/image-index-sql.js +4 -0
  247. package/dist/plugins/landed-attendants.d.ts +212 -0
  248. package/dist/plugins/landed-attendants.js +161 -0
  249. package/dist/plugins/leader-run-store-sql.js +4 -0
  250. package/dist/plugins/local-checkpoint-store.d.ts +4 -1
  251. package/dist/plugins/local-checkpoint-store.js +3 -0
  252. package/dist/plugins/local-session-live-reference.d.ts +40 -0
  253. package/dist/plugins/local-session-live-reference.js +39 -0
  254. package/dist/plugins/local-session-store.d.ts +71 -33
  255. package/dist/plugins/local-session-store.js +129 -27
  256. package/dist/plugins/memory-engine-pg.js +4 -0
  257. package/dist/plugins/memory-engine-sql-apply.js +5 -2
  258. package/dist/plugins/memory-engine-tidb.js +4 -0
  259. package/dist/plugins/memory-optout-grant-store-sql.js +4 -0
  260. package/dist/plugins/memory-run-store.js +1 -1
  261. package/dist/plugins/memory-sync-store-pg.js +5 -0
  262. package/dist/plugins/memory-sync-store-tidb.js +5 -0
  263. package/dist/plugins/one-time-migrations.d.ts +80 -61
  264. package/dist/plugins/one-time-migrations.js +241 -104
  265. package/dist/plugins/org-delivery-quota-store.js +4 -1
  266. package/dist/plugins/outcome-ledger-sql.js +2 -0
  267. package/dist/plugins/permission-rule-store-sql.js +11 -4
  268. package/dist/plugins/pg-cost-quota.js +4 -0
  269. package/dist/plugins/pg-pool.js +28 -1
  270. package/dist/plugins/pg-rate-limiter.js +2 -0
  271. package/dist/plugins/posix-shell-fs.d.ts +6 -1
  272. package/dist/plugins/posix-shell-fs.js +8 -3
  273. package/dist/plugins/remote-env-adb.d.ts +19 -15
  274. package/dist/plugins/remote-env-adb.js +44 -17
  275. package/dist/plugins/remote-env-connect-seat.d.ts +105 -0
  276. package/dist/plugins/remote-env-connect-seat.js +72 -0
  277. package/dist/plugins/remote-env-device.d.ts +22 -5
  278. package/dist/plugins/remote-env-device.js +114 -14
  279. package/dist/plugins/remote-env-e2b.d.ts +18 -7
  280. package/dist/plugins/remote-env-e2b.js +53 -40
  281. package/dist/plugins/remote-env-file-error.js +6 -2
  282. package/dist/plugins/remote-env-host.d.ts +18 -1
  283. package/dist/plugins/remote-env-host.js +48 -47
  284. package/dist/plugins/remote-env-k8s.d.ts +41 -39
  285. package/dist/plugins/remote-env-k8s.js +56 -32
  286. package/dist/plugins/remote-env-local-docker.d.ts +13 -8
  287. package/dist/plugins/remote-env-local-docker.js +37 -43
  288. package/dist/plugins/remote-env-ssh.d.ts +18 -12
  289. package/dist/plugins/remote-env-ssh.js +64 -62
  290. package/dist/plugins/remote-shell.d.ts +101 -2
  291. package/dist/plugins/remote-shell.js +221 -3
  292. package/dist/plugins/replica-registration.d.ts +35 -0
  293. package/dist/plugins/replica-registration.js +48 -0
  294. package/dist/plugins/resume-anchor-store-sql.d.ts +11 -2
  295. package/dist/plugins/resume-anchor-store-sql.js +12 -5
  296. package/dist/plugins/retention-lane-store-sql.d.ts +1 -1
  297. package/dist/plugins/retention-lane-store-sql.js +4 -0
  298. package/dist/plugins/retention-sql.d.ts +20 -2
  299. package/dist/plugins/retention-sql.js +11 -0
  300. package/dist/plugins/run-store-sql.d.ts +22 -3
  301. package/dist/plugins/run-store-sql.js +33 -9
  302. package/dist/plugins/scenario-prefix-switch-m42.d.ts +6 -12
  303. package/dist/plugins/scenario-prefix-switch-m42.js +7 -5
  304. package/dist/plugins/schema-consistency.d.ts +9 -5
  305. package/dist/plugins/schema-consistency.js +48 -18
  306. package/dist/plugins/schema-drift-sentence.js +1 -1
  307. package/dist/plugins/send-file-ledger.js +3 -0
  308. package/dist/plugins/serving-requirement.d.ts +68 -0
  309. package/dist/plugins/serving-requirement.js +60 -0
  310. package/dist/plugins/session-birth.d.ts +6 -2
  311. package/dist/plugins/session-capture-record-store-sql.js +2 -0
  312. package/dist/plugins/session-ext-table.d.ts +14 -1
  313. package/dist/plugins/session-ext-table.js +5 -1
  314. package/dist/plugins/session-row-sql.d.ts +49 -2
  315. package/dist/plugins/session-row-sql.js +56 -13
  316. package/dist/plugins/session-store-sql.d.ts +34 -18
  317. package/dist/plugins/session-store-sql.js +98 -17
  318. package/dist/plugins/shared-memory-store-sql.d.ts +1 -0
  319. package/dist/plugins/shared-memory-store-sql.js +6 -2
  320. package/dist/plugins/sql-driver.d.ts +2 -1
  321. package/dist/plugins/sql-driver.js +18 -3
  322. package/dist/plugins/sql-errors.d.ts +11 -6
  323. package/dist/plugins/sql-errors.js +5 -6
  324. package/dist/plugins/stop-then-start-sentence.d.ts +48 -3
  325. package/dist/plugins/stop-then-start-sentence.js +48 -0
  326. package/dist/plugins/stop-then-start.d.ts +109 -0
  327. package/dist/plugins/stop-then-start.js +104 -0
  328. package/dist/plugins/store-backend.d.ts +40 -13
  329. package/dist/plugins/store-backend.js +169 -27
  330. package/dist/plugins/store-boundary.d.ts +57 -0
  331. package/dist/plugins/store-boundary.js +139 -0
  332. package/dist/plugins/store-contracts.d.ts +29 -2
  333. package/dist/plugins/store-contracts.js +3 -0
  334. package/dist/plugins/store-fault-sentence-m53.d.ts +7 -0
  335. package/dist/plugins/store-fault-sentence-m53.js +25 -0
  336. package/dist/plugins/store-fault.d.ts +26 -7
  337. package/dist/plugins/store-fault.js +18 -2
  338. package/dist/plugins/task-attachment-store.js +9 -0
  339. package/dist/plugins/task-list-store-sql.d.ts +2 -2
  340. package/dist/plugins/task-list-store-sql.js +10 -8
  341. package/dist/plugins/tidb-cost-quota.js +4 -0
  342. package/dist/plugins/tidb-pool.js +6 -1
  343. package/dist/plugins/tidb-rate-limiter.js +4 -0
  344. package/dist/plugins/user-input-ledger-sql.js +4 -0
  345. package/dist/plugins/workflow-run-store-sql.d.ts +28 -10
  346. package/dist/plugins/workflow-run-store-sql.js +64 -4
  347. package/dist/plugins/workspace-fill.d.ts +4 -7
  348. package/dist/plugins/workspace-fill.js +2 -1
  349. package/dist/plugins/write-behind-counter.js +5 -0
  350. package/dist/process-instance.d.ts +3 -0
  351. package/dist/process-instance.js +7 -0
  352. package/dist/project-context.d.ts +64 -0
  353. package/dist/project-context.js +66 -0
  354. package/dist/project-registry.d.ts +46 -0
  355. package/dist/project-registry.js +44 -0
  356. package/dist/question.d.ts +9 -21
  357. package/dist/question.js +28 -19
  358. package/dist/request-key-closure.js +1 -1
  359. package/dist/request-value-closure.d.ts +4 -0
  360. package/dist/request-value-closure.js +10 -0
  361. package/dist/run-acceptance.d.ts +3 -2
  362. package/dist/run-acceptance.js +4 -6
  363. package/dist/run-cancel-card.d.ts +1 -1
  364. package/dist/run-cancel-card.js +2 -1
  365. package/dist/run-local.js +1 -0
  366. package/dist/runs.d.ts +37 -8
  367. package/dist/runs.js +53 -12
  368. package/dist/runtime-governance.d.ts +5 -4
  369. package/dist/security.d.ts +31 -33
  370. package/dist/security.js +41 -7
  371. package/dist/server-secret-env.d.ts +12 -10
  372. package/dist/server-secret-env.js +24 -15
  373. package/dist/session-agent.d.ts +1 -10
  374. package/dist/session-agent.js +0 -6
  375. package/dist/session-bindings.d.ts +82 -0
  376. package/dist/session-bindings.js +18 -0
  377. package/dist/session-children-retire.d.ts +2 -2
  378. package/dist/session-children-retire.js +2 -6
  379. package/dist/session-deletion.d.ts +16 -1
  380. package/dist/session-error-wire.d.ts +3 -3
  381. package/dist/session-error-wire.js +3 -3
  382. package/dist/session-incarnation.d.ts +28 -4
  383. package/dist/session-incarnation.js +14 -2
  384. package/dist/session-kind.d.ts +57 -0
  385. package/dist/session-kind.js +22 -0
  386. package/dist/session-notify-door.d.ts +4 -4
  387. package/dist/session-notify-door.js +5 -6
  388. package/dist/session-row.d.ts +21 -1
  389. package/dist/session-row.js +7 -1
  390. package/dist/session-rules-seat.d.ts +4 -3
  391. package/dist/session-rules-seat.js +3 -11
  392. package/dist/session-sync-kernel.d.ts +24 -14
  393. package/dist/session-sync-kernel.js +3 -6
  394. package/dist/session-sync.d.ts +4 -98
  395. package/dist/session-sync.js +4 -74
  396. package/dist/session-titler.d.ts +10 -3
  397. package/dist/session-titler.js +19 -6
  398. package/dist/ssh-host-key.d.ts +5 -0
  399. package/dist/ssh-host-key.js +3 -0
  400. package/dist/stores-sql/checkpoint-store-sql.d.ts +21 -2
  401. package/dist/stores-sql/checkpoint-store-sql.js +106 -18
  402. package/dist/stores-sql/file-history-store-sql.d.ts +52 -2
  403. package/dist/stores-sql/file-history-store-sql.js +108 -70
  404. package/dist/stores-sql/pg-session-storage.d.ts +34 -7
  405. package/dist/stores-sql/pg-session-storage.js +37 -13
  406. package/dist/stores-sql/retention-store-sql.d.ts +2 -10
  407. package/dist/stores-sql/retention-store-sql.js +2 -10
  408. package/dist/stores-sql/session-policy-store-sql.d.ts +30 -7
  409. package/dist/stores-sql/session-policy-store-sql.js +61 -44
  410. package/dist/stores-sql/session-write-hooks.d.ts +11 -0
  411. package/dist/stores-sql/tidb-session-store.d.ts +58 -7
  412. package/dist/stores-sql/tidb-session-store.js +37 -13
  413. package/dist/submission-exit.d.ts +3 -2
  414. package/dist/submission-exit.js +9 -1
  415. package/dist/task-cwd.d.ts +6 -5
  416. package/dist/task-settings.d.ts +19 -5
  417. package/dist/task-settings.js +13 -7
  418. package/dist/terminal.d.ts +33 -2
  419. package/dist/terminal.js +139 -9
  420. package/dist/tool-approval.d.ts +147 -12
  421. package/dist/tool-approval.js +206 -109
  422. package/dist/trace/engine-notice-wire.d.ts +14 -0
  423. package/dist/trace/engine-notice-wire.js +18 -1
  424. package/dist/trace/project.d.ts +4 -3
  425. package/dist/trace/project.js +3 -2
  426. package/dist/trace/projection-table.d.ts +33 -2
  427. package/dist/trace/self-minted-wire.d.ts +422 -26
  428. package/dist/trace/self-minted-wire.js +149 -23
  429. package/dist/trace/tool-card.d.ts +3 -0
  430. package/dist/trace/tool-card.js +24 -0
  431. package/dist/trace/tool-output-media.d.ts +2 -1
  432. package/dist/unattended-permission-mode.d.ts +1 -1
  433. package/dist/web-admin-client/apply-effective.d.ts +1 -1
  434. package/dist/web-admin-client/effective-keys.d.ts +1 -1
  435. package/dist/web-admin-client/skills-mcp.d.ts +1 -1
  436. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +120 -41
  437. package/package.json +3 -3
  438. package/wire-changes/server@7.150.0.json +335 -0
  439. package/wire-changes/server@7.151.0.json +762 -0
  440. package/dist/http/session-inherit-env.d.ts +0 -36
  441. package/dist/http/session-inherit-env.js +0 -6
@@ -113,25 +113,24 @@ false
113
113
  {{- end -}}
114
114
 
115
115
  {{- /*
116
- 单用户运维声明(env OPERATOR_SINGLE_USER)渲给 worker 的值 = 租户姿态 `server.requirePrincipal` 的否定(同一个值派生,不另开 values 键):
117
- 单用户 ⇒ "true"(这台的调用方就是运维;server 装配运维面时要单用户部署说出谁是运维,缺了起服拒);多租 ⇒ "false"(运维由具名名单另给)。
118
- `server.requirePrincipal` 只认 "true" / "false"(布尔与字符串写法同义,大小写不论;缺省 / null = "false");其它词渲染即拒 —— server 读
119
- REQUIRE_PRINCIPAL 用的是更宽的布尔词表,图表若按「不是 true 就是单用户」读,"yes" / "1" / "on" 在 server 读成多租、在这里读成单用户 ⇒
120
- 两根键互斥、起服拒;抄一份那张词表又是第二份真源。两只 worker 都调这一只。
116
+ 单用户运维声明(env OPERATOR_SINGLE_USER)渲给 worker 的值 = 部署写的显式键 `server.operatorSingleUser`(只收布尔),原样渲:`true` / `false` 逐字,不设 ⇒ 交回空(调用处不出这一行)。
117
+ **图表不替部署派生它**:「谁是运维」是部署的声明;从租户词 `server.requirePrincipal` 推出它(修前:未开 ⇒ `"true"`)会让忘设 `requirePrincipal` 的团队集群升级之后每个调用方都成运维 ——
118
+ 服务端拒句里「不止一个人调用 ⇒ 设 REQUIRE_PRINCIPAL」那一道人判,对用模板的人永远不出现。两键都没设 ⇒ 渲染即拒(句子照服务端拒句的两条出路:单人 ⇒ operatorSingleUser;多人 ⇒ requirePrincipal),不静默二选一。
119
+ `requirePrincipal` 在这里只读「设没设」(nil 或空串 = 没设),不读它的值、不抄服务端的布尔词表(两条规则读同一个词表是第二份真源);单人声明与多租的互斥由服务端起服拒(唯一的判官)。
120
+ 非布尔 ⇒ 渲染即拒:字符串 "false" 在模板里恒为真,会静默声明人人运维。两只 worker 都调这一只。
121
121
  */ -}}
122
122
  {{- define "sema.operatorSingleUser" -}}
123
- {{- $raw := .Values.server.requirePrincipal -}}
124
- {{- $rp := "" -}}
125
- {{- if not (kindIs "invalid" $raw) -}}
126
- {{- $rp = lower (trim (toString $raw)) -}}
127
- {{- end -}}
128
- {{- if eq $rp "" -}}
129
- {{- $rp = "false" -}}
130
- {{- end -}}
131
- {{- if not (has $rp (list "true" "false")) -}}
132
- {{- fail (printf "server.requirePrincipal must be \"true\" or \"false\", got %q — the chart derives OPERATOR_SINGLE_USER from it, and any other word would be read one way here and another way by the server" $rp) -}}
123
+ {{- $raw := .Values.server.operatorSingleUser -}}
124
+ {{- $rp := .Values.server.requirePrincipal -}}
125
+ {{- if kindIs "invalid" $raw -}}
126
+ {{- if or (kindIs "invalid" $rp) (eq (toString $rp) "") -}}
127
+ {{- fail "neither server.operatorSingleUser nor server.requirePrincipal is set — the chart does not derive the operator declaration from the tenancy setting (a team cluster that forgot requirePrincipal would silently make every caller an operator). Declare it in one line: a deployment used by one person: set server.operatorSingleUser=true (every caller of this deployment is its operator); a deployment called by more than one person is multi-tenant: set server.requirePrincipal=true instead (its operators are then named in OPERATOR_PRINCIPALS); a deployment that names its operators in OPERATOR_PRINCIPALS through its own env (this chart does not render that list) states so with server.operatorSingleUser=false" -}}
128
+ {{- end -}}
129
+ {{- else if kindIs "bool" $raw -}}
130
+ {{- $raw -}}
131
+ {{- else -}}
132
+ {{- fail (printf "server.operatorSingleUser must be a boolean (true or false) or unset, got %s %q — a string such as \"false\" is truthy in a template and would silently declare every caller an operator" (kindOf $raw) (toString $raw)) -}}
133
133
  {{- end -}}
134
- {{- ternary "false" "true" (eq $rp "true") -}}
135
134
  {{- end -}}
136
135
 
137
136
  {{- /*
@@ -61,9 +61,11 @@ spec:
61
61
  - { name: MODEL_VISION, value: {{ .Values.server.modelVision | quote }} }
62
62
  {{/* 租户姿态与主 worker 同值(文件头「同 env 面」的承诺;修前缺席 ⇒ 主 worker 多租时本只仍单用户)。 */}}
63
63
  - { name: REQUIRE_PRINCIPAL, value: {{ .Values.server.requirePrincipal | default "false" | quote }} }
64
- {{/* 单用户运维声明 = 租户姿态的否定(同一个值派生,不另开 values 键):单用户 ⇒ 这台的调用方就是运维;多租 ⇒ 不声明(运维由具名名单另给)。
65
- server 装配运维面时要单用户部署说出谁是运维,缺了这一行单用户 worker 起服拒。派生与「只认 true / false」见 _helpers.tpl 的 sema.operatorSingleUser。 */}}
66
- - { name: OPERATOR_SINGLE_USER, value: {{ include "sema.operatorSingleUser" . | quote }} }
64
+ {{/* 单用户运维声明 = 部署写的显式键 server.operatorSingleUser(只收布尔),原样渲;不设 ⇒ 不出这一行。图表不从租户词派生它;
65
+ 两键(operatorSingleUser / requirePrincipal)都没设 ⇒ 渲染即拒。判与句子见 _helpers.tpl 的 sema.operatorSingleUser。 */}}
66
+ {{- with (include "sema.operatorSingleUser" .) }}
67
+ - { name: OPERATOR_SINGLE_USER, value: {{ . | quote }} }
68
+ {{- end }}
67
69
  - { name: SANDBOX_PKG_SOURCE, value: {{ .Values.server.sandboxPkgSource | quote }} }
68
70
  {{/* 车道显式点名(REMOTE_EXEC)。REQUIRE_EXECUTION_LANE 是退役 env(设了即起服拒,拒句指向 REMOTE_EXEC),不再渲。
69
71
  下面圈起来的一行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
@@ -72,9 +72,11 @@ spec:
72
72
  - { name: MODEL_API_KEY, valueFrom: { secretKeyRef: { name: sema-server-env, key: MODEL_API_KEY } } }
73
73
  - { name: MODEL_VISION, value: {{ .Values.server.modelVision | quote }} }
74
74
  - { name: REQUIRE_PRINCIPAL, value: {{ .Values.server.requirePrincipal | default "false" | quote }} }
75
- {{/* 单用户运维声明 = 租户姿态的否定(同一个值派生,不另开 values 键):单用户 ⇒ 这台的调用方就是运维;多租 ⇒ 不声明(运维由具名名单另给)。
76
- server 装配运维面时要单用户部署说出谁是运维,缺了这一行单用户 worker 起服拒。派生与「只认 true / false」见 _helpers.tpl 的 sema.operatorSingleUser。 */}}
77
- - { name: OPERATOR_SINGLE_USER, value: {{ include "sema.operatorSingleUser" . | quote }} }
75
+ {{/* 单用户运维声明 = 部署写的显式键 server.operatorSingleUser(只收布尔),原样渲;不设 ⇒ 不出这一行。图表不从租户词派生它;
76
+ 两键(operatorSingleUser / requirePrincipal)都没设 ⇒ 渲染即拒。判与句子见 _helpers.tpl 的 sema.operatorSingleUser。 */}}
77
+ {{- with (include "sema.operatorSingleUser" .) }}
78
+ - { name: OPERATOR_SINGLE_USER, value: {{ . | quote }} }
79
+ {{- end }}
78
80
  - { name: SANDBOX_PKG_SOURCE, value: {{ .Values.server.sandboxPkgSource | quote }} }
79
81
  {{/* 车道显式点名(REMOTE_EXEC)。REQUIRE_EXECUTION_LANE 是退役 env(设了即起服拒,拒句指向 REMOTE_EXEC),不再渲。
80
82
  下面圈起来的一行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
@@ -1,7 +1,9 @@
1
1
  # full-single(单节点 k3s dev/测试)覆盖:1 实例 PG、preferred 反亲和(required 在单机=永久
2
2
  # Pending——真踩)、2 副本 server(钥匙卷 RWO,见文末)。用法:
3
3
  # helm upgrade --install sema-stack ./chart -n sema --create-namespace \
4
- # -f chart/values-full-single.yaml --set server.image=… --set …(凭据)
4
+ # -f chart/values-full-single.yaml --set server.image=… --set …(凭据) --set server.operatorSingleUser=true
5
+ # 末尾那一键是运维声明:单节点不等于单用户,本覆盖文件不替你写。只给一个人用 ⇒ server.operatorSingleUser=true;被不止一个人调用 ⇒ 改成 --set server.requirePrincipal=true;
6
+ # 两键都不写渲染即拒(见 values.yaml 的 server 块)。
5
7
  pg:
6
8
  instances: 1
7
9
  antiAffinity: preferred
@@ -48,7 +48,14 @@ server:
48
48
  modelId: "" # REQUIRED
49
49
  modelApiKey: "" # REQUIRED
50
50
  modelVision: "false"
51
- requirePrincipal: "false" # users=multi 时 true(身份隔离;compose 路径同名 env)。只认 "true" / "false";单用户运维声明 OPERATOR_SINGLE_USER 由它派生(false ⇒ "true")
51
+ # 两把「谁是运维」的键 —— 部署自己写,图表不替部署派生、不给缺省:**两把都没设 ⇒ 渲染即拒**(一句话说清两条出路,不静默二选一)。
52
+ # operatorSingleUser(布尔 true / false;不设 ⇒ 不渲)= 单人部署:这台的每个调用方都是运维(env OPERATOR_SINGLE_USER);只给一个人用的部署写 true。
53
+ # requirePrincipal(env REQUIRE_PRINCIPAL;不设 ⇒ 渲服务端缺省 "false")= 多人部署:身份隔离,运维由具名名单另给(env OPERATOR_PRINCIPALS,本图表不渲);
54
+ # 被不止一个人调用的部署写 true(compose 路径同名 env)。值原样递给服务端读,图表不判词。
55
+ # 只有 operatorSingleUser=true 与 requirePrincipal=true 同写才互斥,由服务端起服拒,图表不抄那一判。operatorSingleUser=false 逐字渲(服务端读 false 与缺席同判):
56
+ # 给自己 env 补了具名运维名单 OPERATOR_PRINCIPALS 的部署用它表态「我不声明单人」。kube-up / cluster-up 按 --users 把 operatorSingleUser 写进 values。
57
+ operatorSingleUser: null
58
+ requirePrincipal: null
52
59
  # 耐久审批(env DURABLE_APPROVAL;停驻 / 续跑 / /v1/approvals 整条路由)。留空 = 图表不渲这个 env,开关归引擎按姿态定
53
60
  # (单用户 + 有耐久店 ⇒ 开;requirePrincipal=true 的多用户形 ⇒ 关);"true" / "false" = 显式表态,原样渲给每只 worker。
54
61
  # sealedKey.persistence.enabled=false 时图表固定渲 "false"(钥匙跨不过重启,停驻行就续不了);此处再写 "true" ⇒ 渲染即拒。
@@ -316,6 +316,7 @@ if [ "$STACK_ENGINE" = "helm" ]; then
316
316
  V_PKG_SOURCE="$([ "$REGION" = "global" ] && echo global || echo '')" \
317
317
  V_PG_INSTANCES="$PG_INSTANCES" V_PG_AA="$PG_AA" V_REPLICAS="$SERVER_REPLICAS" \
318
318
  V_REQ_PRINCIPAL="$(principal_of_users "$USERS")" \
319
+ V_OPERATOR_SINGLE_USER="$(operator_single_user_of_users "$USERS")" \
319
320
  python3 - > "$VALSF" < "$HERE/lib/helm-values-cluster.py"
320
321
  )
321
322
  [ -s "$VALSF" ] || die "helm values 生成失败"
@@ -222,7 +222,7 @@ helm_values() { # helm_values <giteaBaseUrl> <oauthId> <oauthSecret>
222
222
  V_MODEL_GATEWAY="$MODEL_GATEWAY_BASEURL" V_MODEL_ID="$MODEL_ID" \
223
223
  V_SERVER_IMAGE="$SEMA_SERVER_IMAGE" V_REPLICAS="$SERVER_REPLICAS" \
224
224
  V_PG_INSTANCES="$PG_INSTANCES" V_PG_AA="$PG_AA" V_SC="$STORAGE_CLASS" V_SK_SC="$SEALED_KEY_SC" \
225
- V_RT_CLASS="$RUNTIME_CLASS" V_REQ_PRINCIPAL="$(principal_of_users "$USERS")" \
225
+ V_RT_CLASS="$RUNTIME_CLASS" V_REQ_PRINCIPAL="$(principal_of_users "$USERS")" V_OPERATOR_SINGLE_USER="$(operator_single_user_of_users "$USERS")" \
226
226
  V_PKG_SOURCE="$([ "$REGION" = "global" ] && echo global || echo '')" \
227
227
  V_REG_ENABLED="$REGISTRY_ENABLED" V_REG_IMAGE="${SEMA_REGISTRY_IMAGE:-}" \
228
228
  V_REG_PW="${REGISTRY_ADMIN_PASSWORD:-}" V_REG_SS="${REGISTRY_SESSION_SECRET:-}" V_REG_PT="${REGISTRY_PULL_TOKEN:-}" \
@@ -24,7 +24,7 @@ FLAG_WORDS_USERS="single multi"
24
24
  principal_of_users() { [ "$1" = "multi" ] && echo true || echo false; }
25
25
  # 租户形 ⇒ 单用户运维声明 OPERATOR_SINGLE_USER 的值(唯一定义;三只脚本 / 渲染段同调):server 装配运维面时要单用户部署说出谁是运维,
26
26
  # 不声明不起服(声明与具名名单 OPERATOR_PRINCIPALS 二选一;本工具渲前者)。single = 这台只有一个人 ⇒ 他就是运维(true);
27
- # multi = 多租,运维由具名名单另给 ⇒ 不声明(false;多租形上声明本身会被 server 拒)。chart 从 server.requirePrincipal 同一句派生。
27
+ # multi = 多租,运维由具名名单另给 ⇒ 不声明(false;多租形上声明本身会被 server 拒)。helm 图表不派生它:kube-up / cluster-up 的 helm 路径把这一句的结果写进 values 的 server.operatorSingleUser。
28
28
  operator_single_user_of_users() { [ "$1" = "multi" ] && echo false || echo true; }
29
29
 
30
30
  # users_decide <显式给了 USERS 吗(1 / 空)> —— kube 两条装配路径(kube-up / cluster-up)的租户形决策,与 sema-up 的
@@ -10,6 +10,8 @@ print(json.dumps({
10
10
  "modelGatewayBaseurl": e["V_MODEL_GATEWAY"], "modelId": e["V_MODEL_ID"],
11
11
  "modelApiKey": e["V_MODEL_KEY"], "sandboxPkgSource": e["V_PKG_SOURCE"],
12
12
  "requirePrincipal": e["V_REQ_PRINCIPAL"],
13
+ # 单用户运维声明由部署工具按 --users 写(图表不派生);值是 flagshape 那一句翻译的 true / false,JSON 布尔 = 图表只收的类型。
14
+ "operatorSingleUser": e["V_OPERATOR_SINGLE_USER"] == "true",
13
15
  },
14
16
  # chart 0.3.0 起 registry.enabled 默认 true(单机档语义)——machines 多机路径的 registry/git
15
17
  # 面还没接线,必须显式关,不然 helm 撞 registry.image required(2026-07-12 自查)
@@ -17,6 +17,8 @@ v = {
17
17
  "serviceAuthToken": e["V_SVC_TOKEN"], "modelGatewayBaseurl": e["V_MODEL_GATEWAY"],
18
18
  "modelId": e["V_MODEL_ID"], "modelApiKey": e["V_MODEL_KEY"],
19
19
  "sandboxPkgSource": e["V_PKG_SOURCE"], "requirePrincipal": e["V_REQ_PRINCIPAL"],
20
+ # 单用户运维声明由部署工具按 --users 写(图表不派生);值是 flagshape 那一句翻译的 true / false,JSON 布尔 = 图表只收的类型。
21
+ "operatorSingleUser": e["V_OPERATOR_SINGLE_USER"] == "true",
20
22
  },
21
23
  "sandbox": {"runtimeClass": e["V_RT_CLASS"],
22
24
  "networkPolicy": {"nodeCidrs": json.loads(e["V_NODE_CIDRS"])}},
@@ -1,6 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { SessionError } from "@sema-agent/core";
3
- import { createStagedLogFeed, MalformedImportEntryError, newStagingToken, StagedCommitOwnerChangedError } from "../session-sync-kernel.js";
3
+ import { createStagedLogFeed, MalformedImportEntryError, newStagingToken, StagedCommitOccupantChangedError } from "../session-sync-kernel.js";
4
4
  import { STAGED_IMPORT_INVALID_SENTENCE } from "../session-error-wire.js";
5
5
  import { recordFailOpen } from "../observability/fail-open.js";
6
6
  import { AdoptionImportBodySchema, AdoptionImportEnvelopeSchema, ADOPTION_IMPORT_CLIENT_SESSION_ID_MAX_CHARS } from "./wire.js";
@@ -93,11 +93,11 @@ async function importOne(target, clientSessionId, entries) {
93
93
  throw e;
94
94
  }
95
95
  try {
96
- await handle.commit(target.toPrincipal, { expectedOwner: undefined });
96
+ await handle.commit(target.toPrincipal, { expectedOccupant: undefined });
97
97
  }
98
98
  catch (e) {
99
99
  await handle.abort().catch(() => undefined);
100
- if (e instanceof StagedCommitOwnerChangedError)
100
+ if (e instanceof StagedCommitOccupantChangedError)
101
101
  return { clientSessionId, outcome: "already_imported", sessionId };
102
102
  throw e;
103
103
  }
@@ -18,7 +18,7 @@ export declare const MAX_DECISION_NOTE_CHARS = 2048;
18
18
  /**
19
19
  * 回决回执上「理由记上了吗」(`noteRecorded`)一格的**唯一判官与唯一组句器** —— 两口回决(live
20
20
  * `POST /v1/tool-approvals/:id/respond` 与耐久 `POST /v1/tasks/:taskId/asks/:askId/decision`)的每一个 200
21
- * 回体(PARKED 行经赎回腿受理的那一腿除外:它的理由走检查点回决链、不写 ask 行,尚无「记在哪张行」的定义,契约里点名为未覆盖)都经这两只函数说这件事,
21
+ * 回体(含 PARKED 行经停驻赎回受理的那一腿:停驻门受理之后决定记在这只问的行上,理由就在那一列)都经这两只函数说这件事,
22
22
  * 不在各自的回体字面量里手写第二份。
23
23
  *
24
24
  * 三态同一份契约:请求**没带** `note` ⇒ 键缺席(不是 `false`);带了 ⇒ `true | false`:`true` = **已确认**持久行上那段文本就是这次提交的
@@ -408,7 +408,7 @@ type ClosedWordOf<S extends ClosedWordSeat> = S extends AskClosedWordSeat ? NonN
408
408
  * {@link parkRowFacts} 读它);`CheckpointSummary` 不回显(core 原句「read the row」)⇒ inbox 行不带。
409
409
  *
410
410
  * 判据(display,不是裁决输入 —— 裁决在 core 的仲裁点,本仓无人值守腿的按类作答读的是 core 交来的 `AskRequest.classes` 本身,不经本函数):
411
- * · **两键都缺席 ⇒ 缺席**(不计数):老引擎(core 7.37.0 之前)、老行(续跑不补,KL-1214-b)、不盖 `origin` 的站(KL-1214-a)。缺席从不编默认类;
411
+ * · **两键都缺席 ⇒ 缺席**(不计数):老引擎(core 7.37.0 之前)、老行(续跑不补,[ref])、不盖 `origin` 的站([ref])。缺席从不编默认类;
412
412
  * · **在场 ⇒ 读法就是 core 的屏** `screenAskClassMembers`([ref] ⑥,core 7.38.0 [ref] 导出;引擎在写停车行前用的同一只):`askClass` 在集、`classes`
413
413
  * 非空数组且每员在集、无重复、按 `ASK_CLASSES` 规范序取首员 === `askClass`;屏收 ⇒ 投屏给的规范序副本。屏拒(半对 / 集外词 / 首员不符 /
414
414
  * 重复员)⇒ **两键都不投**(卡上少一行类 ≪ 卡上出现生词或半只对)+ 计一次 `server.approval-card.closed-word-out-of-set`([ref] 族,detail 前缀
@@ -590,8 +590,8 @@ export declare const ApprovalCardSchema: z.ZodObject<{
590
590
  inputHasBidi: z.ZodOptional<z.ZodLiteral<true>>;
591
591
  allowRuleShadowed: z.ZodOptional<z.ZodArray<z.ZodObject<{
592
592
  member: z.ZodEnum<{
593
- request: "request";
594
593
  deployment: "deployment";
594
+ request: "request";
595
595
  skill: "skill";
596
596
  hook: "hook";
597
597
  persisted: "persisted";
@@ -768,8 +768,8 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
768
768
  inputHasBidi: z.ZodOptional<z.ZodLiteral<true>>;
769
769
  allowRuleShadowed: z.ZodOptional<z.ZodArray<z.ZodObject<{
770
770
  member: z.ZodEnum<{
771
- request: "request";
772
771
  deployment: "deployment";
772
+ request: "request";
773
773
  skill: "skill";
774
774
  hook: "hook";
775
775
  persisted: "persisted";
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * ## 病灶(为什么要有这一只)
5
5
  * 问账行 `PARKED` 是终态(`approval-ask-machine.ts`:`PARKED: []`):赎回腿的单赢者是 **checkpoint 的 CAS**,取消腿动的也是 checkpoint(先 `expire` 门、再驱 run 终局),
6
- * 两条腿都不写 ask 行。于是「这张卡的门还在不在」这件事只有 checkpoint 店知道;读口若只看行,就会在卡被答过 / run 被取消之后继续说 `parked` 并指路去决定,
6
+ * 两条腿都不改 ask 行的态(赎回受理之后只把决定记在行上,行仍 `PARKED`;门被引擎重开了行也不知道)。于是「这张卡的门还在不在」这件事只有 checkpoint 店知道;读口若只看行,就会在卡被答过 / run 被取消之后继续说 `parked` 并指路去决定,
7
7
  * 而应答口对同一张卡早已答 `409 approval_stale`。同一件事两个读法 —— 本模块把它收成一个:读的是同一个问题、同一个来源。
8
8
  *
9
9
  * ## 判官
@@ -61,7 +61,7 @@
61
61
  * 行没了 ⇒ `unknown`(`row_absent`;应答口 PARKED 臂的 404 `not_found.approval` 同判)。
62
62
  *
63
63
  * ## 盲区(core 的筛仍不判的一处,如实写下)
64
- * · 种类 × 当事方的配对(结算种类与 `settlement.who` 的当事方是否相配)—— 筛不判(core KL-1265-b),本判官也不核:读的是种类。只有坏行 / 手改行才走得到。
64
+ * · 种类 × 当事方的配对(结算种类与 `settlement.who` 的当事方是否相配)—— 筛不判(core [ref]),本判官也不核:读的是种类。只有坏行 / 手改行才走得到。
65
65
  * (时刻与方向两处自 core 7.56.0 [ref] 起由筛判:I10 / I11。trace 投影读同一种记录、经同一只筛,零改即得 I10 —— 坏时刻在两个读者那里是同一个答法。)
66
66
  */
67
67
  import { type Checkpoint, type CheckpointToken, type SettlementKind } from "@sema-agent/core";
package/dist/audit.d.ts CHANGED
@@ -36,7 +36,7 @@ export interface SessionAudit {
36
36
  * 真源 = `resume_anchor`(锚店 `listBySession` 的读数),本表只是它对**一位读者**的一次投影。
37
37
  */
38
38
  export type RewindHandles = ReadonlyMap<string, string>;
39
- /** 会话视图读口(`ServiceDeps.sessionAudit`)的读者参数:`reader` = 读这张视图的**已验身份**(无身份 = `null`)。给了 ⇒ 这是一次**视图读**:用户消息行投回退手柄、体顶层投 `agent`(`session-agent.ts` 的 `readSessionAgent`);
39
+ /** 会话视图读口(`ServiceDeps.sessionAudit`)的读者参数:`reader` = 读这张视图的**已验身份**(无身份 = `null`)。给了 ⇒ 这是一次**视图读**:用户消息行投回退手柄、体顶层投 `agent`(`http/owner-access.ts` 的 `readSessionAgent`);
40
40
  * 不给(只要归属的调用方:memory-status / 自助抹除)⇒ 两样投影的读都不付。 */
41
41
  export interface SessionAuditReadOpts {
42
42
  readonly reader: Subject | null;
package/dist/audit.js CHANGED
@@ -4,7 +4,7 @@ import { PgSessionStorage } from "./stores-sql/pg-session-storage.js";
4
4
  import { LocalSessionWindow } from "./plugins/local-session-window.js";
5
5
  import { redactModelText } from "./observability/run-terminal.js";
6
6
  import { redactDeepWith } from "./trace/redact.js";
7
- import { projectToolStructured } from "./trace/tool-output-media.js";
7
+ import { projectToolCard } from "./trace/tool-card.js";
8
8
  import { INJECTED_BLOCK_RE, isAttachmentFrame } from "./user-authored-text.js";
9
9
  import { ownerKeyOf, sameKey } from "./owner-faces.js";
10
10
  export function buildRewindHandles(anchors, reader) {
@@ -68,7 +68,7 @@ function withRewindHandles(messages, entries, handles) {
68
68
  }
69
69
  const deepScrub = (v) => redactDeepWith(v, redactModelText);
70
70
  const textSlot = (v) => (typeof v === "string" ? redactModelText(v) : deepScrub(v));
71
- const readToolCard = (v) => projectToolStructured(v, deepScrub);
71
+ const readToolCard = (v) => projectToolCard(v, deepScrub);
72
72
  function readLeaf(treatment, v) {
73
73
  switch (treatment) {
74
74
  case "text": return textSlot(v);
@@ -1,5 +1,6 @@
1
1
  import { VerifiedIdentity, type AuthBridgeErrorCode } from "@sema-agent/settings-schema/api/auth-bridge";
2
2
  import { type TokenScopeRefusal } from "@sema-agent/settings-schema/api/scopes";
3
+ import type { ServiceConfig } from "./config-types.js";
3
4
  import type { Logger } from "./observability/logger.js";
4
5
  import type { Metrics } from "./observability/metrics.js";
5
6
  export interface WebAdminJwtVerifierOptions {
@@ -58,6 +59,25 @@ type ReportedOutcome = {
58
59
  * (调用方按验证失败处置:不设身份 ⇒ 门答 generic 401)。验证失败的结局验证器自己已记过账,这里只答「不装」。
59
60
  */
60
61
  export declare function admitBridgeIdentity(outcome: ReportedOutcome, sinks: BridgeSinks): BridgeIdentity | undefined;
62
+ /**
63
+ * [ref] —— 「本 worker 把登录令牌绑在哪个 scope」的**唯一读口**(判官 {@link ssoForeignScope} 与起服行 `auth_bridge_enabled` 同读)。
64
+ * · fleet 成员(`FLEET_GENERATION` 在场 —— 「是不是 fleet 形」在本仓的那一个读数,配置目录行「缺席 ⇔ 非 fleet 成员」)⇒ `config.fleetScope`:
65
+ * env `FLEET_SCOPE` 的唯一读数(缺席 = 契约缺省 scope),排空口的身份比对读的就是这一个值 —— 一个事实一个读数,不另读 env。
66
+ * 编排器给每台受管引擎同拍渲成员代际与 `FLEET_SCOPE`;成员却缺 `FLEET_SCOPE` ⇒ 绑在缺省 scope(偏多拒,与排空口同读,不读成「不绑」)。
67
+ * · 非成员(手接 / 壳起的个人引擎)⇒ `undefined` = 不绑:令牌的 scope 就是它的用户自己的空间,准入不比对(本仓不为这一形猜一个空间)。
68
+ */
69
+ export declare function ssoBoundScopeOf(config: Pick<ServiceConfig, "fleetGeneration" | "fleetScope">): string | undefined;
70
+ /**
71
+ * [ref] —— **sso 准入的 scope 相等判**(唯一判官;唯一调用点 = `http/dispatch.ts` 的入口预认证)。入参是**已装**的桥身份({@link admitBridgeIdentity} 交出的,
72
+ * scope 已由 `readTokenScope` 读定、恒在)。本 worker 绑了 scope 而令牌的 scope 不是它 ⇒ 拒,交回两只 scope(只进运维日志;HTTP 体不带本 worker 的 scope ——
73
+ * 那是另一个空间的名字);不绑或相等 ⇒ `undefined`(装)。逐字比较,不规范化(两边都是 scope id 形;不同就是不同)。
74
+ */
75
+ export declare function ssoForeignScope(identity: {
76
+ readonly scope: string;
77
+ }, config: Pick<ServiceConfig, "fleetGeneration" | "fleetScope">): {
78
+ readonly tokenScope: string;
79
+ readonly boundScope: string;
80
+ } | undefined;
61
81
  /**
62
82
  * The live object `createWebAdminJwtVerifier` produces — a single `verify` entry point over the process-level JWKS cache, and the issuer it verifies for.
63
83
  * This is also the type of the injected seat (`ServiceDeps.webAdminJwtVerifier`): an embedder's verifier states which issuer it verifies, so `createHttpServer`
@@ -23,6 +23,15 @@ export function admitBridgeIdentity(outcome, sinks) {
23
23
  }
24
24
  return { ...rest, scope: scoped.scope, ...(inc.data !== undefined ? { principalInc: inc.data } : {}) };
25
25
  }
26
+ export function ssoBoundScopeOf(config) {
27
+ return config.fleetGeneration === undefined ? undefined : config.fleetScope;
28
+ }
29
+ export function ssoForeignScope(identity, config) {
30
+ const boundScope = ssoBoundScopeOf(config);
31
+ if (boundScope === undefined || identity.scope === boundScope)
32
+ return undefined;
33
+ return { tokenScope: identity.scope, boundScope };
34
+ }
26
35
  export const DEFAULT_JWKS_TTL_SEC = 15 * 60;
27
36
  export const JWKS_FETCH_TIMEOUT_MS = 10_000;
28
37
  const MAX_JWKS_BYTES = 256 * 1024;
@@ -42,13 +42,13 @@ export interface SessionHardReap {
42
42
  * `no_pgid`(未确认)、linux ⇒ `killed`;已收割 ⇒ `already_gone`。受据按观察答([ref] 车PA 删了「已硬收过」闩:组信号任一成员收到即
43
43
  * 成功,闩在部分送达时把活着读成没了),本函数也不为「让硬面先打」挪任何一拍。
44
44
  *
45
- * `scope` = 会话行属主 `owner ?? "default"`(与 core 注册铸值 `spec.principal ?? "default"` 同源 —— 缺席 scope 在 core 的
45
+ * `scope` = 会话的引擎租户分区 `sessionTenantScope`(唯一换算 `engineScopeOfOwner`,与 core 注册铸值同源 —— 缺席 scope 在 core 的
46
46
  * `canAccess` 上 fail-closed、一行都收不到,[ref] 钉过这一病)。
47
47
  *
48
48
  * 两处调用(见文件头 ①),都 `await`:E21 删除级联 `includeRetained:false`(显式活服务照留);停止口照传请求体。应答在硬面之后发,
49
49
  * 代价 = 有 shell 行刚被软停的会话,DELETE / 停止口的应答慢到最后一行的「软停 + 宽限」(通常一次宽限;操作员旋钮 `HOST_BG_KILL_GRACE_MS`,缺省 1000;要几乎不等写 `1` ——
50
50
  * `numEnvOr` 把 `0` 读作缺席、回落缺省,与它供的其余执行车道旋钮同一条语义)。
51
- * 受委托帮手的 shell 挂在帮手自己的会话上,本函数碰不到(core KL-1107a / [ref],候 core)。
51
+ * 受委托帮手的 shell 挂在帮手自己的会话上,本函数碰不到(core [ref] / [ref],候 core)。
52
52
  * 注册表是**进程内**的:只收本副本上的行(多副本部署里别的副本上的行由那个副本自己的出口收)。
53
53
  */
54
54
  export declare function reapSessionBackgroundHard(sessionId: string, scope: string, opts: {
@@ -16,7 +16,8 @@ interface RunnerEnv {
16
16
  }
17
17
  /**
18
18
  * bake-runner 的 **env 契约**(本进程只读这些;成文另见 USAGE.md §9.7):
19
- * · 必填:`IMAGE_API_BASE`(image-api 根,尾斜杠去掉)、`BAKE_RUNNER_TOKEN`(claim / heartbeat 的运维主体 bearer;不进日志、不进子进程)。
19
+ * · 必填:`IMAGE_API_BASE`(image-api 根,尾斜杠去掉)、`BAKE_RUNNER_TOKEN`(claim / heartbeat 的运维主体 bearer;不进日志、不进子进程 —— 它是本包的自有凭据,
20
+ * 登记在 `config-catalog.ts` `BAKE_RUNNER_CREDENTIAL_ENV`,起服第一步按名与按值向引擎声明:任何子进程组都拿不到它与它的同值副本,`BAKE_ENV_ALLOW` 点到它 ⇒ 拒启)。
20
21
  * · `BAKE_RUNNER_ID`(缺省 `bake-runner-<HOSTNAME>`)、`RECIPE_REF`(缺省 `HEAD` = 用现成 checkout)、`RECIPE_DIR`(缺省 `/opt/recipes`)、
21
22
  * `BUILD_SH_PATH`(缺省 `e2b-template/dev-sandbox/build.sh`)、`BAKE_DATA_DIR`(缺省 `/data`)、`LOG_LEVEL`(缺省 info)。
22
23
  * · 数值四键(`parseNumOrFailNonNegative`,非数 / 负数拒启):`BAKE_HEARTBEAT_MS`(30000)、`BAKE_IDLE_POLL_MS`(5000)、
@@ -24,7 +25,8 @@ interface RunnerEnv {
24
25
  * · `BAKE_ENV_ALLOW=NAME,NAME`(7.103.0,[ref] 残余):本进程 spawn 的每一只子进程组(build.sh 与 git fetch / docker push /
25
26
  * docker image inspect / df)的 env 缺省 = 本进程 env 剥密(runner 自己的 `BAKE_RUNNER_TOKEN` 在内);名单点到的键从本进程 env **原样**
26
27
  * 放回(部署方显式承担 —— 例如配方脚本真要一枚 `*_PASSWORD` 做 registry 登录)。与服务侧 `LSP_ENV_ALLOW` **同一只**解析器
27
- * (`config.ts` `parseEnvNameAllowlist`)与同一只放行谓词:形错(空段 / 尾逗号 / 非变量名形 / 点名任一只名单型旋钮)⇒ **拒启**,拒句点名
28
+ * (`config.ts` `parseEnvNameAllowlist`)与同一只放行谓词:形错(空段 / 尾逗号 / 非变量名形 / 点名任一只名单型旋钮 / 点名本包自有凭据 —— 名是,
29
+ * 或值是,runner 自己的 `BAKE_RUNNER_TOKEN` 在内)⇒ **拒启**,拒句点名
28
30
  * 旋钮与段号、不回显值;本进程环境里没有的名 ⇒ 起服 `config_env_entry_rejected` 只报序号、不放行;旋钮原文本身按凭据类,不进子进程。
29
31
  * 没有多租户姿态(构建宿主守护进程没有主体 / 租户);生效名单见起服行 `bake_runner_start.envAllow`(只键名)。
30
32
  * ⚠️ 这不是服务配置目录里的键(目录 `BAKE_*` 行是服务侧 bake API 的旋钮),服务进程不读它。
@@ -7,9 +7,8 @@ export interface BindHostConfig {
7
7
  authToken?: string;
8
8
  authTokens?: Record<string, string>;
9
9
  }
10
- /** 这台部署配了任何一把 service 凭据吗(`SERVICE_AUTH_TOKEN` / `SERVICE_AUTH_TOKENS`)。 */
11
- export declare function anyServiceCredential(config: Pick<BindHostConfig, "authToken" | "authTokens">): boolean;
12
- /** 无鉴权写面(`ALLOW_UNAUTHED_WRITES`)+ 零凭据 ⇒ 起服把监听地址收窄到 loopback(见 {@link resolveBindHost})。 */
10
+ /** 无鉴权写面(`ALLOW_UNAUTHED_WRITES`)+ 全局凭据门不武装(没配 service 凭据,`hasServiceAuth`)⇒ 起服把监听地址收窄到 loopback(见 {@link resolveBindHost})。
11
+ * 逃生口开着时写门不拒,而门不武装 ⇒ 能连上这个口的都能写 —— 鉴权桥在不在不改这一句(验不过 / 不带令牌的调用方照样过)。 */
13
12
  export declare function bindMustNarrow(config: Pick<BindHostConfig, "allowUnauthedWrites" | "authToken" | "authTokens">): boolean;
14
13
  /**
15
14
  * 这台进程的监听地址(绑址旋钮 + 无鉴权自收窄)。`undefined` = Node 缺省全接口。
package/dist/bind-host.js CHANGED
@@ -1,10 +1,8 @@
1
1
  import { isIP } from "node:net";
2
2
  import { canonicalAddress } from "./net-address.js";
3
- export function anyServiceCredential(config) {
4
- return Boolean(config.authToken) || Object.keys(config.authTokens ?? {}).length > 0;
5
- }
3
+ import { hasServiceAuth } from "./identity-source.js";
6
4
  export function bindMustNarrow(config) {
7
- return Boolean(config.allowUnauthedWrites) && !anyServiceCredential(config);
5
+ return Boolean(config.allowUnauthedWrites) && !hasServiceAuth(config);
8
6
  }
9
7
  export function resolveBindHost(config) {
10
8
  const mustNarrow = bindMustNarrow(config);
@@ -34,7 +34,7 @@ export function createBudgetAndTracing(ctx) {
34
34
  const tracer = createTracer(metrics, costQuota, modelUsageTracker, fleetUsage, fleetLease, (m) => config.modelQuotaWeights[m] ?? 1, promptManifestTracker);
35
35
  const sideQueryAccounting = createSideQueryAccountant(metrics, costQuota, fleetUsage, fleetLease, (m) => config.modelQuotaWeights[m] ?? 1);
36
36
  const toolResultStore = backend?.toolResult ? backend.toolResult() : undefined;
37
- const sessionPolicyStore = backend ? backend.sessionPolicy(logger) : undefined;
37
+ const sessionPolicyStore = backend ? backend.sessionPolicy() : undefined;
38
38
  const { store: fileHistoryStore, erasure: fileHistoryErasure } = assembleFileHistory(backend);
39
39
  return {
40
40
  brain, degradeRouteWatch, pricing, counterDegradeHook, costQuota, modelUsageTracker, promptManifestTracker,
@@ -17,7 +17,9 @@
17
17
  *
18
18
  * ## 三条不可动的裁定
19
19
  *
20
- * 1. **`absolutePath` 一面不转发**,沿用词法规则(POSIX 绝对形归一 / NUL 拒 / 非绝对形 err)。
20
+ * 1. **`absolutePath` 一面不转发**,只读执行缝路径律(`plugins/exec-path-law.ts`):POSIX 绝对形**原样**交出(`..` / `.` 不折 ——
21
+ * 不折才与工具同读:七条车道的工具也原样把它交给沙箱的文件系统,`..` 由那块盘解;门的真身判决随后经下面四腿转发问的正是这只拼法)/
22
+ * NUL 拒 / 非绝对形 err。
21
23
  * 真 env 的 `absolutePath` 会按 **env 自己的 cwd** 解析相对路径,而工具真写处按 engine 跟踪的
22
24
  * cwd 解析——两个基准不同,转发它等于拿错基准铸 canonical key,而**错误的 allow 比没有门更糟**。
23
25
  * 相对形 / `~` / 盘符形因此照旧 err ⇒ `canonicalizeTarget` 失败 ⇒ 写门 `ask`(fail-closed)。
@@ -115,7 +117,7 @@ export interface DeferredSandboxPathEnvOptions {
115
117
  logger?: SandboxPathEnvLogger;
116
118
  }
117
119
  /**
118
- * 写门用的 ExecutionEnv 代理(见文件头)。fs **读**原语转发 slot 里的真 env,`absolutePath` 保留词法形,
120
+ * 写门用的 ExecutionEnv 代理(见文件头)。fs **读**原语转发 slot 里的真 env,`absolutePath` 绝对形原样(不折,见裁定 1),
119
121
  * 其余一切(写面 / shell 面 / listDir …)继承 `StubExecutionEnv` 的 `not_supported`。
120
122
  *
121
123
  * **继承而非逐一手写**是刻意的:core 日后给 `ExecutionEnv` 加必填面时,新面会随 `StubExecutionEnv`
@@ -130,7 +132,7 @@ export declare class DeferredSandboxPathEnv extends StubExecutionEnv {
130
132
  constructor(opts: DeferredSandboxPathEnvOptions);
131
133
  /** 取真 env;取不到就地铸 fail-closed 错误(并留痕一次)。 */
132
134
  private bound;
133
- /** 词法一面,**不**转发 —— 理由见文件头裁定 1。 */
135
+ /** 只读路径律的一面,**不**转发 —— 理由见文件头裁定 1。绝对形原样:门与工具读同一只拼法,`..` 交给沙箱的文件系统(经四腿转发的真身判决)。 */
134
136
  absolutePath(path: string): Promise<Result<string, FileError>>;
135
137
  exists(path: string, abortSignal?: AbortSignal): Promise<Result<boolean, FileError>>;
136
138
  canonicalPath(path: string, abortSignal?: AbortSignal): Promise<Result<string, FileError>>;
@@ -1,5 +1,4 @@
1
1
  import { FileError, StubExecutionEnv, err, ok } from "@sema-agent/core";
2
- import { normalizeAbsolutePathLexically } from "../task-cwd.js";
3
2
  const MAX_BOUND_SESSIONS = 4096;
4
3
  export class SandboxPathEnvSlots {
5
4
  bySession = new Map();
@@ -128,7 +127,7 @@ export class DeferredSandboxPathEnv extends StubExecutionEnv {
128
127
  if (!path.startsWith("/")) {
129
128
  return Promise.resolve(err(new FileError("not_supported", "this gate cannot resolve a non-absolute path (the sandbox working directory is not the gate's to guess)", path)));
130
129
  }
131
- return Promise.resolve(ok(normalizeAbsolutePathLexically(path)));
130
+ return Promise.resolve(ok(path));
132
131
  }
133
132
  async exists(path, abortSignal) {
134
133
  const b = this.bound(path, "exists");
@@ -245,6 +245,9 @@ export interface EngineLeaseExitReport {
245
245
  * · `tickMs` = 自退检查的采样拍。自退发生在**生效窗**满之后、至多再晚一拍(顶注 8);生效窗恒 ≥ `lingerMs`(`lingerMs` 是各窗里最短的一个),所以触点比 `lingerMs` 密 ⇒ 在任何状态下都先于自退。
246
246
  * 读数**不预言**自退时刻:父还活着时生效的是 owned 窗,自退只会更晚。
247
247
  * · `lane`([ref])= 此刻的车道(与自退判据同一只派生函数,每次现读)。
248
+ * · `attached`([ref])= 本副本此刻**打开着的 SSE 流**条数 —— 与自退判据第一合取(`attachedStreams() === 0`)读**同一只**读口(`deps.attachedStreams()`),每次现读,不是采样拍的缓存。
249
+ * 哪些算、哪些不算写在契约 `/health` 节计法表的「附着」一列(与 `inflightBreakdown` 的「总数 / 阻断」两列同一张表):订阅流与流式提交腿算,后台腿、无流的同步腿、leader 腿不算。
250
+ * 它是**附着流条数,不是活跃调用方**:纯轮询壳(零 SSE)与毫秒级请求的下采样读到 0 合法 —— 判「这台引擎此刻有没有人在用」要连 `inflight` 与最近触点一起读(顶注 3),不能拿 `attached === 0` 当「没人」。
248
251
  *
249
252
  * ## 一源
250
253
  * 与租约腿自己的行为同一处铸出:`engine_lease_armed` 日志、自退判据用的窗、拍频推导(`tickMs = min(15s, 最短窗)`)和本读数读的是同一组数 ——
@@ -255,6 +258,8 @@ export interface EngineLeaseFacts {
255
258
  readonly tickMs: number;
256
259
  /** [ref]:此刻的车道。 */
257
260
  readonly lane: EngineLane;
261
+ /** [ref]:此刻打开着的 SSE 附着流条数(整数,≥ 0;语义与读口见上「报的是什么」一条 —— 附着流条数,不是活跃调用方)。 */
262
+ readonly attached: number;
258
263
  /** [ref] 首窗格({@link EngineLeaseFirstAttachFacts}):候首触窗有限(owned 窗有限)才在场 —— 永不到期的窗不上 wire(同上一段那条律)。 */
259
264
  readonly firstAttach?: EngineLeaseFirstAttachFacts;
260
265
  /** [ref] 交接格({@link EngineHandoverFacts}):只在 handover 车道在场。 */
@@ -184,6 +184,7 @@ export function createEngineLeaseTracker(deps) {
184
184
  lingerMs: shortestLingerMs,
185
185
  tickMs,
186
186
  lane: laneNow().lane,
187
+ attached: deps.attachedStreams(),
187
188
  ...(firstAttach !== undefined ? { firstAttach } : {}),
188
189
  ...(handover !== undefined ? { handover } : {}),
189
190
  });
@@ -19,6 +19,7 @@ import { type LocalDockerCapacity } from "../plugins/local-docker-capacity.js";
19
19
  import * as facts from "../capability-facts.js";
20
20
  import { type TaskAttachmentStore } from "../plugins/task-attachment-store.js";
21
21
  import type { TaskInheritEnv } from "../request-value-closure.js";
22
+ import { type SessionBindings, type SessionBindingSeat } from "../session-bindings.js";
22
23
  import { type HeadRead } from "../session-incarnation.js";
23
24
  import type { SpaceReclaimer } from "../workspace-space.js";
24
25
  import { type SessionResidentCounts } from "../session-resident-background.js";
@@ -43,20 +44,11 @@ import { type SessionResidentCounts } from "../session-resident-background.js";
43
44
  * 那一个副本上发生。跨副本的陈值靠「读面必经本副本的一次提交 ⇒ 必过本副本的围栏」兜住 —— 这条推理成立
44
45
  * 是因为 run 在受理它的那个副本上执行(ARCHITECTURE 副本模型)。device lane 的部署形本身也是单副本(§4.6)。
45
46
  */
46
- export interface SessionScopedRegistries {
47
+ export interface SessionScopedRegistries extends SessionBindingSeat {
47
48
  readonly perSessionCwd: Map<string, string>;
48
49
  readonly perSessionShellEnv: Map<string, Record<string, string>>;
49
- /** [ref]:host shell 的继承策略(`inheritEnv` 请求键)。只读面给 host 工厂包装;写只经 {@link setSessionInheritEnv}。 */
50
+ /** [ref]:host shell 的继承策略(`inheritEnv` 请求键)。只读面给 host 工厂包装。 */
50
51
  readonly perSessionInheritEnv: ReadonlyMap<string, TaskInheritEnv>;
51
- setSessionCwd(sid: string, cwd: string): void;
52
- setSessionShellEnv(sid: string, env: Record<string, string>): void;
53
- /**
54
- * [ref] —— 第三只 per-session 绑定(与 cwd / shellEnv 同一只 LRU 权威、同一条围栏、同一条删除)。
55
- * `undefined` = **清掉**这一格(不是「不动」):`inheritEnv` 是「本条请求要什么」,缺席的请求要的是缺省清洗 ——
56
- * 与 cwd / shellEnv 的「缺席 = 留着上一条的值」刻意不同(那两位由壳每条请求重发,粘住无害;这一位粘住 = 替一个没说话的
57
- * 请求放宽凭据面)。
58
- */
59
- setSessionInheritEnv(sid: string, policy: TaskInheritEnv | undefined): void;
60
52
  /** 本进程见过的会话 → 属主(围栏表本身,只读视图;`null` = 匿名)。**会话驻留后台行的枚举源**:`session-resident-background.ts` 逐会话问注册表
61
53
  * (core 的访问元组要带 scope,没有进程总数的读口),读的就是这一张 —— 每次提交写一笔、`dropSession` 清一笔、LRU 有界,不另立第二张会话名册。 */
62
54
  readonly sessionOwners: ReadonlyMap<string, string | null>;
@@ -178,9 +170,11 @@ export declare function createExecutionEnv(ctx: ExecutionEnvCtx): {
178
170
  perTaskImage: PerTaskImageRegistry;
179
171
  sessionEnvSelection: SessionEnvironmentSelection;
180
172
  perSessionCwd: Map<string, string>;
181
- setSessionCwd: (sid: string, cwd: string) => void;
182
- setSessionShellEnv: (sid: string, env: Record<string, string>) => void;
183
- setSessionInheritEnv: (sid: string, policy: TaskInheritEnv | undefined) => void;
173
+ sessionBindings: {
174
+ commitSessionBindings: (sessionId: string, bindings: SessionBindings) => import("../session-bindings.js").SessionBindingReceipt;
175
+ withdrawSessionBindings: (receipt: import("../session-bindings.js").SessionBindingReceipt) => boolean;
176
+ settleSessionBindings: (receipt: import("../session-bindings.js").SessionBindingReceipt) => boolean;
177
+ };
184
178
  fenceSessionOwner: (sid: string, owner: string | null, incarnation?: string) => void;
185
179
  dropSessionScoped: (sid: string) => void;
186
180
  dropSessionScopedOf: (sid: string, incarnation: string) => boolean;