From 55d9b6c2a6003f0af186b3cd29f0eb309d2c2499 Mon Sep 17 00:00:00 2001 From: ly85206559 Date: Wed, 15 Apr 2026 19:23:37 +0800 Subject: [PATCH] fix(agents): reapply compaction settings after resource loader reload (#65602) --- src/agents/pi-embedded-runner/compact.ts | 6 ++++ src/agents/pi-embedded-runner/run/attempt.ts | 8 +++++ src/agents/pi-settings.test.ts | 33 ++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/src/agents/pi-embedded-runner/compact.ts b/src/agents/pi-embedded-runner/compact.ts index a7b10aced41..0ea79866f8d 100644 --- a/src/agents/pi-embedded-runner/compact.ts +++ b/src/agents/pi-embedded-runner/compact.ts @@ -70,6 +70,7 @@ import { consumeCompactionSafeguardCancelReason, setCompactionSafeguardCancelReason, } from "../pi-hooks/compaction-safeguard-runtime.js"; +import { applyPiCompactionSettingsFromConfig } from "../pi-settings.js"; import { createPreparedEmbeddedPiSettingsManager } from "../pi-project-settings.js"; import { createOpenClawCodingTools } from "../pi-tools.js"; import { wrapStreamFnTextTransforms } from "../plugin-text-transforms.js"; @@ -834,6 +835,11 @@ export async function compactEmbeddedPiSessionDirect( extensionFactories, }); await resourceLoader.reload(); + applyPiCompactionSettingsFromConfig({ + settingsManager, + cfg: params.config, + contextTokenBudget: ctxInfo.tokens, + }); } const { builtInTools, customTools } = splitSdkTools({ diff --git a/src/agents/pi-embedded-runner/run/attempt.ts b/src/agents/pi-embedded-runner/run/attempt.ts index ef5f969fa9a..c74918cd6bb 100644 --- a/src/agents/pi-embedded-runner/run/attempt.ts +++ b/src/agents/pi-embedded-runner/run/attempt.ts @@ -79,6 +79,7 @@ import { resolveBootstrapTotalMaxChars, } from "../../pi-embedded-helpers.js"; import { subscribeEmbeddedPiSession } from "../../pi-embedded-subscribe.js"; +import { applyPiCompactionSettingsFromConfig } from "../../pi-settings.js"; import { createPreparedEmbeddedPiSettingsManager } from "../../pi-project-settings.js"; import { applyPiAutoCompactionGuard } from "../../pi-settings.js"; import { @@ -1030,6 +1031,13 @@ export async function runEmbeddedAttempt( extensionFactories, }); await resourceLoader.reload(); + // DefaultResourceLoader.reload() rehydrates settings from disk and can drop OpenClaw + // compaction overrides applied in createPreparedEmbeddedPiSettingsManager. + applyPiCompactionSettingsFromConfig({ + settingsManager, + cfg: params.config, + contextTokenBudget: params.contextTokenBudget, + }); } // Get hook runner early so it's available when creating tools diff --git a/src/agents/pi-settings.test.ts b/src/agents/pi-settings.test.ts index 879dafe7399..4214549e3b3 100644 --- a/src/agents/pi-settings.test.ts +++ b/src/agents/pi-settings.test.ts @@ -23,6 +23,39 @@ describe("applyPiCompactionSettingsFromConfig", () => { }); }); + it("can restore reserveTokens after a simulated resource loader reload drops them below floor", () => { + const cfg = { + agents: { defaults: { compaction: { reserveTokensFloor: DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR } } }, + } as const; + let reserve = 16_384; + const keep = 20_000; + const settingsManager = { + getCompactionReserveTokens: () => reserve, + getCompactionKeepRecentTokens: () => keep, + applyOverrides: vi.fn((overrides: { compaction: { reserveTokens?: number } }) => { + if (overrides.compaction.reserveTokens !== undefined) { + reserve = overrides.compaction.reserveTokens; + } + }), + }; + + const first = applyPiCompactionSettingsFromConfig({ + settingsManager, + cfg, + contextTokenBudget: 100_000, + }); + expect(first.compaction.reserveTokens).toBe(DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR); + + reserve = 16_384; + const second = applyPiCompactionSettingsFromConfig({ + settingsManager, + cfg, + contextTokenBudget: 100_000, + }); + expect(second.compaction.reserveTokens).toBe(DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR); + expect(reserve).toBe(DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR); + }); + it("does not override when already above floor and not in safeguard mode", () => { const settingsManager = { getCompactionReserveTokens: () => 32_000,