From 46d4fe2fa15c22ed39f4988a1f50bdf8732c7744 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 13 Mar 2026 22:46:08 +0000 Subject: [PATCH] refactor: share embedded run and discord test helpers --- .../reply/agent-runner-execution.ts | 28 ++++++++----------- src/auto-reply/reply/agent-runner-memory.ts | 10 ++----- src/auto-reply/reply/agent-runner-utils.ts | 25 +++++++++++++++++ .../message-handler.bot-self-filter.test.ts | 18 ++++-------- .../message-handler.module-test-helpers.ts | 14 ++++++++++ .../monitor/message-handler.queue.test.ts | 17 ++++------- 6 files changed, 63 insertions(+), 49 deletions(-) create mode 100644 src/discord/monitor/message-handler.module-test-helpers.ts diff --git a/src/auto-reply/reply/agent-runner-execution.ts b/src/auto-reply/reply/agent-runner-execution.ts index ff3838a1936..27a31c2387a 100644 --- a/src/auto-reply/reply/agent-runner-execution.ts +++ b/src/auto-reply/reply/agent-runner-execution.ts @@ -40,8 +40,7 @@ import { } from "../tokens.js"; import type { GetReplyOptions, ReplyPayload } from "../types.js"; import { - buildEmbeddedRunBaseParams, - buildEmbeddedRunContexts, + buildEmbeddedRunExecutionParams, resolveModelFallbackOptions, } from "./agent-runner-utils.js"; import { type BlockReplyPipeline } from "./block-reply-pipeline.js"; @@ -308,20 +307,17 @@ export async function runAgentTurnWithFallback(params: { } })(); } - const { authProfile, embeddedContext, senderContext } = buildEmbeddedRunContexts({ - run: params.followupRun.run, - sessionCtx: params.sessionCtx, - hasRepliedRef: params.opts?.hasRepliedRef, - provider, - }); - const runBaseParams = buildEmbeddedRunBaseParams({ - run: params.followupRun.run, - provider, - model, - runId, - authProfile, - allowTransientCooldownProbe: runOptions?.allowTransientCooldownProbe, - }); + const { embeddedContext, senderContext, runBaseParams } = buildEmbeddedRunExecutionParams( + { + run: params.followupRun.run, + sessionCtx: params.sessionCtx, + hasRepliedRef: params.opts?.hasRepliedRef, + provider, + runId, + allowTransientCooldownProbe: runOptions?.allowTransientCooldownProbe, + model, + }, + ); return (async () => { const result = await runEmbeddedPiAgent({ ...embeddedContext, diff --git a/src/auto-reply/reply/agent-runner-memory.ts b/src/auto-reply/reply/agent-runner-memory.ts index 623bb9c1490..d52c6d05761 100644 --- a/src/auto-reply/reply/agent-runner-memory.ts +++ b/src/auto-reply/reply/agent-runner-memory.ts @@ -27,8 +27,7 @@ import type { TemplateContext } from "../templating.js"; import type { VerboseLevel } from "../thinking.js"; import type { GetReplyOptions } from "../types.js"; import { - buildEmbeddedRunBaseParams, - buildEmbeddedRunContexts, + buildEmbeddedRunExecutionParams, resolveModelFallbackOptions, } from "./agent-runner-utils.js"; import { @@ -482,18 +481,13 @@ export async function runMemoryFlushIfNeeded(params: { ...resolveModelFallbackOptions(params.followupRun.run), runId: flushRunId, run: async (provider, model, runOptions) => { - const { authProfile, embeddedContext, senderContext } = buildEmbeddedRunContexts({ + const { embeddedContext, senderContext, runBaseParams } = buildEmbeddedRunExecutionParams({ run: params.followupRun.run, sessionCtx: params.sessionCtx, hasRepliedRef: params.opts?.hasRepliedRef, provider, - }); - const runBaseParams = buildEmbeddedRunBaseParams({ - run: params.followupRun.run, - provider, model, runId: flushRunId, - authProfile, allowTransientCooldownProbe: runOptions?.allowTransientCooldownProbe, }); const result = await runEmbeddedPiAgent({ diff --git a/src/auto-reply/reply/agent-runner-utils.ts b/src/auto-reply/reply/agent-runner-utils.ts index 99b2b6392f6..c6e71a9bab0 100644 --- a/src/auto-reply/reply/agent-runner-utils.ts +++ b/src/auto-reply/reply/agent-runner-utils.ts @@ -263,6 +263,31 @@ export function buildEmbeddedRunContexts(params: { }; } +export function buildEmbeddedRunExecutionParams(params: { + run: FollowupRun["run"]; + sessionCtx: TemplateContext; + hasRepliedRef: { value: boolean } | undefined; + provider: string; + model: string; + runId: string; + allowTransientCooldownProbe?: boolean; +}) { + const { authProfile, embeddedContext, senderContext } = buildEmbeddedRunContexts(params); + const runBaseParams = buildEmbeddedRunBaseParams({ + run: params.run, + provider: params.provider, + model: params.model, + runId: params.runId, + authProfile, + allowTransientCooldownProbe: params.allowTransientCooldownProbe, + }); + return { + embeddedContext, + senderContext, + runBaseParams, + }; +} + export function resolveProviderScopedAuthProfile(params: { provider: string; primaryProvider: string; diff --git a/src/discord/monitor/message-handler.bot-self-filter.test.ts b/src/discord/monitor/message-handler.bot-self-filter.test.ts index 4358301b92d..6538ec1915a 100644 --- a/src/discord/monitor/message-handler.bot-self-filter.test.ts +++ b/src/discord/monitor/message-handler.bot-self-filter.test.ts @@ -1,23 +1,15 @@ import { describe, expect, it, vi } from "vitest"; +import { + createDiscordMessageHandler, + preflightDiscordMessageMock, + processDiscordMessageMock, +} from "./message-handler.module-test-helpers.js"; import { DEFAULT_DISCORD_BOT_USER_ID, createDiscordHandlerParams, createDiscordPreflightContext, } from "./message-handler.test-helpers.js"; -const preflightDiscordMessageMock = vi.hoisted(() => vi.fn()); -const processDiscordMessageMock = vi.hoisted(() => vi.fn()); - -vi.mock("./message-handler.preflight.js", () => ({ - preflightDiscordMessage: preflightDiscordMessageMock, -})); - -vi.mock("./message-handler.process.js", () => ({ - processDiscordMessage: processDiscordMessageMock, -})); - -const { createDiscordMessageHandler } = await import("./message-handler.js"); - function createMessageData(authorId: string, channelId = "ch-1") { return { author: { id: authorId, bot: authorId === DEFAULT_DISCORD_BOT_USER_ID }, diff --git a/src/discord/monitor/message-handler.module-test-helpers.ts b/src/discord/monitor/message-handler.module-test-helpers.ts new file mode 100644 index 00000000000..046813e397f --- /dev/null +++ b/src/discord/monitor/message-handler.module-test-helpers.ts @@ -0,0 +1,14 @@ +import { vi } from "vitest"; + +export const preflightDiscordMessageMock = vi.fn(); +export const processDiscordMessageMock = vi.fn(); + +vi.mock("./message-handler.preflight.js", () => ({ + preflightDiscordMessage: preflightDiscordMessageMock, +})); + +vi.mock("./message-handler.process.js", () => ({ + processDiscordMessage: processDiscordMessageMock, +})); + +export const { createDiscordMessageHandler } = await import("./message-handler.js"); diff --git a/src/discord/monitor/message-handler.queue.test.ts b/src/discord/monitor/message-handler.queue.test.ts index 92cf0e31183..2051029a823 100644 --- a/src/discord/monitor/message-handler.queue.test.ts +++ b/src/discord/monitor/message-handler.queue.test.ts @@ -1,24 +1,17 @@ import { describe, expect, it, vi } from "vitest"; +import { + createDiscordMessageHandler, + preflightDiscordMessageMock, + processDiscordMessageMock, +} from "./message-handler.module-test-helpers.js"; import { createDiscordHandlerParams, createDiscordPreflightContext, } from "./message-handler.test-helpers.js"; -const preflightDiscordMessageMock = vi.hoisted(() => vi.fn()); -const processDiscordMessageMock = vi.hoisted(() => vi.fn()); const eventualReplyDeliveredMock = vi.hoisted(() => vi.fn()); type SetStatusFn = (patch: Record) => void; -vi.mock("./message-handler.preflight.js", () => ({ - preflightDiscordMessage: preflightDiscordMessageMock, -})); - -vi.mock("./message-handler.process.js", () => ({ - processDiscordMessage: processDiscordMessageMock, -})); - -const { createDiscordMessageHandler } = await import("./message-handler.js"); - function createDeferred() { let resolve: (value: T | PromiseLike) => void = () => {}; const promise = new Promise((innerResolve) => {