From f9b1132bbb04eba325cc24e2ae640ab69f3daf4c Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 29 May 2026 05:50:57 +0000 Subject: [PATCH] test(channels): cover suppressed group progress callbacks --- .../reply/dispatch-from-config.test.ts | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/auto-reply/reply/dispatch-from-config.test.ts b/src/auto-reply/reply/dispatch-from-config.test.ts index d881acbd5b6..cdbf5e12720 100644 --- a/src/auto-reply/reply/dispatch-from-config.test.ts +++ b/src/auto-reply/reply/dispatch-from-config.test.ts @@ -2026,6 +2026,70 @@ describe("dispatchReplyFromConfig", () => { expect(dispatcher.sendFinalReply).toHaveBeenCalledTimes(1); }); + it("forwards channel-owned group progress callbacks while source delivery is suppressed", async () => { + setNoAbort(); + sessionStoreMocks.currentEntry = { + verboseLevel: "off", + }; + const cfg = automaticGroupReplyConfig; + const dispatcher = createDispatcher(); + const ctx = buildTestCtx({ + Provider: "telegram", + Surface: "telegram", + ChatType: "group", + From: "telegram:group:-100123", + SessionKey: "agent:main:telegram:group:-100123", + }); + const onToolStart = vi.fn(); + const onItemEvent = vi.fn(); + const onCommandOutput = vi.fn(); + const onToolResult = vi.fn(); + + const replyResolver = async ( + _ctx: MsgContext, + opts?: GetReplyOptions, + _cfg?: OpenClawConfig, + ) => { + await opts?.onToolStart?.({ name: "exec", phase: "start" }); + await opts?.onItemEvent?.({ itemId: "1", kind: "tool", progressText: "running exec" }); + await opts?.onCommandOutput?.({ phase: "end", name: "exec", status: "ok", exitCode: 0 }); + await opts?.onToolResult?.({ text: "exec: ok" }); + return { text: "done" } satisfies ReplyPayload; + }; + + await dispatchReplyFromConfig({ + ctx, + cfg, + dispatcher, + replyResolver, + replyOptions: { + sourceReplyDeliveryMode: "message_tool_only", + suppressDefaultToolProgressMessages: true, + allowProgressCallbacksWhenSourceDeliverySuppressed: true, + onToolStart, + onItemEvent, + onCommandOutput, + onToolResult, + }, + }); + + expect(onToolStart).toHaveBeenCalledWith({ name: "exec", phase: "start" }); + expect(onItemEvent).toHaveBeenCalledWith({ + itemId: "1", + kind: "tool", + progressText: "running exec", + }); + expect(onCommandOutput).toHaveBeenCalledWith({ + phase: "end", + name: "exec", + status: "ok", + exitCode: 0, + }); + expect(onToolResult).not.toHaveBeenCalled(); + expect(dispatcher.sendToolResult).not.toHaveBeenCalled(); + expect(dispatcher.sendFinalReply).not.toHaveBeenCalled(); + }); + it("exposes live tool-summary state to reply_dispatch hooks", () => { let shouldSendToolSummaries = false; const event = dispatchFromConfigTesting.createReplyDispatchEvent({