@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
@@ -23,8 +23,10 @@ import { createUserInputLedgerAtBoot, writerGoneEvidenceFor } from "../user-inpu
23
23
  import { createParkedReviveInheritedGate } from "./parked-revive-gate.js";
24
24
  import { createParkedReviveSurface } from "../parked-revive-surface.js";
25
25
  import { createWebFetchSummarizeLane } from "./webfetch-summarize-lane.js";
26
+ import { assertGovernanceAssemblable } from "./governance-seams.js";
26
27
  import { createRunnerDepsOnAsk } from "./runner-deps.js";
27
- import { bindRateLimiter, bindRunStore } from "./late-binds.js";
28
+ import { bindRateLimiter, bindRunStore, sessionNotifyDoor } from "./late-binds.js";
29
+ import { createBackgroundCompletionRelay } from "../session-notify-door.js";
28
30
  import { buildDisplaySafeUrl } from "../trace/redact.js";
29
31
  import * as facts from "../capability-facts.js";
30
32
  import { WEB_ADMIN_ENV } from "@sema-agent/settings-schema";
@@ -153,6 +155,7 @@ export async function runStage07(ctx) {
153
155
  bindRateLimiter(rateLimiter);
154
156
  let skills = loadDeploymentSkills(config, logger);
155
157
  skills = await webAdmin.applyCenterCapabilities(skills, peerDesk, peerDesk.lease("roster"));
158
+ assertGovernanceAssemblable(config);
156
159
  const repoClient = config.gitApiBaseUrl ? createRepoClient(config.gitApiKind, config.gitApiBaseUrl, config.gitApiToken) : undefined;
157
160
  const webSearchCfg = webSearchConfigFromEnv();
158
161
  const webSearch = webSearchCfg ? createWebSearchBackend(webSearchCfg) : undefined;
@@ -169,7 +172,7 @@ export async function runStage07(ctx) {
169
172
  .catch((e) => logger.warn("web_search_probe_failed", { provider: webSearchCfg.provider, error: seatText("operator-log-text", e instanceof Error ? e.message : String(e)) }));
170
173
  }
171
174
  const ensureChildSessionDurable = checkpointStore && resolveSubagentTranscriptTier(backgroundAgentStore !== undefined, sessionStore) === "full"
172
- ? (sessionId, root) => attestChildSessionDurable(sessionStore, sessionId, root, logger)
175
+ ? (sessionId, given) => attestChildSessionDurable(sessionStore, sessionId, given)
173
176
  : undefined;
174
177
  const webFetchSummarize = createWebFetchSummarizeLane({ brain, config, getKeyResolver: () => webAdmin.getKeyResolver(), logger });
175
178
  const scenarioDeps = {
@@ -181,6 +184,7 @@ export async function runStage07(ctx) {
181
184
  ensureChildSessionDurable: ensureChildSessionDurable ? ensureChildSessionDurable : undefined,
182
185
  taskListStoreFor: taskListLane.storeFor,
183
186
  subagentExtraTools: sendUserFileToolSpec ? subagentSendUserFileExtraTools({ spec: sendUserFileToolSpec }) : undefined,
187
+ backgroundCompletionSinkFor: createBackgroundCompletionRelay({ door: () => sessionNotifyDoor, logger }),
184
188
  };
185
189
  const scenarios = buildScenarios(scenarioDeps);
186
190
  const builtinDefaultScenario = scenarios.default;
@@ -138,14 +138,17 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
138
138
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
139
139
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
140
140
  sideQueryAccounting: import("../budget.js").SideQueryAccounting;
141
- toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
141
+ toolResultStore: import("@sema-agent/core").ToolResultStore | undefined;
142
142
  tracer: import("@sema-agent/core").TracerHook;
143
143
  backend: import("../index.js").StoreBackend | undefined;
144
144
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
145
145
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
146
146
  engineDataRoot: string;
147
147
  instanceId: string;
148
- mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
148
+ mailboxRecipientLifecycle: Readonly<{
149
+ retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
150
+ listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
151
+ }> | undefined;
149
152
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
150
153
  memoryEngine: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
151
154
  memoryExportStores: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
@@ -162,14 +162,17 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
162
162
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
163
163
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
164
164
  sideQueryAccounting: import("../budget.js").SideQueryAccounting;
165
- toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
165
+ toolResultStore: import("@sema-agent/core").ToolResultStore | undefined;
166
166
  tracer: import("@sema-agent/core").TracerHook;
167
167
  backend: import("../index.js").StoreBackend | undefined;
168
168
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
169
169
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
170
170
  engineDataRoot: string;
171
171
  instanceId: string;
172
- mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
172
+ mailboxRecipientLifecycle: Readonly<{
173
+ retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
174
+ listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
175
+ }> | undefined;
173
176
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
174
177
  memoryEngine: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
175
178
  memoryExportStores: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
@@ -161,14 +161,17 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
161
161
  sessionMemoryStatusFace: import("../memory-operator-faces.js").SessionMemoryStatusFace | undefined;
162
162
  sessionPolicyStore: import("@sema-agent/core").SessionPolicyStore | undefined;
163
163
  sideQueryAccounting: import("../budget.js").SideQueryAccounting;
164
- toolResultStore: import("../plugins/store-backend.js").ToolResultStoreFull | undefined;
164
+ toolResultStore: import("@sema-agent/core").ToolResultStore | undefined;
165
165
  tracer: import("@sema-agent/core").TracerHook;
166
166
  backend: import("../plugins/store-backend.js").StoreBackend | undefined;
167
167
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
168
168
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
169
169
  engineDataRoot: string;
170
170
  instanceId: string;
171
- mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
171
+ mailboxRecipientLifecycle: Readonly<{
172
+ retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
173
+ listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
174
+ }> | undefined;
172
175
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
173
176
  memoryEngine: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
174
177
  memoryExportStores: import("../memory-scope-stores.js").MemoryScopeStores | undefined;
@@ -13,6 +13,7 @@ import { backgroundAgentOutput, taskHandleOutput, taskHandleStop } from "../runs
13
13
  import { createStoreLiveProbe } from "../store-live-probe.js";
14
14
  import { counterStoreLabel } from "../plugins/store-backend.js";
15
15
  import { sessionStoreLabelOf } from "../store-posture.js";
16
+ import { defaultPeerInboundFace } from "../peer-inbound-face.js";
16
17
  import { startFleetClientFromConfig } from "../fleet-client.js";
17
18
  import { createCenterWiringReader } from "../capabilities/center-wiring.js";
18
19
  import { mintEngineSignal } from "../fleet/engine-signal.js";
@@ -187,6 +188,7 @@ export async function runStage10(ctx) {
187
188
  centerIdentityNoticeState: () => webAdmin.centerIdentityNoticeState(),
188
189
  modelRefusalsState: () => webAdmin.modelRefusalsState(),
189
190
  candidateRejectionState: () => webAdmin.candidateRejectionState(),
191
+ latestPlaneRefusalState: () => webAdmin.latestPlaneRefusalState(),
190
192
  configHandoffState: () => webAdmin.configHandoffState(),
191
193
  mcpRevocations,
192
194
  mcpRevocationState: () => webAdmin.mcpRevocationState(),
@@ -225,7 +227,7 @@ export async function runStage10(ctx) {
225
227
  ...(runStore ? { runs: runStore } : {}),
226
228
  ...(workflowRunStore ? { workflows: workflowRunStore } : {}),
227
229
  agents: backgroundAgentStore,
228
- hasPendingAsk: toolApproval ? (originTaskId) => toolApproval.hasLivePendingFrom(originTaskId) : undefined,
230
+ hasPendingAsk: toolApproval ? (names) => toolApproval.hasLivePendingFromLeg(names) : undefined,
229
231
  instanceId,
230
232
  logger,
231
233
  metrics,
@@ -342,6 +344,7 @@ export async function runStage10(ctx) {
342
344
  retentionLane: retentionLaneStarted,
343
345
  releaseRetentionLease: retentionLaneStore !== undefined ? () => retentionLaneStore.release(instanceId) : undefined,
344
346
  servingLease,
347
+ peerInbound: defaultPeerInboundFace,
345
348
  });
346
349
  servingLease?.resumeStickyDenial();
347
350
  return { ...ctx };
@@ -3,7 +3,6 @@ import { type MemorySyncRunner } from "../memory-sync-client.js";
3
3
  import type { Logger } from "../observability/logger.js";
4
4
  import type { Metrics } from "../observability/metrics.js";
5
5
  import { type MemorySyncStore } from "../plugins/memory-sync-store-pg.js";
6
- import { type MailboxRecipientLifecycle } from "../plugins/mailbox-recipient-lifecycle.js";
7
6
  import { type TaskAttachmentStore } from "../plugins/task-attachment-store.js";
8
7
  import { type StoreBackend } from "../plugins/store-backend.js";
9
8
  import { type MemoryScopeStores } from "../memory-scope-stores.js";
@@ -29,7 +28,10 @@ export declare function openStores(ctx: OpenStoresCtx): Promise<{
29
28
  memorySyncCursors: MemorySyncStore | undefined;
30
29
  rosterStore: import("@sema-agent/core").RosterStore | undefined;
31
30
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
32
- mailboxRecipientLifecycle: MailboxRecipientLifecycle | undefined;
31
+ mailboxRecipientLifecycle: Readonly<{
32
+ retireRecipient: NonNullable<import("@sema-agent/core").MailboxStore["retireRecipient"]>;
33
+ listRetiredRecipients: NonNullable<import("@sema-agent/core").MailboxStore["listRetiredRecipients"]>;
34
+ }> | undefined;
33
35
  taskAttachmentStore: TaskAttachmentStore | undefined;
34
36
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
35
37
  memoryExportStores: MemoryScopeStores | undefined;
@@ -40,5 +42,6 @@ export declare function openStores(ctx: OpenStoresCtx): Promise<{
40
42
  memoryPosture: import("../memory-posture.js").MemoryPosture;
41
43
  taskListLane: import("./task-list-lane.js").TaskListLane;
42
44
  sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
45
+ sessionCaptureRecords: import("../plugins/store-backend.js").SessionCaptureRecordSource | undefined;
43
46
  }>;
44
47
  //# sourceMappingURL=stores.d.ts.map
@@ -12,7 +12,7 @@ import { MinioBlobBackend } from "../plugins/blob-backend.js";
12
12
  import { ensureSnapshotBuckets } from "../plugins/snapshot-bucket-presence.js";
13
13
  import { PgBackgroundAgentStore, TiDBBackgroundAgentStore, ensurePgBackgroundAgentSchema, ensureTiDBBackgroundAgentSchema } from "../stores-sql/background-agent-store-sql.js";
14
14
  import { PgMailboxStore, TiDBMailboxStore, ensurePgMailboxSchema, ensureTiDBMailboxSchema } from "../plugins/mailbox-store-sql.js";
15
- import { createDropOnlyRecipientLifecycle } from "../plugins/mailbox-recipient-lifecycle.js";
15
+ import { recipientLifecycleOf } from "../plugins/mailbox-recipient-lifecycle.js";
16
16
  import { PgUsageWindowStore, TiDBUsageWindowStore, ensurePgUsageWindowSchema, ensureTiDBUsageWindowSchema } from "../stores-sql/usage-window-store-sql.js";
17
17
  import { PgRosterStore, TiDBRosterStore, ensurePgRosterSchema, ensureTiDBRosterSchema } from "../plugins/roster-store-sql.js";
18
18
  import { LocalTaskAttachmentStore } from "../plugins/local-task-attachment-store.js";
@@ -29,7 +29,7 @@ import { assertCloudSnapshotBlobPosture, openStoreBackendWithFallback } from "..
29
29
  import { createMemoryEngineIncidentSink } from "../memory-incident-sink.js";
30
30
  import { announceLockedLegacyMemoryLayers } from "../memory-layer-legacy-lock.js";
31
31
  import { createEngineNoticeForwarder } from "./runner-deps.js";
32
- import { buildMemoryRemoteLaneWarn, memoryEngineBackendFor, memoryEngineRemoteLanePosture, memoryEngineRootFor, memoryLayersNamedBy, memoryMountRootOf } from "../memory-scope.js";
32
+ import { buildMemoryRemoteLaneWarn, memoryEngineBackendFor, memoryEngineRemoteLanePosture, memoryEngineRootFor, memoryMountRootOf } from "../memory-scope.js";
33
33
  import { createMemoryScopeStores } from "../memory-scope-stores.js";
34
34
  import { assertToolResultProvenanceSchema } from "../plugins/tool-result-store-sql.js";
35
35
  import { assertPermissionRuleApprovalSchema, assertPermissionRuleTicketSchema } from "../plugins/permission-rule-store-sql.js";
@@ -124,7 +124,8 @@ export async function openStores(ctx) {
124
124
  let memoryEngine;
125
125
  const engineDataRoot = memoryEngineRootFor(config, localRoot);
126
126
  const memoryEngineIncident = createMemoryEngineIncidentSink({ logger, metrics });
127
- const scopeStoresOver = (deployment) => createMemoryScopeStores({ backend: deployment, root: engineDataRoot, namedLayers: () => memoryLayersNamedBy(config), onIncident: memoryEngineIncident });
127
+ const sessionCaptureRecords = backend?.sessionCaptureRecords();
128
+ const scopeStoresOver = (deployment) => createMemoryScopeStores({ backend: deployment, root: engineDataRoot, onIncident: memoryEngineIncident, ...(sessionCaptureRecords !== undefined ? { captureRecords: sessionCaptureRecords } : {}) });
128
129
  let memorySyncCursors;
129
130
  let vectorMode;
130
131
  if (config.memoryEngineBackend !== "file" && config.memoryEngineEnabled) {
@@ -301,20 +302,19 @@ export async function openStores(ctx) {
301
302
  await ensurePgMailboxSchema(async (text, params) => pgPool.query(text, params));
302
303
  const store = new PgMailboxStore(pgPool, logger);
303
304
  mailboxStore = store;
304
- mailboxRecipientLifecycle = store;
305
305
  }
306
306
  else if (mysqlPool) {
307
307
  await ensureTiDBMailboxSchema(mysqlPool);
308
308
  const store = new TiDBMailboxStore(mysqlPool, logger);
309
309
  mailboxStore = store;
310
- mailboxRecipientLifecycle = store;
311
310
  }
312
311
  else if (backend?.kind === "local") {
313
312
  mailboxStore = new FileMailboxStore(config.localDataRoot ?? localRoot, {
314
313
  onCorruptRead: createCorruptReadFailOpenSeat("server.mailbox.corrupt-record-skipped"),
315
314
  });
316
- mailboxRecipientLifecycle = createDropOnlyRecipientLifecycle(mailboxStore);
317
315
  }
316
+ if (mailboxStore)
317
+ mailboxRecipientLifecycle = recipientLifecycleOf(mailboxStore);
318
318
  if (mailboxStore) {
319
319
  const laneVerdict = mailboxCrossProcessMountVerdict(mailboxStore);
320
320
  logger.info("mailbox_store_enabled", {
@@ -439,7 +439,7 @@ export async function openStores(ctx) {
439
439
  return {
440
440
  backend, storePosture, memoryEngine, engineDataRoot, memorySyncCursors, rosterStore, backgroundAgentStore, mailboxRecipientLifecycle,
441
441
  taskAttachmentStore, mailboxStore, memoryExportStores, memorySyncRunner, sessionStore, breakerState,
442
- usageWindowStore, memoryPosture, taskListLane, sqlEngine,
442
+ usageWindowStore, memoryPosture, taskListLane, sqlEngine, sessionCaptureRecords,
443
443
  };
444
444
  }
445
445
  //# sourceMappingURL=stores.js.map
@@ -1,4 +1,4 @@
1
- import { type ModelRefusalsSignal } from "@sema-agent/settings-schema";
1
+ import { type ModelPlaneRefusalCode, type ModelRefusalsSignal } from "@sema-agent/settings-schema";
2
2
  import { CenterPromptSource, type SwappableDeps } from "@sema-agent/core";
3
3
  import { buildPricing } from "../budget.js";
4
4
  import { type Scenario, type ScenarioDeps, type ScenarioDetail } from "../capabilities/scenarios.js";
@@ -128,6 +128,10 @@ export interface WebAdminRuntime {
128
128
  * 名 → 码 + 组拒码)。描述**最近一次被判的那份中心候选目录**(每次候选 apply 的报告 `ApplyReport.modelRefusals` 投影;组拒时就是被拒
129
129
  * 的那份 —— 引擎自己的拒因表不换代)。没有可报的拒 / 没有配置管道 / 还没判过候选 ⇒ `undefined`(键缺席)。值变了 ⇒ 通知自报订阅者。 */
130
130
  modelRefusalsState(): ModelRefusalsSignal | undefined;
131
+ /** `GET /v1/models.modelPlane` 的 `planeRefusalCode` 与 `catalog` 的模型面那一半的**同一只**取值口:**最新到达**的目录候选被模型面组拒的码。
132
+ * 在场 ⇔ 模型拒因信号带 `plane` ∧ 落下它的那次 apply 是最新一次到达(到达计数相等,不按收货序数比 —— 本地腿只改决定文件时同一序数再到达)。
133
+ * 与 {@link modelRefusalsState} 的 `plane` 分两个主语:那一键 = 最近一份**被 stage 判过**的模型面的组拒判决(不随更新的到达撤);本口随每一次更新的到达撤。 */
134
+ latestPlaneRefusalState(): ModelPlaneRefusalCode | undefined;
131
135
  /** [ref]:`GET /v1/models.candidateRejected` 的取值口 —— 最近一次候选被判官整拒的结论(`candidateRejection` 座;域集就是判官交出的 `rejected.domains`)。
132
136
  * present-iff 当前生效的配置是因判官整拒了最近一份候选而回落的那一份:后来的候选被判 clean 即撤下;还没判过候选 / 没有配置管道 ⇒ `undefined`(键缺席)。
133
137
  * dry-run 姿势(`webAdmin.dryRun`,compare-only)恒 `undefined`:候选从不被应用,生效配置恒是 env,拒判是预演读数(日志行照响),不是配置没换的原因。 */
@@ -18,6 +18,7 @@ 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
20
  import { configSourceKind, createConfigProvider, raceBootFetch, BOOT_FETCH_DEFERRED } from "../config-provider.js";
21
+ import { REMOTE_CATALOG_SOURCE } from "../env-model-table-gate.js";
21
22
  import { ConfigDirUntrustedError } from "../config-dir-trust.js";
22
23
  import { createKeyResolver } from "../key-resolver.js";
23
24
  import { buildSealedKeyPublicFace, ensureCheckpointCtxSealing, ensureSealedKeyStore, reportExecutionPublicKey } from "../sealed-key.js";
@@ -55,11 +56,14 @@ export async function createWebAdminRuntime(ctx) {
55
56
  let latestEffective;
56
57
  let candidateRejection;
57
58
  let judgedOrdinal = 0;
58
- const noteCandidateVerdict = (ordinal, rejection) => {
59
+ let arrivalSeq = 0;
60
+ const admitArrival = (ordinal, rejection) => {
59
61
  if (ordinal < judgedOrdinal)
60
- return;
62
+ return { seq: undefined };
61
63
  judgedOrdinal = ordinal;
62
64
  candidateRejection = rejection;
65
+ arrivalSeq += 1;
66
+ return { seq: arrivalSeq };
63
67
  };
64
68
  const applyLedger = createConfigApplyLedger();
65
69
  let lastPull = "none";
@@ -88,6 +92,7 @@ export async function createWebAdminRuntime(ctx) {
88
92
  let bootSkillStale = false;
89
93
  let pendingRestart;
90
94
  let modelRefusals;
95
+ let modelRefusalsArrival;
91
96
  const cc = config.webAdmin;
92
97
  const bootCredential = cc?.credential.read();
93
98
  const bootVerdict = bootCredential === undefined ? undefined : judgeCenterCredentialAtBoot(bootCredential);
@@ -208,7 +213,7 @@ export async function createWebAdminRuntime(ctx) {
208
213
  const domains = verdict.domains.join(",");
209
214
  if (candidateRejection?.version === r.effective.version && candidateRejection.domains.join(",") === domains)
210
215
  return;
211
- noteCandidateVerdict(ordinal, candidateRejectionOf(r, verdict, candidateSource().kind, Date.now()));
216
+ admitArrival(ordinal, candidateRejectionOf(r, verdict, candidateSource().kind, Date.now()));
212
217
  logger.warn("config_candidate_rejected", buildCandidateRejectedFields(r, verdict, leg, { lkgVersion: latestEffective?.version ?? "(env)", ...localDirField }));
213
218
  };
214
219
  const noteSourceAtApplied = () => {
@@ -217,7 +222,7 @@ export async function createWebAdminRuntime(ctx) {
217
222
  if (rejected === undefined || rejected.version === appliedVersion)
218
223
  return;
219
224
  const gen = generationOf(appliedVersion);
220
- noteCandidateVerdict(gen, undefined);
225
+ admitArrival(gen, undefined);
221
226
  if (!cc?.dryRun)
222
227
  applyLedger.applied(gen, appliedVersion);
223
228
  logger.info("config_source_back_to_applied", {
@@ -258,8 +263,9 @@ export async function createWebAdminRuntime(ctx) {
258
263
  if (!same)
259
264
  notifySelfReport("model_refusals");
260
265
  };
261
- const recordApply = (rep) => {
266
+ const recordApply = (rep, ticket) => {
262
267
  applyLedger.recordApply(rep);
268
+ modelRefusalsArrival = ticket.seq;
263
269
  publishModelRefusals(buildModelRefusalsSignal(rep.modelRefusals));
264
270
  };
265
271
  let adoptedArtifact;
@@ -518,19 +524,21 @@ export async function createWebAdminRuntime(ctx) {
518
524
  const lkgEffective = read.lkg.effective;
519
525
  candidateIdentity.set(lkgEffective, identity);
520
526
  bindValidator(read.lkg.etag, identity);
521
- return { effective: lkgEffective, ...(read.lkg.etag !== undefined ? { etag: read.lkg.etag } : {}), prompts: read.prompts };
527
+ return { effective: lkgEffective, ...(read.lkg.etag !== undefined ? { etag: read.lkg.etag } : {}), prompts: read.prompts, catalogSource: REMOTE_CATALOG_SOURCE };
522
528
  };
523
529
  const bootApplyLkgInline = async (lkgR) => {
524
530
  const lkgGen = generationOf(lkgR.effective.version);
525
531
  applyLedger.seenTarget(lkgGen, lkgR.effective.version);
532
+ const lkgArrival = admitArrival(lkgGen, undefined);
526
533
  let lkgReport;
527
534
  applyEffective(config, lkgR.effective, logger, {
528
535
  leg: "boot",
536
+ catalogSource: lkgR.catalogSource,
529
537
  sealedKeys,
530
538
  generation: lkgGen,
531
539
  report: (rep) => {
532
540
  lkgReport = rep;
533
- recordApply(rep);
541
+ recordApply(rep, lkgArrival);
534
542
  },
535
543
  });
536
544
  const lkgIdentity = candidateIdentityOf(lkgR.effective);
@@ -613,7 +621,7 @@ export async function createWebAdminRuntime(ctx) {
613
621
  }
614
622
  else {
615
623
  warnReadNotices(r, "boot");
616
- logEffectiveDiff(config, r.effective, logger);
624
+ logEffectiveDiff(config, r.effective, r.catalogSource, logger);
617
625
  ccEtag = r.etag;
618
626
  }
619
627
  }
@@ -631,14 +639,16 @@ export async function createWebAdminRuntime(ctx) {
631
639
  warnReadNotices(r, "boot");
632
640
  const bootGen = generationOf(r.effective.version);
633
641
  applyLedger.seenTarget(bootGen, r.effective.version);
642
+ const bootArrival = admitArrival(bootGen, undefined);
634
643
  let bootReport;
635
644
  applyEffective(config, r.effective, logger, {
636
645
  leg: "boot",
646
+ catalogSource: r.catalogSource,
637
647
  sealedKeys,
638
648
  generation: bootGen,
639
649
  report: (rep) => {
640
650
  bootReport = rep;
641
- recordApply(rep);
651
+ recordApply(rep, bootArrival);
642
652
  },
643
653
  });
644
654
  markApplied(bootGen, r.effective);
@@ -651,7 +661,7 @@ export async function createWebAdminRuntime(ctx) {
651
661
  const lkgPlane = await bootFromLkg("boot candidate's model plane was refused", "model-plane");
652
662
  if (lkgPlane) {
653
663
  let planeReport;
654
- applyEffective(config, withModelPlaneOf(r.effective, lkgPlane.effective), logger, { leg: "boot", sealedKeys, generation: bootGen, report: (rep) => (planeReport = rep) });
664
+ applyEffective(config, withModelPlaneOf(r.effective, lkgPlane.effective), logger, { leg: "boot", catalogSource: lkgPlane.catalogSource, sealedKeys, generation: bootGen, report: (rep) => (planeReport = rep) });
655
665
  if (modelPlaneCommitted(planeReport)) {
656
666
  bootPlaneEff = lkgPlane.effective;
657
667
  logger.warn("config_model_plane_from_lkg", { version: r.effective.version, lkgVersion: lkgPlane.effective.version, note: "the live candidate's model plane was refused at boot — serving the LKG's model plane (the catalog and what rides with it) with the live candidate's other groups; the refresh cadence re-judges the candidate" });
@@ -746,6 +756,7 @@ export async function createWebAdminRuntime(ctx) {
746
756
  restartState: () => buildRestartSignal(pendingRestart, planeDeferredNoHandoff),
747
757
  configHandoffState: () => (configProvider === undefined || configProvider.kind === "local" || !lkgSurvivesRestart ? undefined : buildConfigHandoff(latchHandoff(), handoffMissingSince)),
748
758
  modelRefusalsState: () => modelRefusals,
759
+ latestPlaneRefusalState: () => (modelRefusals?.plane !== undefined && modelRefusalsArrival !== undefined && modelRefusalsArrival === arrivalSeq ? modelRefusals.plane : undefined),
749
760
  candidateRejectionState: () => (cc?.dryRun ? undefined : candidateRejection),
750
761
  configApplyState: () => (configProvider ? applyLedger.view() : undefined),
751
762
  centerPullState: () => {
@@ -905,11 +916,12 @@ export async function createWebAdminRuntime(ctx) {
905
916
  const committed = applyEffective(config, eff, logger, {
906
917
  leg: "hot",
907
918
  checkpointStorePresent,
919
+ catalogSource: c.catalogSource,
908
920
  sealedKeys,
909
921
  generation: gen,
910
922
  report: (rep) => {
911
923
  report = rep;
912
- recordApply(rep);
924
+ recordApply(rep, c.arrival);
913
925
  },
914
926
  ...(planeChanged ? { swapPlane: swapRunnerDeps } : {}),
915
927
  });
@@ -937,14 +949,14 @@ export async function createWebAdminRuntime(ctx) {
937
949
  const demoteToNoCenter = async (awaiting) => {
938
950
  const gen = reserveArrivalGeneration();
939
951
  applyLedger.seenTarget(gen, NO_CENTER_EFFECTIVE.version);
940
- const hot = await commitHot({ eff: NO_CENTER_EFFECTIVE, prompts: undefined, gen, phase: "no-center" });
952
+ const arrival = admitArrival(gen, undefined);
953
+ const hot = await commitHot({ eff: NO_CENTER_EFFECTIVE, catalogSource: REMOTE_CATALOG_SOURCE, prompts: undefined, gen, arrival, phase: "no-center" });
941
954
  if (!hot.committed) {
942
955
  throw new Error("the no-center tier was refused (the Runners did not accept the env model table) — the previous account's center configuration is still in force; retried next tick");
943
956
  }
944
957
  if (hot.report !== undefined && !hot.report.fullyApplied) {
945
958
  logger.warn("center_identity_demotion_partial", { groups: refusedGroups(hot.report).map((g) => g.group), note: "a group of the no-center tier was refused — that group keeps its previous values (loud; the env base for that group could not be applied)" });
946
959
  }
947
- noteCandidateVerdict(gen, undefined);
948
960
  latestEffective = undefined;
949
961
  ccEtag = undefined;
950
962
  announceTier(tier.demote(awaiting, hot.report !== undefined ? refusedGroups(hot.report).map((g) => g.group) : []));
@@ -1013,14 +1025,14 @@ export async function createWebAdminRuntime(ctx) {
1013
1025
  announceCandidateRejected(r, verdict, arrival !== undefined ? "late-boot" : "refresh", tickGen);
1014
1026
  return "ok";
1015
1027
  }
1016
- noteCandidateVerdict(tickGen, undefined);
1028
+ const tickArrival = admitArrival(tickGen, undefined);
1017
1029
  warnReadNotices(r, "refresh");
1018
1030
  if (ccRef?.dryRun) {
1019
- logEffectiveDiff(config, r.effective, logger);
1031
+ logEffectiveDiff(config, r.effective, r.catalogSource, logger);
1020
1032
  ccEtag = r.etag;
1021
1033
  }
1022
1034
  else {
1023
- const hot = await commitHot({ eff: r.effective, prompts: verdict.prompts, gen: tickGen, phase: "refresh" });
1035
+ const hot = await commitHot({ eff: r.effective, catalogSource: r.catalogSource, prompts: verdict.prompts, gen: tickGen, arrival: tickArrival, phase: "refresh" });
1024
1036
  if (!hot.committed)
1025
1037
  return "ok";
1026
1038
  const applyReport = hot.report;
@@ -1127,14 +1139,14 @@ export async function createWebAdminRuntime(ctx) {
1127
1139
  announceCandidateRejected(r, lateVerdict, "late-boot", lateGen);
1128
1140
  return;
1129
1141
  }
1130
- noteCandidateVerdict(lateGen, undefined);
1142
+ const lateArrival = admitArrival(lateGen, undefined);
1131
1143
  warnReadNotices(r, "boot-deferred");
1132
1144
  if (ccRef?.dryRun) {
1133
- logEffectiveDiff(config, r.effective, logger);
1145
+ logEffectiveDiff(config, r.effective, r.catalogSource, logger);
1134
1146
  ccEtag = r.etag;
1135
1147
  return;
1136
1148
  }
1137
- const hotLate = await commitHot({ eff: r.effective, prompts: lateVerdict.prompts, gen: lateGen, phase: "boot-deferred" });
1149
+ const hotLate = await commitHot({ eff: r.effective, catalogSource: r.catalogSource, prompts: lateVerdict.prompts, gen: lateGen, arrival: lateArrival, phase: "boot-deferred" });
1138
1150
  if (!hotLate.committed)
1139
1151
  return;
1140
1152
  const applyReportLate = hotLate.report;
@@ -12,8 +12,8 @@
12
12
  * 不是静默继承 full(词表闭集纪律)。
13
13
  * ② {@link HANDS_EXCLUSIVE_TOOL_NAMES} + {@link handsDenyPolicy} —— 纵深:hands=none 的任务即便被误接到
14
14
  * 有手 Runner 上,手独占名单逐一 deny。**不是**主保证(主保证是根本不挂 factory ⇒ 工具面不可见)。
15
- * ③ {@link stampHandsLane} / {@link handsLaneOf} —— 车道作为 TaskSpec 上的**显式字段**([ref]):
16
- * resolveSpec 出口铸一次,执行点读一次,**缺席即拒**(不是回落最宽车道)。
15
+ * ③ {@link createHandsRunnerSelector} —— 车道是这条腿的部署事实(`leg-facts.ts`:装配器出口铸一次,两只漏斗以装配输出调选路器时读一次),
16
+ * **缺席即拒**(不是回落最宽车道)。
17
17
  */
18
18
  import { type Runner, type TaskSpec, type ToolPolicy } from "@sema-agent/core";
19
19
  /** 场景对手带工具面的表态(闭集)。`full` = core 手带 band 照常 mount;`none` = 不挂 executionEnvFactory 的 Runner。 */
@@ -114,32 +114,7 @@ export declare function tightenWithHandsDeny(base: ToolPolicy | undefined): Tool
114
114
  /** 装配点的取用形:`full` 原样放行基线,`none` 叠 deny。**穷举 switch**,无缺省臂。 */
115
115
  export declare function toolPolicyForHands(hands: ScenarioHands, base: ToolPolicy | undefined): ToolPolicy | undefined;
116
116
  /**
117
- * 执行车道在 TaskSpec 上的**显式字段键**([ref];修前是一张以 spec **对象身份**为键的 WeakMap 旁表)。
118
- *
119
- * 为什么是 symbol 而不是字符串键:`TaskSpec` 是**上游 core 的类型面**,一个字符串键会进
120
- * `Object.keys` / `JSON.stringify` / core 自己的键审计,等于 server 在别人的契约上私自加一个键;
121
- * symbol 键随 spread(`{...spec}`)与 rest 解构(`const {objective, ...taskConfig} = spec`)结构性
122
- * 地跟着走,却对上游的键面**不可见**(结构化克隆与 JSON 同样跳过 symbol 键)。于是「车道是 spec 上
123
- * 的一个字段、复制 spec 不丢车道」与「不污染上游契约」两件事同时成立。
124
- *
125
- * 修前的旁表要求「从 resolveSpec 出来的那一只对象必须一路原样活到执行点」——一条**隐形**的对象身份
126
- * 契约:任何一次 `{...spec}` 都会静默把车道降级成最宽的 `full`(实测:登记 `none` 的 spec 复制后
127
- * `laneOf` 答 `full`)。字段化把那条隐形要求整条删掉。
128
- */
129
- export declare const HANDS_LANE_FIELD: unique symbol;
130
- /** 已铸车道的 TaskSpec。铸点唯一(`boot/resolve-spec.ts` 的 resolveSpec 出口),读点唯一({@link handsLaneOf})。 */
131
- export type LanedTaskSpec = TaskSpec & {
132
- readonly [HANDS_LANE_FIELD]: ScenarioHands;
133
- };
134
- /**
135
- * 铸车道(**单一属主**:只允许 resolveSpec 的出口调用)。
136
- *
137
- * 字段是 `enumerable`(所以复制得走)、`writable:false` + `configurable:false`(所以同一只 spec 被
138
- * 第二次铸车道会当场 TypeError —— 两个写者是漂移的成因,响亮好过后到者悄悄赢)。
139
- */
140
- export declare function stampHandsLane<T extends TaskSpec>(spec: T, hands: ScenarioHands): T & LanedTaskSpec;
141
- /**
142
- * 车道字段缺席的拒因 —— 具名类,便于调用点/测试按类型判,而不是嗅文案。
117
+ * 车道读不到的拒因 —— 具名类,便于调用点/测试按类型判,而不是嗅文案。
143
118
  *
144
119
  * 🔴 **刻意不是 `HttpError`、刻意不铸新的 wire 错误码**:它落到 `http/server.ts` 的兜底 catch,
145
120
  * wire 上是 500 `internal.error`(内部文本不回显,只进 `request_error` 日志行)。理由两条:
@@ -153,19 +128,14 @@ export declare class HandsLaneUnstampedError extends Error {
153
128
  constructor();
154
129
  }
155
130
  /**
156
- * 读车道 —— **缺席即拒**([ref] P 类:车道选择是保护型量,fail-closed;`observability/fail-open.ts`
157
- * 头注把「车道选择」逐字列在「正解是 fail-closed,不是留痕后继续放行」那一族里)。
131
+ * 装配点的选路席:`{full, handsless}` 两只 Runner + 这条腿的车道 ⇒ 本任务跑哪一只。公共缝 `runnerFor(spec)` 的生产实现;
132
+ * 两只漏斗(受理 / 续跑)以**装配器输出的那一只对象**调它(`leg-facts.ts`:读在 `stampSpecRoot` 复制之前)。
158
133
  *
159
- * 修前此处是 `?? "full"`:一只没经过本仓 resolver 的 spec 会**静默拿到最宽的车道**(全量可写手带)。
160
- * 「唯一可达形是测试桩」这个论证不是防线 —— 它是一句关于今天调用图的断言,而防线要防的正是明天多出
161
- * 来的第二个执行点。缺席现在整只拒(500 + 日志留原句),而不是把一个未经裁定的任务放进有手车道。
162
- */
163
- export declare function handsLaneOf(spec: TaskSpec): ScenarioHands;
164
- /**
165
- * 装配点的选路席:`{full, handsless}` 两只 Runner + 车道字段 ⇒ 本任务跑哪一只。
134
+ * 车道读不到 ⇒ **缺席即拒**([ref] P 类:车道选择是保护型量,fail-closed;`observability/fail-open.ts` 头注把「车道选择」逐字列在
135
+ * 「正解是 fail-closed,不是留痕后继续放行」那一族里)。读不到的两种来路:嵌入方自带的 `resolveSpec`(不铸本仓的腿事实),
136
+ * 或有人把复制品交了进来(读晚了)—— 都整只拒(500 + 日志留原句),绝不把一个未经裁定的任务放进最宽的有手车道。
166
137
  *
167
- * 具名工厂而不是在 main.ts 手搓闭包:选路规则(读字段 → 穷举 switch)于是只有**一份实现**,
168
- * 测试与生产装配拿的是同一只(手搓等价闭包 = 第二真源,正是本件要删的那一类)。
138
+ * 具名工厂而不是在 main.ts 手搓闭包:选路规则(读车道 → 穷举 switch)于是只有**一份实现**,测试与生产装配拿的是同一只。
169
139
  */
170
140
  export declare function createHandsRunnerSelector(pair: HandsRunnerPair): (spec: TaskSpec) => Runner;
171
141
  //# sourceMappingURL=hands-lane.d.ts.map
@@ -1,4 +1,5 @@
1
1
  import { handBandEffects, judgeRuleToolName, combinePolicies, createAllowDenyPolicy } from "@sema-agent/core";
2
+ import { legFactsOf } from "../leg-facts.js";
2
3
  import { TOOL_NAME_ROSTER } from "../namespaced-rule-name.js";
3
4
  export function withoutHands(deps) {
4
5
  const { executionEnvFactory: _handsDropped, ...rest } = deps;
@@ -29,7 +30,7 @@ export const HANDS_BAND_TOOL_NAMES = Object.freeze([
29
30
  "ExitWorktree",
30
31
  "ListAgents",
31
32
  ].filter((n, i, all) => judgeRuleToolName(n, TOOL_NAME_ROSTER).kind === "current" && all.indexOf(n) === i));
32
- export const HANDS_DUAL_USE_TOOL_NAMES = Object.freeze(["TaskOutput", "TaskStop", "SendMessage", "AgentTranscript", "ListAgents"]);
33
+ export const HANDS_DUAL_USE_TOOL_NAMES = Object.freeze(["TaskStop", "SendMessage", "AgentTranscript", "ListAgents"]);
33
34
  export const HANDS_EXCLUSIVE_TOOL_NAMES = Object.freeze(HANDS_BAND_TOOL_NAMES.filter((n) => !HANDS_DUAL_USE_TOOL_NAMES.includes(n)));
34
35
  export const OFFICE_KEPT_HAND_TOOL_NAMES = Object.freeze(["Read", "Glob", "Grep"]);
35
36
  export const OFFICE_EXCLUDED_TOOL_NAMES = Object.freeze(HANDS_EXCLUSIVE_TOOL_NAMES.filter((n) => !OFFICE_KEPT_HAND_TOOL_NAMES.includes(n)));
@@ -48,24 +49,18 @@ export function toolPolicyForHands(hands, base) {
48
49
  return tightenWithHandsDeny(base);
49
50
  }
50
51
  }
51
- export const HANDS_LANE_FIELD = Symbol("sema-server.handsLane");
52
- export function stampHandsLane(spec, hands) {
53
- Object.defineProperty(spec, HANDS_LANE_FIELD, { value: hands, enumerable: true, writable: false, configurable: false });
54
- return spec;
55
- }
56
52
  export class HandsLaneUnstampedError extends Error {
57
53
  constructor() {
58
54
  super("execution lane is not stamped on this task spec — refusing to run it rather than falling back to the widest (full-hands) lane");
59
55
  this.name = "HandsLaneUnstampedError";
60
56
  }
61
57
  }
62
- export function handsLaneOf(spec) {
63
- const lane = spec[HANDS_LANE_FIELD];
64
- if (lane === undefined)
65
- throw new HandsLaneUnstampedError();
66
- return lane;
67
- }
68
58
  export function createHandsRunnerSelector(pair) {
69
- return (spec) => pickHandsRunner(handsLaneOf(spec), pair);
59
+ return (spec) => {
60
+ const hands = legFactsOf(spec)?.hands;
61
+ if (hands === undefined)
62
+ throw new HandsLaneUnstampedError();
63
+ return pickHandsRunner(hands, pair);
64
+ };
70
65
  }
71
66
  //# sourceMappingURL=hands-lane.js.map
@@ -354,8 +354,9 @@ export declare function buildMcpProbeInflightRefusal(): McpProbeRefusal;
354
354
  * 在任何传输被触碰**之前**就被拒)。
355
355
  *
356
356
  * 异源复核 [medium]:修前这一形在两条口上都被抛给分派器尾 ⇒ `500 internal.error`。可自带申报那一口的申报
357
- * 是**调用方**写的,把它答成 500 是把调用方的错说成这台机器故障;中心申报那一口反过来 —— 那是部署方写的,
358
- * 5xx 才是对的方向。⇒ 一条规则:**谁写的申报,谁的错**。
357
+ * 是**调用方**写的,把它答成 500 是把调用方的错说成这台机器故障 ⇒ 自带申报那一口答 400 `request.field_invalid`(本句)。
358
+ * 中心申报那一口**不走本句**:那是部署方写的、部署上挂不起来,引擎的拒按同步提交腿读的同一张「码 → 状态」表读成应答
359
+ * (409 `config.mcp_server_name_collision` + 引擎原句,`http/engine-refusal.ts`),与同一份声明集在提交腿上的答复同码同状态同句。
359
360
  *
360
361
  * 🔴 **不回显因由**:那句话来自申报集本身,可能带调用方的内情(名字、地址形)。调用方手里有自己的体,
361
362
  * 点名「两台撞了命名空间」就够他自己找;原文留在那一层的日志里。