UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

62 lines (61 loc) • 2.79 kB
import { n as normalizeExecAsk } from "./exec-approvals-core-s7tTQC_a.mjs"; import { isDeepStrictEqual } from "node:util"; //#region src/infra/exec-approvals-policy.ts function requiresExecApproval(params) { if (params.ask === "always") return true; if (params.durableApprovalSatisfied === true) return false; return params.ask === "on-miss" && params.security === "allowlist" && (!params.analysisOk || !params.allowlistSatisfied); } function minSecurity(a, b) { const order = { deny: 0, allowlist: 1, full: 2 }; return order[a] <= order[b] ? a : b; } function maxAsk(a, b) { const order = { off: 0, "on-miss": 1, always: 2 }; return order[a] >= order[b] ? a : b; } const DEFAULT_EXEC_APPROVAL_DECISIONS = [ "allow-once", "allow-always", "deny" ]; const OPTIONAL_EXEC_APPROVAL_DECISIONS = ["allow-always"]; function normalizeExecApprovalUnavailableDecisions(decisions) { return OPTIONAL_EXEC_APPROVAL_DECISIONS.filter((decision) => Array.isArray(decisions) && decisions.includes(decision)); } function resolveExecApprovalAllowedDecisions(params) { if (normalizeExecAsk(params?.ask) === "always" || params?.allowAlwaysPersistence?.kind === "one-shot") return ["allow-once", "deny"]; return DEFAULT_EXEC_APPROVAL_DECISIONS; } function resolveExecApprovalUnavailableDecisions(params) { const allowed = new Set(resolveExecApprovalAllowedDecisions(params)); return OPTIONAL_EXEC_APPROVAL_DECISIONS.filter((decision) => !allowed.has(decision)); } function resolveExecApprovalRequestAllowedDecisions(params) { const policyDecisions = resolveExecApprovalAllowedDecisions({ ask: params?.ask }); const unavailableDecisions = new Set(normalizeExecApprovalUnavailableDecisions(params?.unavailableDecisions)); if (unavailableDecisions.size === 0) return policyDecisions; return policyDecisions.filter((decision) => !unavailableDecisions.has(decision)); } /** These worker commands may change grants/usage, never host execution floors. */ function assertExecApprovalsHostPolicyUnchanged(before, after) { const fields = (file) => ({ security: file.defaults?.security, ask: file.defaults?.ask, agents: Object.fromEntries(Object.entries(file.agents ?? {}).filter(([, agent]) => agent.security !== void 0 || agent.ask !== void 0).map(([id, agent]) => [id, { security: agent.security, ask: agent.ask }])) }); if (!isDeepStrictEqual(fields(before), fields(after))) throw new Error("Exec grant workers cannot change host security or ask policy"); } //#endregion export { requiresExecApproval as a, resolveExecApprovalUnavailableDecisions as c, normalizeExecApprovalUnavailableDecisions as i, maxAsk as n, resolveExecApprovalAllowedDecisions as o, minSecurity as r, resolveExecApprovalRequestAllowedDecisions as s, assertExecApprovalsHostPolicyUnchanged as t };