From 09b31f91239f0ce71430c45397c36d9f763b8f12 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 7 Apr 2026 01:34:32 +0100 Subject: [PATCH] refactor: dedupe plugin task error formatting --- src/plugins/clawhub.ts | 5 +++-- src/plugins/hooks.ts | 3 ++- src/plugins/uninstall.ts | 3 ++- src/tasks/task-flow-registry.ts | 3 ++- src/tasks/task-registry.ts | 3 ++- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/plugins/clawhub.ts b/src/plugins/clawhub.ts index d03e69d5341..4d5498cf8b9 100644 --- a/src/plugins/clawhub.ts +++ b/src/plugins/clawhub.ts @@ -12,6 +12,7 @@ import { type ClawHubPackageDetail, type ClawHubPackageFamily, } from "../infra/clawhub.js"; +import { formatErrorMessage } from "../infra/errors.js"; import { resolveCompatibilityHostVersion } from "../version.js"; import type { InstallSafetyOverrides } from "./install-security-scan.js"; import { installPluginFromArchive, type InstallPluginResult } from "./install.js"; @@ -81,7 +82,7 @@ function mapClawHubRequestError( CLAWHUB_INSTALL_ERROR_CODE.VERSION_NOT_FOUND, ); } - return buildClawHubInstallFailure(error instanceof Error ? error.message : String(error)); + return buildClawHubInstallFailure(formatErrorMessage(error)); } function resolveRequestedVersion(params: { @@ -300,7 +301,7 @@ export async function installPluginFromClawHub( token: params.token, }); } catch (error) { - return buildClawHubInstallFailure(error instanceof Error ? error.message : String(error)); + return buildClawHubInstallFailure(formatErrorMessage(error)); } try { params.logger?.info?.( diff --git a/src/plugins/hooks.ts b/src/plugins/hooks.ts index 97cbecec605..7b3ad7bd84b 100644 --- a/src/plugins/hooks.ts +++ b/src/plugins/hooks.ts @@ -5,6 +5,7 @@ * error handling, priority ordering, and async support. */ +import { formatErrorMessage } from "../infra/errors.js"; import { concatOptionalTextSegments } from "../shared/text/join-segments.js"; import type { PluginRegistry } from "./registry.js"; import type { @@ -286,7 +287,7 @@ export function createHookRunner(registry: PluginRegistry, options: HookRunnerOp }; const sanitizeHookError = (error: unknown): string => { - const raw = error instanceof Error ? error.message : String(error); + const raw = formatErrorMessage(error); const firstLine = raw.split("\n")[0]?.trim(); return firstLine || "unknown error"; }; diff --git a/src/plugins/uninstall.ts b/src/plugins/uninstall.ts index 59aadfb5956..11f494d99fa 100644 --- a/src/plugins/uninstall.ts +++ b/src/plugins/uninstall.ts @@ -2,6 +2,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import type { OpenClawConfig } from "../config/config.js"; import type { PluginInstallRecord } from "../config/types.plugins.js"; +import { formatErrorMessage } from "../infra/errors.js"; import { resolvePluginInstallDir } from "./install.js"; import { defaultSlotIdForKey } from "./slots.js"; @@ -271,7 +272,7 @@ export async function uninstallPlugin( actions.directory = existed; } catch (error) { warnings.push( - `Failed to remove plugin directory ${deleteTarget}: ${error instanceof Error ? error.message : String(error)}`, + `Failed to remove plugin directory ${deleteTarget}: ${formatErrorMessage(error)}`, ); // Directory deletion failure is not fatal; config is the source of truth. } diff --git a/src/tasks/task-flow-registry.ts b/src/tasks/task-flow-registry.ts index cd5275395a5..aeb74e75f10 100644 --- a/src/tasks/task-flow-registry.ts +++ b/src/tasks/task-flow-registry.ts @@ -1,4 +1,5 @@ import crypto from "node:crypto"; +import { formatErrorMessage } from "../infra/errors.js"; import { createSubsystemLogger } from "../logging/subsystem.js"; import { getTaskFlowRegistryObservers, @@ -212,7 +213,7 @@ function ensureFlowRegistryReady() { restoreFailureMessage = null; } catch (error) { flows.clear(); - restoreFailureMessage = error instanceof Error ? error.message : String(error); + restoreFailureMessage = formatErrorMessage(error); log.warn("Failed to restore task-flow registry", { error }); return; } diff --git a/src/tasks/task-registry.ts b/src/tasks/task-registry.ts index 3f96ef6ad64..1eb393633ed 100644 --- a/src/tasks/task-registry.ts +++ b/src/tasks/task-registry.ts @@ -1,6 +1,7 @@ import crypto from "node:crypto"; import type { OpenClawConfig } from "../config/config.js"; import { onAgentEvent } from "../infra/agent-events.js"; +import { formatErrorMessage } from "../infra/errors.js"; import { requestHeartbeatNow } from "../infra/heartbeat-wake.js"; import { enqueueSystemEvent } from "../infra/system-events.js"; import { createSubsystemLogger } from "../logging/subsystem.js"; @@ -1783,7 +1784,7 @@ export async function cancelTaskById(params: { return { found: true, cancelled: false, - reason: error instanceof Error ? error.message : String(error), + reason: formatErrorMessage(error), task: cloneTaskRecord(task), }; }