fix(agents): reapply compaction settings after resource loader reload (#65602)

This commit is contained in:
ly85206559
2026-04-15 19:23:37 +08:00
committed by Josh Lehman
parent d7c7905a52
commit 55d9b6c2a6
3 changed files with 47 additions and 0 deletions

View File

@@ -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({

View File

@@ -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

View File

@@ -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,