From 4ba3ea30b03c958d860f82eddbcebb46d11b5fb6 Mon Sep 17 00:00:00 2001 From: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Date: Fri, 10 Apr 2026 19:49:20 -0500 Subject: [PATCH] Avoid stale agentDir in tools sessions --- .../reply/commands-info.tools.test.ts | 24 +++++++++++++++++++ src/auto-reply/reply/commands-info.ts | 5 ++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/auto-reply/reply/commands-info.tools.test.ts b/src/auto-reply/reply/commands-info.tools.test.ts index 9251d206ec1..cc505b1771e 100644 --- a/src/auto-reply/reply/commands-info.tools.test.ts +++ b/src/auto-reply/reply/commands-info.tools.test.ts @@ -346,4 +346,28 @@ describe("handleToolsCommand", () => { }), ); }); + + it("does not forward a stale ambient agentDir for session-bound /tools", async () => { + const { resolveSessionAgentId } = await import("../../agents/agent-scope.js"); + vi.mocked(resolveSessionAgentId).mockReturnValue("target"); + const { buildCommandTestParams, handleToolsCommand, resolveToolsMock } = + await loadToolsHarness(); + const params = buildCommandTestParams("/tools", buildConfig(), undefined, { + workspaceDir: "/tmp", + }); + params.agentId = "main"; + params.agentDir = "/tmp/agents/main/agent"; + params.sessionKey = "agent:target:whatsapp:direct:12345"; + + const result = await handleToolsCommand(params, true); + + expect(result?.shouldContinue).toBe(false); + expect(resolveToolsMock).toHaveBeenCalledWith( + expect.objectContaining({ + agentId: "target", + agentDir: undefined, + sessionKey: "agent:target:whatsapp:direct:12345", + }), + ); + }); }); diff --git a/src/auto-reply/reply/commands-info.ts b/src/auto-reply/reply/commands-info.ts index 4a9a15d3ee5..0de074c910d 100644 --- a/src/auto-reply/reply/commands-info.ts +++ b/src/auto-reply/reply/commands-info.ts @@ -115,7 +115,8 @@ export const handleToolsCommand: CommandHandler = async (params, allowTextComman ctx: params.ctx, command: params.command, }); - const agentId = params.sessionKey + const sessionBound = Boolean(params.sessionKey); + const agentId = sessionBound ? resolveSessionAgentId({ sessionKey: params.sessionKey, config: params.cfg }) : params.agentId; const threadingContext = buildThreadingToolContext({ @@ -128,7 +129,7 @@ export const handleToolsCommand: CommandHandler = async (params, allowTextComman agentId, sessionKey: params.sessionKey, workspaceDir: params.workspaceDir, - agentDir: params.agentDir, + agentDir: sessionBound ? undefined : params.agentDir, modelProvider: params.provider, modelId: params.model, messageProvider: params.command.channel,