@sema-agent/server 7.125.1 → 7.126.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 (248) hide show
  1. package/MIGRATION.md +195 -2
  2. package/README.md +2 -2
  3. package/README.zh-CN.md +2 -2
  4. package/USAGE.md +263 -140
  5. package/deploy/sema-up/README.md +1 -1
  6. package/deploy/sema-up/chart/templates/networkpolicy-sandbox.yaml +47 -0
  7. package/deploy/sema-up/chart/templates/sandbox-rbac.yaml +5 -1
  8. package/deploy/sema-up/chart/templates/server-v4pro.yaml +2 -2
  9. package/deploy/sema-up/chart/templates/server.yaml +1 -1
  10. package/deploy/sema-up/chart/values.yaml +12 -0
  11. package/deploy/sema-up/cluster-up.sh +10 -10
  12. package/deploy/sema-up/kube-up.sh +11 -10
  13. package/deploy/sema-up/lib/dataroot.sh +1 -1
  14. package/deploy/sema-up/lib/envf.sh +5 -5
  15. package/deploy/sema-up/lib/flagshape.sh +5 -5
  16. package/deploy/sema-up/lib/lanes.py +1 -1
  17. package/deploy/sema-up/lib/parse-machines.py +2 -2
  18. package/deploy/sema-up/lib/shell-access.sh +1 -1
  19. package/deploy/sema-up/preflight.sh +4 -4
  20. package/deploy/sema-up/sema-up.sh +33 -33
  21. package/deploy/sema-up/smoke.sh +3 -3
  22. package/deploy/sema-up/stack/compose.yaml +1 -1
  23. package/deploy/sema-up/stack/sema-stack-cluster.yaml +6 -2
  24. package/dist/approval-card.d.ts +20 -4
  25. package/dist/approval-content-kind.d.ts +38 -22
  26. package/dist/approval-content-kind.js +20 -4
  27. package/dist/audit.js +2 -0
  28. package/dist/bench/s1/arms.d.ts +9 -37
  29. package/dist/bench/s1/arms.js +4 -61
  30. package/dist/bench/s1/live-deps.d.ts +4 -10
  31. package/dist/bench/s1/live-deps.js +1 -222
  32. package/dist/bench/s1/oracle.d.ts +1 -1
  33. package/dist/bench/s1/reviewer.d.ts +1 -1
  34. package/dist/bench/s1/row.d.ts +5 -7
  35. package/dist/bench/s1/row.js +0 -2
  36. package/dist/bench/s1/run-firm.d.ts +2 -2
  37. package/dist/bench/s1/run-firm.js +1 -4
  38. package/dist/bench/s1/runner-ctx.d.ts +17 -29
  39. package/dist/bench/s1/runner-ctx.js +3 -7
  40. package/dist/bench/s1/tasks.d.ts +9 -46
  41. package/dist/bench/s1/tasks.js +4 -63
  42. package/dist/boot/execution-env.d.ts +38 -26
  43. package/dist/boot/execution-env.js +71 -38
  44. package/dist/boot/memory-boundary.d.ts +1 -1
  45. package/dist/boot/parked-revive-gate.d.ts +0 -3
  46. package/dist/boot/parked-revive-gate.js +2 -2
  47. package/dist/boot/resolve-spec.d.ts +0 -2
  48. package/dist/boot/resolve-spec.js +12 -17
  49. package/dist/boot/retention-lane.d.ts +12 -1
  50. package/dist/boot/retention-lane.js +2 -0
  51. package/dist/boot/runner-deps.d.ts +5 -5
  52. package/dist/boot/runner-deps.js +5 -16
  53. package/dist/boot/session-faces.d.ts +5 -1
  54. package/dist/boot/session-faces.js +37 -1
  55. package/dist/boot/stage-03-store-backend.d.ts +1 -0
  56. package/dist/boot/stage-03-store-backend.js +2 -2
  57. package/dist/boot/stage-04-stores.d.ts +1 -0
  58. package/dist/boot/stage-05-execution-env.d.ts +2 -2
  59. package/dist/boot/stage-05-execution-env.js +7 -4
  60. package/dist/boot/stage-06-runners.d.ts +2 -3
  61. package/dist/boot/stage-06-runners.js +8 -7
  62. package/dist/boot/stage-07-capability-layer.d.ts +2 -3
  63. package/dist/boot/stage-07-capability-layer.js +3 -4
  64. package/dist/boot/stage-08-reapers.d.ts +2 -3
  65. package/dist/boot/stage-08-reapers.js +2 -2
  66. package/dist/boot/stage-09-leader.d.ts +2 -3
  67. package/dist/boot/stage-09-leader.js +2 -1
  68. package/dist/boot/stage-10-http-server.d.ts +2 -3
  69. package/dist/boot/stage-10-http-server.js +2 -2
  70. package/dist/boot/stores.d.ts +1 -0
  71. package/dist/boot/stores.js +4 -3
  72. package/dist/boot/web-admin.d.ts +5 -0
  73. package/dist/boot/web-admin.js +28 -14
  74. package/dist/brain.d.ts +2 -2
  75. package/dist/brain.js +1 -1
  76. package/dist/capabilities/builtin-tools.d.ts +2 -1
  77. package/dist/capabilities/composite-members.d.ts +1 -1
  78. package/dist/capabilities/composite-members.js +1 -1
  79. package/dist/capabilities/hands-lane.d.ts +9 -6
  80. package/dist/capabilities/hands-lane.js +2 -2
  81. package/dist/capabilities/memory-notice.d.ts +27 -22
  82. package/dist/capabilities/memory-notice.js +15 -17
  83. package/dist/capabilities/scenarios.d.ts +9 -14
  84. package/dist/capabilities/scenarios.js +5 -50
  85. package/dist/capability-facts.d.ts +22 -11
  86. package/dist/capability-facts.js +13 -6
  87. package/dist/config-catalog.js +11 -4
  88. package/dist/config-provider.d.ts +5 -1
  89. package/dist/config-provider.js +23 -4
  90. package/dist/config-types.d.ts +14 -1
  91. package/dist/config.js +39 -6
  92. package/dist/deployment-governance.d.ts +19 -21
  93. package/dist/deployment-governance.js +7 -8
  94. package/dist/env-name-allowlist-knobs.d.ts +5 -5
  95. package/dist/env-name-allowlist-knobs.js +1 -0
  96. package/dist/execution-lane-caps.js +2 -2
  97. package/dist/hooks/hook-runner.d.ts +84 -30
  98. package/dist/hooks/hook-runner.js +74 -41
  99. package/dist/http/admission.js +12 -9
  100. package/dist/http/durable-run-leg.d.ts +5 -4
  101. package/dist/http/durable-run-leg.js +1 -1
  102. package/dist/http/idempotency.d.ts +28 -6
  103. package/dist/http/idempotency.js +10 -2
  104. package/dist/http/principal-gate.d.ts +14 -0
  105. package/dist/http/principal-gate.js +7 -0
  106. package/dist/http/request-guards.d.ts +2 -1
  107. package/dist/http/request-guards.js +14 -14
  108. package/dist/http/resume-legs.d.ts +2 -2
  109. package/dist/http/resume-legs.js +5 -4
  110. package/dist/http/route-ctx.d.ts +8 -6
  111. package/dist/http/routes/a2a-serve.js +11 -7
  112. package/dist/http/routes/approvals-assistant.js +18 -3
  113. package/dist/http/routes/background.d.ts +1 -1
  114. package/dist/http/routes/background.js +1 -1
  115. package/dist/http/routes/capabilities.js +10 -2
  116. package/dist/http/routes/mcp-reconnect.js +1 -1
  117. package/dist/http/routes/runs.d.ts +4 -3
  118. package/dist/http/routes/runs.js +12 -13
  119. package/dist/http/routes/session-sync.js +14 -11
  120. package/dist/http/routes/sessions.js +9 -9
  121. package/dist/http/routes/side-query.js +6 -19
  122. package/dist/http/routes/tasks.js +12 -11
  123. package/dist/http/server.d.ts +4 -0
  124. package/dist/http/server.js +2 -2
  125. package/dist/http/submit-replay.d.ts +15 -8
  126. package/dist/http/submit-replay.js +6 -0
  127. package/dist/http/wire-types.d.ts +7 -9
  128. package/dist/index.d.ts +0 -1
  129. package/dist/index.js +0 -1
  130. package/dist/internal-run-env.d.ts +30 -0
  131. package/dist/internal-run-env.js +11 -0
  132. package/dist/leader/wire.js +3 -2
  133. package/dist/memory-scope.d.ts +19 -7
  134. package/dist/memory-scope.js +25 -8
  135. package/dist/observability/fail-open.d.ts +15 -3
  136. package/dist/observability/fail-open.js +15 -3
  137. package/dist/observability/metrics.d.ts +0 -1
  138. package/dist/observability/metrics.js +0 -3
  139. package/dist/observability/run-terminal.js +69 -4
  140. package/dist/permission-rule-vocab.d.ts +3 -2
  141. package/dist/permission-rule-vocab.js +1 -1
  142. package/dist/plan-cache-probe.d.ts +3 -2
  143. package/dist/plugins/approval-ask-store-sql.d.ts +1 -1
  144. package/dist/plugins/caching-session-store.d.ts +3 -0
  145. package/dist/plugins/caching-session-store.js +3 -0
  146. package/dist/plugins/checkpoint-store-sql.d.ts +42 -28
  147. package/dist/plugins/checkpoint-store-sql.js +57 -11
  148. package/dist/plugins/file-run-store.d.ts +25 -21
  149. package/dist/plugins/file-run-store.js +70 -34
  150. package/dist/plugins/local-checkpoint-store.d.ts +8 -5
  151. package/dist/plugins/local-checkpoint-store.js +5 -15
  152. package/dist/plugins/local-session-store.d.ts +66 -7
  153. package/dist/plugins/local-session-store.js +168 -101
  154. package/dist/plugins/mailbox-recipient-lifecycle.d.ts +1 -1
  155. package/dist/plugins/memory-run-store.d.ts +19 -3
  156. package/dist/plugins/memory-run-store.js +38 -3
  157. package/dist/plugins/one-time-migrations.d.ts +141 -39
  158. package/dist/plugins/one-time-migrations.js +32 -143
  159. package/dist/plugins/pg-pool.js +11 -1
  160. package/dist/plugins/pg-session-storage.d.ts +2 -0
  161. package/dist/plugins/pg-session-storage.js +9 -5
  162. package/dist/plugins/remote-env-adb.d.ts +3 -0
  163. package/dist/plugins/remote-env-adb.js +1 -0
  164. package/dist/plugins/remote-env-device.d.ts +3 -0
  165. package/dist/plugins/remote-env-device.js +1 -0
  166. package/dist/plugins/remote-env-e2b.d.ts +4 -0
  167. package/dist/plugins/remote-env-e2b.js +2 -1
  168. package/dist/plugins/remote-env-host.d.ts +12 -0
  169. package/dist/plugins/remote-env-host.js +11 -1
  170. package/dist/plugins/remote-env-k8s.d.ts +227 -39
  171. package/dist/plugins/remote-env-k8s.js +450 -75
  172. package/dist/plugins/remote-env-local-docker.d.ts +4 -0
  173. package/dist/plugins/remote-env-local-docker.js +2 -1
  174. package/dist/plugins/remote-env-ssh.d.ts +3 -0
  175. package/dist/plugins/remote-env-ssh.js +1 -0
  176. package/dist/plugins/retention-store-sql.d.ts +4 -1
  177. package/dist/plugins/retention-store-sql.js +11 -9
  178. package/dist/plugins/run-store-sql.d.ts +44 -6
  179. package/dist/plugins/run-store-sql.js +92 -27
  180. package/dist/plugins/session-capture-record-store-sql.d.ts +2 -3
  181. package/dist/plugins/sql-driver.d.ts +2 -1
  182. package/dist/plugins/store-backend.js +1 -1
  183. package/dist/plugins/store-contracts.d.ts +17 -3
  184. package/dist/plugins/tidb-pool.js +15 -3
  185. package/dist/plugins/tidb-session-storage.js +3 -2
  186. package/dist/plugins/tidb-session-store.d.ts +2 -0
  187. package/dist/plugins/tidb-session-store.js +6 -2
  188. package/dist/request-key-closure.d.ts +12 -0
  189. package/dist/request-key-closure.js +3 -3
  190. package/dist/router/route-orchestration.d.ts +3 -11
  191. package/dist/router/route-orchestration.js +0 -4
  192. package/dist/rule-entry-list.js +0 -4
  193. package/dist/rules-consent.js +3 -0
  194. package/dist/run-local.d.ts +5 -4
  195. package/dist/run-local.js +23 -17
  196. package/dist/runs.js +1 -0
  197. package/dist/security.d.ts +7 -0
  198. package/dist/security.js +5 -0
  199. package/dist/server-secret-env.d.ts +10 -4
  200. package/dist/server-secret-env.js +4 -1
  201. package/dist/session-incarnation.d.ts +46 -2
  202. package/dist/session-incarnation.js +14 -3
  203. package/dist/session-sync-kernel.d.ts +10 -3
  204. package/dist/spec-fields.d.ts +24 -8
  205. package/dist/spec-fields.js +21 -2
  206. package/dist/task-workflow.d.ts +6 -4
  207. package/dist/task-workflow.js +3 -2
  208. package/dist/tool-approval.d.ts +78 -6
  209. package/dist/tool-approval.js +7 -3
  210. package/dist/trace/core-keyset-guard.d.ts +4 -4
  211. package/dist/trace/engine-notice-wire.d.ts +26 -1
  212. package/dist/trace/engine-notice-wire.js +7 -2
  213. package/dist/trace/project.d.ts +8 -3
  214. package/dist/trace/project.js +15 -1
  215. package/dist/trace/self-minted-wire.d.ts +104 -2
  216. package/dist/trace/self-minted-wire.js +35 -0
  217. package/dist/web-admin-client/apply-effective.d.ts +13 -7
  218. package/dist/web-admin-client/apply-effective.js +11 -26
  219. package/dist/web-admin-client/apply-ledger.d.ts +2 -2
  220. package/dist/web-admin-client/candidate-gate.d.ts +39 -4
  221. package/dist/web-admin-client/candidate-gate.js +9 -2
  222. package/dist/web-admin-client/facade.d.ts +2 -2
  223. package/dist/web-admin-client/http-client.d.ts +3 -1
  224. package/dist/web-admin-client/http-client.js +4 -3
  225. package/dist/web-admin-client/read-warnings.d.ts +33 -5
  226. package/dist/web-admin-client/read-warnings.js +41 -6
  227. package/dist/web-admin-client/types.d.ts +11 -5
  228. package/dist/workspace-cache.d.ts +45 -0
  229. package/dist/workspace-cache.js +30 -0
  230. package/dist/workspace-space-commit.d.ts +116 -0
  231. package/dist/workspace-space-commit.js +117 -0
  232. package/dist/workspace-space.d.ts +75 -9
  233. package/dist/workspace-space.js +52 -1
  234. package/package.json +4 -4
  235. package/dist/boot/session-incarnation-seat.d.ts +0 -41
  236. package/dist/boot/session-incarnation-seat.js +0 -69
  237. package/dist/capabilities/code-review-council.d.ts +0 -49
  238. package/dist/capabilities/code-review-council.js +0 -111
  239. package/dist/capabilities/collab-wire.d.ts +0 -36
  240. package/dist/capabilities/collab-wire.js +0 -2
  241. package/dist/capabilities/collab-workflows.d.ts +0 -47
  242. package/dist/capabilities/collab-workflows.js +0 -90
  243. package/dist/capabilities/prompts/code-review.d.ts +0 -25
  244. package/dist/capabilities/prompts/code-review.js +0 -39
  245. package/dist/capabilities/prompts/team.d.ts +0 -10
  246. package/dist/capabilities/prompts/team.js +0 -6
  247. package/dist/capabilities/team.d.ts +0 -113
  248. package/dist/capabilities/team.js +0 -70
@@ -2,10 +2,10 @@ import { uuidv7 } from "@sema-agent/core";
2
2
  import { openStores } from "./stores.js";
3
3
  export async function runStage03(ctx) {
4
4
  const { config, localRoot, logger, metrics } = ctx;
5
- const { backend, storePosture, memoryEngine, memorySyncCursors, rosterStore, backgroundAgentStore, taskAttachmentStore, mailboxStore, mailboxRecipientLifecycle, memoryExportBackend, memorySyncRunner, sessionStore, breakerState, usageWindowStore, memoryPosture, taskListLane, sqlEngineFacts, } = await openStores({ config, logger, metrics, localRoot });
5
+ const { backend, storePosture, memoryEngine, engineDataRoot, memorySyncCursors, rosterStore, backgroundAgentStore, taskAttachmentStore, mailboxStore, mailboxRecipientLifecycle, memoryExportBackend, memorySyncRunner, sessionStore, breakerState, usageWindowStore, memoryPosture, taskListLane, sqlEngineFacts, } = await openStores({ config, logger, metrics, localRoot });
6
6
  const instanceId = uuidv7();
7
7
  const sessionCaptureRecords = backend?.sessionCaptureRecords();
8
8
  const sessionCaptureRecordStore = sessionCaptureRecords?.();
9
- return { ...ctx, backend, backgroundAgentStore, breakerState, instanceId, mailboxRecipientLifecycle, mailboxStore, memoryEngine, memoryExportBackend, memoryPosture, memorySyncCursors, memorySyncRunner, rosterStore, sessionCaptureRecordStore, sessionCaptureRecords, sessionStore, sqlEngineFacts, storePosture, taskAttachmentStore, taskListLane, usageWindowStore };
9
+ return { ...ctx, backend, backgroundAgentStore, breakerState, engineDataRoot, instanceId, mailboxRecipientLifecycle, mailboxStore, memoryEngine, memoryExportBackend, memoryPosture, memorySyncCursors, memorySyncRunner, rosterStore, sessionCaptureRecordStore, sessionCaptureRecords, sessionStore, sqlEngineFacts, storePosture, taskAttachmentStore, taskListLane, usageWindowStore };
10
10
  }
11
11
  //# sourceMappingURL=stage-03-store-backend.js.map
@@ -44,6 +44,7 @@ export declare function runStage04(ctx: Awaited<ReturnType<typeof runStage03>>):
44
44
  backend: import("../index.js").StoreBackend | undefined;
45
45
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
46
46
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
47
+ engineDataRoot: string;
47
48
  instanceId: string;
48
49
  mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
49
50
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
@@ -6,12 +6,11 @@ export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>):
6
6
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
7
7
  fenceSessionOwner: (sid: string, owner: string | null) => void;
8
8
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
9
- noteSessionIncarnation: (sid: string, incarnation: string | undefined) => void;
9
+ spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
10
10
  perSessionCwd: Map<string, string>;
11
11
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
12
12
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
13
13
  sessionEnvSelection: import("../capabilities/select-environment-tool.js").SessionEnvironmentSelection;
14
- sessionIncarnationOf: (sid: string) => string | undefined;
15
14
  setSessionCwd: (sid: string, cwd: string) => void;
16
15
  setSessionInheritEnv: (sid: string, policy: import("../request-value-closure.js").TaskInheritEnv | undefined) => void;
17
16
  setSessionShellEnv: (sid: string, env: Record<string, string>) => void;
@@ -60,6 +59,7 @@ export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>):
60
59
  backend: import("../index.js").StoreBackend | undefined;
61
60
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
62
61
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
62
+ engineDataRoot: string;
63
63
  instanceId: string;
64
64
  mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
65
65
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
@@ -2,15 +2,18 @@ import { createToolTracer, createPermissionDeniedMeter } from "../observability/
2
2
  import { composeHooks } from "../hooks/hook-runner.js";
3
3
  import { assertDeviceLaneWired, createDeviceLane } from "./device-lane.js";
4
4
  import { assertWorkspaceSpaceReadable, createExecutionEnv } from "./execution-env.js";
5
- import { sessionFaceReaderOf } from "./session-incarnation-seat.js";
5
+ import { incarnationReadOf } from "../session-incarnation.js";
6
6
  import * as facts from "../capability-facts.js";
7
7
  import { sessionStoreLabelOf } from "../store-posture.js";
8
+ import { runStore } from "./late-binds.js";
8
9
  export function runStage05(ctx) {
9
10
  const { backend, config, instanceId, logger, metrics, sessionStore, taskAttachmentStore } = ctx;
10
11
  const deviceLane = config.remoteExec?.provider === "device" ? createDeviceLane({ config, logger, metrics, backend, replicaId: instanceId }) : undefined;
11
- const { perTaskImage, sessionEnvSelection, perSessionCwd, setSessionCwd, setSessionShellEnv, setSessionInheritEnv, fenceSessionOwner, dropSessionScoped, noteSessionIncarnation, sessionIncarnationOf, executionEnvFactory, worktreeReap, sendUserFileTaskEnvs, lspManager, } = createExecutionEnv({ config, logger, metrics, taskAttachmentStore, ...(deviceLane ? { deviceLane } : {}) });
12
+ const incarnationOf = incarnationReadOf(sessionStore);
13
+ const spaceCommits = backend !== undefined ? () => runStore : undefined;
14
+ const { perTaskImage, sessionEnvSelection, perSessionCwd, setSessionCwd, setSessionShellEnv, setSessionInheritEnv, fenceSessionOwner, dropSessionScoped, executionEnvFactory, worktreeReap, sendUserFileTaskEnvs, lspManager, spaceReclaimer, } = createExecutionEnv({ config, logger, metrics, taskAttachmentStore, ...(deviceLane ? { deviceLane } : {}), ...(spaceCommits !== undefined ? { spaceCommits } : {}), ...(incarnationOf !== undefined ? { incarnationOf } : {}) });
12
15
  assertDeviceLaneWired(config.remoteExec?.provider === "device", deviceLane, executionEnvFactory !== undefined);
13
- assertWorkspaceSpaceReadable(facts.workspaceSpace(config), sessionFaceReaderOf(sessionStore), sessionStoreLabelOf(config.sessionBackend, backend?.kind));
16
+ assertWorkspaceSpaceReadable(facts.workspaceSpace(config), { incarnationOf, spaceCommits }, facts.workspaceCache(config), sessionStoreLabelOf(config.sessionBackend, backend?.kind));
14
17
  const toolTracer = config.toolTrace ? createToolTracer(logger) : undefined;
15
18
  if (toolTracer)
16
19
  logger.info("tool_trace_enabled", {});
@@ -18,6 +21,6 @@ export function runStage05(ctx) {
18
21
  ...(toolTracer ? composeHooks(createPermissionDeniedMeter(metrics), toolTracer) : createPermissionDeniedMeter(metrics)),
19
22
  ...(config.hooksTimeoutMs !== undefined ? { timeoutMs: config.hooksTimeoutMs } : {}),
20
23
  };
21
- return { ...ctx, deploymentHooks, deviceLane, dropSessionScoped, executionEnvFactory, fenceSessionOwner, lspManager, noteSessionIncarnation, perSessionCwd, perTaskImage, sendUserFileTaskEnvs, sessionEnvSelection, sessionIncarnationOf, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, worktreeReap };
24
+ return { ...ctx, deploymentHooks, deviceLane, dropSessionScoped, executionEnvFactory, fenceSessionOwner, lspManager, spaceReclaimer, perSessionCwd, perTaskImage, sendUserFileTaskEnvs, sessionEnvSelection, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, worktreeReap };
22
25
  }
23
26
  //# sourceMappingURL=stage-05-execution-env.js.map
@@ -20,7 +20,6 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
20
20
  fleetBus: import("../fleet/fleet-bus.js").FleetEventBus;
21
21
  governanceSeams: import("./governance-seams.js").GovernanceSeams;
22
22
  handslessRunner: Runner;
23
- handslessSubRunner: Runner;
24
23
  hookAgent: import("../hooks/hook-runner.js").HookLlmCall;
25
24
  hookAgentRunner: Runner;
26
25
  hookLlm: import("../hooks/hook-runner.js").HookLlmCall;
@@ -67,12 +66,11 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
67
66
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
68
67
  fenceSessionOwner: (sid: string, owner: string | null) => void;
69
68
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
70
- noteSessionIncarnation: (sid: string, incarnation: string | undefined) => void;
69
+ spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
71
70
  perSessionCwd: Map<string, string>;
72
71
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
73
72
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
74
73
  sessionEnvSelection: import("../capabilities/select-environment-tool.js").SessionEnvironmentSelection;
75
- sessionIncarnationOf: (sid: string) => string | undefined;
76
74
  setSessionCwd: (sid: string, cwd: string) => void;
77
75
  setSessionInheritEnv: (sid: string, policy: import("../request-value-closure.js").TaskInheritEnv | undefined) => void;
78
76
  setSessionShellEnv: (sid: string, env: Record<string, string>) => void;
@@ -121,6 +119,7 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
121
119
  backend: import("../index.js").StoreBackend | undefined;
122
120
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
123
121
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
122
+ engineDataRoot: string;
124
123
  instanceId: string;
125
124
  mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
126
125
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
@@ -3,7 +3,7 @@ import { outwardPlane } from "../terminal.js";
3
3
  import { createSessionTitler } from "../session-titler.js";
4
4
  import { cardRuleScopeRoot } from "../task-cwd.js";
5
5
  import { ForkRoutingSessionStore } from "../plugins/fork-routing-session-store.js";
6
- import { withoutExecutionEnv } from "../capabilities/hands-lane.js";
6
+ import { withoutHands } from "../capabilities/hands-lane.js";
7
7
  import { redactSecrets } from "../trace/redact.js";
8
8
  import { hasServiceAuth } from "../http/server.js";
9
9
  import { workflowModelAllowlistFor } from "../task-workflow.js";
@@ -20,8 +20,9 @@ import { createOrgMemoryAdmissionWiring } from "./org-memory.js";
20
20
  import { createGovernanceSeams } from "./governance-seams.js";
21
21
  import { createSharedMemoryScopeAuthorizer } from "../shared-memory-scope-authorizer.js";
22
22
  import { parkedAskRedeem, runStore } from "./late-binds.js";
23
+ import { withInternalRunEnvs } from "../internal-run-env.js";
23
24
  export function runStage06(ctx) {
24
- const { backend, backgroundAgentStore, brain, sessionIncarnationOf, config, webAdmin, consolidationValve, deploymentHooks, 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;
25
+ const { backend, backgroundAgentStore, brain, engineDataRoot, config, webAdmin, consolidationValve, deploymentHooks, 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;
25
26
  const { sqlWorkflowRunStore, workflowNotifyJournal, workflowCompletionInbox, deliverWorkflowCompletion, workflowNotifyGate, fleetBus, workflowRunStore, workflowJournalStore, outcomeSink, workflowRecoverOpts, workflowAgentRegistry, subagentSteerRegistry, workflowAgentSessionIndex, } = createWorkflowOrchestration({ config, logger, metrics, localRoot, backend, getRunStore: () => runStore });
26
27
  const parkCommitted = backend?.checkpoint && config.durableApproval ? createParkCommitWatch(backend.checkpoint(logger)) : undefined;
27
28
  const checkpointStore = parkCommitted?.store;
@@ -110,9 +111,9 @@ export function runStage06(ctx) {
110
111
  consolidationSeat,
111
112
  hands: commitHands,
112
113
  mcpRevocations,
113
- sessionIncarnationOf,
114
114
  config, logger, metrics, localRoot, promptSource: webAdmin.promptSource, rosterStore, backgroundAgentStore, mailboxStore, mailboxRecipientLifecycle, usageWindowStore, brain,
115
115
  pricing, tracer, outcomeSink, elicitation, question, toolApproval, sessionStore, memoryEngine,
116
+ engineDataRoot,
116
117
  sessionCaptureRecords,
117
118
  memorySyncRunner, toolResultStore: runnerOffloadStore, checkpointStore, sessionPolicyStore, runtimeCapsResolver, fileHistoryStore,
118
119
  permissionRuleStore: permissionRuleProvider,
@@ -123,9 +124,9 @@ export function runStage06(ctx) {
123
124
  getRunStore: () => runStore,
124
125
  });
125
126
  const runner = new Runner(runnerDeps);
126
- const handslessRunner = new Runner(withoutExecutionEnv(runnerDeps));
127
+ const handslessRunner = new Runner(withoutHands(runnerDeps));
127
128
  const { hookModelFor, hookLlm } = createHookLlm({ config, getKeyResolver: () => webAdmin.getKeyResolver(), metrics });
128
- const hookAgentRunner = new Runner({ ...runnerDeps, sessionStore: new TtlSessionStore({ defaultTtlDays: 1 / 24 }) });
129
+ const hookAgentRunner = new Runner(withInternalRunEnvs({ ...runnerDeps, sessionStore: new TtlSessionStore({ defaultTtlDays: 1 / 24 }) }));
129
130
  const agentHookCall = async ({ prompt, model, timeoutMs, system }) => {
130
131
  const pick = hookModelFor(model);
131
132
  if (!pick.ok)
@@ -196,6 +197,7 @@ export function runStage06(ctx) {
196
197
  orgMemoryAdmission,
197
198
  governanceSeams,
198
199
  sharedMemoryStores: sharedMemoryStore ? sharedMemoryStore : undefined,
200
+ engineDataRoot,
199
201
  }),
200
202
  sessionStore: subRunnerSessions,
201
203
  onBackgroundChildEvent: runnerDeps.onBackgroundChildEvent ? runnerDeps.onBackgroundChildEvent : undefined,
@@ -204,7 +206,6 @@ export function runStage06(ctx) {
204
206
  onError: runnerDeps.onError ? runnerDeps.onError : undefined,
205
207
  };
206
208
  const subRunner = new Runner(subRunnerDeps);
207
- const handslessSubRunner = new Runner(withoutExecutionEnv(subRunnerDeps));
208
- return { ...ctx, approvalAskAudit, approvalExemptionStore, centerRuntimeCapsResolver, checkpointStore, parkCommits, durableEnabled, elicitation, fleetBus, governanceSeams, handslessRunner, handslessSubRunner, hookAgent, hookAgentRunner, hookLlm, mcpRevocations, memoryConsolidationFaces, memoryOptOutGrantStore, orgMemoryAdmission, outcomeSink, principalCaps, question, retentionExecutor, retentionLaneStore, runner, runnerDeps, runtimeCapsPeekResolver, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionTitler, sharedMemoryStore, sqlWorkflowRunStore, streamApprovalGate, subRunner, subRunnerSessions, subagentSteerRegistry, toolApproval, workflowAgentRegistry, workflowAgentSessionIndex, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable };
209
+ return { ...ctx, approvalAskAudit, approvalExemptionStore, centerRuntimeCapsResolver, checkpointStore, parkCommits, durableEnabled, elicitation, fleetBus, governanceSeams, handslessRunner, hookAgent, hookAgentRunner, hookLlm, mcpRevocations, memoryConsolidationFaces, memoryOptOutGrantStore, orgMemoryAdmission, outcomeSink, principalCaps, question, retentionExecutor, retentionLaneStore, runner, runnerDeps, runtimeCapsPeekResolver, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionTitler, sharedMemoryStore, sqlWorkflowRunStore, streamApprovalGate, subRunner, subRunnerSessions, subagentSteerRegistry, toolApproval, workflowAgentRegistry, workflowAgentSessionIndex, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable };
209
210
  }
210
211
  //# sourceMappingURL=stage-06-runners.js.map
@@ -35,7 +35,6 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
35
35
  fleetBus: import("../fleet/fleet-bus.js").FleetEventBus;
36
36
  governanceSeams: import("./governance-seams.js").GovernanceSeams;
37
37
  handslessRunner: import("@sema-agent/core").Runner;
38
- handslessSubRunner: import("@sema-agent/core").Runner;
39
38
  hookAgent: import("../hooks/hook-runner.js").HookLlmCall;
40
39
  hookAgentRunner: import("@sema-agent/core").Runner;
41
40
  hookLlm: import("../hooks/hook-runner.js").HookLlmCall;
@@ -82,12 +81,11 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
82
81
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
83
82
  fenceSessionOwner: (sid: string, owner: string | null) => void;
84
83
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
85
- noteSessionIncarnation: (sid: string, incarnation: string | undefined) => void;
84
+ spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
86
85
  perSessionCwd: Map<string, string>;
87
86
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
88
87
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
89
88
  sessionEnvSelection: import("../capabilities/select-environment-tool.js").SessionEnvironmentSelection;
90
- sessionIncarnationOf: (sid: string) => string | undefined;
91
89
  setSessionCwd: (sid: string, cwd: string) => void;
92
90
  setSessionInheritEnv: (sid: string, policy: import("../request-value-closure.js").TaskInheritEnv | undefined) => void;
93
91
  setSessionShellEnv: (sid: string, env: Record<string, string>) => void;
@@ -136,6 +134,7 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
136
134
  backend: import("../index.js").StoreBackend | undefined;
137
135
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
138
136
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
137
+ engineDataRoot: string;
139
138
  instanceId: string;
140
139
  mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
141
140
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
@@ -27,7 +27,7 @@ import { buildDisplaySafeUrl } from "../trace/redact.js";
27
27
  import * as facts from "../capability-facts.js";
28
28
  import { WEB_ADMIN_ENV } from "@sema-agent/settings-schema";
29
29
  export async function runStage07(ctx) {
30
- const { approvalAskAudit, approvalExemptionStore, backend, backgroundAgentStore, brain, checkpointStore, config, webAdmin, counterDegradeHook, durableEnabled, handslessSubRunner, instanceId, localRoot, logger, memoryEngine, metrics, question, runner, runnerDeps, sendUserFileToolSpec, sessionEnvSelection, sessionStore, subRunner, subRunnerSessions, taskListLane, toolApproval } = ctx;
30
+ 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;
31
31
  const authorize = createAuthorizer(config, sessionStore);
32
32
  const runStore = backend ? backend.run() : undefined;
33
33
  bindRunStore(runStore);
@@ -153,8 +153,8 @@ export async function runStage07(ctx) {
153
153
  const ensureChildSessionDurable = checkpointStore && config.sessionBackend === "tidb" ? (sessionId) => ensureChildSessionDurableWithPromotion(sessionStore, subRunnerSessions, sessionId) : undefined;
154
154
  const webFetchSummarize = createWebFetchSummarizeLane({ brain, config, getKeyResolver: () => webAdmin.getKeyResolver(), logger });
155
155
  const scenarioDeps = {
156
- runner, subRunner, handslessSubRunner, model: DEFAULT_MODEL_REF, skills, repoClient, requirePrincipal: config.requirePrincipal,
157
- webSearch: webSearch ? webSearch : undefined, metrics, logger, webFetchSummarize,
156
+ runner, subRunner, model: DEFAULT_MODEL_REF, skills, repoClient, requirePrincipal: config.requirePrincipal,
157
+ webSearch: webSearch ? webSearch : undefined, logger, webFetchSummarize,
158
158
  backgroundAgentStore: backgroundAgentStore ? backgroundAgentStore : undefined,
159
159
  checkpointStore: checkpointStore ? checkpointStore : undefined,
160
160
  ensureChildSessionDurable: ensureChildSessionDurable ? ensureChildSessionDurable : undefined,
@@ -168,7 +168,6 @@ export async function runStage07(ctx) {
168
168
  const parkedReviveInheritedGate = parkedReviveSurface && config.durableApproval
169
169
  ? createParkedReviveInheritedGate({
170
170
  config, question, logger, localRoot,
171
- memoryEngineRoot: memoryEngine?.root,
172
171
  approverSeat: createRunnerDepsOnAsk(toolApproval),
173
172
  approvalExemptionStore,
174
173
  ...(runnerDeps.runtimeCapsResolver ? { resolveRuntimeCaps: runnerDeps.runtimeCapsResolver } : {}),
@@ -48,7 +48,6 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
48
48
  fleetBus: import("../fleet/fleet-bus.js").FleetEventBus;
49
49
  governanceSeams: import("./governance-seams.js").GovernanceSeams;
50
50
  handslessRunner: Runner;
51
- handslessSubRunner: Runner;
52
51
  hookAgent: import("../hooks/hook-runner.js").HookLlmCall;
53
52
  hookAgentRunner: Runner;
54
53
  hookLlm: import("../hooks/hook-runner.js").HookLlmCall;
@@ -95,12 +94,11 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
95
94
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
96
95
  fenceSessionOwner: (sid: string, owner: string | null) => void;
97
96
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
98
- noteSessionIncarnation: (sid: string, incarnation: string | undefined) => void;
97
+ spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
99
98
  perSessionCwd: Map<string, string>;
100
99
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
101
100
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
102
101
  sessionEnvSelection: import("../capabilities/select-environment-tool.js").SessionEnvironmentSelection;
103
- sessionIncarnationOf: (sid: string) => string | undefined;
104
102
  setSessionCwd: (sid: string, cwd: string) => void;
105
103
  setSessionInheritEnv: (sid: string, policy: import("../request-value-closure.js").TaskInheritEnv | undefined) => void;
106
104
  setSessionShellEnv: (sid: string, env: Record<string, string>) => void;
@@ -149,6 +147,7 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
149
147
  backend: import("../index.js").StoreBackend | undefined;
150
148
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
151
149
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
150
+ engineDataRoot: string;
152
151
  instanceId: string;
153
152
  mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
154
153
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
@@ -5,7 +5,7 @@ import { startRetentionLane, RETENTION_LEASE_TTL_FACTOR } from "./retention-lane
5
5
  import { createLimitSync } from "./limit-sync.js";
6
6
  import { runDenySweep } from "./late-binds.js";
7
7
  export function runStage08(ctx) {
8
- const { approvalNonceStore, backend, backgroundAgentStore, ceilingVerdict, checkpointStore, parkCommits, config, webAdmin, consolidationSeatWatch, costQuota, degradeRouteWatch, fileHistoryErasure, handslessRunner, handslessSubRunner, hookAgentRunner, imageBakes, instanceId, localRoot, logger, mailboxStore, metrics, permissionRuleStores, pricing, rateLimiter, retentionExecutor, retentionLaneStore, rosterStore, runStore, runner, sqlWorkflowRunStore, subRunner, taskAttachmentStore, toolApproval, toolResultStore, userInputLedger, workflowJournalStore, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, worktreeReap } = ctx;
8
+ const { approvalNonceStore, backend, backgroundAgentStore, ceilingVerdict, checkpointStore, parkCommits, config, webAdmin, consolidationSeatWatch, costQuota, degradeRouteWatch, fileHistoryErasure, spaceReclaimer, handslessRunner, hookAgentRunner, imageBakes, instanceId, localRoot, logger, mailboxStore, metrics, permissionRuleStores, pricing, rateLimiter, retentionExecutor, retentionLaneStore, rosterStore, runStore, runner, sqlWorkflowRunStore, subRunner, taskAttachmentStore, toolApproval, toolResultStore, userInputLedger, workflowJournalStore, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, worktreeReap } = ctx;
9
9
  const reaper = startReapers({
10
10
  config, logger, metrics, localRoot, backend, subRunner, runStore, checkpointStore, parkCommits,
11
11
  rateLimiter, costQuota, toolResultStore, fileHistoryErasure, taskAttachmentStore, imageBakes, worktreeReap,
@@ -30,6 +30,7 @@ export function runStage08(ctx) {
30
30
  },
31
31
  audit: { append: (row) => retentionLaneStore.appendAudit(row, Date.now()) },
32
32
  holdInForce: (domain) => retentionLaneStore.holdInForce(domain),
33
+ ...(spaceReclaimer !== undefined ? { spaceReclaimer } : {}),
33
34
  logger,
34
35
  metrics,
35
36
  now: () => Date.now(),
@@ -56,7 +57,6 @@ export function runStage08(ctx) {
56
57
  ["handsless", handslessRunner],
57
58
  ["hookAgent", hookAgentRunner],
58
59
  ["sub", subRunner],
59
- ["handslessSub", handslessSubRunner],
60
60
  ];
61
61
  const swapRunnerDeps = (next) => {
62
62
  for (let i = 0; i < bootRunners.length; i++) {
@@ -77,7 +77,6 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
77
77
  fleetBus: import("../fleet/fleet-bus.js").FleetEventBus;
78
78
  governanceSeams: import("./governance-seams.js").GovernanceSeams;
79
79
  handslessRunner: import("@sema-agent/core").Runner;
80
- handslessSubRunner: import("@sema-agent/core").Runner;
81
80
  hookAgent: import("../hooks/hook-runner.js").HookLlmCall;
82
81
  hookAgentRunner: import("@sema-agent/core").Runner;
83
82
  hookLlm: import("../hooks/hook-runner.js").HookLlmCall;
@@ -124,12 +123,11 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
124
123
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
125
124
  fenceSessionOwner: (sid: string, owner: string | null) => void;
126
125
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
127
- noteSessionIncarnation: (sid: string, incarnation: string | undefined) => void;
126
+ spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
128
127
  perSessionCwd: Map<string, string>;
129
128
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
130
129
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
131
130
  sessionEnvSelection: import("../capabilities/select-environment-tool.js").SessionEnvironmentSelection;
132
- sessionIncarnationOf: (sid: string) => string | undefined;
133
131
  setSessionCwd: (sid: string, cwd: string) => void;
134
132
  setSessionInheritEnv: (sid: string, policy: import("../request-value-closure.js").TaskInheritEnv | undefined) => void;
135
133
  setSessionShellEnv: (sid: string, env: Record<string, string>) => void;
@@ -178,6 +176,7 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
178
176
  backend: import("../index.js").StoreBackend | undefined;
179
177
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
180
178
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
179
+ engineDataRoot: string;
181
180
  instanceId: string;
182
181
  mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
183
182
  mailboxStore: import("@sema-agent/core").MailboxStore | undefined;
@@ -6,7 +6,7 @@ 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, config, webAdmin, deviceLane, dropSessionScoped, durableEnabled, executionEnvFactory, fileHistoryErasure, governanceSeams, localRoot, logger, mailboxRecipientLifecycle, mailboxStore, metrics, pricing, resumeAnchorStore, runStore, runnerDeps, sessionPolicyStore, sessionStore, streamApprovalGate, taskAttachmentStore, taskListLane, toolResultStore, tracer, usageWindowStore, userInputLedgerStore, workflowCompletionInbox } = ctx;
9
+ const { approvalExemptionStore, backend, backgroundAgentStore, brain, checkpointStore, 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;
10
10
  const { ownerAware, sessionAudit, sessionWatchRegistry, purgeSession, instrumentDegenerate, planCacheProbe } = createSessionFaces({
11
11
  deviceStore: deviceLane?.store,
12
12
  dropSessionScoped,
@@ -15,6 +15,7 @@ export function runStage09(ctx) {
15
15
  workflowCompletionInbox, taskListLane, mailboxStore, mailboxRecipientLifecycle,
16
16
  backgroundAgentStore,
17
17
  userInputLedgerStore,
18
+ ...(spaceReclaimer !== undefined ? { spaceReclaimer } : {}),
18
19
  });
19
20
  const leaderEndpoint = createLeaderFace({ config, logger, brain, pricing, executionEnvFactory, toolResultStore, sessionStore, checkpointStore, governanceSeams, backend, tracer, usageWindowStore, promptSource: webAdmin.promptSource, onError: runnerDeps.onError });
20
21
  const drainState = { draining: false };
@@ -76,7 +76,6 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
76
76
  fleetBus: import("../fleet/fleet-bus.js").FleetEventBus;
77
77
  governanceSeams: import("./governance-seams.js").GovernanceSeams;
78
78
  handslessRunner: import("@sema-agent/core").Runner;
79
- handslessSubRunner: import("@sema-agent/core").Runner;
80
79
  hookAgent: import("../hooks/hook-runner.js").HookLlmCall;
81
80
  hookAgentRunner: import("@sema-agent/core").Runner;
82
81
  hookLlm: import("../hooks/hook-runner.js").HookLlmCall;
@@ -123,12 +122,11 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
123
122
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
124
123
  fenceSessionOwner: (sid: string, owner: string | null) => void;
125
124
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
126
- noteSessionIncarnation: (sid: string, incarnation: string | undefined) => void;
125
+ spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
127
126
  perSessionCwd: Map<string, string>;
128
127
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
129
128
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
130
129
  sessionEnvSelection: import("../capabilities/select-environment-tool.js").SessionEnvironmentSelection;
131
- sessionIncarnationOf: (sid: string) => string | undefined;
132
130
  setSessionCwd: (sid: string, cwd: string) => void;
133
131
  setSessionInheritEnv: (sid: string, policy: import("../request-value-closure.js").TaskInheritEnv | undefined) => void;
134
132
  setSessionShellEnv: (sid: string, env: Record<string, string>) => void;
@@ -177,6 +175,7 @@ export declare function runStage10(ctx: Awaited<ReturnType<typeof runStage09>>):
177
175
  backend: import("../plugins/store-backend.js").StoreBackend | undefined;
178
176
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
179
177
  breakerState: import("../plugins/breaker-state-sql.js").TiDBBreakerState | import("../plugins/breaker-state-sql.js").PgBreakerState | undefined;
178
+ engineDataRoot: string;
180
179
  instanceId: string;
181
180
  mailboxRecipientLifecycle: import("../plugins/mailbox-recipient-lifecycle.js").MailboxRecipientLifecycle | undefined;
182
181
  mailboxStore: import("@sema-agent/core").MailboxStore | 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, parkCommits, config, webAdmin, consolidationValve, costQuota, deploymentHooks, deviceLane, drainState, durableEnabled, elicitation, fenceSessionOwner, noteSessionIncarnation, fileHistoryStore, fleetBus, fleetLease, fleetUsage, governanceSeams, handslessRunner, hookAgent, hookLlm, hookWakeBus, imageBakes, imageIndex, instanceId, instrumentDegenerate, leaderEndpoint, localRoot, logger, lspManager, mcpRevocations, memoryBundleFaces, memoryComplianceFaces, memoryConsolidationFaces, memoryEngine, memoryExportBackend, memoryOptOutGrantStore, memoryOriginFaces, memoryPosture, memorySyncCursors, 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, scenarioDetails, scenarios, selectEnvTool, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionAudit, sessionEnvSelection, sessionMemoryStatusFace, sessionPolicyStore, sessionTitler, sessionWatchRegistry, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, sharedMemoryStore, sideQueryAccounting, sqlEngineFacts, sqlWorkflowRunStore, staticWiring, storePosture, subRunner, subagentSteerRegistry, taskAttachmentStore, taskLimitCaps, taskTimeoutSec, toolApproval, toolResultStore, usageWindowStore, userInputLedger, webSearchProvider, workflowAgentRegistry, workflowAgentSessionIndex, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable } = ctx;
32
+ const { approvalAskAudit, approvalExemptionStore, approvalNonceStore, authorize, backend, backgroundAgentStore, brain, breakerState, centerRuntimeCapsResolver, checkpointStore, parkCommits, config, webAdmin, consolidationValve, costQuota, deploymentHooks, deviceLane, drainState, durableEnabled, elicitation, fenceSessionOwner, fileHistoryStore, fleetBus, fleetLease, fleetUsage, governanceSeams, handslessRunner, hookAgent, hookLlm, hookWakeBus, imageBakes, imageIndex, instanceId, instrumentDegenerate, leaderEndpoint, localRoot, logger, lspManager, mcpRevocations, memoryBundleFaces, memoryComplianceFaces, memoryConsolidationFaces, memoryEngine, memoryExportBackend, memoryOptOutGrantStore, memoryOriginFaces, memoryPosture, memorySyncCursors, 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, scenarioDetails, scenarios, selectEnvTool, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionAudit, sessionEnvSelection, sessionMemoryStatusFace, sessionPolicyStore, sessionTitler, sessionWatchRegistry, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, sharedMemoryStore, sideQueryAccounting, sqlEngineFacts, sqlWorkflowRunStore, staticWiring, storePosture, subRunner, subagentSteerRegistry, taskAttachmentStore, taskLimitCaps, taskTimeoutSec, toolApproval, toolResultStore, usageWindowStore, userInputLedger, webSearchProvider, workflowAgentRegistry, workflowAgentSessionIndex, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable } = ctx;
33
33
  const stores = {
34
34
  runStore,
35
35
  resumeAnchorStore: resumeAnchorStore ? resumeAnchorStore : undefined,
@@ -177,6 +177,7 @@ export async function runStage10(ctx) {
177
177
  configApplyState: () => webAdmin.configApplyState(),
178
178
  centerCredentialState: () => webAdmin.centerCredentialState(),
179
179
  modelRefusalsState: () => webAdmin.modelRefusalsState(),
180
+ candidateRejectionState: () => webAdmin.candidateRejectionState(),
180
181
  configHandoffState: () => webAdmin.configHandoffState(),
181
182
  mcpRevocations,
182
183
  mcpRevocationState: () => webAdmin.mcpRevocationState(),
@@ -199,7 +200,6 @@ export async function runStage10(ctx) {
199
200
  getCenterPrompts: () => webAdmin.getCenterPrompts(),
200
201
  getKeyResolver: () => webAdmin.getKeyResolver(),
201
202
  taskAttachmentStore, perSessionCwd, setSessionCwd, setSessionShellEnv, fenceSessionOwner,
202
- noteSessionIncarnation,
203
203
  hookLlm, hookAgent, fleetBus, hookWakeBus, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec,
204
204
  selectEnvTool, sendUserFileToolSpec, memoryEngine, durableEnabled, approvalExemptionStore,
205
205
  checkpointStore, deploymentHooks, imageIndex, perTaskImage,
@@ -20,6 +20,7 @@ export declare function openStores(ctx: OpenStoresCtx): Promise<{
20
20
  backend: MemoryBackend;
21
21
  root: string;
22
22
  } | undefined;
23
+ engineDataRoot: string;
23
24
  memorySyncCursors: MemorySyncStore | undefined;
24
25
  rosterStore: import("@sema-agent/core").RosterStore | undefined;
25
26
  backgroundAgentStore: import("@sema-agent/core").BackgroundAgentStore | undefined;
@@ -119,6 +119,7 @@ export async function openStores(ctx) {
119
119
  if (config.dbBackend === "local" && backend)
120
120
  config.sessionBackend = "tidb";
121
121
  let memoryEngine;
122
+ const engineDataRoot = memoryEngineRootFor(config, localRoot);
122
123
  let memorySyncCursors;
123
124
  let vectorMode;
124
125
  if (config.memoryEngineBackend !== "file" && config.memoryEngineEnabled) {
@@ -169,7 +170,7 @@ export async function openStores(ctx) {
169
170
  ...(embedder !== undefined ? { embedder } : {}),
170
171
  });
171
172
  vectorMode = pgMem.vectorMode;
172
- memoryEngine = { backend: pgMem, root: memoryEngineRootFor(config, localRoot) };
173
+ memoryEngine = { backend: pgMem, root: engineDataRoot };
173
174
  }
174
175
  else {
175
176
  const pool = backend?.mysqlPool();
@@ -181,7 +182,7 @@ export async function openStores(ctx) {
181
182
  memorySyncCursors = new TiDBMemorySyncStore(pool);
182
183
  const tidbMem = new TiDBMemoryEngineBackend(pool, { history: countedHistorySink(new TiDBMemoryHistoryStore(pool)) });
183
184
  vectorMode = tidbMem.vectorMode;
184
- memoryEngine = { backend: tidbMem, root: memoryEngineRootFor(config, localRoot) };
185
+ memoryEngine = { backend: tidbMem, root: engineDataRoot };
185
186
  }
186
187
  logger.info("memory_engine_enabled", {
187
188
  enabled: true,
@@ -447,7 +448,7 @@ export async function openStores(ctx) {
447
448
  .startRefresh()
448
449
  : undefined;
449
450
  return {
450
- backend, storePosture, memoryEngine, memorySyncCursors, rosterStore, backgroundAgentStore, mailboxRecipientLifecycle,
451
+ backend, storePosture, memoryEngine, engineDataRoot, memorySyncCursors, rosterStore, backgroundAgentStore, mailboxRecipientLifecycle,
451
452
  taskAttachmentStore, mailboxStore, memoryExportBackend, memorySyncRunner, sessionStore, breakerState,
452
453
  usageWindowStore, memoryPosture, taskListLane, sqlEngineFacts,
453
454
  };
@@ -15,6 +15,7 @@ import type { ConsolidationSeatWatch } from "./memory-consolidation.js";
15
15
  import type { DegradeRouteWatch } from "../brain.js";
16
16
  import { type EngineRestartSignal } from "../web-admin-client/facade.js";
17
17
  import { type ConfigHandoff } from "../fleet/engine-signal.js";
18
+ import { type CandidateRejection } from "../web-admin-client/candidate-gate.js";
18
19
  import { type ConfigApplyLedgerView } from "../web-admin-client/apply-ledger.js";
19
20
  import type { CenterPullView } from "../web-admin-client/pull-state.js";
20
21
  import type { LimitSync } from "./limit-sync.js";
@@ -117,6 +118,10 @@ export interface WebAdminRuntime {
117
118
  * 名 → 码 + 组拒码)。描述**最近一次被判的那份中心候选目录**(每次候选 apply 的报告 `ApplyReport.modelRefusals` 投影;组拒时就是被拒
118
119
  * 的那份 —— 引擎自己的拒因表不换代)。没有可报的拒 / 没有配置管道 / 还没判过候选 ⇒ `undefined`(键缺席)。值变了 ⇒ 通知自报订阅者。 */
119
120
  modelRefusalsState(): ModelRefusalsSignal | undefined;
121
+ /** S-1457:`GET /v1/models.candidateRejected` 的取值口 —— 最近一次候选被判官整拒的结论(`candidateRejection` 座;域集就是判官交出的 `rejected.domains`)。
122
+ * present-iff 当前生效的配置是因判官整拒了最近一份候选而回落的那一份:后来的候选被判 clean 即撤下;还没判过候选 / 没有配置管道 ⇒ `undefined`(键缺席)。
123
+ * dry-run 姿势(`webAdmin.dryRun`,compare-only)恒 `undefined`:候选从不被应用,生效配置恒是 env,拒判是预演读数(日志行照响),不是配置没换的原因。 */
124
+ candidateRejectionState(): CandidateRejection | undefined;
120
125
  /** [ref] 世代账:/health 的 target/applied/失败持续时长三键 + 诊断端点的 configApply 段(同一份读数)。
121
126
  * `undefined` = 本部署没有配置管道(纯 env worker)⇒ 两个读面的形状**逐字不变**(additive 纪律)。 */
122
127
  configApplyState(): ConfigApplyLedgerView | undefined;
@@ -23,7 +23,7 @@ import { applyEffective, applyCenterReadFace, mutateInPlace, logEffectiveDiff, a
23
23
  import { buildConfigHandoff, buildRestartSignal, configHandoffMissing } from "../fleet/engine-signal.js";
24
24
  import { createMcpRevocationLedger, enabledMcpEntries } from "../web-admin-client/mcp-revocation.js";
25
25
  import { buildUnreadConfigFileFields } from "../web-admin-client/read-warnings.js";
26
- import { CONFIG_DOMAIN_INVALID_NOTE, buildCandidateRejectedFields, judgeConfigCandidate } from "../web-admin-client/candidate-gate.js";
26
+ import { CONFIG_DOMAIN_INVALID_NOTE, buildCandidateRejectedFields, candidateRejectionOf, judgeConfigCandidate } from "../web-admin-client/candidate-gate.js";
27
27
  import { SHA256_HEX_RE } from "../digest-form.js";
28
28
  import { BOOT_REJUDGE_OF_REFUSED_GROUP, createConfigApplyLedger, modelPlaneCommitted, refusedGroups } from "../web-admin-client/apply-ledger.js";
29
29
  function lkgReadNote(scope) {
@@ -31,7 +31,7 @@ function lkgReadNote(scope) {
31
31
  case "whole":
32
32
  return "booting from the persisted last-known-good (all restart-to-apply faces included) — the live pull continues in the background and reconciles on arrival";
33
33
  case "model-plane":
34
- return "the live candidate's model plane was refused at boot — the persisted last-known-good supplies the model plane only (catalog and the collab templates that reference it); every other group and every restart-to-apply face stays the live candidate's";
34
+ return "the live candidate's model plane was refused at boot — the persisted last-known-good supplies the model plane only (the catalog and what rides with it); every other group and every restart-to-apply face stays the live candidate's";
35
35
  }
36
36
  }
37
37
  export async function createWebAdminRuntime(ctx) {
@@ -39,7 +39,14 @@ export async function createWebAdminRuntime(ctx) {
39
39
  let ccEtag;
40
40
  let effective;
41
41
  let latestEffective;
42
- let lastRejectedCandidate;
42
+ let candidateRejection;
43
+ let judgedOrdinal = 0;
44
+ const noteCandidateVerdict = (ordinal, rejection) => {
45
+ if (ordinal < judgedOrdinal)
46
+ return;
47
+ judgedOrdinal = ordinal;
48
+ candidateRejection = rejection;
49
+ };
43
50
  const applyLedger = createConfigApplyLedger();
44
51
  let lastPull = "none";
45
52
  let generationOrdinal = 0;
@@ -146,11 +153,16 @@ export async function createWebAdminRuntime(ctx) {
146
153
  });
147
154
  }
148
155
  };
149
- const announceCandidateRejected = (r, verdict, leg) => {
156
+ const rejectionSource = () => {
157
+ if (configProvider === undefined)
158
+ throw new Error("config candidate judged without a config provider (no pipeline ⇒ nothing was pulled)");
159
+ return configProvider.kind;
160
+ };
161
+ const announceCandidateRejected = (r, verdict, leg, ordinal) => {
150
162
  const domains = verdict.domains.join(",");
151
- if (lastRejectedCandidate?.version === r.effective.version && lastRejectedCandidate.domains === domains)
163
+ if (candidateRejection?.version === r.effective.version && candidateRejection.domains.join(",") === domains)
152
164
  return;
153
- lastRejectedCandidate = { version: r.effective.version, domains, at: Date.now() };
165
+ noteCandidateVerdict(ordinal, candidateRejectionOf(r, verdict, rejectionSource(), Date.now()));
154
166
  logger.warn("config_candidate_rejected", buildCandidateRejectedFields(r, verdict, leg, { lkgVersion: latestEffective?.version ?? "(env)", ...localDirField }));
155
167
  };
156
168
  const selfReportListeners = [];
@@ -503,7 +515,7 @@ export async function createWebAdminRuntime(ctx) {
503
515
  hint: rejected && modelsDomainErr
504
516
  ? "config.d/models.json 在场但 models 域判形失败,整份本地候选被拒(真因见本行 domainError)— 模型继续走 env 兜底"
505
517
  : rejected
506
- ? "config.d 里别的域判形失败,整份本地候选被拒(坏域与真因见 config_candidate_rejected)— config.d/models.json 的模型不用,继续走 env 兜底"
518
+ ? "config.d 里别的域让整份本地候选被拒(判形失败,或带事实的退役域文档;坏域与真因见 config_candidate_rejected)— config.d/models.json 的模型不用,继续走 env 兜底"
507
519
  : modelsDropped.length > 0 && totalModels === 0
508
520
  ? "config.d/models.json 的条目全部被逐条丢弃(逐条真因见 config_entry_dropped)— 模型继续走 env 兜底"
509
521
  : totalModels > 0
@@ -536,7 +548,7 @@ export async function createWebAdminRuntime(ctx) {
536
548
  if (dryRun) {
537
549
  const dryVerdict = judgeConfigCandidate(r);
538
550
  if (dryVerdict.verdict === "rejected") {
539
- announceCandidateRejected(r, dryVerdict, "boot");
551
+ announceCandidateRejected(r, dryVerdict, "boot", generationOrdinal);
540
552
  }
541
553
  else {
542
554
  warnReadNotices(r, "boot");
@@ -550,7 +562,7 @@ export async function createWebAdminRuntime(ctx) {
550
562
  await bootFallBackWhole(`boot candidate rejected: ${bootVerdict.domains.join(",")}`);
551
563
  const rejectedGen = generationOf(r.effective.version);
552
564
  applyLedger.seenTarget(rejectedGen, r.effective.version);
553
- announceCandidateRejected(r, bootVerdict, "boot");
565
+ announceCandidateRejected(r, bootVerdict, "boot", rejectedGen);
554
566
  if (configProvider.kind === "local")
555
567
  warnLocalNoModels(r, true);
556
568
  }
@@ -581,7 +593,7 @@ export async function createWebAdminRuntime(ctx) {
581
593
  applyEffective(config, withModelPlaneOf(r.effective, lkgPlane.effective), logger, { leg: "boot", sealedKeys, generation: bootGen, report: (rep) => (planeReport = rep) });
582
594
  if (modelPlaneCommitted(planeReport)) {
583
595
  bootPlaneEff = lkgPlane.effective;
584
- 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 (catalog and the collab templates that reference it) with the live candidate's other groups; the refresh cadence re-judges the candidate" });
596
+ 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" });
585
597
  }
586
598
  }
587
599
  }
@@ -665,6 +677,7 @@ export async function createWebAdminRuntime(ctx) {
665
677
  restartState: () => buildRestartSignal(pendingRestart, planeDeferredNoHandoff),
666
678
  configHandoffState: () => (configProvider === undefined || configProvider.kind === "local" || !lkgSurvivesRestart ? undefined : buildConfigHandoff(latchHandoff(), handoffMissingSince)),
667
679
  modelRefusalsState: () => modelRefusals,
680
+ candidateRejectionState: () => (cc?.dryRun ? undefined : candidateRejection),
668
681
  configApplyState: () => (configProvider ? applyLedger.view() : undefined),
669
682
  centerPullState: () => {
670
683
  const view = applyLedger.view();
@@ -858,10 +871,10 @@ export async function createWebAdminRuntime(ctx) {
858
871
  applyLedger.seenTarget(tickGen, r.effective.version);
859
872
  const verdict = judgeConfigCandidate(r);
860
873
  if (verdict.verdict === "rejected") {
861
- announceCandidateRejected(r, verdict, arrival !== undefined ? "late-boot" : "refresh");
874
+ announceCandidateRejected(r, verdict, arrival !== undefined ? "late-boot" : "refresh", tickGen);
862
875
  return "ok";
863
876
  }
864
- lastRejectedCandidate = undefined;
877
+ noteCandidateVerdict(tickGen, undefined);
865
878
  warnReadNotices(r, "refresh");
866
879
  if (ccRef?.dryRun) {
867
880
  logEffectiveDiff(config, r.effective, logger);
@@ -918,7 +931,7 @@ export async function createWebAdminRuntime(ctx) {
918
931
  const signal = signalRestart({ applied: "complete", effective: r.effective, ...(r.etag !== undefined ? { etag: r.etag } : {}), baseline: effective, lkgPersisted });
919
932
  logger.info("web_admin_refreshed", {
920
933
  version: r.effective.version,
921
- note: "collab + runtime governance (incl. approvalRequire) + limits + models/roles/roster hot-applied; skills/mcp/a2a/scenarios are restart-to-apply",
934
+ note: "runtime governance (incl. approvalRequire) + limits + models/roles/roster hot-applied; skills/mcp/a2a/scenarios are restart-to-apply",
922
935
  ...restartLogFields(signal),
923
936
  });
924
937
  latestEffective = r.effective;
@@ -967,9 +980,10 @@ export async function createWebAdminRuntime(ctx) {
967
980
  applyLedger.seenTarget(lateGen, r.effective.version);
968
981
  const lateVerdict = judgeConfigCandidate(r);
969
982
  if (lateVerdict.verdict === "rejected") {
970
- announceCandidateRejected(r, lateVerdict, "late-boot");
983
+ announceCandidateRejected(r, lateVerdict, "late-boot", lateGen);
971
984
  return;
972
985
  }
986
+ noteCandidateVerdict(lateGen, undefined);
973
987
  warnReadNotices(r, "boot-deferred");
974
988
  if (ccRef?.dryRun) {
975
989
  logEffectiveDiff(config, r.effective, logger);