



























@@ -50,6 +50,40 @@ function buildCompactParams(
5050} as unknown as HandleCommandsParams;
5151}
525253+function requireCompactEmbeddedPiSessionCall(index = 0) {
54+const call = vi.mocked(compactEmbeddedPiSession).mock.calls[index]?.[0];
55+if (!call) {
56+throw new Error(`compactEmbeddedPiSession call ${index} missing`);
57+}
58+return call;
59+}
60+61+function requireResolveSessionAgentIdCall(index = 0) {
62+const call = (
63+resolveSessionAgentIdMock.mock.calls[index] as unknown as [unknown] | undefined
64+)?.[0] as { sessionKey?: string; config?: OpenClawConfig } | undefined;
65+if (!call) {
66+throw new Error(`resolveSessionAgentId call ${index} missing`);
67+}
68+return call;
69+}
70+71+function requireResolveAgentDirCall(index = 0) {
72+const call = resolveAgentDirMock.mock.calls[index] as [OpenClawConfig, string] | undefined;
73+if (!call) {
74+throw new Error(`resolveAgentDir call ${index} missing`);
75+}
76+return call;
77+}
78+79+function requireIncrementCompactionCountCall(index = 0) {
80+const call = vi.mocked(incrementCompactionCount).mock.calls[index]?.[0];
81+if (!call) {
82+throw new Error(`incrementCompactionCount call ${index} missing`);
83+}
84+return call;
85+}
86+5387describe("handleCompactCommand", () => {
5488beforeEach(() => {
5589vi.clearAllMocks();
@@ -134,25 +168,22 @@ describe("handleCompactCommand", () => {
134168135169expect(result?.shouldContinue).toBe(false);
136170expect(vi.mocked(compactEmbeddedPiSession)).toHaveBeenCalledOnce();
137-expect(vi.mocked(compactEmbeddedPiSession)).toHaveBeenCalledWith(
138-expect.objectContaining({
139-sessionId: "session-1",
140-sessionKey: "agent:main:main",
141-allowGatewaySubagentBinding: true,
142-trigger: "manual",
143-customInstructions: "focus on decisions",
144-messageChannel: "whatsapp",
145-groupId: "group-1",
146-groupChannel: "#general",
147-groupSpace: "workspace-1",
148-spawnedBy: "agent:main:parent",
149-senderId: "owner",
150-senderName: "Alice",
151-senderUsername: "alice_u",
152-senderE164: "+15551234567",
153-agentDir: "/tmp/openclaw-agent-compact",
154-}),
155-);
171+const call = requireCompactEmbeddedPiSessionCall();
172+expect(call.sessionId).toBe("session-1");
173+expect(call.sessionKey).toBe("agent:main:main");
174+expect(call.allowGatewaySubagentBinding).toBe(true);
175+expect(call.trigger).toBe("manual");
176+expect(call.customInstructions).toBe("focus on decisions");
177+expect(call.messageChannel).toBe("whatsapp");
178+expect(call.groupId).toBe("group-1");
179+expect(call.groupChannel).toBe("#general");
180+expect(call.groupSpace).toBe("workspace-1");
181+expect(call.spawnedBy).toBe("agent:main:parent");
182+expect(call.senderId).toBe("owner");
183+expect(call.senderName).toBe("Alice");
184+expect(call.senderUsername).toBe("alice_u");
185+expect(call.senderE164).toBe("+15551234567");
186+expect(call.agentDir).toBe("/tmp/openclaw-agent-compact");
156187});
157188158189it("uses the canonical session agent when resolving the compaction session file", async () => {
@@ -161,14 +192,15 @@ describe("handleCompactCommand", () => {
161192compacted: false,
162193});
163194resolveSessionAgentIdMock.mockReturnValue("target");
195+const cfg = {
196+commands: { text: true },
197+channels: { whatsapp: { allowFrom: ["*"] } },
198+session: { store: "/tmp/openclaw-session-store.json" },
199+} as OpenClawConfig;
164200165201await handleCompactCommand(
166202{
167- ...buildCompactParams("/compact", {
168-commands: { text: true },
169-channels: { whatsapp: { allowFrom: ["*"] } },
170-session: { store: "/tmp/openclaw-session-store.json" },
171-} as OpenClawConfig),
203+ ...buildCompactParams("/compact", cfg),
172204agentId: "main",
173205sessionKey: "agent:target:whatsapp:direct:12345",
174206sessionEntry: {
@@ -179,10 +211,10 @@ describe("handleCompactCommand", () => {
179211true,
180212);
181213182-expect(resolveSessionAgentIdMock).toHaveBeenCalledWith({
183- sessionKey: "agent:target:whatsapp:direct:12345",
184- config: expect.any(Object),
185-});
214+expect(resolveSessionAgentIdMock).toHaveBeenCalledOnce();
215+const resolveCall = requireResolveSessionAgentIdCall();
216+expect(resolveCall.sessionKey).toBe("agent:target:whatsapp:direct:12345");
217+expect(resolveCall.config).toBe(cfg);
186218expect(vi.mocked(resolveSessionFilePathOptions)).toHaveBeenCalledWith({
187219agentId: "target",
188220storePath: undefined,
@@ -196,13 +228,14 @@ describe("handleCompactCommand", () => {
196228});
197229resolveSessionAgentIdMock.mockReturnValue("target");
198230resolveAgentDirMock.mockReturnValue("/tmp/target-agent");
231+const cfg = {
232+commands: { text: true },
233+channels: { whatsapp: { allowFrom: ["*"] } },
234+} as OpenClawConfig;
199235200236await handleCompactCommand(
201237{
202- ...buildCompactParams("/compact", {
203-commands: { text: true },
204-channels: { whatsapp: { allowFrom: ["*"] } },
205-} as OpenClawConfig),
238+ ...buildCompactParams("/compact", cfg),
206239agentId: "main",
207240agentDir: "/tmp/main-agent",
208241sessionKey: "agent:target:whatsapp:direct:12345",
@@ -214,12 +247,11 @@ describe("handleCompactCommand", () => {
214247true,
215248);
216249217-expect(vi.mocked(compactEmbeddedPiSession)).toHaveBeenCalledWith(
218-expect.objectContaining({
219-agentDir: "/tmp/target-agent",
220-}),
221-);
222-expect(resolveAgentDirMock).toHaveBeenCalledWith(expect.any(Object), "target");
250+expect(requireCompactEmbeddedPiSessionCall().agentDir).toBe("/tmp/target-agent");
251+expect(resolveAgentDirMock).toHaveBeenCalledOnce();
252+const [configArg, agentIdArg] = requireResolveAgentDirCall();
253+expect(configArg).toBe(cfg);
254+expect(agentIdArg).toBe("target");
223255});
224256225257it("prefers the target session entry for compaction runtime metadata", async () => {
@@ -261,16 +293,13 @@ describe("handleCompactCommand", () => {
261293true,
262294);
263295264-expect(vi.mocked(compactEmbeddedPiSession)).toHaveBeenCalledWith(
265-expect.objectContaining({
266-sessionId: "target-session",
267-groupId: "target-group",
268-groupChannel: "#target",
269-groupSpace: "target-space",
270-spawnedBy: "agent:target-parent",
271-skillsSnapshot: { prompt: "target", skills: [] },
272-}),
273-);
296+const call = requireCompactEmbeddedPiSessionCall();
297+expect(call.sessionId).toBe("target-session");
298+expect(call.groupId).toBe("target-group");
299+expect(call.groupChannel).toBe("#target");
300+expect(call.groupSpace).toBe("target-space");
301+expect(call.spawnedBy).toBe("agent:target-parent");
302+expect(call.skillsSnapshot).toEqual({ prompt: "target", skills: [] });
274303});
275304276305it("prefers the target session entry when incrementing compaction count", async () => {
@@ -306,13 +335,11 @@ describe("handleCompactCommand", () => {
306335true,
307336);
308337309-expect(vi.mocked(incrementCompactionCount)).toHaveBeenCalledWith(
310-expect.objectContaining({
311-sessionEntry: expect.objectContaining({
312-sessionId: "target-session",
313-}),
314-tokensAfter: 321,
315-}),
316-);
338+const call = requireIncrementCompactionCountCall();
339+if (!call.sessionEntry) {
340+throw new Error("incrementCompactionCount sessionEntry missing");
341+}
342+expect(call.sessionEntry.sessionId).toBe("target-session");
343+expect(call.tokensAfter).toBe(321);
317344});
318345});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。