fix(telegram): use message previews in DMs

This commit is contained in:
Ayaan Zaidi
2026-03-08 21:06:25 +05:30
committed by Ayaan Zaidi
parent 95dff166cb
commit d4ab731746
5 changed files with 23 additions and 18 deletions

View File

@@ -1171,7 +1171,7 @@ describe("dispatchTelegramMessage draft streaming", () => {
},
);
it("uses message preview transport for DM reasoning lane when answer preview lane is active", async () => {
it("uses message preview transport for all DM lanes when streaming is active", async () => {
setupDraftStreams({ answerMessageId: 999, reasoningMessageId: 111 });
dispatchReplyWithBufferedBlockDispatcher.mockImplementation(
async ({ dispatcherOptions, replyOptions }) => {
@@ -1190,7 +1190,7 @@ describe("dispatchTelegramMessage draft streaming", () => {
expect(createTelegramDraftStream.mock.calls[0]?.[0]).toEqual(
expect.objectContaining({
thread: { id: 777, scope: "dm" },
previewTransport: "auto",
previewTransport: "message",
}),
);
expect(createTelegramDraftStream.mock.calls[1]?.[0]).toEqual(
@@ -1201,9 +1201,8 @@ describe("dispatchTelegramMessage draft streaming", () => {
);
});
it("materializes DM answer draft final without sending a duplicate final message", async () => {
const answerDraftStream = createTestDraftStream({ previewMode: "draft" });
answerDraftStream.materialize.mockResolvedValue(321);
it("finalizes DM answer preview in place without materializing or sending a duplicate", async () => {
const answerDraftStream = createDraftStream(321);
const reasoningDraftStream = createDraftStream(111);
createTelegramDraftStream
.mockImplementationOnce(() => answerDraftStream)
@@ -1222,12 +1221,17 @@ describe("dispatchTelegramMessage draft streaming", () => {
expect(createTelegramDraftStream.mock.calls[0]?.[0]).toEqual(
expect.objectContaining({
thread: { id: 777, scope: "dm" },
previewTransport: "auto",
previewTransport: "message",
}),
);
expect(answerDraftStream.materialize).toHaveBeenCalledTimes(1);
expect(answerDraftStream.materialize).not.toHaveBeenCalled();
expect(deliverReplies).not.toHaveBeenCalled();
expect(editMessageTelegram).not.toHaveBeenCalled();
expect(editMessageTelegram).toHaveBeenCalledWith(
123,
321,
"Checking the directory...",
expect.any(Object),
);
});
it("keeps reasoning and answer streaming in separate preview lanes", async () => {

View File

@@ -190,19 +190,21 @@ export const dispatchTelegramMessage = async ({
const draftReplyToMessageId =
replyToMode !== "off" && typeof msg.message_id === "number" ? msg.message_id : undefined;
const draftMinInitialChars = DRAFT_MIN_INITIAL_CHARS;
// Keep DM preview lanes on real message transport. Native draft previews still
// require a draft->message materialize hop, and that overlap keeps reintroducing
// a visible duplicate flash at finalize time.
const useMessagePreviewTransportForDm = threadSpec?.scope === "dm" && canStreamAnswerDraft;
const mediaLocalRoots = getAgentScopedMediaLocalRoots(cfg, route.agentId);
const archivedAnswerPreviews: ArchivedPreview[] = [];
const archivedReasoningPreviewIds: number[] = [];
const createDraftLane = (laneName: LaneName, enabled: boolean): DraftLaneState => {
const useMessagePreviewTransportForDmReasoning =
laneName === "reasoning" && threadSpec?.scope === "dm" && canStreamAnswerDraft;
const stream = enabled
? createTelegramDraftStream({
api: bot.api,
chatId,
maxChars: draftMaxChars,
thread: threadSpec,
previewTransport: useMessagePreviewTransportForDmReasoning ? "message" : "auto",
previewTransport: useMessagePreviewTransportForDm ? "message" : "auto",
replyToMessageId: draftReplyToMessageId,
minInitialChars: draftMinInitialChars,
renderText: renderDraftPreview,