openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
250 lines (249 loc) • 11.8 kB
JavaScript
import { r as theme } from "./theme-vjDs9tao.js";
import { a as tracePluginLifecyclePhaseAsync, i as tracePluginLifecyclePhase } from "./discovery-BDSfxwT6.js";
import { g as shortenHomePath, h as shortenHomeInString } from "./utils-CCC-BEJH.js";
import { n as defaultRuntime } from "./runtime-B4lgFmsS.js";
import { i as getRuntimeConfig } from "./io-Gi7-pyU-.js";
import "./config-C9RxTsn1.js";
import { a as formatMissingPluginMessage } from "./error-format-COoNML-C.js";
import { n as renderTable, t as getTerminalTableWidth } from "./table-CpFtGZut.js";
import { u as quietPluginJsonLogger } from "./plugins-command-helpers-BMTwD7oF.js";
//#region src/cli/plugins-inspect-command.ts
function formatInspectSection(title, lines) {
if (lines.length === 0) return [];
return [
"",
theme.muted(`${title}:`),
...lines
];
}
function formatCapabilityKinds(capabilities) {
if (capabilities.length === 0) return "-";
return capabilities.map((entry) => entry.kind).join(", ");
}
function formatHookSummary(params) {
const parts = [];
if (params.usesLegacyBeforeAgentStart) parts.push("before_agent_start");
const nonLegacyTypedHookCount = params.typedHookCount - (params.usesLegacyBeforeAgentStart ? 1 : 0);
if (nonLegacyTypedHookCount > 0) parts.push(`${nonLegacyTypedHookCount} typed`);
if (params.customHookCount > 0) parts.push(`${params.customHookCount} custom`);
return parts.length > 0 ? parts.join(", ") : "-";
}
function formatInstallLines(install) {
if (!install) return [];
const lines = [`Source: ${install.source}`];
if (install.spec) lines.push(`Spec: ${install.spec}`);
if (install.sourcePath) lines.push(`Source path: ${shortenHomePath(install.sourcePath)}`);
if (install.installPath) lines.push(`Install path: ${shortenHomePath(install.installPath)}`);
if (install.version) lines.push(`Recorded version: ${install.version}`);
if (install.clawhubPackage) lines.push(`ClawHub package: ${install.clawhubPackage}`);
if (install.clawhubChannel) lines.push(`ClawHub channel: ${install.clawhubChannel}`);
if (install.artifactKind) lines.push(`Artifact kind: ${install.artifactKind}`);
if (install.artifactFormat) lines.push(`Artifact format: ${install.artifactFormat}`);
if (install.npmIntegrity) lines.push(`Npm integrity: ${install.npmIntegrity}`);
if (install.npmShasum) lines.push(`Npm shasum: ${install.npmShasum}`);
if (install.npmTarballName) lines.push(`Npm tarball: ${install.npmTarballName}`);
if (install.clawpackSha256) lines.push(`ClawPack sha256: ${install.clawpackSha256}`);
if (install.clawpackSpecVersion !== void 0) lines.push(`ClawPack spec: ${install.clawpackSpecVersion}`);
if (install.clawpackManifestSha256) lines.push(`ClawPack manifest sha256: ${install.clawpackManifestSha256}`);
if (install.clawpackSize !== void 0) lines.push(`ClawPack size: ${install.clawpackSize} bytes`);
if (install.installedAt) lines.push(`Installed at: ${install.installedAt}`);
return lines;
}
/** Inspect one plugin or all plugins using either snapshot-only or runtime-loaded registry data. */
async function runPluginsInspectCommand(id, opts) {
const { buildAllPluginInspectReports, buildPluginDiagnosticsReport, buildPluginInspectReport, buildPluginSnapshotReport, formatPluginCompatibilityNotice } = await import("./status-JfK93cyu.js");
const { loadInstalledPluginIndexInstallRecords } = await import("./installed-plugin-index-records-B7GvzCMT.js");
const cfg = tracePluginLifecyclePhase("config read", () => getRuntimeConfig(), { command: "inspect" });
const installRecords = await tracePluginLifecyclePhaseAsync("install records load", () => loadInstalledPluginIndexInstallRecords(), { command: "inspect" });
const loggerParams = opts.json ? { logger: quietPluginJsonLogger } : {};
const runtimeInspect = opts.runtime === true;
if (opts.all) {
if (id) {
defaultRuntime.error("Pass either a plugin id or --all, not both.");
return defaultRuntime.exit(1);
}
const report = runtimeInspect ? tracePluginLifecyclePhase("runtime plugin registry load", () => buildPluginDiagnosticsReport({
config: cfg,
...loggerParams
}), {
command: "inspect",
all: true
}) : tracePluginLifecyclePhase("plugin registry snapshot", () => buildPluginSnapshotReport({
config: cfg,
...loggerParams
}), {
command: "inspect",
all: true
});
const inspectAll = buildAllPluginInspectReports({
config: cfg,
...loggerParams,
report
});
const inspectAllWithInstall = inspectAll.map((inspect) => ({
...inspect,
install: installRecords[inspect.plugin.id]
}));
if (opts.json) {
defaultRuntime.writeJson(inspectAllWithInstall);
return;
}
const tableWidth = getTerminalTableWidth();
const rows = inspectAll.map((inspect) => ({
Name: inspect.plugin.name || inspect.plugin.id,
ID: inspect.plugin.name && inspect.plugin.name !== inspect.plugin.id ? inspect.plugin.id : "",
Status: inspect.plugin.status === "loaded" ? theme.success("loaded") : inspect.plugin.status === "disabled" ? theme.warn("disabled") : theme.error("error"),
Shape: inspect.shape,
Capabilities: formatCapabilityKinds(inspect.capabilities),
Compatibility: inspect.compatibility.length > 0 ? inspect.compatibility.map((entry) => entry.severity === "warn" ? `warn:${entry.code}` : entry.code).join(", ") : "none",
Bundle: inspect.bundleCapabilities.length > 0 ? inspect.bundleCapabilities.join(", ") : "-",
Hooks: formatHookSummary({
usesLegacyBeforeAgentStart: inspect.usesLegacyBeforeAgentStart,
typedHookCount: inspect.typedHooks.length,
customHookCount: inspect.customHooks.length
})
}));
defaultRuntime.log(renderTable({
width: tableWidth,
columns: [
{
key: "Name",
header: "Name",
minWidth: 14,
flex: true
},
{
key: "ID",
header: "ID",
minWidth: 10,
flex: true
},
{
key: "Status",
header: "Status",
minWidth: 10
},
{
key: "Shape",
header: "Shape",
minWidth: 18
},
{
key: "Capabilities",
header: "Capabilities",
minWidth: 28,
flex: true
},
{
key: "Compatibility",
header: "Compatibility",
minWidth: 24,
flex: true
},
{
key: "Bundle",
header: "Bundle",
minWidth: 14,
flex: true
},
{
key: "Hooks",
header: "Hooks",
minWidth: 20,
flex: true
}
],
rows
}).trimEnd());
return;
}
if (!id) {
defaultRuntime.error("Provide a plugin id or use --all.");
return defaultRuntime.exit(1);
}
const snapshotReport = tracePluginLifecyclePhase("plugin registry snapshot", () => buildPluginSnapshotReport({
config: cfg,
...loggerParams
}), { command: "inspect" });
const targetPlugin = snapshotReport.plugins.find((entry) => entry.id === id || entry.name === id);
if (!targetPlugin) {
defaultRuntime.error(formatMissingPluginMessage({
id,
includeSearch: true
}));
return defaultRuntime.exit(1);
}
const report = runtimeInspect ? tracePluginLifecyclePhase("runtime plugin registry load", () => buildPluginDiagnosticsReport({
config: cfg,
...loggerParams,
onlyPluginIds: [targetPlugin.id]
}), {
command: "inspect",
pluginId: targetPlugin.id
}) : snapshotReport;
const inspect = buildPluginInspectReport({
id: targetPlugin.id,
config: cfg,
...loggerParams,
report
});
if (!inspect) {
defaultRuntime.error(formatMissingPluginMessage({
id,
listCommand: "openclaw plugins list --json"
}));
return defaultRuntime.exit(1);
}
const install = installRecords[inspect.plugin.id];
if (opts.json) {
defaultRuntime.writeJson({
...inspect,
install
});
return;
}
const lines = [];
lines.push(theme.heading(inspect.plugin.name || inspect.plugin.id));
if (inspect.plugin.name && inspect.plugin.name !== inspect.plugin.id) lines.push(theme.muted(`id: ${inspect.plugin.id}`));
if (inspect.plugin.description) lines.push(inspect.plugin.description);
lines.push("");
lines.push(`${theme.muted("Status:")} ${inspect.plugin.status}`);
if (inspect.plugin.failurePhase) lines.push(`${theme.muted("Failure phase:")} ${inspect.plugin.failurePhase}`);
if (inspect.plugin.failedAt) lines.push(`${theme.muted("Failed at:")} ${inspect.plugin.failedAt.toISOString()}`);
lines.push(`${theme.muted("Format:")} ${inspect.plugin.format ?? "openclaw"}`);
if (inspect.plugin.bundleFormat) lines.push(`${theme.muted("Bundle format:")} ${inspect.plugin.bundleFormat}`);
lines.push(`${theme.muted("Source:")} ${shortenHomeInString(inspect.plugin.source)}`);
lines.push(`${theme.muted("Origin:")} ${inspect.plugin.origin}`);
if (inspect.plugin.version) lines.push(`${theme.muted("Version:")} ${inspect.plugin.version}`);
lines.push(`${theme.muted("Shape:")} ${inspect.shape}`);
lines.push(`${theme.muted("Capability mode:")} ${inspect.capabilityMode}`);
lines.push(`${theme.muted("Legacy before_agent_start:")} ${inspect.usesLegacyBeforeAgentStart ? "yes" : "no"}`);
if (inspect.bundleCapabilities.length > 0) lines.push(`${theme.muted("Bundle capabilities:")} ${inspect.bundleCapabilities.join(", ")}`);
lines.push(...formatInspectSection("Capabilities", inspect.capabilities.map((entry) => `${entry.kind}: ${entry.ids.length > 0 ? entry.ids.join(", ") : "(registered)"}`)));
lines.push(...formatInspectSection("Typed hooks", inspect.typedHooks.map((entry) => entry.priority == null ? entry.name : `${entry.name} (priority ${entry.priority})`)));
lines.push(...formatInspectSection("Compatibility warnings", inspect.compatibility.map(formatPluginCompatibilityNotice)));
lines.push(...formatInspectSection("Custom hooks", inspect.customHooks.map((entry) => `${entry.name}: ${entry.events.join(", ")}`)));
lines.push(...formatInspectSection("Tools", inspect.tools.map((entry) => {
const names = entry.names.length > 0 ? entry.names.join(", ") : "(anonymous)";
return entry.optional ? `${names} [optional]` : names;
})));
lines.push(...formatInspectSection("Commands", inspect.commands));
lines.push(...formatInspectSection("CLI commands", inspect.cliCommands));
lines.push(...formatInspectSection("Services", inspect.services));
lines.push(...formatInspectSection("Gateway methods", inspect.gatewayMethods ?? []));
lines.push(...formatInspectSection("MCP servers", inspect.mcpServers.map((entry) => entry.hasStdioTransport ? entry.name : `${entry.name} (unsupported transport)`)));
lines.push(...formatInspectSection("LSP servers", inspect.lspServers.map((entry) => entry.hasStdioTransport ? entry.name : `${entry.name} (unsupported transport)`)));
if (inspect.httpRouteCount > 0) lines.push(...formatInspectSection("HTTP routes", [String(inspect.httpRouteCount)]));
const policyLines = [];
if (typeof inspect.policy.allowPromptInjection === "boolean") policyLines.push(`allowPromptInjection: ${inspect.policy.allowPromptInjection}`);
if (typeof inspect.policy.allowConversationAccess === "boolean") policyLines.push(`allowConversationAccess: ${inspect.policy.allowConversationAccess}`);
if (typeof inspect.policy.allowModelOverride === "boolean") policyLines.push(`allowModelOverride: ${inspect.policy.allowModelOverride}`);
if (inspect.policy.hasAllowedModelsConfig) policyLines.push(`allowedModels: ${inspect.policy.allowedModels.length > 0 ? inspect.policy.allowedModels.join(", ") : "(configured but empty)"}`);
lines.push(...formatInspectSection("Policy", policyLines));
lines.push(...formatInspectSection("Diagnostics", inspect.diagnostics.map((entry) => `${entry.level.toUpperCase()}: ${entry.message}`)));
lines.push(...formatInspectSection("Install", formatInstallLines(install)));
if (inspect.plugin.error) lines.push("", `${theme.error("Error:")} ${inspect.plugin.error}`);
defaultRuntime.log(lines.join("\n"));
}
//#endregion
export { runPluginsInspectCommand };