From 7bfa261c42ebdb60562a7b1a62d69037dcc24354 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 22 Mar 2026 19:12:25 -0700 Subject: [PATCH] perf(reply): lazy-load media path normalization --- src/auto-reply/reply/agent-runner-execution.ts | 11 ++++++++++- src/auto-reply/reply/agent-runner.ts | 10 +++++++++- src/auto-reply/reply/reply-media-paths.runtime.ts | 1 + 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 src/auto-reply/reply/reply-media-paths.runtime.ts diff --git a/src/auto-reply/reply/agent-runner-execution.ts b/src/auto-reply/reply/agent-runner-execution.ts index 7e6a4cfa6bc..8af99882709 100644 --- a/src/auto-reply/reply/agent-runner-execution.ts +++ b/src/auto-reply/reply/agent-runner-execution.ts @@ -47,9 +47,17 @@ import { import { type BlockReplyPipeline } from "./block-reply-pipeline.js"; import type { FollowupRun } from "./queue.js"; import { createBlockReplyDeliveryHandler } from "./reply-delivery.js"; -import { createReplyMediaPathNormalizer } from "./reply-media-paths.js"; import type { TypingSignaler } from "./typing-mode.js"; +let replyMediaPathsRuntimePromise: Promise< + typeof import("./reply-media-paths.runtime.js") +> | null = null; + +function loadReplyMediaPathsRuntime() { + replyMediaPathsRuntimePromise ??= import("./reply-media-paths.runtime.js"); + return replyMediaPathsRuntimePromise; +} + export type RuntimeFallbackAttempt = { provider: string; model: string; @@ -109,6 +117,7 @@ export async function runAgentTurnWithFallback(params: { const directlySentBlockKeys = new Set(); const runId = params.opts?.runId ?? crypto.randomUUID(); + const { createReplyMediaPathNormalizer } = await loadReplyMediaPathsRuntime(); const normalizeReplyMediaPaths = createReplyMediaPathNormalizer({ cfg: params.followupRun.run.config, sessionKey: params.sessionKey, diff --git a/src/auto-reply/reply/agent-runner.ts b/src/auto-reply/reply/agent-runner.ts index 6ce2b0321fb..2a634016c9e 100644 --- a/src/auto-reply/reply/agent-runner.ts +++ b/src/auto-reply/reply/agent-runner.ts @@ -48,7 +48,6 @@ import { readPostCompactionContext } from "./post-compaction-context.js"; import { resolveActiveRunQueueAction } from "./queue-policy.js"; import { enqueueFollowupRun } from "./queue/enqueue.js"; import type { FollowupRun, QueueSettings } from "./queue/types.js"; -import { createReplyMediaPathNormalizer } from "./reply-media-paths.js"; import { createReplyToModeFilterForChannel, resolveReplyToMode } from "./reply-threading.js"; import { incrementRunCompactionCount, persistRunSessionUsage } from "./session-run-accounting.js"; import { createTypingSignaler } from "./typing-mode.js"; @@ -68,6 +67,9 @@ let usageCostRuntimePromise: Promise | let contextTokensRuntimePromise: Promise< typeof import("../../agents/context-tokens.runtime.js") > | null = null; +let replyMediaPathsRuntimePromise: Promise< + typeof import("./reply-media-paths.runtime.js") +> | null = null; function loadPiEmbeddedQueueRuntime() { piEmbeddedQueueRuntimePromise ??= import("../../agents/pi-embedded-queue.runtime.js"); @@ -94,6 +96,11 @@ function loadContextTokensRuntime() { return contextTokensRuntimePromise; } +function loadReplyMediaPathsRuntime() { + replyMediaPathsRuntimePromise ??= import("./reply-media-paths.runtime.js"); + return replyMediaPathsRuntimePromise; +} + export async function runReplyAgent(params: { commandBody: string; followupRun: FollowupRun; @@ -189,6 +196,7 @@ export async function runReplyAgent(params: { ); const applyReplyToMode = createReplyToModeFilterForChannel(replyToMode, replyToChannel); const cfg = followupRun.run.config; + const { createReplyMediaPathNormalizer } = await loadReplyMediaPathsRuntime(); const normalizeReplyMediaPaths = createReplyMediaPathNormalizer({ cfg, sessionKey, diff --git a/src/auto-reply/reply/reply-media-paths.runtime.ts b/src/auto-reply/reply/reply-media-paths.runtime.ts new file mode 100644 index 00000000000..904ada489cb --- /dev/null +++ b/src/auto-reply/reply/reply-media-paths.runtime.ts @@ -0,0 +1 @@ +export { createReplyMediaPathNormalizer } from "./reply-media-paths.js";