diff --git a/src/auto-reply/reply/commands-compact.test.ts b/src/auto-reply/reply/commands-compact.test.ts index 6e6a4a771d9..0f5fc9fabda 100644 --- a/src/auto-reply/reply/commands-compact.test.ts +++ b/src/auto-reply/reply/commands-compact.test.ts @@ -1,4 +1,5 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; +import { resolveAgentDir } from "../../agents/agent-scope.js"; import type { OpenClawConfig } from "../../config/config.js"; import { handleCompactCommand } from "./commands-compact.js"; import type { HandleCommandsParams } from "./commands-types.js"; @@ -12,6 +13,7 @@ vi.mock("../../agents/agent-scope.js", async () => { return { ...actual, resolveSessionAgentId: resolveSessionAgentIdMock, + resolveAgentDir: vi.fn(actual.resolveAgentDir), }; }); @@ -193,4 +195,36 @@ describe("handleCompactCommand", () => { storePath: undefined, }); }); + + it("uses the canonical session agent directory for compaction runtime inputs", async () => { + vi.mocked(compactEmbeddedPiSession).mockResolvedValueOnce({ + ok: true, + compacted: false, + }); + resolveSessionAgentIdMock.mockReturnValue("target"); + vi.mocked(resolveAgentDir).mockReturnValue("/tmp/target-agent"); + + await handleCompactCommand( + { + ...buildCompactParams("/compact", { + commands: { text: true }, + channels: { whatsapp: { allowFrom: ["*"] } }, + } as OpenClawConfig), + agentId: "main", + agentDir: "/tmp/main-agent", + sessionKey: "agent:target:whatsapp:direct:12345", + sessionEntry: { + sessionId: "session-1", + updatedAt: Date.now(), + }, + } as HandleCommandsParams, + true, + ); + + expect(vi.mocked(compactEmbeddedPiSession)).toHaveBeenCalledWith( + expect.objectContaining({ + agentDir: "/tmp/target-agent", + }), + ); + }); }); diff --git a/src/auto-reply/reply/commands-compact.ts b/src/auto-reply/reply/commands-compact.ts index ff7f62f0e86..7270d8146f7 100644 --- a/src/auto-reply/reply/commands-compact.ts +++ b/src/auto-reply/reply/commands-compact.ts @@ -1,4 +1,4 @@ -import { resolveSessionAgentId } from "../../agents/agent-scope.js"; +import { resolveAgentDir, resolveSessionAgentId } from "../../agents/agent-scope.js"; import type { OpenClawConfig } from "../../config/config.js"; import { logVerbose } from "../../globals.js"; import { @@ -96,6 +96,7 @@ export const handleCompactCommand: CommandHandler = async (params) => { const sessionAgentId = params.sessionKey ? resolveSessionAgentId({ sessionKey: params.sessionKey, config: params.cfg }) : params.agentId; + const sessionAgentDir = resolveAgentDir(params.cfg, sessionAgentId) ?? params.agentDir; const customInstructions = extractCompactInstructions({ rawBody: params.ctx.CommandBody ?? params.ctx.RawBody ?? params.ctx.Body, ctx: params.ctx, @@ -125,7 +126,7 @@ export const handleCompactCommand: CommandHandler = async (params) => { }), ), workspaceDir: params.workspaceDir, - agentDir: params.agentDir, + agentDir: sessionAgentDir, config: params.cfg, skillsSnapshot: params.sessionEntry.skillsSnapshot, provider: params.provider,