Skip to content

Commit 85b3a8d

Browse files
committed
fix(telegram): clear split reasoning previews
1 parent a765668 commit 85b3a8d

3 files changed

Lines changed: 32 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Docs: https://docs.openclaw.ai
66

77
### Fixes
88

9+
- Telegram: clear the previous `/reasoning stream` preview before starting a split reasoning segment, preventing stale reasoning messages from piling up while preserving final cleanup. Fixes #80862. Thanks @kyle20026.
910
- Build: skip copied metadata for bundled plugins that are excluded from build entries, preventing update/status rebuilds from advertising missing QQ Bot runtime files. (#80925)
1011
- Control UI/sessions: nest subagent sessions under their parent session in the session picker dropdown using a visual `└─ ` prefix, making the parent-child relationship clear. Fixes #77628. (#78623) Thanks @chinar-amrutkar.
1112

extensions/telegram/src/bot-message-dispatch.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,36 @@ describe("dispatchTelegramMessage draft streaming", () => {
13691369
expect(deliverReplies).not.toHaveBeenCalled();
13701370
});
13711371

1372+
it("clears an ended reasoning preview before starting a split reasoning segment", async () => {
1373+
const { answerDraftStream, reasoningDraftStream } = setupDraftStreams({
1374+
answerMessageId: 2001,
1375+
reasoningMessageId: 3001,
1376+
});
1377+
dispatchReplyWithBufferedBlockDispatcher.mockImplementation(
1378+
async ({ dispatcherOptions, replyOptions }) => {
1379+
await replyOptions?.onReasoningStream?.({ text: "<think>First</think>" });
1380+
await replyOptions?.onReasoningEnd?.();
1381+
await replyOptions?.onReasoningStream?.({ text: "<think>Second</think>" });
1382+
await dispatcherOptions.deliver({ text: "Answer" }, { kind: "final" });
1383+
return { queuedFinal: true };
1384+
},
1385+
);
1386+
1387+
await dispatchWithContext({ context: createReasoningStreamContext() });
1388+
1389+
expect(reasoningDraftStream.update).toHaveBeenNthCalledWith(1, "Reasoning:\n_First_");
1390+
expect(reasoningDraftStream.update).toHaveBeenNthCalledWith(2, "Reasoning:\n_Second_");
1391+
expect(reasoningDraftStream.clear).toHaveBeenCalledTimes(2);
1392+
expect(reasoningDraftStream.forceNewMessage).toHaveBeenCalledTimes(1);
1393+
const splitClearOrder = reasoningDraftStream.clear.mock.invocationCallOrder[0];
1394+
const splitForceOrder = reasoningDraftStream.forceNewMessage.mock.invocationCallOrder[0];
1395+
const secondReasoningUpdateOrder = reasoningDraftStream.update.mock.invocationCallOrder[1];
1396+
expect(splitClearOrder).toBeLessThan(splitForceOrder);
1397+
expect(splitForceOrder).toBeLessThan(secondReasoningUpdateOrder);
1398+
expect(answerDraftStream.update).toHaveBeenCalledWith("Answer");
1399+
expect(deliverReplies).not.toHaveBeenCalled();
1400+
});
1401+
13721402
it("streams reasoning from configured defaults", async () => {
13731403
const { answerDraftStream, reasoningDraftStream } = setupDraftStreams({
13741404
answerMessageId: 2001,

extensions/telegram/src/bot-message-dispatch.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,6 +1439,7 @@ export const dispatchTelegramMessage = async ({
14391439
? (payload) =>
14401440
enqueueDraftLaneEvent(async () => {
14411441
if (splitReasoningOnNextStream) {
1442+
await reasoningLane.stream?.clear();
14421443
reasoningLane.stream?.forceNewMessage();
14431444
resetDraftLaneState(reasoningLane);
14441445
splitReasoningOnNextStream = false;

0 commit comments

Comments
 (0)