From 53861607f6eb930c1dff942014159aac01d35d35 Mon Sep 17 00:00:00 2001 From: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Date: Fri, 27 Mar 2026 20:10:43 -0500 Subject: [PATCH] fix: use origin thread metadata in tools effective context --- .../server-methods/tools-effective.test.ts | 41 +++++++++++++++++++ src/gateway/server-methods/tools-effective.ts | 4 +- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/gateway/server-methods/tools-effective.test.ts b/src/gateway/server-methods/tools-effective.test.ts index 8e614e0dd9d..c81dd8f7058 100644 --- a/src/gateway/server-methods/tools-effective.test.ts +++ b/src/gateway/server-methods/tools-effective.test.ts @@ -195,6 +195,47 @@ describe("tools.effective handler", () => { ); }); + it("falls back to origin.threadId when delivery context omits thread metadata", async () => { + vi.mocked(loadSessionEntry).mockReturnValueOnce({ + cfg: {}, + canonicalKey: "main:abc", + entry: { + sessionId: "session-origin-thread", + updatedAt: 1, + lastChannel: "telegram", + lastAccountId: "acct-1", + lastTo: "channel-1", + origin: { + provider: "telegram", + accountId: "acct-1", + threadId: 42, + }, + groupId: "group-4", + groupChannel: "#ops", + space: "workspace-5", + chatType: "group", + modelProvider: "openai", + model: "gpt-4.1", + }, + } as never); + const deliveryContextModule = await import("../../utils/delivery-context.js"); + vi.mocked(deliveryContextModule.deliveryContextFromSession).mockReturnValueOnce({ + channel: "telegram", + to: "channel-1", + accountId: "acct-1", + }); + + const { respond, invoke } = createInvokeParams({ sessionKey: "main:abc" }); + await invoke(); + + expect(vi.mocked(resolveEffectiveToolInventory)).toHaveBeenCalledWith( + expect.objectContaining({ + currentThreadTs: "42", + }), + ); + expect((respond.mock.calls[0] as RespondCall | undefined)?.[0]).toBe(true); + }); + it("passes senderIsOwner=true for admin-scoped callers", async () => { const respond = vi.fn(); await toolsEffectiveHandlers["tools.effective"]({ diff --git a/src/gateway/server-methods/tools-effective.ts b/src/gateway/server-methods/tools-effective.ts index 0f661711e01..cb27a8062ef 100644 --- a/src/gateway/server-methods/tools-effective.ts +++ b/src/gateway/server-methods/tools-effective.ts @@ -86,7 +86,9 @@ function resolveTrustedToolsEffectiveContext(params: { ? String(delivery.threadId) : loaded.entry.lastThreadId != null ? String(loaded.entry.lastThreadId) - : undefined, + : loaded.entry.origin?.threadId != null + ? String(loaded.entry.origin.threadId) + : undefined, groupId: loaded.entry.groupId, groupChannel: loaded.entry.groupChannel, groupSpace: loaded.entry.space,