@sema-agent/server 7.137.0 → 7.139.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 (328) hide show
  1. package/MIGRATION.md +600 -142
  2. package/README.md +7 -3
  3. package/README.zh-CN.md +6 -3
  4. package/USAGE.md +132 -41
  5. package/deploy/sema-up/README.md +1 -1
  6. package/deploy/sema-up/lib/lanes.json +3 -2
  7. package/dist/adoption/wire.d.ts +3 -3
  8. package/dist/approval-card.d.ts +23 -16
  9. package/dist/approval-card.js +1 -0
  10. package/dist/audit.js +1 -0
  11. package/dist/background-agent-name.d.ts +5 -0
  12. package/dist/background-agent-name.js +5 -0
  13. package/dist/bench/s1/arms.d.ts +1 -1
  14. package/dist/bench/s1/arms.js +1 -3
  15. package/dist/bench/s1/run-firm.js +2 -2
  16. package/dist/boot/budget-tracing.d.ts +1 -12
  17. package/dist/boot/deployment-mods.d.ts +46 -16
  18. package/dist/boot/deployment-mods.js +82 -6
  19. package/dist/boot/device-lane.d.ts +8 -3
  20. package/dist/boot/device-lane.js +7 -2
  21. package/dist/boot/execution-env.d.ts +4 -2
  22. package/dist/boot/execution-env.js +16 -24
  23. package/dist/boot/execution-lane.d.ts +1 -1
  24. package/dist/boot/governance-seams.d.ts +12 -18
  25. package/dist/boot/governance-seams.js +10 -24
  26. package/dist/boot/leader.d.ts +3 -0
  27. package/dist/boot/leader.js +1 -0
  28. package/dist/boot/memory-consolidation.js +2 -2
  29. package/dist/boot/org-delivery.js +15 -2
  30. package/dist/boot/resolve-spec.d.ts +4 -1
  31. package/dist/boot/resolve-spec.js +29 -19
  32. package/dist/boot/retention-lane.d.ts +14 -8
  33. package/dist/boot/retention-lane.js +2 -8
  34. package/dist/boot/runner-deps.d.ts +10 -4
  35. package/dist/boot/runner-deps.js +2 -0
  36. package/dist/boot/session-faces.d.ts +0 -3
  37. package/dist/boot/session-faces.js +15 -8
  38. package/dist/boot/stage-02-web-admin-pull.js +2 -2
  39. package/dist/boot/stage-04-stores.d.ts +1 -12
  40. package/dist/boot/stage-05-execution-env.d.ts +3 -12
  41. package/dist/boot/stage-05-execution-env.js +8 -5
  42. package/dist/boot/stage-06-runners.d.ts +3 -12
  43. package/dist/boot/stage-06-runners.js +5 -3
  44. package/dist/boot/stage-07-capability-layer.d.ts +3 -12
  45. package/dist/boot/stage-07-capability-layer.js +2 -2
  46. package/dist/boot/stage-08-reapers.d.ts +3 -12
  47. package/dist/boot/stage-09-leader.d.ts +3 -12
  48. package/dist/boot/stage-09-leader.js +2 -3
  49. package/dist/boot/stage-10-http-server.d.ts +3 -12
  50. package/dist/boot/stage-10-http-server.js +5 -3
  51. package/dist/boot/stores.js +4 -4
  52. package/dist/boot/web-admin.d.ts +5 -2
  53. package/dist/boot/web-admin.js +5 -5
  54. package/dist/brain.js +5 -5
  55. package/dist/budget.d.ts +17 -15
  56. package/dist/budget.js +2 -2
  57. package/dist/capabilities/mcp-probe.d.ts +36 -11
  58. package/dist/capabilities/mcp-probe.js +44 -5
  59. package/dist/capabilities/scenarios.d.ts +1 -1
  60. package/dist/capability-facts.d.ts +21 -7
  61. package/dist/capability-facts.js +13 -3
  62. package/dist/checkpoint-identity.d.ts +13 -6
  63. package/dist/config-catalog.js +14 -8
  64. package/dist/config-invariants.d.ts +23 -3
  65. package/dist/config-invariants.js +42 -0
  66. package/dist/config-provider.d.ts +19 -24
  67. package/dist/config-provider.js +27 -12
  68. package/dist/config-types.d.ts +25 -12
  69. package/dist/config.d.ts +33 -0
  70. package/dist/config.js +52 -20
  71. package/dist/delegated-session-owner.d.ts +2 -2
  72. package/dist/deployment-shape.d.ts +7 -7
  73. package/dist/device-enrollment.d.ts +41 -2
  74. package/dist/device-enrollment.js +27 -12
  75. package/dist/device-store.d.ts +58 -85
  76. package/dist/device-store.js +19 -49
  77. package/dist/device-ws-hub.js +2 -1
  78. package/dist/env-name-allowlist-knobs.d.ts +5 -4
  79. package/dist/exec-cut.d.ts +60 -0
  80. package/dist/exec-cut.js +36 -0
  81. package/dist/execution-lane-caps.d.ts +19 -0
  82. package/dist/execution-lane-caps.js +10 -0
  83. package/dist/execution-placement.d.ts +259 -0
  84. package/dist/execution-placement.js +199 -0
  85. package/dist/field-conflict.d.ts +3 -2
  86. package/dist/field-conflict.js +1 -0
  87. package/dist/gate-settlement.d.ts +71 -0
  88. package/dist/gate-settlement.js +40 -0
  89. package/dist/hooks/classic-stations.d.ts +1 -0
  90. package/dist/hooks/classic-stations.js +1 -0
  91. package/dist/hooks/command-spawn.d.ts +2 -2
  92. package/dist/hooks/hook-runner.js +14 -14
  93. package/dist/hosted-posture.d.ts +2 -2
  94. package/dist/http/admission.js +10 -19
  95. package/dist/http/checkpoint-ctx.d.ts +21 -12
  96. package/dist/http/checkpoint-ctx.js +4 -2
  97. package/dist/http/claimed-run.d.ts +1 -1
  98. package/dist/http/dispatch.d.ts +4 -0
  99. package/dist/http/dispatch.js +3 -0
  100. package/dist/http/durable-run-leg.js +12 -6
  101. package/dist/http/execution-context.d.ts +218 -0
  102. package/dist/http/execution-context.js +330 -0
  103. package/dist/http/memory-compliance-failure-reply.js +3 -0
  104. package/dist/http/resume-legs.d.ts +5 -11
  105. package/dist/http/resume-legs.js +179 -104
  106. package/dist/http/route-ctx.d.ts +44 -59
  107. package/dist/http/route-ctx.js +2 -5
  108. package/dist/http/routes/a2a-serve.js +10 -4
  109. package/dist/http/routes/agents-roster.d.ts +1 -1
  110. package/dist/http/routes/agents-roster.js +5 -1
  111. package/dist/http/routes/approvals-assistant.js +6 -6
  112. package/dist/http/routes/background.d.ts +29 -1
  113. package/dist/http/routes/background.js +29 -2
  114. package/dist/http/routes/capabilities.js +12 -10
  115. package/dist/http/routes/devices.d.ts +13 -19
  116. package/dist/http/routes/devices.js +21 -26
  117. package/dist/http/routes/mcp-reconnect.d.ts +3 -2
  118. package/dist/http/routes/mcp-reconnect.js +7 -5
  119. package/dist/http/routes/memory-consolidation.d.ts +1 -1
  120. package/dist/http/routes/memory-origin.d.ts +1 -1
  121. package/dist/http/routes/rules.js +3 -3
  122. package/dist/http/routes/runs.js +11 -7
  123. package/dist/http/routes/session-sync.js +110 -15
  124. package/dist/http/routes/sessions.d.ts +6 -0
  125. package/dist/http/routes/sessions.js +119 -13
  126. package/dist/http/routes/side-query.d.ts +12 -4
  127. package/dist/http/routes/side-query.js +6 -8
  128. package/dist/http/routes/tasks.js +800 -782
  129. package/dist/http/server.d.ts +61 -39
  130. package/dist/http/server.js +11 -0
  131. package/dist/http/session-inherit-env.d.ts +3 -4
  132. package/dist/http/session-inherit-env.js +1 -1
  133. package/dist/http/wire-types.d.ts +22 -18
  134. package/dist/identity-source.d.ts +1 -1
  135. package/dist/index.d.ts +3 -0
  136. package/dist/index.js +1 -0
  137. package/dist/leader/wire.d.ts +7 -0
  138. package/dist/leader/wire.js +5 -4
  139. package/dist/mcp-assertion-header.d.ts +51 -40
  140. package/dist/mcp-assertion-header.js +10 -11
  141. package/dist/mcp-authorization-face.d.ts +27 -0
  142. package/dist/mcp-authorization-face.js +15 -0
  143. package/dist/memory-operator-faces.d.ts +13 -4
  144. package/dist/memory-operator-faces.js +1 -17
  145. package/dist/memory-sync-client.d.ts +53 -14
  146. package/dist/memory-sync-client.js +187 -92
  147. package/dist/memory-sync.d.ts +1 -1
  148. package/dist/memory-sync.js +3 -2
  149. package/dist/model-route-gap.d.ts +6 -22
  150. package/dist/model-route-gap.js +7 -5
  151. package/dist/mods-declaration.d.ts +110 -0
  152. package/dist/mods-declaration.js +109 -0
  153. package/dist/observability/cost-taxonomy.d.ts +2 -2
  154. package/dist/observability/err-text.d.ts +5 -0
  155. package/dist/observability/err-text.js +9 -0
  156. package/dist/observability/fail-open.d.ts +17 -1
  157. package/dist/observability/fail-open.js +17 -1
  158. package/dist/observability/run-terminal.js +0 -1
  159. package/dist/observability/secret-env-scrub.d.ts +1 -1
  160. package/dist/observability/secret-env-scrub.js +1 -1
  161. package/dist/orchestration/workflow-notify-journal.js +4 -4
  162. package/dist/org-memory-admission.d.ts +4 -3
  163. package/dist/org-memory-admission.js +6 -6
  164. package/dist/parked-decide.d.ts +49 -11
  165. package/dist/parked-decide.js +25 -26
  166. package/dist/parked-revive-surface.d.ts +12 -15
  167. package/dist/parked-revive-surface.js +3 -6
  168. package/dist/peer-seat.d.ts +156 -0
  169. package/dist/peer-seat.js +273 -0
  170. package/dist/permission-rule-vocab.d.ts +7 -7
  171. package/dist/permission-rule-vocab.js +3 -3
  172. package/dist/plain-string-record.d.ts +38 -0
  173. package/dist/plain-string-record.js +38 -0
  174. package/dist/plugins/approval-ask-store-file.d.ts +7 -0
  175. package/dist/plugins/approval-ask-store-file.js +11 -0
  176. package/dist/plugins/approval-ask-store-memory.d.ts +6 -0
  177. package/dist/plugins/approval-ask-store-memory.js +12 -0
  178. package/dist/plugins/approval-ask-store-sql.d.ts +22 -5
  179. package/dist/plugins/approval-ask-store-sql.js +30 -12
  180. package/dist/plugins/background-agent-store-sql.js +6 -3
  181. package/dist/plugins/caching-session-store.d.ts +11 -2
  182. package/dist/plugins/caching-session-store.js +15 -3
  183. package/dist/plugins/checkpoint-store-sql.d.ts +21 -25
  184. package/dist/plugins/checkpoint-store-sql.js +13 -15
  185. package/dist/plugins/device-store-sql.d.ts +25 -51
  186. package/dist/plugins/device-store-sql.js +49 -103
  187. package/dist/plugins/execution-placement-sql.d.ts +151 -0
  188. package/dist/plugins/execution-placement-sql.js +223 -0
  189. package/dist/plugins/file-history-store-sql.d.ts +7 -6
  190. package/dist/plugins/file-history-store-sql.js +8 -7
  191. package/dist/plugins/file-run-store.d.ts +6 -1
  192. package/dist/plugins/file-run-store.js +4 -0
  193. package/dist/plugins/fork-routing-session-store.d.ts +6 -0
  194. package/dist/plugins/fork-routing-session-store.js +16 -0
  195. package/dist/plugins/k8s-pod-reaper.d.ts +2 -8
  196. package/dist/plugins/k8s-pod-reaper.js +3 -3
  197. package/dist/plugins/local-checkpoint-store.d.ts +1 -11
  198. package/dist/plugins/local-checkpoint-store.js +0 -1
  199. package/dist/plugins/local-session-store.d.ts +183 -45
  200. package/dist/plugins/local-session-store.js +412 -105
  201. package/dist/plugins/mailbox-store-sql.d.ts +11 -3
  202. package/dist/plugins/mailbox-store-sql.js +103 -15
  203. package/dist/plugins/memory-key-guards.d.ts +4 -0
  204. package/dist/plugins/memory-key-guards.js +1 -0
  205. package/dist/plugins/memory-run-store.d.ts +1 -1
  206. package/dist/plugins/memory-sync-store-pg.d.ts +16 -5
  207. package/dist/plugins/memory-sync-store-tidb.d.ts +3 -3
  208. package/dist/plugins/one-time-migrations.d.ts +117 -6
  209. package/dist/plugins/one-time-migrations.js +383 -14
  210. package/dist/plugins/outcome-ledger-sql.d.ts +2 -2
  211. package/dist/plugins/permission-rule-store-sql.d.ts +13 -15
  212. package/dist/plugins/permission-rule-store-sql.js +34 -29
  213. package/dist/plugins/pg-pool.d.ts +7 -3
  214. package/dist/plugins/pg-session-storage.d.ts +41 -22
  215. package/dist/plugins/pg-session-storage.js +136 -55
  216. package/dist/plugins/remote-env-adb.d.ts +22 -4
  217. package/dist/plugins/remote-env-adb.js +70 -62
  218. package/dist/plugins/remote-env-device.d.ts +32 -12
  219. package/dist/plugins/remote-env-device.js +18 -17
  220. package/dist/plugins/remote-env-e2b.d.ts +19 -3
  221. package/dist/plugins/remote-env-e2b.js +41 -42
  222. package/dist/plugins/remote-env-file-error.d.ts +2 -0
  223. package/dist/plugins/remote-env-file-error.js +1 -1
  224. package/dist/plugins/remote-env-host.d.ts +23 -8
  225. package/dist/plugins/remote-env-host.js +66 -70
  226. package/dist/plugins/remote-env-k8s.d.ts +13 -16
  227. package/dist/plugins/remote-env-k8s.js +61 -54
  228. package/dist/plugins/remote-env-local-docker.d.ts +30 -5
  229. package/dist/plugins/remote-env-local-docker.js +46 -59
  230. package/dist/plugins/remote-env-ssh.d.ts +18 -4
  231. package/dist/plugins/remote-env-ssh.js +72 -56
  232. package/dist/plugins/remote-shell.d.ts +100 -3
  233. package/dist/plugins/remote-shell.js +166 -2
  234. package/dist/plugins/retention-store-sql.d.ts +23 -8
  235. package/dist/plugins/retention-store-sql.js +13 -1
  236. package/dist/plugins/run-store-sql.d.ts +13 -3
  237. package/dist/plugins/run-store-sql.js +5 -0
  238. package/dist/plugins/schema-consistency.d.ts +15 -5
  239. package/dist/plugins/schema-consistency.js +14 -8
  240. package/dist/plugins/schema-drift-sentence.d.ts +27 -0
  241. package/dist/plugins/schema-drift-sentence.js +38 -0
  242. package/dist/plugins/session-fork.d.ts +63 -12
  243. package/dist/plugins/session-fork.js +38 -21
  244. package/dist/plugins/session-ownership.d.ts +7 -0
  245. package/dist/plugins/session-ownership.js +5 -0
  246. package/dist/plugins/session-row-sql.d.ts +22 -0
  247. package/dist/plugins/session-row-sql.js +81 -0
  248. package/dist/plugins/session-store.d.ts +1 -1
  249. package/dist/plugins/session-workspace-cell.d.ts +17 -0
  250. package/dist/plugins/session-workspace-cell.js +38 -0
  251. package/dist/plugins/store-backend.d.ts +1 -1
  252. package/dist/plugins/store-backend.js +26 -14
  253. package/dist/plugins/store-contracts.d.ts +25 -5
  254. package/dist/plugins/tidb-pool.d.ts +12 -7
  255. package/dist/plugins/tidb-pool.js +15 -3
  256. package/dist/plugins/tidb-session-store.d.ts +74 -28
  257. package/dist/plugins/tidb-session-store.js +132 -53
  258. package/dist/plugins/tool-result-store-sql.d.ts +16 -8
  259. package/dist/plugins/tool-result-store-sql.js +26 -17
  260. package/dist/plugins/worktree-isolation.d.ts +3 -2
  261. package/dist/plugins/worktree-isolation.js +1 -7
  262. package/dist/project-identity.d.ts +1 -14
  263. package/dist/project-identity.js +0 -4
  264. package/dist/project-memory.d.ts +9 -15
  265. package/dist/project-memory.js +5 -4
  266. package/dist/request-key-closure.js +1 -1
  267. package/dist/request-value-closure.d.ts +6 -7
  268. package/dist/request-value-closure.js +1 -3
  269. package/dist/rules-consent.js +6 -4
  270. package/dist/run-local.d.ts +6 -0
  271. package/dist/run-local.js +36 -26
  272. package/dist/runs.d.ts +9 -2
  273. package/dist/runs.js +9 -2
  274. package/dist/sandbox-git-plane.d.ts +2 -2
  275. package/dist/security.d.ts +38 -12
  276. package/dist/security.js +8 -2
  277. package/dist/server-secret-env.d.ts +15 -8
  278. package/dist/server-secret-env.js +4 -2
  279. package/dist/session-children-retire.d.ts +27 -9
  280. package/dist/session-children-retire.js +9 -5
  281. package/dist/session-incarnation.d.ts +19 -10
  282. package/dist/session-incarnation.js +5 -3
  283. package/dist/session-row.d.ts +114 -5
  284. package/dist/session-row.js +55 -5
  285. package/dist/session-titler.d.ts +2 -2
  286. package/dist/session-workspace.d.ts +130 -0
  287. package/dist/session-workspace.js +83 -0
  288. package/dist/spec-fields.d.ts +1 -1
  289. package/dist/standing-answer-grant.d.ts +2 -13
  290. package/dist/standing-answer-grant.js +0 -7
  291. package/dist/task-a2a.d.ts +44 -14
  292. package/dist/task-a2a.js +46 -20
  293. package/dist/task-cwd.d.ts +6 -1
  294. package/dist/task-mcp.d.ts +33 -20
  295. package/dist/task-mcp.js +46 -22
  296. package/dist/tool-approval.d.ts +38 -8
  297. package/dist/tool-approval.js +57 -13
  298. package/dist/trace/core-keyset-guard.d.ts +33 -18
  299. package/dist/trace/engine-notice-wire.d.ts +1 -1
  300. package/dist/trace/engine-notice-wire.js +2 -0
  301. package/dist/trace/exit-seat.d.ts +20 -1
  302. package/dist/trace/exit-seat.js +3 -0
  303. package/dist/trace/extension-call-face.d.ts +33 -0
  304. package/dist/trace/extension-call-face.js +39 -0
  305. package/dist/trace/project.d.ts +26 -7
  306. package/dist/trace/project.js +30 -3
  307. package/dist/trace/redact.js +42 -13
  308. package/dist/trace/self-minted-wire.d.ts +240 -12
  309. package/dist/trace/self-minted-wire.js +100 -4
  310. package/dist/trace/wire-projection-faces.d.ts +6 -6
  311. package/dist/trace/wire-projection-faces.js +6 -5
  312. package/dist/url-refusal.d.ts +1 -1
  313. package/dist/user-authored-text.d.ts +2 -2
  314. package/dist/user-authored-text.js +16 -1
  315. package/dist/web-admin-client/apply-effective.d.ts +17 -3
  316. package/dist/web-admin-client/apply-effective.js +20 -10
  317. package/dist/web-admin-client/center-request.d.ts +3 -2
  318. package/dist/web-admin-client/center-request.js +2 -3
  319. package/dist/web-admin-client/skills-mcp.d.ts +8 -4
  320. package/dist/web-admin-client/skills-mcp.js +32 -18
  321. package/dist/web-admin-client/types.d.ts +11 -0
  322. package/package.json +3 -3
  323. package/wire-changes/server@7.138.0.json +446 -0
  324. package/wire-changes/server@7.139.0.json +348 -0
  325. package/dist/http/device-placement.d.ts +0 -175
  326. package/dist/http/device-placement.js +0 -145
  327. package/dist/http/mcp-remote-text.d.ts +0 -5
  328. package/dist/http/mcp-remote-text.js +0 -7
@@ -32,6 +32,7 @@ export const CONFIG_ADVISORY_CLASSIFICATIONS = new Set([
32
32
  "file-history-no-store",
33
33
  "interaction-posture-refused",
34
34
  "memory-tools-not-mounted",
35
+ "peer-seat-hold",
35
36
  "sandbox-admission-unavailable",
36
37
  "shared-memory-not-mounted",
37
38
  ]);
@@ -131,6 +132,7 @@ export function createSharedRunnerDeps(ctx) {
131
132
  lockedConfig: ctx.governanceSeams.lockedConfig,
132
133
  retentionPolicy: ctx.governanceSeams.retentionPolicy,
133
134
  mcpRevocations: ctx.mcpRevocations ? ctx.mcpRevocations : undefined,
135
+ peerSeat: ctx.peerDesk.seat,
134
136
  };
135
137
  return shared;
136
138
  }
@@ -21,7 +21,6 @@ import type { createSessionStore } from "../plugins/session-store.js";
21
21
  import type { TaskAttachmentStore } from "../plugins/task-attachment-store.js";
22
22
  import type { FileHistoryErasureFace } from "../file-history-capture.js";
23
23
  import type { OwnerAwareSessionStore } from "../security.js";
24
- import type { DeviceStore } from "../device-store.js";
25
24
  import { SessionWatchRegistry } from "../session-watch.js";
26
25
  import type { TaskListLane } from "./task-list-lane.js";
27
26
  import { type RunnerDeps } from "@sema-agent/core";
@@ -48,8 +47,6 @@ export interface SessionFacesCtx {
48
47
  workflowCompletionInbox: WorkflowCompletionInbox | undefined;
49
48
  /** [ref]:会话级任务清单车道(E21 级联的一条腿)。缺席 = 装配未接本车道 ⇒ 无清单可删。 */
50
49
  taskListLane: TaskListLane | undefined;
51
- /** device lane 的四表店(E21 级联的一条腿:`device_session` 绑定行随会话删)。缺席 = 非 SQL 后端。 */
52
- deviceStore: DeviceStore | undefined;
53
50
  /** per-session cwd/shellEnv 登记簿的清除口(E21 级联的一条腿,codex R1-F1)。缺席 = 装配未接。 */
54
51
  dropSessionScoped: ((sid: string) => void) | undefined;
55
52
  /** [ref]:会话盒(`session.<id>`)的信箱 + 它的收件人生命周期面(E21 级联的一条腿)。**成对**在场
@@ -6,11 +6,12 @@ import { setLeafAdvanceListener } from "../session-leaf-bus.js";
6
6
  import { SessionWatchRegistry, posIntEnv } from "../session-watch.js";
7
7
  import { defaultTaskRegistry, peerSessionBoxHandle } from "@sema-agent/core";
8
8
  import { reapSessionBackgroundHard } from "../background-session-reap.js";
9
- import { probeSessionChildren, retireSessionChildren, SessionChildrenStopIncompleteError } from "../session-children-retire.js";
9
+ import { probeSessionChildren, retireSessionChildren, sessionChildrenScope, SessionChildrenStopIncompleteError } from "../session-children-retire.js";
10
+ import { SessionActiveRunError } from "../execution-placement.js";
10
11
  import { headReadOf, redactIncarnations } from "../session-incarnation.js";
11
12
  import { recordFailOpen } from "../observability/fail-open.js";
12
13
  export function createSessionFaces(ctx) {
13
- const { config, logger, metrics, localRoot, backend, sessionStore, runStore, checkpointStore, toolResultStore, resumeAnchorStore, approvalExemptionStore, sessionPolicyStore, taskAttachmentStore, fileHistoryErasure, workflowCompletionInbox, taskListLane, deviceStore, dropSessionScoped, mailboxStore, mailboxRecipientLifecycle, backgroundAgentStore, userInputLedgerStore, spaceReclaimer, } = ctx;
14
+ const { config, logger, metrics, localRoot, backend, sessionStore, runStore, checkpointStore, toolResultStore, resumeAnchorStore, approvalExemptionStore, sessionPolicyStore, taskAttachmentStore, fileHistoryErasure, workflowCompletionInbox, taskListLane, dropSessionScoped, mailboxStore, mailboxRecipientLifecycle, backgroundAgentStore, userInputLedgerStore, spaceReclaimer, } = ctx;
14
15
  const mysqlPool = backend?.mysqlPool();
15
16
  const auditPgPool = backend?.pgPool();
16
17
  const auditLocalRoot = backend?.kind === "local" ? (config.localDataRoot ?? localRoot) : undefined;
@@ -49,7 +50,7 @@ export function createSessionFaces(ctx) {
49
50
  return { deleted: false };
50
51
  spaceKey = spaceReclaimer !== undefined ? head.incarnation : undefined;
51
52
  }
52
- const childScope = owner ?? "default";
53
+ const childScope = sessionChildrenScope(owner);
53
54
  const reach = await probeSessionChildren({ agentStore: backgroundAgentStore, checkpointStore, registry: defaultTaskRegistry }, sessionId, childScope);
54
55
  if (!reach.reachable) {
55
56
  logger.warn("session_delete_children_still_alive", { sessionId, remaining: reach.unreachableHandles.length, handles: reach.unreachableHandles });
@@ -60,8 +61,8 @@ export function createSessionFaces(ctx) {
60
61
  return { active: runs.active };
61
62
  {
62
63
  const children = await retireSessionChildren({ agentStore: backgroundAgentStore, checkpointStore, registry: defaultTaskRegistry }, sessionId, childScope);
63
- if (children.found > 0)
64
- logger.info("session_children_retired", { sessionId, found: children.found, stopped: children.stopped, rounds: children.rounds });
64
+ if (children.observed.length > 0)
65
+ logger.info("session_children_retired", { sessionId, found: children.observed.length, stopped: children.stopped, rounds: children.rounds });
65
66
  if (children.stopped === "incomplete") {
66
67
  logger.warn("session_delete_children_stop_incomplete", { sessionId, remaining: children.remainingHandles.length, handles: children.remainingHandles });
67
68
  throw new SessionChildrenStopIncompleteError(sessionId, children.remainingHandles.length);
@@ -91,8 +92,6 @@ export function createSessionFaces(ctx) {
91
92
  await userInputLedgerStore.deleteBySession(sessionId);
92
93
  if (taskListLane)
93
94
  await taskListLane.deleteBySession(sessionId);
94
- if (deviceStore)
95
- await deviceStore.deleteByRootSession(sessionId);
96
95
  dropSessionScoped?.(sessionId);
97
96
  if (fileHistoryErasure) {
98
97
  if (typeof fileHistoryErasure.deleteBySession === "function")
@@ -122,7 +121,15 @@ export function createSessionFaces(ctx) {
122
121
  }
123
122
  if (peerBox !== undefined)
124
123
  await peerBox.store.drop(peerBox.scope, peerBox.handle);
125
- const historyDeleted = await ownerAware.deleteSession(sessionId, owner);
124
+ let historyDeleted;
125
+ try {
126
+ historyDeleted = await ownerAware.deleteSession(sessionId, owner);
127
+ }
128
+ catch (err) {
129
+ if (err instanceof SessionActiveRunError)
130
+ return { active: err.activeTaskId };
131
+ throw err;
132
+ }
126
133
  sessionWatchRegistry?.dropSession(sessionId);
127
134
  if (historyDeleted && spaceReclaimer !== undefined && spaceKey !== undefined) {
128
135
  void spaceReclaimer.reclaim([{ sessionId, spaceKey }]).catch((err) => {
@@ -1,7 +1,7 @@
1
1
  import { createUnpricedCeilingVerdict } from "./unpriced-ceiling-verdict.js";
2
2
  import { createWebAdminRuntime } from "./web-admin.js";
3
3
  import { composeExecutionLane, FILE_SOURCED_LANES } from "./execution-lane.js";
4
- import { serviceConfigSourceKind } from "../config-provider.js";
4
+ import { configSourceKind } from "../config-provider.js";
5
5
  import { logConfigDirMigration, migrateLocalConfigDirectory } from "../config-d-migration.js";
6
6
  import { assertLocalConfigDirTrusted } from "../config-dir-trust.js";
7
7
  import { defaultModelRefusal, refusedNameMintedRefusal } from "../model-entry-refusal.js";
@@ -10,7 +10,7 @@ import { judgeServedModelRoute } from "../model-route-endpoint.js";
10
10
  import { servedModelTableLeg } from "../model-select.js";
11
11
  export async function runStage02(ctx) {
12
12
  const { config, localRoot, logger, metrics } = ctx;
13
- const configSource = serviceConfigSourceKind(config);
13
+ const configSource = configSourceKind(config);
14
14
  if (configSource === "local") {
15
15
  await assertLocalConfigDirTrusted({ root: localRoot, declaredOwnerUid: config.configLocalOwnerUid });
16
16
  logConfigDirMigration(logger, await migrateLocalConfigDirectory(localRoot));
@@ -27,18 +27,7 @@ export declare function runStage04(ctx: Awaited<ReturnType<typeof runStage03>>):
27
27
  ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
28
28
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
29
29
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
30
- sideQueryAccounting: (principal: string | undefined, r: {
31
- model: string;
32
- usage?: {
33
- input?: number;
34
- output?: number;
35
- cacheRead?: number;
36
- cacheWrite?: number;
37
- cost?: {
38
- total?: number;
39
- };
40
- };
41
- }) => void;
30
+ sideQueryAccounting: import("../budget.js").SideQueryAccounting;
42
31
  toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
43
32
  tracer: import("@sema-agent/core").TracerHook;
44
33
  backend: import("../index.js").StoreBackend | undefined;
@@ -1,7 +1,9 @@
1
1
  import type { runStage04 } from "./stage-04-stores.js";
2
2
  export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>): Promise<{
3
3
  deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
4
+ deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
4
5
  deviceLane: import("./device-lane.js").DeviceLane | undefined;
6
+ peerDesk: import("../peer-seat.js").PeerDesk;
5
7
  dropSessionScoped: (sid: string) => void;
6
8
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
7
9
  fenceSessionOwner: (sid: string, owner: string | null) => void;
@@ -44,18 +46,7 @@ export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>):
44
46
  ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
45
47
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
46
48
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
47
- sideQueryAccounting: (principal: string | undefined, r: {
48
- model: string;
49
- usage?: {
50
- input?: number;
51
- output?: number;
52
- cacheRead?: number;
53
- cacheWrite?: number;
54
- cost?: {
55
- total?: number;
56
- };
57
- };
58
- }) => void;
49
+ sideQueryAccounting: import("../budget.js").SideQueryAccounting;
59
50
  toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
60
51
  tracer: import("@sema-agent/core").TracerHook;
61
52
  backend: import("../index.js").StoreBackend | undefined;
@@ -1,4 +1,4 @@
1
- import { assertDeploymentModsAdmitted, createDeploymentMods } from "./deployment-mods.js";
1
+ import { assembleDeploymentMods } from "./deployment-mods.js";
2
2
  import { isBrandedDeployment } from "../capabilities/brand-identity.js";
3
3
  import { assertDeviceLaneWired, createDeviceLane } from "./device-lane.js";
4
4
  import { assertWorkspaceSpaceReadable, createExecutionEnv } from "./execution-env.js";
@@ -7,9 +7,10 @@ import * as facts from "../capability-facts.js";
7
7
  import { sessionStoreLabelOf } from "../store-posture.js";
8
8
  import { runStore } from "./late-binds.js";
9
9
  import { SANDBOX_GIT_PLANE_OFF_TEXT } from "../sandbox-git-plane.js";
10
+ import { createPeerDesk } from "../peer-seat.js";
10
11
  export async function runStage05(ctx) {
11
12
  const { backend, config, instanceId, logger, metrics, sessionStore, taskAttachmentStore } = ctx;
12
- const deviceLane = config.remoteExec?.provider === "device" ? createDeviceLane({ config, logger, metrics, backend, replicaId: instanceId }) : undefined;
13
+ const deviceLane = config.remoteExec?.provider === "device" ? createDeviceLane({ config, logger, metrics, backend, seat: sessionStore.executionPlacement, replicaId: instanceId }) : undefined;
13
14
  const headOf = headReadOf(sessionStore);
14
15
  const spaceCommits = backend !== undefined ? () => runStore : undefined;
15
16
  const { perTaskImage, sessionEnvSelection, perSessionCwd, setSessionCwd, setSessionShellEnv, setSessionInheritEnv, fenceSessionOwner, dropSessionScoped, executionEnvFactory, worktreeReap, sendUserFileTaskEnvs, lspManager, spaceReclaimer, sandboxSecretSeatGate, sandboxPodReaper, readSandboxGitPlane, } = createExecutionEnv({ config, logger, metrics, taskAttachmentStore, ...(deviceLane ? { deviceLane } : {}), ...(spaceCommits !== undefined ? { spaceCommits } : {}), ...(headOf !== undefined ? { headOf } : {}), ...(backend !== undefined ? { runRows: () => runStore } : {}) });
@@ -23,10 +24,12 @@ export async function runStage05(ctx) {
23
24
  else if (sandboxGitPlane.reason !== "single_user" && sandboxGitPlane.reason !== "lane_without_boundary") {
24
25
  logger.info("credential_plane_sandbox_git", { state: "off", reason: sandboxGitPlane.reason, why: SANDBOX_GIT_PLANE_OFF_TEXT[sandboxGitPlane.reason] });
25
26
  }
26
- const deploymentMods = createDeploymentMods({ metrics, ...(config.toolTrace ? { traceLogger: logger } : {}), brandIdentity: isBrandedDeployment(config) });
27
27
  if (config.toolTrace)
28
28
  logger.info("tool_trace_enabled", {});
29
- await assertDeploymentModsAdmitted(deploymentMods);
30
- return { ...ctx, deploymentMods, deviceLane, dropSessionScoped, executionEnvFactory, fenceSessionOwner, lspManager, spaceReclaimer, sandboxPodReaper, sandboxGitPlane, perSessionCwd, perTaskImage, sendUserFileTaskEnvs, sessionEnvSelection, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, worktreeReap };
29
+ const { registrations: deploymentMods, loaded: deploymentModsLoaded } = await assembleDeploymentMods({ metrics, ...(config.toolTrace ? { traceLogger: logger } : {}), brandIdentity: isBrandedDeployment(config), declaration: config.modsDeclaration, logger });
30
+ const peerDesk = createPeerDesk({ log: logger });
31
+ metrics.dynamicGauge("peer_registry_entries", "Peer desk entries (declared peer credentials registered for in-flight legs and the roster)", () => peerDesk.size().entries);
32
+ metrics.dynamicGauge("peer_registry_holders", "Peer desk holders of entries (host leases and engine holds), summed across entries", () => peerDesk.size().holders);
33
+ return { ...ctx, deploymentMods, deploymentModsLoaded, deviceLane, peerDesk, dropSessionScoped, executionEnvFactory, fenceSessionOwner, lspManager, spaceReclaimer, sandboxPodReaper, sandboxGitPlane, perSessionCwd, perTaskImage, sendUserFileTaskEnvs, sessionEnvSelection, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, worktreeReap };
31
34
  }
32
35
  //# sourceMappingURL=stage-05-execution-env.js.map
@@ -64,7 +64,9 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
64
64
  workflowsCapable: boolean;
65
65
  orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
66
66
  deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
67
+ deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
67
68
  deviceLane: import("./device-lane.js").DeviceLane | undefined;
69
+ peerDesk: import("../peer-seat.js").PeerDesk;
68
70
  dropSessionScoped: (sid: string) => void;
69
71
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
70
72
  fenceSessionOwner: (sid: string, owner: string | null) => void;
@@ -107,18 +109,7 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
107
109
  ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
108
110
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
109
111
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
110
- sideQueryAccounting: (principal: string | undefined, r: {
111
- model: string;
112
- usage?: {
113
- input?: number;
114
- output?: number;
115
- cacheRead?: number;
116
- cacheWrite?: number;
117
- cost?: {
118
- total?: number;
119
- };
120
- };
121
- }) => void;
112
+ sideQueryAccounting: import("../budget.js").SideQueryAccounting;
122
113
  toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
123
114
  tracer: import("@sema-agent/core").TracerHook;
124
115
  backend: import("../index.js").StoreBackend | undefined;
@@ -28,8 +28,9 @@ import { createSharedMemoryScopeAuthorizer } from "../shared-memory-scope-author
28
28
  import { mountOrgDeliveryGate } from "./org-delivery.js";
29
29
  import { parkedAskRedeem, runStore } from "./late-binds.js";
30
30
  import { withInternalRunEnvs } from "../internal-run-env.js";
31
+ import { retentionSweepRuns } from "../plugins/retention-store-sql.js";
31
32
  export async function runStage06(ctx) {
32
- const { backend, backgroundAgentStore, brain, engineDataRoot, config, webAdmin, consolidationValve, deploymentMods, executionEnvFactory, fileHistoryStore, localRoot, logger, lspManager, mailboxRecipientLifecycle, mailboxStore, memoryEngine, memorySyncRunner, metrics, perSessionCwd, permissionRuleProvider, pricing, rosterStore, ruleConsent, sendUserFileTaskEnvs, sessionCaptureRecordStore, sessionCaptureRecords, sessionPolicyStore, sessionStore, taskAttachmentStore, taskListLane, toolResultStore, tracer, usageWindowStore } = ctx;
33
+ const { backend, backgroundAgentStore, brain, engineDataRoot, peerDesk, config, webAdmin, consolidationValve, deploymentMods, executionEnvFactory, fileHistoryStore, localRoot, logger, lspManager, mailboxRecipientLifecycle, mailboxStore, memoryEngine, memorySyncRunner, metrics, perSessionCwd, permissionRuleProvider, pricing, rosterStore, ruleConsent, sendUserFileTaskEnvs, sessionCaptureRecordStore, sessionCaptureRecords, sessionPolicyStore, sessionStore, taskAttachmentStore, taskListLane, toolResultStore, tracer, usageWindowStore } = ctx;
33
34
  const { sqlWorkflowRunStore, workflowNotifyJournal, workflowCompletionInbox, deliverWorkflowCompletion, workflowNotifyGate, fleetBus, workflowRunStore, workflowJournalStore, outcomeSink, workflowRecoverOpts, workflowAgentRegistry, subagentSteerRegistry, workflowAgentSessionIndex, workflowParkDecisions, } = createWorkflowOrchestration({ config, logger, metrics, localRoot, backend, getRunStore: () => runStore });
34
35
  const parkCommitted = backend?.checkpoint && config.durableApproval ? createParkCommitWatch(backend.checkpoint(logger)) : undefined;
35
36
  const checkpointStore = parkCommitted?.store;
@@ -69,7 +70,6 @@ export async function runStage06(ctx) {
69
70
  const retentionLaneStore = backend?.retentionLane?.();
70
71
  assertRetentionLaneWirable({
71
72
  intervalSec: config.retentionSweep.intervalSec,
72
- policy: config.retentionPolicy,
73
73
  executor: retentionExecutor,
74
74
  stores: [
75
75
  { name: "sessionStore", store: sessionStore },
@@ -125,7 +125,7 @@ export async function runStage06(ctx) {
125
125
  { name: "checkpointStore", store: checkpointStore },
126
126
  { name: "toolResultStore", store: runnerOffloadStore },
127
127
  ],
128
- retentionExecutorWired: config.retentionSweep.intervalSec > 0 && retentionExecutor !== undefined && retentionLaneStore !== undefined,
128
+ retentionExecutor: retentionSweepRuns(config.retentionSweep) ? (retentionExecutor ?? null) : null,
129
129
  });
130
130
  const mcpRevocations = webAdmin.takeMcpRevocations();
131
131
  const workflowModelAllowlistSnapshot = workflowModelAllowlistFor(config) ?? [];
@@ -136,6 +136,7 @@ export async function runStage06(ctx) {
136
136
  config, logger, metrics, localRoot, promptSource: webAdmin.promptSource, rosterStore, backgroundAgentStore, mailboxStore, mailboxRecipientLifecycle, usageWindowStore, brain,
137
137
  pricing, tracer, outcomeSink, elicitation, question, toolApproval, sessionStore, memoryEngine,
138
138
  engineDataRoot,
139
+ peerDesk,
139
140
  sessionCaptureRecords,
140
141
  memorySyncRunner, toolResultStore: runnerOffloadStore, checkpointStore, sessionPolicyStore, runtimeCapsResolver, fileHistoryStore,
141
142
  permissionRuleStore: permissionRuleProvider,
@@ -220,6 +221,7 @@ export async function runStage06(ctx) {
220
221
  governanceSeams,
221
222
  sharedMemoryStores: sharedMemoryStore ? sharedMemoryStore : undefined,
222
223
  engineDataRoot,
224
+ peerDesk,
223
225
  }),
224
226
  sessionStore: subRunnerSessions,
225
227
  onBackgroundChildEvent: runnerDeps.onBackgroundChildEvent ? runnerDeps.onBackgroundChildEvent : undefined,
@@ -80,7 +80,9 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
80
80
  workflowsCapable: boolean;
81
81
  orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
82
82
  deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
83
+ deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
83
84
  deviceLane: import("./device-lane.js").DeviceLane | undefined;
85
+ peerDesk: import("../peer-seat.js").PeerDesk;
84
86
  dropSessionScoped: (sid: string) => void;
85
87
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
86
88
  fenceSessionOwner: (sid: string, owner: string | null) => void;
@@ -123,18 +125,7 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
123
125
  ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
124
126
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
125
127
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
126
- sideQueryAccounting: (principal: string | undefined, r: {
127
- model: string;
128
- usage?: {
129
- input?: number;
130
- output?: number;
131
- cacheRead?: number;
132
- cacheWrite?: number;
133
- cost?: {
134
- total?: number;
135
- };
136
- };
137
- }) => void;
128
+ sideQueryAccounting: import("../budget.js").SideQueryAccounting;
138
129
  toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
139
130
  tracer: import("@sema-agent/core").TracerHook;
140
131
  backend: import("../index.js").StoreBackend | undefined;
@@ -29,7 +29,7 @@ import { buildDisplaySafeUrl } from "../trace/redact.js";
29
29
  import * as facts from "../capability-facts.js";
30
30
  import { WEB_ADMIN_ENV } from "@sema-agent/settings-schema";
31
31
  export async function runStage07(ctx) {
32
- const { approvalAskAudit, approvalExemptionStore, backend, backgroundAgentStore, brain, checkpointStore, config, webAdmin, counterDegradeHook, durableEnabled, instanceId, localRoot, logger, question, runner, runnerDeps, sendUserFileToolSpec, sessionEnvSelection, sessionStore, subRunner, subRunnerSessions, taskListLane, toolApproval } = ctx;
32
+ const { approvalAskAudit, approvalExemptionStore, backend, backgroundAgentStore, brain, checkpointStore, config, webAdmin, counterDegradeHook, peerDesk, durableEnabled, instanceId, localRoot, logger, question, runner, runnerDeps, sendUserFileToolSpec, sessionEnvSelection, sessionStore, subRunner, subRunnerSessions, taskListLane, toolApproval } = ctx;
33
33
  const authorize = createAuthorizer(config, sessionStore);
34
34
  const runStore = backend ? backend.run() : undefined;
35
35
  bindRunStore(runStore);
@@ -153,7 +153,7 @@ export async function runStage07(ctx) {
153
153
  : new RateLimiter(config.rateLimitPerMin);
154
154
  bindRateLimiter(rateLimiter);
155
155
  let skills = loadDeploymentSkills(config, logger);
156
- skills = await webAdmin.applyCenterCapabilities(skills);
156
+ skills = await webAdmin.applyCenterCapabilities(skills, peerDesk, peerDesk.lease("roster"));
157
157
  const repoClient = config.gitApiBaseUrl ? createRepoClient(config.gitApiKind, config.gitApiBaseUrl, config.gitApiToken) : undefined;
158
158
  const webSearchCfg = webSearchConfigFromEnv();
159
159
  const webSearch = webSearchCfg ? createWebSearchBackend(webSearchCfg) : undefined;
@@ -93,7 +93,9 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
93
93
  workflowsCapable: boolean;
94
94
  orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
95
95
  deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
96
+ deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
96
97
  deviceLane: import("./device-lane.js").DeviceLane | undefined;
98
+ peerDesk: import("../peer-seat.js").PeerDesk;
97
99
  dropSessionScoped: (sid: string) => void;
98
100
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
99
101
  fenceSessionOwner: (sid: string, owner: string | null) => void;
@@ -136,18 +138,7 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
136
138
  ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
137
139
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
138
140
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
139
- sideQueryAccounting: (principal: string | undefined, r: {
140
- model: string;
141
- usage?: {
142
- input?: number;
143
- output?: number;
144
- cacheRead?: number;
145
- cacheWrite?: number;
146
- cost?: {
147
- total?: number;
148
- };
149
- };
150
- }) => void;
141
+ sideQueryAccounting: import("../budget.js").SideQueryAccounting;
151
142
  toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
152
143
  tracer: import("@sema-agent/core").TracerHook;
153
144
  backend: import("../index.js").StoreBackend | undefined;
@@ -117,7 +117,9 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
117
117
  workflowsCapable: boolean;
118
118
  orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
119
119
  deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
120
+ deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
120
121
  deviceLane: import("./device-lane.js").DeviceLane | undefined;
122
+ peerDesk: import("../peer-seat.js").PeerDesk;
121
123
  dropSessionScoped: (sid: string) => void;
122
124
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
123
125
  fenceSessionOwner: (sid: string, owner: string | null) => void;
@@ -160,18 +162,7 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
160
162
  ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
161
163
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
162
164
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
163
- sideQueryAccounting: (principal: string | undefined, r: {
164
- model: string;
165
- usage?: {
166
- input?: number;
167
- output?: number;
168
- cacheRead?: number;
169
- cacheWrite?: number;
170
- cost?: {
171
- total?: number;
172
- };
173
- };
174
- }) => void;
165
+ sideQueryAccounting: import("../budget.js").SideQueryAccounting;
175
166
  toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
176
167
  tracer: import("@sema-agent/core").TracerHook;
177
168
  backend: import("../index.js").StoreBackend | undefined;
@@ -6,9 +6,8 @@ import { createLeaderFace } from "./leader.js";
6
6
  import { assertStaticWiringConsistent } from "../http/routes/diagnostics.js";
7
7
  import { buildDisplaySafeUrl } from "../trace/redact.js";
8
8
  export function runStage09(ctx) {
9
- const { approvalExemptionStore, backend, backgroundAgentStore, brain, checkpointStore, checkpointCtxSealing, config, webAdmin, deviceLane, dropSessionScoped, durableEnabled, executionEnvFactory, fileHistoryErasure, governanceSeams, localRoot, logger, mailboxRecipientLifecycle, mailboxStore, metrics, pricing, resumeAnchorStore, runStore, runnerDeps, sessionPolicyStore, sessionStore, streamApprovalGate, taskAttachmentStore, spaceReclaimer, taskListLane, toolResultStore, tracer, usageWindowStore, userInputLedgerStore, workflowCompletionInbox } = ctx;
9
+ const { approvalExemptionStore, backend, backgroundAgentStore, brain, checkpointStore, checkpointCtxSealing, config, webAdmin, deploymentMods, dropSessionScoped, durableEnabled, executionEnvFactory, fileHistoryErasure, governanceSeams, localRoot, logger, mailboxRecipientLifecycle, mailboxStore, metrics, pricing, resumeAnchorStore, runStore, runnerDeps, sessionPolicyStore, sessionStore, streamApprovalGate, taskAttachmentStore, spaceReclaimer, taskListLane, toolResultStore, tracer, usageWindowStore, userInputLedgerStore, workflowCompletionInbox } = ctx;
10
10
  const { ownerAware, sessionAudit, sessionWatchRegistry, purgeSession, instrumentDegenerate, planCacheProbe } = createSessionFaces({
11
- deviceStore: deviceLane?.store,
12
11
  dropSessionScoped,
13
12
  config, logger, metrics, localRoot, backend, sessionStore, runStore, checkpointStore, toolResultStore,
14
13
  resumeAnchorStore, approvalExemptionStore, sessionPolicyStore, taskAttachmentStore, fileHistoryErasure,
@@ -17,7 +16,7 @@ export function runStage09(ctx) {
17
16
  userInputLedgerStore,
18
17
  ...(spaceReclaimer !== undefined ? { spaceReclaimer } : {}),
19
18
  });
20
- const leaderEndpoint = createLeaderFace({ config, logger, brain, pricing, executionEnvFactory, toolResultStore, sessionStore, checkpointStore, checkpointCtxSealing, governanceSeams, backend, tracer, usageWindowStore, promptSource: webAdmin.promptSource, onError: runnerDeps.onError });
19
+ const leaderEndpoint = createLeaderFace({ config, logger, brain, pricing, executionEnvFactory, toolResultStore, sessionStore, checkpointStore, checkpointCtxSealing, governanceSeams, backend, tracer, usageWindowStore, promptSource: webAdmin.promptSource, onError: runnerDeps.onError, deploymentMods });
21
20
  const drainState = { draining: false };
22
21
  const authBridgeIssuer = authBridgeIssuerOf(config)?.issuer;
23
22
  const webAdminJwtVerifier = authBridgeIssuer
@@ -116,7 +116,9 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
116
116
  workflowsCapable: boolean;
117
117
  orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
118
118
  deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
119
+ deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
119
120
  deviceLane: import("./device-lane.js").DeviceLane | undefined;
121
+ peerDesk: import("../peer-seat.js").PeerDesk;
120
122
  dropSessionScoped: (sid: string) => void;
121
123
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
122
124
  fenceSessionOwner: (sid: string, owner: string | null) => void;
@@ -159,18 +161,7 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
159
161
  ruleConsent: import("../rules-consent.js").RuleConsentLane | undefined;
160
162
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
161
163
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
162
- sideQueryAccounting: (principal: string | undefined, r: {
163
- model: string;
164
- usage?: {
165
- input?: number;
166
- output?: number;
167
- cacheRead?: number;
168
- cacheWrite?: number;
169
- cost?: {
170
- total?: number;
171
- };
172
- };
173
- }) => void;
164
+ sideQueryAccounting: import("../budget.js").SideQueryAccounting;
174
165
  toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
175
166
  tracer: import("@sema-agent/core").TracerHook;
176
167
  backend: import("../plugins/store-backend.js").StoreBackend | undefined;
@@ -29,7 +29,7 @@ import { bindServerLateSeats } from "./late-binds.js";
29
29
  import { serviceVersion } from "../service-version.js";
30
30
  import { buildDisplaySafeUrl } from "../trace/redact.js";
31
31
  export async function runStage10(ctx) {
32
- const { approvalAskAudit, approvalExemptionStore, approvalNonceStore, authorize, backend, backgroundAgentStore, brain, breakerState, centerRuntimeCapsResolver, checkpointStore, checkpointCtxSealing, parkCommits, config, webAdmin, consolidationValve, costQuota, deviceLane, drainState, durableEnabled, elicitation, fenceSessionOwner, fileHistoryStore, fleetBus, fleetLease, fleetUsage, governanceSeams, handslessRunner, hookAgent, hookLlm, hookWakeBus, imageBakes, imageIndex, instanceId, instrumentDegenerate, leaderEndpoint, loadedSkills, localRoot, logger, lspManager, mcpRevocations, memoryBundleFaces, memoryComplianceFaces, memoryConsolidationFaces, memoryEngine, memoryExportBackend, memoryOptOutGrantStore, memoryOriginFaces, memoryPosture, memorySyncCursors, memorySyncRunner, metrics, modelUsageTracker, orgMemoryAdmission, otelExporter, outcomeSink, ownerAware, parkedReviveInheritedGate, parkedReviveSurface, perSessionCwd, perTaskImage, planCacheProbe, pricing, principalCaps, promptManifestTracker, purgeSession, question, rateLimiter, reaper, webAdminJwtVerifier, resumeAnchorStore, retentionLaneStarted, retentionLaneStore, ruleConsent, runStore, runner, runnerDeps, runtimeCapsPeekResolver, sandboxGitPlane, scenarioDetails, scenarios, selectEnvTool, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionAudit, sessionEnvSelection, sessionMemoryStatusFace, sessionPolicyStore, sessionTitler, sessionWatchRegistry, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, sharedMemoryStore, sideQueryAccounting, sqlEngine, sqlWorkflowRunStore, staticWiring, storePosture, subRunner, subagentSteerRegistry, taskAttachmentStore, taskLimitCaps, taskTimeoutSec, toolApproval, toolResultStore, usageWindowStore, userInputLedger, webSearchProvider, workflowAgentRegistry, workflowAgentSessionIndex, workflowParkDecisions, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable, orgDeliveryGate } = ctx;
32
+ const { peerDesk, approvalAskAudit, approvalExemptionStore, approvalNonceStore, authorize, backend, backgroundAgentStore, brain, breakerState, centerRuntimeCapsResolver, checkpointStore, checkpointCtxSealing, parkCommits, config, webAdmin, consolidationValve, costQuota, deploymentModsLoaded, deviceLane, drainState, durableEnabled, elicitation, fenceSessionOwner, fileHistoryStore, fleetBus, fleetLease, fleetUsage, governanceSeams, handslessRunner, hookAgent, hookLlm, hookWakeBus, imageBakes, imageIndex, instanceId, instrumentDegenerate, leaderEndpoint, loadedSkills, localRoot, logger, lspManager, mcpRevocations, memoryBundleFaces, memoryComplianceFaces, memoryConsolidationFaces, memoryEngine, memoryExportBackend, memoryOptOutGrantStore, memoryOriginFaces, memoryPosture, memorySyncCursors, memorySyncRunner, metrics, modelUsageTracker, orgMemoryAdmission, otelExporter, outcomeSink, ownerAware, parkedReviveInheritedGate, parkedReviveSurface, perSessionCwd, perTaskImage, planCacheProbe, pricing, principalCaps, promptManifestTracker, purgeSession, question, rateLimiter, reaper, webAdminJwtVerifier, resumeAnchorStore, retentionLaneStarted, retentionLaneStore, ruleConsent, runStore, runner, runnerDeps, runtimeCapsPeekResolver, sandboxGitPlane, scenarioDetails, scenarios, selectEnvTool, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionAudit, sessionEnvSelection, sessionMemoryStatusFace, sessionPolicyStore, sessionTitler, sessionWatchRegistry, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, sharedMemoryStore, sideQueryAccounting, sqlEngine, sqlWorkflowRunStore, staticWiring, storePosture, subRunner, subagentSteerRegistry, taskAttachmentStore, taskLimitCaps, taskTimeoutSec, toolApproval, toolResultStore, usageWindowStore, userInputLedger, webSearchProvider, workflowAgentRegistry, workflowAgentSessionIndex, workflowParkDecisions, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable, orgDeliveryGate } = ctx;
33
33
  const stores = {
34
34
  runStore,
35
35
  resumeAnchorStore: resumeAnchorStore ? resumeAnchorStore : undefined,
@@ -105,6 +105,7 @@ export async function runStage10(ctx) {
105
105
  sessionMirrorRuling: principalCaps
106
106
  ? async (p) => (await principalCaps.executionRuling(p))?.sessionMirror
107
107
  : undefined,
108
+ executionRuling: principalCaps ? (p) => principalCaps.executionRuling(p) : undefined,
108
109
  instrumentDegenerate,
109
110
  sideQueryAccounting,
110
111
  parkedReviveSurface: parkedReviveSurface ? parkedReviveSurface : undefined,
@@ -118,7 +119,6 @@ export async function runStage10(ctx) {
118
119
  planCacheProbe,
119
120
  };
120
121
  const governance = {
121
- authorize,
122
122
  webAdminJwtVerifier: webAdminJwtVerifier ? webAdminJwtVerifier : undefined,
123
123
  rateLimiter,
124
124
  costQuota,
@@ -169,6 +169,7 @@ export async function runStage10(ctx) {
169
169
  webSearchProvider,
170
170
  sealedKeyPublic: webAdmin.sealedKeyPublic,
171
171
  sandboxGitPlane,
172
+ deploymentModPackages: deploymentModsLoaded.length,
172
173
  instanceId,
173
174
  capabilities: {
174
175
  version: serviceVersion(),
@@ -199,6 +200,7 @@ export async function runStage10(ctx) {
199
200
  };
200
201
  const resolveSpec = createResolveSpec({
201
202
  config, logger, metrics, localRoot, scenarios, loadedSkills, principalCaps, centerRuntimeCapsResolver,
203
+ peerDesk,
202
204
  getKeyResolver: () => webAdmin.getKeyResolver(),
203
205
  taskAttachmentStore, perSessionCwd, setSessionCwd, setSessionShellEnv, fenceSessionOwner,
204
206
  hookLlm, hookAgent, fleetBus, hookWakeBus, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec,
@@ -212,7 +214,7 @@ export async function runStage10(ctx) {
212
214
  const runnerFor = createHandsRunnerSelector({ full: runner, handsless: handslessRunner });
213
215
  const sideQuery = createSideQueryLane({ brain, config, getKeyResolver: () => webAdmin.getKeyResolver() });
214
216
  const scenarioGate = createScenarioGate({ config, scenarios, principalCaps, logger }, "peek");
215
- const server = createHttpServer({ runner, runnerFor, sideQuery, scenarioGate, config, resolveSpec, stores, coordinators, seams, observability, governance, deployment, knobs });
217
+ const server = createHttpServer({ runner, runnerFor, sideQuery, scenarioGate, peerDesk, config, authorize, resolveSpec, stores, coordinators, seams, observability, governance, deployment, knobs });
216
218
  bindServerLateSeats({ config, logger, server });
217
219
  const fleetReconcile = startFleetReconciler({
218
220
  bus: fleetBus,
@@ -1,7 +1,7 @@
1
1
  import { join } from "node:path";
2
2
  import { FileBackgroundAgentStore, FileMailboxStore, FileRosterStore, InMemoryUsageWindowStore, mailboxCrossProcessMountVerdict } from "@sema-agent/core";
3
3
  import { createCorruptReadFailOpenSeat } from "../observability/corrupt-read-seat.js";
4
- import { createMemorySyncRunner, createMemorySyncTransport } from "../memory-sync-client.js";
4
+ import { buildMemorySyncEnabledFields, createMemorySyncRunner, createMemorySyncTransport } from "../memory-sync-client.js";
5
5
  import { memoryEmbedderFor } from "../plugins/memory-embedder.js";
6
6
  import { ensurePgMemoryEmbedderMetaSchema, reconcileEmbedderFingerprint } from "../plugins/memory-embedder-fingerprint.js";
7
7
  import { PgMemoryEngineBackend, ensurePgMemoryEngineSchema } from "../plugins/memory-engine-pg.js";
@@ -39,7 +39,6 @@ import { buildMemoryPosture } from "../memory-posture.js";
39
39
  import { headReadOf } from "../session-incarnation.js";
40
40
  import { establishSqlEnginePosture, sqlPoolsOf } from "../sql-engine-posture.js";
41
41
  import { buildStorePosture } from "../store-posture.js";
42
- import { buildDisplaySafeUrl } from "../trace/redact.js";
43
42
  const DARK_REASON_PROSE = {
44
43
  engine_off: () => "MEMORY_ENGINE=off",
45
44
  multi_tenant_file_backend: () => "multi-tenant on the FILE backend (no tenant isolation; set MEMORY_ENGINE_BACKEND=pg|tidb to light up)",
@@ -364,16 +363,17 @@ export async function openStores(ctx) {
364
363
  let memorySyncRunner;
365
364
  if (config.memorySync) {
366
365
  if (memoryEngine) {
366
+ const transport = createMemorySyncTransport({ url: config.memorySync.url, token: config.memorySync.token });
367
367
  memorySyncRunner = createMemorySyncRunner({
368
368
  backend: memoryEngine.backend,
369
369
  scope: config.memorySync.scope,
370
370
  memoryRoot: memoryEngine.root,
371
- transport: createMemorySyncTransport({ url: config.memorySync.url, token: config.memorySync.token }),
371
+ transport,
372
372
  log: logger,
373
373
  ...(config.memorySync.maxPushEntries !== undefined ? { maxPushEntries: config.memorySync.maxPushEntries } : {}),
374
374
  ...(config.memorySync.maxPullEntries !== undefined ? { maxPullEntries: config.memorySync.maxPullEntries } : {}),
375
375
  });
376
- logger.info("memory_sync_enabled", { url: buildDisplaySafeUrl(config.memorySync.url), scope: config.memorySync.scope, cursorPath: memorySyncRunner.cursorPathFor(config.memorySync.scope) });
376
+ logger.info("memory_sync_enabled", buildMemorySyncEnabledFields(transport.peer, config.memorySync.scope, memorySyncRunner.cursorPathFor(config.memorySync.scope)));
377
377
  memorySyncRunner.trigger("boot");
378
378
  }
379
379
  else {
@@ -20,6 +20,7 @@ import { type CandidateRejection } from "../web-admin-client/candidate-gate.js";
20
20
  import { type ConfigApplyLedgerView } from "../web-admin-client/apply-ledger.js";
21
21
  import type { CenterPullView } from "../web-admin-client/pull-state.js";
22
22
  import type { LimitSync } from "./limit-sync.js";
23
+ import type { PeerDesk, PeerLease } from "../peer-seat.js";
23
24
  export interface WebAdminRuntimeCtx {
24
25
  config: ServiceConfig;
25
26
  logger: Logger;
@@ -53,8 +54,10 @@ export interface WebAdminRuntime {
53
54
  readonly checkpointCtxSealing: CheckpointCtxSealing | undefined;
54
55
  /** core `CenterPromptSource`(RunnerDeps / subRunner 必须同实例)。 */
55
56
  readonly promptSource: CenterPromptSource;
56
- /** center skills overlay → plugins 消费 → boot LKG 落盘/skill-stale 判定 → mcp 解析。返回新的 skills 表。 */
57
- applyCenterCapabilities(skills: LoadedSkill[]): Promise<LoadedSkill[]>;
57
+ /** center skills overlay → plugins 消费 → boot LKG 落盘/skill-stale 判定 → mcp / a2a 解析。返回新的 skills 表。
58
+ * 名册(mcp / a2a 两域)条目的件在 `rosterLease`(起服开一只、进程寿命不放)下登记进 `desk`,`config.mcpServers` / `config.a2aPeers`
59
+ * 里是带引用、不带件值的声明。 */
60
+ applyCenterCapabilities(skills: LoadedSkill[], desk: Pick<PeerDesk, "declare">, rosterLease: PeerLease): Promise<LoadedSkill[]>;
58
61
  /** center 声明场景 overlay(就地写进传入的两张表)。 */
59
62
  applyCenterScenarios(t: CenterScenarioOverlayTargets): void;
60
63
  /** per-model key resolver 首建(原位调用,见文件头注 5)。 */
@@ -17,7 +17,7 @@ import { answerStillCurrent, centerStateBin, credentialIdentityNow, judgeCenterC
17
17
  import { createCenterConfigTier } from "../center-config-tier.js";
18
18
  import { buildCenterCredentialHealthView, createCenterCredentialRenewer } from "../center-credential-renewer.js";
19
19
  import { centerManagedConfigKeys } from "../web-admin-client/apply-effective.js";
20
- import { createConfigProvider, raceBootFetch, serviceConfigSourceKind, BOOT_FETCH_DEFERRED } from "../config-provider.js";
20
+ import { configSourceKind, createConfigProvider, raceBootFetch, BOOT_FETCH_DEFERRED } from "../config-provider.js";
21
21
  import { ConfigDirUntrustedError } from "../config-dir-trust.js";
22
22
  import { createKeyResolver } from "../key-resolver.js";
23
23
  import { buildSealedKeyPublicFace, ensureCheckpointCtxSealing, ensureSealedKeyStore, reportExecutionPublicKey } from "../sealed-key.js";
@@ -161,7 +161,7 @@ export async function createWebAdminRuntime(ctx) {
161
161
  catch (err) {
162
162
  logger.warn("checkpoint_ctx_sealing_unavailable", { err: err instanceof Error ? err.message : String(err), dir: join(sealedKeyDir, "checkpoint-ctx-keys"), note: "suspended tasks' request credentials cannot be sealed on this host; with durable approvals on the boot refuses — make that directory (under the sealed-key custody directory: SEALED_KEY_DIR, default <data root>/sealed-key) creatable and chmod-able by the service, or repair / remove a key file there whose public and private halves do not belong together" });
163
163
  }
164
- const configProvider = serviceConfigSourceKind(config) !== undefined
164
+ const configProvider = configSourceKind(config) !== undefined
165
165
  ? createConfigProvider({
166
166
  ...(config.configProvider ? { provider: config.configProvider } : {}),
167
167
  ...(cc ? { webAdmin: { baseUrl: cc.baseUrl, credential: cc.credential, worker: cc.worker, dryRun: cc.dryRun } } : {}),
@@ -735,7 +735,7 @@ export async function createWebAdminRuntime(ctx) {
735
735
  return "not-wired";
736
736
  return (await manualRefresh()) === "failed" ? "failed" : "triggered";
737
737
  },
738
- async applyCenterCapabilities(skills) {
738
+ async applyCenterCapabilities(skills, desk, rosterLease) {
739
739
  if (effective?.skills)
740
740
  skills = await applySkillsManifest(skills, effective.skills, candidateSource(), logger);
741
741
  if (effective?.plugins !== undefined) {
@@ -775,10 +775,10 @@ export async function createWebAdminRuntime(ctx) {
775
775
  }
776
776
  }
777
777
  if (effective?.mcp)
778
- config.mcpServers = resolveMcpServers(effective.mcp, logger);
778
+ config.mcpServers = resolveMcpServers(effective.mcp, desk, rosterLease, logger);
779
779
  mcpRevocations.applyEnabledEntries(enabledMcpEntries(effective?.mcp), { isBaseline: true });
780
780
  if (effective?.a2a)
781
- config.a2aPeers = resolveA2aPeers(effective.a2a, logger);
781
+ config.a2aPeers = resolveA2aPeers(effective.a2a, desk, rosterLease, logger);
782
782
  return skills;
783
783
  },
784
784
  applyCenterScenarios(t) {