From 043d0f0bfe178d6e677f6b21af19e84b9916b252 Mon Sep 17 00:00:00 2001 From: inman Date: Wed, 13 May 2026 22:01:55 +0800 Subject: [PATCH] fix: skip removed openclaw deps preflight --- electron/gateway/runtime-deps.ts | 31 ++++++++++++++++++------ tests/unit/openclaw-runtime-deps.test.ts | 23 ++++++++++++++++++ 2 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 tests/unit/openclaw-runtime-deps.test.ts diff --git a/electron/gateway/runtime-deps.ts b/electron/gateway/runtime-deps.ts index 1ece9aa..4b27896 100644 --- a/electron/gateway/runtime-deps.ts +++ b/electron/gateway/runtime-deps.ts @@ -254,13 +254,22 @@ async function runRuntimeDepsRepair( launchContext: GatewayLaunchContext, timeoutMs = DEFAULT_RUNTIME_DEPS_PREFLIGHT_TIMEOUT_MS, ): Promise { - const inspected = await runPluginsDepsCommand(launchContext, [ - 'plugins', - 'deps', - '--json', - '--package-root', - launchContext.openclawDir, - ], timeoutMs); + let inspected: { report: OpenClawRuntimeDepsReport; stdout: string; stderr: string }; + try { + inspected = await runPluginsDepsCommand(launchContext, [ + 'plugins', + 'deps', + '--json', + '--package-root', + launchContext.openclawDir, + ], timeoutMs); + } catch (error) { + if (isOpenClawRuntimeDepsCommandUnavailableMessage(error instanceof Error ? error.message : String(error))) { + logger.warn('[plugins] OpenClaw plugins deps preflight is unavailable in this OpenClaw version; skipping legacy runtime dependency preflight.'); + return; + } + throw error; + } const removedStaleRoot = maybeRemoveStaleInstallRoot(launchContext, inspected.report); const missingBefore = Array.isArray(inspected.report.missing) ? inspected.report.missing.length : 0; @@ -309,6 +318,14 @@ async function runRuntimeDepsRepair( logger.info(`[plugins] OpenClaw runtime dependency preflight complete (missing=${missingAfter}, repaired=${repairedCount}, reset=${removedStaleRoot ? 'yes' : 'no'}, local=${localMaterialized ? 'yes' : 'no'}, npm=${npmRepaired ? 'yes' : 'no'})`); } +export function isOpenClawRuntimeDepsCommandUnavailableMessage(message: string): boolean { + const normalized = message.toLowerCase(); + return normalized.includes("unknown option '--json'") + || normalized.includes("unknown command 'deps'") + || normalized.includes('unknown command "deps"') + || (normalized.includes('usage: openclaw plugins') && normalized.includes('unknown subcommand')); +} + function runPluginsDepsCommand( launchContext: GatewayLaunchContext, args: string[], diff --git a/tests/unit/openclaw-runtime-deps.test.ts b/tests/unit/openclaw-runtime-deps.test.ts new file mode 100644 index 0000000..0414db4 --- /dev/null +++ b/tests/unit/openclaw-runtime-deps.test.ts @@ -0,0 +1,23 @@ +import { describe, expect, it } from 'vitest'; +import { isOpenClawRuntimeDepsCommandUnavailableMessage } from '@electron/gateway/runtime-deps'; + +describe('OpenClaw runtime dependency preflight compatibility', () => { + it('treats the removed plugins deps --json CLI as unavailable', () => { + expect( + isOpenClawRuntimeDepsCommandUnavailableMessage([ + 'OpenClaw runtime dependency preflight failed (code=1, signal=none)', + "error: unknown option '--json'", + 'Usage: openclaw plugins [options] [command]', + ].join('\n')), + ).toBe(true); + }); + + it('does not hide unrelated OpenClaw preflight failures', () => { + expect( + isOpenClawRuntimeDepsCommandUnavailableMessage([ + 'OpenClaw runtime dependency preflight failed (code=1, signal=none)', + 'Error: Cannot find module sqlite-vec', + ].join('\n')), + ).toBe(false); + }); +});