fix: add compaction headroom for memory writes

This commit is contained in:
Peter Steinberger
2026-01-11 10:46:20 +00:00
parent 96e4fdb443
commit a3747b1ee3
6 changed files with 90 additions and 1 deletions

View File

@@ -69,6 +69,7 @@ import {
import { normalizeModelCompat } from "./model-compat.js";
import { ensureClawdbotModelsJson } from "./models-config.js";
import type { MessagingToolSend } from "./pi-embedded-messaging.js";
import { ensurePiCompactionReserveTokens } from "./pi-settings.js";
import { acquireSessionWriteLock } from "./session-write-lock.js";
export type { MessagingToolSend } from "./pi-embedded-messaging.js";
@@ -981,6 +982,7 @@ export async function compactEmbeddedPiSession(params: {
effectiveWorkspace,
agentDir,
);
ensurePiCompactionReserveTokens({ settingsManager });
const additionalExtensionPaths = buildEmbeddedExtensionPaths({
cfg: params.config,
sessionManager,
@@ -1369,6 +1371,7 @@ export async function runEmbeddedPiAgent(params: {
effectiveWorkspace,
agentDir,
);
ensurePiCompactionReserveTokens({ settingsManager });
const additionalExtensionPaths = buildEmbeddedExtensionPaths({
cfg: params.config,
sessionManager,

View File

@@ -0,0 +1,37 @@
import { describe, expect, it, vi } from "vitest";
import {
DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR,
ensurePiCompactionReserveTokens,
} from "./pi-settings.js";
describe("ensurePiCompactionReserveTokens", () => {
it("bumps reserveTokens when below floor", () => {
const settingsManager = {
getCompactionReserveTokens: () => 16_384,
applyOverrides: vi.fn(),
};
const result = ensurePiCompactionReserveTokens({ settingsManager });
expect(result).toEqual({
didOverride: true,
reserveTokens: DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR,
});
expect(settingsManager.applyOverrides).toHaveBeenCalledWith({
compaction: { reserveTokens: DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR },
});
});
it("does not override when already above floor", () => {
const settingsManager = {
getCompactionReserveTokens: () => 32_000,
applyOverrides: vi.fn(),
};
const result = ensurePiCompactionReserveTokens({ settingsManager });
expect(result).toEqual({ didOverride: false, reserveTokens: 32_000 });
expect(settingsManager.applyOverrides).not.toHaveBeenCalled();
});
});

27
src/agents/pi-settings.ts Normal file
View File

@@ -0,0 +1,27 @@
export const DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR = 20_000;
type PiSettingsManagerLike = {
getCompactionReserveTokens: () => number;
applyOverrides: (overrides: {
compaction: { reserveTokens: number };
}) => void;
};
export function ensurePiCompactionReserveTokens(params: {
settingsManager: PiSettingsManagerLike;
minReserveTokens?: number;
}): { didOverride: boolean; reserveTokens: number } {
const minReserveTokens =
params.minReserveTokens ?? DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR;
const current = params.settingsManager.getCompactionReserveTokens();
if (current >= minReserveTokens) {
return { didOverride: false, reserveTokens: current };
}
params.settingsManager.applyOverrides({
compaction: { reserveTokens: minReserveTokens },
});
return { didOverride: true, reserveTokens: minReserveTokens };
}