























@@ -116,6 +116,14 @@ function buildConfig() {
116116} as OpenClawConfig;
117117}
118118119+function resolveToolsArg(resolveToolsMock: { mock: { calls: unknown[][] } }, index = 0) {
120+const [arg] = resolveToolsMock.mock.calls[index] ?? [];
121+if (!arg || typeof arg !== "object") {
122+throw new Error(`expected resolve tools call ${index + 1}`);
123+}
124+return arg as Record<string, unknown>;
125+}
126+119127describe("handleToolsCommand", () => {
120128beforeAll(async () => {
121129({ buildCommandTestParams } = await import("./commands.test-harness.js"));
@@ -160,23 +168,20 @@ describe("handleToolsCommand", () => {
160168expect(result?.reply?.text).toContain("Connected tools");
161169expect(result?.reply?.text).toContain("docs_lookup (docs)");
162170expect(result?.reply?.text).not.toContain("unavailable right now");
163-expect(resolveToolsMock).toHaveBeenCalledWith(
164-expect.objectContaining({
165-senderIsOwner: false,
166-senderId: undefined,
167-senderName: "User Name",
168-senderUsername: "user_name",
169-senderE164: "+1000",
170-accountId: "acct-1",
171-currentChannelId: "channel-123",
172-currentThreadTs: "99",
173-currentMessageId: "message-456",
174-groupId: "abc123",
175-groupChannel: "#ops",
176-groupSpace: "workspace-1",
177-replyToMode: "all",
178-}),
179-);
171+const toolsArg = resolveToolsArg(resolveToolsMock);
172+expect(toolsArg.senderIsOwner).toBe(false);
173+expect(toolsArg.senderId).toBeUndefined();
174+expect(toolsArg.senderName).toBe("User Name");
175+expect(toolsArg.senderUsername).toBe("user_name");
176+expect(toolsArg.senderE164).toBe("+1000");
177+expect(toolsArg.accountId).toBe("acct-1");
178+expect(toolsArg.currentChannelId).toBe("channel-123");
179+expect(toolsArg.currentThreadTs).toBe("99");
180+expect(toolsArg.currentMessageId).toBe("message-456");
181+expect(toolsArg.groupId).toBe("abc123");
182+expect(toolsArg.groupChannel).toBe("#ops");
183+expect(toolsArg.groupSpace).toBe("workspace-1");
184+expect(toolsArg.replyToMode).toBe("all");
180185});
181186182187it("returns usage when arguments are provided", async () => {
@@ -207,7 +212,7 @@ describe("handleToolsCommand", () => {
207212208213await handleToolsCommand(params, true);
209214210-expect(resolveToolsMock).toHaveBeenCalledWith(expect.objectContaining({ groupId: undefined }));
215+expect(resolveToolsArg(resolveToolsMock).groupId).toBeUndefined();
211216});
212217213218it("prefers the target session entry for tool inventory group metadata", async () => {
@@ -243,13 +248,10 @@ describe("handleToolsCommand", () => {
243248244249await handleToolsCommand(params, true);
245250246-expect(resolveToolsMock).toHaveBeenCalledWith(
247-expect.objectContaining({
248-groupId: "target-group",
249-groupChannel: "#target",
250-groupSpace: "target-space",
251-}),
252-);
251+const toolsArg = resolveToolsArg(resolveToolsMock);
252+expect(toolsArg.groupId).toBe("target-group");
253+expect(toolsArg.groupChannel).toBe("#target");
254+expect(toolsArg.groupSpace).toBe("target-space");
253255});
254256255257it("renders the detailed tool list in verbose mode", async () => {
@@ -342,11 +344,7 @@ describe("handleToolsCommand", () => {
342344343345await handleToolsCommand(params, true);
344346345-expect(resolveToolsMock).toHaveBeenCalledWith(
346-expect.objectContaining({
347-accountId: "work",
348-}),
349-);
347+expect(resolveToolsArg(resolveToolsMock).accountId).toBe("work");
350348});
351349352350it("returns a concise fallback error on effective inventory failures", async () => {
@@ -381,12 +379,9 @@ describe("handleToolsCommand", () => {
381379const result = await handleToolsCommand(params, true);
382380383381expect(result?.shouldContinue).toBe(false);
384-expect(resolveToolsMock).toHaveBeenCalledWith(
385-expect.objectContaining({
386-agentId: "target",
387-sessionKey: "agent:target:whatsapp:direct:12345",
388-}),
389-);
382+const toolsArg = resolveToolsArg(resolveToolsMock);
383+expect(toolsArg.agentId).toBe("target");
384+expect(toolsArg.sessionKey).toBe("agent:target:whatsapp:direct:12345");
390385});
391386392387it("does not forward a stale ambient agentDir for session-bound /tools", async () => {
@@ -404,12 +399,9 @@ describe("handleToolsCommand", () => {
404399const result = await handleToolsCommand(params, true);
405400406401expect(result?.shouldContinue).toBe(false);
407-expect(resolveToolsMock).toHaveBeenCalledWith(
408-expect.objectContaining({
409-agentId: "target",
410-agentDir: undefined,
411-sessionKey: "agent:target:whatsapp:direct:12345",
412-}),
413-);
402+const toolsArg = resolveToolsArg(resolveToolsMock);
403+expect(toolsArg.agentId).toBe("target");
404+expect(toolsArg.agentDir).toBeUndefined();
405+expect(toolsArg.sessionKey).toBe("agent:target:whatsapp:direct:12345");
414406});
415407});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。