fix(telegram): clamp partial draft overflow

This commit is contained in:
Ayaan Zaidi
2026-05-28 13:02:41 +00:00
parent a048cbc4f0
commit e856932600

View File

@@ -112,6 +112,7 @@ export function createTelegramDraftStream(params: {
let streamVisibleSinceMs: number | undefined;
let lastSentText = "";
let lastDeliveredText = "";
let lastRequestedText = "";
let lastSentParseMode: "HTML" | undefined;
let previewRevision = 0;
let generation = 0;
@@ -184,6 +185,13 @@ export function createTelegramDraftStream(params: {
streamVisibleSinceMs = visibleSinceMs;
return true;
};
const stopOversizedPreview = (renderedText: string): false => {
streamState.stopped = true;
params.warn?.(
`telegram stream preview stopped (text length ${renderedText.length} > ${maxChars})`,
);
return false;
};
const sendOrEditStreamMessage = async (text: string): Promise<boolean> => {
if (streamState.stopped && !streamState.final) {
@@ -204,6 +212,15 @@ export function createTelegramDraftStream(params: {
return false;
}
if (renderedText.length > maxChars) {
const chunkLength = findTelegramDraftChunkLength(currentText, maxChars, params.renderText);
if (!streamState.final) {
if (chunkLength > 0) {
return await sendOrEditStreamMessage(
trimmed.slice(0, deliveredTextOffset) + currentText.slice(0, chunkLength),
);
}
return stopOversizedPreview(renderedText);
}
if (lastDeliveredText.length > deliveredTextOffset) {
const supersededMessageId = streamMessageId;
const supersededTextSnapshot = lastSentText;
@@ -222,7 +239,6 @@ export function createTelegramDraftStream(params: {
}
return await sendOrEditStreamMessage(trimmed);
}
const chunkLength = findTelegramDraftChunkLength(currentText, maxChars, params.renderText);
if (chunkLength > 0) {
const sent = await sendOrEditStreamMessage(
trimmed.slice(0, deliveredTextOffset) + currentText.slice(0, chunkLength),
@@ -232,11 +248,7 @@ export function createTelegramDraftStream(params: {
}
return await sendOrEditStreamMessage(trimmed);
}
streamState.stopped = true;
params.warn?.(
`telegram stream preview stopped (text length ${renderedText.length} > ${maxChars})`,
);
return false;
return stopOversizedPreview(renderedText);
}
if (renderedText === lastSentText && renderedParseMode === lastSentParseMode) {
return true;
@@ -269,12 +281,34 @@ export function createTelegramDraftStream(params: {
}
};
const { loop, update, stop, stopForClear } = createFinalizableDraftStreamControlsForState({
const {
loop,
update: updateDraft,
stopForClear,
} = createFinalizableDraftStreamControlsForState({
throttleMs,
state: streamState,
sendOrEditStreamMessage,
});
const update = (text: string) => {
if (streamState.stopped || streamState.final) {
return;
}
lastRequestedText = text;
updateDraft(text);
};
const stop = async () => {
streamState.final = true;
await loop.flush();
const finalText = lastRequestedText.trimEnd();
if (finalText && finalText !== lastDeliveredText.trimEnd()) {
await sendOrEditStreamMessage(finalText);
}
streamState.final = true;
};
resetStreamToNewMessage = (options) => {
streamState.stopped = false;
streamState.final = false;
@@ -286,6 +320,7 @@ export function createTelegramDraftStream(params: {
lastSentParseMode = undefined;
if (options?.resetOffset !== false) {
deliveredTextOffset = 0;
lastRequestedText = "";
}
if (!options?.keepPending) {
loop.resetPending();