Skip to content

Commit 3d05da9

Browse files
committed
fix(telegram): preserve streamed text during media normalization
1 parent 5ce413a commit 3d05da9

2 files changed

Lines changed: 35 additions & 7 deletions

File tree

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2089,6 +2089,25 @@ describe("dispatchTelegramMessage draft streaming", () => {
20892089
expect(deliverReplies).not.toHaveBeenCalled();
20902090
});
20912091

2092+
it("does not leak inline reply directives into block draft previews", async () => {
2093+
const { answerDraftStream } = setupDraftStreams({ answerMessageId: 2001 });
2094+
dispatchReplyWithBufferedBlockDispatcher.mockImplementation(
2095+
async ({ dispatcherOptions, replyOptions }) => {
2096+
const payload = { text: "[[reply_to: 123]] Visible chunk." };
2097+
await replyOptions?.onBlockReplyQueued?.(payload, { assistantMessageIndex: 0 });
2098+
await dispatcherOptions.deliver(payload, { kind: "block", assistantMessageIndex: 0 });
2099+
return { queuedFinal: true };
2100+
},
2101+
);
2102+
2103+
await dispatchWithContext({ context: createContext() });
2104+
2105+
expect(answerDraftStream.update).toHaveBeenCalledTimes(1);
2106+
expect(answerDraftStream.update).toHaveBeenCalledWith("Visible chunk.");
2107+
expect(answerDraftStream.update).not.toHaveBeenCalledWith("[[reply_to: 123]] Visible chunk.");
2108+
expect(deliverReplies).not.toHaveBeenCalled();
2109+
});
2110+
20922111
it("rotates answer previews when queued block assistant index changes", async () => {
20932112
const { answerDraftStream } = setupDraftStreams({ answerMessageId: 2001 });
20942113
dispatchReplyWithBufferedBlockDispatcher.mockImplementation(

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

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1994,8 +1994,18 @@ export const dispatchTelegramMessage = async ({
19941994
return;
19951995
}
19961996
const telegramButtons = resolvePayloadTelegramInlineButtons(effectivePayload);
1997+
const lanePayload =
1998+
info.kind === "block" &&
1999+
typeof payload.text === "string" &&
2000+
typeof effectivePayload.text === "string" &&
2001+
payload.text !== effectivePayload.text &&
2002+
payload.text.trimEnd() === effectivePayload.text &&
2003+
!effectivePayload.mediaUrl &&
2004+
!effectivePayload.mediaUrls?.length
2005+
? { ...effectivePayload, text: payload.text }
2006+
: effectivePayload;
19972007
const split = splitTextIntoLaneSegments(
1998-
{ text: effectivePayload.text },
2008+
{ text: lanePayload.text },
19992009
payload.isReasoning,
20002010
);
20012011
const segments = split.segments;
@@ -2012,8 +2022,7 @@ export const dispatchTelegramMessage = async ({
20122022
const isToolPayloadAfterFinal =
20132023
info.kind === "tool" && (finalAnswerDeliveryStarted || finalAnswerDelivered);
20142024
const isNonTerminalWarningAfterDeliveredFinal =
2015-
isReplyPayloadNonTerminalToolErrorWarning(effectivePayload) &&
2016-
finalAnswerDelivered;
2025+
isReplyPayloadNonTerminalToolErrorWarning(payload) && finalAnswerDelivered;
20172026
if (
20182027
(isToolPayloadAfterFinal || isNonTerminalWarningAfterDeliveredFinal) &&
20192028
!reply.hasMedia &&
@@ -2126,7 +2135,7 @@ export const dispatchTelegramMessage = async ({
21262135
(entry) =>
21272136
queuedAnswerBlockRotationMatchesDelivery(
21282137
entry,
2129-
effectivePayload,
2138+
lanePayload,
21302139
info.assistantMessageIndex,
21312140
),
21322141
);
@@ -2158,7 +2167,7 @@ export const dispatchTelegramMessage = async ({
21582167
if (segment.lane === "answer" && info.kind === "block") {
21592168
const preparedAnswerLane = await prepareAnswerLaneForText();
21602169
const shouldRotateQueuedBlock = takeQueuedAnswerBlockRotation(
2161-
effectivePayload,
2170+
lanePayload,
21622171
info.assistantMessageIndex,
21632172
);
21642173
if (shouldRotateQueuedBlock && !preparedAnswerLane) {
@@ -2178,7 +2187,7 @@ export const dispatchTelegramMessage = async ({
21782187
: await deliverLaneText({
21792188
laneName: segment.lane,
21802189
text: segment.update.text,
2181-
payload: effectivePayload,
2190+
payload: lanePayload,
21822191
infoKind: info.kind,
21832192
buttons: telegramButtons,
21842193
});
@@ -2192,7 +2201,7 @@ export const dispatchTelegramMessage = async ({
21922201
result.kind === "preview-finalized" ||
21932202
result.kind === "preview-retained")
21942203
) {
2195-
lastAnswerBlockPayload = effectivePayload;
2204+
lastAnswerBlockPayload = lanePayload;
21962205
lastAnswerBlockText = segment.update.text;
21972206
lastAnswerBlockButtons = telegramButtons;
21982207
}

0 commit comments

Comments
 (0)