
























@@ -51,6 +51,7 @@ import {
5151createSlackReplyDeliveryPlan,
5252deliverReplies,
5353readSlackReplyBlocks,
54+resolveDeliveredSlackReplyThreadTs,
5455resolveSlackThreadTs,
5556} from "../replies.js";
5657import { createReplyDispatcherWithTyping, dispatchInboundMessage } from "../reply.runtime.js";
@@ -448,8 +449,32 @@ export async function dispatchPreparedSlackMessage(prepared: PreparedSlackMessag
448449let streamSession: SlackStreamSession | null = null;
449450let streamFailed = false;
450451let usedReplyThreadTs: string | undefined;
452+let usedBlockReplyThreadTs: string | undefined;
451453let observedReplyDelivery = false;
452454const deliveryTracker = createSlackTurnDeliveryTracker();
455+const resolveDeliveryThreadTs = (params: {
456+kind: ReplyDispatchKind;
457+forcedThreadTs?: string;
458+}): string | undefined => {
459+const plannedThreadTs = params.forcedThreadTs ? undefined : replyPlan.nextThreadTs();
460+return (
461+params.forcedThreadTs ??
462+plannedThreadTs ??
463+(params.kind === "block" ? usedBlockReplyThreadTs : undefined)
464+);
465+};
466+const rememberDeliveredThreadTs = (
467+kind: ReplyDispatchKind,
468+deliveredThreadTs: string | undefined,
469+) => {
470+if (!deliveredThreadTs) {
471+return;
472+}
473+usedReplyThreadTs ??= deliveredThreadTs;
474+if (kind === "block") {
475+usedBlockReplyThreadTs = deliveredThreadTs;
476+}
477+};
453478const deliverPendingStreamFallback = async (
454479session: SlackStreamSession,
455480err: SlackStreamNotDeliveredError,
@@ -499,7 +524,7 @@ export async function dispatchPreparedSlackMessage(prepared: PreparedSlackMessag
499524kind: ReplyDispatchKind;
500525forcedThreadTs?: string;
501526}): Promise<void> => {
502-const replyThreadTs = params.forcedThreadTs ?? replyPlan.nextThreadTs();
527+const replyThreadTs = resolveDeliveryThreadTs(params);
503528if (
504529deliveryTracker.hasDelivered({
505530kind: params.kind,
@@ -523,10 +548,13 @@ export async function dispatchPreparedSlackMessage(prepared: PreparedSlackMessag
523548 ...(slackIdentity ? { identity: slackIdentity } : {}),
524549});
525550observedReplyDelivery = true;
551+const deliveredThreadTs = resolveDeliveredSlackReplyThreadTs({
552+replyToMode: prepared.replyToMode,
553+payloadReplyToId: params.payload.replyToId,
554+ replyThreadTs,
555+});
526556// Record the thread ts only after confirmed delivery success.
527-if (replyThreadTs) {
528-usedReplyThreadTs ??= replyThreadTs;
529-}
557+rememberDeliveredThreadTs(params.kind, deliveredThreadTs);
530558replyPlan.markSent();
531559deliveryTracker.markDelivered({
532560kind: params.kind,
@@ -553,6 +581,7 @@ export async function dispatchPreparedSlackMessage(prepared: PreparedSlackMessag
553581threadTs: params.session.threadTs,
554582textOverride: params.textOverride,
555583});
584+rememberDeliveredThreadTs(params.kind, params.session.threadTs);
556585return true;
557586};
558587@@ -586,7 +615,10 @@ export async function dispatchPreparedSlackMessage(prepared: PreparedSlackMessag
586615"slack-stream: no reply thread target for stream start, falling back to normal delivery",
587616);
588617streamFailed = true;
589-await deliverNormally({ payload: params.payload, kind: params.kind });
618+await deliverNormally({
619+payload: params.payload,
620+kind: params.kind,
621+});
590622return;
591623}
592624if (
@@ -619,7 +651,7 @@ export async function dispatchPreparedSlackMessage(prepared: PreparedSlackMessag
619651if (streamSession.delivered) {
620652observedReplyDelivery = true;
621653}
622-usedReplyThreadTs ??= streamThreadTs;
654+rememberDeliveredThreadTs(params.kind, streamThreadTs);
623655replyPlan.markSent();
624656deliveryTracker.markDelivered({
625657kind: params.kind,
@@ -792,7 +824,10 @@ export async function dispatchPreparedSlackMessage(prepared: PreparedSlackMessag
792824});
793825},
794826deliverNormally: async () => {
795-await deliverNormally({ payload, kind: info.kind });
827+await deliverNormally({
828+ payload,
829+kind: info.kind,
830+});
796831},
797832onPreviewFinalized: (_preview) => {
798833const finalThreadTs = usedReplyThreadTs ?? statusThreadTs;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。