UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

201 lines (200 loc) 8.31 kB
import { a as normalizeLowercaseStringOrEmpty } from "./string-coerce-mnp54Vah.js"; import { T as collectUniqueCommandDescriptors } from "./argv-CnfL__6a.js"; import { a as addTimerTimeoutGraceMs } from "./number-coercion-CJQ8TR--.js"; import { _ as uniqueStrings } from "./string-normalization-WNUDCpXX.js"; import { t as resolveManifestActivationPluginIds } from "./activation-planner-CPLeaE9U.js"; import { i as GATEWAY_CLIENT_NAMES, r as GATEWAY_CLIENT_MODES } from "./client-info-CcqJJIan.js"; import { o as callGateway } from "./call-B5-GYOlf.js"; import { c as loadOpenClawPlugins, s as loadOpenClawPluginCliRegistry } from "./loader-Dp13N9qc.js"; import { I as createEmptyPluginRegistry } from "./runtime-B2ROiq5l.js"; import { i as resolvePluginRuntimeLoadContext, r as createPluginRuntimeLoaderLogger, t as buildPluginRuntimeLoadOptions } from "./load-context-DpVH8qxj.js"; import { randomUUID } from "node:crypto"; //#region src/plugins/cli-gateway-nodes-runtime.ts /** Provides plugin CLI node APIs by forwarding calls to the Gateway. */ /** Adds Gateway timer grace for plugin CLI node invoke calls. */ function resolvePluginCliNodeInvokeGatewayTimeoutMs(timeoutMs) { return typeof timeoutMs === "number" && Number.isFinite(timeoutMs) && timeoutMs > 0 ? addTimerTimeoutGraceMs(timeoutMs) : void 0; } /** Creates the `runtime.nodes` implementation exposed to CLI plugin code. */ function createPluginCliGatewayNodesRuntime() { return { async list(params) { const payload = await callGateway({ method: "node.list", params: {}, clientName: GATEWAY_CLIENT_NAMES.CLI, mode: GATEWAY_CLIENT_MODES.CLI }); const nodes = Array.isArray(payload?.nodes) ? payload.nodes : []; return { nodes: params?.connected === true ? nodes.filter((node) => node !== null && typeof node === "object" && node.connected === true) : nodes }; }, async invoke(params) { return await callGateway({ method: "node.invoke", params: { nodeId: params.nodeId, command: params.command, ...params.params !== void 0 && { params: params.params }, timeoutMs: params.timeoutMs, idempotencyKey: params.idempotencyKey || randomUUID() }, timeoutMs: resolvePluginCliNodeInvokeGatewayTimeoutMs(params.timeoutMs), clientName: GATEWAY_CLIENT_NAMES.CLI, mode: GATEWAY_CLIENT_MODES.CLI }); } }; } //#endregion //#region src/plugins/cli-registry-loader.ts /** Loads plugin CLI registrations lazily for the command tree and plugin-owned subcommands. */ /** Creates the default plugin CLI logger shared with runtime loading. */ function createPluginCliLogger() { return createPluginRuntimeLoaderLogger(); } function resolvePluginCliLogger(logger) { return logger ?? createPluginCliLogger(); } function buildPluginCliLoaderParams(context, params, loaderOptions) { const onlyPluginIds = resolvePrimaryCommandManifestPluginIds(context, params?.primaryCommand); return buildPluginRuntimeLoadOptions(context, { ...loaderOptions, ...onlyPluginIds && onlyPluginIds.length > 0 ? { onlyPluginIds } : {} }); } function normalizePluginCliRootName(value) { return normalizeLowercaseStringOrEmpty(value); } function resolvePrimaryCommandManifestPluginIds(context, primaryCommand) { const normalizedPrimary = normalizePluginCliRootName(primaryCommand); if (!normalizedPrimary) return; return resolveManifestActivationPluginIds({ trigger: { kind: "command", command: normalizedPrimary }, config: context.activationSourceConfig, workspaceDir: context.workspaceDir, env: context.env }); } function listPluginCliRootOwnerIds(registry, primaryCommand) { const normalizedPrimary = normalizePluginCliRootName(primaryCommand); if (!normalizedPrimary) return []; return uniqueStrings(registry.cliRegistrars.filter((entry) => { const parentPath = entry.parentPath ?? []; return (parentPath.length > 0 ? [parentPath[0]] : [...entry.commands, ...entry.descriptors.map((descriptor) => descriptor.name)]).includes(normalizedPrimary); }).map((entry) => entry.pluginId)); } async function resolvePrimaryCommandPluginIds(context, primaryCommand, loaderOptions) { const normalizedPrimary = normalizePluginCliRootName(primaryCommand); if (!normalizedPrimary) return; const manifestPluginIds = resolvePrimaryCommandManifestPluginIds(context, normalizedPrimary); if (manifestPluginIds && manifestPluginIds.length > 0) return manifestPluginIds; const { registry } = await loadPluginCliMetadataRegistryWithContext(context, { primaryCommand: normalizedPrimary }, loaderOptions); return listPluginCliRootOwnerIds(registry, normalizedPrimary); } /** Builds the runtime load context used for CLI-only plugin registry loading. */ function resolvePluginCliLoadContext(params) { return resolvePluginRuntimeLoadContext({ config: params.cfg, env: params.env, logger: params.logger }); } async function loadPluginCliMetadataRegistryWithContext(context, params, loaderOptions) { return { ...context, registry: await loadOpenClawPluginCliRegistry(buildPluginCliLoaderParams(context, params, loaderOptions)) }; } async function loadPluginCliCommandRegistryWithContext(params) { let onlyPluginIds; try { onlyPluginIds = await resolvePrimaryCommandPluginIds(params.context, params.primaryCommand, params.loaderOptions); } catch { onlyPluginIds = resolvePrimaryCommandManifestPluginIds(params.context, params.primaryCommand); } if (onlyPluginIds && onlyPluginIds.length === 0) return { ...params.context, registry: createEmptyPluginRegistry() }; return { ...params.context, registry: loadOpenClawPlugins(buildPluginRuntimeLoadOptions(params.context, { ...params.loaderOptions, ...onlyPluginIds && onlyPluginIds.length > 0 ? { onlyPluginIds } : {}, activate: false, cache: false, forceFullRuntimeForChannelPlugins: true, runtimeOptions: { nodes: createPluginCliGatewayNodesRuntime() } })) }; } function buildPluginCliCommandGroupEntries(params) { return params.registry.cliRegistrars.map((entry) => ({ pluginId: entry.pluginId, parentPath: entry.parentPath ?? [], placeholders: entry.descriptors, names: entry.commands, register: async (program) => { await entry.register({ program, parentPath: entry.parentPath ?? [], config: params.config, workspaceDir: params.workspaceDir, logger: params.logger }); } })); } async function loadPluginCliDescriptors(params) { try { const logger = resolvePluginCliLogger(params.logger); const { registry } = await loadPluginCliMetadataRegistryWithContext(resolvePluginCliLoadContext({ cfg: params.cfg, env: params.env, logger }), { primaryCommand: params.primaryCommand }, params.loaderOptions); return collectUniqueCommandDescriptors(registry.cliRegistrars.filter((entry) => (entry.parentPath ?? []).length === 0).map((entry) => entry.descriptors)); } catch { return []; } } async function loadPluginCliRegistrationEntries(params) { const resolvedLogger = resolvePluginCliLogger(params.logger); const { config, workspaceDir, logger, registry } = await loadPluginCliCommandRegistryWithContext({ context: resolvePluginCliLoadContext({ cfg: params.cfg, env: params.env, logger: resolvedLogger }), primaryCommand: params.primaryCommand, loaderOptions: params.loaderOptions }); return buildPluginCliCommandGroupEntries({ registry, config, workspaceDir, logger }); } async function resolvePluginCliRootOwnerIds(params) { const primaryCommand = normalizePluginCliRootName(params.primaryCommand); if (!primaryCommand) return null; const logger = resolvePluginCliLogger(params.logger); return await resolvePrimaryCommandPluginIds(resolvePluginCliLoadContext({ cfg: params.cfg, env: params.env, logger }), primaryCommand, params.loaderOptions) ?? null; } async function loadPluginCliRegistrationEntriesWithDefaults(params) { const logger = resolvePluginCliLogger(params.logger); return loadPluginCliRegistrationEntries({ ...params, logger }); } //#endregion export { loadPluginCliRegistrationEntries as a, resolvePluginCliRootOwnerIds as c, loadPluginCliMetadataRegistryWithContext as i, loadPluginCliCommandRegistryWithContext as n, loadPluginCliRegistrationEntriesWithDefaults as o, loadPluginCliDescriptors as r, resolvePluginCliLoadContext as s, createPluginCliLogger as t };