From be324914cb16e4bb2e6e48a1735da2c28bdcb055 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 3 May 2026 22:19:12 +0100 Subject: [PATCH] fix(discord): seed progress drafts at dispatch start --- .../monitor/message-handler.draft-preview.ts | 5 ++++ .../monitor/message-handler.process.test.ts | 23 +++++++++++++++++++ .../src/monitor/message-handler.process.ts | 8 ++++--- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/extensions/discord/src/monitor/message-handler.draft-preview.ts b/extensions/discord/src/monitor/message-handler.draft-preview.ts index f7a12b4855b..fff107ebf31 100644 --- a/extensions/discord/src/monitor/message-handler.draft-preview.ts +++ b/extensions/discord/src/monitor/message-handler.draft-preview.ts @@ -70,6 +70,7 @@ export function createDiscordDraftPreviewController(params: { let hasStreamedMessage = false; let finalizedViaPreviewMessage = false; let finalDeliveryHandled = false; + let progressDraftStarted = false; const previewToolProgressEnabled = Boolean(draftStream) && resolveChannelStreamingPreviewToolProgress(params.discordConfig); const suppressDefaultToolProgressMessages = @@ -116,6 +117,9 @@ export function createDiscordDraftPreviewController(params: { if (!draftStream || discordStreamMode !== "progress") { return; } + if (progressDraftStarted) { + return; + } const previewText = formatChannelProgressDraftText({ entry: params.discordConfig, lines: [], @@ -124,6 +128,7 @@ export function createDiscordDraftPreviewController(params: { if (!previewText || previewText === lastPartialText) { return; } + progressDraftStarted = true; lastPartialText = previewText; draftText = previewText; hasStreamedMessage = true; diff --git a/extensions/discord/src/monitor/message-handler.process.test.ts b/extensions/discord/src/monitor/message-handler.process.test.ts index e9639a21138..ae377ef58a6 100644 --- a/extensions/discord/src/monitor/message-handler.process.test.ts +++ b/extensions/discord/src/monitor/message-handler.process.test.ts @@ -1477,6 +1477,29 @@ describe("processDiscordMessage draft streaming", () => { }); }); + it("starts Discord progress drafts when accepted turns dispatch", async () => { + const draftStream = createMockDraftStreamForTest(); + + dispatchInboundMessage.mockImplementationOnce(async () => createNoQueuedDispatchResult()); + + const ctx = await createAutomaticSourceDeliveryContext({ + discordConfig: { + streaming: { + mode: "progress", + progress: { + label: "Shelling", + }, + }, + }, + }); + + await runProcessDiscordMessage(ctx); + + expect(draftStream.update).toHaveBeenCalledTimes(1); + expect(draftStream.update).toHaveBeenCalledWith("Shelling"); + expect(draftStream.flush).toHaveBeenCalledTimes(1); + }); + it("keeps standalone Discord tool progress when partial preview lines are disabled", async () => { createMockDraftStreamForTest(); diff --git a/extensions/discord/src/monitor/message-handler.process.ts b/extensions/discord/src/monitor/message-handler.process.ts index 91435dafd55..9050f8792be 100644 --- a/extensions/discord/src/monitor/message-handler.process.ts +++ b/extensions/discord/src/monitor/message-handler.process.ts @@ -618,8 +618,9 @@ export async function processDiscordMessage( limit: historyLimit, }, onPreDispatchFailure: settleDispatchBeforeStart, - runDispatch: () => - dispatchInboundMessage({ + runDispatch: async () => { + await draftPreview.startProgressDraft(); + return await dispatchInboundMessage({ ctx: ctxPayload, cfg, dispatcher, @@ -712,7 +713,8 @@ export async function processDiscordMessage( await statusReactions.setThinking(); }, }, - }), + }); + }, }), }, });