




















@@ -26,18 +26,27 @@ import {
2626import type { DiscordMessagePreflightContext } from "./message-handler.preflight.js";
2727import {
2828buildDiscordMediaPayload,
29+resolveReferencedReplyMediaList,
2930resolveDiscordMessageText,
3031type DiscordMediaInfo,
3132} from "./message-utils.js";
3233import { buildDirectLabel, buildGuildLabel, resolveReplyContext } from "./reply-context.js";
3334import { resolveDiscordAutoThreadReplyPlan, resolveDiscordThreadStarter } from "./threading.js";
35+import {
36+DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS,
37+DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS,
38+} from "./timeouts.js";
34393540function normalizeDiscordDmOwnerEntry(entry: string): string | undefined {
3641const normalized = normalizeDiscordAllowList([entry], ["discord:", "user:", "pk:"]);
3742const candidate = normalized?.ids.values().next().value;
3843return typeof candidate === "string" && /^\d+$/.test(candidate) ? candidate : undefined;
3944}
404546+function isContextAborted(abortSignal?: AbortSignal): boolean {
47+return Boolean(abortSignal?.aborted);
48+}
49+4150export async function buildDiscordMessageProcessContext(params: {
4251ctx: DiscordMessagePreflightContext;
4352text: string;
@@ -49,6 +58,9 @@ export async function buildDiscordMessageProcessContext(params: {
4958 discordConfig,
5059 accountId,
5160 runtime,
61+ mediaMaxBytes,
62+ discordRestFetch,
63+ abortSignal,
5264 guildHistories,
5365 historyLimit,
5466 replyToMode,
@@ -189,6 +201,19 @@ export async function buildDiscordMessageProcessContext(params: {
189201if (replyContext && !filteredReplyContext && isGuildMessage) {
190202logVerbose(`discord: drop reply context (mode=${contextVisibilityMode})`);
191203}
204+const mediaListForContext = [...mediaList];
205+if (filteredReplyContext) {
206+const referencedReplyMediaList = await resolveReferencedReplyMediaList(message, mediaMaxBytes, {
207+fetchImpl: discordRestFetch,
208+ssrfPolicy: cfg.browser?.ssrfPolicy,
209+readIdleTimeoutMs: DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS,
210+totalTimeoutMs: DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS,
211+ abortSignal,
212+});
213+if (!isContextAborted(abortSignal)) {
214+mediaListForContext.push(...referencedReplyMediaList);
215+}
216+}
192217if (forumContextLine) {
193218combinedBody = `${combinedBody}\n${forumContextLine}`;
194219}
@@ -241,11 +266,11 @@ export async function buildDiscordMessageProcessContext(params: {
241266parentSessionKey = undefined;
242267}
243268}
244-const mediaPayload = buildDiscordMediaPayload(mediaList);
269+const mediaPayload = buildDiscordMediaPayload(mediaListForContext);
245270const preflightAudioIndex =
246271preflightAudioTranscript === undefined
247272 ? -1
248- : mediaList.findIndex((media) => media.contentType?.startsWith("audio/"));
273+ : mediaListForContext.findIndex((media) => media.contentType?.startsWith("audio/"));
249274const threadKeys = resolveThreadSessionKeys({
250275 baseSessionKey,
251276threadId: threadChannel ? messageChannelId : undefined,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。