import type { OpenClawConfig } from "../config/types.openclaw.js"; import { getActivePluginRegistry } from "../plugins/runtime.js"; let pluginRegistryLoaderModulePromise: | Promise | undefined; async function loadPluginRegistryLoaderModule() { pluginRegistryLoaderModulePromise ??= import("../plugins/runtime/runtime-registry-loader.js"); return await pluginRegistryLoaderModulePromise; } export async function ensureNodeHostPluginRegistry(params: { config: OpenClawConfig; env?: NodeJS.ProcessEnv; }): Promise { (await loadPluginRegistryLoaderModule()).ensurePluginRegistryLoaded({ scope: "all", config: params.config, activationSourceConfig: params.config, env: params.env, }); } export function listRegisteredNodeHostCapsAndCommands(): { caps: string[]; commands: string[]; } { const registry = getActivePluginRegistry(); const caps = new Set(); const commands = new Set(); for (const entry of registry?.nodeHostCommands ?? []) { if (entry.command.cap) { caps.add(entry.command.cap); } commands.add(entry.command.command); } return { caps: [...caps].toSorted((left, right) => left.localeCompare(right)), commands: [...commands].toSorted((left, right) => left.localeCompare(right)), }; } export async function invokeRegisteredNodeHostCommand( command: string, paramsJSON?: string | null, ): Promise { const registry = getActivePluginRegistry(); const match = (registry?.nodeHostCommands ?? []).find( (entry) => entry.command.command === command, ); if (!match) { return null; } return await match.command.handle(paramsJSON); }