diff --git a/extensions/slack/src/monitor/message-handler/dispatch.preview-fallback.test.ts b/extensions/slack/src/monitor/message-handler/dispatch.preview-fallback.test.ts index 81f5f289671f..2cc993d13482 100644 --- a/extensions/slack/src/monitor/message-handler/dispatch.preview-fallback.test.ts +++ b/extensions/slack/src/monitor/message-handler/dispatch.preview-fallback.test.ts @@ -1829,6 +1829,31 @@ describe("dispatchPreparedSlackMessage preview fallback", () => { expect(updates.join("\n")).not.toContain("Checking Reading"); }); + it("extracts mm:think reasoning snapshots for Slack progress draft previews", async () => { + const draftStream = createDraftStreamStub(); + createSlackDraftStreamMock.mockReturnValueOnce(draftStream); + mockedDispatchSequence = []; + mockedReplyOptionEvents = [ + { + kind: "reasoning", + text: "Reading\nChecking", + isReasoningSnapshot: true, + }, + ]; + + await dispatchPreparedSlackMessage( + createPreparedSlackMessage({ + accountConfig: { streaming: { progress: { label: "Shelling" } } }, + }), + ); + + expect(draftStream.update).toHaveBeenLastCalledWith( + ["Shelling", "• Reading Checking"].join("\n"), + ); + const updates = draftStream.update.mock.calls.map((call) => String(call[0])); + expect(updates.join("\n")).toContain("Reading Checking"); + }); + it("keeps plain Slack reasoning content that starts with Thinking", async () => { const draftStream = createDraftStreamStub(); createSlackDraftStreamMock.mockReturnValueOnce(draftStream); diff --git a/extensions/slack/src/monitor/message-handler/dispatch.ts b/extensions/slack/src/monitor/message-handler/dispatch.ts index bcee77508d79..0e048967fd70 100644 --- a/extensions/slack/src/monitor/message-handler/dispatch.ts +++ b/extensions/slack/src/monitor/message-handler/dispatch.ts @@ -122,7 +122,8 @@ const UNICODE_TO_SLACK: Record = { "🛠️": "hammer_and_wrench", "💻": "computer", }; -const SLACK_REASONING_TAG_RE = /<\s*(\/?)\s*(?:think(?:ing)?|thought|antthinking)\b[^<>]*>/gi; +const SLACK_REASONING_TAG_RE = + /<\s*(\/?)\s*(?:(?:antml:|mm:)?(?:think(?:ing)?|thought)|antthinking)\b[^<>]*>/gi; const SLACK_REASONING_LABEL_PREFIX_RE = /^\s*(?:>\s*)?Reasoning:\s*/iu; const SLACK_THINKING_LABEL_PREFIX_RE = /^\s*(?:>\s*)?Thinking\.{0,3}(?=\s*(?:\n|_))/iu;