@sema-agent/server 7.145.0 → 7.147.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 (526) hide show
  1. package/MIGRATION.md +876 -0
  2. package/README.md +1 -1
  3. package/README.zh-CN.md +1 -1
  4. package/USAGE.md +374 -99
  5. package/deploy/facts/CHANGES.json +25 -0
  6. package/deploy/facts/README.md +57 -0
  7. package/deploy/facts/lanes.json +61 -0
  8. package/deploy/facts/lanes.schema.json +57 -0
  9. package/deploy/facts/sandbox-rbac.json +113 -0
  10. package/deploy/facts/sandbox-rbac.schema.json +74 -0
  11. package/deploy/facts/sealed-key.json +9 -0
  12. package/deploy/facts/sealed-key.schema.json +52 -0
  13. package/deploy/sema-up/README.md +2 -2
  14. package/deploy/sema-up/chart/templates/_helpers.tpl +41 -0
  15. package/deploy/sema-up/chart/templates/sandbox-rbac.yaml +47 -7
  16. package/deploy/sema-up/chart/templates/server-v4pro.yaml +9 -4
  17. package/deploy/sema-up/chart/templates/server.yaml +9 -4
  18. package/deploy/sema-up/chart/values.yaml +8 -1
  19. package/deploy/sema-up/cluster-up.sh +2 -1
  20. package/deploy/sema-up/lib/flagshape.sh +4 -0
  21. package/deploy/sema-up/lib/lanes.json +2 -5
  22. package/deploy/sema-up/sema-up.sh +12 -9
  23. package/deploy/sema-up/stack/compose.yaml +5 -4
  24. package/deploy/sema-up/stack/sema-stack-cluster.yaml +34 -17
  25. package/dist/adoption/import-limits.d.ts +6 -0
  26. package/dist/adoption/import-limits.js +7 -0
  27. package/dist/adoption/import.d.ts +62 -0
  28. package/dist/adoption/import.js +107 -0
  29. package/dist/adoption/wire.d.ts +52 -0
  30. package/dist/adoption/wire.js +9 -0
  31. package/dist/approval-ask-machine.d.ts +2 -2
  32. package/dist/approval-card.d.ts +7 -16
  33. package/dist/approval-card.js +0 -4
  34. package/dist/approval-gate-currency.d.ts +1 -1
  35. package/dist/approval-gate-currency.js +1 -1
  36. package/dist/approval-reconciler.d.ts +1 -1
  37. package/dist/approval.d.ts +3 -3
  38. package/dist/audit.js +2 -2
  39. package/dist/bench/s1/live-deps.js +3 -1
  40. package/dist/boot/crash-last.js +2 -1
  41. package/dist/boot/deployment-mods.d.ts +11 -1
  42. package/dist/boot/deployment-mods.js +15 -2
  43. package/dist/boot/device-lane.js +7 -5
  44. package/dist/boot/engine-lease.d.ts +195 -22
  45. package/dist/boot/engine-lease.js +146 -20
  46. package/dist/boot/execution-env.d.ts +5 -0
  47. package/dist/boot/execution-env.js +57 -33
  48. package/dist/boot/execution-lane.d.ts +37 -9
  49. package/dist/boot/execution-lane.js +74 -20
  50. package/dist/boot/exit-boundary.d.ts +50 -0
  51. package/dist/boot/exit-boundary.js +32 -0
  52. package/dist/boot/exit-last.d.ts +20 -4
  53. package/dist/boot/exit-last.js +23 -5
  54. package/dist/boot/governance-seams.d.ts +2 -2
  55. package/dist/boot/governance-seams.js +1 -0
  56. package/dist/boot/leader.js +1 -1
  57. package/dist/boot/memory-boundary.d.ts +11 -11
  58. package/dist/boot/memory-boundary.js +3 -3
  59. package/dist/boot/memory-consolidation.d.ts +42 -41
  60. package/dist/boot/memory-consolidation.js +26 -28
  61. package/dist/boot/org-memory.js +3 -2
  62. package/dist/boot/parked-revive-gate.d.ts +1 -1
  63. package/dist/boot/parked-revive-gate.js +1 -1
  64. package/dist/boot/reapers.d.ts +12 -4
  65. package/dist/boot/reapers.js +40 -16
  66. package/dist/boot/resolve-spec.d.ts +2 -0
  67. package/dist/boot/resolve-spec.js +126 -123
  68. package/dist/boot/retention-lane.d.ts +4 -42
  69. package/dist/boot/runner-deps.js +1 -1
  70. package/dist/boot/session-faces.d.ts +1 -0
  71. package/dist/boot/session-faces.js +11 -3
  72. package/dist/boot/shutdown.js +27 -9
  73. package/dist/boot/stage-01-config.d.ts +1 -1
  74. package/dist/boot/stage-01-config.js +7 -3
  75. package/dist/boot/stage-02-web-admin-pull.d.ts +1 -1
  76. package/dist/boot/stage-02-web-admin-pull.js +10 -8
  77. package/dist/boot/stage-03-store-backend.d.ts +2 -1
  78. package/dist/boot/stage-03-store-backend.js +2 -2
  79. package/dist/boot/stage-04-stores.d.ts +2 -1
  80. package/dist/boot/stage-05-execution-env.d.ts +4 -1
  81. package/dist/boot/stage-05-execution-env.js +6 -6
  82. package/dist/boot/stage-06-runners.d.ts +5 -2
  83. package/dist/boot/stage-06-runners.js +12 -13
  84. package/dist/boot/stage-07-capability-layer.d.ts +5 -2
  85. package/dist/boot/stage-07-capability-layer.js +7 -7
  86. package/dist/boot/stage-08-reapers.d.ts +5 -2
  87. package/dist/boot/stage-08-reapers.js +3 -3
  88. package/dist/boot/stage-09-leader.d.ts +6 -2
  89. package/dist/boot/stage-10-http-server.d.ts +6 -2
  90. package/dist/boot/stage-10-http-server.js +5 -3
  91. package/dist/boot/stores.d.ts +10 -0
  92. package/dist/boot/stores.js +53 -26
  93. package/dist/boot/web-admin.js +3 -3
  94. package/dist/boot/workflow-orchestration.d.ts +1 -1
  95. package/dist/boot/workflow-orchestration.js +2 -1
  96. package/dist/capabilities/center-plugins.d.ts +2 -0
  97. package/dist/capabilities/center-plugins.js +6 -2
  98. package/dist/capabilities/composite-members.d.ts +4 -1
  99. package/dist/capabilities/composite-members.js +4 -1
  100. package/dist/capabilities/execution-lane.d.ts +7 -7
  101. package/dist/capabilities/execution-lane.js +2 -2
  102. package/dist/capabilities/hands-lane.d.ts +1 -1
  103. package/dist/capabilities/scenarios.d.ts +34 -20
  104. package/dist/capabilities/scenarios.js +13 -9
  105. package/dist/capabilities/settings-contract.d.ts +29 -0
  106. package/dist/capabilities/settings-contract.js +14 -0
  107. package/dist/capabilities/skills.d.ts +5 -5
  108. package/dist/capability-facts.d.ts +56 -1
  109. package/dist/capability-facts.js +59 -8
  110. package/dist/center-credential-renewer.js +3 -2
  111. package/dist/checkpoint-ctx-seal-m28.d.ts +1 -1
  112. package/dist/config-catalog.js +19 -9
  113. package/dist/config-invariants.d.ts +18 -3
  114. package/dist/config-invariants.js +36 -19
  115. package/dist/config-lkg.d.ts +1 -1
  116. package/dist/config-lkg.js +5 -6
  117. package/dist/config-provider.d.ts +2 -2
  118. package/dist/config-provider.js +2 -0
  119. package/dist/config-types.d.ts +228 -185
  120. package/dist/config.d.ts +74 -6
  121. package/dist/config.js +146 -64
  122. package/dist/degenerate-instrument.js +1 -1
  123. package/dist/deleted-session-ids.d.ts +19 -0
  124. package/dist/deleted-session-ids.js +26 -0
  125. package/dist/deploy-facts.d.ts +155 -0
  126. package/dist/deploy-facts.js +95 -0
  127. package/dist/deployment-shape.d.ts +21 -12
  128. package/dist/deployment-shape.js +24 -6
  129. package/dist/device-ws-hub.d.ts +48 -3
  130. package/dist/device-ws-hub.js +48 -2
  131. package/dist/env-facts.d.ts +7 -5
  132. package/dist/env-facts.js +10 -6
  133. package/dist/error-code-family.d.ts +35 -0
  134. package/dist/error-code-family.js +26 -0
  135. package/dist/execution-config-root.d.ts +5 -5
  136. package/dist/execution-config-root.js +5 -5
  137. package/dist/execution-env-purpose.d.ts +14 -0
  138. package/dist/execution-env-purpose.js +29 -0
  139. package/dist/execution-lane-caps.d.ts +49 -86
  140. package/dist/execution-lane-caps.js +52 -62
  141. package/dist/execution-placement.d.ts +18 -2
  142. package/dist/execution-placement.js +19 -0
  143. package/dist/file-history-disclosure.d.ts +2 -2
  144. package/dist/fleet/drain-entry.d.ts +46 -3
  145. package/dist/fleet/drain-entry.js +6 -0
  146. package/dist/fleet/fleet-bus.d.ts +2 -1
  147. package/dist/fleet/serving-lease.js +3 -4
  148. package/dist/history-anchor.d.ts +22 -0
  149. package/dist/history-anchor.js +14 -0
  150. package/dist/hooks/branch-transcript.d.ts +1 -1
  151. package/dist/hooks/branch-transcript.js +1 -0
  152. package/dist/hooks/classic-stations.d.ts +25 -8
  153. package/dist/hooks/classic-stations.js +29 -3
  154. package/dist/hooks/command-spawn.d.ts +1 -4
  155. package/dist/hooks/command-spawn.js +0 -11
  156. package/dist/hooks/hook-runner.d.ts +85 -24
  157. package/dist/hooks/hook-runner.js +326 -109
  158. package/dist/hooks/hook-source.d.ts +14 -2
  159. package/dist/hooks/hook-source.js +8 -0
  160. package/dist/http/active-run-conflict.d.ts +1 -1
  161. package/dist/http/active-run-conflict.js +1 -1
  162. package/dist/http/admission.js +11 -1
  163. package/dist/http/approval-sweeps.d.ts +2 -5
  164. package/dist/http/approval-sweeps.js +3 -2
  165. package/dist/http/checkpoint-ctx.d.ts +76 -71
  166. package/dist/http/checkpoint-ctx.js +40 -40
  167. package/dist/http/claim-latency.d.ts +10 -0
  168. package/dist/http/claim-latency.js +12 -0
  169. package/dist/http/dispatch.js +19 -3
  170. package/dist/http/durable-run-leg.d.ts +5 -0
  171. package/dist/http/durable-run-leg.js +3 -1
  172. package/dist/http/execution-context.d.ts +7 -1
  173. package/dist/http/execution-context.js +13 -0
  174. package/dist/http/health-self-report.d.ts +6 -2
  175. package/dist/http/health-self-report.js +3 -2
  176. package/dist/http/memory-compliance-failure-reply.d.ts +2 -2
  177. package/dist/http/memory-compliance-failure-reply.js +5 -15
  178. package/dist/http/memory-control-plane-corrupt-reply.d.ts +25 -0
  179. package/dist/http/memory-control-plane-corrupt-reply.js +19 -0
  180. package/dist/http/memory-store-refusal-reply.d.ts +3 -3
  181. package/dist/http/memory-store-refusal-reply.js +3 -0
  182. package/dist/http/owner-access.d.ts +11 -0
  183. package/dist/http/owner-access.js +7 -4
  184. package/dist/http/principal-gate.d.ts +28 -16
  185. package/dist/http/principal-gate.js +10 -19
  186. package/dist/http/request-guards.d.ts +2 -2
  187. package/dist/http/request-guards.js +5 -5
  188. package/dist/http/resume-legs.d.ts +29 -10
  189. package/dist/http/resume-legs.js +94 -56
  190. package/dist/http/rewind-files-reply.d.ts +34 -0
  191. package/dist/http/rewind-files-reply.js +36 -0
  192. package/dist/http/route-ctx.d.ts +43 -26
  193. package/dist/http/route-table.js +4 -0
  194. package/dist/http/routes/adoption.d.ts +11 -0
  195. package/dist/http/routes/adoption.js +80 -6
  196. package/dist/http/routes/agents-roster.js +1 -0
  197. package/dist/http/routes/approvals-assistant.js +7 -26
  198. package/dist/http/routes/background.js +1 -0
  199. package/dist/http/routes/capabilities.js +12 -3
  200. package/dist/http/routes/devices.js +1 -1
  201. package/dist/http/routes/diagnostics.d.ts +9 -14
  202. package/dist/http/routes/diagnostics.js +10 -20
  203. package/dist/http/routes/engine.d.ts +31 -0
  204. package/dist/http/routes/engine.js +81 -0
  205. package/dist/http/routes/memory-bundle.js +3 -0
  206. package/dist/http/routes/memory-consolidation.js +3 -5
  207. package/dist/http/routes/memory-origin.d.ts +2 -2
  208. package/dist/http/routes/memory-origin.js +2 -4
  209. package/dist/http/routes/memory-policy.js +5 -1
  210. package/dist/http/routes/notify-wake.js +2 -1
  211. package/dist/http/routes/observability.js +3 -6
  212. package/dist/http/routes/projects.d.ts +70 -0
  213. package/dist/http/routes/projects.js +86 -0
  214. package/dist/http/routes/rules.js +30 -2
  215. package/dist/http/routes/runs.js +15 -11
  216. package/dist/http/routes/session-sync.js +39 -35
  217. package/dist/http/routes/sessions-list.d.ts +1 -1
  218. package/dist/http/routes/sessions.d.ts +7 -1
  219. package/dist/http/routes/sessions.js +108 -2
  220. package/dist/http/routes/tasks.js +32 -8
  221. package/dist/http/routes/trace-usage.js +1 -1
  222. package/dist/http/run-concurrency-cap.d.ts +86 -0
  223. package/dist/http/run-concurrency-cap.js +54 -0
  224. package/dist/http/server.d.ts +31 -14
  225. package/dist/http/server.js +29 -3
  226. package/dist/http/stored-body-replay.d.ts +12 -7
  227. package/dist/http/stored-body-replay.js +28 -5
  228. package/dist/http/wire-types.d.ts +27 -13
  229. package/dist/index.d.ts +2 -2
  230. package/dist/index.js +1 -1
  231. package/dist/instruction-source-notice.d.ts +1 -1
  232. package/dist/json-body-limit.d.ts +8 -0
  233. package/dist/json-body-limit.js +2 -0
  234. package/dist/leader/diffout.d.ts +1 -1
  235. package/dist/local-data-root.d.ts +2 -2
  236. package/dist/memory-embedder-reembed.d.ts +38 -0
  237. package/dist/memory-embedder-reembed.js +20 -0
  238. package/dist/memory-incident-sink.d.ts +0 -28
  239. package/dist/memory-incident-sink.js +5 -0
  240. package/dist/memory-operator-faces.d.ts +9 -4
  241. package/dist/memory-scope-stores.d.ts +9 -7
  242. package/dist/memory-scope-stores.js +3 -14
  243. package/dist/memory-scope.d.ts +38 -2
  244. package/dist/memory-scope.js +33 -2
  245. package/dist/memory-store-refusal.d.ts +17 -4
  246. package/dist/memory-store-refusal.js +1 -1
  247. package/dist/memory-sync-client.d.ts +2 -0
  248. package/dist/memory-sync-client.js +13 -11
  249. package/dist/memory-sync.js +1 -1
  250. package/dist/model-compat.d.ts +35 -21
  251. package/dist/model-compat.js +49 -21
  252. package/dist/model-entry-refusal.d.ts +11 -1
  253. package/dist/model-entry-refusal.js +7 -0
  254. package/dist/namespaced-rule-name.d.ts +18 -1
  255. package/dist/namespaced-rule-name.js +12 -0
  256. package/dist/net-address.d.ts +53 -0
  257. package/dist/net-address.js +111 -0
  258. package/dist/observability/fail-open.d.ts +29 -17
  259. package/dist/observability/fail-open.js +29 -17
  260. package/dist/observability/metrics.d.ts +2 -0
  261. package/dist/observability/metrics.js +2 -0
  262. package/dist/observability/secret-env-scrub.d.ts +30 -4
  263. package/dist/observability/secret-env-scrub.js +15 -3
  264. package/dist/orchestration/workflow-agent-session-index.d.ts +7 -12
  265. package/dist/orchestration/workflow-agent-session-index.js +1 -6
  266. package/dist/orchestration/workflow-completion-inbox.d.ts +26 -6
  267. package/dist/orchestration/workflow-completion-inbox.js +63 -45
  268. package/dist/orchestration/workflow-notify-journal.js +2 -3
  269. package/dist/org-delivery-gate.js +1 -1
  270. package/dist/org-memory-admission.d.ts +5 -2
  271. package/dist/org-memory-admission.js +25 -10
  272. package/dist/parked-decide.d.ts +33 -26
  273. package/dist/parked-decide.js +36 -44
  274. package/dist/peer-directory.d.ts +6 -12
  275. package/dist/peer-directory.js +5 -1
  276. package/dist/plugins/approval-ask-store-file.d.ts +10 -2
  277. package/dist/plugins/approval-ask-store-file.js +37 -4
  278. package/dist/plugins/approval-ask-store-memory.d.ts +5 -3
  279. package/dist/plugins/approval-ask-store-memory.js +11 -2
  280. package/dist/plugins/approval-ask-store-sql.d.ts +3 -0
  281. package/dist/plugins/approval-ask-store-sql.js +3 -1
  282. package/dist/plugins/blob-backend.d.ts +38 -195
  283. package/dist/plugins/blob-backend.js +33 -229
  284. package/dist/plugins/caching-session-store.d.ts +12 -5
  285. package/dist/plugins/caching-session-store.js +3 -0
  286. package/dist/plugins/checkpoint-index-columns.d.ts +1 -1
  287. package/dist/plugins/checkpoint-index-columns.js +3 -2
  288. package/dist/plugins/checkpoint-store-face.d.ts +426 -0
  289. package/dist/plugins/checkpoint-store-face.js +152 -0
  290. package/dist/plugins/device-store-sql.d.ts +2 -2
  291. package/dist/plugins/device-store-sql.js +5 -10
  292. package/dist/plugins/execution-lane-rename-m40.d.ts +20 -0
  293. package/dist/plugins/execution-lane-rename-m40.js +10 -0
  294. package/dist/plugins/execution-placement-sql.d.ts +63 -88
  295. package/dist/plugins/execution-placement-sql.js +94 -54
  296. package/dist/plugins/file-run-store.d.ts +26 -18
  297. package/dist/plugins/file-run-store.js +64 -75
  298. package/dist/plugins/fork-routing-session-store.d.ts +6 -2
  299. package/dist/plugins/fork-routing-session-store.js +2 -2
  300. package/dist/plugins/imported-layer-root-retirement.d.ts +22 -11
  301. package/dist/plugins/imported-layer-root-retirement.js +4 -8
  302. package/dist/plugins/inbox-payload-column.d.ts +14 -0
  303. package/dist/plugins/inbox-payload-column.js +13 -0
  304. package/dist/plugins/local-checkpoint-store.d.ts +7 -2
  305. package/dist/plugins/local-checkpoint-store.js +13 -8
  306. package/dist/plugins/local-data-dir-modes-m39.d.ts +48 -0
  307. package/dist/plugins/local-data-dir-modes-m39.js +182 -0
  308. package/dist/plugins/local-engine-high-water.d.ts +11 -0
  309. package/dist/plugins/local-engine-high-water.js +59 -0
  310. package/dist/plugins/local-session-store.d.ts +119 -30
  311. package/dist/plugins/local-session-store.js +156 -53
  312. package/dist/plugins/local-task-attachment-store.d.ts +2 -0
  313. package/dist/plugins/local-task-attachment-store.js +10 -11
  314. package/dist/plugins/memory-embedder-fingerprint.d.ts +33 -10
  315. package/dist/plugins/memory-embedder-fingerprint.js +52 -12
  316. package/dist/plugins/memory-embedder.d.ts +1 -1
  317. package/dist/plugins/memory-embedder.js +2 -2
  318. package/dist/plugins/memory-engine-pg.d.ts +30 -6
  319. package/dist/plugins/memory-engine-pg.js +96 -214
  320. package/dist/plugins/memory-engine-sql-apply.d.ts +130 -0
  321. package/dist/plugins/memory-engine-sql-apply.js +358 -0
  322. package/dist/plugins/memory-engine-tidb.d.ts +38 -9
  323. package/dist/plugins/memory-engine-tidb.js +99 -230
  324. package/dist/plugins/memory-key-guards.d.ts +1 -1
  325. package/dist/plugins/memory-origin-law.d.ts +3 -3
  326. package/dist/plugins/one-time-migrations.d.ts +169 -83
  327. package/dist/plugins/one-time-migrations.js +295 -235
  328. package/dist/plugins/owner-only-file-mode.d.ts +29 -0
  329. package/dist/plugins/owner-only-file-mode.js +141 -0
  330. package/dist/plugins/permission-rule-store-file.d.ts +17 -3
  331. package/dist/plugins/permission-rule-store-file.js +20 -1
  332. package/dist/plugins/pg-pool.d.ts +2 -1
  333. package/dist/plugins/pg-pool.js +12 -5
  334. package/dist/plugins/release-version.d.ts +20 -0
  335. package/dist/plugins/release-version.js +28 -0
  336. package/dist/plugins/remote-env-adb.d.ts +20 -4
  337. package/dist/plugins/remote-env-adb.js +39 -11
  338. package/dist/plugins/remote-env-e2b.d.ts +12 -3
  339. package/dist/plugins/remote-env-e2b.js +6 -4
  340. package/dist/plugins/remote-env-host.d.ts +9 -1
  341. package/dist/plugins/remote-env-host.js +6 -5
  342. package/dist/plugins/remote-env-k8s.d.ts +5 -2
  343. package/dist/plugins/remote-env-k8s.js +15 -4
  344. package/dist/plugins/remote-env-local-docker.d.ts +4 -1
  345. package/dist/plugins/remote-env-local-docker.js +3 -3
  346. package/dist/plugins/remote-env-ssh.d.ts +8 -2
  347. package/dist/plugins/remote-env-ssh.js +26 -24
  348. package/dist/plugins/remote-shell.d.ts +59 -30
  349. package/dist/plugins/remote-shell.js +175 -62
  350. package/dist/plugins/retention-declaration.d.ts +37 -0
  351. package/dist/plugins/retention-declaration.js +9 -0
  352. package/dist/plugins/retention-deployment.d.ts +126 -0
  353. package/dist/plugins/retention-deployment.js +88 -0
  354. package/dist/plugins/retention-lane-store-sql.d.ts +74 -4
  355. package/dist/plugins/retention-lane-store-sql.js +103 -1
  356. package/dist/plugins/retention-sql.d.ts +29 -0
  357. package/dist/plugins/retention-sql.js +8 -0
  358. package/dist/plugins/run-store-sql.js +2 -2
  359. package/dist/plugins/schema-consistency.d.ts +0 -6
  360. package/dist/plugins/schema-consistency.js +1 -2
  361. package/dist/plugins/schema-ensure-legs.d.ts +1 -1
  362. package/dist/plugins/schema-ensure-legs.js +13 -3
  363. package/dist/plugins/session-ext-table.d.ts +74 -0
  364. package/dist/plugins/session-ext-table.js +121 -0
  365. package/dist/plugins/session-fork.d.ts +31 -9
  366. package/dist/plugins/session-fork.js +3 -2
  367. package/dist/plugins/session-placement.d.ts +4 -2
  368. package/dist/plugins/session-row-sql.d.ts +8 -7
  369. package/dist/plugins/session-row-sql.js +15 -7
  370. package/dist/plugins/session-store-sql.d.ts +131 -0
  371. package/dist/plugins/session-store-sql.js +298 -0
  372. package/dist/plugins/session-workspace-cell.d.ts +2 -2
  373. package/dist/plugins/session-workspace-cell.js +2 -2
  374. package/dist/plugins/shared-memory-store-sql.d.ts +10 -0
  375. package/dist/plugins/shared-memory-store-sql.js +13 -13
  376. package/dist/plugins/snapshot-bucket-presence.js +1 -1
  377. package/dist/plugins/sql-driver.d.ts +23 -7
  378. package/dist/plugins/sql-driver.js +41 -8
  379. package/dist/plugins/sql-errors.d.ts +5 -2
  380. package/dist/plugins/sql-errors.js +4 -0
  381. package/dist/plugins/sql-json-column.d.ts +5 -1
  382. package/dist/plugins/store-backend.d.ts +46 -16
  383. package/dist/plugins/store-backend.js +192 -69
  384. package/dist/plugins/store-contracts.d.ts +10 -13
  385. package/dist/plugins/store-contracts.js +1 -9
  386. package/dist/plugins/store-sweep.d.ts +63 -0
  387. package/dist/plugins/store-sweep.js +48 -0
  388. package/dist/plugins/task-attachment-store.d.ts +6 -8
  389. package/dist/plugins/task-attachment-store.js +15 -10
  390. package/dist/plugins/task-list-store-sql.d.ts +1 -1
  391. package/dist/plugins/text-column-capacity.d.ts +21 -0
  392. package/dist/plugins/text-column-capacity.js +5 -0
  393. package/dist/plugins/tidb-pool.d.ts +3 -2
  394. package/dist/plugins/tidb-pool.js +20 -32
  395. package/dist/plugins/user-input-ledger-sql.d.ts +1 -1
  396. package/dist/prompt-screen.d.ts +6 -9
  397. package/dist/prompt-screen.js +2 -5
  398. package/dist/read-face-posture.d.ts +6 -6
  399. package/dist/read-face-posture.js +2 -2
  400. package/dist/request-value-closure.d.ts +5 -5
  401. package/dist/request-value-closure.js +1 -1
  402. package/dist/rules-consent.d.ts +48 -27
  403. package/dist/rules-consent.js +147 -23
  404. package/dist/run-cancel-context.d.ts +4 -1
  405. package/dist/run-cancel-context.js +2 -1
  406. package/dist/run-local.js +17 -13
  407. package/dist/runs.d.ts +48 -30
  408. package/dist/runs.js +27 -17
  409. package/dist/runtime-caps-resolver.d.ts +15 -8
  410. package/dist/runtime-caps-resolver.js +14 -10
  411. package/dist/sandbox-egress-policy.js +6 -11
  412. package/dist/sandbox-rbac-rules.d.ts +88 -0
  413. package/dist/sandbox-rbac-rules.js +80 -0
  414. package/dist/sealed-key-layout.d.ts +16 -0
  415. package/dist/sealed-key-layout.js +3 -0
  416. package/dist/sealed-key.js +8 -6
  417. package/dist/security.d.ts +43 -9
  418. package/dist/security.js +9 -2
  419. package/dist/sema-config-dir.js +2 -2
  420. package/dist/server-secret-env.d.ts +2 -0
  421. package/dist/service-version.d.ts +2 -1
  422. package/dist/service-version.js +2 -2
  423. package/dist/session-error-wire.d.ts +1 -1
  424. package/dist/session-incarnation.d.ts +8 -5
  425. package/dist/session-notify-door.d.ts +5 -3
  426. package/dist/session-resident-background.d.ts +110 -0
  427. package/dist/session-resident-background.js +88 -0
  428. package/dist/session-row.d.ts +1 -1
  429. package/dist/session-sync-kernel.d.ts +53 -14
  430. package/dist/session-sync-kernel.js +70 -1
  431. package/dist/session-sync.d.ts +5 -3
  432. package/dist/session-workspace.d.ts +12 -2
  433. package/dist/session-workspace.js +6 -0
  434. package/dist/sighup-idle.d.ts +9 -7
  435. package/dist/sighup-idle.js +4 -5
  436. package/dist/spec-fields.d.ts +16 -0
  437. package/dist/spec-fields.js +7 -0
  438. package/dist/store-posture.d.ts +2 -1
  439. package/dist/stored-request-env-credentials-m38.d.ts +3 -0
  440. package/dist/stored-request-env-credentials-m38.js +8 -0
  441. package/dist/stored-request-hooks-m20.d.ts +3 -2
  442. package/dist/stored-request-hooks-m20.js +19 -14
  443. package/dist/stored-request-prompt-profile-m30.d.ts +1 -1
  444. package/dist/stores-sql/blob-index-sql.d.ts +148 -0
  445. package/dist/stores-sql/blob-index-sql.js +154 -0
  446. package/dist/{plugins → stores-sql}/checkpoint-store-sql.d.ts +14 -428
  447. package/dist/{plugins → stores-sql}/checkpoint-store-sql.js +43 -220
  448. package/dist/{plugins → stores-sql}/file-history-store-sql.d.ts +23 -11
  449. package/dist/{plugins → stores-sql}/file-history-store-sql.js +23 -18
  450. package/dist/{plugins → stores-sql}/mailbox-store-sql.d.ts +2 -2
  451. package/dist/{plugins → stores-sql}/mailbox-store-sql.js +4 -4
  452. package/dist/{plugins → stores-sql}/pg-session-storage.d.ts +27 -67
  453. package/dist/{plugins → stores-sql}/pg-session-storage.js +82 -207
  454. package/dist/{plugins → stores-sql}/retention-store-sql.d.ts +123 -217
  455. package/dist/{plugins → stores-sql}/retention-store-sql.js +66 -190
  456. package/dist/{plugins → stores-sql}/roster-store-sql.d.ts +2 -2
  457. package/dist/{plugins → stores-sql}/roster-store-sql.js +1 -1
  458. package/dist/{plugins → stores-sql}/session-event-payload.d.ts +1 -1
  459. package/dist/{plugins → stores-sql}/session-event-payload.js +1 -1
  460. package/dist/stores-sql/session-policy-store-sql.d.ts +1 -1
  461. package/dist/stores-sql/session-write-hooks.d.ts +59 -0
  462. package/dist/stores-sql/session-write-hooks.js +2 -0
  463. package/dist/{plugins → stores-sql}/tidb-session-storage.d.ts +10 -11
  464. package/dist/{plugins → stores-sql}/tidb-session-storage.js +10 -21
  465. package/dist/{plugins → stores-sql}/tidb-session-store.d.ts +35 -112
  466. package/dist/{plugins → stores-sql}/tidb-session-store.js +73 -169
  467. package/dist/{plugins → stores-sql}/tool-result-store-sql.d.ts +3 -3
  468. package/dist/{plugins → stores-sql}/tool-result-store-sql.js +6 -6
  469. package/dist/stores-sql/windowed-session-storage.d.ts +56 -0
  470. package/dist/stores-sql/windowed-session-storage.js +61 -0
  471. package/dist/{plugins → stores-sql}/workflow-journal-store-sql.d.ts +7 -12
  472. package/dist/{plugins → stores-sql}/workflow-journal-store-sql.js +3 -8
  473. package/dist/task-a2a.d.ts +7 -1
  474. package/dist/task-a2a.js +15 -14
  475. package/dist/task-cwd.d.ts +11 -3
  476. package/dist/task-cwd.js +17 -1
  477. package/dist/task-mcp.d.ts +10 -2
  478. package/dist/task-mcp.js +13 -16
  479. package/dist/task-settings.d.ts +68 -8
  480. package/dist/task-settings.js +63 -6
  481. package/dist/tool-approval.d.ts +23 -10
  482. package/dist/tool-approval.js +10 -6
  483. package/dist/trace/core-keyset-guard.d.ts +17 -10
  484. package/dist/trace/engine-notice-wire.d.ts +1 -1
  485. package/dist/trace/engine-notice-wire.js +4 -0
  486. package/dist/trace/exit-seat.d.ts +29 -1
  487. package/dist/trace/exit-seat.js +4 -0
  488. package/dist/trace/project.d.ts +33 -16
  489. package/dist/trace/project.js +21 -9
  490. package/dist/trace/redact.d.ts +13 -2
  491. package/dist/trace/redact.js +347 -78
  492. package/dist/trace/self-minted-wire.d.ts +587 -16
  493. package/dist/trace/self-minted-wire.js +215 -9
  494. package/dist/trace/sema-provenance.d.ts +45 -41
  495. package/dist/trace/sema-provenance.js +81 -10
  496. package/dist/trace/task-notification-facets.d.ts +70 -2
  497. package/dist/trace/task-notification-facets.js +71 -1
  498. package/dist/trace/wire-projection-faces.d.ts +39 -3
  499. package/dist/trace/wire-projection-faces.js +27 -2
  500. package/dist/unread-request-members.d.ts +66 -0
  501. package/dist/unread-request-members.js +41 -0
  502. package/dist/usage-analytics.d.ts +4 -0
  503. package/dist/user-input-ledger.d.ts +2 -2
  504. package/dist/web-admin-client/apply-effective.js +22 -26
  505. package/dist/web-admin-client/candidate-gate.d.ts +35 -3
  506. package/dist/web-admin-client/candidate-gate.js +53 -5
  507. package/dist/web-admin-client/center-request.d.ts +4 -1
  508. package/dist/web-admin-client/center-request.js +2 -1
  509. package/dist/web-admin-client/effective-keys.js +0 -1
  510. package/dist/web-admin-client/facade.d.ts +1 -1
  511. package/dist/web-admin-client/http-client.d.ts +1 -0
  512. package/dist/web-admin-client/http-client.js +17 -9
  513. package/dist/web-admin-client/restart-signal.js +5 -2
  514. package/dist/web-admin-client/skills-mcp.d.ts +20 -6
  515. package/dist/web-admin-client/skills-mcp.js +26 -21
  516. package/dist/web-admin-client/types.d.ts +34 -49
  517. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +2 -2
  518. package/package.json +22 -13
  519. package/scripts/drain-check-local.mjs +8 -55
  520. package/scripts/drain-check.mysql.sql +3 -40
  521. package/scripts/drain-check.pg.sql +3 -40
  522. package/skills/update-config.md +1 -1
  523. package/wire-changes/server@7.146.0.json +3221 -0
  524. package/wire-changes/server@7.147.0.json +813 -0
  525. package/dist/approval-batch-census.d.ts +0 -27
  526. package/dist/approval-batch-census.js +0 -27
@@ -54,7 +54,7 @@ export declare const MAX_RULE_OFFER_BATCH_MEMBERS = 8;
54
54
  /**
55
55
  * **一条**「不再询问」OFFER 的形(core 5.58.0 / [ref] §3.1 —— **BREAKING**,取代退役的
56
56
  * `RuleSuggestion`)。同步腿(`ApprovalCardSchema.ruleOffers` / `card_json`)与耐久腿(durable park 行的
57
- * `PendingCheckpoint.ruleOffers`,由 `plugins/checkpoint-store-sql.ts` 窄读)**共用这一份**。
57
+ * `PendingCheckpoint.ruleOffers`,由 `plugins/checkpoint-store-face.ts` 的 `boundedRuleOffers` 窄读)**共用这一份**。
58
58
  *
59
59
  * 🔴 单一属主(宪法 [ref]「schema 单一属主禁复制」):两条腿投的是 core 的**同一个** `RuleOffer`
60
60
  * (同步腿 = `AskRequest.ruleOffers`,耐久腿 = `PendingAction.ruleOffers`,core
@@ -138,7 +138,7 @@ export interface ReadRuleOffer {
138
138
  readonly offer: RuleOffer;
139
139
  }
140
140
  /**
141
- * **规则提议列表的唯一读者**(core 7.55.0 [ref] P1 阶段二)—— 两条腿同调:耐久腿(`checkpoint-store-sql.ts` `boundedRuleOffers`:铸行落列、回读列、LOCAL 孪生读寄存行)
141
+ * **规则提议列表的唯一读者**(core 7.55.0 [ref] P1 阶段二)—— 两条腿同调:耐久腿(`checkpoint-store-face.ts` `boundedRuleOffers`:铸行落列、回读列、LOCAL 孪生读寄存行)
142
142
  * 与同步腿(`tool-approval.ts` `boundRuleOfferTexts`:活 ask 的 `AskRequest.ruleOffers`)。判官是 core 的 `readRuleOffers`:逐元素判、保原始下标、多余键逐级剥、
143
143
  * 闭集词(offer / 成员的 `kind`、`match`)不认 ⇒ 整只丢(batch 不拆成员)、无 `kind` 的存量成员读作 command、明细座不是「每个计数段一行」⇒ 只丢座。
144
144
  * 修前本仓自己一份不限长 zod 形,前面垫两只预筛(无 `kind` 成员的回填、明细座的座级筛)—— 读的是 core 铸的形,读法却是本仓一份;core 对两者的 76 种形逐一对过,不同的三种是本仓的明细座行数帽(留在这里)与两种非 JSON 值(数组带属性、类实例)。
@@ -149,15 +149,6 @@ export interface ReadRuleOffer {
149
149
  * 缺席(`undefined`)= 没有提议,答空、不计。展示帽(条数、成员前缀、扫描窗)、脱敏与截长归调用方 —— 它们是各腿的展示纪律,不是读法。
150
150
  */
151
151
  export declare function readRuleOfferList(raw: unknown): readonly ReadRuleOffer[];
152
- /**
153
- * 一份(已解码的)规则提议列表里,**带着无 `kind` 存量成员**的 batch offer 有几只 —— 判官是 core `readRuleOffers` 给每只读出的 offer 打的 `kindlessForm` 记号
154
- * (「这一只 batch 里至少一个成员是经无 `kind` 的存量形读的」;与 {@link readRuleOfferList} 同一只读者,不是本仓自己再写一遍「成员没有 `kind` 键」)。
155
- * 起服普查(`approval-batch-census.ts`)用它给存量行记数:读者那条存量臂退役的前提是「零行还靠它读」。
156
- *
157
- * **只数,不落任何痕迹**:读不出的元素(`dropped`)与整只值不是列表(`problem`)是 {@link readRuleOfferList} 的计数口径(`server.rule-offers.offer-dropped`),这里不重复记,
158
- * 它们也不是「靠存量臂读出来」的 —— 一个读不出的无 `kind` 成员(缺文本键)退役前后同样被丢,不改变任何一行的读法,所以不计入。
159
- */
160
- export declare function countKindlessBatchOffers(raw: unknown): number;
161
152
  /**
162
153
  * 卡面/帧面共用的 offer **投影型**(= {@link RuleOfferSchema} 的输出形)。判别位 `kind` 上闭集,
163
154
  * 消费端(SDK/cli 渲染)按 core 契约分臂;`batch.rules` 成员是判别联合(`command` | `directoryRead`),
@@ -518,7 +509,7 @@ export declare function parkRowFacts(stored: unknown): ParkRowFacts;
518
509
  * 本仓**不重算哈希**(core 的 `boundInputHashOf` 不在公开导出面上,清单校验读口 `readBoundBinding` 同样不导出),所以**不许**拿寄存行 `pendingAction` 上的原清单直接投 ——
519
510
  * 原值上的清单是未经哈希校验的(这正是它此前不上队列行的原因,见 `trace/core-keyset-guard.ts` ⑧b 记账的旧注)。两只店各自拿到「这一行的摘要」的办法不同
520
511
  * (LOCAL 孪生本来就握着 core 对同一行投的摘要;SQL 孪生在判官要的那一次整行读里调 core 的 `summarizeCheckpoint` —— 两位与 `rowVerdict` 同一次读、
521
- * 同一份按字节摘要的记忆,见 `plugins/checkpoint-store-sql.ts` 的 `storedRowProjections`),
512
+ * 同一份按字节摘要的记忆,见 `stores-sql/checkpoint-store-sql.ts` 的 `storedRowProjections`),
522
513
  * 但投影只有这一只:OMIT 契约 —— 缺席即缺席,恒不铸 `undefined` 值的键。
523
514
  *
524
515
  * `boundGrants` 是**部署文本**(技能名、清单条目):本函数不脱敏、不转义,与收件箱行逐字同口径 —— 渲染按上下文转义是客户端的事(契约同句)。
@@ -583,13 +574,13 @@ export declare const ApprovalCardSchema: z.ZodObject<{
583
574
  governanceForced: z.ZodOptional<z.ZodLiteral<true>>;
584
575
  rememberRefused: z.ZodOptional<z.ZodLiteral<true>>;
585
576
  approvalCard: z.ZodOptional<z.ZodEnum<{
586
- question: "question";
577
+ shell: "shell";
587
578
  plan: "plan";
588
579
  skill: "skill";
580
+ question: "question";
589
581
  "file-edit": "file-edit";
590
582
  "file-write": "file-write";
591
583
  "notebook-edit": "notebook-edit";
592
- shell: "shell";
593
584
  fetch: "fetch";
594
585
  workflow: "workflow";
595
586
  generic: "generic";
@@ -761,13 +752,13 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
761
752
  governanceForced: z.ZodOptional<z.ZodLiteral<true>>;
762
753
  rememberRefused: z.ZodOptional<z.ZodLiteral<true>>;
763
754
  approvalCard: z.ZodOptional<z.ZodEnum<{
764
- question: "question";
755
+ shell: "shell";
765
756
  plan: "plan";
766
757
  skill: "skill";
758
+ question: "question";
767
759
  "file-edit": "file-edit";
768
760
  "file-write": "file-write";
769
761
  "notebook-edit": "notebook-edit";
770
- shell: "shell";
771
762
  fetch: "fetch";
772
763
  workflow: "workflow";
773
764
  generic: "generic";
@@ -64,10 +64,6 @@ export function readRuleOfferList(raw) {
64
64
  reading.dropped.forEach((d) => recordOfferDropped(d.problem, d.index));
65
65
  return reading.offers.map(withDetailSeatBounded);
66
66
  }
67
- export function countKindlessBatchOffers(raw) {
68
- const reading = readRuleOffers(raw);
69
- return "problem" in reading ? 0 : reading.offers.filter((o) => o.kindlessForm === true).length;
70
- }
71
67
  function withoutOverCapDetailSeat(item, index) {
72
68
  if (typeof item !== "object" || item === null)
73
69
  return item;
@@ -65,7 +65,7 @@
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";
68
- import { type PendingRowBinding } from "./plugins/checkpoint-store-sql.js";
68
+ import { type PendingRowBinding } from "./plugins/checkpoint-store-face.js";
69
69
  import { type ParkedGateRead } from "./tool-approval.js";
70
70
  /**
71
71
  * 决断方回显的「我看到的那道门」—— 门的两个身份面之一(两面的来历与读法见模块头注「`approval_stale` 律」)。
@@ -1,5 +1,5 @@
1
1
  import { REOPEN_REASONS, checkpointRevOf, screenGateOutcome } from "@sema-agent/core";
2
- import { approvalDecisionOfWinner } from "./plugins/checkpoint-store-sql.js";
2
+ import { approvalDecisionOfWinner } from "./plugins/checkpoint-store-face.js";
3
3
  import {} from "./tool-approval.js";
4
4
  import { APPROVAL_GATE_KINDS } from "./approval-content-kind.js";
5
5
  import { trustedCheckpointId } from "./checkpoint-identity.js";
@@ -1,7 +1,7 @@
1
1
  import type { AskRow, ApprovalAskStore } from "./plugins/approval-ask-store-sql.js";
2
2
  import type { UnattendedApprovalPolicy } from "./tool-approval.js";
3
3
  import type { BatchState } from "./approval-ask-machine.js";
4
- import type { CheckpointAskCandidate } from "./plugins/checkpoint-store-sql.js";
4
+ import type { CheckpointAskCandidate } from "./plugins/checkpoint-store-face.js";
5
5
  import { type RunRecord } from "./plugins/store-contracts.js";
6
6
  import type { Logger } from "./observability/logger.js";
7
7
  import type { Metrics } from "./observability/metrics.js";
@@ -76,12 +76,12 @@ export declare function gateIntentUnserviceableReason(config: GateIntentView, ch
76
76
  * 运维要在 **boot** 就知道,否则会把随之而来的拒绝读成故障。两条 warn 按「ask 从哪来」**划分车道**,互补不重叠:
77
77
  * · `fs_write_gate_no_responder` —— 写门的 Write/Edit ask。它只在**手写本机盘**时才会发生(写门挂在 host
78
78
  * 语义上,而 ask 要有手去触发)⇒ 判据 = {@link handsOnWorkerFilePlane}(今天 = `host`)。改前写的是
79
- * `remoteExec === undefined || provider === "host"`(门 D R3 同义折):把没有手的 in-process 也算进来,
79
+ * `remoteExec === undefined || provider === "host"`(门 D R3 同义折):把没有手的那一形(今名 `none`)也算进来,
80
80
  * 那一形上一次 Write ask 都不会发生,warn 是假话;
81
81
  * · `workflow_gate_no_responder` —— `run_workflow` 的 ask,**每条车道都挂**(不以挂手为前提,见
82
82
  * `createWorkflowAskPolicy`)⇒ 判据 = 自编排开着 ∧ **不在上一条的射程里**(上一条的文案已覆盖本机手的车道)。
83
- * 改前写的是 `remoteExec !== undefined && provider !== "host"` —— 依赖上一条对 in-process 的兜底;
84
- * 上一条收窄之后,in-process ∧ 自编排 ∧ 无应答面必须由这一条接住(否则整形零告警)。
83
+ * 改前写的是 `remoteExec !== undefined && provider !== "host"` —— 依赖上一条对无手形的兜底;
84
+ * 上一条收窄之后,`none` ∧ 自编排 ∧ 无应答面必须由这一条接住(否则整形零告警)。
85
85
  */
86
86
  export declare function buildNoResponderBootWarns(input: {
87
87
  /** 本部署的执行车道(归一读口 `executionLaneOf` 的答案)。 */
package/dist/audit.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { StoredSession } from "@sema-agent/core";
2
- import { TiDBSessionStorage } from "./plugins/tidb-session-storage.js";
3
- import { PgSessionStorage } from "./plugins/pg-session-storage.js";
2
+ import { TiDBSessionStorage } from "./stores-sql/tidb-session-storage.js";
3
+ 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";
@@ -1,6 +1,8 @@
1
1
  import { outwardPlane } from "../../terminal.js";
2
2
  import { Runner, runWithVerification, resumeWithVerification, runRepairLoop, combinePolicies, createDurableQuestionPolicy, QUESTION_AWAITS_RESUME, } from "@sema-agent/core";
3
3
  import { loadConfig } from "../../config.js";
4
+ import { composeDeclaredExecutionLane } from "../../boot/execution-lane.js";
5
+ import { ALL_EXECUTION_LANES } from "../../execution-lane-caps.js";
4
6
  import { assertServedModelRoute } from "../../model-route-endpoint.js";
5
7
  import { withUnattendedLeg } from "../../unattended-permission-mode.js";
6
8
  import { createBrain } from "../../brain.js";
@@ -51,7 +53,7 @@ function buildBrainIngredients(rt) {
51
53
  process.env.MODEL_COST_CACHE_READ = String(rt.costCacheRead);
52
54
  if (rt.costCacheWrite != null)
53
55
  process.env.MODEL_COST_CACHE_WRITE = String(rt.costCacheWrite);
54
- const config = loadConfig();
56
+ const config = composeDeclaredExecutionLane(loadConfig(), { info: () => { } }, { name: "the s1 bench", runs: ALL_EXECUTION_LANES, declares: "none" });
55
57
  assertServedModelRoute(config, { envTableIsPlaceholder: false });
56
58
  const brain = createBrain(config, {});
57
59
  const pricing = buildPricing(config.models);
@@ -2,6 +2,7 @@ import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { z } from "zod";
4
4
  import { redactSecrets } from "../trace/redact.js";
5
+ import { OWNER_ONLY_FILE_MODE } from "../plugins/owner-only-file-mode.js";
5
6
  const CrashLastSchema = z.object({
6
7
  at: z.string(),
7
8
  version: z.string(),
@@ -25,7 +26,7 @@ export function writeCrashLast(dataRoot, info) {
25
26
  ...(info.inflight !== undefined ? { inflight: info.inflight } : {}),
26
27
  err: redactSecrets(firstLine),
27
28
  };
28
- writeFileSync(crashLastPath(dataRoot), JSON.stringify(body) + "\n");
29
+ writeFileSync(crashLastPath(dataRoot), JSON.stringify(body) + "\n", { mode: OWNER_ONLY_FILE_MODE });
29
30
  }
30
31
  catch {
31
32
  }
@@ -40,11 +40,21 @@ export interface LoadedModPackage {
40
40
  /** 读包者交回的三件字节摘要(`ModPackageRegistration.digest`,按给值记)—— 认得出「装的是哪几份字节」,不是代码完整性凭据。 */
41
41
  readonly digest: string;
42
42
  }
43
- /** 装配的结果:部署座的注册(自铸在前、声明在后,整列已过引擎准入)与装上的声明包(只数声明的包,自铸的不算)。 */
43
+ /** 装配的结果:部署座的注册(自铸在前、声明在后,整列已过引擎准入)、装上的声明包(只数声明的包,自铸的不算)与部署座的链站点式样。 */
44
44
  export interface DeploymentModsAssembly {
45
45
  readonly registrations: readonly ModRegistration<EngineDollar>[];
46
46
  readonly loaded: readonly LoadedModPackage[];
47
+ /** 部署座在**任务座之下**挂了链成员(不是观察者)的站点式样 —— 引擎这一次准入的记录读出({@link belowTaskChainPatternsOf})。读者:请求 `settings.hooks` 托管车道的只许收紧判据(`hooks/hook-runner.ts` 的 `managedTightenOnlyOn`)。 */
48
+ readonly belowTaskChainPatterns: readonly string[];
47
49
  }
50
+ /**
51
+ * 部署座在**任务座之下**挂了链成员的站点式样(去重,按准入序)。「之下」按引擎的跑序读:先按档(`MOD_TIERS` 的序),同档里部署座在任务座之前 ⇒
52
+ * 只有档排在任务座档之后的部署注册(今天是 `append`)在任务座之下;`prepend` 与同档 `user` 的部署注册在任务座之上(它们先判、再在答回来的结果上判,运维 handler 恒在请求钩子之上)。
53
+ * 每张准入了的、站在任务座之下的部署注册取 `events`(引擎记下的、它真挂了 handler 的式样)减去 `observe`(那张注册在该式样上只挂了观察者)。
54
+ * 读的是引擎的准入记录,不是注册自报的 `uses` —— 一处事实一个读法。式样的文法(精确站名或 `<前缀>.*`)由读者按引擎的定义读(`hooks/hook-runner.ts` 的 `chainsBelowTaskOn`)。
55
+ * 是**上界**:记录不带匹配器,带匹配器的 handler 在不中的那一次派发里不进链(引擎按派发取链)⇒ 读者只拿它收紧、从不拿它换挂法或放宽。
56
+ */
57
+ export declare function belowTaskChainPatternsOf(records: readonly ModAdmissionRecord[]): readonly string[];
48
58
  /** 部署座的唯一装配口(两只起服入口同调;三段与失败见文件头注)。 */
49
59
  export declare function assembleDeploymentMods(input: {
50
60
  readonly metrics: Pick<Metrics, "inc">;
@@ -1,6 +1,6 @@
1
1
  import { realpathSync, statSync } from "node:fs";
2
2
  import { isAbsolute, relative, sep } from "node:path";
3
- import { admitModChain, KERNEL_CONTRACT_VERSION, loadModPackage } from "@sema-agent/core";
3
+ import { admitModChain, KERNEL_CONTRACT_VERSION, loadModPackage, MOD_TIERS } from "@sema-agent/core";
4
4
  import { createBrandIdentityRegistration } from "../capabilities/brand-identity.js";
5
5
  import { createPermissionDeniedMeter, createToolTracer } from "../observability/tool-trace.js";
6
6
  import { errorCodeOf, errorText } from "../observability/err-text.js";
@@ -14,6 +14,19 @@ export function createDeploymentMods(input) {
14
14
  ...(input.brandIdentity === true ? [createBrandIdentityRegistration()] : []),
15
15
  ].map((registration) => ({ ...registration, provenance: MOD_PROVENANCE.minted }));
16
16
  }
17
+ const TASK_SEAT_TIER = "user";
18
+ export function belowTaskChainPatternsOf(records) {
19
+ const out = new Set();
20
+ const taskTier = MOD_TIERS.indexOf(TASK_SEAT_TIER);
21
+ for (const r of records) {
22
+ if (r.seat !== "deployment" || "refusedBy" in r || MOD_TIERS.indexOf(r.tier) <= taskTier)
23
+ continue;
24
+ for (const p of r.events)
25
+ if (!(r.observe ?? []).includes(p))
26
+ out.add(p);
27
+ }
28
+ return [...out];
29
+ }
17
30
  export async function assembleDeploymentMods(input) {
18
31
  const minted = createDeploymentMods(input);
19
32
  const resolved = resolveDeclaredPackages(input.declaration);
@@ -25,7 +38,7 @@ export async function assembleDeploymentMods(input) {
25
38
  const loaded = resolved.map(({ pkg }, i) => ({ name: pkg.name, tier: admittedRecordOf(records, pkg.name).tier, contract: KERNEL_CONTRACT_VERSION, digest: declared[i].digest }));
26
39
  for (const row of loaded)
27
40
  input.logger.info("mods_package_loaded", { name: sanitizeWireText(row.name), tier: row.tier, contract: row.contract, digest: row.digest });
28
- return { registrations, loaded };
41
+ return { registrations, loaded, belowTaskChainPatterns: belowTaskChainPatternsOf(records) };
29
42
  }
30
43
  function fsCauseOf(e) {
31
44
  const code = errorCodeOf(e);
@@ -10,7 +10,7 @@ export function createDeviceLane(ctx) {
10
10
  throw new Error("device lane: the device store is wired but the session store carries no execution placement seat — the session↔device binding lives on the " +
11
11
  "root session row and is read only through that seat; refusing to start a device lane that could neither bind nor read a binding (assembly bug)");
12
12
  }
13
- const knobs = config.remoteExec?.provider === "device" ? config.remoteExec : undefined;
13
+ const knobs = config.remoteExec.provider === "device" ? config.remoteExec : undefined;
14
14
  const enrollment = createDeviceEnrollment({
15
15
  store,
16
16
  seat,
@@ -30,12 +30,14 @@ export function createDeviceLane(ctx) {
30
30
  ...(knobs?.reconnectGraceMs != null ? { reconnectGraceMs: knobs.reconnectGraceMs } : {}),
31
31
  ...(knobs?.maxInflightPerDevice != null ? { maxInflightPerDevice: knobs.maxInflightPerDevice } : {}),
32
32
  ...(knobs?.maxPreAuthPerRemote !== undefined ? { maxPreAuthConnectionsPerRemote: knobs.maxPreAuthPerRemote } : {}),
33
+ ...(knobs?.trustedProxyCidrs !== undefined ? { trustedProxyCidrs: knobs.trustedProxyCidrs } : {}),
33
34
  ...(knobs?.supersede ? { supersede: knobs.supersede } : {}),
34
35
  });
35
36
  logger.info("device_lane_enabled", {
36
37
  replicaId,
37
38
  maxInflightPerDevice: knobs?.maxInflightPerDevice ?? 4,
38
39
  maxPreAuthPerRemote: knobs?.maxPreAuthPerRemote ?? 8,
40
+ trustedProxyCidrs: knobs?.trustedProxyCidrs?.length ?? 0,
39
41
  enrollRateLimit: `${DEVICE_ENROLL_RATE_POLICY.limit}/${DEVICE_ENROLL_RATE_POLICY.windowMs / 1000}s per caller identity (per replica; independent of RATE_LIMIT_RPM)`,
40
42
  });
41
43
  return { store, enrollment, hub, seat };
@@ -46,14 +48,14 @@ export function assertDeviceLaneWired(isDeviceLane, lane, hasFactory) {
46
48
  if (!lane) {
47
49
  throw new Error("REMOTE_EXEC=device but the device lane could not be wired at boot [device-lane-unwired]: the SQL backend is " +
48
50
  "configured yet this replica did not get one, so the device registry / session↔device binding / audit tables are absent. " +
49
- "Refusing to serve a lane that would silently fall back to the in-process stub env — a worker claiming to " +
51
+ "Refusing to serve a lane that would silently fall back to the engine's stub env with no hands mounted — a worker claiming to " +
50
52
  "execute on the employee's device while actually running inside its own process (#157). Fix the database " +
51
- "(or unset REMOTE_EXEC) and restart (device-executor-lane-v2 §4.7)");
53
+ "(or declare another lane, e.g. REMOTE_EXEC=none) and restart (device-executor-lane-v2 §4.7)");
52
54
  }
53
55
  if (!hasFactory) {
54
56
  throw new Error("REMOTE_EXEC=device but no DeviceExecutionEnv factory was built [device-lane-unwired]: the lane's stores are up " +
55
- "yet `boot/execution-env.ts` produced no factory, so core would fall back to the in-process stub env. This is " +
56
- "an assembly bug, not a configuration one — refusing to start rather than silently execute in-process (#157)");
57
+ "yet `boot/execution-env.ts` produced no factory, so core would fall back to its stub env with no hands mounted. This is " +
58
+ "an assembly bug, not a configuration one — refusing to start rather than silently run with no execution environment (#157)");
57
59
  }
58
60
  }
59
61
  export async function noteDeviceRelayBindings(relay, store, logger) {
@@ -28,7 +28,8 @@
28
28
  * `ENGINE_AUTO_EXIT` / `SEMA_PARENT_PID` 的表态上。
29
29
  * 2. **自退判据 = 三合取,且必须持续满 `linger`**(`linger` = 孤儿态 `orphan.lingerMs`,否则 `lingerMs`):
30
30
  * · 附着租约集空(`attachedStreams() === 0`);
31
- * · 无在飞 run(`inflight() === 0` —— **与 /health 的 `inflight` 同一只 getter**,不另立第二判据);
31
+ * · 无必须等完的活(`inflight() === 0` —— 读 `drainState.blockingInflight` = **阻断集** `http + leader + backgroundAgents`,与排空等的、SIGHUP 空闲窗**同一只**,不另立第二判据;
32
+ * `/health.inflight` 是它再加会话驻留的后台 shell / monitor 的**总数**:同一只分项函数 `/health.inflightBreakdown` 派生的两个事实,不是两套计数,见下「已知收窄」);
32
33
  * · HTTP 触点静默(`now() - lastActivityAt() >= lingerMs`),**且**最后一条附着流的**离场**
33
34
  * 也已满窗(`now() - lastAttachEndedAt() >= lingerMs` —— codex R1-F1,见该 dep 的注)。
34
35
  * 任何一条不满足即把计时清零(连续性判据,不是累计)。
@@ -66,23 +67,101 @@
66
67
  * 每 15s 无限期跑下去的定时器 —— 为它引入周期性 SQL 轮询,代价压过收益。**bg run 在跑不退**那一臂
67
68
  * 已由 `inflight()` 结构性守住;parked 行是 durable 的,引擎退掉不丢:下次起来仍可赎回(spawn 形里
68
69
  * 「下次」就是壳的下一次 spawn)。伤害面 = 一条 parked run 的赎回被推迟到下次启动,不是丢失。
69
- * 这是**允许的收窄,不是静默**:有了廉价 parked 计数口(或本腿改成事件驱动)之后应当补上。
70
- * · **活过父 run 的后台子代理不入判据**(codex R1 [high] 验真后**如实登记**,不是本件引入:[ref] 之前
71
- * 父死走的是**当场** drain,而 `drainThenShutdown` 读的是同一只 `inflight()` ⇒ 同一个缺口,只是那时
72
- * 连这 2s 都没有)。`inflight()` 的口径是**本副本的 HTTP 腿 ∪ leader 腿**(`http/server.ts` 的
73
- * `inflightRuns`/`steerableRuns`/两只计数器),而 core 侧 `backgroundScope:"session"` 的子代理可以
74
- * **活过**生它的那条 HTTP 腿 —— 那之后它在本腿眼里是 0。伤害面 = 壳没了且没人附着时,一条还在跑的
75
- * 后台子代理会随引擎的受控退被中断(它的账本行照常落终态,不是静默丢)。收口需要一只**廉价**的
76
- * 「本副本活跃子代理数」读口(与 parked 那条同族:要么 core 给计数,要么本腿改事件驱动),归属
77
- * `inflight()` 的属主而不是本腿 —— 在那之前这条收窄**成文在此**,不许再被读成「bg 全被守住」。
70
+ * 这是**允许的收窄,不是静默**:有了廉价 parked 计数口(或本腿改成事件驱动)之后应当补上。停驻的后台子代理(任务表 `parked`)同一条律、同样不计。
71
+ * · **会话驻留的后台 shell / monitor 不入判据**。阻断集 `http + leader + backgroundAgents` 是「还有没有**必须等完**的活」:HTTP 腿(在飞 run 集 · 同步计费腿 ·
72
+ * admission 期请求)、leader 腿,以及活过起它的那条 HTTP 腿、仍在跑的后台子代理(core `backgroundScope:"session"`;它是一条在干活的模型腿,干完自己收尾,不等它 = 受控退把它中断)。
73
+ * 会话驻留的后台 shell / monitor(`session-resident-background.ts` 读;running ∧ 会话驻留 ∧ 非 retain)**报**在 `/health.inflight`(总数)与
74
+ * `inflightBreakdown.sessionResident` 里 —— 外部判官据此判「这台引擎此刻托管着多少活」—— 但**不阻断**自退:它不是一条腿,等它没有意义,而一只不退出的 shell
75
+ * (`while true`)若阻断,崩溃孤儿引擎就永生(孤儿窗 / SIGHUP 空闲窗同读阻断集,排空也每次等满窗)。窗到 / 排空完成,退出边界的后台收割
76
+ * (`reapAllSessionBackground` + 硬面,`boot/exit-boundary.ts`)收掉它们;retain 行按 retain 既有语义活过受控退。伤害面 = 壳没了且没人附着时,引擎照退、
77
+ * 驻留的进程随受控退被收掉(与 7.145.x 逐字同,只把它报出来)。
78
+ * · **活过起它的腿的 workflow 不入判据**:任务表对它只投 `running`,一条腿停在审批门上等人时也是 `running`,读法分不出「在干活」与「在等人」;
79
+ * 等人的活若阻断,一张没人答的审批就让崩溃孤儿引擎永生(同上一条的病)。伤害面 = 壳没了且没人附着时,一条还在干活的 workflow 随受控退被收掉
80
+ * (与 7.146.x 同)。停驻位由 core 任务表投出后按停驻律分(见 `session-resident-background.ts` 头注)。
81
+ * (修前后台子代理也在这一条里:它们活过生它的 HTTP 腿之后在本腿眼里是 0,受控退把还在跑的子代理中断 —— 7.147.0 起收进阻断集,这条收窄只剩上面两类。)
78
82
  * · **`/health` 探针不算触点**:`lastActivityAt` 的属主(`http/server.ts` 的 `noteActivity`)按既有契约
79
83
  * 把 `/health` 与 `/metrics*` 排除在活性时钟之外(常态采样噪音不得把空闲窗永远撑开)。⇒ 一只**只**
80
84
  * 轮询 `/health` 的壳不构成租约。这与 SIGHUP 空闲窗的判据同源,刻意保持一致而非在本腿另开一份。
85
+ *
86
+ * ## [ref]:首次附着前的宽限 —— 窗表从两态变三态(判据 / 钟 / 出口都不变;[ref] 起并进下面那张四行车道表)
87
+ *
88
+ * 病:壳在 spawn 与**首次接触**之间被饿住(一次性 `-p` 车道 / CI / 高载宿主)超过 owned 窗 ⇒ 一只**从没被碰过**
89
+ * 的引擎按 owned 窗自退,壳醒来起步失败。收法只改「生效窗 = f(态)」这一张表,不加第二只钟、不加第二条自退路径:
90
+ *
91
+ * | 态(优先级从上到下) | 进入 | 生效窗 |
92
+ * |----------------------|------------------------------------------|--------------------------------|
93
+ * | 孤儿 | 装了孤儿车道 ∧ 看门狗已判父死 | `orphan.lingerMs` |
94
+ * | 候首触 | 起服以来还没有过非探针触点 ∧ 非孤儿 | `max(lingerMs, firstAttach.windowMs)` |
95
+ * | 已触(owned) | 有过触点 ∧ 非孤儿 | `lingerMs` |
96
+ *
97
+ * · **首触的唯一属主 = 活性时钟的写者**(`http/server.ts` 的 `noteActivity`,{@link EngineLeaseFirstAttachLane.firstTouchAt}):
98
+ * 第一个非探针请求(含打开 SSE 流 —— 它本身就是一个非探针请求)写一次就定,之后不回 null ⇒ 态**单向**。探针律不变;
99
+ * **在飞不翻态**(boot 赎回的 leader 腿没有客户端到场 —— 它在跑时三合取本就不成立,跑完仍按候首触窗计)。
100
+ * · **孤儿压过候首触**:宽限保护的是「父还活着、只是被饿住」的壳;父没了就没人会回来,顶注 7 那句「壳在接触前崩了 ⇒ 孤儿窗内退」不变。
101
+ * · **宽限只拉长不缩短**:`max(lingerMs, …)` —— 旋钮 `0`(或任何不大于 owned 窗的值)= 候首触窗落成 owned 窗 = [ref] 前逐字同;
102
+ * owned 窗 = `Infinity`(`ENGINE_AUTO_EXIT` 关着)⇒ 候首触窗也是 `Infinity`。
103
+ * · **拍频与 `/health.engineLease.lingerMs` 不变**:候首触窗 ≥ owned 窗,不进「最短窗」推导(顶注 9 / [ref])。
104
+ *
105
+ * ## [ref]([ref] v3):交接车道 —— 一只车道函数、一张四行表、一只区间、一只谓词
106
+ *
107
+ * 「Move to background and exit」:壳经 `POST /v1/engine/handover` 把引擎交给后台、自己退出(不 SIGTERM 引擎);下一只壳 `POST /v1/engine/attach`
108
+ * 即收回。规则只有一条 —— 车道是闭集 {@link ENGINE_LANES},由 {@link deriveEngineLane} 一处派生(从上到下第一条成立者),每条车道 = 表里一行:
109
+ *
110
+ * | 车道 | 进入 | 窗(唯一选窗处 `windowOf`) | 后台 shell 计入工作 | SIGHUP 空闲窗 |
111
+ * |----------------------|----------------------------------------|----------------------------------------|---------------------|---------------|
112
+ * | handover | 交接口置位(attach 口清位) | `handover.lingerMs` | 是 | 让位本腿 |
113
+ * | orphan | 装了孤儿车道 ∧ 看门狗已判父死 | `orphan.lingerMs` | 否 | 照旧 |
114
+ * | awaitingFirstAttach | 还没有过非探针触点 | `max(lingerMs, firstAttach.windowMs)` | 否 | 照旧 |
115
+ * | owned | 其余 | `lingerMs` | 否 | 照旧 |
116
+ *
117
+ * · **工作谓词一只**({@link laneWork}):附着 > 0 ∨ 在飞 > 0 ∨(本车道计后台 shell ∧ 运行中、引擎一退就会被收掉的后台 shell > 0)。本腿与
118
+ * `sighup-idle.ts` 都只调它(读者词 `"lease"` / `"sighup"`);SIGHUP 读者在「让位」那一格恒读到「有工作」—— handover 车道的寿命只归本腿这一只
119
+ * 定时器,终端关闭不会按另一套谓词 / 另一个窗把引擎拆掉(两只定时器判同一件事 = 两条自退律,顶注 6 那句纪律)。
120
+ * · **后台 shell 只在 handover 那一格计入**:owned / orphan 若也计,一只 `while true` 就让崩溃孤儿永生([ref] 倒退)。不是特判,是表里一格的值。
121
+ * · **孤儿照旧只由看门狗判**(没有租约集):交接压过孤儿;父已死时 attach ⇒ 回到 orphan(与 [ref]「复用孤儿引擎」同)。壳在交接之后退出不是
122
+ * 本腿的事件 —— 车道一直是 handover,直到新的 attach。
123
+ * · **交接车道与计数读口捆在一起**({@link EngineLeaseHandoverLane},与孤儿车道同理):缺席 ⇒ 门不建、车道结构上不可达。读口 = 退出边界此刻会硬收的
124
+ * 后台 shell 行数(`boot/exit-boundary.ts` 的 `countShellsExitWouldKill`;数与收同一只 `includeRetained`);装配层只按「非多租户」给,
125
+ * 不再有「读口缺席」这一态。它**不是** `/health.inflightBreakdown.sessionResident`(那是总数里会话驻留的分项;两问之差见 exit-boundary 那只函数的注)。
126
+ * · **窗与拍频**:交接窗进「最短窗」推导(本腿会执行它);判据 / 钟 / 出口(SIGTERM 那条 drain + `exit-last.json`)全不变。
127
+ * · 自退读数 `lane` 一键说清那一拍的车道(`orphan` / `firstAttachWindowExpired` 两只布尔随 `exit-last.json` 格式 3 退役 —— 同一事实只留一种读法);
128
+ * 不变量 `reason !== "idle"` ⟺ `lane === "orphan"`,同一处铸出。
81
129
  */
82
130
  import type { ParentOrphanReason } from "../parent-watch.js";
83
131
  /** 自退检查拍频的**上限**。**不开 env 旋钮**(与 `PARENT_WATCH_INTERVAL_MS` 同纪律:有真需求再议,
84
132
  * 防旋钮增殖);实际拍频由顶注 9 的推导取更小者。 */
85
133
  export declare const ENGINE_LEASE_TICK_MS = 15000;
134
+ /** [ref] 车道闭集(书写序 = 派生优先序,见 {@link deriveEngineLane})。 */
135
+ export declare const ENGINE_LANES: readonly ["handover", "orphan", "awaitingFirstAttach", "owned"];
136
+ export type EngineLane = (typeof ENGINE_LANES)[number];
137
+ /** 车道表里与配置无关的两列(窗那一列随配置,在 {@link createEngineLeaseTracker} 的 `windowOf` 里一处选)。
138
+ * `Record<EngineLane, …>`:加一条车道而这里没跟 ⇒ 编译红。 */
139
+ export interface EngineLaneRow {
140
+ /** 运行中、引擎一退就会被收掉的后台 shell 计入工作谓词吗。 */
141
+ readonly countsBackgroundShells: boolean;
142
+ /** SIGHUP 空闲窗在这条车道上让位本腿吗(让位 = SIGHUP 读者恒读到「有工作」)。 */
143
+ readonly sighupYieldsToLease: boolean;
144
+ }
145
+ export declare const ENGINE_LANE_TABLE: Readonly<Record<EngineLane, EngineLaneRow>>;
146
+ /** 车道派生 —— **唯一**一处(从上到下第一条成立者;交接压过孤儿,孤儿压过候首触)。三个输入都是持久态。 */
147
+ export declare function deriveEngineLane(s: {
148
+ readonly handedOver: boolean;
149
+ readonly orphaned: boolean;
150
+ readonly touched: boolean;
151
+ }): EngineLane;
152
+ /** 工作谓词的采样输入。`backgroundShells` 惰性:只在本车道计它时才读(那是一次注册表遍历)。 */
153
+ export interface EngineWorkSample {
154
+ readonly attached: number;
155
+ readonly inflight: number;
156
+ readonly backgroundShells: () => number;
157
+ }
158
+ /** 谁在读工作谓词(闭集):本腿 = `"lease"`;SIGHUP 空闲窗 = `"sighup"`。 */
159
+ export type EngineWorkReader = "lease" | "sighup";
160
+ /**
161
+ * **一只**工作谓词(采样格;活性钟 / 离场钟 / 连续空闲满窗由各读者自己的窗判)。`lane` 缺席 = 租约腿未装配(纯服务器形)或已停 ——
162
+ * 那时没有任何一行可读,谓词 = 附着 ∨ 在飞(与 [ref] 之前的 SIGHUP 逐字同)。
163
+ */
164
+ export declare function laneWork(lane: EngineLane | undefined, s: EngineWorkSample, reader: EngineWorkReader): boolean;
86
165
  /**
87
166
  * 孤儿态读数(装配层把看门狗的 `onOrphaned` 落成这一笔)。
88
167
  *
@@ -109,55 +188,142 @@ export interface EngineLeaseOrphanLane {
109
188
  * `null` = 父还活着。 */
110
189
  read: () => EngineOrphanState | null;
111
190
  }
112
- /** 自退缘由闭集:`"idle"` = 没人用了(owned 态);另两个词 = 看门狗判的孤儿那两支。
113
- * `orphan === (reason !== "idle")` 是不变量 —— 两者在**同一处**铸出(见 {@link createEngineLeaseTracker}),
114
- * 不存在各算一次的可能。 */
191
+ /**
192
+ * [ref] 首次附着车道 —— 窗长与读口**捆在一起**(与 {@link EngineLeaseOrphanLane} 同理:平行的两只 dep 会让「配了首窗、却没有
193
+ * 首触读口」成为一个可表达的状态)。装配层恒给(旋钮恒有值);`windowMs` 为 `0` 即不给额外宽限。
194
+ */
195
+ export interface EngineLeaseFirstAttachLane {
196
+ /** 旋钮值(`config.engineFirstAttachMs`;`0` = 关)。生效窗 = `max(lingerMs, windowMs)` —— 由本模块一处算,不在装配层算。 */
197
+ windowMs: number;
198
+ /** 首个**非探针** HTTP 触点的单调时刻(`drainState.firstActivityAt`;与 `now` 同为 `performance.now()` 域)。`null` = 还没有过。
199
+ * 属主 = 活性时钟的写者(写一次就定):本腿只读,不锁存、不另算 —— 首触的判据(探针律)只有那一处。 */
200
+ firstTouchAt: () => number | null;
201
+ }
202
+ /**
203
+ * [ref] 交接车道 —— 窗长与后台 shell 计数读口**捆在一起**(与孤儿车道同理:「配了交接窗、却数不了后台 shell」不可表达)。
204
+ * 装配层只在「非多租户」时给;缺席 ⇒ 把手上没有交接门,handover 车道结构上不可达。
205
+ */
206
+ export interface EngineLeaseHandoverLane {
207
+ /** 交接车道的窗(`config.engineHandoverLingerMs`,缺省 30 min)。 */
208
+ lingerMs: number;
209
+ /** 此刻运行中、引擎一退就会被收掉的后台 shell 行数(装配层给退出边界的 `shellsExitWouldKill`:与硬收面同一只 `includeRetained`,读不出按 1 计、不抛)。 */
210
+ backgroundShells: () => number;
211
+ }
212
+ /** 交接的缘由闭集(交接口体的 `reason`)。 */
213
+ export declare const HANDOVER_REASONS: readonly ["background_exit"];
214
+ export type HandoverReason = (typeof HANDOVER_REASONS)[number];
215
+ /** `engine_lane_changed` 的缘由闭集(只由交接门铸:孤儿已有 `parent_watch_orphaned`,首触今天无日志)。 */
216
+ export type EngineLaneChangeReason = "handover_requested" | "attached";
217
+ /** 自退缘由闭集:`"idle"` = 不在孤儿车道;另两个词 = 看门狗判的孤儿那两支。
218
+ * 不变量 `reason !== "idle"` ⟺ `lane === "orphan"` —— 两者在**同一处**铸出(见 {@link createEngineLeaseTracker})。 */
115
219
  export type EngineLeaseExitReason = "idle" | ParentOrphanReason;
116
220
  /**
117
221
  * 自退那一刻的**判据读数**(一个对象,三个消费者:`engine_lease_auto_exit` 日志行、数据根上的
118
222
  * `exit-last.json` 留痕、以及 drain 本身)。一处铸出 ⇒ 日志与留痕永远不会各说各话。
119
223
  */
120
224
  export interface EngineLeaseExitReport {
121
- /** 父已经不在了那一路退的吗(壳的 exit watch 读这一键把 pid 归入**预期**退出)。 */
122
- orphan: boolean;
225
+ /** [ref]:自退那一拍的车道(窗就是按它选的)。 */
226
+ lane: EngineLane;
123
227
  reason: EngineLeaseExitReason;
124
228
  /** 真实空闲时长(不是配置的窗长 —— 见顶注 8)。 */
125
229
  idleForMs: number;
126
230
  attached: number;
127
231
  inflight: number;
128
- /** 本次**生效**的窗长(孤儿态 = 孤儿窗)。 */
232
+ /** 本次**生效**的窗长(= 那一拍车道的窗)。 */
129
233
  lingerMs: number;
130
- /** 成孤儿到自退之间隔了多久;非孤儿退出时键缺席(不编 0)。 */
234
+ /** 成孤儿到自退之间隔了多久;非孤儿车道退出时键缺席(不编 0)。 */
131
235
  orphanedForMs?: number;
132
236
  }
133
237
  /**
134
238
  * [ref] —— 租约窗的 wire 读数(`GET /health` 的 `engineLease`;壳持租约的触点节拍据此定,别处起的短窗引擎不再让第二句失败)。
135
239
  *
136
240
  * ## 报的是什么
137
- * · `lingerMs` = 本腿**会执行的最短静默窗**:父还活着的窗({@link EngineLeaseDeps.lingerMs})与孤儿窗({@link EngineLeaseOrphanLane.lingerMs},只在看门狗装了时存在)取小。
241
+ * · `lingerMs` = 本腿**会执行的最短静默窗**:父还活着的窗({@link EngineLeaseDeps.lingerMs})、孤儿窗({@link EngineLeaseOrphanLane.lingerMs},只在看门狗装了时存在)、
242
+ * 交接窗({@link EngineLeaseHandoverLane.lingerMs},只在交接车道装了时存在)取小。
138
243
  * 取**最短**而不是「此刻生效」:此刻生效的窗在父死那一拍从 owned 窗掉到孤儿窗,按旧读数定节拍的壳会在下一次读 `/health` 之前被拆台;
139
244
  * 最短窗是配置的性质、不随状态变,壳的触点只要比它密,在任何状态下都留得住引擎。
140
245
  * · `tickMs` = 自退检查的采样拍。自退发生在**生效窗**满之后、至多再晚一拍(顶注 8);生效窗恒 ≥ `lingerMs`(`lingerMs` 是各窗里最短的一个),所以触点比 `lingerMs` 密 ⇒ 在任何状态下都先于自退。
141
246
  * 读数**不预言**自退时刻:父还活着时生效的是 owned 窗,自退只会更晚。
247
+ * · `lane`([ref])= 此刻的车道(与自退判据同一只派生函数,每次现读)。
142
248
  *
143
249
  * ## 一源
144
250
  * 与租约腿自己的行为同一处铸出:`engine_lease_armed` 日志、自退判据用的窗、拍频推导(`tickMs = min(15s, 最短窗)`)和本读数读的是同一组数 ——
145
- * 不存在第二处去「算一遍租约窗」。一个永远不到期的窗(owned 窗 = `Infinity` 且没有孤儿车道)不是租约:读数整个缺席,不补 0、不把 `Infinity` 送进 JSON。
251
+ * 不存在第二处去「算一遍租约窗」。一个永远不到期的窗(owned 窗 = `Infinity` 且没有孤儿 / 交接车道)不是租约:读数整个缺席,不补 0、不把 `Infinity` 送进 JSON。
146
252
  */
147
253
  export interface EngineLeaseFacts {
148
254
  readonly lingerMs: number;
149
255
  readonly tickMs: number;
256
+ /** [ref]:此刻的车道。 */
257
+ readonly lane: EngineLane;
258
+ /** [ref] 首窗格({@link EngineLeaseFirstAttachFacts}):候首触窗有限(owned 窗有限)才在场 —— 永不到期的窗不上 wire(同上一段那条律)。 */
259
+ readonly firstAttach?: EngineLeaseFirstAttachFacts;
260
+ /** [ref] 交接格({@link EngineHandoverFacts}):只在 handover 车道在场。 */
261
+ readonly handover?: EngineHandoverFacts;
262
+ }
263
+ /**
264
+ * [ref] —— `GET /health` 的 `engineLease.firstAttach`:首次附着前的宽限窗。
265
+ *
266
+ * · `windowMs` = **生效**的候首触窗 `max(owned 窗, ENGINE_FIRST_ATTACH_MS)`(解析后的真值,不是旋钮回声;旋钮 `0` ⇒ 等于 owned 窗)。
267
+ * · `since` = 窗开始的时刻(装配那一拍,epoch ms)。父一直活着且一直没人碰时,`since + windowMs` 是「最早何时自退」的**下界**,不是预言 —— 父死之后孤儿窗优先、可以更早退
268
+ * (那一态的窗看同一格的 `lingerMs`:最短窗已含孤儿窗;本格在孤儿态照旧在场,codex 对抗审 F2 成文);
269
+ * 候首触期间有在飞会让它后移,另有至多一拍的采样滞后(顶注 8)。没有单列 `until` —— 它可由这两格推出(一个事实一处读)。
270
+ * · `attachedAt` = 首个非探针触点的时刻(epoch ms);`null` = 还在候首触。非 null ⇒ 首窗已永久关闭(单向)。
271
+ * · 两个时刻是**同一只单调钟**的投影:装配时只采一次挂钟作锚,`epoch = since + (单调时刻 − 装配单调时刻)`。不跑第二只钟;系统改钟之后它与真实期限会漂开(成文)。
272
+ */
273
+ export interface EngineLeaseFirstAttachFacts {
274
+ readonly windowMs: number;
275
+ readonly since: number;
276
+ readonly attachedAt: number | null;
277
+ }
278
+ /**
279
+ * [ref] —— 交接格(`GET /health` 的 `engineLease.handover`;交接口 200 体 = 其中 `since` / `lingerMs` / `backgroundShells` 三键加 `lane`)。
280
+ * · `since` = 进入交接车道的时刻(epoch ms,与首窗格同一只单调钟投影);幂等的再次交接回同一个值。
281
+ * · `lingerMs` = 交接窗;`backgroundShells` = 退出边界此刻会硬收的后台 shell 行数(现读)。窗只在它为 0、阻断集在飞为 0、且无附着与触点时起算。
282
+ * · 不带在飞数:阻断集在同一份 `/health` 里已由 `inflightBreakdown.http + leader + backgroundAgents` 读出(一个事实一处读);交接口 200 体若带它,读到的恒含这次请求自己。
283
+ */
284
+ export interface EngineHandoverFacts {
285
+ readonly since: number;
286
+ readonly reason: HandoverReason;
287
+ readonly lingerMs: number;
288
+ readonly backgroundShells: number;
289
+ }
290
+ /** 交接口的应答(200 体):`lane` 恒 `"handover"` + 交接格里的三键。 */
291
+ export interface EngineHandoverEntry {
292
+ readonly lane: "handover";
293
+ readonly since: number;
294
+ readonly lingerMs: number;
295
+ readonly backgroundShells: EngineHandoverFacts["backgroundShells"];
296
+ }
297
+ /** attach 口的应答(200 体):清位之后的车道;`handedOverForMs` 只在这一次 attach 真的清掉了交接位时在场。 */
298
+ export interface EngineAttachAnswer {
299
+ readonly lane: EngineLane;
300
+ readonly handedOverForMs?: number;
301
+ }
302
+ /**
303
+ * [ref] 交接门 —— 本腿交给装配层(经排空盒子到两只 HTTP 口)的**唯一**写口。只在交接车道装了时存在。
304
+ * `observing` = 腿还在观察(停了 ⇒ 能力事实答不可用;两口不再写)。
305
+ */
306
+ export interface EngineHandoverDoor {
307
+ readonly observing: boolean;
308
+ /** 置交接位(幂等:已在 handover ⇒ 回同一个 `since`,不再打日志)。 */
309
+ enter(reason: HandoverReason): EngineHandoverEntry;
310
+ /** 清交接位(不在 handover ⇒ 照回此刻车道)。 */
311
+ attach(): EngineAttachAnswer;
150
312
  }
151
313
  /** {@link createEngineLeaseTracker} 的把手:`stop()` 收摊;`facts` 现读 —— **腿还在观察**时才有(收摊 / 自退触发之后缺席,says-yes ⟺ 腿在转)。 */
152
314
  export interface EngineLeaseHandle {
153
315
  stop(): void;
154
316
  readonly facts: EngineLeaseFacts | undefined;
317
+ /** [ref]:此刻的车道(腿在观察才有;SIGHUP 读者经它读同一只车道函数)。 */
318
+ lane(): EngineLane | undefined;
319
+ /** [ref]:交接门(交接车道装了才有)。 */
320
+ readonly handover?: EngineHandoverDoor;
155
321
  }
156
322
  export interface EngineLeaseDeps {
157
323
  /** 活附着数 = 本副本当前**打开着的 SSE 流**条数(`drainState.attachedStreams`,由 `createHttpServer` 自赋)。 */
158
324
  attachedStreams: () => number;
159
- /** 在飞腿数 —— **`/health` 的 `inflight` 同一只 getter**(`drainState.inflight`)。不自建第二套计数:
160
- * 两套计数迟早分叉,而分叉的那一侧恰好是「以为没 run 了」就把引擎关掉。 */
325
+ /** 必须等完的活的数 —— **阻断集** `drainState.blockingInflight`(`http + leader + backgroundAgents`;与排空等的、SIGHUP 空闲窗同一只 getter。会话驻留的后台 shell / monitor 在
326
+ * `/health.inflight` 的总数里、不在这里,见顶注「已知收窄」)。不自建第二套计数:两套计数迟早分叉,而分叉的那一侧恰好是「以为没 run 了」就把引擎关掉。 */
161
327
  inflight: () => number;
162
328
  /** 最后一次**非探针** HTTP 触点的单调时刻(`drainState.lastActivityAt`)。
163
329
  * ⚠️ 时基契约:必须与本模块的 `now` 同为 `performance.now()` 单调域(`server.ts` 的打点即该域)——
@@ -180,8 +346,12 @@ export interface EngineLeaseDeps {
180
346
  /** owned 态(父还活着 / 没被监视)下三合取**持续**满这么久才触发(`config.engineLingerMs`,默认 60s)。
181
347
  * **`Infinity`** = 永不自退(`ENGINE_AUTO_EXIT` 关着的 owned 引擎;窗永远追不上 ⇒ 无需第二条分支)。 */
182
348
  lingerMs: number;
183
- /** 孤儿车道(`SEMA_PARENT_PID` 在场才给)。缺席 ⇒ 这台引擎不可能成孤儿,窗恒为 `lingerMs`。 */
349
+ /** 孤儿车道(`SEMA_PARENT_PID` 在场才给)。缺席 ⇒ 这台引擎不可能成孤儿。 */
184
350
  orphan?: EngineLeaseOrphanLane;
351
+ /** [ref] 首次附着车道(恒给;见 {@link EngineLeaseFirstAttachLane})。 */
352
+ firstAttach: EngineLeaseFirstAttachLane;
353
+ /** [ref] 交接车道(非多租户才给;见 {@link EngineLeaseHandoverLane})。缺席 ⇒ 把手上没有交接门。 */
354
+ handover?: EngineLeaseHandoverLane;
185
355
  log: (event: string, fields: Record<string, unknown>) => void;
186
356
  /** 检查拍频 seam(测试)。缺省 = 顶注 9 的推导(`min(ENGINE_LEASE_TICK_MS, 本腿可能执行的每个窗)`)。 */
187
357
  tickMs?: number;
@@ -189,6 +359,9 @@ export interface EngineLeaseDeps {
189
359
  * 拉长 linger 窗 —— 前跳把窗直接跳过去 = 在一只还有人用的引擎底下提前关停。 */
190
360
  now?: () => number;
191
361
  }
362
+ /** 后台 shell 计数在没有交接车道时**结构上读不到**(只有 handover 那一格读它,而 handover 车道只经交接门进入,门只在车道装了时建)。
363
+ * 真被读到 = 不变量破了 —— 响亮抛,不回一个看起来合理的 0([ref])。 */
364
+ export declare const backgroundShellsUnreachable: () => number;
192
365
  /** 装配并**立刻**起自退检查(装配即 `engine_lease_armed`)。返回停机链用的 `stop()`。 */
193
366
  export declare function createEngineLeaseTracker(deps: EngineLeaseDeps): EngineLeaseHandle;
194
367
  //# sourceMappingURL=engine-lease.d.ts.map