@sema-agent/server 7.99.0 → 7.100.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 (115) hide show
  1. package/MIGRATION.md +13 -0
  2. package/USAGE.md +75 -52
  3. package/dist/approval-ask-machine.d.ts +10 -0
  4. package/dist/approval-ask-machine.js +3 -0
  5. package/dist/approval-card.d.ts +74 -1
  6. package/dist/approval-card.js +41 -8
  7. package/dist/approval.d.ts +44 -20
  8. package/dist/approval.js +14 -6
  9. package/dist/boot/config-center.d.ts +16 -8
  10. package/dist/boot/config-center.js +39 -81
  11. package/dist/boot/execution-env.d.ts +1 -2
  12. package/dist/boot/execution-env.js +2 -2
  13. package/dist/boot/leader.js +12 -9
  14. package/dist/boot/memory-consolidation.d.ts +38 -0
  15. package/dist/boot/memory-consolidation.js +35 -0
  16. package/dist/boot/resolve-spec.d.ts +0 -1
  17. package/dist/boot/resolve-spec.js +4 -3
  18. package/dist/boot/runner-deps.d.ts +2 -2
  19. package/dist/boot/stage-05-execution-env.d.ts +1 -1
  20. package/dist/boot/stage-06-runners.d.ts +2 -2
  21. package/dist/boot/stage-06-runners.js +3 -3
  22. package/dist/boot/stage-07-capability-layer.d.ts +2 -3
  23. package/dist/boot/stage-07-capability-layer.js +6 -6
  24. package/dist/boot/stage-08-reapers.d.ts +3 -4
  25. package/dist/boot/stage-08-reapers.js +2 -2
  26. package/dist/boot/stage-09-leader.d.ts +2 -3
  27. package/dist/boot/stage-10-http-server.d.ts +2 -3
  28. package/dist/boot/stage-10-http-server.js +2 -2
  29. package/dist/capabilities/center-plugins.d.ts +14 -2
  30. package/dist/capabilities/center-plugins.js +13 -5
  31. package/dist/capabilities/hands-lane.js +2 -1
  32. package/dist/capabilities/scenarios.js +18 -5
  33. package/dist/capabilities/tool-defer.d.ts +2 -2
  34. package/dist/config-catalog.d.ts +2 -2
  35. package/dist/config-catalog.js +12 -13
  36. package/dist/config-center/apply-effective.d.ts +34 -39
  37. package/dist/config-center/apply-effective.js +100 -64
  38. package/dist/config-center/apply-ledger.d.ts +35 -16
  39. package/dist/config-center/apply-ledger.js +25 -18
  40. package/dist/config-center/facade.d.ts +11 -5
  41. package/dist/config-center/facade.js +1 -1
  42. package/dist/config-center/hot-keys-registry.d.ts +11 -4
  43. package/dist/config-center/hot-keys-registry.js +11 -7
  44. package/dist/config-center/restart-signal.d.ts +21 -14
  45. package/dist/config-center/restart-signal.js +16 -22
  46. package/dist/config-center/types.d.ts +3 -3
  47. package/dist/config-types.d.ts +22 -7
  48. package/dist/cross-session-settings.js +1 -1
  49. package/dist/host-lsp-manager.d.ts +29 -0
  50. package/dist/host-lsp-manager.js +14 -0
  51. package/dist/http/active-run-conflict.d.ts +2 -12
  52. package/dist/http/active-run-conflict.js +1 -6
  53. package/dist/http/admission.js +8 -0
  54. package/dist/http/resume-legs.d.ts +1 -1
  55. package/dist/http/resume-legs.js +14 -10
  56. package/dist/http/route-ctx.d.ts +2 -2
  57. package/dist/http/routes/approvals-assistant.d.ts +1 -1
  58. package/dist/http/routes/approvals-assistant.js +2 -2
  59. package/dist/http/routes/memory-compliance.js +5 -0
  60. package/dist/http/routes/memory-origin.js +5 -0
  61. package/dist/http/routes/sessions.js +6 -0
  62. package/dist/http/routes/tasks.js +7 -6
  63. package/dist/http/server.d.ts +6 -5
  64. package/dist/http/wire-types.d.ts +6 -3
  65. package/dist/leader/wire.d.ts +20 -12
  66. package/dist/leader/wire.js +7 -6
  67. package/dist/memory-layer-preflight.d.ts +46 -0
  68. package/dist/memory-layer-preflight.js +121 -0
  69. package/dist/memory-operator-faces.js +17 -1
  70. package/dist/observability/corrupt-read-seat.d.ts +21 -4
  71. package/dist/observability/corrupt-read-seat.js +31 -0
  72. package/dist/observability/fail-open.d.ts +8 -4
  73. package/dist/observability/fail-open.js +8 -4
  74. package/dist/observability/run-terminal.js +1 -0
  75. package/dist/observability/secret-env-scrub.d.ts +1 -0
  76. package/dist/observability/secret-env-scrub.js +1 -0
  77. package/dist/orchestration/workflow-completion-inbox.d.ts +31 -23
  78. package/dist/orchestration/workflow-completion-inbox.js +8 -3
  79. package/dist/plugins/approval-ask-store-file.d.ts +20 -2
  80. package/dist/plugins/approval-ask-store-file.js +21 -3
  81. package/dist/plugins/approval-ask-store-memory.d.ts +2 -0
  82. package/dist/plugins/approval-ask-store-memory.js +39 -13
  83. package/dist/plugins/approval-ask-store-sql.d.ts +24 -5
  84. package/dist/plugins/approval-ask-store-sql.js +27 -3
  85. package/dist/plugins/checkpoint-store-sql.d.ts +9 -3
  86. package/dist/plugins/checkpoint-store-sql.js +19 -2
  87. package/dist/plugins/local-checkpoint-store.js +2 -0
  88. package/dist/plugins/mailbox-store-sql.d.ts +7 -5
  89. package/dist/plugins/mailbox-store-sql.js +6 -4
  90. package/dist/plugins/permission-rule-store-file.js +3 -2
  91. package/dist/plugins/sql-json-column.d.ts +16 -3
  92. package/dist/plugins/sql-json-column.js +15 -4
  93. package/dist/plugins/web-search.d.ts +42 -22
  94. package/dist/plugins/web-search.js +141 -49
  95. package/dist/run-local.js +6 -5
  96. package/dist/runs.js +6 -5
  97. package/dist/runtime-governance.d.ts +50 -3
  98. package/dist/runtime-governance.js +5 -0
  99. package/dist/server-secret-env.d.ts +4 -2
  100. package/dist/task-settings.d.ts +1 -1
  101. package/dist/tool-approval.d.ts +107 -19
  102. package/dist/tool-approval.js +64 -15
  103. package/dist/trace/core-keyset-guard.d.ts +5 -5
  104. package/dist/trace/ledger-sink.js +2 -2
  105. package/dist/trace/project.d.ts +13 -0
  106. package/dist/trace/project.js +22 -5
  107. package/dist/trace/projection-drop.d.ts +2 -0
  108. package/dist/trace/projection-drop.js +6 -0
  109. package/dist/trace/sema-provenance.d.ts +4 -1
  110. package/dist/trace/sema-provenance.js +1 -1
  111. package/dist/trace/task-notification-facets.d.ts +65 -0
  112. package/dist/trace/task-notification-facets.js +31 -0
  113. package/dist/trace/wire-projection-faces.d.ts +3 -3
  114. package/dist/trace/wire-projection-faces.js +3 -3
  115. package/package.json +3 -3
@@ -8,6 +8,7 @@ import { type ModelKeyRef } from "../key-resolver.js";
8
8
  import type { Logger } from "../observability/logger.js";
9
9
  import type { Metrics } from "../observability/metrics.js";
10
10
  import type { UnpricedCeilingVerdict } from "./unpriced-ceiling-verdict.js";
11
+ import type { ConsolidationSeatWatch } from "./memory-consolidation.js";
11
12
  import { type RestartSignal } from "../config-center/facade.js";
12
13
  import { type ConfigApplyLedgerView } from "../config-center/apply-ledger.js";
13
14
  import type { LimitSync } from "./limit-sync.js";
@@ -43,19 +44,25 @@ export interface ConfigCenterRuntime {
43
44
  /** 60s refresh cadence + boot-deferred 到货续接。
44
45
  * `limitSync`([ref] 批1)= 恒构造的两只限额座的换代口:commit 之后**零 await 内**推一把,与 pricing /
45
46
  * keyResolver 那两件派生重建同族(缺席 = 这条腿本部署没装配,例如 run-local)。
46
- * `swapRunnerDeps`(core 7.10.0 `Runner.swapDeps` 一扇门;5.49 起的 `swapModels` 口在 7.10.0 退役、
47
- * 本参数同语义改名)= **可换席**的换装口:模型面 plane 变更候选在 commit 前喂给全部 boot Runner
48
- * 原子换代(在场 ⇒ models-tiers defer/restart 臂退役,缺席 ⇒ 旧 defer 行为逐字保留);S-174 起
49
- * read **face** 席也走同一只函数(见 refresh 拍里的 `applyCenterReadFace` 调用点)。
47
+ * `swapRunnerDeps`(core 7.10.0 `Runner.swapDeps` 一扇门)= **可换席**的换装口,**必填**:模型面 plane
48
+ * 变更候选在 commit 前喂给全部 boot Runner 原子换代;S-174 起 read **face** 席也走同一只函数(见 refresh
49
+ * 拍里的 `applyLiveReadFace`)。S-668 波 0 起必填 —— 它缺席的那一形(模型面整面 defer 到重启 + `models-tiers`
50
+ * 重启片)在生产上从来到不了(stage-08 唯一调用点恒传),随片一起退役;要刷新环就要有 Runner 可换。
50
51
  * `ceilingVerdict`(S-232)= 「配了 $ 天花板但目录未定价」这条判决的活载体,与 `limitSync` **同族同序**
51
52
  * (commit 之后、零 await 内重判一次;判决不翻转就静默)。缺席 = 这条腿本部署没装配(run-local 一次性
52
- * CLI 之后不再有刷新拍,它继续用纯判据判一次)。 */
53
+ * CLI 之后不再有刷新拍,它继续用纯判据判一次)。
54
+ * `consolidationSeat`(S-668 波 0,过渡)= 整理驱动席的两侧读数口,喂 `memory-consolidation` 重启片;
55
+ * 缺席 = 阀门关着(没有 boot 烤死的席)。
56
+ * `checkpointStorePresent`(S-668 波 2,**必填**)= 部署事实「本进程建没建出 checkpoint 店」(stage-06 的产物,
57
+ * 不在 ServiceConfig 里)。审批名单转热之后,热腿要用它判 ④「门意图不可服务」(与 boot 拒启同一只判据);
58
+ * 必填 = 刷新环不可能在不知道这件事的情况下热应用审批名单。 */
53
59
  startRefreshLoop(a: {
54
- runnerTierFrozen: boolean;
55
60
  pricing: ReturnType<typeof buildPricing>;
56
61
  limitSync?: LimitSync;
57
- swapRunnerDeps?: (next: SwappableDeps) => void;
62
+ swapRunnerDeps: (next: SwappableDeps) => void;
58
63
  ceilingVerdict?: UnpricedCeilingVerdict;
64
+ consolidationSeat?: ConsolidationSeatWatch;
65
+ checkpointStorePresent: boolean;
59
66
  }): void;
60
67
  /** [ref]-2:停刷新环(hardShutdown 收尾链;幂等,未起环时 no-op)。 */
61
68
  stopRefreshLoop(): void;
@@ -78,7 +85,8 @@ export interface ConfigCenterRuntime {
78
85
  modelReady(): boolean;
79
86
  /** /health.restart(orchestrator 自动重启信号)。 */
80
87
  restartState(): RestartSignal | undefined;
81
- /** /health.modelPlaneDeferred(codex R18 卡死的 plane,无 next-boot handoff)。 */
88
+ /** /health.modelPlaneDeferred:被扣着、还没有 next-boot handoff 的候选(codex R18 起的状态机)。S-668 波 0 起
89
+ * 模型面不再 defer,键名保留,今天承载的是 durable LKG 发布债与 skills 债(见 `planeDeferredNoHandoff`)。 */
82
90
  planeDeferredState(): {
83
91
  version: number;
84
92
  since: number;
@@ -18,10 +18,10 @@ import { createConfigProvider, raceBootFetch, BOOT_FETCH_DEFERRED } from "../con
18
18
  import { executionLaneCaps, executionLaneOf } from "../execution-lane-caps.js";
19
19
  import { createKeyResolver } from "../key-resolver.js";
20
20
  import { ensureSealedKeyStore, reportExecutionPublicKey } from "../sealed-key.js";
21
- import { applyEffective, applyCenterReadFace, mutateInPlace, logEffectiveDiff, applyCenterSkills, resolveMcpServers, resolveA2aPeers, restartReasons, modelPlaneChanged, planeHasActiveTiers, fetchPromptArtifact } from "../config-center/facade.js";
21
+ import { applyEffective, applyCenterReadFace, mutateInPlace, logEffectiveDiff, applyCenterSkills, resolveMcpServers, resolveA2aPeers, restartReasons, modelPlaneChanged, fetchPromptArtifact } from "../config-center/facade.js";
22
22
  import { createMcpRevocationLedger, enabledMcpEntries } from "../config-center/mcp-revocation.js";
23
23
  import { SHA256_HEX_RE } from "../digest-form.js";
24
- import { createConfigApplyLedger } from "../config-center/apply-ledger.js";
24
+ import { createConfigApplyLedger, refusedGroups } from "../config-center/apply-ledger.js";
25
25
  export async function createConfigCenterRuntime(ctx) {
26
26
  const { config, logger, metrics, localRoot } = ctx;
27
27
  let ccEtag;
@@ -353,7 +353,7 @@ export async function createConfigCenterRuntime(ctx) {
353
353
  const bootApplyLkgInline = async (lkgR) => {
354
354
  const lkgGen = generationOf(lkgR.effective.version);
355
355
  applyLedger.seenTarget(lkgGen, lkgR.effective.version);
356
- applyEffective(config, lkgR.effective, logger, { sealedKeys, generation: lkgGen, report: (rep) => applyLedger.recordApply(rep) });
356
+ applyEffective(config, lkgR.effective, logger, { leg: "boot", sealedKeys, generation: lkgGen, report: (rep) => applyLedger.recordApply(rep) });
357
357
  applyLedger.applied(lkgGen, lkgR.effective.version);
358
358
  await adoptCenterPrompts(lkgR.effective, "boot-lkg");
359
359
  markRosterLanded(lkgR.effective);
@@ -409,6 +409,7 @@ export async function createConfigCenterRuntime(ctx) {
409
409
  applyLedger.seenTarget(bootGen, r.effective.version);
410
410
  let bootReport;
411
411
  applyEffective(config, r.effective, logger, {
412
+ leg: "boot",
412
413
  sealedKeys,
413
414
  generation: bootGen,
414
415
  report: (rep) => {
@@ -474,8 +475,10 @@ export async function createConfigCenterRuntime(ctx) {
474
475
  let keyResolver;
475
476
  const mcpRevocations = createMcpRevocationLedger((ev) => logger.info("mcp_revocation_ledger", { ...(ev.revoked.length > 0 ? { revoked: ev.revoked } : {}), ...(ev.restored.length > 0 ? { restored: ev.restored } : {}) }));
476
477
  let mcpRevocationWired = false;
477
- const restartCtx = () => ({
478
+ const restartCtx = (consolidationSeat) => ({
478
479
  ...(config.degrade?.reactive ? { reactiveDegradeTo: config.degrade.to } : {}),
480
+ pluginsAllowHosts: config.pluginsAllowHosts,
481
+ ...(consolidationSeat !== undefined ? { consolidationSeat } : {}),
479
482
  ...(readFaceEnvHeld.length > 0 ? { readFaceEnvHeld } : {}),
480
483
  ...(mcpRevocationWired && mcpRevocations.hasBaseline() ? { mcpRevocationLive: true } : {}),
481
484
  });
@@ -485,10 +488,6 @@ export async function createConfigCenterRuntime(ctx) {
485
488
  const { faceChanged } = applyCenterReadFace(config, eff, logger, { phase: "live", baseline: readFaceBaseline });
486
489
  if (!faceChanged)
487
490
  return;
488
- if (swap === undefined) {
489
- logger.warn("read_face_swap_unwired", { face: config.readFace ?? null, phase, note: "the center's read FACE changed but no Runner swap door was wired — the value landed in config while the engine keeps the seat it booted with" });
490
- return;
491
- }
492
491
  try {
493
492
  swap({ readFace: config.readFace });
494
493
  logger.info("read_face_swapped", { from: before ?? null, to: config.readFace ?? null, phase, note: "hot seat (core swapDeps) — legs that already prepared keep the face they prepared under" });
@@ -644,7 +643,7 @@ export async function createConfigCenterRuntime(ctx) {
644
643
  }
645
644
  },
646
645
  startRefreshLoop(a) {
647
- const { runnerTierFrozen, pricing, limitSync, swapRunnerDeps, ceilingVerdict } = a;
646
+ const { pricing, limitSync, swapRunnerDeps, ceilingVerdict, consolidationSeat, checkpointStorePresent } = a;
648
647
  if (configProvider) {
649
648
  const ccRef = config.configCenter;
650
649
  let refreshInFlight = false;
@@ -662,14 +661,14 @@ export async function createConfigCenterRuntime(ctx) {
662
661
  if (r === null && planeDeferredNoHandoff) {
663
662
  const skillsDebt = (planeDeferredNoHandoff.blocked ?? []).includes("skills");
664
663
  const promoted = lkgSurvivesRestart || skillsDebt ? await persistLkgDurable(planeDeferredNoHandoff.candidate, planeDeferredNoHandoff.candidateEtag) : false;
665
- const skillsProofPromotion = !promoted && !lkgSurvivesRestart && skillsDebt && lastPrewarmBodiesVerified && planeDeferredNoHandoff.planeDeferred !== true;
664
+ const skillsProofPromotion = !promoted && !lkgSurvivesRestart && skillsDebt && lastPrewarmBodiesVerified;
666
665
  if (skillsProofPromotion) {
667
666
  pendingRestart = { restartRequired: true, reasons: ["skills"], version: planeDeferredNoHandoff.version, since: Date.now() };
668
667
  logger.info("config_boot_skill_debt_promoted", { version: planeDeferredNoHandoff.version, note: "skill bodies verified on a source-confirmed-current candidate — the withheld skills restart is now published (non-durable lane, repair proven)" });
669
668
  planeDeferredNoHandoff = undefined;
670
669
  }
671
670
  else if (promoted) {
672
- const promotedReasons = [...new Set([...(planeDeferredNoHandoff.blocked ?? []), ...(planeDeferredNoHandoff.planeDeferred ? ["models-tiers"] : [])])];
671
+ const promotedReasons = [...new Set(planeDeferredNoHandoff.blocked ?? [])];
673
672
  if (promotedReasons.length > 0) {
674
673
  pendingRestart = { restartRequired: true, reasons: promotedReasons, version: planeDeferredNoHandoff.version, since: Date.now() };
675
674
  }
@@ -710,18 +709,17 @@ export async function createConfigCenterRuntime(ctx) {
710
709
  }
711
710
  else {
712
711
  const planeChanged = modelPlaneChanged(appliedPlaneEff, r.effective);
713
- const planeDeferred = swapRunnerDeps === undefined && (runnerTierFrozen || planeHasActiveTiers(r.effective)) && planeChanged;
714
712
  let applyReport;
715
713
  const committed = applyEffective(config, r.effective, logger, {
716
- teamsOnly: true,
714
+ leg: "hot",
715
+ checkpointStorePresent,
717
716
  sealedKeys,
718
717
  generation: tickGen,
719
718
  report: (rep) => {
720
719
  applyReport = rep;
721
720
  applyLedger.recordApply(rep);
722
721
  },
723
- ...(planeDeferred ? { deferModelPlane: true } : {}),
724
- ...(swapRunnerDeps !== undefined && planeChanged ? { swapPlane: swapRunnerDeps } : {}),
722
+ ...(planeChanged ? { swapPlane: swapRunnerDeps } : {}),
725
723
  });
726
724
  if (!committed)
727
725
  return "ok";
@@ -732,57 +730,37 @@ export async function createConfigCenterRuntime(ctx) {
732
730
  mcpRevocations.applyEnabledEntries(enabledMcpEntries(r.effective.mcp));
733
731
  applyLiveReadFace(r.effective, swapRunnerDeps, "refresh");
734
732
  applyLedger.applied(tickGen, r.effective.version);
735
- if (planeDeferred) {
736
- logger.warn("models_tiers_plane_deferred", { version: r.effective.version, note: "tier-frozen Runner: the changed model plane (models/roles/tiers/default) is NOT hot-applied — admission stays on the Runner's generation; restart applies the new plane (models-tiers restart signal rides /health)" });
737
- }
738
- else {
739
- appliedPlaneEff = r.effective;
740
- planeDeferredNoHandoff = undefined;
741
- }
733
+ appliedPlaneEff = r.effective;
734
+ planeDeferredNoHandoff = undefined;
742
735
  await adoptCenterPrompts(r.effective, "refresh");
743
- if (!planeDeferred)
744
- markRosterLanded(r.effective);
736
+ markRosterLanded(r.effective);
745
737
  const fullyApplied = applyReport?.fullyApplied !== false;
746
738
  if (!fullyApplied) {
739
+ ccEtag = undefined;
740
+ const refused = applyReport ? refusedGroups(applyReport) : [];
747
741
  logger.warn("config_candidate_partially_applied", {
748
742
  version: r.effective.version,
749
- rejected: applyReport?.limits.rejected?.keys ?? [],
743
+ rejected: refused.flatMap((g) => g.keys),
744
+ groups: refused.map((g) => g.group),
750
745
  note: "a group of this candidate was refused — the live config keeps serving the prior values for it; the LKG and the ETag stay on the last FULLY applied generation (this tree is re-judged next tick)",
751
746
  });
752
747
  return "ok";
753
748
  }
754
749
  const lkgPersisted = await persistLkgDurable(r.effective, r.etag);
755
- const reasons = restartReasons(effective, r.effective, restartCtx());
756
- if (swapRunnerDeps !== undefined) {
757
- const mi = reasons.indexOf("models-tiers");
758
- if (mi >= 0)
759
- reasons.splice(mi, 1);
760
- }
750
+ const reasons = restartReasons(effective, r.effective, restartCtx(consolidationSeat?.read()));
761
751
  const skillsChangeDetected = reasons.includes("skills");
762
752
  if (bootSkillStale && !skillsChangeDetected)
763
753
  reasons.push("skills");
764
- if (planeDeferred) {
765
- if (lkgPersisted) {
766
- if (!reasons.includes("models-tiers"))
767
- reasons.push("models-tiers");
768
- planeDeferredNoHandoff = undefined;
769
- }
770
- else {
771
- const blocked = reasons.splice(0, reasons.length);
772
- planeDeferredNoHandoff = { version: r.effective.version, since: planeDeferredNoHandoff?.since ?? Date.now(), ...(blocked.length > 0 ? { blocked } : {}), planeDeferred: true, candidate: r.effective, ...(r.etag !== undefined ? { candidateEtag: r.etag } : {}) };
773
- logger.warn("models_tiers_deferred_no_handoff", { version: r.effective.version, blockedReasons: blocked, note: "plane deferred but no NEXT-BOOT handoff (LKG disabled/unwritable, or storage not declared restart-surviving — set CONFIG_LKG_DURABLE=true) — the WHOLE restart signal is withheld (it would loop); the old generation keeps serving" });
774
- }
775
- }
776
- else if (lkgSurvivesRestart && !lkgPersisted) {
754
+ if (lkgSurvivesRestart && !lkgPersisted) {
777
755
  const blocked = reasons.splice(0, reasons.length);
778
- planeDeferredNoHandoff = { version: r.effective.version, since: planeDeferredNoHandoff?.since ?? Date.now(), blocked, candidate: r.effective, ...(r.etag !== undefined ? { candidateEtag: r.etag } : {}) };
756
+ planeDeferredNoHandoff = { version: r.effective.version, since: Date.now(), blocked, candidate: r.effective, ...(r.etag !== undefined ? { candidateEtag: r.etag } : {}) };
779
757
  logger.warn("restart_candidate_publication_incomplete", { version: r.effective.version, blockedReasons: blocked, note: "durable LKG declared but the candidate's publication is incomplete (skill bodies unverified) — restart signal withheld; retried every tick until the cache completes" });
780
758
  }
781
- else if (!planeDeferred && !lkgSurvivesRestart && bootSkillStale && !skillsChangeDetected && !lastPrewarmBodiesVerified) {
759
+ else if (!lkgSurvivesRestart && bootSkillStale && !skillsChangeDetected && !lastPrewarmBodiesVerified) {
782
760
  const i = reasons.indexOf("skills");
783
761
  if (i >= 0) {
784
762
  reasons.splice(i, 1);
785
- planeDeferredNoHandoff = { version: r.effective.version, since: planeDeferredNoHandoff?.since ?? Date.now(), blocked: ["skills"], candidate: r.effective, ...(r.etag !== undefined ? { candidateEtag: r.etag } : {}) };
763
+ planeDeferredNoHandoff = { version: r.effective.version, since: Date.now(), blocked: ["skills"], candidate: r.effective, ...(r.etag !== undefined ? { candidateEtag: r.etag } : {}) };
786
764
  logger.warn("config_boot_skill_debt_withheld", { version: r.effective.version, note: "boot skill debt still unproven on a non-durable deployment (body cache does not verify) — skills restart withheld this tick; re-verified each tick and published once the bodies prove fetchable" });
787
765
  }
788
766
  }
@@ -797,7 +775,7 @@ export async function createConfigCenterRuntime(ctx) {
797
775
  }
798
776
  logger.info("sema_registry_refreshed", {
799
777
  version: r.effective.version,
800
- note: "collab + runtime governance + limits + models/roles/roster hot-applied; skills/mcp/runtime-gates(approvalRequire)/scenarios are restart-to-apply",
778
+ note: "collab + runtime governance (incl. approvalRequire) + limits + models/roles/roster hot-applied; skills/mcp/a2a/scenarios are restart-to-apply",
801
779
  ...(pendingRestart ? { restartRequired: true, restartReasons: pendingRestart.reasons } : {}),
802
780
  });
803
781
  latestEffective = r.effective;
@@ -858,18 +836,17 @@ export async function createConfigCenterRuntime(ctx) {
858
836
  return;
859
837
  }
860
838
  const planeChangedLate = modelPlaneChanged(appliedPlaneEff, r.effective);
861
- const planeDeferredLate = swapRunnerDeps === undefined && (runnerTierFrozen || planeHasActiveTiers(r.effective)) && planeChangedLate;
862
839
  let applyReportLate;
863
840
  const committedLate = applyEffective(config, r.effective, logger, {
864
- teamsOnly: true,
841
+ leg: "hot",
842
+ checkpointStorePresent,
865
843
  sealedKeys,
866
844
  generation: lateGen,
867
845
  report: (rep) => {
868
846
  applyReportLate = rep;
869
847
  applyLedger.recordApply(rep);
870
848
  },
871
- ...(planeDeferredLate ? { deferModelPlane: true } : {}),
872
- ...(swapRunnerDeps !== undefined && planeChangedLate ? { swapPlane: swapRunnerDeps } : {}),
849
+ ...(planeChangedLate ? { swapPlane: swapRunnerDeps } : {}),
873
850
  });
874
851
  if (!committedLate)
875
852
  return;
@@ -879,20 +856,18 @@ export async function createConfigCenterRuntime(ctx) {
879
856
  ceilingVerdict?.judge();
880
857
  applyLiveReadFace(r.effective, swapRunnerDeps, "boot-deferred");
881
858
  applyLedger.applied(lateGen, r.effective.version);
882
- if (planeDeferredLate)
883
- logger.warn("models_tiers_plane_deferred", { version: r.effective.version, note: "tier-frozen Runner (env tiers): the late-boot center model plane is NOT hot-applied — restart applies it" });
884
- else {
885
- appliedPlaneEff = r.effective;
886
- planeDeferredNoHandoff = undefined;
887
- }
859
+ appliedPlaneEff = r.effective;
860
+ planeDeferredNoHandoff = undefined;
888
861
  await adoptCenterPrompts(r.effective, "boot-deferred");
889
- if (!planeDeferredLate)
890
- markRosterLanded(r.effective);
862
+ markRosterLanded(r.effective);
891
863
  const fullyAppliedLate = applyReportLate?.fullyApplied !== false;
892
864
  if (!fullyAppliedLate) {
865
+ ccEtag = undefined;
866
+ const refusedLate = applyReportLate ? refusedGroups(applyReportLate) : [];
893
867
  logger.warn("config_candidate_partially_applied", {
894
868
  version: r.effective.version,
895
- rejected: applyReportLate?.limits.rejected?.keys ?? [],
869
+ rejected: refusedLate.flatMap((g) => g.keys),
870
+ groups: refusedLate.map((g) => g.group),
896
871
  note: "late-boot candidate had a refused group — the LKG/ETag stay on the last FULLY applied generation; the refresh cadence re-judges the same tree",
897
872
  });
898
873
  return;
@@ -901,27 +876,10 @@ export async function createConfigCenterRuntime(ctx) {
901
876
  latestEffective = r.effective;
902
877
  ccEtag = r.etag;
903
878
  const lkgPersistedLate = await persistLkgDurable(r.effective, r.etag);
904
- const reasons = restartReasons(undefined, r.effective, restartCtx());
905
- if (swapRunnerDeps !== undefined) {
906
- const miLate = reasons.indexOf("models-tiers");
907
- if (miLate >= 0)
908
- reasons.splice(miLate, 1);
909
- }
910
- if (planeDeferredLate) {
911
- if (lkgPersistedLate) {
912
- if (!reasons.includes("models-tiers"))
913
- reasons.push("models-tiers");
914
- planeDeferredNoHandoff = undefined;
915
- }
916
- else {
917
- const blocked = reasons.splice(0, reasons.length);
918
- planeDeferredNoHandoff = { version: r.effective.version, since: planeDeferredNoHandoff?.since ?? Date.now(), ...(blocked.length > 0 ? { blocked } : {}), planeDeferred: true, candidate: r.effective, ...(r.etag !== undefined ? { candidateEtag: r.etag } : {}) };
919
- logger.warn("models_tiers_deferred_no_handoff", { version: r.effective.version, blockedReasons: blocked, note: "late-boot plane deferred but no NEXT-BOOT handoff (see CONFIG_LKG_DURABLE) — the WHOLE restart signal is withheld (it would loop); old generation keeps serving" });
920
- }
921
- }
922
- else if (planeDeferredLate === false && lkgSurvivesRestart && !lkgPersistedLate) {
879
+ const reasons = restartReasons(undefined, r.effective, restartCtx(consolidationSeat?.read()));
880
+ if (lkgSurvivesRestart && !lkgPersistedLate) {
923
881
  const blocked = reasons.splice(0, reasons.length);
924
- planeDeferredNoHandoff = { version: r.effective.version, since: planeDeferredNoHandoff?.since ?? Date.now(), blocked, candidate: r.effective, ...(r.etag !== undefined ? { candidateEtag: r.etag } : {}) };
882
+ planeDeferredNoHandoff = { version: r.effective.version, since: Date.now(), blocked, candidate: r.effective, ...(r.etag !== undefined ? { candidateEtag: r.etag } : {}) };
925
883
  logger.warn("restart_candidate_publication_incomplete", { version: r.effective.version, blockedReasons: blocked, note: "late-boot candidate publication incomplete on a durable-declared deployment — restart signal withheld; retried every tick" });
926
884
  }
927
885
  if (reasons.length > 0)
@@ -1,4 +1,3 @@
1
- import { NodeLspManager } from "@sema-agent/core";
2
1
  import { TaskEnvRegistry } from "../capabilities/sandbox-file-send.js";
3
2
  import { SessionEnvironmentSelection } from "../capabilities/select-environment-tool.js";
4
3
  import type { ServiceConfig } from "../config.js";
@@ -67,6 +66,6 @@ export declare function createExecutionEnv(ctx: ExecutionEnvCtx): {
67
66
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
68
67
  worktreeReap: (() => Promise<void>) | undefined;
69
68
  sendUserFileTaskEnvs: TaskEnvRegistry | undefined;
70
- lspManager: import("../lsp/manager.js").E2bLspManager | NodeLspManager | undefined;
69
+ lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
71
70
  };
72
71
  //# sourceMappingURL=execution-env.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { NodeLspManager } from "@sema-agent/core";
3
+ import { createHostLspManager } from "../host-lsp-manager.js";
4
4
  import { sandboxSendLaneEnabled, TaskEnvRegistry } from "../capabilities/sandbox-file-send.js";
5
5
  import { SessionEnvironmentSelection } from "../capabilities/select-environment-tool.js";
6
6
  import { createE2bLspManager } from "../lsp/e2b-manager.js";
@@ -290,7 +290,7 @@ export function createExecutionEnv(ctx) {
290
290
  })
291
291
  :
292
292
  lspProvider === "host" && config.lspHostEnabled && config.requirePrincipal !== true
293
- ? new NodeLspManager({ log: (event, fields) => logger.info(event, fields) })
293
+ ? createHostLspManager((event, fields) => logger.info(event, fields))
294
294
  : undefined;
295
295
  if (lspManager)
296
296
  logger.info("lsp_enabled", { provider: lspProvider });
@@ -1,6 +1,7 @@
1
1
  import { createLeaderEndpoint } from "../leader/endpoint.js";
2
2
  import { createLeaderRunner } from "../leader/wire.js";
3
3
  import { buildDeploymentPostureSeats } from "./runner-deps.js";
4
+ import { hasApprovalListIntent } from "../approval.js";
4
5
  export function leaderK8sMinioGap(leaderEnabled, leaderProvider, hasS3) {
5
6
  if (!(leaderEnabled && leaderProvider === "k8s" && !hasS3))
6
7
  return null;
@@ -67,16 +68,18 @@ export function createLeaderFace(ctx) {
67
68
  ...(toolResultStore ? { toolResultStore } : {}),
68
69
  ...(leaderProvider === "k8s" ? { workspace: "/workspace" } : {}),
69
70
  sessionStore,
70
- ...(checkpointStore && config.approvalRequire.length > 0
71
+ ...(checkpointStore
71
72
  ? {
72
- durable: {
73
- checkpointStore,
74
- requireApproval: config.approvalRequire,
75
- deny: config.approvalDeny,
76
- autoBudget: config.approvalAutoBudget,
77
- neverAuto: config.approvalNeverAuto,
78
- ...(config.approvalTimeoutSec > 0 ? { ttlMs: config.approvalTimeoutSec * 1000 } : {}),
79
- },
73
+ durable: () => hasApprovalListIntent(config)
74
+ ? {
75
+ checkpointStore,
76
+ requireApproval: config.approvalRequire,
77
+ deny: config.approvalDeny,
78
+ autoBudget: config.approvalAutoBudget,
79
+ neverAuto: config.approvalNeverAuto,
80
+ ...(config.approvalTimeoutSec > 0 ? { ttlMs: config.approvalTimeoutSec * 1000 } : {}),
81
+ }
82
+ : undefined,
80
83
  }
81
84
  : {}),
82
85
  }), {
@@ -1,3 +1,4 @@
1
+ import type { RestartSliceCtx } from "../config-center/restart-signal.js";
1
2
  import { type ConsolidationDriverRunRow, type ConsolidationRunReceipt, type MemoryBackend, type MemoryConsolidationDriverDeps, type RunMemoryConsolidationOptions, type SessionCaptureRecordStore } from "@sema-agent/core";
2
3
  /** D3 投影的座标签闭集。`role:<name>` 里的 name 只可能是 core 的 role 链两跳之一。 */
3
4
  export type ConsolidationSeatLabel = "explicit" | "role:consolidate" | "role:summarize";
@@ -30,6 +31,43 @@ export interface ConsolidationDriverSeat {
30
31
  * (探针只构造闭包、不发任何请求、无副作用。)
31
32
  */
32
33
  export declare function resolveConsolidationDriverSeat(deps: MemoryConsolidationDriverDeps): ConsolidationDriverSeat;
34
+ /**
35
+ * S-668 波 0([ref] §3)—— 整理驱动席的 **restart 读数**。过渡件:**波 1 转热后删**(那时每轮 run 起手
36
+ * 现取当前代的席,不再有 boot 烤死的席,这只表也就没有要比的东西了)。
37
+ *
38
+ * ## 为什么要它
39
+ *
40
+ * 席位在 boot 期解析一次(本模块头注「座在启动期解析一次」),core 的解析器把它选中的那只 `Model` 对象焊进
41
+ * chat 闭包。refresh 拍对模型面的热换(`mutateInPlace` + `swapDeps`)换的是目录里的**值**,够不到那只对象
42
+ * ⇒ 中心改了 roles / 档位绑定 / 那条目录条目之后,整理跑仍打 boot 那一代。修前没有任何一片签它 —— 它唯一
43
+ * 沾边的 `models-tiers` 片在生产上恒被摘除(今已退役)—— 于是这块是「静默冷」:既不热应用、也不报重启。
44
+ *
45
+ * ## 读法:问 core 的**同一只**解析器,不抄它的 role 链
46
+ *
47
+ * 席位 = `consolidate → summarize(含 flash 档位缺省)` 那条链对「env 角色底 + 中心目录 + 档位表」解出来的
48
+ * 那只 Model;本层抄一份链就是第二真源({@link seatLabel} 注里同一条理由)。做法:拿活配置调
49
+ * `resolveMemoryConsolidationDriver`,brain 与 per-model 凭据席都换成探针,再调一次它交回的 `chat` ——
50
+ * core 的 chat 第一件事就是拿**它选中的那只 Model** 问凭据席(`deps.getApiKeyAndHeaders?.(resolved)`,在
51
+ * 第一个 await 之前同步求值),探针在那一刻记下它并抛停:零请求、零副作用。
52
+ * ⚠️ 这一步依赖 core chat 闭包的**行为次序**:哪天 core 改成先做别的再问凭据席,探针就截不到 —— 那一刻本函数
53
+ * **响亮抛**(boot 期抛 = 阀门开着的部署拒启,句子说清原因),不退化成「读不到就当没变」(那正是本件要消灭的
54
+ * 静默)。钉:test/memory-consolidation-driver.test.ts 的探针格对真 core 跑,提货批当场红。
55
+ *
56
+ * ## 指纹里有什么
57
+ *
58
+ * 整只 Model 减掉 `cost`:整理跑只读 usage 的 token 数、零处读价目(core 7.29.0 的 driver 实现零 `cost` /
59
+ * `pricing` 读点),纯改价不该造一次重启。解不出来(中心撤掉了 consolidate / summarize 两跳)⇒ 记成
60
+ * `{ unresolvable: <core 原句> }`,与 boot 那只不等 ⇒ 签重启;重启会在 D1 拒启、把同一句原句写进拒因 ——
61
+ * 那正是运维该看见的话,比「这台还在用一只中心已经撤掉的席」诚实。
62
+ */
63
+ export interface ConsolidationSeatWatch {
64
+ /** boot 烤进去的席 vs 活配置此刻会解出的席(`restartReasons` 的 `memory-consolidation` 片两侧读数)。 */
65
+ read(): NonNullable<RestartSliceCtx["consolidationSeat"]>;
66
+ }
67
+ /** 解席的输入面 = boot 期真席用的同三件(活引用:refresh 就地换代,`read()` 每次现取)。 */
68
+ export type ConsolidationSeatPlane = Pick<MemoryConsolidationDriverDeps, "models" | "tiers" | "roles">;
69
+ /** `create*`:返回带捕获状态(boot 那只指纹)的活对象。须在真席解析的**同一时刻**调(同一份输入)。 */
70
+ export declare function createConsolidationSeatWatch(plane: () => ConsolidationSeatPlane): ConsolidationSeatWatch;
33
71
  /**
34
72
  * **每 scope 单飞**(codex 交叉复审 [high],验真后修)—— 同一 scope 上在飞的那一轮被后来者**并入**,
35
73
  * 而不是各起一轮。`create*`:返回带状态的活对象。
@@ -16,6 +16,41 @@ export function resolveConsolidationDriverSeat(deps) {
16
16
  }
17
17
  return { options, seat: seatLabel(deps), model: options.model };
18
18
  }
19
+ export function createConsolidationSeatWatch(plane) {
20
+ const baked = consolidationSeatFingerprint(plane());
21
+ return { read: () => ({ baked, current: consolidationSeatFingerprint(plane()) }) };
22
+ }
23
+ function consolidationSeatFingerprint(plane) {
24
+ const stop = new Error("consolidation seat probe: stopped before any request");
25
+ const refuse = () => {
26
+ throw stop;
27
+ };
28
+ const probeBrain = { stream: refuse, complete: refuse };
29
+ const seen = {};
30
+ let options;
31
+ try {
32
+ options = resolveMemoryConsolidationDriver({
33
+ ...plane,
34
+ brain: probeBrain,
35
+ getApiKeyAndHeaders: (model) => {
36
+ seen.model = model;
37
+ throw stop;
38
+ },
39
+ });
40
+ }
41
+ catch (err) {
42
+ return { unresolvable: err instanceof Error ? err.message : String(err) };
43
+ }
44
+ void options.chat({ system: "", user: "", maxTokens: 1, temperature: 0 }).catch(() => undefined);
45
+ if (seen.model === undefined) {
46
+ throw new Error("MEMORY_CONSOLIDATION_DRIVER=on, but the consolidation seat's restart probe could not observe which model the " +
47
+ "engine's seat resolver chose (the resolved chat seat no longer asks the per-model credential seat before its " +
48
+ "first await) — refusing rather than leave this seat's restart signal blind. This is an engine-pickup defect " +
49
+ "in boot/memory-consolidation.ts (createConsolidationSeatWatch), not a deployment setting.");
50
+ }
51
+ const { cost: _cost, ...route } = seen.model;
52
+ return route;
53
+ }
19
54
  function seatLabel(deps) {
20
55
  if (deps.memoryConsolidationDriver?.chat !== undefined)
21
56
  return "explicit";
@@ -79,7 +79,6 @@ export interface ResolveSpecCtx {
79
79
  */
80
80
  approverSeat: RunnerDepsOnAsk | undefined;
81
81
  approvalExemptionStore: ReturnType<StoreBackend["approvalExemption"]> | undefined;
82
- singleUserAutoAcceptBaseline: boolean;
83
82
  checkpointStore: ReturnType<NonNullable<StoreBackend["checkpoint"]>> | undefined;
84
83
  deploymentHooks: NonNullable<RunnerDeps["hooks"]>;
85
84
  imageIndex: ReturnType<NonNullable<StoreBackend["imageIndex"]>> | undefined;
@@ -10,6 +10,7 @@ import { stampHandsLane, toolPolicyForHands } from "../capabilities/hands-lane.j
10
10
  import { buildNoticeLaneFacts, shouldDiscloseNoPersistentMemory, withNoPersistentMemoryNotice } from "../capabilities/memory-notice.js";
11
11
  import { applyLongtailDefer } from "../capabilities/tool-defer.js";
12
12
  import { assertGuardPatternsUsable, buildOnlySensitiveBaselineWarning, createApprovalBaselinePolicy, createDeploymentGovernanceInputs } from "../deployment-governance.js";
13
+ import { singleUserAutoAcceptBaselineApplies } from "../approval.js";
13
14
  import { acceptShellScratchpadDir, buildEnvFacts, egressForRemoteExec, ensureScratchpadDir, resumeFactsForLane, scratchpadCoveringTaskRoot } from "../env-facts.js";
14
15
  import { FleetEventBus } from "../fleet/fleet-bus.js";
15
16
  import { composeHooks, createTaskHooks } from "../hooks/hook-runner.js";
@@ -40,9 +41,9 @@ import { executionLaneCaps, executionLaneHomeDir, executionLaneOf } from "../exe
40
41
  import { effectiveMemoryPersistenceCapable } from "./memory-boundary.js";
41
42
  import { memoryFaceMounted } from "../memory-scope.js";
42
43
  export function createResolveSpec(ctx) {
43
- const { config, logger, metrics, localRoot, scenarios, principalCaps, centerRuntimeCapsResolver, getCenterPrompts, getKeyResolver, taskAttachmentStore, perSessionCwd, setSessionCwd, setSessionShellEnv, fenceSessionOwner, hookLlm, hookAgent, fleetBus, hookWakeBus, noteSessionShellGate, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec, selectEnvTool, sendUserFileToolSpec, memoryEngine, durableEnabled, approvalExemptionStore, singleUserAutoAcceptBaseline, checkpointStore, deploymentHooks, imageIndex, perTaskImage, sessionEnvSelection, liveQuestionFace, approverSeat, lockedKeys, } = ctx;
44
+ const { config, logger, metrics, localRoot, scenarios, principalCaps, centerRuntimeCapsResolver, getCenterPrompts, getKeyResolver, taskAttachmentStore, perSessionCwd, setSessionCwd, setSessionShellEnv, fenceSessionOwner, hookLlm, hookAgent, fleetBus, hookWakeBus, noteSessionShellGate, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec, selectEnvTool, sendUserFileToolSpec, memoryEngine, durableEnabled, approvalExemptionStore, checkpointStore, deploymentHooks, imageIndex, perTaskImage, sessionEnvSelection, liveQuestionFace, approverSeat, lockedKeys, } = ctx;
44
45
  assertGuardPatternsUsable(config);
45
- const onlySensitiveBaseline = buildOnlySensitiveBaselineWarning(config, { durableEnabled, singleUserAutoAcceptBaseline });
46
+ const onlySensitiveBaseline = buildOnlySensitiveBaselineWarning(config, { durableEnabled, singleUserAutoAcceptBaseline: singleUserAutoAcceptBaselineApplies(config) });
46
47
  const realTaskRootOf = (auth) => {
47
48
  if (isSandboxPathAdjudicationLane(config.remoteExec?.provider))
48
49
  return undefined;
@@ -421,7 +422,7 @@ export function createResolveSpec(ctx) {
421
422
  }
422
423
  : {}),
423
424
  })
424
- : singleUserAutoAcceptBaseline
425
+ : singleUserAutoAcceptBaselineApplies(config)
425
426
  ? createApprovalBaselinePolicy(config)
426
427
  : undefined),
427
428
  ...(durableEnabled
@@ -5,8 +5,8 @@
5
5
  * `deps-literal-shape-gate` 的顶层条件展开门覆盖面不变);新增的只有 import 与包壳。
6
6
  *
7
7
  * ⚠️ **位置即契约**:必须晚于 stores/exec-env/coordinators/workflow 段(所有键都是它们的产物),
8
- * 且早于 `new Runner(runnerDeps)` —— Runner 构造会冻结 tier 展开后的私有目录副本
9
- * (`runnerTierFrozen` 判据就取自构造那一刻的 `config.tiers`)。
8
+ * 且早于 `new Runner(runnerDeps)` —— Runner 构造时展开 tier 表成私有目录副本(之后的换代经
9
+ * `Runner.swapDeps` 换进,见 boot/stage-08-reapers.ts)。
10
10
  * `getRunStore()` 是唯一的晚绑取值(runStore 在本段之后才构造),原文靠同作用域前向引用。
11
11
  */
12
12
  import { type CacheBreakFinding, type RunnerDeps, type WorkflowRunStore, type AskOutcome } from "@sema-agent/core";
@@ -5,7 +5,7 @@ export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>):
5
5
  dropSessionScoped: (sid: string) => void;
6
6
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
7
7
  fenceSessionOwner: (sid: string, owner: string | null) => void;
8
- lspManager: import("../lsp/manager.js").E2bLspManager | import("@sema-agent/core").NodeLspManager | undefined;
8
+ lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
9
9
  perSessionCwd: Map<string, string>;
10
10
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
11
11
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
@@ -13,6 +13,7 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
13
13
  approvalAskAudit: import("../approval-ask-audit-store.js").FileApprovalAskAuditStore | undefined;
14
14
  centerRuntimeCapsResolver: ((principal: string | undefined) => Promise<import("@sema-agent/core").RuntimeCaps | undefined>) | undefined;
15
15
  checkpointStore: import("../plugins/store-backend.js").CheckpointStoreFull | undefined;
16
+ consolidationSeatWatch: import("./memory-consolidation.js").ConsolidationSeatWatch | undefined;
16
17
  durableEnabled: boolean;
17
18
  elicitation: import("../elicitation.js").ElicitationCoordinator | undefined;
18
19
  fleetBus: import("../fleet/fleet-bus.js").FleetEventBus;
@@ -33,7 +34,6 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
33
34
  retentionLaneStore: import("../plugins/retention-lane-store-sql.js").RetentionLaneStore | undefined;
34
35
  runner: Runner;
35
36
  runnerDeps: import("@sema-agent/core").RunnerDeps;
36
- runnerTierFrozen: boolean;
37
37
  runtimeCapsPeekResolver: import("../runtime-caps-resolver.js").EntitlementsResolverFn | undefined;
38
38
  sendFileLedger: import("../plugins/send-file-ledger.js").SendFileLedger | undefined;
39
39
  sendUserFileEmitter: import("../capabilities/send-user-file-tool.js").SendUserFileEmitter | undefined;
@@ -66,7 +66,7 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
66
66
  dropSessionScoped: (sid: string) => void;
67
67
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
68
68
  fenceSessionOwner: (sid: string, owner: string | null) => void;
69
- lspManager: import("../lsp/manager.js").E2bLspManager | import("@sema-agent/core").NodeLspManager | undefined;
69
+ lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
70
70
  perSessionCwd: Map<string, string>;
71
71
  perTaskImage: import("../per-task-image.js").PerTaskImageRegistry;
72
72
  sendUserFileTaskEnvs: import("../capabilities/sandbox-file-send.js").TaskEnvRegistry | undefined;
@@ -10,7 +10,7 @@ import { workflowModelAllowlistFor } from "../task-workflow.js";
10
10
  import { backendOwnsControlPlane } from "../memory-operator-faces.js";
11
11
  import { createHookLlm, buildHookFailureText } from "../hooks/hook-llm.js";
12
12
  import { assertRetentionLaneWirable } from "./retention-lane.js";
13
- import { assertConsolidationDriverWirable, buildConsolidationValveAudit, createMemoryConsolidationFaces, resolveConsolidationDriverSeat } from "./memory-consolidation.js";
13
+ import { assertConsolidationDriverWirable, buildConsolidationValveAudit, createConsolidationSeatWatch, createMemoryConsolidationFaces, resolveConsolidationDriverSeat } from "./memory-consolidation.js";
14
14
  import { createPerModelAuthSeat } from "./side-query-lane.js";
15
15
  import { createWorkflowOrchestration } from "./workflow-orchestration.js";
16
16
  import { createLiveCoordinators } from "./coordinators.js";
@@ -72,6 +72,7 @@ export function runStage06(ctx) {
72
72
  getApiKeyAndHeaders: createPerModelAuthSeat(() => configCenter.getKeyResolver()),
73
73
  })
74
74
  : undefined;
75
+ const consolidationSeatWatch = consolidationSeat ? createConsolidationSeatWatch(() => ({ models: config.models, tiers: config.tiers, roles: config.roles })) : undefined;
75
76
  const memoryConsolidationFaces = consolidationSeat && memoryEngine
76
77
  ? createMemoryConsolidationFaces(memoryEngine, {
77
78
  seat: consolidationSeat,
@@ -130,7 +131,6 @@ export function runStage06(ctx) {
130
131
  });
131
132
  const runner = new Runner(runnerDeps);
132
133
  const handslessRunner = new Runner(withoutExecutionEnv(runnerDeps));
133
- const runnerTierFrozen = Object.keys(config.tiers).length > 0;
134
134
  const { hookModelFor, hookLlm } = createHookLlm({ config, getKeyResolver: () => configCenter.getKeyResolver(), metrics });
135
135
  const hookAgentRunner = new Runner({ ...runnerDeps, sessionStore: new TtlSessionStore({ defaultTtlDays: 1 / 24 }) });
136
136
  const agentHookCall = async ({ prompt, model, timeoutMs, system }) => {
@@ -212,6 +212,6 @@ export function runStage06(ctx) {
212
212
  };
213
213
  const subRunner = new Runner(subRunnerDeps);
214
214
  const handslessSubRunner = new Runner(withoutExecutionEnv(subRunnerDeps));
215
- return { ...ctx, approvalAskAudit, centerRuntimeCapsResolver, checkpointStore, durableEnabled, elicitation, fleetBus, governanceSeams, handslessRunner, handslessSubRunner, hookAgent, hookAgentRunner, hookLlm, mcpRevocations, memoryConsolidationFaces, memoryOptOutGrantStore, orgMemoryAdmission, outcomeSink, principalCaps, question, retentionExecutor, retentionLaneStore, runner, runnerDeps, runnerTierFrozen, runtimeCapsPeekResolver, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionShellGateRegistry, sessionTitler, sharedMemoryStore, sqlWorkflowRunStore, streamApprovalGate, subRunner, subRunnerSessions, subagentSteerRegistry, toolApproval, workflowAgentRegistry, workflowAgentSessionIndex, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable };
215
+ return { ...ctx, approvalAskAudit, centerRuntimeCapsResolver, checkpointStore, consolidationSeatWatch, durableEnabled, elicitation, fleetBus, governanceSeams, handslessRunner, handslessSubRunner, hookAgent, hookAgentRunner, hookLlm, mcpRevocations, memoryConsolidationFaces, memoryOptOutGrantStore, orgMemoryAdmission, outcomeSink, principalCaps, question, retentionExecutor, retentionLaneStore, runner, runnerDeps, runtimeCapsPeekResolver, sendFileLedger, sendUserFileEmitter, sendUserFileToolSpec, sessionShellGateRegistry, sessionTitler, sharedMemoryStore, sqlWorkflowRunStore, streamApprovalGate, subRunner, subRunnerSessions, subagentSteerRegistry, toolApproval, workflowAgentRegistry, workflowAgentSessionIndex, workflowCompletionInbox, workflowJournalStore, workflowModelAllowlistSnapshot, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, workflowRunStore, workflowsCapable };
216
216
  }
217
217
  //# sourceMappingURL=stage-06-runners.js.map