From 8b6829e1bc53dc45c8f790aacd8afb8d61eb5d71 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Fri, 29 May 2026 23:43:16 +0200 Subject: [PATCH] perf(cli): cache plugin runtime imports --- src/cli/plugins-cli.runtime.ts | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/cli/plugins-cli.runtime.ts b/src/cli/plugins-cli.runtime.ts index db9c1680749..e00a9557814 100644 --- a/src/cli/plugins-cli.runtime.ts +++ b/src/cli/plugins-cli.runtime.ts @@ -25,6 +25,18 @@ type PluginInstallActionOptions = { marketplace?: string; }; +function createModuleLoader(load: () => Promise): () => Promise { + let promise: Promise | undefined; + return () => (promise ??= load()); +} + +const loadPluginsConfigState = createModuleLoader(() => import("../plugins/config-state.js")); +const loadPluginsStatus = createModuleLoader(() => import("../plugins/status.js")); +const loadPluginsCommandHelpers = createModuleLoader(() => import("./plugins-command-helpers.js")); +const loadPluginsRegistryRefresh = createModuleLoader( + () => import("./plugins-registry-refresh.js"), +); + function countEnabledPlugins(plugins: readonly { enabled: boolean }[]): number { return plugins.filter((plugin) => plugin.enabled).length; } @@ -168,12 +180,10 @@ export async function runPluginsEnableCommand(id: string): Promise { assertConfigWriteAllowedInCurrentMode(); const { enablePluginInConfig } = await import("../plugins/enable.js"); - const { normalizePluginId } = await import("../plugins/config-state.js"); - const { buildPluginRegistrySnapshotReport } = await import("../plugins/status.js"); - const { applySlotSelectionForPlugin, logSlotWarnings } = - await import("./plugins-command-helpers.js"); - const { refreshPluginRegistryAfterConfigMutation } = - await import("./plugins-registry-refresh.js"); + const { normalizePluginId } = await loadPluginsConfigState(); + const { buildPluginRegistrySnapshotReport } = await loadPluginsStatus(); + const { applySlotSelectionForPlugin, logSlotWarnings } = await loadPluginsCommandHelpers(); + const { refreshPluginRegistryAfterConfigMutation } = await loadPluginsRegistryRefresh(); const snapshot = await readConfigFileSnapshot(); const cfg = (snapshot.sourceConfig ?? snapshot.config) as OpenClawConfig; const report = buildPluginRegistrySnapshotReport({ config: cfg }); @@ -212,11 +222,10 @@ export async function runPluginsEnableCommand(id: string): Promise { export async function runPluginsDisableCommand(id: string): Promise { assertConfigWriteAllowedInCurrentMode(); - const { normalizePluginId } = await import("../plugins/config-state.js"); - const { buildPluginRegistrySnapshotReport } = await import("../plugins/status.js"); + const { normalizePluginId } = await loadPluginsConfigState(); + const { buildPluginRegistrySnapshotReport } = await loadPluginsStatus(); const { setPluginEnabledInConfig } = await import("./plugins-config.js"); - const { refreshPluginRegistryAfterConfigMutation } = - await import("./plugins-registry-refresh.js"); + const { refreshPluginRegistryAfterConfigMutation } = await loadPluginsRegistryRefresh(); const snapshot = await readConfigFileSnapshot(); const cfg = (snapshot.sourceConfig ?? snapshot.config) as OpenClawConfig; const report = buildPluginRegistrySnapshotReport({ config: cfg }); @@ -313,7 +322,7 @@ export async function runPluginsDoctorCommand(): Promise { buildPluginCompatibilityNotices, buildPluginDiagnosticsReport, formatPluginCompatibilityNotice, - } = await import("../plugins/status.js"); + } = await loadPluginsStatus(); const { collectStalePluginConfigWarnings, isStalePluginAutoRepairBlocked, @@ -428,7 +437,7 @@ export async function runPluginMarketplaceListCommand( opts: PluginMarketplaceListOptions, ): Promise { const { listMarketplacePlugins } = await import("../plugins/marketplace.js"); - const { createPluginInstallLogger } = await import("./plugins-command-helpers.js"); + const { createPluginInstallLogger } = await loadPluginsCommandHelpers(); const result = await listMarketplacePlugins({ marketplace: source, logger: createPluginInstallLogger(),