From 0abb2a571f52c767965ee1c4a958f2b11649e3e2 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sat, 25 Apr 2026 04:46:04 -0700 Subject: [PATCH] fix(plugins): derive bundled relocation from registry --- src/cli/plugins-location-bridges.ts | 35 +++++++++++++++++++++ src/cli/update-cli/update-command.ts | 4 +++ src/plugins/externalized-bundled-plugins.ts | 23 -------------- src/plugins/update.ts | 4 +-- 4 files changed, 40 insertions(+), 26 deletions(-) create mode 100644 src/cli/plugins-location-bridges.ts diff --git a/src/cli/plugins-location-bridges.ts b/src/cli/plugins-location-bridges.ts new file mode 100644 index 00000000000..5a173bb3cd9 --- /dev/null +++ b/src/cli/plugins-location-bridges.ts @@ -0,0 +1,35 @@ +import type { ExternalizedBundledPluginBridge } from "../plugins/externalized-bundled-plugins.js"; +import { readPersistedInstalledPluginIndex } from "../plugins/installed-plugin-index-store.js"; +import type { InstalledPluginIndexRecord } from "../plugins/installed-plugin-index.js"; + +function buildBridgeFromPersistedBundledRecord( + record: InstalledPluginIndexRecord, +): ExternalizedBundledPluginBridge | null { + if (record.origin !== "bundled" || record.enabled === false) { + return null; + } + const npmSpec = record.packageInstall?.npm?.spec; + if (!npmSpec) { + return null; + } + return { + bundledPluginId: record.pluginId, + pluginId: record.pluginId, + npmSpec, + channelIds: record.contributions.channels, + }; +} + +export async function listPersistedBundledPluginLocationBridges(options: { + workspaceDir?: string; + env?: NodeJS.ProcessEnv; +}): Promise { + const index = await readPersistedInstalledPluginIndex(options); + if (!index) { + return []; + } + return index.plugins.flatMap((record) => { + const bridge = buildBridgeFromPersistedBundledRecord(record); + return bridge ? [bridge] : []; + }); +} diff --git a/src/cli/update-cli/update-command.ts b/src/cli/update-cli/update-command.ts index bfd3e2be1a9..903ce6c349a 100644 --- a/src/cli/update-cli/update-command.ts +++ b/src/cli/update-cli/update-command.ts @@ -57,6 +57,7 @@ import { terminateStaleGatewayPids, waitForGatewayHealthyRestart, } from "../daemon-cli/restart-health.js"; +import { listPersistedBundledPluginLocationBridges } from "../plugins-location-bridges.js"; import { refreshPluginRegistryAfterConfigMutation } from "../plugins-registry-refresh.js"; import { createUpdateProgress, printResult } from "./progress.js"; import { prepareRestartScript, runRestartScript } from "./restart-helper.js"; @@ -580,6 +581,9 @@ async function updatePluginsAfterCoreUpdate(params: { config: params.configSnapshot.sourceConfig, channel: params.channel, workspaceDir: params.root, + externalizedBundledPluginBridges: await listPersistedBundledPluginLocationBridges({ + workspaceDir: params.root, + }), logger: pluginLogger, }); let pluginConfig = syncResult.config; diff --git a/src/plugins/externalized-bundled-plugins.ts b/src/plugins/externalized-bundled-plugins.ts index 6b8d971904f..a52fc6f3fb6 100644 --- a/src/plugins/externalized-bundled-plugins.ts +++ b/src/plugins/externalized-bundled-plugins.ts @@ -15,25 +15,6 @@ export type ExternalizedBundledPluginBridge = { preferOver?: readonly string[]; }; -const EXTERNALIZED_BUNDLED_PLUGIN_BRIDGES: readonly ExternalizedBundledPluginBridge[] = [ - { - bundledPluginId: "tlon", - npmSpec: "@openclaw/tlon", - channelIds: ["tlon"], - }, - { - bundledPluginId: "twitch", - npmSpec: "@openclaw/twitch", - channelIds: ["twitch", "twitch-chat"], - legacyPluginIds: ["twitch-chat"], - }, - { - bundledPluginId: "synology-chat", - npmSpec: "@openclaw/synology-chat", - channelIds: ["synology-chat"], - }, -]; - function normalizePluginId(value: string | undefined): string { return value?.trim() ?? ""; } @@ -60,7 +41,3 @@ export function getExternalizedBundledPluginLookupIds( ), ); } - -export function listExternalizedBundledPluginBridges(): readonly ExternalizedBundledPluginBridge[] { - return EXTERNALIZED_BUNDLED_PLUGIN_BRIDGES; -} diff --git a/src/plugins/update.ts b/src/plugins/update.ts index 8dbd5a5fe9d..d8eefbd9af5 100644 --- a/src/plugins/update.ts +++ b/src/plugins/update.ts @@ -14,7 +14,6 @@ import { normalizePluginsConfig, resolveEffectiveEnableState } from "./config-st import { getExternalizedBundledPluginLookupIds, getExternalizedBundledPluginTargetId, - listExternalizedBundledPluginBridges, type ExternalizedBundledPluginBridge, } from "./externalized-bundled-plugins.js"; import { @@ -863,8 +862,7 @@ export async function syncPluginsForUpdateChannel(params: { changed = true; } } else { - const bridges = - params.externalizedBundledPluginBridges ?? listExternalizedBundledPluginBridges(); + const bridges = params.externalizedBundledPluginBridges ?? []; for (const bridge of bridges) { const targetPluginId = getExternalizedBundledPluginTargetId(bridge); const bundledInfo = bundled.get(bridge.bundledPluginId);