perf(test): gate monitor runtime logs during vitest

This commit is contained in:
Peter Steinberger
2026-02-14 01:14:51 +00:00
parent 643288fda8
commit 54a242eaad
5 changed files with 41 additions and 36 deletions

View File

@@ -4,7 +4,6 @@ import { Routes } from "discord-api-types/v10";
import { inspect } from "node:util";
import type { HistoryEntry } from "../../auto-reply/reply/history.js";
import type { OpenClawConfig, ReplyToMode } from "../../config/config.js";
import type { RuntimeEnv } from "../../runtime.js";
import { resolveTextChunkLimit } from "../../auto-reply/chunk.js";
import { listNativeCommandSpecsForConfig } from "../../auto-reply/commands-registry.js";
import { listSkillCommandsForAgents } from "../../auto-reply/skill-commands.js";
@@ -19,6 +18,7 @@ import { danger, logVerbose, shouldLogVerbose, warn } from "../../globals.js";
import { formatErrorMessage } from "../../infra/errors.js";
import { createDiscordRetryRunner } from "../../infra/retry-policy.js";
import { createSubsystemLogger } from "../../logging/subsystem.js";
import { createNonExitingRuntime, type RuntimeEnv } from "../../runtime.js";
import { resolveDiscordAccount } from "../accounts.js";
import { attachDiscordGatewayLogging } from "../gateway-logging.js";
import { getDiscordGatewayEmitter, waitForDiscordGatewayStop } from "../monitor.gateway.js";
@@ -137,13 +137,7 @@ export async function monitorDiscordProvider(opts: MonitorDiscordOpts = {}) {
);
}
const runtime: RuntimeEnv = opts.runtime ?? {
log: console.log,
error: console.error,
exit: (code: number): never => {
throw new Error(`exit ${code}`);
},
};
const runtime: RuntimeEnv = opts.runtime ?? createNonExitingRuntime();
const discordCfg = account.config;
const dmConfig = discordCfg.dm;

View File

@@ -1,16 +1,8 @@
import type { RuntimeEnv } from "../../runtime.js";
import type { MonitorIMessageOpts } from "./types.js";
import { createNonExitingRuntime, type RuntimeEnv } from "../../runtime.js";
export function resolveRuntime(opts: MonitorIMessageOpts): RuntimeEnv {
return (
opts.runtime ?? {
log: console.log,
error: console.error,
exit: (code: number): never => {
throw new Error(`exit ${code}`);
},
}
);
return opts.runtime ?? createNonExitingRuntime();
}
export function normalizeAllowList(list?: Array<string | number>) {

View File

@@ -7,8 +7,22 @@ export type RuntimeEnv = {
exit: (code: number) => never;
};
function shouldEmitRuntimeLog(env: NodeJS.ProcessEnv = process.env): boolean {
if (env.VITEST !== "true") {
return true;
}
if (env.OPENCLAW_TEST_RUNTIME_LOG === "1") {
return true;
}
const maybeMockedLog = console.log as unknown as { mock?: unknown };
return typeof maybeMockedLog.mock === "object";
}
export const defaultRuntime: RuntimeEnv = {
log: (...args: Parameters<typeof console.log>) => {
if (!shouldEmitRuntimeLog()) {
return;
}
clearActiveProgressLine();
console.log(...args);
},
@@ -22,3 +36,22 @@ export const defaultRuntime: RuntimeEnv = {
throw new Error("unreachable"); // satisfies tests when mocked
},
};
export function createNonExitingRuntime(): RuntimeEnv {
return {
log: (...args: Parameters<typeof console.log>) => {
if (!shouldEmitRuntimeLog()) {
return;
}
clearActiveProgressLine();
console.log(...args);
},
error: (...args: Parameters<typeof console.error>) => {
clearActiveProgressLine();
console.error(...args);
},
exit: (code: number): never => {
throw new Error(`exit ${code}`);
},
};
}

View File

@@ -1,12 +1,12 @@
import type { ReplyPayload } from "../auto-reply/types.js";
import type { OpenClawConfig } from "../config/config.js";
import type { SignalReactionNotificationMode } from "../config/types.js";
import type { RuntimeEnv } from "../runtime.js";
import { chunkTextWithMode, resolveChunkMode, resolveTextChunkLimit } from "../auto-reply/chunk.js";
import { DEFAULT_GROUP_HISTORY_LIMIT, type HistoryEntry } from "../auto-reply/reply/history.js";
import { loadConfig } from "../config/config.js";
import { waitForTransportReady } from "../infra/transport-ready.js";
import { saveMediaBuffer } from "../media/store.js";
import { createNonExitingRuntime, type RuntimeEnv } from "../runtime.js";
import { normalizeE164 } from "../utils.js";
import { resolveSignalAccount } from "./accounts.js";
import { signalCheck, signalRpcRequest } from "./client.js";
@@ -57,15 +57,7 @@ export type MonitorSignalOpts = {
};
function resolveRuntime(opts: MonitorSignalOpts): RuntimeEnv {
return (
opts.runtime ?? {
log: console.log,
error: console.error,
exit: (code: number): never => {
throw new Error(`exit ${code}`);
},
}
);
return opts.runtime ?? createNonExitingRuntime();
}
function normalizeAllowList(raw?: Array<string | number>): string[] {

View File

@@ -1,7 +1,6 @@
import type { IncomingMessage, ServerResponse } from "node:http";
import SlackBolt from "@slack/bolt";
import type { SessionScope } from "../../config/sessions.js";
import type { RuntimeEnv } from "../../runtime.js";
import type { MonitorSlackOpts } from "./types.js";
import { resolveTextChunkLimit } from "../../auto-reply/chunk.js";
import { DEFAULT_GROUP_HISTORY_LIMIT } from "../../auto-reply/reply/history.js";
@@ -10,6 +9,7 @@ import { loadConfig } from "../../config/config.js";
import { warn } from "../../globals.js";
import { installRequestBodyLimitGuard } from "../../infra/http-body.js";
import { normalizeMainKey } from "../../routing/session-key.js";
import { createNonExitingRuntime, type RuntimeEnv } from "../../runtime.js";
import { resolveSlackAccount } from "../accounts.js";
import { resolveSlackWebClientOptions } from "../client.js";
import { normalizeSlackWebhookPath, registerSlackHttpHandler } from "../http/index.js";
@@ -81,13 +81,7 @@ export async function monitorSlackProvider(opts: MonitorSlackOpts = {}) {
);
}
const runtime: RuntimeEnv = opts.runtime ?? {
log: console.log,
error: console.error,
exit: (code: number): never => {
throw new Error(`exit ${code}`);
},
};
const runtime: RuntimeEnv = opts.runtime ?? createNonExitingRuntime();
const slackCfg = account.config;
const dmConfig = slackCfg.dm;