From f9ecbef08fdca7b5cf26b2ef064418756013cffa Mon Sep 17 00:00:00 2001 From: Andy Ye Date: Fri, 8 May 2026 11:12:01 -0700 Subject: [PATCH] fix(agents): initialize context engines before CLI compaction --- src/agents/command/cli-compaction.test.ts | 55 +++++++++++++++++++++++ src/agents/command/cli-compaction.ts | 5 +++ 2 files changed, 60 insertions(+) diff --git a/src/agents/command/cli-compaction.test.ts b/src/agents/command/cli-compaction.test.ts index b6f6c4c8d0d..a494a26fcb0 100644 --- a/src/agents/command/cli-compaction.test.ts +++ b/src/agents/command/cli-compaction.test.ts @@ -174,4 +174,59 @@ describe("runCliTurnCompactionLifecycle", () => { expect(updatedEntry?.cliSessionIds?.["claude-cli"]).toBeUndefined(); expect(updatedEntry?.claudeCliSessionId).toBeUndefined(); }); + + it("initializes built-in context engines before resolving CLI compaction engine", async () => { + const sessionKey = "agent:main:cli"; + const sessionId = "session-cli-init"; + const sessionFile = path.join(tmpDir, "session-init.jsonl"); + await writeSessionFile({ sessionFile, sessionId }); + + const sessionEntry: SessionEntry = { + sessionId, + updatedAt: Date.now(), + sessionFile, + contextTokens: 1_000, + totalTokens: 100, + totalTokensFresh: true, + }; + const calls: string[] = []; + setCliCompactionTestDeps({ + ensureContextEnginesInitialized: () => { + calls.push("ensure"); + }, + resolveContextEngine: async () => { + calls.push("resolve"); + return buildContextEngine({ compactCalls: [] }); + }, + createPreparedEmbeddedPiSettingsManager: async () => ({ + getCompactionReserveTokens: () => 200, + getCompactionKeepRecentTokens: () => 0, + applyOverrides: () => {}, + }), + shouldPreemptivelyCompactBeforePrompt: () => ({ + route: "fits", + shouldCompact: false, + estimatedPromptTokens: 100, + promptBudgetBeforeReserve: 800, + overflowTokens: 0, + toolResultReducibleChars: 0, + effectiveReserveTokens: 200, + }), + resolveLiveToolResultMaxChars: () => 20_000, + }); + + await runCliTurnCompactionLifecycle({ + cfg: {} as OpenClawConfig, + sessionId, + sessionKey, + sessionEntry, + sessionAgentId: "main", + workspaceDir: tmpDir, + agentDir: tmpDir, + provider: "claude-cli", + model: "opus", + }); + + expect(calls).toEqual(["ensure", "resolve"]); + }); }); diff --git a/src/agents/command/cli-compaction.ts b/src/agents/command/cli-compaction.ts index a3370e35e59..52c14818bae 100644 --- a/src/agents/command/cli-compaction.ts +++ b/src/agents/command/cli-compaction.ts @@ -3,6 +3,7 @@ import { SessionManager } from "@mariozechner/pi-coding-agent"; import type { SessionEntry } from "../../config/sessions/types.js"; import type { AgentCompactionMode } from "../../config/types.agent-defaults.js"; import type { OpenClawConfig } from "../../config/types.openclaw.js"; +import { ensureContextEnginesInitialized as ensureContextEnginesInitializedImpl } from "../../context-engine/init.js"; import { resolveContextEngine as resolveContextEngineImpl } from "../../context-engine/registry.js"; import type { ContextEngine } from "../../context-engine/types.js"; import { createSubsystemLogger } from "../../logging/subsystem.js"; @@ -32,6 +33,7 @@ type SettingsManagerLike = { }; type CliCompactionDeps = { openSessionManager: (sessionFile: string) => SessionManagerLike; + ensureContextEnginesInitialized: () => void; resolveContextEngine: (cfg: OpenClawConfig) => Promise; createPreparedEmbeddedPiSettingsManager: (params: { cwd: string; @@ -54,6 +56,7 @@ const log = createSubsystemLogger("agents/cli-compaction"); const cliCompactionDeps: CliCompactionDeps = { openSessionManager: (sessionFile: string) => SessionManager.open(sessionFile), + ensureContextEnginesInitialized: ensureContextEnginesInitializedImpl, resolveContextEngine: resolveContextEngineImpl, createPreparedEmbeddedPiSettingsManager: createPreparedEmbeddedPiSettingsManagerImpl, applyPiAutoCompactionGuard: applyPiAutoCompactionGuardImpl, @@ -70,6 +73,7 @@ export function setCliCompactionTestDeps(overrides: Partial SessionManager.open(sessionFile), + ensureContextEnginesInitialized: ensureContextEnginesInitializedImpl, resolveContextEngine: resolveContextEngineImpl, createPreparedEmbeddedPiSettingsManager: createPreparedEmbeddedPiSettingsManagerImpl, applyPiAutoCompactionGuard: applyPiAutoCompactionGuardImpl, @@ -201,6 +205,7 @@ export async function runCliTurnCompactionLifecycle(params: { return params.sessionEntry; } + cliCompactionDeps.ensureContextEnginesInitialized(); const contextEngine = await cliCompactionDeps.resolveContextEngine(params.cfg); const sessionManager = cliCompactionDeps.openSessionManager(sessionFile); const settingsManager = await cliCompactionDeps.createPreparedEmbeddedPiSettingsManager({