@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.
- package/MIGRATION.md +13 -0
- package/USAGE.md +75 -52
- package/dist/approval-ask-machine.d.ts +10 -0
- package/dist/approval-ask-machine.js +3 -0
- package/dist/approval-card.d.ts +74 -1
- package/dist/approval-card.js +41 -8
- package/dist/approval.d.ts +44 -20
- package/dist/approval.js +14 -6
- package/dist/boot/config-center.d.ts +16 -8
- package/dist/boot/config-center.js +39 -81
- package/dist/boot/execution-env.d.ts +1 -2
- package/dist/boot/execution-env.js +2 -2
- package/dist/boot/leader.js +12 -9
- package/dist/boot/memory-consolidation.d.ts +38 -0
- package/dist/boot/memory-consolidation.js +35 -0
- package/dist/boot/resolve-spec.d.ts +0 -1
- package/dist/boot/resolve-spec.js +4 -3
- package/dist/boot/runner-deps.d.ts +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +1 -1
- package/dist/boot/stage-06-runners.d.ts +2 -2
- package/dist/boot/stage-06-runners.js +3 -3
- package/dist/boot/stage-07-capability-layer.d.ts +2 -3
- package/dist/boot/stage-07-capability-layer.js +6 -6
- package/dist/boot/stage-08-reapers.d.ts +3 -4
- package/dist/boot/stage-08-reapers.js +2 -2
- package/dist/boot/stage-09-leader.d.ts +2 -3
- package/dist/boot/stage-10-http-server.d.ts +2 -3
- package/dist/boot/stage-10-http-server.js +2 -2
- package/dist/capabilities/center-plugins.d.ts +14 -2
- package/dist/capabilities/center-plugins.js +13 -5
- package/dist/capabilities/hands-lane.js +2 -1
- package/dist/capabilities/scenarios.js +18 -5
- package/dist/capabilities/tool-defer.d.ts +2 -2
- package/dist/config-catalog.d.ts +2 -2
- package/dist/config-catalog.js +12 -13
- package/dist/config-center/apply-effective.d.ts +34 -39
- package/dist/config-center/apply-effective.js +100 -64
- package/dist/config-center/apply-ledger.d.ts +35 -16
- package/dist/config-center/apply-ledger.js +25 -18
- package/dist/config-center/facade.d.ts +11 -5
- package/dist/config-center/facade.js +1 -1
- package/dist/config-center/hot-keys-registry.d.ts +11 -4
- package/dist/config-center/hot-keys-registry.js +11 -7
- package/dist/config-center/restart-signal.d.ts +21 -14
- package/dist/config-center/restart-signal.js +16 -22
- package/dist/config-center/types.d.ts +3 -3
- package/dist/config-types.d.ts +22 -7
- package/dist/cross-session-settings.js +1 -1
- package/dist/host-lsp-manager.d.ts +29 -0
- package/dist/host-lsp-manager.js +14 -0
- package/dist/http/active-run-conflict.d.ts +2 -12
- package/dist/http/active-run-conflict.js +1 -6
- package/dist/http/admission.js +8 -0
- package/dist/http/resume-legs.d.ts +1 -1
- package/dist/http/resume-legs.js +14 -10
- package/dist/http/route-ctx.d.ts +2 -2
- package/dist/http/routes/approvals-assistant.d.ts +1 -1
- package/dist/http/routes/approvals-assistant.js +2 -2
- package/dist/http/routes/memory-compliance.js +5 -0
- package/dist/http/routes/memory-origin.js +5 -0
- package/dist/http/routes/sessions.js +6 -0
- package/dist/http/routes/tasks.js +7 -6
- package/dist/http/server.d.ts +6 -5
- package/dist/http/wire-types.d.ts +6 -3
- package/dist/leader/wire.d.ts +20 -12
- package/dist/leader/wire.js +7 -6
- package/dist/memory-layer-preflight.d.ts +46 -0
- package/dist/memory-layer-preflight.js +121 -0
- package/dist/memory-operator-faces.js +17 -1
- package/dist/observability/corrupt-read-seat.d.ts +21 -4
- package/dist/observability/corrupt-read-seat.js +31 -0
- package/dist/observability/fail-open.d.ts +8 -4
- package/dist/observability/fail-open.js +8 -4
- package/dist/observability/run-terminal.js +1 -0
- package/dist/observability/secret-env-scrub.d.ts +1 -0
- package/dist/observability/secret-env-scrub.js +1 -0
- package/dist/orchestration/workflow-completion-inbox.d.ts +31 -23
- package/dist/orchestration/workflow-completion-inbox.js +8 -3
- package/dist/plugins/approval-ask-store-file.d.ts +20 -2
- package/dist/plugins/approval-ask-store-file.js +21 -3
- package/dist/plugins/approval-ask-store-memory.d.ts +2 -0
- package/dist/plugins/approval-ask-store-memory.js +39 -13
- package/dist/plugins/approval-ask-store-sql.d.ts +24 -5
- package/dist/plugins/approval-ask-store-sql.js +27 -3
- package/dist/plugins/checkpoint-store-sql.d.ts +9 -3
- package/dist/plugins/checkpoint-store-sql.js +19 -2
- package/dist/plugins/local-checkpoint-store.js +2 -0
- package/dist/plugins/mailbox-store-sql.d.ts +7 -5
- package/dist/plugins/mailbox-store-sql.js +6 -4
- package/dist/plugins/permission-rule-store-file.js +3 -2
- package/dist/plugins/sql-json-column.d.ts +16 -3
- package/dist/plugins/sql-json-column.js +15 -4
- package/dist/plugins/web-search.d.ts +42 -22
- package/dist/plugins/web-search.js +141 -49
- package/dist/run-local.js +6 -5
- package/dist/runs.js +6 -5
- package/dist/runtime-governance.d.ts +50 -3
- package/dist/runtime-governance.js +5 -0
- package/dist/server-secret-env.d.ts +4 -2
- package/dist/task-settings.d.ts +1 -1
- package/dist/tool-approval.d.ts +107 -19
- package/dist/tool-approval.js +64 -15
- package/dist/trace/core-keyset-guard.d.ts +5 -5
- package/dist/trace/ledger-sink.js +2 -2
- package/dist/trace/project.d.ts +13 -0
- package/dist/trace/project.js +22 -5
- package/dist/trace/projection-drop.d.ts +2 -0
- package/dist/trace/projection-drop.js +6 -0
- package/dist/trace/sema-provenance.d.ts +4 -1
- package/dist/trace/sema-provenance.js +1 -1
- package/dist/trace/task-notification-facets.d.ts +65 -0
- package/dist/trace/task-notification-facets.js +31 -0
- package/dist/trace/wire-projection-faces.d.ts +3 -3
- package/dist/trace/wire-projection-faces.js +3 -3
- 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`
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
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
|
|
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
|
|
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,
|
|
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 {
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
-
...(
|
|
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
|
-
|
|
736
|
-
|
|
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
|
-
|
|
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:
|
|
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 (
|
|
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:
|
|
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 (!
|
|
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:
|
|
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/
|
|
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
|
-
|
|
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
|
-
...(
|
|
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
|
-
|
|
883
|
-
|
|
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
|
-
|
|
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:
|
|
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 (
|
|
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:
|
|
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 |
|
|
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 {
|
|
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
|
-
?
|
|
293
|
+
? createHostLspManager((event, fields) => logger.info(event, fields))
|
|
294
294
|
: undefined;
|
|
295
295
|
if (lspManager)
|
|
296
296
|
logger.info("lsp_enabled", { provider: lspProvider });
|
package/dist/boot/leader.js
CHANGED
|
@@ -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
|
|
71
|
+
...(checkpointStore
|
|
71
72
|
? {
|
|
72
|
-
durable:
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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,
|
|
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
|
-
:
|
|
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
|
|
9
|
-
*
|
|
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("
|
|
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("
|
|
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,
|
|
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
|