
























@@ -1784,17 +1784,56 @@ async function maybeResolveActiveRecall(params: {
17841784}
1785178517861786const controller = new AbortController();
1787+const TIMEOUT_SENTINEL = Symbol("timeout");
17871788const timeoutId = setTimeout(() => {
17881789controller.abort(new Error(`active-memory timeout after ${params.config.timeoutMs}ms`));
17891790}, params.config.timeoutMs);
17901791timeoutId.unref?.();
179117921793+const timeoutPromise = new Promise<typeof TIMEOUT_SENTINEL>((resolve) => {
1794+controller.signal.addEventListener(
1795+"abort",
1796+() => {
1797+resolve(TIMEOUT_SENTINEL);
1798+},
1799+{ once: true },
1800+);
1801+});
1802+17921803try {
1793-const { rawReply, transcriptPath, searchDebug } = await runRecallSubagent({
1804+const subagentPromise = runRecallSubagent({
17941805 ...params,
17951806modelRef: resolvedModelRef,
17961807abortSignal: controller.signal,
17971808});
1809+// Silently catch late rejections after timeout so they don't become
1810+// unhandled promise rejections.
1811+subagentPromise.catch(() => undefined);
1812+1813+const raceResult = await Promise.race([subagentPromise, timeoutPromise]);
1814+1815+if (raceResult === TIMEOUT_SENTINEL) {
1816+const result: ActiveRecallResult = {
1817+status: "timeout",
1818+elapsedMs: Date.now() - startedAt,
1819+summary: null,
1820+};
1821+if (params.config.logging) {
1822+params.api.logger.info?.(
1823+`${logPrefix} done status=${result.status} elapsedMs=${String(result.elapsedMs)} summaryChars=0`,
1824+);
1825+}
1826+await persistPluginStatusLines({
1827+api: params.api,
1828+agentId: params.agentId,
1829+sessionKey: params.sessionKey,
1830+statusLine: buildPluginStatusLine({ result, config: params.config }),
1831+searchDebug: result.searchDebug,
1832+});
1833+return result;
1834+}
1835+1836+const { rawReply, transcriptPath, searchDebug } = raceResult;
17981837const summary = truncateSummary(
17991838normalizeActiveSummary(rawReply) ?? "",
18001839params.config.maxSummaryChars,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。