@sema-agent/server 7.146.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 (398) hide show
  1. package/MIGRATION.md +384 -0
  2. package/README.md +1 -1
  3. package/README.zh-CN.md +1 -1
  4. package/USAGE.md +170 -66
  5. package/deploy/facts/lanes.json +7 -0
  6. package/deploy/sema-up/README.md +2 -2
  7. package/deploy/sema-up/chart/templates/_helpers.tpl +22 -0
  8. package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -4
  9. package/deploy/sema-up/chart/templates/server.yaml +5 -4
  10. package/deploy/sema-up/chart/values.yaml +1 -1
  11. package/deploy/sema-up/cluster-up.sh +2 -1
  12. package/deploy/sema-up/lib/flagshape.sh +4 -0
  13. package/deploy/sema-up/lib/lanes.json +2 -5
  14. package/deploy/sema-up/sema-up.sh +12 -9
  15. package/deploy/sema-up/stack/compose.yaml +5 -4
  16. package/deploy/sema-up/stack/sema-stack-cluster.yaml +4 -3
  17. package/dist/approval-card.d.ts +4 -4
  18. package/dist/approval.d.ts +3 -3
  19. package/dist/audit.js +2 -2
  20. package/dist/bench/s1/live-deps.js +3 -1
  21. package/dist/boot/crash-last.js +2 -1
  22. package/dist/boot/device-lane.js +5 -5
  23. package/dist/boot/engine-lease.d.ts +12 -11
  24. package/dist/boot/execution-env.d.ts +2 -1
  25. package/dist/boot/execution-env.js +45 -33
  26. package/dist/boot/execution-lane.d.ts +37 -9
  27. package/dist/boot/execution-lane.js +74 -20
  28. package/dist/boot/exit-boundary.d.ts +1 -1
  29. package/dist/boot/exit-last.js +2 -1
  30. package/dist/boot/governance-seams.d.ts +2 -2
  31. package/dist/boot/leader.js +1 -1
  32. package/dist/boot/memory-boundary.d.ts +11 -11
  33. package/dist/boot/memory-boundary.js +3 -3
  34. package/dist/boot/memory-consolidation.d.ts +13 -24
  35. package/dist/boot/memory-consolidation.js +0 -13
  36. package/dist/boot/org-memory.js +3 -2
  37. package/dist/boot/parked-revive-gate.d.ts +1 -1
  38. package/dist/boot/parked-revive-gate.js +1 -1
  39. package/dist/boot/reapers.js +1 -1
  40. package/dist/boot/resolve-spec.js +91 -111
  41. package/dist/boot/retention-lane.d.ts +4 -42
  42. package/dist/boot/session-faces.d.ts +1 -0
  43. package/dist/boot/session-faces.js +8 -2
  44. package/dist/boot/stage-01-config.d.ts +1 -1
  45. package/dist/boot/stage-01-config.js +6 -2
  46. package/dist/boot/stage-02-web-admin-pull.d.ts +1 -1
  47. package/dist/boot/stage-02-web-admin-pull.js +10 -8
  48. package/dist/boot/stage-03-store-backend.d.ts +1 -1
  49. package/dist/boot/stage-04-stores.d.ts +1 -1
  50. package/dist/boot/stage-05-execution-env.d.ts +2 -2
  51. package/dist/boot/stage-05-execution-env.js +3 -3
  52. package/dist/boot/stage-06-runners.d.ts +3 -3
  53. package/dist/boot/stage-06-runners.js +1 -3
  54. package/dist/boot/stage-07-capability-layer.d.ts +3 -3
  55. package/dist/boot/stage-07-capability-layer.js +4 -9
  56. package/dist/boot/stage-08-reapers.d.ts +3 -3
  57. package/dist/boot/stage-09-leader.d.ts +4 -3
  58. package/dist/boot/stage-10-http-server.d.ts +4 -3
  59. package/dist/boot/stage-10-http-server.js +2 -1
  60. package/dist/boot/stores.d.ts +9 -0
  61. package/dist/boot/stores.js +18 -7
  62. package/dist/boot/web-admin.js +3 -3
  63. package/dist/capabilities/center-plugins.d.ts +2 -0
  64. package/dist/capabilities/center-plugins.js +6 -2
  65. package/dist/capabilities/composite-members.d.ts +1 -0
  66. package/dist/capabilities/composite-members.js +1 -0
  67. package/dist/capabilities/execution-lane.d.ts +7 -7
  68. package/dist/capabilities/execution-lane.js +2 -2
  69. package/dist/capabilities/hands-lane.d.ts +1 -1
  70. package/dist/capabilities/scenarios.d.ts +32 -18
  71. package/dist/capabilities/scenarios.js +13 -9
  72. package/dist/capabilities/settings-contract.d.ts +29 -0
  73. package/dist/capabilities/settings-contract.js +14 -0
  74. package/dist/capabilities/skills.d.ts +5 -5
  75. package/dist/capability-facts.d.ts +38 -0
  76. package/dist/capability-facts.js +34 -1
  77. package/dist/center-credential-renewer.js +3 -2
  78. package/dist/config-catalog.js +6 -5
  79. package/dist/config-invariants.d.ts +18 -3
  80. package/dist/config-invariants.js +36 -19
  81. package/dist/config-lkg.d.ts +1 -1
  82. package/dist/config-lkg.js +5 -6
  83. package/dist/config-provider.js +2 -0
  84. package/dist/config-types.d.ts +190 -186
  85. package/dist/config.d.ts +68 -5
  86. package/dist/config.js +80 -54
  87. package/dist/degenerate-instrument.js +1 -1
  88. package/dist/deploy-facts.js +3 -2
  89. package/dist/deployment-shape.d.ts +21 -12
  90. package/dist/deployment-shape.js +24 -6
  91. package/dist/env-facts.d.ts +7 -5
  92. package/dist/env-facts.js +10 -6
  93. package/dist/execution-config-root.d.ts +5 -5
  94. package/dist/execution-config-root.js +5 -5
  95. package/dist/execution-env-purpose.d.ts +14 -0
  96. package/dist/execution-env-purpose.js +29 -0
  97. package/dist/execution-lane-caps.d.ts +49 -86
  98. package/dist/execution-lane-caps.js +52 -62
  99. package/dist/execution-placement.d.ts +18 -2
  100. package/dist/execution-placement.js +19 -0
  101. package/dist/file-history-disclosure.d.ts +2 -2
  102. package/dist/fleet/drain-entry.d.ts +17 -10
  103. package/dist/fleet/drain-entry.js +1 -1
  104. package/dist/fleet/serving-lease.js +3 -4
  105. package/dist/history-anchor.d.ts +22 -0
  106. package/dist/history-anchor.js +14 -0
  107. package/dist/hooks/command-spawn.d.ts +1 -4
  108. package/dist/hooks/command-spawn.js +0 -11
  109. package/dist/hooks/hook-runner.d.ts +52 -8
  110. package/dist/hooks/hook-runner.js +160 -36
  111. package/dist/http/approval-sweeps.d.ts +2 -5
  112. package/dist/http/approval-sweeps.js +3 -2
  113. package/dist/http/checkpoint-ctx.d.ts +17 -0
  114. package/dist/http/checkpoint-ctx.js +6 -0
  115. package/dist/http/claim-latency.d.ts +10 -0
  116. package/dist/http/claim-latency.js +12 -0
  117. package/dist/http/dispatch.js +1 -1
  118. package/dist/http/durable-run-leg.js +2 -1
  119. package/dist/http/execution-context.d.ts +3 -1
  120. package/dist/http/execution-context.js +4 -0
  121. package/dist/http/memory-compliance-failure-reply.d.ts +1 -1
  122. package/dist/http/memory-compliance-failure-reply.js +3 -0
  123. package/dist/http/memory-store-refusal-reply.d.ts +3 -3
  124. package/dist/http/memory-store-refusal-reply.js +3 -0
  125. package/dist/http/owner-access.d.ts +11 -0
  126. package/dist/http/owner-access.js +7 -4
  127. package/dist/http/principal-gate.d.ts +3 -14
  128. package/dist/http/principal-gate.js +0 -13
  129. package/dist/http/request-guards.d.ts +1 -1
  130. package/dist/http/resume-legs.d.ts +7 -10
  131. package/dist/http/resume-legs.js +79 -50
  132. package/dist/http/rewind-files-reply.d.ts +34 -0
  133. package/dist/http/rewind-files-reply.js +36 -0
  134. package/dist/http/route-ctx.d.ts +32 -16
  135. package/dist/http/route-table.js +2 -0
  136. package/dist/http/routes/approvals-assistant.js +5 -25
  137. package/dist/http/routes/capabilities.js +8 -2
  138. package/dist/http/routes/devices.js +1 -1
  139. package/dist/http/routes/memory-origin.d.ts +1 -1
  140. package/dist/http/routes/notify-wake.js +2 -1
  141. package/dist/http/routes/projects.d.ts +70 -0
  142. package/dist/http/routes/projects.js +86 -0
  143. package/dist/http/routes/rules.js +30 -2
  144. package/dist/http/routes/runs.js +8 -8
  145. package/dist/http/routes/session-sync.js +27 -10
  146. package/dist/http/routes/sessions.d.ts +7 -1
  147. package/dist/http/routes/sessions.js +104 -2
  148. package/dist/http/routes/tasks.js +9 -3
  149. package/dist/http/server.d.ts +24 -10
  150. package/dist/http/server.js +17 -6
  151. package/dist/http/stored-body-replay.d.ts +5 -3
  152. package/dist/http/stored-body-replay.js +10 -1
  153. package/dist/http/wire-types.d.ts +19 -10
  154. package/dist/index.d.ts +2 -2
  155. package/dist/index.js +1 -1
  156. package/dist/instruction-source-notice.d.ts +1 -1
  157. package/dist/memory-embedder-reembed.d.ts +38 -0
  158. package/dist/memory-embedder-reembed.js +20 -0
  159. package/dist/memory-incident-sink.d.ts +0 -28
  160. package/dist/memory-incident-sink.js +5 -0
  161. package/dist/memory-scope.d.ts +2 -2
  162. package/dist/memory-scope.js +1 -1
  163. package/dist/memory-store-refusal.d.ts +17 -4
  164. package/dist/memory-store-refusal.js +1 -1
  165. package/dist/memory-sync-client.d.ts +2 -0
  166. package/dist/memory-sync-client.js +13 -11
  167. package/dist/memory-sync.js +1 -1
  168. package/dist/model-compat.d.ts +35 -21
  169. package/dist/model-compat.js +49 -21
  170. package/dist/model-entry-refusal.d.ts +11 -1
  171. package/dist/model-entry-refusal.js +7 -0
  172. package/dist/namespaced-rule-name.d.ts +18 -1
  173. package/dist/namespaced-rule-name.js +12 -0
  174. package/dist/observability/fail-open.d.ts +17 -9
  175. package/dist/observability/fail-open.js +17 -9
  176. package/dist/observability/metrics.d.ts +2 -0
  177. package/dist/observability/metrics.js +2 -0
  178. package/dist/observability/secret-env-scrub.d.ts +30 -4
  179. package/dist/observability/secret-env-scrub.js +15 -3
  180. package/dist/orchestration/workflow-agent-session-index.d.ts +7 -12
  181. package/dist/orchestration/workflow-agent-session-index.js +1 -6
  182. package/dist/orchestration/workflow-completion-inbox.d.ts +26 -6
  183. package/dist/orchestration/workflow-completion-inbox.js +63 -45
  184. package/dist/org-memory-admission.d.ts +5 -2
  185. package/dist/org-memory-admission.js +25 -10
  186. package/dist/parked-decide.d.ts +33 -26
  187. package/dist/parked-decide.js +36 -44
  188. package/dist/plugins/approval-ask-store-file.d.ts +10 -2
  189. package/dist/plugins/approval-ask-store-file.js +37 -4
  190. package/dist/plugins/approval-ask-store-memory.d.ts +5 -3
  191. package/dist/plugins/approval-ask-store-memory.js +11 -2
  192. package/dist/plugins/approval-ask-store-sql.d.ts +3 -0
  193. package/dist/plugins/approval-ask-store-sql.js +3 -1
  194. package/dist/plugins/blob-backend.d.ts +38 -195
  195. package/dist/plugins/blob-backend.js +33 -229
  196. package/dist/plugins/caching-session-store.d.ts +9 -4
  197. package/dist/plugins/checkpoint-index-columns.d.ts +1 -1
  198. package/dist/plugins/checkpoint-index-columns.js +3 -2
  199. package/dist/plugins/checkpoint-store-face.d.ts +1 -1
  200. package/dist/plugins/device-store-sql.d.ts +2 -2
  201. package/dist/plugins/device-store-sql.js +5 -10
  202. package/dist/plugins/execution-lane-rename-m40.d.ts +20 -0
  203. package/dist/plugins/execution-lane-rename-m40.js +10 -0
  204. package/dist/plugins/execution-placement-sql.d.ts +63 -88
  205. package/dist/plugins/execution-placement-sql.js +94 -54
  206. package/dist/plugins/file-run-store.d.ts +26 -12
  207. package/dist/plugins/file-run-store.js +63 -63
  208. package/dist/plugins/imported-layer-root-retirement.d.ts +17 -8
  209. package/dist/plugins/imported-layer-root-retirement.js +4 -8
  210. package/dist/plugins/inbox-payload-column.d.ts +14 -0
  211. package/dist/plugins/inbox-payload-column.js +13 -0
  212. package/dist/plugins/local-checkpoint-store.d.ts +5 -0
  213. package/dist/plugins/local-checkpoint-store.js +11 -7
  214. package/dist/plugins/local-data-dir-modes-m39.d.ts +48 -0
  215. package/dist/plugins/local-data-dir-modes-m39.js +182 -0
  216. package/dist/plugins/local-engine-high-water.d.ts +11 -0
  217. package/dist/plugins/local-engine-high-water.js +59 -0
  218. package/dist/plugins/local-session-store.d.ts +91 -25
  219. package/dist/plugins/local-session-store.js +124 -45
  220. package/dist/plugins/local-task-attachment-store.d.ts +2 -0
  221. package/dist/plugins/local-task-attachment-store.js +10 -11
  222. package/dist/plugins/memory-embedder-fingerprint.d.ts +33 -10
  223. package/dist/plugins/memory-embedder-fingerprint.js +52 -12
  224. package/dist/plugins/memory-embedder.d.ts +1 -1
  225. package/dist/plugins/memory-embedder.js +2 -2
  226. package/dist/plugins/memory-engine-pg.d.ts +4 -3
  227. package/dist/plugins/memory-engine-pg.js +4 -4
  228. package/dist/plugins/memory-engine-sql-apply.d.ts +13 -4
  229. package/dist/plugins/memory-engine-sql-apply.js +1 -1
  230. package/dist/plugins/memory-engine-tidb.d.ts +8 -5
  231. package/dist/plugins/memory-engine-tidb.js +7 -8
  232. package/dist/plugins/one-time-migrations.d.ts +145 -35
  233. package/dist/plugins/one-time-migrations.js +272 -120
  234. package/dist/plugins/owner-only-file-mode.d.ts +29 -0
  235. package/dist/plugins/owner-only-file-mode.js +141 -0
  236. package/dist/plugins/permission-rule-store-file.d.ts +8 -8
  237. package/dist/plugins/permission-rule-store-file.js +14 -2
  238. package/dist/plugins/pg-pool.d.ts +2 -1
  239. package/dist/plugins/pg-pool.js +11 -4
  240. package/dist/plugins/release-version.d.ts +20 -0
  241. package/dist/plugins/release-version.js +28 -0
  242. package/dist/plugins/remote-env-adb.d.ts +20 -4
  243. package/dist/plugins/remote-env-adb.js +39 -11
  244. package/dist/plugins/remote-env-e2b.d.ts +12 -3
  245. package/dist/plugins/remote-env-e2b.js +6 -4
  246. package/dist/plugins/remote-env-host.d.ts +9 -1
  247. package/dist/plugins/remote-env-host.js +6 -5
  248. package/dist/plugins/remote-env-k8s.d.ts +5 -2
  249. package/dist/plugins/remote-env-k8s.js +15 -4
  250. package/dist/plugins/remote-env-local-docker.d.ts +4 -1
  251. package/dist/plugins/remote-env-local-docker.js +3 -3
  252. package/dist/plugins/remote-env-ssh.d.ts +8 -2
  253. package/dist/plugins/remote-env-ssh.js +26 -24
  254. package/dist/plugins/remote-shell.d.ts +59 -30
  255. package/dist/plugins/remote-shell.js +175 -62
  256. package/dist/plugins/retention-declaration.d.ts +37 -0
  257. package/dist/plugins/retention-declaration.js +9 -0
  258. package/dist/plugins/retention-deployment.d.ts +126 -0
  259. package/dist/plugins/retention-deployment.js +88 -0
  260. package/dist/plugins/retention-lane-store-sql.d.ts +74 -4
  261. package/dist/plugins/retention-lane-store-sql.js +103 -1
  262. package/dist/plugins/retention-sql.d.ts +29 -0
  263. package/dist/plugins/retention-sql.js +8 -0
  264. package/dist/plugins/schema-consistency.d.ts +0 -6
  265. package/dist/plugins/schema-consistency.js +1 -2
  266. package/dist/plugins/schema-ensure-legs.d.ts +1 -1
  267. package/dist/plugins/schema-ensure-legs.js +11 -1
  268. package/dist/plugins/session-ext-table.d.ts +74 -0
  269. package/dist/plugins/session-ext-table.js +121 -0
  270. package/dist/plugins/session-fork.d.ts +1 -1
  271. package/dist/plugins/session-row-sql.d.ts +8 -7
  272. package/dist/plugins/session-row-sql.js +15 -7
  273. package/dist/plugins/session-store-sql.d.ts +131 -0
  274. package/dist/plugins/session-store-sql.js +298 -0
  275. package/dist/plugins/session-workspace-cell.d.ts +2 -2
  276. package/dist/plugins/session-workspace-cell.js +2 -2
  277. package/dist/plugins/shared-memory-store-sql.d.ts +10 -0
  278. package/dist/plugins/shared-memory-store-sql.js +13 -13
  279. package/dist/plugins/snapshot-bucket-presence.js +1 -1
  280. package/dist/plugins/sql-driver.d.ts +23 -7
  281. package/dist/plugins/sql-driver.js +41 -8
  282. package/dist/plugins/sql-errors.d.ts +5 -2
  283. package/dist/plugins/sql-errors.js +4 -0
  284. package/dist/plugins/store-backend.d.ts +35 -8
  285. package/dist/plugins/store-backend.js +184 -62
  286. package/dist/plugins/store-contracts.d.ts +9 -2
  287. package/dist/plugins/store-contracts.js +1 -0
  288. package/dist/plugins/task-attachment-store.d.ts +6 -8
  289. package/dist/plugins/task-attachment-store.js +15 -10
  290. package/dist/plugins/task-list-store-sql.d.ts +1 -1
  291. package/dist/plugins/text-column-capacity.d.ts +21 -0
  292. package/dist/plugins/text-column-capacity.js +5 -0
  293. package/dist/plugins/tidb-pool.d.ts +3 -2
  294. package/dist/plugins/tidb-pool.js +19 -31
  295. package/dist/plugins/user-input-ledger-sql.d.ts +1 -1
  296. package/dist/read-face-posture.d.ts +6 -6
  297. package/dist/read-face-posture.js +2 -2
  298. package/dist/request-value-closure.d.ts +5 -5
  299. package/dist/request-value-closure.js +1 -1
  300. package/dist/rules-consent.d.ts +41 -13
  301. package/dist/rules-consent.js +101 -53
  302. package/dist/run-local.js +17 -13
  303. package/dist/runs.d.ts +48 -30
  304. package/dist/runs.js +26 -16
  305. package/dist/runtime-caps-resolver.d.ts +15 -8
  306. package/dist/runtime-caps-resolver.js +14 -10
  307. package/dist/sealed-key-layout.d.ts +2 -3
  308. package/dist/sealed-key-layout.js +0 -1
  309. package/dist/sealed-key.js +7 -5
  310. package/dist/security.d.ts +5 -3
  311. package/dist/sema-config-dir.js +2 -2
  312. package/dist/server-secret-env.d.ts +2 -0
  313. package/dist/service-version.d.ts +2 -1
  314. package/dist/service-version.js +2 -2
  315. package/dist/session-error-wire.d.ts +1 -1
  316. package/dist/session-incarnation.d.ts +8 -5
  317. package/dist/session-resident-background.d.ts +85 -32
  318. package/dist/session-resident-background.js +75 -7
  319. package/dist/session-row.d.ts +1 -1
  320. package/dist/session-sync-kernel.d.ts +1 -1
  321. package/dist/session-workspace.d.ts +11 -2
  322. package/dist/session-workspace.js +5 -0
  323. package/dist/sighup-idle.d.ts +1 -1
  324. package/dist/store-posture.d.ts +2 -1
  325. package/dist/stored-request-hooks-m20.d.ts +3 -2
  326. package/dist/stored-request-hooks-m20.js +19 -14
  327. package/dist/stores-sql/blob-index-sql.d.ts +148 -0
  328. package/dist/stores-sql/blob-index-sql.js +154 -0
  329. package/dist/stores-sql/checkpoint-store-sql.d.ts +1 -1
  330. package/dist/stores-sql/checkpoint-store-sql.js +11 -27
  331. package/dist/{plugins → stores-sql}/file-history-store-sql.d.ts +23 -11
  332. package/dist/{plugins → stores-sql}/file-history-store-sql.js +23 -18
  333. package/dist/{plugins → stores-sql}/pg-session-storage.d.ts +23 -76
  334. package/dist/{plugins → stores-sql}/pg-session-storage.js +80 -209
  335. package/dist/{plugins → stores-sql}/retention-store-sql.d.ts +123 -217
  336. package/dist/{plugins → stores-sql}/retention-store-sql.js +66 -190
  337. package/dist/{plugins → stores-sql}/session-event-payload.d.ts +1 -1
  338. package/dist/{plugins → stores-sql}/session-event-payload.js +1 -1
  339. package/dist/stores-sql/session-policy-store-sql.d.ts +1 -1
  340. package/dist/stores-sql/session-write-hooks.d.ts +59 -0
  341. package/dist/stores-sql/session-write-hooks.js +2 -0
  342. package/dist/{plugins → stores-sql}/tidb-session-storage.d.ts +10 -11
  343. package/dist/{plugins → stores-sql}/tidb-session-storage.js +10 -21
  344. package/dist/{plugins → stores-sql}/tidb-session-store.d.ts +32 -122
  345. package/dist/{plugins → stores-sql}/tidb-session-store.js +71 -171
  346. package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
  347. package/dist/stores-sql/tool-result-store-sql.js +1 -1
  348. package/dist/stores-sql/windowed-session-storage.d.ts +56 -0
  349. package/dist/stores-sql/windowed-session-storage.js +61 -0
  350. package/dist/task-a2a.d.ts +7 -1
  351. package/dist/task-a2a.js +15 -14
  352. package/dist/task-cwd.d.ts +11 -3
  353. package/dist/task-cwd.js +17 -1
  354. package/dist/task-mcp.d.ts +10 -2
  355. package/dist/task-mcp.js +13 -16
  356. package/dist/task-settings.d.ts +9 -4
  357. package/dist/task-settings.js +17 -6
  358. package/dist/tool-approval.d.ts +21 -8
  359. package/dist/tool-approval.js +10 -6
  360. package/dist/trace/core-keyset-guard.d.ts +9 -3
  361. package/dist/trace/engine-notice-wire.d.ts +1 -1
  362. package/dist/trace/engine-notice-wire.js +2 -0
  363. package/dist/trace/exit-seat.d.ts +23 -1
  364. package/dist/trace/exit-seat.js +3 -0
  365. package/dist/trace/project.d.ts +33 -16
  366. package/dist/trace/project.js +12 -9
  367. package/dist/trace/redact.d.ts +1 -1
  368. package/dist/trace/redact.js +61 -73
  369. package/dist/trace/self-minted-wire.d.ts +263 -10
  370. package/dist/trace/self-minted-wire.js +90 -2
  371. package/dist/trace/sema-provenance.d.ts +45 -41
  372. package/dist/trace/sema-provenance.js +81 -10
  373. package/dist/trace/task-notification-facets.d.ts +70 -2
  374. package/dist/trace/task-notification-facets.js +71 -1
  375. package/dist/trace/wire-projection-faces.d.ts +38 -2
  376. package/dist/trace/wire-projection-faces.js +26 -1
  377. package/dist/unread-request-members.d.ts +66 -0
  378. package/dist/unread-request-members.js +41 -0
  379. package/dist/user-input-ledger.d.ts +2 -2
  380. package/dist/web-admin-client/apply-effective.js +22 -26
  381. package/dist/web-admin-client/candidate-gate.d.ts +35 -3
  382. package/dist/web-admin-client/candidate-gate.js +53 -5
  383. package/dist/web-admin-client/center-request.d.ts +4 -1
  384. package/dist/web-admin-client/center-request.js +2 -1
  385. package/dist/web-admin-client/effective-keys.js +0 -1
  386. package/dist/web-admin-client/facade.d.ts +1 -1
  387. package/dist/web-admin-client/http-client.d.ts +1 -0
  388. package/dist/web-admin-client/http-client.js +17 -9
  389. package/dist/web-admin-client/restart-signal.js +5 -2
  390. package/dist/web-admin-client/skills-mcp.d.ts +20 -6
  391. package/dist/web-admin-client/skills-mcp.js +26 -21
  392. package/dist/web-admin-client/types.d.ts +34 -49
  393. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +2 -2
  394. package/package.json +13 -12
  395. package/scripts/drain-check-local.mjs +2 -28
  396. package/scripts/drain-check.mysql.sql +2 -18
  397. package/scripts/drain-check.pg.sql +2 -18
  398. package/wire-changes/server@7.147.0.json +813 -0
@@ -49,6 +49,13 @@
49
49
  "isolation": "unsupported",
50
50
  "requiredEnv": ["DEVICE_RELAY_URL"],
51
51
  "requiredSecretEnv": []
52
+ },
53
+ {
54
+ "lane": "none",
55
+ "tenantSeparation": "supported",
56
+ "isolation": "unsupported",
57
+ "requiredEnv": [],
58
+ "requiredSecretEnv": []
52
59
  }
53
60
  ]
54
61
  }
@@ -51,7 +51,7 @@ summary 会打印手动接法。
51
51
  | flag | 默认 | 说明 |
52
52
  |---|---|---|
53
53
  | `--profile=P` | 交互问 | `full-single`/`data-center`/`local-plus`/`full-cluster` |
54
- | `--users=U` | `single` | `single`(超管 turnkey)/`multi`(身份隔离 REQUIRE_PRINCIPAL=true) |
54
+ | `--users=U` | `single` | `single`(超管 turnkey;落 `OPERATOR_SINGLE_USER=true` = 每个调用方都是运维,server 单用户形起服要这一行)/`multi`(身份隔离 REQUIRE_PRINCIPAL=true;`OPERATOR_SINGLE_USER=false`)。两根键由同一个租户词派生,重跑即按租户词重写;具名运维名单(`OPERATOR_PRINCIPALS`)本脚本不渲 |
55
55
  | `--region=R` | `auto` | `cn`/`global`;auto=对 aliyun/npmjs 探测延迟 |
56
56
  | `--project=NAME` | `sema` | compose project 名;并行试验/多套共存用。也是工作目录 `~/.sema-up/<名>` 与自动数据根 `<盘>/sema-data/<名>` 的一段 ⇒ 只收小写字母 / 数字 / `-` / `_`,首字符是字母或数字(别的写法在建任何目录之前拒) |
57
57
  | `--dry-run` | — | 只打印执行计划,不写 .env、不起容器 |
@@ -87,7 +87,7 @@ summary 会打印手动接法。
87
87
 
88
88
  - **`host`**(compose 路径) — 可选 `--users`:`single`;落盘 `REMOTE_EXEC=host`;运维自备的键:无;隔离:`unsupported`。server 容器本身就是沙箱:agent 的手落在这只容器里(worktree 隔离在、OS 级隔离不在)。只给单用户 —— 多租户下一个租户的输入会把手指向另一个租户的文件与进程。
89
89
  - **`e2b-cloud`**(compose 路径) — 可选 `--users`:`single` / `multi`;落盘 `REMOTE_EXEC=e2b`;运维自备的键:`E2B_API_KEY`;隔离:`supported`。E2B 云沙箱:每任务一只 microVM。E2B_API_KEY 由运维自备(sema-up 只登记键名,绝不写值)。
90
- - **kube 路径(不选词)** — 可选 `--users`:`single` / `multi`;落盘 `REMOTE_EXEC=k8s`;运维自备的键:`K8S_SANDBOX_IMAGE`、`K8S_NAMESPACE`;隔离:`supported`。kube 路径**不选词**:runtime 由 kube-up.sh 按 runtimeClass `kata-qemu` 在不在自动定(在 ⇒ kata VM,不在 ⇒ runc 容器),沙箱镜像与沙箱命名空间由 chart/清单给。本行只为对表(能力表 / 必需键 / REQUIRE_EXECUTION_LANE 三面),不进 --sandbox 词表。
90
+ - **kube 路径(不选词)** — 可选 `--users`:`single` / `multi`;落盘 `REMOTE_EXEC=k8s`;运维自备的键:`K8S_SANDBOX_IMAGE`、`K8S_NAMESPACE`;隔离:`supported`。kube 路径**不选词**:runtime 由 kube-up.sh 按 runtimeClass `kata-qemu` 在不在自动定(在 ⇒ kata VM,不在 ⇒ runc 容器),沙箱镜像与沙箱命名空间由 chart/清单给。本行只为对表(能力表 / 必需键两面),不进 --sandbox 词表。
91
91
 
92
92
  已退役的词(收到即非零退出并指路):
93
93
 
@@ -104,6 +104,28 @@ false
104
104
  {{- end -}}
105
105
  {{- end -}}
106
106
 
107
+ {{- /*
108
+ 单用户运维声明(env OPERATOR_SINGLE_USER)渲给 worker 的值 = 租户姿态 `server.requirePrincipal` 的否定(同一个值派生,不另开 values 键):
109
+ 单用户 ⇒ "true"(这台的调用方就是运维;server 装配运维面时要单用户部署说出谁是运维,缺了起服拒);多租 ⇒ "false"(运维由具名名单另给)。
110
+ `server.requirePrincipal` 只认 "true" / "false"(布尔与字符串写法同义,大小写不论;缺省 / null = "false");其它词渲染即拒 —— server 读
111
+ REQUIRE_PRINCIPAL 用的是更宽的布尔词表,图表若按「不是 true 就是单用户」读,"yes" / "1" / "on" 在 server 读成多租、在这里读成单用户 ⇒
112
+ 两根键互斥、起服拒;抄一份那张词表又是第二份真源。两只 worker 都调这一只。
113
+ */ -}}
114
+ {{- define "sema.operatorSingleUser" -}}
115
+ {{- $raw := .Values.server.requirePrincipal -}}
116
+ {{- $rp := "" -}}
117
+ {{- if not (kindIs "invalid" $raw) -}}
118
+ {{- $rp = lower (trim (toString $raw)) -}}
119
+ {{- end -}}
120
+ {{- if eq $rp "" -}}
121
+ {{- $rp = "false" -}}
122
+ {{- end -}}
123
+ {{- if not (has $rp (list "true" "false")) -}}
124
+ {{- 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) -}}
125
+ {{- end -}}
126
+ {{- ternary "false" "true" (eq $rp "true") -}}
127
+ {{- end -}}
128
+
107
129
  {{- /* worker 容器 env 里的耐久审批一条(`nindent 12` 之后接在 env 列表里);值为空 ⇒ 什么都不出。 */ -}}
108
130
  {{- define "sema.sealedKey.env" -}}
109
131
  {{- with (include "sema.durableApproval" .) -}}
@@ -61,13 +61,14 @@ 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
67
  - { name: SANDBOX_PKG_SOURCE, value: {{ .Values.server.sandboxPkgSource | quote }} }
65
- {{/* 车道点名了就显式表态「这台有手」——REQUIRE_EXECUTION_LANE 让「车道被谁改没了」
66
- 变成拒启而不是安静的无手 worker。server 侧默认仍 off,sema-up 产物一律写 true。
67
- 下面圈起来的两行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
68
+ {{/* 车道显式点名(REMOTE_EXEC)。REQUIRE_EXECUTION_LANE 是退役 env(设了即起服拒,拒句指向 REMOTE_EXEC),不再渲。
69
+ 下面圈起来的一行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
68
70
  {{/* @generated-begin kube-lane-env */}}
69
71
  - { name: REMOTE_EXEC, value: "k8s" }
70
- - { name: REQUIRE_EXECUTION_LANE, value: "true" }
71
72
  {{/* @generated-end kube-lane-env */}}
72
73
  - { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
73
74
  {{- if .Values.server.k8sInsecureTls }}
@@ -72,13 +72,14 @@ 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
78
  - { name: SANDBOX_PKG_SOURCE, value: {{ .Values.server.sandboxPkgSource | quote }} }
76
- {{/* 车道点名了就显式表态「这台有手」——REQUIRE_EXECUTION_LANE 让「车道被谁改没了」
77
- 变成拒启而不是安静的无手 worker。server 侧默认仍 off,sema-up 产物一律写 true。
78
- 下面圈起来的两行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
79
+ {{/* 车道显式点名(REMOTE_EXEC)。REQUIRE_EXECUTION_LANE 是退役 env(设了即起服拒,拒句指向 REMOTE_EXEC),不再渲。
80
+ 下面圈起来的一行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
79
81
  {{/* @generated-begin kube-lane-env */}}
80
82
  - { name: REMOTE_EXEC, value: "k8s" }
81
- - { name: REQUIRE_EXECUTION_LANE, value: "true" }
82
83
  {{/* @generated-end kube-lane-env */}}
83
84
  - { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
84
85
  {{- if .Values.server.k8sInsecureTls }}
@@ -48,7 +48,7 @@ server:
48
48
  modelId: "" # REQUIRED
49
49
  modelApiKey: "" # REQUIRED
50
50
  modelVision: "false"
51
- requirePrincipal: "false" # users=multi 时 true(身份隔离;compose 路径同名 env)
51
+ requirePrincipal: "false" # users=multi 时 true(身份隔离;compose 路径同名 env)。只认 "true" / "false";单用户运维声明 OPERATOR_SINGLE_USER 由它派生(false ⇒ "true")
52
52
  # 耐久审批(env DURABLE_APPROVAL;停驻 / 续跑 / /v1/approvals 整条路由)。留空 = 图表不渲这个 env,开关归引擎按姿态定
53
53
  # (单用户 + 有耐久店 ⇒ 开;requirePrincipal=true 的多用户形 ⇒ 关);"true" / "false" = 显式表态,原样渲给每只 worker。
54
54
  # sealedKey.persistence.enabled=false 时图表固定渲 "false"(钥匙跨不过重启,停驻行就续不了);此处再写 "true" ⇒ 渲染即拒。
@@ -399,6 +399,7 @@ RENDERED="$WORK/sema-stack-cluster.rendered.yaml"
399
399
  R_PKG_SOURCE="$([ "$REGION" = "global" ] && echo global || echo '')" \
400
400
  R_PG_INSTANCES="$PG_INSTANCES" R_PG_AA="$PG_AA" R_REPLICAS="$SERVER_REPLICAS" \
401
401
  R_REQ_PRINCIPAL="$(principal_of_users "$USERS")" \
402
+ R_OPERATOR_SINGLE_USER="$(operator_single_user_of_users "$USERS")" \
402
403
  python3 - "$HERE/stack/sema-stack-cluster.yaml" > "$RENDERED" <<'PY'
403
404
  import os, sys
404
405
  MAP = {"__MINIO_PW__":"R_MINIO_PW", "__SVC_TOKEN__":"R_SVC_TOKEN", "__MODEL_KEY__":"R_MODEL_KEY",
@@ -406,7 +407,7 @@ MAP = {"__MINIO_PW__":"R_MINIO_PW", "__SVC_TOKEN__":"R_SVC_TOKEN", "__MODEL_KEY_
406
407
  "__SERVER_IMAGE__":"R_SERVER_IMAGE", "__SERVER_PULL_POLICY__":"R_PULL_POLICY",
407
408
  "__PKG_SOURCE__":"R_PKG_SOURCE", "__PG_INSTANCES__":"R_PG_INSTANCES",
408
409
  "__PG_ANTI_AFFINITY__":"R_PG_AA", "__SERVER_REPLICAS__":"R_REPLICAS",
409
- "__REQUIRE_PRINCIPAL__":"R_REQ_PRINCIPAL"}
410
+ "__REQUIRE_PRINCIPAL__":"R_REQ_PRINCIPAL", "__OPERATOR_SINGLE_USER__":"R_OPERATOR_SINGLE_USER"}
410
411
  t = open(sys.argv[1], encoding="utf-8").read()
411
412
  for ph, env in MAP.items():
412
413
  v = os.environ.get(env)
@@ -22,6 +22,10 @@ FLAG_WORDS_USERS="single multi"
22
22
  # 事实核对,kube-up 的 helm values,cluster-up 的渲染清单与 helm values 同调这一只(修前 kube-up 另写一份同义翻译;
23
23
  # cluster-up 一份都没有 ⇒ --users=multi 在 --kube=machines 路径上被静默丢成单用户)。只认两词,别的词先过 flag_enum。
24
24
  principal_of_users() { [ "$1" = "multi" ] && echo true || echo false; }
25
+ # 租户形 ⇒ 单用户运维声明 OPERATOR_SINGLE_USER 的值(唯一定义;三只脚本 / 渲染段同调):server 装配运维面时要单用户部署说出谁是运维,
26
+ # 不声明不起服(声明与具名名单 OPERATOR_PRINCIPALS 二选一;本工具渲前者)。single = 这台只有一个人 ⇒ 他就是运维(true);
27
+ # multi = 多租,运维由具名名单另给 ⇒ 不声明(false;多租形上声明本身会被 server 拒)。chart 从 server.requirePrincipal 同一句派生。
28
+ operator_single_user_of_users() { [ "$1" = "multi" ] && echo false || echo true; }
25
29
 
26
30
  # users_decide <显式给了 USERS 吗(1 / 空)> —— kube 两条装配路径(kube-up / cluster-up)的租户形决策,与 sema-up 的
27
31
  # compose 档同一条规则:**决策 = 显式 USERS ∨ 上一次落在 $ENVF 的部署事实 REQUIRE_PRINCIPAL ∨ single**;显式值与事实
@@ -5,8 +5,7 @@
5
5
  "choice": "host",
6
6
  "users": ["single"],
7
7
  "env": {
8
- "REMOTE_EXEC": "host",
9
- "REQUIRE_EXECUTION_LANE": "true"
8
+ "REMOTE_EXEC": "host"
10
9
  },
11
10
  "isolation": "unsupported",
12
11
  "note": "server 容器本身就是沙箱:agent 的手落在这只容器里(worktree 隔离在、OS 级隔离不在)。只给单用户 —— 多租户下一个租户的输入会把手指向另一个租户的文件与进程。"
@@ -17,7 +16,6 @@
17
16
  "users": ["single", "multi"],
18
17
  "env": {
19
18
  "REMOTE_EXEC": "e2b",
20
- "REQUIRE_EXECUTION_LANE": "true",
21
19
  "E2B_API_KEY": null
22
20
  },
23
21
  "isolation": "supported",
@@ -29,12 +27,11 @@
29
27
  "users": ["single", "multi"],
30
28
  "env": {
31
29
  "REMOTE_EXEC": "k8s",
32
- "REQUIRE_EXECUTION_LANE": "true",
33
30
  "K8S_SANDBOX_IMAGE": null,
34
31
  "K8S_NAMESPACE": null
35
32
  },
36
33
  "isolation": "supported",
37
- "note": "kube 路径**不选词**:runtime 由 kube-up.sh 按 runtimeClass `kata-qemu` 在不在自动定(在 ⇒ kata VM,不在 ⇒ runc 容器),沙箱镜像与沙箱命名空间由 chart/清单给。本行只为对表(能力表 / 必需键 / REQUIRE_EXECUTION_LANE 三面),不进 --sandbox 词表。"
34
+ "note": "kube 路径**不选词**:runtime 由 kube-up.sh 按 runtimeClass `kata-qemu` 在不在自动定(在 ⇒ kata VM,不在 ⇒ runc 容器),沙箱镜像与沙箱命名空间由 chart/清单给。本行只为对表(能力表 / 必需键两面),不进 --sandbox 词表。"
38
35
  }
39
36
  ],
40
37
  "retired": [
@@ -705,6 +705,9 @@ if [ "$PROFILE" = "full-single" ] || [ "$PROFILE" = "local-plus" ]; then
705
705
  setk MODEL_ID "$MODEL"
706
706
  [ -n "$MODEL_KEY" ] && setk MODEL_API_KEY "$MODEL_KEY"
707
707
  setk REQUIRE_PRINCIPAL "$REQUIRE_PRINCIPAL_WANT"
708
+ # 单用户运维声明:由租户词派生(lib/flagshape.sh 唯一定义),每次重写 —— 它不是第二个部署事实,是 REQUIRE_PRINCIPAL 那一个事实的另一根键。
709
+ # 不写 ⇒ 单用户 server 起服拒(没人能当运维);升级路径上旧 .env 没有这一行,resetk 补上。
710
+ resetk OPERATOR_SINGLE_USER "$(operator_single_user_of_users "$USERS")"
708
711
  setk SANDBOX_PKG_SOURCE "$([ "$REGION" = "global" ] && echo global || echo '')"
709
712
  [ -n "${SEMA_SERVER_IMAGE:-}" ] && setk SEMA_SERVER_IMAGE "$SEMA_SERVER_IMAGE"
710
713
  # 执行车道落 .env(从上面 `lanes resolve` 的结果渲,脚本里零车道词)。
@@ -800,10 +803,11 @@ shq() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")"; }
800
803
  # ── 渲染对账(生成 .env 之后、compose up 之前)──────────────────────────────────
801
804
  # .env 的写口 / 读口都按物理行判,认不出 compose dotenv 的跨行引号值等边角;唯一能确知「容器真正拿到
802
805
  # 什么」的是 compose 自己。所以在 up 之前跑一次 `compose config`——与 up **同一组 -f / profile / 同一 shell
803
- # 环境**(于是运维导出的空串等也算进来)——从渲染结果取 agent 服务的 REQUIRE_PRINCIPAL / REMOTE_EXEC /
804
- # REQUIRE_EXECUTION_LANE,与本次决策逐值对比,不一致 ⇒ 拒并点名渲染值与决策值。**以 compose 为唯一属主**。
806
+ # 环境**(于是运维导出的空串等也算进来)——从渲染结果取 agent 服务的 REQUIRE_PRINCIPAL / REMOTE_EXEC,
807
+ # 与本次决策逐值对比,不一致 ⇒ 拒并点名渲染值与决策值。**以 compose 为唯一属主**。
805
808
  # docker 不可达在上面 `command -v docker` 那道已 fail-loud 拦下;config 本身失败(YAML/插值坏)也拒,
806
- # 不新铸降级臂:未经对账就不 up。只有 agent 面有这三个决策键,别的档跳过。
809
+ # 不新铸降级臂:未经对账就不 up。只有 agent 面有这两个决策键,别的档跳过。
810
+ # (REQUIRE_EXECUTION_LANE 是退役 env —— 设了即起服拒 —— 产物不再渲它,也不再对账它。)
807
811
  #
808
812
  # 拒因分两种、各给各的出路(7.98.0 曾把 stderr 并进 stdout 当 JSON 解析 ⇒ compose 的任何警告都让它 traceback,
809
813
  # 拒因还冒充「不一致」):
@@ -813,7 +817,7 @@ shq() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")"; }
813
817
  # 插值警告里的变量名也可能是凭据的一段)。
814
818
  RECON_PY='
815
819
  import json, sys
816
- want = {"REQUIRE_PRINCIPAL": sys.argv[1], "REMOTE_EXEC": sys.argv[2], "REQUIRE_EXECUTION_LANE": sys.argv[3]}
820
+ want = {"REQUIRE_PRINCIPAL": sys.argv[1], "REMOTE_EXEC": sys.argv[2]}
817
821
  try:
818
822
  d = json.loads(sys.stdin.read())
819
823
  env = d["services"]["server"].get("environment") or {}
@@ -833,8 +837,7 @@ if bad:
833
837
  '
834
838
  reconcile_render() {
835
839
  case ",$COMPOSE_PROFILES," in *,agent,*) : ;; *) return 0 ;; esac
836
- local exp_rp="$REQUIRE_PRINCIPAL_WANT" exp_re="$LANE_REMOTE_EXEC" exp_rl rendered errf nerr rc=0 prc=0 repro a
837
- exp_rl="$(printf '%s\n' "$LANE_ENV" | sed -n 's/^REQUIRE_EXECUTION_LANE=//p')"
840
+ local exp_rp="$REQUIRE_PRINCIPAL_WANT" exp_re="$LANE_REMOTE_EXEC" rendered errf nerr rc=0 prc=0 repro a
838
841
  # 复现命令:与这次 config 同一个 compose 入口、同一张全局参数表、同一组 profile(从源渲,不手抄)。
839
842
  dc_argv; compose_globals
840
843
  repro="(cd $(shq "$HERE/stack") && COMPOSE_PROFILES=$(shq "$COMPOSE_PROFILES") ${DC_ARGV[*]}"
@@ -848,12 +851,12 @@ reconcile_render() {
848
851
  log " ↳ 下一步:在本机亲跑 $repro 看 compose 的报文(本脚本不转印它:.env 解析失败的报文会原样引用那一行,可能带凭据);常见成因是手改过的 .env 行"
849
852
  exit 1
850
853
  fi
851
- printf '%s' "$rendered" | python3 -c "$RECON_PY" "$exp_rp" "$exp_re" "$exp_rl" || prc=$?
854
+ printf '%s' "$rendered" | python3 -c "$RECON_PY" "$exp_rp" "$exp_re" || prc=$?
852
855
  case "$prc" in
853
856
  0) : ;;
854
857
  3)
855
858
  log "⛔ 渲染对账:渲染值与决策值不一致 —— compose 渲染出的容器决策值与本次决策对不上;以 compose 为唯一属主,拒绝 up"
856
- log " ↳ 下一步:检查 $ENVF 里 REQUIRE_PRINCIPAL / REMOTE_EXEC / REQUIRE_EXECUTION_LANE,以及 shell / -f 里是否**导出**了同名变量(compose 插值 shell 优先于 --env-file,导出为空会盖掉 .env);亲跑 $repro 可看容器 environment"
859
+ log " ↳ 下一步:检查 $ENVF 里 REQUIRE_PRINCIPAL / REMOTE_EXEC,以及 shell / -f 里是否**导出**了同名变量(compose 插值 shell 优先于 --env-file,导出为空会盖掉 .env);亲跑 $repro 可看容器 environment"
857
860
  exit 1 ;;
858
861
  4)
859
862
  log "⛔ 渲染对账:渲染结果解析失败 —— docker compose config 退出 0,但 stdout 不是可解析的 compose JSON(或其中没有 server 服务;compose 另在 stderr 输出了 $nerr 行,本脚本不转印),无法确认容器会拿到什么 —— 拒绝在未对账的情况下 up"
@@ -864,7 +867,7 @@ reconcile_render() {
864
867
  log " ↳ 下一步:确认本机 python3 可用(python3 -c 'import json'),然后重跑"
865
868
  exit 1 ;;
866
869
  esac
867
- log "渲染对账通过:REQUIRE_PRINCIPAL=$exp_rp REMOTE_EXEC=$exp_re REQUIRE_EXECUTION_LANE=$exp_rl(compose 渲染逐值一致)$([ "$nerr" -gt 0 ] && printf ';compose 另在 stderr 输出了 %s 行(多为插值警告;本脚本不转印,up 时 compose 会自己打出来)' "$nerr")"
870
+ log "渲染对账通过:REQUIRE_PRINCIPAL=$exp_rp REMOTE_EXEC=$exp_re(compose 渲染逐值一致)$([ "$nerr" -gt 0 ] && printf ';compose 另在 stderr 输出了 %s 行(多为插值警告;本脚本不转印,up 时 compose 会自己打出来)' "$nerr")"
868
871
  }
869
872
 
870
873
  # ── 外接端点连接检测(装配前 fail-loud;只验兼容可用,不校验证书——内网自签是常态)────────────
@@ -93,14 +93,15 @@ services:
93
93
  MODEL_ID: ${MODEL_ID:-}
94
94
  MODEL_API_KEY: ${MODEL_API_KEY:-}
95
95
  REQUIRE_PRINCIPAL: ${REQUIRE_PRINCIPAL:-false}
96
+ # 单用户运维声明(sema-up 由 --users 渲进 .env:single ⇒ true,multi ⇒ false)。刻意不给缺省:手工起这份 compose 而 .env 里没有它的
97
+ # 单用户部署,server 起服拒并给出那一行(不在模板里替运维表态「人人是运维」)。
98
+ OPERATOR_SINGLE_USER: ${OPERATOR_SINGLE_USER:-}
96
99
  SANDBOX_PKG_SOURCE: ${SANDBOX_PKG_SOURCE:-}
97
100
  # 执行车道:值由 sema-up.sh 从 lib/lanes.json 渲进 .env(resetk,每次重写)。
98
- # `REQUIRE_EXECUTION_LANE` 缺省 true —— 手工起这份 compose 而没点名车道时,server 拒启
99
- # 并说「没有手」,而不是安静地起成一个什么都干不了的 worker。
100
- # 下面圈起来的几行(车道键、缺省、compose 路径上各车道运维自备的键)由车道表生成,不要手改。
101
+ # 不再渲 `REQUIRE_EXECUTION_LANE`:它是退役 env(设了即起服拒,拒句指向 REMOTE_EXEC);车道只由 REMOTE_EXEC 点名。
102
+ # 下面圈起来的几行(车道键、compose 路径上各车道运维自备的键)由车道表生成,不要手改。
101
103
  # @generated-begin lane-env
102
104
  REMOTE_EXEC: ${REMOTE_EXEC:-}
103
- REQUIRE_EXECUTION_LANE: ${REQUIRE_EXECUTION_LANE:-true}
104
105
  E2B_API_KEY: ${E2B_API_KEY:-}
105
106
  # @generated-end lane-env
106
107
  ports:
@@ -1,5 +1,5 @@
1
1
  # sema-stack(full-cluster 形态,Phase 1b as-built;cluster-up.sh 渲染 __占位符__ 后 apply)
2
- # 占位符:__MINIO_PW__ __SVC_TOKEN__ __MODEL_KEY__ __MODEL_GATEWAY__ __MODEL_ID__ __REQUIRE_PRINCIPAL__
2
+ # 占位符:__MINIO_PW__ __SVC_TOKEN__ __MODEL_KEY__ __MODEL_GATEWAY__ __MODEL_ID__ __REQUIRE_PRINCIPAL__ __OPERATOR_SINGLE_USER__
3
3
  # __SERVER_IMAGE__ __SERVER_PULL_POLICY__(tar 预灌=Never / registry 拉取=IfNotPresent)
4
4
  # 前置(cluster-up.sh 负责):Longhorn 默认 SC、kata-deploy(runtimeclass kata-qemu)、CNPG operator 1.30、
5
5
  # runner token 跨 ns 复制成 sema/sema-runner-token-copy、MinIO 建桶 sema-pg-backup
@@ -219,11 +219,12 @@ spec:
219
219
  - { name: MODEL_VISION, value: "false" }
220
220
  # 租户姿态与 chart 主 worker 同值(cluster-up 由 --users 渲:multi ⇒ true,否则 false);修前整块缺席 ⇒ 恒单用户
221
221
  - { name: REQUIRE_PRINCIPAL, value: "__REQUIRE_PRINCIPAL__" }
222
+ # 单用户运维声明与租户姿态同一次翻译(cluster-up 由 --users 渲:single ⇒ true,multi ⇒ false);缺了它单用户 server 起服拒
223
+ - { name: OPERATOR_SINGLE_USER, value: "__OPERATOR_SINGLE_USER__" }
222
224
  - { name: SANDBOX_PKG_SOURCE, value: "__PKG_SOURCE__" }
223
- # 显式表态「这台有手」(车道被改没了 ⇒ 拒启,不是安静的无手 worker);下面圈起来的两行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改
225
+ # 车道显式点名(REMOTE_EXEC;REQUIRE_EXECUTION_LANE 是退役 env,设了即起服拒,不再渲);下面圈起来的一行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改
224
226
  # @generated-begin kube-lane-env
225
227
  - { name: REMOTE_EXEC, value: "k8s" }
226
- - { name: REQUIRE_EXECUTION_LANE, value: "true" }
227
228
  # @generated-end kube-lane-env
228
229
  - { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
229
230
  - { name: K8S_INSECURE_TLS, value: "true" }
@@ -574,13 +574,13 @@ export declare const ApprovalCardSchema: z.ZodObject<{
574
574
  governanceForced: z.ZodOptional<z.ZodLiteral<true>>;
575
575
  rememberRefused: z.ZodOptional<z.ZodLiteral<true>>;
576
576
  approvalCard: z.ZodOptional<z.ZodEnum<{
577
- question: "question";
577
+ shell: "shell";
578
578
  plan: "plan";
579
579
  skill: "skill";
580
+ question: "question";
580
581
  "file-edit": "file-edit";
581
582
  "file-write": "file-write";
582
583
  "notebook-edit": "notebook-edit";
583
- shell: "shell";
584
584
  fetch: "fetch";
585
585
  workflow: "workflow";
586
586
  generic: "generic";
@@ -752,13 +752,13 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
752
752
  governanceForced: z.ZodOptional<z.ZodLiteral<true>>;
753
753
  rememberRefused: z.ZodOptional<z.ZodLiteral<true>>;
754
754
  approvalCard: z.ZodOptional<z.ZodEnum<{
755
- question: "question";
755
+ shell: "shell";
756
756
  plan: "plan";
757
757
  skill: "skill";
758
+ question: "question";
758
759
  "file-edit": "file-edit";
759
760
  "file-write": "file-write";
760
761
  "notebook-edit": "notebook-edit";
761
- shell: "shell";
762
762
  fetch: "fetch";
763
763
  workflow: "workflow";
764
764
  generic: "generic";
@@ -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
  }
@@ -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,
@@ -48,14 +48,14 @@ export function assertDeviceLaneWired(isDeviceLane, lane, hasFactory) {
48
48
  if (!lane) {
49
49
  throw new Error("REMOTE_EXEC=device but the device lane could not be wired at boot [device-lane-unwired]: the SQL backend is " +
50
50
  "configured yet this replica did not get one, so the device registry / session↔device binding / audit tables are absent. " +
51
- "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 " +
52
52
  "execute on the employee's device while actually running inside its own process (#157). Fix the database " +
53
- "(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)");
54
54
  }
55
55
  if (!hasFactory) {
56
56
  throw new Error("REMOTE_EXEC=device but no DeviceExecutionEnv factory was built [device-lane-unwired]: the lane's stores are up " +
57
- "yet `boot/execution-env.ts` produced no factory, so core would fall back to the in-process stub env. This is " +
58
- "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)");
59
59
  }
60
60
  }
61
61
  export async function noteDeviceRelayBindings(relay, store, logger) {
@@ -28,8 +28,8 @@
28
28
  * `ENGINE_AUTO_EXIT` / `SEMA_PARENT_PID` 的表态上。
29
29
  * 2. **自退判据 = 三合取,且必须持续满 `linger`**(`linger` = 孤儿态 `orphan.lingerMs`,否则 `lingerMs`):
30
30
  * · 附着租约集空(`attachedStreams() === 0`);
31
- * · 无必须等完的活(`inflight() === 0` —— 读 `drainState.blockingInflight` = **阻断集** `http + leader`,与排空等的、SIGHUP 空闲窗**同一只**,不另立第二判据;
32
- * `/health.inflight` 是它再加会话驻留的后台 shell / monitor 的**总数**:同一份分项 `/health.inflightBreakdown` 派生的两个事实,不是两套计数,见下「已知收窄」);
31
+ * · 无必须等完的活(`inflight() === 0` —— 读 `drainState.blockingInflight` = **阻断集** `http + leader + backgroundAgents`,与排空等的、SIGHUP 空闲窗**同一只**,不另立第二判据;
32
+ * `/health.inflight` 是它再加会话驻留的后台 shell / monitor 的**总数**:同一只分项函数 `/health.inflightBreakdown` 派生的两个事实,不是两套计数,见下「已知收窄」);
33
33
  * · HTTP 触点静默(`now() - lastActivityAt() >= lingerMs`),**且**最后一条附着流的**离场**
34
34
  * 也已满窗(`now() - lastAttachEndedAt() >= lingerMs` —— codex R1-F1,见该 dep 的注)。
35
35
  * 任何一条不满足即把计时清零(连续性判据,不是累计)。
@@ -67,17 +67,18 @@
67
67
  * 每 15s 无限期跑下去的定时器 —— 为它引入周期性 SQL 轮询,代价压过收益。**bg run 在跑不退**那一臂
68
68
  * 已由 `inflight()` 结构性守住;parked 行是 durable 的,引擎退掉不丢:下次起来仍可赎回(spawn 形里
69
69
  * 「下次」就是壳的下一次 spawn)。伤害面 = 一条 parked run 的赎回被推迟到下次启动,不是丢失。
70
- * 这是**允许的收窄,不是静默**:有了廉价 parked 计数口(或本腿改成事件驱动)之后应当补上。
71
- * · **会话驻留的后台 shell / monitor 与活过父 run 的后台子代理都不入判据**(两件事实不同,同一条判据)。
72
- * 阻断集 `http + leader` 是「还有没有**必须等完**的活」:HTTP 腿(在飞 run 集 · 同步计费腿 · admission 期请求)与 leader 腿。
70
+ * 这是**允许的收窄,不是静默**:有了廉价 parked 计数口(或本腿改成事件驱动)之后应当补上。停驻的后台子代理(任务表 `parked`)同一条律、同样不计。
71
+ * · **会话驻留的后台 shell / monitor 不入判据**。阻断集 `http + leader + backgroundAgents` 是「还有没有**必须等完**的活」:HTTP 腿(在飞 run 集 · 同步计费腿 ·
72
+ * admission 期请求)、leader 腿,以及活过起它的那条 HTTP 腿、仍在跑的后台子代理(core `backgroundScope:"session"`;它是一条在干活的模型腿,干完自己收尾,不等它 = 受控退把它中断)。
73
73
  * 会话驻留的后台 shell / monitor(`session-resident-background.ts` 读;running ∧ 会话驻留 ∧ 非 retain)**报**在 `/health.inflight`(总数)与
74
74
  * `inflightBreakdown.sessionResident` 里 —— 外部判官据此判「这台引擎此刻托管着多少活」—— 但**不阻断**自退:它不是一条腿,等它没有意义,而一只不退出的 shell
75
75
  * (`while true`)若阻断,崩溃孤儿引擎就永生(孤儿窗 / SIGHUP 空闲窗同读阻断集,排空也每次等满窗)。窗到 / 排空完成,退出边界的后台收割
76
76
  * (`reapAllSessionBackground` + 硬面,`boot/exit-boundary.ts`)收掉它们;retain 行按 retain 既有语义活过受控退。伤害面 = 壳没了且没人附着时,引擎照退、
77
- * 驻留的进程随受控退被收掉(与 7.145.x 逐字同,**本件不改这一行为**,只把它报出来)。
78
- * 后台**子代理**(agent 行)同样不入(codex R1 [high] 验真后如实登记,不是本件引入:[ref] 之前父死走的是**当场** drain,而 `drainThenShutdown` 读的是同一只 `inflight()` ⇒ 同一个缺口):
79
- * core 侧 `backgroundScope:"session"` 的子代理可以**活过**生它的那条 HTTP 腿,那之后它在本腿眼里是 0;伤害面 = 一条还在跑的后台子代理会随引擎的受控退被中断(它的账本行照常落终态,不是静默丢)。
80
- * 这条收窄**成文在此**,不许再被读成「bg 全被守住」。
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 起收进阻断集,这条收窄只剩上面两类。)
81
82
  * · **`/health` 探针不算触点**:`lastActivityAt` 的属主(`http/server.ts` 的 `noteActivity`)按既有契约
82
83
  * 把 `/health` 与 `/metrics*` 排除在活性时钟之外(常态采样噪音不得把空闲窗永远撑开)。⇒ 一只**只**
83
84
  * 轮询 `/health` 的壳不构成租约。这与 SIGHUP 空闲窗的判据同源,刻意保持一致而非在本腿另开一份。
@@ -278,7 +279,7 @@ export interface EngineLeaseFirstAttachFacts {
278
279
  * [ref] —— 交接格(`GET /health` 的 `engineLease.handover`;交接口 200 体 = 其中 `since` / `lingerMs` / `backgroundShells` 三键加 `lane`)。
279
280
  * · `since` = 进入交接车道的时刻(epoch ms,与首窗格同一只单调钟投影);幂等的再次交接回同一个值。
280
281
  * · `lingerMs` = 交接窗;`backgroundShells` = 退出边界此刻会硬收的后台 shell 行数(现读)。窗只在它为 0、阻断集在飞为 0、且无附着与触点时起算。
281
- * · 不带在飞数:阻断集在同一份 `/health` 里已由 `inflightBreakdown.http + leader` 读出(一个事实一处读);交接口 200 体若带它,读到的恒含这次请求自己。
282
+ * · 不带在飞数:阻断集在同一份 `/health` 里已由 `inflightBreakdown.http + leader + backgroundAgents` 读出(一个事实一处读);交接口 200 体若带它,读到的恒含这次请求自己。
282
283
  */
283
284
  export interface EngineHandoverFacts {
284
285
  readonly since: number;
@@ -321,7 +322,7 @@ export interface EngineLeaseHandle {
321
322
  export interface EngineLeaseDeps {
322
323
  /** 活附着数 = 本副本当前**打开着的 SSE 流**条数(`drainState.attachedStreams`,由 `createHttpServer` 自赋)。 */
323
324
  attachedStreams: () => number;
324
- /** 必须等完的活的数 —— **阻断集** `drainState.blockingInflight`(`http + leader`;与排空等的、SIGHUP 空闲窗同一只 getter。会话驻留的后台 shell / monitor 在
325
+ /** 必须等完的活的数 —— **阻断集** `drainState.blockingInflight`(`http + leader + backgroundAgents`;与排空等的、SIGHUP 空闲窗同一只 getter。会话驻留的后台 shell / monitor 在
325
326
  * `/health.inflight` 的总数里、不在这里,见顶注「已知收窄」)。不自建第二套计数:两套计数迟早分叉,而分叉的那一侧恰好是「以为没 run 了」就把引擎关掉。 */
326
327
  inflight: () => number;
327
328
  /** 最后一次**非探针** HTTP 触点的单调时刻(`drainState.lastActivityAt`)。
@@ -20,6 +20,7 @@ import { type TaskAttachmentStore } from "../plugins/task-attachment-store.js";
20
20
  import type { TaskInheritEnv } from "../request-value-closure.js";
21
21
  import { type HeadRead } from "../session-incarnation.js";
22
22
  import type { SpaceReclaimer } from "../workspace-space.js";
23
+ import { type SessionResidentCounts } from "../session-resident-background.js";
23
24
  /**
24
25
  * per-session 的 **cwd / shellEnv 登记簿**(TOC cwd seam + R-survey shellEnv seam)+ 它们的**租户围栏**。
25
26
  *
@@ -174,7 +175,7 @@ export declare function createExecutionEnv(ctx: ExecutionEnvCtx): {
174
175
  setSessionInheritEnv: (sid: string, policy: TaskInheritEnv | undefined) => void;
175
176
  fenceSessionOwner: (sid: string, owner: string | null) => void;
176
177
  dropSessionScoped: (sid: string) => void;
177
- sessionResidentBackground: () => number;
178
+ sessionResidentBackground: () => SessionResidentCounts;
178
179
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
179
180
  worktreeReap: (() => Promise<void>) | undefined;
180
181
  sendUserFileTaskEnvs: TaskEnvRegistry | undefined;