openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
47 lines (46 loc) • 2.6 kB
JavaScript
import { c as isRecord } from "./record-coerce-DItp3I4t.js";
//#region src/agents/mcp-codex-tool-approval.ts
const APPROVAL_MODES = /* @__PURE__ */ new Set([
"auto",
"prompt",
"approve"
]);
function normalizeApprovalMode(value) {
return typeof value === "string" && APPROVAL_MODES.has(value) ? value : void 0;
}
function isOpenClawLoopbackServer(name, server) {
return name === "openclaw" && typeof server.url === "string" && /^https?:\/\/(?:127\.0\.0\.1|localhost):\d+\/mcp(?:[?#].*)?$/.test(server.url);
}
/** Mirrors the approval default projected into Codex native MCP config. */
function resolveProjectedMcpCodexToolApprovalMode(serverName, server, projectedServer, toolName) {
const codex = server.codex && typeof server.codex === "object" && !Array.isArray(server.codex) ? server.codex : {};
const projectedTools = isRecord(projectedServer?.tools) ? projectedServer.tools : void 0;
return normalizeApprovalMode((toolName && isRecord(projectedTools?.[toolName]) ? projectedTools[toolName] : void 0)?.approval_mode) ?? normalizeApprovalMode(codex.defaultToolsApprovalMode) ?? normalizeApprovalMode(codex.default_tools_approval_mode) ?? normalizeApprovalMode(projectedServer?.default_tools_approval_mode) ?? (isOpenClawLoopbackServer(serverName, server) ? "approve" : void 0);
}
function normalizeMcpCodexToolAnnotations(value) {
if (!value || typeof value !== "object" || Array.isArray(value)) return {};
const record = value;
const result = {};
for (const key of [
"readOnlyHint",
"destructiveHint",
"idempotentHint",
"openWorldHint"
]) if (typeof record[key] === "boolean") result[key] = record[key];
return result;
}
/** Explicit server policy outranks the prepared session posture. */
function requiresMcpCodexToolApproval(params) {
const mode = params.mode ?? (params.fullPermission ? "approve" : "auto");
if (mode === "approve") return false;
if (mode === "prompt") return true;
const annotations = params.annotations ?? {};
if (annotations.destructiveHint === true) return true;
if (annotations.readOnlyHint === true) return false;
return annotations.destructiveHint !== false || annotations.openWorldHint !== false;
}
function formatMcpCodexApprovalRemedy(serverName) {
return `Run openclaw mcp configure ${serverName && /^[\w.][\w.-]{0,127}$/.test(serverName) ? serverName : "<server>"} --approval approve for a trusted server, or change the session permission mode.`;
}
//#endregion
export { resolveProjectedMcpCodexToolApprovalMode as i, normalizeMcpCodexToolAnnotations as n, requiresMcpCodexToolApproval as r, formatMcpCodexApprovalRemedy as t };