






















@@ -166,6 +166,7 @@ type TelegramTranscriptMirrorPayload = { text?: string; mediaUrls?: string[] };
166166type TelegramReplyFenceState = {
167167generation: number;
168168activeDispatches: number;
169+abortControllers?: Set<AbortController>;
169170};
170171171172type TelegramReplyFenceKey = {
@@ -200,14 +201,29 @@ function resolveTelegramReplyFenceKey(params: {
200201};
201202}
202203203-function beginTelegramReplyFence(params: { key: string; supersede: boolean }): number {
204+function abortTelegramReplyFenceControllers(state: TelegramReplyFenceState): void {
205+for (const controller of state.abortControllers ?? []) {
206+controller.abort();
207+}
208+state.abortControllers?.clear();
209+}
210+211+function beginTelegramReplyFence(params: {
212+key: string;
213+supersede: boolean;
214+abortController?: AbortController;
215+}): number {
204216const existing = telegramReplyFenceByKey.get(params.key);
205217const state: TelegramReplyFenceState = existing ?? {
206218generation: 0,
207219activeDispatches: 0,
208220};
209221if (params.supersede) {
210222state.generation += 1;
223+abortTelegramReplyFenceControllers(state);
224+}
225+if (params.abortController) {
226+(state.abortControllers ??= new Set()).add(params.abortController);
211227}
212228state.activeDispatches += 1;
213229telegramReplyFenceByKey.set(params.key, state);
@@ -220,18 +236,22 @@ function supersedeTelegramReplyFence(key: string): void {
220236return;
221237}
222238state.generation += 1;
239+abortTelegramReplyFenceControllers(state);
223240telegramReplyFenceByKey.set(key, state);
224241}
225242226243function isTelegramReplyFenceSuperseded(params: { key: string; generation: number }): boolean {
227244return (telegramReplyFenceByKey.get(params.key)?.generation ?? 0) !== params.generation;
228245}
229246230-function endTelegramReplyFence(key: string): void {
247+function endTelegramReplyFence(key: string, abortController?: AbortController): void {
231248const state = telegramReplyFenceByKey.get(key);
232249if (!state) {
233250return;
234251}
252+if (abortController) {
253+state.abortControllers?.delete(abortController);
254+}
235255state.activeDispatches -= 1;
236256if (state.activeDispatches <= 0) {
237257telegramReplyFenceByKey.delete(key);
@@ -473,6 +493,7 @@ export const dispatchTelegramMessage = async ({
473493 threadSpec,
474494});
475495let replyFenceGeneration: number | undefined;
496+const roomEventAbortController = isRoomEvent ? new AbortController() : undefined;
476497let dispatchWasSuperseded = false;
477498const isDispatchSuperseded = () =>
478499replyFenceGeneration !== undefined &&
@@ -484,7 +505,7 @@ export const dispatchTelegramMessage = async ({
484505if (replyFenceGeneration === undefined) {
485506return;
486507}
487-endTelegramReplyFence(replyFenceKey.activeKey);
508+endTelegramReplyFence(replyFenceKey.activeKey, roomEventAbortController);
488509replyFenceGeneration = undefined;
489510};
490511const draftMaxChars = Math.min(textLimit, 4096);
@@ -876,6 +897,7 @@ export const dispatchTelegramMessage = async ({
876897replyFenceGeneration = beginTelegramReplyFence({
877898key: replyFenceKey.activeKey,
878899supersede: supersedeReplyFence,
900+abortController: roomEventAbortController,
879901});
880902881903const implicitQuoteReplyTargetId =
@@ -1459,6 +1481,7 @@ export const dispatchTelegramMessage = async ({
14591481replyOptions: {
14601482 skillFilter,
14611483 disableBlockStreaming,
1484+abortSignal: roomEventAbortController?.signal,
14621485sourceReplyDeliveryMode: isRoomEvent ? "message_tool_only" : undefined,
14631486suppressTyping: isRoomEvent,
14641487onPartialReply:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。