openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
63 lines (62 loc) • 3.56 kB
JavaScript
import { r as defaultRuntime } from "./runtime-CF2WjnNZ.js";
import { n as sanitizeTerminalText } from "./safe-text-BGBqp1a4.js";
import { r as theme } from "./theme-vjDs9tao.js";
import { t as PLUGIN_DECLARED_SURFACE_GROUPS } from "./plugin-declared-surface-groups-CaZZpMBC.js";
import { r as promptYesNo } from "./prompt-BvBir9Yc.js";
//#region src/cli/plugin-capability-consent.ts
const CAPABILITY_GROUP_LABELS = {
channels: "Channels",
providers: "Providers",
tools: "Tools",
contracts: "Contracts",
hooks: "Hooks",
mcpServers: "MCP servers",
cliCommands: "CLI commands",
cliBackends: "CLI backends",
skills: "Skills",
dangerousConfigFlags: "Dangerous configuration flags"
};
function sanitizeCapabilityValues(values) {
return values.map((value) => sanitizeTerminalText(value)).join(", ");
}
function formatPluginCapabilityConsentLines(details) {
const lines = [`Plugin capabilities require approval: ${sanitizeTerminalText(details.name)} (${sanitizeTerminalText(details.pluginId)})${details.version ? ` @ ${sanitizeTerminalText(details.version)}` : ""}`];
if (details.source) {
const source = [details.source.kind, details.source.spec ?? details.source.packageName].filter((value) => Boolean(value)).map((value) => sanitizeTerminalText(value)).join(": ");
lines.push(`Source: ${source}`);
if (details.source.integrity) lines.push(`Integrity: ${sanitizeTerminalText(details.source.integrity)}`);
}
for (const group of PLUGIN_DECLARED_SURFACE_GROUPS) {
const label = CAPABILITY_GROUP_LABELS[group];
const values = details.declared[group];
if (values.length > 0) lines.push(`${label}: ${sanitizeCapabilityValues(values)}`);
const widened = details.widened?.[group];
if (widened && widened.length > 0) lines.push(`New ${label.toLowerCase()}: ${sanitizeCapabilityValues(widened)}`);
}
lines.push(`Prompt injection: ${details.grants.hooks.allowPromptInjection.effective ? "allowed" : "denied"}`, `Conversation access: ${details.grants.hooks.allowConversationAccess.effective ? "allowed" : "denied"}`);
for (const [grantGroup, values] of [["LLM", details.grants.llm], ["Subagent", details.grants.subagent]]) {
if (!values) continue;
for (const [grantName, value] of Object.entries(values)) {
const rendered = Array.isArray(value) ? sanitizeCapabilityValues(value) : String(value);
lines.push(`${grantGroup} ${grantName}: ${rendered}`);
}
}
if (details.trust) {
lines.push(`Trust: ${details.trust.disposition}`);
if (details.trust.reasons?.length) lines.push(`Trust notes: ${sanitizeCapabilityValues(details.trust.reasons)}`);
}
if (details.acceptedAt) lines.push(`Previously accepted: ${sanitizeTerminalText(details.acceptedAt)}`);
return lines;
}
/** Resolve explicit or interactive plugin capability consent at the CLI boundary. */
function resolvePluginCapabilityConsentCliOptions(params) {
if (params.acceptCapabilities) return { onCapabilityConsent: async (details) => ({ reviewToken: details.reviewToken }) };
if (params.allowPrompt === false || !process.stdin.isTTY || !process.stdout.isTTY) return {};
const runtime = params.runtime ?? defaultRuntime;
return { onCapabilityConsent: async (details) => {
for (const line of formatPluginCapabilityConsentLines(details)) runtime.log(theme.warn(line));
return await promptYesNo(`Accept these capabilities and ${params.action} "${sanitizeTerminalText(details.pluginId)}"?`) ? { reviewToken: details.reviewToken } : void 0;
} };
}
//#endregion
export { resolvePluginCapabilityConsentCliOptions as n, formatPluginCapabilityConsentLines as t };