@sema-agent/server 7.142.0 → 7.144.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 (301) hide show
  1. package/MIGRATION.md +608 -0
  2. package/USAGE.md +63 -36
  3. package/dist/adoption/plan.js +22 -0
  4. package/dist/approval-ask-audit-store.d.ts +7 -5
  5. package/dist/approval-ask-audit-store.js +12 -6
  6. package/dist/approval-ask-machine.d.ts +15 -7
  7. package/dist/approval-ask-machine.js +10 -4
  8. package/dist/approval-card.d.ts +155 -39
  9. package/dist/approval-card.js +111 -31
  10. package/dist/approval-queue-kind.d.ts +27 -0
  11. package/dist/approval-queue-kind.js +6 -0
  12. package/dist/approval-reconciler.d.ts +8 -8
  13. package/dist/approval-reconciler.js +3 -3
  14. package/dist/audit.js +4 -2
  15. package/dist/boot/budget-tracing.d.ts +1 -1
  16. package/dist/boot/execution-env.js +1 -1
  17. package/dist/boot/governance-seams.d.ts +26 -41
  18. package/dist/boot/governance-seams.js +61 -28
  19. package/dist/boot/late-binds.d.ts +7 -4
  20. package/dist/boot/late-binds.js +3 -1
  21. package/dist/boot/leader.js +2 -4
  22. package/dist/boot/memory-consolidation.d.ts +0 -8
  23. package/dist/boot/memory-consolidation.js +3 -3
  24. package/dist/boot/reapers.js +5 -4
  25. package/dist/boot/resolve-spec.d.ts +1 -1
  26. package/dist/boot/resolve-spec.js +8 -8
  27. package/dist/boot/runner-deps.d.ts +14 -6
  28. package/dist/boot/runner-deps.js +6 -17
  29. package/dist/boot/shutdown.d.ts +9 -0
  30. package/dist/boot/shutdown.js +18 -2
  31. package/dist/boot/stage-01-config.js +2 -0
  32. package/dist/boot/stage-02-web-admin-pull.js +3 -0
  33. package/dist/boot/stage-03-store-backend.d.ts +4 -1
  34. package/dist/boot/stage-03-store-backend.js +1 -2
  35. package/dist/boot/stage-04-stores.d.ts +5 -2
  36. package/dist/boot/stage-04-stores.js +3 -5
  37. package/dist/boot/stage-05-execution-env.d.ts +5 -2
  38. package/dist/boot/stage-06-runners.d.ts +5 -2
  39. package/dist/boot/stage-06-runners.js +1 -3
  40. package/dist/boot/stage-07-capability-layer.d.ts +5 -2
  41. package/dist/boot/stage-07-capability-layer.js +6 -2
  42. package/dist/boot/stage-08-reapers.d.ts +5 -2
  43. package/dist/boot/stage-09-leader.d.ts +5 -2
  44. package/dist/boot/stage-10-http-server.d.ts +5 -2
  45. package/dist/boot/stage-10-http-server.js +4 -1
  46. package/dist/boot/stores.d.ts +5 -2
  47. package/dist/boot/stores.js +7 -7
  48. package/dist/boot/web-admin.d.ts +5 -1
  49. package/dist/boot/web-admin.js +31 -19
  50. package/dist/capabilities/hands-lane.d.ts +9 -39
  51. package/dist/capabilities/hands-lane.js +8 -13
  52. package/dist/capabilities/mcp-probe.d.ts +3 -2
  53. package/dist/capabilities/scenarios.d.ts +23 -17
  54. package/dist/capabilities/scenarios.js +2 -2
  55. package/dist/capabilities/skills.d.ts +1 -17
  56. package/dist/capabilities/skills.js +0 -8
  57. package/dist/capability-facts.d.ts +8 -8
  58. package/dist/capability-facts.js +4 -4
  59. package/dist/card-void.d.ts +6 -9
  60. package/dist/config-catalog.js +1 -1
  61. package/dist/config-d-migration.d.ts +2 -0
  62. package/dist/config-dir-trust.js +58 -29
  63. package/dist/config-invariants.d.ts +7 -1
  64. package/dist/config-invariants.js +7 -0
  65. package/dist/config-provider.d.ts +10 -0
  66. package/dist/config-provider.js +15 -4
  67. package/dist/config-root-migration.d.ts +13 -0
  68. package/dist/config-root-migration.js +99 -0
  69. package/dist/config-types.d.ts +5 -5
  70. package/dist/config.d.ts +4 -3
  71. package/dist/config.js +1 -1
  72. package/dist/delegated-session-owner.d.ts +35 -151
  73. package/dist/delegated-session-owner.js +1 -83
  74. package/dist/device-ws-protocol.d.ts +1 -0
  75. package/dist/device-ws-protocol.js +2 -1
  76. package/dist/entry-mode-clamp-notice.d.ts +1 -1
  77. package/dist/env-model-table-gate.d.ts +53 -0
  78. package/dist/env-model-table-gate.js +53 -0
  79. package/dist/execution-placement.d.ts +7 -4
  80. package/dist/fleet/fleet-bus.d.ts +28 -52
  81. package/dist/fleet/fleet-bus.js +35 -100
  82. package/dist/fleet/fleet-reconciler.d.ts +4 -4
  83. package/dist/fleet/fleet-reconciler.js +1 -1
  84. package/dist/fleet/subagent-tail-bus.d.ts +14 -11
  85. package/dist/fleet/subagent-tail-bus.js +15 -28
  86. package/dist/hooks/classic-stations.d.ts +3 -1
  87. package/dist/hooks/classic-stations.js +2 -0
  88. package/dist/hooks/hook-runner.js +28 -7
  89. package/dist/host-decision.d.ts +54 -20
  90. package/dist/host-decision.js +42 -14
  91. package/dist/http/admission.d.ts +1 -1
  92. package/dist/http/admission.js +7 -3
  93. package/dist/http/approval-sweeps.js +11 -8
  94. package/dist/http/caller-trust.d.ts +1 -1
  95. package/dist/http/durable-run-leg.js +2 -2
  96. package/dist/http/engine-refusal.d.ts +16 -0
  97. package/dist/http/engine-refusal.js +17 -0
  98. package/dist/http/memory-compliance-failure-reply.d.ts +1 -3
  99. package/dist/http/memory-compliance-failure-reply.js +4 -6
  100. package/dist/http/owner-access.d.ts +11 -0
  101. package/dist/http/owner-access.js +13 -0
  102. package/dist/http/principal-gate.d.ts +1 -1
  103. package/dist/http/refusal-body.d.ts +7 -3
  104. package/dist/http/refusal-body.js +1 -0
  105. package/dist/http/resume-legs.d.ts +21 -7
  106. package/dist/http/resume-legs.js +82 -53
  107. package/dist/http/resume-restatement.d.ts +39 -0
  108. package/dist/http/resume-restatement.js +25 -0
  109. package/dist/http/route-ctx.d.ts +35 -10
  110. package/dist/http/route-ctx.js +1 -1
  111. package/dist/http/routes/approvals-assistant.d.ts +9 -1
  112. package/dist/http/routes/approvals-assistant.js +143 -31
  113. package/dist/http/routes/capabilities.js +11 -2
  114. package/dist/http/routes/memory-policy.d.ts +2 -2
  115. package/dist/http/routes/memory-policy.js +1 -1
  116. package/dist/http/routes/notify-wake.js +23 -25
  117. package/dist/http/routes/rules.js +48 -13
  118. package/dist/http/routes/runs.js +9 -8
  119. package/dist/http/routes/session-memory-sync.d.ts +34 -6
  120. package/dist/http/routes/session-memory-sync.js +27 -10
  121. package/dist/http/routes/session-sync.js +13 -20
  122. package/dist/http/routes/sessions.d.ts +2 -2
  123. package/dist/http/routes/sessions.js +22 -23
  124. package/dist/http/routes/tasks.js +27 -49
  125. package/dist/http/server.d.ts +13 -7
  126. package/dist/http/server.js +2 -2
  127. package/dist/http/stored-body-replay.js +15 -4
  128. package/dist/http/wire-types.d.ts +17 -7
  129. package/dist/index.d.ts +1 -0
  130. package/dist/index.js +1 -0
  131. package/dist/lane-home-probe.d.ts +15 -0
  132. package/dist/lane-home-probe.js +4 -0
  133. package/dist/leader/leader.js +5 -2
  134. package/dist/leader/wire.d.ts +7 -1
  135. package/dist/leader/wire.js +6 -5
  136. package/dist/leg-facts.d.ts +37 -0
  137. package/dist/leg-facts.js +15 -0
  138. package/dist/memory-bundle-engine.d.ts +1 -4
  139. package/dist/memory-bundle-engine.js +2 -2
  140. package/dist/memory-operator-faces.d.ts +30 -66
  141. package/dist/memory-operator-faces.js +17 -88
  142. package/dist/memory-scope-stores.d.ts +38 -40
  143. package/dist/memory-scope-stores.js +51 -36
  144. package/dist/memory-scope.d.ts +0 -9
  145. package/dist/memory-scope.js +0 -9
  146. package/dist/memory-sync-client.js +14 -3
  147. package/dist/memory-sync.d.ts +20 -4
  148. package/dist/memory-sync.js +23 -4
  149. package/dist/model-plane-face.d.ts +13 -7
  150. package/dist/model-plane-face.js +2 -1
  151. package/dist/observability/corrupt-read-seat.d.ts +5 -9
  152. package/dist/observability/corrupt-read-seat.js +1 -2
  153. package/dist/observability/fail-open.d.ts +30 -10
  154. package/dist/observability/fail-open.js +27 -10
  155. package/dist/observability/run-terminal.d.ts +1 -1
  156. package/dist/observability/run-terminal.js +6 -2
  157. package/dist/orchestration/workflow-completion-inbox.d.ts +5 -19
  158. package/dist/orchestration/workflow-completion-inbox.js +0 -12
  159. package/dist/orchestration/workflow-notify-journal.d.ts +3 -2
  160. package/dist/orchestration/workflow-park-decision.d.ts +8 -3
  161. package/dist/orchestration/workflow-park-decision.js +5 -3
  162. package/dist/org-delivery-gate.d.ts +11 -0
  163. package/dist/org-delivery-gate.js +19 -1
  164. package/dist/parked-decide.d.ts +13 -9
  165. package/dist/parked-decide.js +7 -7
  166. package/dist/parked-revive-surface.d.ts +6 -7
  167. package/dist/parked-revive-surface.js +1 -1
  168. package/dist/peer-inbound-face.d.ts +122 -0
  169. package/dist/peer-inbound-face.js +123 -0
  170. package/dist/permission-rule-list.d.ts +13 -9
  171. package/dist/permission-rule-list.js +7 -3
  172. package/dist/plugins/approval-ask-store-file.js +18 -6
  173. package/dist/plugins/approval-ask-store-memory.js +8 -6
  174. package/dist/plugins/approval-ask-store-sql.d.ts +28 -13
  175. package/dist/plugins/approval-ask-store-sql.js +30 -11
  176. package/dist/plugins/caching-session-store.d.ts +0 -3
  177. package/dist/plugins/caching-session-store.js +0 -3
  178. package/dist/plugins/checkpoint-store-sql.d.ts +45 -38
  179. package/dist/plugins/checkpoint-store-sql.js +108 -45
  180. package/dist/plugins/file-history-store-sql.d.ts +24 -18
  181. package/dist/plugins/file-history-store-sql.js +24 -19
  182. package/dist/plugins/file-run-store.d.ts +29 -0
  183. package/dist/plugins/file-run-store.js +97 -8
  184. package/dist/plugins/fork-routing-session-store.d.ts +8 -1
  185. package/dist/plugins/fork-routing-session-store.js +6 -0
  186. package/dist/plugins/imported-layer-root-retirement.d.ts +82 -0
  187. package/dist/plugins/imported-layer-root-retirement.js +96 -0
  188. package/dist/plugins/local-checkpoint-store.d.ts +6 -8
  189. package/dist/plugins/local-checkpoint-store.js +5 -4
  190. package/dist/plugins/local-session-store.d.ts +69 -30
  191. package/dist/plugins/local-session-store.js +133 -57
  192. package/dist/plugins/local-session-window.d.ts +4 -2
  193. package/dist/plugins/mailbox-recipient-lifecycle.d.ts +9 -31
  194. package/dist/plugins/mailbox-recipient-lifecycle.js +4 -0
  195. package/dist/plugins/mailbox-store-sql.d.ts +12 -8
  196. package/dist/plugins/mailbox-store-sql.js +76 -7
  197. package/dist/plugins/memory-sync-store-pg.d.ts +15 -0
  198. package/dist/plugins/memory-sync-store-pg.js +21 -0
  199. package/dist/plugins/memory-sync-store-tidb.d.ts +2 -0
  200. package/dist/plugins/memory-sync-store-tidb.js +13 -1
  201. package/dist/plugins/one-time-migrations.d.ts +44 -14
  202. package/dist/plugins/one-time-migrations.js +118 -15
  203. package/dist/plugins/org-delivery-quota-store.d.ts +1 -1
  204. package/dist/plugins/org-delivery-quota-store.js +2 -12
  205. package/dist/plugins/park-commit-watch.d.ts +1 -1
  206. package/dist/plugins/permission-rule-store-file.d.ts +10 -1
  207. package/dist/plugins/permission-rule-store-file.js +15 -2
  208. package/dist/plugins/permission-rule-store-sql.d.ts +31 -1
  209. package/dist/plugins/permission-rule-store-sql.js +35 -2
  210. package/dist/plugins/pg-session-storage.d.ts +1 -9
  211. package/dist/plugins/pg-session-storage.js +2 -19
  212. package/dist/plugins/remote-env-device.d.ts +8 -11
  213. package/dist/plugins/remote-env-device.js +6 -3
  214. package/dist/plugins/remote-env-host.d.ts +8 -4
  215. package/dist/plugins/remote-env-host.js +7 -9
  216. package/dist/plugins/remote-env-k8s.d.ts +37 -24
  217. package/dist/plugins/remote-env-k8s.js +50 -17
  218. package/dist/plugins/remote-shell.js +12 -2
  219. package/dist/plugins/retention-store-sql.d.ts +2 -2
  220. package/dist/plugins/sandbox-read-floor.d.ts +5 -7
  221. package/dist/plugins/sandbox-read-floor.js +2 -7
  222. package/dist/plugins/schema-consistency.d.ts +5 -1
  223. package/dist/plugins/session-fork.d.ts +1 -1
  224. package/dist/plugins/session-ownership.d.ts +9 -0
  225. package/dist/plugins/session-ownership.js +6 -0
  226. package/dist/plugins/session-store.d.ts +13 -16
  227. package/dist/plugins/session-store.js +9 -10
  228. package/dist/plugins/sql-errors.d.ts +10 -1
  229. package/dist/plugins/sql-errors.js +13 -0
  230. package/dist/plugins/sql-json-column.d.ts +24 -2
  231. package/dist/plugins/sql-json-column.js +38 -3
  232. package/dist/plugins/store-backend.d.ts +23 -28
  233. package/dist/plugins/store-backend.js +12 -3
  234. package/dist/plugins/store-contracts.d.ts +29 -5
  235. package/dist/plugins/store-contracts.js +4 -1
  236. package/dist/plugins/task-attachment-store.d.ts +2 -2
  237. package/dist/plugins/task-attachment-store.js +37 -52
  238. package/dist/plugins/tidb-session-store.d.ts +2 -14
  239. package/dist/plugins/tidb-session-store.js +2 -20
  240. package/dist/plugins/tool-result-store-sql.d.ts +9 -8
  241. package/dist/plugins/tool-result-store-sql.js +23 -2
  242. package/dist/plugins/wiring-section-codec.d.ts +32 -0
  243. package/dist/plugins/wiring-section-codec.js +55 -0
  244. package/dist/plugins/workspace-fill.d.ts +1 -1
  245. package/dist/rule-entry-list.d.ts +3 -2
  246. package/dist/rule-entry-list.js +5 -1
  247. package/dist/rules-consent.d.ts +28 -5
  248. package/dist/rules-consent.js +40 -28
  249. package/dist/run-local.js +11 -6
  250. package/dist/runs.d.ts +12 -8
  251. package/dist/runs.js +10 -7
  252. package/dist/runtime-governance.d.ts +1 -1
  253. package/dist/security.d.ts +0 -4
  254. package/dist/server-secret-env.d.ts +4 -0
  255. package/dist/session-error-wire.d.ts +34 -23
  256. package/dist/session-error-wire.js +8 -3
  257. package/dist/session-incarnation.d.ts +3 -3
  258. package/dist/session-notify-door.d.ts +106 -0
  259. package/dist/session-notify-door.js +97 -0
  260. package/dist/session-sync.d.ts +9 -14
  261. package/dist/session-sync.js +5 -5
  262. package/dist/session-workspace.d.ts +3 -13
  263. package/dist/session-workspace.js +0 -9
  264. package/dist/standing-answer-grant.d.ts +5 -0
  265. package/dist/standing-answer-grant.js +10 -0
  266. package/dist/stores-sql/session-policy-store-sql.d.ts +4 -2
  267. package/dist/stores-sql/session-policy-store-sql.js +3 -13
  268. package/dist/task-mcp.d.ts +1 -1
  269. package/dist/task-settings.d.ts +11 -8
  270. package/dist/task-settings.js +31 -11
  271. package/dist/tool-approval.d.ts +55 -35
  272. package/dist/tool-approval.js +112 -74
  273. package/dist/trace/core-keyset-guard.d.ts +12 -9
  274. package/dist/trace/engine-notice-wire.d.ts +1 -1
  275. package/dist/trace/engine-notice-wire.js +4 -2
  276. package/dist/trace/exit-seat.d.ts +7 -1
  277. package/dist/trace/exit-seat.js +1 -0
  278. package/dist/trace/ledger-sink.d.ts +2 -2
  279. package/dist/trace/ledger-sink.js +12 -4
  280. package/dist/trace/model-segment.d.ts +74 -25
  281. package/dist/trace/model-segment.js +141 -32
  282. package/dist/trace/project.d.ts +15 -6
  283. package/dist/trace/project.js +12 -4
  284. package/dist/trace/redact.d.ts +72 -9
  285. package/dist/trace/redact.js +1509 -471
  286. package/dist/trace/self-minted-wire.d.ts +598 -47
  287. package/dist/trace/self-minted-wire.js +190 -20
  288. package/dist/trace/wire-projection-faces.d.ts +1 -1
  289. package/dist/trace/wire-projection-faces.js +1 -1
  290. package/dist/verifier-pause-card.d.ts +33 -5
  291. package/dist/verifier-pause-card.js +15 -10
  292. package/dist/web-admin-client/apply-effective.d.ts +12 -16
  293. package/dist/web-admin-client/apply-effective.js +90 -10
  294. package/dist/workspace-space.d.ts +19 -3
  295. package/dist/workspace-space.js +8 -4
  296. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +3 -1
  297. package/package.json +3 -2
  298. package/wire-changes/server@7.143.0.json +1167 -0
  299. package/wire-changes/server@7.144.0.json +291 -0
  300. package/dist/session-records-skipped-notice.d.ts +0 -21
  301. package/dist/session-records-skipped-notice.js +0 -27
@@ -1,5 +1,5 @@
1
1
  /**
2
- * 晚绑席([ref] 十段切分的**唯一**跨段可变面)—— 四只 cell,读点在前段、写点在后段。
2
+ * 晚绑席([ref] 十段切分的**唯一**跨段可变面)—— 五只 cell,读点在前段、写点在后段。
3
3
  *
4
4
  * 为什么是模块级 live binding 而不是 ctx 字段:读点的原文是**裸标识符**(`() => runStore`、
5
5
  * `() => parkedAskRedeem`),而 ctx 字段是**快照** —— 把读点改成 `ctx.runStore` 就是正文改写,
@@ -8,9 +8,10 @@
8
8
  * · `runStore` / `rateLimiter` —— 声明行留在第 7 段原位,紧随一行 `bindX(...)` 把值交过来;
9
9
  * · `parkedAskRedeem` / `runDenySweep` —— 它们的**声明行本身**就是 `let`(逐字搬进本文件,含缩进),
10
10
  * 赋值点(server 造出来之后那两处)也随之搬进 `bindServerLateSeats` —— 跨模块给 import 赋值是非法的,
11
- * 所以 cell 与它的写点必须同居一个模块。
11
+ * 所以 cell 与它的写点必须同居一个模块;
12
+ * · `sessionNotifyDoor` —— 同上一形(server 的产物,写点在 `bindServerLateSeats`)。
12
13
  *
13
- * 时序与修前逐字相同:四只 cell 的读点全是 `() => x` 取值闭包(boot 期不求值,最早的求值发生在
14
+ * 时序与修前逐字相同:五只 cell 的读点全是 `() => x` 取值闭包(boot 期不求值,最早的求值发生在
14
15
  * listen 之后的请求/tick 上),写点仍在各自原来的那一拍。未绑窗内取值得到 `undefined` —— 这正是
15
16
  * 各消费座既有的 fail-closed 臂(device 限速座:`gate()` 取不到就抛,见 boot/device-lane.ts:68)。
16
17
  */
@@ -20,11 +21,13 @@ import type { RateGate } from "../observability/rate-limit.js";
20
21
  import type { ServiceConfig } from "../config.js";
21
22
  import type { StoreBackend } from "../plugins/store-backend.js";
22
23
  import type { createHttpServer } from "../http/server.js";
24
+ import type { SessionNotifyDoor } from "../session-notify-door.js";
23
25
  declare let runStore: ReturnType<StoreBackend["run"]> | undefined;
24
26
  declare let rateLimiter: RateGate | undefined;
25
27
  declare let parkedAskRedeem: ParkedAskRedeem | undefined;
26
28
  declare let runDenySweep: ((now: number) => Promise<void>) | undefined;
27
- export { runStore, rateLimiter, parkedAskRedeem, runDenySweep };
29
+ declare let sessionNotifyDoor: SessionNotifyDoor | undefined;
30
+ export { runStore, rateLimiter, parkedAskRedeem, runDenySweep, sessionNotifyDoor };
28
31
  export declare function bindRunStore(v: ReturnType<StoreBackend["run"]> | undefined): void;
29
32
  export declare function bindRateLimiter(v: RateGate): void;
30
33
  export declare function bindServerLateSeats(ctx: {
@@ -2,7 +2,8 @@ let runStore;
2
2
  let rateLimiter;
3
3
  let parkedAskRedeem;
4
4
  let runDenySweep;
5
- export { runStore, rateLimiter, parkedAskRedeem, runDenySweep };
5
+ let sessionNotifyDoor;
6
+ export { runStore, rateLimiter, parkedAskRedeem, runDenySweep, sessionNotifyDoor };
6
7
  export function bindRunStore(v) {
7
8
  runStore = v;
8
9
  }
@@ -12,6 +13,7 @@ export function bindRateLimiter(v) {
12
13
  export function bindServerLateSeats(ctx) {
13
14
  const { config, logger, server } = ctx;
14
15
  runDenySweep = server.denyExpiredApprovals;
16
+ sessionNotifyDoor = server.sessionNotifyDoor;
15
17
  if (!config.directDoorActive)
16
18
  parkedAskRedeem = server.redeemParkedAsk;
17
19
  else
@@ -45,7 +45,7 @@ export function createLeaderFace(ctx) {
45
45
  (leaderProvider === "k8s" && "s3" in leaderMinio && executionEnvFactory) ||
46
46
  (leaderProvider === "host" && executionEnvFactory))
47
47
  ? createLeaderEndpoint(createLeaderRunner({
48
- brain, models: config.models, roles: config.roles, pricing, logger,
48
+ brain, models: config.models, roles: config.roles, tiers: config.tiers, pricing, logger,
49
49
  governance: {
50
50
  compliancePostureResolver: governanceSeams.compliancePostureResolver,
51
51
  lockedConfig: governanceSeams.lockedConfig,
@@ -61,9 +61,7 @@ export function createLeaderFace(ctx) {
61
61
  ...(ctx.onError ? { onError: ctx.onError } : {}),
62
62
  mods: ctx.deploymentMods,
63
63
  fanoutEnabled: config.leaderFanoutEnabled,
64
- ...((process.env.MODEL_ROUTER_ID || process.env.MODEL_CHEAP_ID)
65
- ? { routerModel: (process.env.MODEL_ROUTER_ID || process.env.MODEL_CHEAP_ID) }
66
- : {}),
64
+ ...(process.env.MODEL_ROUTER_ID ? { routerModel: process.env.MODEL_ROUTER_ID } : {}),
67
65
  ...(leaderProvider === "e2b" ? { e2bApiKey: config.remoteExec.apiKey } : {}),
68
66
  ...(executionEnvFactory ? { envFactory: executionEnvFactory } : {}),
69
67
  ...leaderMinio,
@@ -1,6 +1,5 @@
1
1
  import { type LaneHomeDeployment } from "../execution-lane-caps.js";
2
2
  import { type MemoryScopeStores } from "../memory-scope-stores.js";
3
- import type { SessionCaptureRecordSource } from "../plugins/store-backend.js";
4
3
  import type { RestartSliceCtx } from "../web-admin-client/restart-signal.js";
5
4
  import type { MemoryConsolidationDriverConfig, ServiceConfig } from "../config-types.js";
6
5
  import { resolveMemoryConsolidationDriver, type ConsolidationWriteJudge, type ConsolidationWriteJudgeInput, type EngineNotice, type ConsolidationDriverRunRow, type ConsolidationRunReceipt, type MemoryConsolidationDriverDeps, type PermissionRuleStoreProvider } from "@sema-agent/core";
@@ -500,13 +499,6 @@ export declare function createMemoryConsolidationFaces(stores: MemoryScopeStores
500
499
  /** 停因自由文本的**运维日志**座(缺席 = 没人听,不影响任何行为)。载荷由 {@link buildStopDetailAudit}
501
500
  * 铸,调用点在单飞回调**之内** ⇒ 一轮真 run 一行,并入的等待者不各落一行。 */
502
501
  onStopDetail?: (audit: ReturnType<typeof buildStopDetailAudit>) => void;
503
- /** [ref]②(383 §2.1b):capture opt-out 记录的按平面取用源(main.ts 取一次,与 Runner 同源;每只引擎按它那只店的控制面取)。
504
- * 🔴 这只引擎是四只 operator 面里**真读名册**的那只:`consolidationEligibility` 第四臂
505
- * (engine.js `listCaptureOptOutSessions`)拿它筛掉 opt-out 会话的贡献条目 —— SQL 部署上漏喂
506
- * = 驱动器读文件空名册 ⇒ 蒸馏器放大用户明说不要记的内容(S-5 真实失效形;全站同批注入律,
507
- * 机器钉 capture-optout-lane ②)。[ref] 起 local 车道在引擎接线时也供(core 文件三腿,同一只控制面);
508
- * 缺席 ⇒ 记忆面暗(引擎未接线),与 Runner 同本。 */
509
- captureRecords?: SessionCaptureRecordSource;
510
502
  /** core 7.50.0:整理跑的**写判官座**(必填 —— 缺席不是「没有规则」,core 也拒)。操作面不判任何东西,只把它原样递给驱动动词:
511
503
  * 早问库目录一次、应用时问每个产物文件,答 `no_objection` 以外一律拒写。装配层给哪一只见 {@link createOperatorValveWriteJudge}。 */
512
504
  writeJudge: ConsolidationWriteJudge;
@@ -4,8 +4,8 @@ import { buildOperatorRosterWayOut } from "../http/principal-gate.js";
4
4
  import { memoryMountRootOf } from "../memory-scope.js";
5
5
  import { executionLaneHomeDir } from "../execution-lane-caps.js";
6
6
  import { DEFAULT_MODEL_REF, resolveMainModel } from "../model-select.js";
7
- import { backendOwnsControlPlane, captureRecordStoreOf } from "../memory-operator-faces.js";
8
- import { memoryStoreForRequest } from "../memory-scope-stores.js";
7
+ import { captureRecordStoreOf } from "../memory-operator-faces.js";
8
+ import { backendOwnsControlPlane, memoryStoreForRequest } from "../memory-scope-stores.js";
9
9
  import { createConsolidationWriteJudge, deliverWriteRefusal, expandTiers, MemoryEngine, modelOriginOf, readConsolidationDriverRun, resolveMemoryConsolidationDriver, runMemoryConsolidationDriver, } from "@sema-agent/core";
10
10
  import { seatText } from "../trace/exit-seat.js";
11
11
  export function resolveConsolidationDriverSeat(deps) {
@@ -342,7 +342,7 @@ export function createMemoryConsolidationFaces(stores, input) {
342
342
  const known = engines.get(store);
343
343
  if (known !== undefined)
344
344
  return known;
345
- const records = captureRecordStoreOf(input.captureRecords, store);
345
+ const records = captureRecordStoreOf(stores.captureRecords, store);
346
346
  const engine = new MemoryEngine({
347
347
  backend: store,
348
348
  memoryDir: memoryMountRootOf(store, stores.root),
@@ -91,7 +91,7 @@ export function startReapers(ctx) {
91
91
  const runDenySweepGuard = createThrottledReaperCatch("run_deny_sweep", logger);
92
92
  const runsReapSuspendedGuard = createThrottledReaperCatch("runs_reap_suspended", logger);
93
93
  const checkpointReapCtxGuard = createThrottledReaperCatch("checkpoint_reap_ctx", logger);
94
- const toolResultReapOlderThanGuard = createThrottledReaperCatch("tool_result_reap_older_than", logger);
94
+ const toolResultReapGuard = createThrottledReaperCatch("tool_result_reap", logger);
95
95
  const fileHistorySweepOrphanBlobsGuard = createThrottledReaperCatch("file_history_sweep_orphan_blobs", logger);
96
96
  const legacySnapshotBlobSweepGuard = createThrottledReaperCatch("legacy_snapshot_blob_sweep", logger);
97
97
  const attachmentReapUnboundGuard = createThrottledReaperCatch("attachment_reap_unbound", logger);
@@ -244,9 +244,10 @@ export function startReapers(ctx) {
244
244
  rateLimiter?.sweep();
245
245
  if (costQuota instanceof CostQuota)
246
246
  costQuota.reap();
247
- leg(toolResultStore
248
- ?.reapOlderThan?.(Date.now() - config.toolResultTtlSec * 1000)
249
- ?.then(() => toolResultReapOlderThanGuard.onSuccess(), toolResultReapOlderThanGuard.onError));
247
+ const reapToolResults = toolResultStore?.reap?.bind(toolResultStore);
248
+ leg(reapToolResults && Promise.resolve()
249
+ .then(() => reapToolResults(Date.now(), { maxAgeMs: config.toolResultTtlSec * 1000 }))
250
+ .then(() => toolResultReapGuard.onSuccess(), toolResultReapGuard.onError));
250
251
  leg(fileHistoryErasure
251
252
  ?.sweepOrphanBlobs?.()
252
253
  .then(() => fileHistorySweepOrphanBlobsGuard.onSuccess(), fileHistorySweepOrphanBlobsGuard.onError));
@@ -1,7 +1,7 @@
1
1
  import { SessionEnvironmentSelection, selectEnvironmentTool } from "../capabilities/select-environment-tool.js";
2
2
  import { sendUserFileTool } from "../capabilities/send-user-file-tool.js";
3
3
  import { selectScenario } from "../capabilities/scenarios.js";
4
- import { type LoadedSkill } from "../capabilities/skills.js";
4
+ import type { LoadedSkill } from "../capabilities/skills.js";
5
5
  import type { ServiceConfig } from "../config.js";
6
6
  import { type LiveQuestionFace } from "../deployment-governance.js";
7
7
  import { FleetEventBus } from "../fleet/fleet-bus.js";
@@ -6,8 +6,8 @@ import { recordFailOpen } from "../observability/fail-open.js";
6
6
  import { SessionEnvironmentSelection, selectEnvironmentTool } from "../capabilities/select-environment-tool.js";
7
7
  import { sendUserFileTool } from "../capabilities/send-user-file-tool.js";
8
8
  import { buildExcludeToolsSeat, buildPromptSeats, buildRunSkills, createScenarioGate, selectScenario } from "../capabilities/scenarios.js";
9
- import { stampRunSkills } from "../capabilities/skills.js";
10
- import { stampHandsLane, toolPolicyForHands } from "../capabilities/hands-lane.js";
9
+ import { toolPolicyForHands } from "../capabilities/hands-lane.js";
10
+ import { mintLegFacts } from "../leg-facts.js";
11
11
  import { applyLongtailDefer } from "../capabilities/tool-defer.js";
12
12
  import { assertGuardPatternsUsable, buildApprovalGrantNotice, buildOnlySensitiveBaselineWarning, createApprovalBaselinePolicy, createDeploymentGovernanceInputs } from "../deployment-governance.js";
13
13
  import { createDeploymentListExemption, gateIntentUnserviceableReason, singleUserAutoAcceptBaselineApplies } from "../approval.js";
@@ -28,7 +28,7 @@ import { tightenGoverned } from "../governance-overrides.js";
28
28
  import { applyRuntimeGovernance } from "../runtime-governance.js";
29
29
  import { HttpError, createCodedHttpError, encodeCheckpointScope } from "../security.js";
30
30
  import { headReadOf, sessionFaceOfHead } from "../session-incarnation.js";
31
- import { legProjectIdOf, sessionWorkspaceStoreOf, stampLegSessionWitness } from "../session-workspace.js";
31
+ import { legProjectIdOf, sessionWorkspaceStoreOf } from "../session-workspace.js";
32
32
  import { memorySpecForRequest } from "../memory-scope.js";
33
33
  import { createMemoryProjectLayers } from "../memory-project-layer.js";
34
34
  import { inheritEnvFacts, inheritEnvFieldIssue, singleMemberOffFieldIssue } from "../request-value-closure.js";
@@ -177,13 +177,13 @@ export function createResolveSpec(ctx) {
177
177
  scratchpadDir: folded.scratchpadDir,
178
178
  hostSemanticsLane: folded.hostSemanticsLane,
179
179
  });
180
- const stamped = stampHandsLane(final, gated.hands);
181
- return stampLegSessionWitness(stampRunSkills(stamped, runSkills.roster), gated.sessionWitness);
180
+ return { spec: final, facts: { hands: gated.hands, skills: runSkills.roster, sessionWitness: gated.sessionWitness } };
182
181
  };
183
182
  const gateScenarioAndAppend = async (body, auth, opts) => {
184
183
  const scenarioName = await scenarioGate(auth?.principal, body.scenario);
185
184
  const root = opts.execution.root;
186
- const sessionWitness = { sessionId: root, incarnation: (sessionHeadOf === undefined ? undefined : sessionFaceOfHead(root, await sessionHeadOf(root)))?.incarnation ?? null };
185
+ const rootFace = sessionHeadOf === undefined ? undefined : sessionFaceOfHead(root, await sessionHeadOf(root));
186
+ const sessionWitness = { sessionId: root, owner: rootFace?.owner ?? null, incarnation: rootFace?.incarnation ?? null };
187
187
  const cap = selectScenario(scenarios, scenarioName)(body, auth?.principal, { sessionId: sessionWitness.sessionId, delegationRoot: sessionWitness });
188
188
  const acceptedAppend = acceptAppendSystemPrompt(body.appendSystemPrompt, (detail) => logger.warn("append_system_prompt_dropped", { detail, sessionId: auth?.sessionId ?? null }));
189
189
  const objective = typeof body.objective === "string" ? body.objective : "";
@@ -680,8 +680,8 @@ export function createResolveSpec(ctx) {
680
680
  return governed;
681
681
  };
682
682
  const resolveSpecForLeg = async (body, req, auth, opts) => {
683
- const spec = await resolveSpec(body, req, auth, opts);
684
- return unrooted(opts.unattendedLeg !== true ? spec : withUnattendedLeg(spec));
683
+ const { spec, facts } = await resolveSpec(body, req, auth, opts);
684
+ return mintLegFacts(unrooted(opts.unattendedLeg !== true ? spec : withUnattendedLeg(spec)), facts);
685
685
  };
686
686
  return resolveSpecForLeg;
687
687
  }
@@ -7,7 +7,7 @@
7
7
  * ⚠️ **位置即契约**:必须晚于 stores/exec-env/coordinators/workflow 段(所有键都是它们的产物),
8
8
  * 且早于 `new Runner(runnerDeps)` —— Runner 构造时展开 tier 表成私有目录副本(之后的换代经
9
9
  * `Runner.swapDeps` 换进,见 boot/stage-08-reapers.ts)。
10
- * `getRunStore()` 是唯一的晚绑取值(runStore 在本段之后才构造),原文靠同作用域前向引用。
10
+ * runStore 在本段之后才构造 ⇒ 本段不读它(本段没有晚绑取值)。
11
11
  */
12
12
  import { type CacheBreakFinding, type CrossBoundaryPosture, type RunnerDeps, type WorkflowRunStore, type AskOutcome } from "@sema-agent/core";
13
13
  import type { createBrain } from "../brain.js";
@@ -19,7 +19,6 @@ import type { Logger } from "../observability/logger.js";
19
19
  import type { Metrics } from "../observability/metrics.js";
20
20
  import { type ConsolidationDriverSeat } from "./memory-consolidation.js";
21
21
  import { WorkflowAgentRegistry } from "../orchestration/workflow-agent-steer.js";
22
- import { type WorkflowCompletionInbox } from "../orchestration/workflow-completion-inbox.js";
23
22
  import { type EngineNoticeRouter } from "../trace/engine-notice-wire.js";
24
23
  import { WorkflowNotifyGate, type WorkflowCompletionPayload } from "../orchestration/workflow-notify-journal.js";
25
24
  import type { ServiceWorkflowJournalStore, SessionCaptureRecordSource, StoreBackend, ToolResultStoreFull } from "../plugins/store-backend.js";
@@ -68,7 +67,10 @@ export declare function createRunnerDepsOnAsk(toolApproval: ToolApprovalCoordina
68
67
  * `classificationKnown:false`(指标标签折 `unknown`),不吞不编;与安装包的锁步由 test/boot-runner-deps-shared-base.test.ts
69
68
  * 的 dist 扫描格钉住(两种发射写法都读;读不出词的经变量发射点本身红;core 加词/收进 d.ts 那天先红)。
70
69
  * 第七词 `peer-seat-hold`(runtask 的 `holdDeclarations`,字面量):对端座的三员对象里 `hold` / `release` 抛了 ⇒ 引擎报一次、该引用
71
- * 不被持有;座是本仓的 desk,所以这是部署自己的故障,与其余六词同走 warn + 计数。 */
70
+ * 不被持有;座是本仓的 desk,所以这是部署自己的故障,与其余六词同走 warn + 计数。
71
+ * 第八词 `input-author-unreadable`(core 7.61.0 `run-leg.js` 的 `objectiveAuthorOf` 回调,字面量):宿主经 `RunInternals.objectiveAuthor`
72
+ * 递了一个不在 `INPUT_AUTHORS` 里的词 ⇒ 引擎报一次、该目标按操作者的输入筛。本服务不递这个字段(src 零读写),只有嵌入方手铸时才发射,
73
+ * 仍是部署侧的故障,同走 warn + 计数。 */
72
74
  export declare const CONFIG_ADVISORY_CLASSIFICATIONS: ReadonlySet<string>;
73
75
  /** [ref]:core 的 [ref] 前缀缓存**断裂**探测器交给宿主的根因**闭集**,以及每个词的日志级别。
74
76
  * 闭集**不抄词**:词源直接取 core 公开导出的 `CacheBreakFinding["cause"]`(`@sema-agent/core` 根导出,
@@ -240,10 +242,7 @@ export interface RunnerDepsCtx {
240
242
  workflowJournalStore: ServiceWorkflowJournalStore | undefined;
241
243
  workflowAgentRegistry: WorkflowAgentRegistry | undefined;
242
244
  workflowNotifyGate: WorkflowNotifyGate | undefined;
243
- workflowCompletionInbox: WorkflowCompletionInbox | undefined;
244
245
  deliverWorkflowCompletion: (p: WorkflowCompletionPayload) => Promise<void>;
245
- /** 晚绑(runStore 在本段之后构造)——见文件头「位置即契约」。 */
246
- getRunStore: () => ReturnType<StoreBackend["run"]> | undefined;
247
246
  }
248
247
  /** [ref] A10 留档发现②:main runner `RunnerDeps` 与 main.ts subRunner 字面量之间此前手工重复
249
248
  * 的 ~15 个键,类型标注见 {@link createSharedRunnerDeps} 头注。 */
@@ -282,6 +281,15 @@ export interface EngineNoticeMetricsSeat {
282
281
  export declare function createEngineNoticeForwarder(logger: {
283
282
  warn: (msg: string, fields?: Record<string, unknown>) => void;
284
283
  }, router?: EngineNoticeRouter, metrics?: EngineNoticeMetricsSeat): NonNullable<RunnerDeps["onNotice"]>;
284
+ /**
285
+ * [ref](core 7.62.0 [ref]):**进程缺省通告席** —— 引擎在没有自己席的地方说的话(四个无席收值口:品牌 brain 构造 / 一次请求的路由读 / 对端拨号 /
286
+ * 直建蒸馏座;core 读法:在场的席恒赢,缺席才落这里)交给与有席通告**同一只**转发体({@link createEngineNoticeForwarder}:先结构化 `engine_notice` 日志、再分流)。
287
+ * 修前这些话落 `console.warn` 裸句 —— 同一种事实两种写法。构造引擎的两个进程入口(`boot/stage-01-config.ts` / `run-local.ts`)在 logger 建起之后各装一次;
288
+ * 装之前(声明自有凭据名、读配置那几步)引擎若无席说话仍落 `console.warn`(那几步不建 brain,四个收值口一个都不经过)。
289
+ */
290
+ export declare function installDefaultEngineNoticeSeat(logger: {
291
+ warn: (msg: string, fields?: Record<string, unknown>) => void;
292
+ }, metrics?: EngineNoticeMetricsSeat): void;
285
293
  /**
286
294
  * `onNotice` **席**的装配判据本身 —— 「`warn` 真在场才铸席」这一条从此是**一个可直接调用的函数**,
287
295
  * 不是散在装配点、只能靠扫源码文本去猜的一行三元(codex 交叉复审 R1-[medium],验真后修)。
@@ -1,4 +1,4 @@
1
- import { createFileWorkflowScriptStore } from "@sema-agent/core";
1
+ import { createFileWorkflowScriptStore, setDefaultEngineNoticeSeat } from "@sema-agent/core";
2
2
  import { join } from "node:path";
3
3
  import { lkgReadDenyRows } from "../config-lkg.js";
4
4
  import { auditReadDenyAnchoring } from "./read-deny-anchor-audit.js";
@@ -8,7 +8,6 @@ import { assertAutoConsolidationWirable } from "./memory-consolidation.js";
8
8
  import { createHardenedVmRunner } from "../orchestration/hardened-vm-runner.js";
9
9
  import { createWorkerHardenedVmRunner } from "../orchestration/hardened-vm-worker-runner.js";
10
10
  import { WorkflowAgentRegistry } from "../orchestration/workflow-agent-steer.js";
11
- import { resolveServedSession } from "../orchestration/workflow-completion-inbox.js";
12
11
  import { defaultEngineNoticeRouter, redactNoticeMessage, redactNoticeRuleText } from "../trace/engine-notice-wire.js";
13
12
  import { WorkflowNotifyGate } from "../orchestration/workflow-notify-journal.js";
14
13
  import { makeLoadProjectMemory, makeProbeInstructionSources } from "../project-memory.js";
@@ -32,6 +31,7 @@ export function createRunnerDepsOnAsk(toolApproval) {
32
31
  export const CONFIG_ADVISORY_CLASSIFICATIONS = new Set([
33
32
  "file-history-no-env",
34
33
  "file-history-no-store",
34
+ "input-author-unreadable",
35
35
  "interaction-posture-refused",
36
36
  "memory-tools-not-mounted",
37
37
  "peer-seat-hold",
@@ -60,6 +60,9 @@ export function createEngineNoticeForwarder(logger, router = defaultEngineNotice
60
60
  router.route(notice);
61
61
  };
62
62
  }
63
+ export function installDefaultEngineNoticeSeat(logger, metrics) {
64
+ setDefaultEngineNoticeSeat(createEngineNoticeForwarder(logger, defaultEngineNoticeRouter, metrics));
65
+ }
63
66
  export function createEngineNoticeSeat(logger, router = defaultEngineNoticeRouter) {
64
67
  const warn = logger?.warn?.bind(logger);
65
68
  return warn ? { onNotice: createEngineNoticeForwarder({ warn }, router) } : {};
@@ -140,7 +143,7 @@ export function createSharedRunnerDeps(ctx) {
140
143
  return shared;
141
144
  }
142
145
  export function createRunnerDeps(ctx) {
143
- const { config, logger, metrics, localRoot, outcomeSink, elicitation, question, toolApproval, sessionStore, memoryEngine, sessionCaptureRecords, memorySyncRunner, runtimeCapsResolver, fileHistoryStore, permissionRuleStore, fleetBus, workflowRunStore, workflowJournalStore, workflowAgentRegistry, workflowNotifyGate, workflowCompletionInbox, deliverWorkflowCompletion, getRunStore, } = ctx;
146
+ const { config, logger, metrics, localRoot, outcomeSink, elicitation, question, toolApproval, sessionStore, memoryEngine, sessionCaptureRecords, memorySyncRunner, runtimeCapsResolver, fileHistoryStore, permissionRuleStore, fleetBus, workflowRunStore, workflowJournalStore, workflowAgentRegistry, workflowNotifyGate, deliverWorkflowCompletion, } = ctx;
144
147
  const peerSessionLister = sessionStore.listSessions?.bind(sessionStore);
145
148
  const memoryEngineIncident = createMemoryEngineIncidentSink({ logger, metrics });
146
149
  const sharedRunnerDeps = createSharedRunnerDeps(ctx);
@@ -169,20 +172,6 @@ export function createRunnerDeps(ctx) {
169
172
  ...(workflowNotifyGate
170
173
  ? workflowNotifyGate.buildNotifier()
171
174
  : { notify: (input) => deliverWorkflowCompletion(input) }),
172
- ackServed: async (input) => {
173
- if (!workflowCompletionInbox)
174
- return;
175
- try {
176
- const sid = await resolveServedSession(input, getRunStore() ? (id) => getRunStore().getRun(id) : undefined);
177
- if (sid) {
178
- await workflowCompletionInbox.markTerminalServed(sid, input.runId);
179
- logger.info("workflow_complete_ack_served", { route: "poll-served", sessionId: sid, runId: input.runId });
180
- }
181
- }
182
- catch (err) {
183
- logger.warn("workflow_ack_served_failed", { runId: input.runId, err: seatText("operator-log-text", String(err)) });
184
- }
185
- },
186
175
  },
187
176
  }
188
177
  : {};
@@ -31,6 +31,7 @@ import type { BreakerStateStore, CostQuotaStore, RateLimiterStore, StoreBackend
31
31
  import type { WorkflowNotifyJournalStore } from "../orchestration/workflow-notify-journal.js";
32
32
  import type { ToolApprovalCoordinator } from "../tool-approval.js";
33
33
  import type { ParkCommitWatch } from "../plugins/park-commit-watch.js";
34
+ import type { PeerInboundShutdownReading } from "../peer-inbound-face.js";
34
35
  import { type DrainState } from "../fleet/drain-entry.js";
35
36
  export interface ShutdownCtx {
36
37
  config: ServiceConfig;
@@ -94,6 +95,14 @@ export interface ShutdownCtx {
94
95
  servingLease?: {
95
96
  stop(): void;
96
97
  } | undefined;
98
+ /**
99
+ * [ref]:被扣跨会话来信的收信方决断面(`peer-inbound-face.ts`,进程单例)的关停口 —— CC `HBe` 的宿主半场(core 不调 `PeerHeldQueue.shutdown()`)。
100
+ * hardShutdown 起点与审批面收尾**并行**调它、`backend.close()` 之前等它(结清要走信箱店的 CAS 与回执投递):本进程仍被扣的信按 core 的规则
101
+ * 带 `expired` 回执结清(reason `shutdown`),core 等回执落箱再兑现(没落的点名 seq ⇒ 读数 `receiptFaults`)。缺席 = 本装配不接(测试装配)。
102
+ */
103
+ peerInbound?: {
104
+ shutdown(): Promise<PeerInboundShutdownReading>;
105
+ } | undefined;
97
106
  }
98
107
  /**
99
108
  * 受控退的**后台宽限**还要等多久(ms)—— hardShutdown 软停后台 shell 之后、`process.exit` 之前,给软停过的行**一次**
@@ -18,7 +18,7 @@ export function backgroundGraceRemainingMs(a) {
18
18
  return Math.max(0, Math.min(a.softStoppedAt + a.graceMs, a.deadlineMs) - a.now);
19
19
  }
20
20
  export function installShutdownHandlers(ctx) {
21
- const { config, logger, server, reaper, fleetReconcile, retentionLane, releaseRetentionLease, otelExporter, breakerState, costQuota, rateLimiter, runner, subRunner, lspManager, workflowNotifyJournal, fleetClient, backend, drainState, storeLiveProbe, webAdmin, version, deviceHub, toolApproval, parkCommits, servingLease, } = ctx;
21
+ const { config, logger, server, reaper, fleetReconcile, retentionLane, releaseRetentionLease, otelExporter, breakerState, costQuota, rateLimiter, runner, subRunner, lspManager, workflowNotifyJournal, fleetClient, backend, drainState, storeLiveProbe, webAdmin, version, deviceHub, toolApproval, parkCommits, servingLease, peerInbound, } = ctx;
22
22
  const dataRoot = config.localDataRoot;
23
23
  if (dataRoot) {
24
24
  const prior = readCrashLast(dataRoot);
@@ -93,6 +93,22 @@ export function installShutdownHandlers(ctx) {
93
93
  logger.warn("approval_park_uncommitted_at_shutdown", { approvalId: p.approvalId, taskId: p.taskId });
94
94
  })
95
95
  .catch((err) => logger.warn("approval_drain_for_shutdown_failed", { err: seatText("operator-log-text", String(err)) }));
96
+ const peerInboundDrain = peerInbound === undefined
97
+ ? Promise.resolve()
98
+ : (async () => {
99
+ const deadline = new AbortController();
100
+ const settled = peerInbound.shutdown().then((reading) => {
101
+ if (reading.cards > 0)
102
+ logger.info("peer_inbound_settled_at_shutdown", { queues: reading.queues, cards: reading.cards });
103
+ for (const fault of reading.receiptFaults)
104
+ logger.warn("peer_inbound_shutdown_receipt_unlanded", { err: seatText("operator-log-text", fault) });
105
+ }, (err) => logger.warn("peer_inbound_shutdown_failed", { err: seatText("operator-log-text", String(err)) }));
106
+ const timedOut = delay(Math.max(0, graceDeadlineMs - Date.now()), undefined, { signal: deadline.signal }).then(() => "deadline", () => "done");
107
+ const winner = await Promise.race([settled.then(() => "done"), timedOut]);
108
+ deadline.abort();
109
+ if (winner === "deadline")
110
+ logger.warn("peer_inbound_shutdown_unfinished_at_deadline", {});
111
+ })();
96
112
  clearInterval(reaper);
97
113
  clearInterval(fleetReconcile.timer);
98
114
  const retentionTeardown = retentionLane === undefined
@@ -120,7 +136,7 @@ export function installShutdownHandlers(ctx) {
120
136
  const softStoppedAt = Date.now();
121
137
  const backgroundGraceMs = backgroundGraceRemainingMs({ softStopped: backgroundSoftStopped, softStoppedAt, now: softStoppedAt, graceMs: HOST_BG_KILL_GRACE_MS, deadlineMs: graceDeadlineMs });
122
138
  const backgroundGrace = backgroundGraceMs > 0 ? delay(backgroundGraceMs) : Promise.resolve();
123
- const drained = approvalDrain
139
+ const drained = Promise.all([approvalDrain, peerInboundDrain])
124
140
  .then(() => parkCommits?.quiesce(graceDeadlineMs))
125
141
  .then((q) => {
126
142
  if (q !== undefined && q.inFlight > 0)
@@ -15,6 +15,7 @@ import { setRedactionObserver } from "../trace/redact.js";
15
15
  import { installOutboundDispatcher } from "../outbound-dispatcher.js";
16
16
  import { provisionSemaConfigDir } from "../sema-config-dir.js";
17
17
  import { bindOwnCredentialsConfig, declareServerWithheldEnv } from "../server-secret-env.js";
18
+ import { installDefaultEngineNoticeSeat } from "./runner-deps.js";
18
19
  export function runStage01() {
19
20
  declareServerWithheldEnv();
20
21
  const config = loadConfig();
@@ -27,6 +28,7 @@ export function runStage01() {
27
28
  const metrics = createMetrics();
28
29
  installFailOpenRecorder({ logger, metrics, redactDetail: redactSecrets });
29
30
  installSecretEnvScrubRecorder({ logger, metrics });
31
+ installDefaultEngineNoticeSeat(logger, metrics);
30
32
  installFileHistoryFailureRecorder({ logger, metrics });
31
33
  logConfigDiagnostics(logger);
32
34
  for (const w of drainNumEnvWarnings())
@@ -3,6 +3,7 @@ import { createWebAdminRuntime } from "./web-admin.js";
3
3
  import { composeExecutionLane, FILE_SOURCED_LANES } from "./execution-lane.js";
4
4
  import { configSourceKind } from "../config-provider.js";
5
5
  import { logConfigDirMigration, migrateLocalConfigDirectory } from "../config-d-migration.js";
6
+ import { logEnvModelsMigration, runEnvModelsMigration } from "../config-root-migration.js";
6
7
  import { assertLocalConfigDirTrusted } from "../config-dir-trust.js";
7
8
  import { defaultModelRefusal, refusedNameMintedRefusal } from "../model-entry-refusal.js";
8
9
  import { isRosterGateArmed } from "../config.js";
@@ -13,6 +14,8 @@ export async function runStage02(ctx) {
13
14
  const configSource = configSourceKind(config);
14
15
  if (configSource === "local") {
15
16
  await assertLocalConfigDirTrusted({ root: localRoot, declaredOwnerUid: config.configLocalOwnerUid });
17
+ const envModelsMigration = { root: localRoot, env: process.env, envTableIsPlaceholder: isRosterGateArmed(config.webAdmin) };
18
+ logEnvModelsMigration(logger, envModelsMigration, await runEnvModelsMigration(envModelsMigration));
16
19
  logConfigDirMigration(logger, await migrateLocalConfigDirectory(localRoot));
17
20
  }
18
21
  await composeExecutionLane(config, { configSource, localRoot, logger, drivesFromFile: FILE_SOURCED_LANES });
@@ -5,7 +5,10 @@ export declare function runStage03(ctx: Awaited<ReturnType<typeof runStage02>>):
5
5
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
6
6
  engineDataRoot: string;
7
7
  instanceId: string;
8
- mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
8
+ mailboxRecipientLifecycle: Readonly<{
9
+ retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
10
+ listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
11
+ }> | undefined;
9
12
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
10
13
  memoryEngine: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
11
14
  memoryExportStores: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
@@ -2,9 +2,8 @@ import { uuidv7 } from "@sema-agent/core";
2
2
  import { openStores } from "./stores.js";
3
3
  export async function runStage03(ctx) {
4
4
  const { config, localRoot, logger, metrics } = ctx;
5
- const { backend, storePosture, memoryEngine, engineDataRoot, memorySyncCursors, rosterStore, backgroundAgentStore, taskAttachmentStore, mailboxStore, mailboxRecipientLifecycle, memoryExportStores, memorySyncRunner, sessionStore, breakerState, usageWindowStore, memoryPosture, taskListLane, sqlEngine, } = await openStores({ config, logger, metrics, localRoot });
5
+ const { backend, storePosture, memoryEngine, engineDataRoot, memorySyncCursors, rosterStore, backgroundAgentStore, sessionCaptureRecords, taskAttachmentStore, mailboxStore, mailboxRecipientLifecycle, memoryExportStores, memorySyncRunner, sessionStore, breakerState, usageWindowStore, memoryPosture, taskListLane, sqlEngine, } = await openStores({ config, logger, metrics, localRoot });
6
6
  const instanceId = uuidv7();
7
- const sessionCaptureRecords = backend?.sessionCaptureRecords();
8
7
  return { ...ctx, backend, backgroundAgentStore, breakerState, engineDataRoot, instanceId, mailboxRecipientLifecycle, mailboxStore, memoryEngine, memoryExportStores, memoryPosture, memorySyncCursors, memorySyncRunner, rosterStore, sessionCaptureRecords, sessionStore, sqlEngine, storePosture, taskAttachmentStore, taskListLane, usageWindowStore };
9
8
  }
10
9
  //# sourceMappingURL=stage-03-store-backend.js.map
@@ -28,14 +28,17 @@ export declare function runStage04(ctx: Awaited<ReturnType<typeof runStage03>>):
28
28
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
29
29
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
30
30
  sideQueryAccounting: import("../budget.js").SideQueryAccounting;
31
- toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
31
+ toolResultStore: import("@sema-agent/core").ToolResultStore | undefined;
32
32
  tracer: import("@sema-agent/core").TracerHook;
33
33
  backend: import("../index.js").StoreBackend | undefined;
34
34
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
35
35
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
36
36
  engineDataRoot: string;
37
37
  instanceId: string;
38
- mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
38
+ mailboxRecipientLifecycle: Readonly<{
39
+ retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
40
+ listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
41
+ }> | undefined;
39
42
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
40
43
  memoryEngine: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
41
44
  memoryExportStores: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
@@ -8,22 +8,20 @@ import { createRuleConsentLane } from "../rules-consent.js";
8
8
  import { createConsolidationValve } from "./memory-consolidation.js";
9
9
  import { createOperatorFaceIncidentSink } from "../memory-incident-sink.js";
10
10
  export async function runStage04(ctx) {
11
- const { backend, breakerState, config, logger, memoryEngine, metrics, sessionCaptureRecords } = ctx;
12
- const memoryBundleFaces = memoryEngine ? createMemoryBundleFaces(memoryEngine, { ...(sessionCaptureRecords !== undefined ? { captureRecords: sessionCaptureRecords } : {}) }) : undefined;
11
+ const { backend, breakerState, config, logger, memoryEngine, metrics } = ctx;
12
+ const memoryBundleFaces = memoryEngine ? createMemoryBundleFaces(memoryEngine) : undefined;
13
13
  const memoryComplianceFaces = memoryEngine
14
14
  ? createMemoryComplianceFaces(memoryEngine, {
15
15
  onIncident: createOperatorFaceIncidentSink({ logger }, "memory_compliance_incident"),
16
- ...(sessionCaptureRecords !== undefined ? { captureRecords: sessionCaptureRecords } : {}),
17
16
  })
18
17
  : undefined;
19
18
  const memoryOriginFaces = memoryEngine
20
19
  ? createMemoryOriginFaces(memoryEngine, {
21
20
  onIncident: createOperatorFaceIncidentSink({ logger }, "memory_origin_incident"),
22
- ...(sessionCaptureRecords !== undefined ? { captureRecords: sessionCaptureRecords } : {}),
23
21
  })
24
22
  : undefined;
25
23
  const sessionMemoryStatusFace = memoryEngine
26
- ? createSessionMemoryStatusFace(memoryEngine, { ...(sessionCaptureRecords !== undefined ? { captureRecords: sessionCaptureRecords } : {}) })
24
+ ? createSessionMemoryStatusFace(memoryEngine)
27
25
  : undefined;
28
26
  const { valve: consolidationValve, watch: consolidationSeatWatch } = createConsolidationValve({ config, memoryEngine, logger });
29
27
  const adoptionBoot = await runAdoptionBootScan({ backend, logger });
@@ -47,14 +47,17 @@ export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>):
47
47
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
48
48
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
49
49
  sideQueryAccounting: import("../budget.js").SideQueryAccounting;
50
- toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
50
+ toolResultStore: import("@sema-agent/core").ToolResultStore | undefined;
51
51
  tracer: import("@sema-agent/core").TracerHook;
52
52
  backend: import("../index.js").StoreBackend | undefined;
53
53
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
54
54
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
55
55
  engineDataRoot: string;
56
56
  instanceId: string;
57
- mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
57
+ mailboxRecipientLifecycle: Readonly<{
58
+ retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
59
+ listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
60
+ }> | undefined;
58
61
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
59
62
  memoryEngine: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
60
63
  memoryExportStores: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
@@ -108,14 +108,17 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
108
108
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
109
109
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
110
110
  sideQueryAccounting: import("../budget.js").SideQueryAccounting;
111
- toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
111
+ toolResultStore: import("@sema-agent/core").ToolResultStore | undefined;
112
112
  tracer: import("@sema-agent/core").TracerHook;
113
113
  backend: import("../index.js").StoreBackend | undefined;
114
114
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
115
115
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
116
116
  engineDataRoot: string;
117
117
  instanceId: string;
118
- mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
118
+ mailboxRecipientLifecycle: Readonly<{
119
+ retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
120
+ listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
121
+ }> | undefined;
119
122
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
120
123
  memoryEngine: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
121
124
  memoryExportStores: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
@@ -95,7 +95,6 @@ export async function runStage06(ctx) {
95
95
  ...(config.memoryProvenance !== undefined ? { provenance: config.memoryProvenance } : {}),
96
96
  onIncident: createOperatorFaceIncidentSink({ logger }, "memory_consolidation_incident"),
97
97
  onStopDetail: (audit) => logger.warn("memory_consolidation_stop_detail", audit),
98
- ...(sessionCaptureRecords !== undefined ? { captureRecords: sessionCaptureRecords } : {}),
99
98
  writeJudge: createOperatorValveWriteJudge({ ruleStoreProvider: permissionRuleProvider, config }),
100
99
  onNotice: createEngineNoticeForwarder(logger, defaultEngineNoticeRouter, metrics),
101
100
  })
@@ -142,10 +141,9 @@ export async function runStage06(ctx) {
142
141
  memorySyncRunner, toolResultStore: runnerOffloadStore, checkpointStore, sessionPolicyStore, runtimeCapsResolver, fileHistoryStore,
143
142
  permissionRuleStore: permissionRuleProvider,
144
143
  executionEnvFactory, lspManager, fleetBus, deploymentMods, workflowRunStore, workflowJournalStore,
145
- workflowAgentRegistry, workflowNotifyGate, workflowCompletionInbox, deliverWorkflowCompletion, orgMemoryAdmission,
144
+ workflowAgentRegistry, workflowNotifyGate, deliverWorkflowCompletion, orgMemoryAdmission,
146
145
  governanceSeams,
147
146
  sharedMemoryStores: sharedMemoryStore ? sharedMemoryStore : undefined,
148
- getRunStore: () => runStore,
149
147
  });
150
148
  const orgDeliveryGate = mountOrgDeliveryGate({ runnerDeps, directory: orgMemoryAdmission.directory, mailboxStore, backend, logger });
151
149
  const runner = new Runner(runnerDeps);
@@ -125,14 +125,17 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
125
125
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
126
126
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
127
127
  sideQueryAccounting: import("../budget.js").SideQueryAccounting;
128
- toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
128
+ toolResultStore: import("@sema-agent/core").ToolResultStore | undefined;
129
129
  tracer: import("@sema-agent/core").TracerHook;
130
130
  backend: import("../index.js").StoreBackend | undefined;
131
131
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
132
132
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
133
133
  engineDataRoot: string;
134
134
  instanceId: string;
135
- mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
135
+ mailboxRecipientLifecycle: Readonly<{
136
+ retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
137
+ listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
138
+ }> | undefined;
136
139
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
137
140
  memoryEngine: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
138
141
  memoryExportStores: import("../memory-scope-stores.js").MemoryScopeStores | undefined;