

























@@ -20,23 +20,36 @@ import {
2020finalizeDebugProxyCapture,
2121initializeDebugProxyCapture,
2222} from "../proxy-capture/runtime.js";
23-import {
24-normalizeLowercaseStringOrEmpty,
25-normalizeOptionalLowercaseString,
26-normalizeOptionalString,
27-} from "../shared/string-coerce.js";
23+import { normalizeOptionalString } from "../shared/string-coerce.js";
2824import { resolveCliArgvInvocation } from "./argv-invocation.js";
2925import {
3026shouldRegisterPrimaryCommandOnly,
3127shouldSkipPluginCommandRegistration,
3228} from "./command-registration-policy.js";
33-import { shouldEnsureCliPathForCommandPath } from "./command-startup-policy.js";
3429import { maybeRunCliInContainer, parseCliContainerArgs } from "./container-target.js";
3530import { applyCliProfileEnv, parseCliProfileArgs } from "./profile.js";
3631import { createCliProgress } from "./progress.js";
3732import { tryRouteCli } from "./route.js";
33+import {
34+resolveMissingPluginCommandMessage as resolveMissingPluginCommandMessageFromPolicy,
35+rewriteUpdateFlagArgv,
36+shouldEnsureCliPath,
37+shouldStartCrestodianForBareRoot,
38+shouldStartCrestodianForModernOnboard,
39+shouldUseBrowserHelpFastPath,
40+shouldUseRootHelpFastPath,
41+} from "./run-main-policy.js";
3842import { normalizeWindowsArgv } from "./windows-argv.js";
394344+export {
45+rewriteUpdateFlagArgv,
46+shouldEnsureCliPath,
47+shouldStartCrestodianForBareRoot,
48+shouldStartCrestodianForModernOnboard,
49+shouldUseBrowserHelpFastPath,
50+shouldUseRootHelpFastPath,
51+} from "./run-main-policy.js";
52+4053async function closeCliMemoryManagers(): Promise<void> {
4154if (!hasMemoryRuntime()) {
4255return;
@@ -49,129 +62,15 @@ async function closeCliMemoryManagers(): Promise<void> {
4962}
5063}
516452-export function rewriteUpdateFlagArgv(argv: string[]): string[] {
53-const index = argv.indexOf("--update");
54-if (index === -1) {
55-return argv;
56-}
57-58-const next = [...argv];
59-next.splice(index, 1, "update");
60-return next;
61-}
62-63-export function shouldEnsureCliPath(argv: string[]): boolean {
64-const invocation = resolveCliArgvInvocation(argv);
65-if (invocation.hasHelpOrVersion || shouldStartCrestodianForBareRoot(argv)) {
66-return false;
67-}
68-return shouldEnsureCliPathForCommandPath(invocation.commandPath);
69-}
70-71-export function shouldUseRootHelpFastPath(argv: string[]): boolean {
72-const invocation = resolveCliArgvInvocation(argv);
73-return (
74-process.env.OPENCLAW_DISABLE_CLI_STARTUP_HELP_FAST_PATH !== "1" &&
75-(invocation.isRootHelpInvocation ||
76-(invocation.commandPath.length === 1 &&
77-invocation.commandPath[0] === "help" &&
78-invocation.hasHelpOrVersion))
79-);
80-}
81-82-export function shouldUseBrowserHelpFastPath(argv: string[]): boolean {
83-if (process.env.OPENCLAW_DISABLE_CLI_STARTUP_HELP_FAST_PATH === "1") {
84-return false;
85-}
86-const invocation = resolveCliArgvInvocation(argv);
87-return (
88-invocation.commandPath.length === 1 &&
89-invocation.commandPath[0] === "browser" &&
90-invocation.hasHelpOrVersion
91-);
92-}
93-94-export function shouldStartCrestodianForBareRoot(argv: string[]): boolean {
95-const invocation = resolveCliArgvInvocation(argv);
96-return invocation.commandPath.length === 0 && !invocation.hasHelpOrVersion;
97-}
98-99-export function shouldStartCrestodianForModernOnboard(argv: string[]): boolean {
100-const invocation = resolveCliArgvInvocation(argv);
101-return (
102-invocation.commandPath[0] === "onboard" &&
103-argv.includes("--modern") &&
104-!invocation.hasHelpOrVersion
105-);
106-}
107-10865export function resolveMissingPluginCommandMessage(
10966pluginId: string,
11067config?: OpenClawConfig,
11168options?: { registry?: PluginManifestCommandAliasRegistry },
11269): string | null {
113-const normalizedPluginId = normalizeLowercaseStringOrEmpty(pluginId);
114-if (!normalizedPluginId) {
115-return null;
116-}
117-const allow =
118-Array.isArray(config?.plugins?.allow) && config.plugins.allow.length > 0
119- ? config.plugins.allow
120-.filter((entry): entry is string => typeof entry === "string")
121-.map((entry) => normalizeOptionalLowercaseString(entry))
122-.filter(Boolean)
123- : [];
124-const commandAlias = resolveManifestCommandAliasOwner({
125-command: normalizedPluginId,
126- config,
127-registry: options?.registry,
70+return resolveMissingPluginCommandMessageFromPolicy(pluginId, config, {
71+ ...(options?.registry ? { registry: options.registry } : {}),
72+resolveCommandAliasOwner: resolveManifestCommandAliasOwner,
12873});
129-const parentPluginId = commandAlias?.pluginId;
130-if (parentPluginId) {
131-if (allow.length > 0 && !allow.includes(parentPluginId)) {
132-return (
133-`"${normalizedPluginId}" is not a plugin; it is a command provided by the ` +
134-`"${parentPluginId}" plugin. Add "${parentPluginId}" to \`plugins.allow\` ` +
135-`instead of "${normalizedPluginId}".`
136-);
137-}
138-if (config?.plugins?.entries?.[parentPluginId]?.enabled === false) {
139-return (
140-`The \`openclaw ${normalizedPluginId}\` command is unavailable because ` +
141-`\`plugins.entries.${parentPluginId}.enabled=false\`. Re-enable that entry if you want ` +
142-"the bundled plugin command surface."
143-);
144-}
145-if (commandAlias.kind === "runtime-slash") {
146-const cliHint = commandAlias.cliCommand
147- ? `Use \`openclaw ${commandAlias.cliCommand}\` for related CLI operations, or `
148- : "Use ";
149-return (
150-`"${normalizedPluginId}" is a runtime slash command (/${normalizedPluginId}), not a CLI command. ` +
151-`It is provided by the "${parentPluginId}" plugin. ` +
152-`${cliHint}\`/${normalizedPluginId}\` in a chat session.`
153-);
154-}
155-}
156-157-if (allow.length > 0 && !allow.includes(normalizedPluginId)) {
158-if (parentPluginId && allow.includes(parentPluginId)) {
159-return null;
160-}
161-return (
162-`The \`openclaw ${normalizedPluginId}\` command is unavailable because ` +
163-`\`plugins.allow\` excludes "${normalizedPluginId}". Add "${normalizedPluginId}" to ` +
164-`\`plugins.allow\` if you want that bundled plugin CLI surface.`
165-);
166-}
167-if (config?.plugins?.entries?.[normalizedPluginId]?.enabled === false) {
168-return (
169-`The \`openclaw ${normalizedPluginId}\` command is unavailable because ` +
170-`\`plugins.entries.${normalizedPluginId}.enabled=false\`. Re-enable that entry if you want ` +
171-"the bundled plugin CLI surface."
172-);
173-}
174-return null;
17574}
1767517776function shouldLoadCliDotEnv(env: NodeJS.ProcessEnv = process.env): boolean {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。