



















11import { collectUniqueCommandDescriptors } from "../cli/program/command-descriptor-utils.js";
22import type { OpenClawConfig } from "../config/types.openclaw.js";
3+import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js";
34import { resolveManifestActivationPluginIds } from "./activation-planner.js";
45import { createPluginCliGatewayNodesRuntime } from "./cli-gateway-nodes-runtime.js";
56import type { PluginLoadOptions } from "./loader.js";
67import { loadOpenClawPluginCliRegistry, loadOpenClawPlugins } from "./loader.js";
8+import { createEmptyPluginRegistry } from "./registry-empty.js";
79import type { PluginRegistry } from "./registry.js";
810import {
911buildPluginRuntimeLoadOptions,
@@ -53,20 +55,24 @@ function buildPluginCliLoaderParams(
5355params?: { primaryCommand?: string },
5456loaderOptions?: PluginCliLoaderOptions,
5557) {
56-const onlyPluginIds = resolvePrimaryCommandPluginIds(context, params?.primaryCommand);
58+const onlyPluginIds = resolvePrimaryCommandManifestPluginIds(context, params?.primaryCommand);
5759return buildPluginRuntimeLoadOptions(context, {
5860 ...loaderOptions,
59- ...(onlyPluginIds.length > 0 ? { onlyPluginIds } : {}),
61+ ...(onlyPluginIds && onlyPluginIds.length > 0 ? { onlyPluginIds } : {}),
6062});
6163}
626463-function resolvePrimaryCommandPluginIds(
65+function normalizePluginCliRootName(value: string | undefined): string {
66+return normalizeLowercaseStringOrEmpty(value);
67+}
68+69+function resolvePrimaryCommandManifestPluginIds(
6470context: PluginCliLoadContext,
6571primaryCommand: string | undefined,
66-): string[] {
67-const normalizedPrimary = primaryCommand?.trim();
72+): string[] | undefined {
73+const normalizedPrimary = normalizePluginCliRootName(primaryCommand);
6874if (!normalizedPrimary) {
69-return [];
75+return undefined;
7076}
7177return resolveManifestActivationPluginIds({
7278trigger: {
@@ -79,6 +85,47 @@ function resolvePrimaryCommandPluginIds(
7985});
8086}
818788+function listPluginCliRootOwnerIds(registry: PluginRegistry, primaryCommand: string): string[] {
89+const normalizedPrimary = normalizePluginCliRootName(primaryCommand);
90+if (!normalizedPrimary) {
91+return [];
92+}
93+return [
94+ ...new Set(
95+registry.cliRegistrars
96+.filter((entry) => {
97+const roots = [
98+ ...entry.commands,
99+ ...entry.descriptors.map((descriptor) => descriptor.name),
100+].map(normalizePluginCliRootName);
101+return roots.includes(normalizedPrimary);
102+})
103+.map((entry) => entry.pluginId),
104+),
105+];
106+}
107+108+async function resolvePrimaryCommandPluginIds(
109+context: PluginCliLoadContext,
110+primaryCommand: string | undefined,
111+loaderOptions?: PluginCliLoaderOptions,
112+): Promise<string[] | undefined> {
113+const normalizedPrimary = normalizePluginCliRootName(primaryCommand);
114+if (!normalizedPrimary) {
115+return undefined;
116+}
117+const manifestPluginIds = resolvePrimaryCommandManifestPluginIds(context, normalizedPrimary);
118+if (manifestPluginIds && manifestPluginIds.length > 0) {
119+return manifestPluginIds;
120+}
121+const { registry } = await loadPluginCliMetadataRegistryWithContext(
122+context,
123+{ primaryCommand: normalizedPrimary },
124+loaderOptions,
125+);
126+return listPluginCliRootOwnerIds(registry, normalizedPrimary);
127+}
128+82129export function resolvePluginCliLoadContext(params: {
83130cfg?: OpenClawConfig;
84131env?: NodeJS.ProcessEnv;
@@ -109,13 +156,28 @@ export async function loadPluginCliCommandRegistryWithContext(params: {
109156primaryCommand?: string;
110157loaderOptions?: PluginCliLoaderOptions;
111158}): Promise<PluginCliRegistryLoadResult> {
112-const onlyPluginIds = resolvePrimaryCommandPluginIds(params.context, params.primaryCommand);
159+let onlyPluginIds: string[] | undefined;
160+try {
161+onlyPluginIds = await resolvePrimaryCommandPluginIds(
162+params.context,
163+params.primaryCommand,
164+params.loaderOptions,
165+);
166+} catch {
167+onlyPluginIds = resolvePrimaryCommandManifestPluginIds(params.context, params.primaryCommand);
168+}
169+if (onlyPluginIds && onlyPluginIds.length === 0) {
170+return {
171+ ...params.context,
172+registry: createEmptyPluginRegistry(),
173+};
174+}
113175return {
114176 ...params.context,
115177registry: loadOpenClawPlugins(
116178buildPluginRuntimeLoadOptions(params.context, {
117179 ...params.loaderOptions,
118- ...(onlyPluginIds.length > 0 ? { onlyPluginIds } : {}),
180+ ...(onlyPluginIds && onlyPluginIds.length > 0 ? { onlyPluginIds } : {}),
119181activate: false,
120182cache: false,
121183runtimeOptions: {
@@ -196,6 +258,24 @@ export async function loadPluginCliRegistrationEntries(params: {
196258});
197259}
198260261+export async function resolvePluginCliRootOwnerIds(
262+params: PluginCliPublicLoadParams,
263+): Promise<string[] | null> {
264+const primaryCommand = normalizePluginCliRootName(params.primaryCommand);
265+if (!primaryCommand) {
266+return null;
267+}
268+const logger = resolvePluginCliLogger(params.logger);
269+const context = resolvePluginCliLoadContext({
270+cfg: params.cfg,
271+env: params.env,
272+ logger,
273+});
274+return (
275+(await resolvePrimaryCommandPluginIds(context, primaryCommand, params.loaderOptions)) ?? null
276+);
277+}
278+199279export async function loadPluginCliRegistrationEntriesWithDefaults(
200280params: PluginCliPublicLoadParams,
201281): Promise<PluginCliCommandGroupEntry[]> {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。