





























@@ -38,6 +38,12 @@ function isMissingPreviewMessageError(err: unknown): boolean {
3838return MESSAGE_NOT_FOUND_RE.test(extractErrorText(err));
3939}
404041+function isIncompleteFinalPreviewPrefix(previewText: string, finalText: string): boolean {
42+const preview = previewText.trimEnd();
43+const final = finalText.trimEnd();
44+return preview.length > 0 && preview.length < final.length && final.startsWith(preview);
45+}
46+4147export type LaneName = "answer" | "reasoning";
42484349export type DraftLaneState = {
@@ -232,6 +238,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
232238lane: DraftLaneState;
233239finalTextAlreadyLanded: boolean;
234240retainAlternatePreviewOnMissingTarget: boolean;
241+targetPreviewText: string;
235242}): Promise<PreviewEditResult> => {
236243try {
237244await params.editPreview({
@@ -294,7 +301,14 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
294301);
295302return "fallback";
296303}
297-// Default: ambiguous error — prefer incomplete over duplicate
304+if (isIncompleteFinalPreviewPrefix(args.targetPreviewText, args.text)) {
305+params.log(
306+`telegram: ${args.laneName} preview final edit failed and existing preview is an incomplete prefix; falling back to standard send (${String(err)})`,
307+);
308+return "fallback";
309+}
310+// Default: ambiguous error — retain when fallback may duplicate a final
311+// edit that already landed or when the preview is not known-incomplete.
298312params.log(
299313`telegram: ${args.laneName} preview final edit failed with ambiguous error; keeping existing preview to avoid duplicate (${String(err)})`,
300314);
@@ -324,6 +338,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
324338messageId: number,
325339finalTextAlreadyLanded: boolean,
326340retainAlternatePreviewOnMissingTarget: boolean,
341+targetPreviewText: string,
327342) =>
328343tryEditPreviewMessage({
329344 laneName,
@@ -335,6 +350,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
335350 lane,
336351 finalTextAlreadyLanded,
337352 retainAlternatePreviewOnMissingTarget,
353+ targetPreviewText,
338354});
339355const finalizePreview = (
340356previewMessageId: number,
@@ -357,6 +373,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
357373previewMessageId,
358374finalTextAlreadyLanded,
359375retainAlternatePreviewOnMissingTarget,
376+currentPreviewText,
360377);
361378};
362379if (!lane.stream) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。