feat: add pre-compaction memory flush

This commit is contained in:
Peter Steinberger
2026-01-12 05:28:17 +00:00
parent cc8a2457c0
commit 7dbb21be8e
19 changed files with 583 additions and 22 deletions

View File

@@ -73,7 +73,10 @@ 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 {
ensurePiCompactionReserveTokens,
resolveCompactionReserveTokensFloor,
} from "./pi-settings.js";
import { acquireSessionWriteLock } from "./session-write-lock.js";
export type { MessagingToolSend } from "./pi-embedded-messaging.js";
@@ -1184,7 +1187,12 @@ export async function compactEmbeddedPiSession(params: {
effectiveWorkspace,
agentDir,
);
ensurePiCompactionReserveTokens({ settingsManager });
ensurePiCompactionReserveTokens({
settingsManager,
minReserveTokens: resolveCompactionReserveTokensFloor(
params.config,
),
});
const additionalExtensionPaths = buildEmbeddedExtensionPaths({
cfg: params.config,
sessionManager,
@@ -1584,7 +1592,12 @@ export async function runEmbeddedPiAgent(params: {
effectiveWorkspace,
agentDir,
);
ensurePiCompactionReserveTokens({ settingsManager });
ensurePiCompactionReserveTokens({
settingsManager,
minReserveTokens: resolveCompactionReserveTokensFloor(
params.config,
),
});
const additionalExtensionPaths = buildEmbeddedExtensionPaths({
cfg: params.config,
sessionManager,

View File

@@ -3,6 +3,7 @@ import { describe, expect, it, vi } from "vitest";
import {
DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR,
ensurePiCompactionReserveTokens,
resolveCompactionReserveTokensFloor,
} from "./pi-settings.js";
describe("ensurePiCompactionReserveTokens", () => {
@@ -35,3 +36,24 @@ describe("ensurePiCompactionReserveTokens", () => {
expect(settingsManager.applyOverrides).not.toHaveBeenCalled();
});
});
describe("resolveCompactionReserveTokensFloor", () => {
it("returns the default when config is missing", () => {
expect(resolveCompactionReserveTokensFloor()).toBe(
DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR,
);
});
it("accepts configured floors, including zero", () => {
expect(
resolveCompactionReserveTokensFloor({
agents: { defaults: { compaction: { reserveTokensFloor: 24_000 } } },
}),
).toBe(24_000);
expect(
resolveCompactionReserveTokensFloor({
agents: { defaults: { compaction: { reserveTokensFloor: 0 } } },
}),
).toBe(0);
});
});

View File

@@ -1,3 +1,5 @@
import type { ClawdbotConfig } from "../config/config.js";
export const DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR = 20_000;
type PiSettingsManagerLike = {
@@ -25,3 +27,13 @@ export function ensurePiCompactionReserveTokens(params: {
return { didOverride: true, reserveTokens: minReserveTokens };
}
export function resolveCompactionReserveTokensFloor(
cfg?: ClawdbotConfig,
): number {
const raw = cfg?.agents?.defaults?.compaction?.reserveTokensFloor;
if (typeof raw === "number" && Number.isFinite(raw) && raw >= 0) {
return Math.floor(raw);
}
return DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR;
}