From 7008379ff085b4fa926f6419dfa8866d3b3ec2fe Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Mon, 30 Mar 2026 08:43:14 +0900 Subject: [PATCH] test(agents): restore cli runner test seams --- src/agents/cli-runner/execute.ts | 22 ++++++++++++++++------ src/agents/cli-runner/prepare.ts | 21 ++++++++++++++++++--- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/agents/cli-runner/execute.ts b/src/agents/cli-runner/execute.ts index fb92657157f..c5a5b830f60 100644 --- a/src/agents/cli-runner/execute.ts +++ b/src/agents/cli-runner/execute.ts @@ -1,9 +1,9 @@ import { shouldLogVerbose } from "../../globals.js"; import { isTruthyEnvValue } from "../../infra/env.js"; -import { requestHeartbeatNow } from "../../infra/heartbeat-wake.js"; +import { requestHeartbeatNow as requestHeartbeatNowImpl } from "../../infra/heartbeat-wake.js"; import { sanitizeHostExecEnv } from "../../infra/host-env-security.js"; -import { enqueueSystemEvent } from "../../infra/system-events.js"; -import { getProcessSupervisor } from "../../process/supervisor/index.js"; +import { enqueueSystemEvent as enqueueSystemEventImpl } from "../../infra/system-events.js"; +import { getProcessSupervisor as getProcessSupervisorImpl } from "../../process/supervisor/index.js"; import { scopedHeartbeatWakeOptions } from "../../routing/session-key.js"; import { prependBootstrapPromptWarning } from "../bootstrap-budget.js"; import { parseCliOutput, type CliOutput } from "../cli-output.js"; @@ -28,6 +28,16 @@ import { } from "./log.js"; import type { PreparedCliRunContext } from "./types.js"; +const executeDeps = { + getProcessSupervisor: getProcessSupervisorImpl, + enqueueSystemEvent: enqueueSystemEventImpl, + requestHeartbeatNow: requestHeartbeatNowImpl, +}; + +export function setCliRunnerExecuteTestDeps(overrides: Partial): void { + Object.assign(executeDeps, overrides); +} + function buildCliLogArgs(params: { args: string[]; systemPromptArg?: string; @@ -169,7 +179,7 @@ export async function executePreparedCliRun( timeoutMs: params.timeoutMs, useResume, }); - const supervisor = getProcessSupervisor(); + const supervisor = executeDeps.getProcessSupervisor(); const scopeKey = buildCliSupervisorScopeKey({ backend, backendId: context.backendResolved.id, @@ -222,8 +232,8 @@ export async function executePreparedCliRun( "It may have been waiting for interactive input or an approval prompt.", "For Claude Code, prefer --permission-mode bypassPermissions --print.", ].join(" "); - enqueueSystemEvent(stallNotice, { sessionKey: params.sessionKey }); - requestHeartbeatNow( + executeDeps.enqueueSystemEvent(stallNotice, { sessionKey: params.sessionKey }); + executeDeps.requestHeartbeatNow( scopedHeartbeatWakeOptions(params.sessionKey, { reason: "cli:watchdog:stall" }), ); } diff --git a/src/agents/cli-runner/prepare.ts b/src/agents/cli-runner/prepare.ts index f6194b57c95..875b36b5f49 100644 --- a/src/agents/cli-runner/prepare.ts +++ b/src/agents/cli-runner/prepare.ts @@ -6,7 +6,10 @@ import { buildBootstrapTruncationReportMeta, analyzeBootstrapBudget, } from "../bootstrap-budget.js"; -import { makeBootstrapWarn, resolveBootstrapContextForRun } from "../bootstrap-files.js"; +import { + makeBootstrapWarn as makeBootstrapWarnImpl, + resolveBootstrapContextForRun as resolveBootstrapContextForRunImpl, +} from "../bootstrap-files.js"; import { resolveCliBackendConfig } from "../cli-backends.js"; import { hashCliSessionText, resolveCliSessionReuse } from "../cli-session.js"; import { resolveOpenClawDocsPath } from "../docs-path.js"; @@ -22,6 +25,15 @@ import { buildSystemPrompt, normalizeCliModel } from "./helpers.js"; import { cliBackendLog } from "./log.js"; import type { PreparedCliRunContext, RunCliAgentParams } from "./types.js"; +const prepareDeps = { + makeBootstrapWarn: makeBootstrapWarnImpl, + resolveBootstrapContextForRun: resolveBootstrapContextForRunImpl, +}; + +export function setCliRunnerPrepareTestDeps(overrides: Partial): void { + Object.assign(prepareDeps, overrides); +} + export async function prepareCliRunContext( params: RunCliAgentParams, ): Promise { @@ -74,12 +86,15 @@ export async function prepareCliRunContext( const modelDisplay = `${params.provider}/${modelId}`; const sessionLabel = params.sessionKey ?? params.sessionId; - const { bootstrapFiles, contextFiles } = await resolveBootstrapContextForRun({ + const { bootstrapFiles, contextFiles } = await prepareDeps.resolveBootstrapContextForRun({ workspaceDir, config: params.config, sessionKey: params.sessionKey, sessionId: params.sessionId, - warn: makeBootstrapWarn({ sessionLabel, warn: (message) => cliBackendLog.warn(message) }), + warn: prepareDeps.makeBootstrapWarn({ + sessionLabel, + warn: (message) => cliBackendLog.warn(message), + }), }); const bootstrapMaxChars = resolveBootstrapMaxChars(params.config); const bootstrapTotalMaxChars = resolveBootstrapTotalMaxChars(params.config);