File: //lib/node_modules/openclaw/dist/pi-tools.policy-CwTPF5VO.js
import { r as resolveAgentConfig } from "./agent-scope-BUKPOSoo.js";
import { T as resolveThreadParentSessionKey, l as resolveAgentIdFromSessionKey, s as normalizeAgentId } from "./session-key-DIABCrXz.js";
import { kt as DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH } from "./config-DWx3SXRc.js";
import { o as resolveChannelGroupToolsPolicy, t as getChannelDock } from "./dock-DE75y38s.js";
import { l as normalizeMessageChannel } from "./message-channel-CIQTys4Q.js";
import { S as normalizeToolName, T as matchesAnyGlobPattern, w as compileGlobPatterns, x as expandToolGroups } from "./sandbox-B6QqSqwe.js";
//#region src/agents/sandbox-tool-policy.ts
function unionAllow(base, extra) {
if (!Array.isArray(extra) || extra.length === 0) return base;
if (!Array.isArray(base) || base.length === 0) return Array.from(new Set(["*", ...extra]));
return Array.from(new Set([...base, ...extra]));
}
function pickSandboxToolPolicy(config) {
if (!config) return;
const allow = Array.isArray(config.allow) ? unionAllow(config.allow, config.alsoAllow) : Array.isArray(config.alsoAllow) && config.alsoAllow.length > 0 ? unionAllow(void 0, config.alsoAllow) : void 0;
const deny = Array.isArray(config.deny) ? config.deny : void 0;
if (!allow && !deny) return;
return {
allow,
deny
};
}
//#endregion
//#region src/agents/pi-tools.policy.ts
function makeToolPolicyMatcher(policy) {
const deny = compileGlobPatterns({
raw: expandToolGroups(policy.deny ?? []),
normalize: normalizeToolName
});
const allow = compileGlobPatterns({
raw: expandToolGroups(policy.allow ?? []),
normalize: normalizeToolName
});
return (name) => {
const normalized = normalizeToolName(name);
if (matchesAnyGlobPattern(normalized, deny)) return false;
if (allow.length === 0) return true;
if (matchesAnyGlobPattern(normalized, allow)) return true;
if (normalized === "apply_patch" && matchesAnyGlobPattern("exec", allow)) return true;
return false;
};
}
/**
* Tools always denied for sub-agents regardless of depth.
* These are system-level or interactive tools that sub-agents should never use.
*/
const SUBAGENT_TOOL_DENY_ALWAYS = [
"gateway",
"agents_list",
"whatsapp_login",
"session_status",
"cron",
"memory_search",
"memory_get",
"sessions_send"
];
/**
* Additional tools denied for leaf sub-agents (depth >= maxSpawnDepth).
* These are tools that only make sense for orchestrator sub-agents that can spawn children.
*/
const SUBAGENT_TOOL_DENY_LEAF = [
"sessions_list",
"sessions_history",
"sessions_spawn"
];
/**
* Build the deny list for a sub-agent at a given depth.
*
* - Depth 1 with maxSpawnDepth >= 2 (orchestrator): allowed to use sessions_spawn,
* subagents, sessions_list, sessions_history so it can manage its children.
* - Depth >= maxSpawnDepth (leaf): denied sessions_spawn and
* session management tools. Still allowed subagents (for list/status visibility).
*/
function resolveSubagentDenyList(depth, maxSpawnDepth) {
if (depth >= Math.max(1, Math.floor(maxSpawnDepth))) return [...SUBAGENT_TOOL_DENY_ALWAYS, ...SUBAGENT_TOOL_DENY_LEAF];
return [...SUBAGENT_TOOL_DENY_ALWAYS];
}
function resolveSubagentToolPolicy(cfg, depth) {
const configured = cfg?.tools?.subagents?.tools;
const maxSpawnDepth = cfg?.agents?.defaults?.subagents?.maxSpawnDepth ?? DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH;
const baseDeny = resolveSubagentDenyList(typeof depth === "number" && depth >= 0 ? depth : 1, maxSpawnDepth);
const allow = Array.isArray(configured?.allow) ? configured.allow : void 0;
const alsoAllow = Array.isArray(configured?.alsoAllow) ? configured.alsoAllow : void 0;
const explicitAllow = new Set([...allow ?? [], ...alsoAllow ?? []].map((toolName) => normalizeToolName(toolName)));
const deny = [...baseDeny.filter((toolName) => !explicitAllow.has(normalizeToolName(toolName))), ...Array.isArray(configured?.deny) ? configured.deny : []];
return {
allow: allow && alsoAllow ? Array.from(new Set([...allow, ...alsoAllow])) : allow,
deny
};
}
function isToolAllowedByPolicyName(name, policy) {
if (!policy) return true;
return makeToolPolicyMatcher(policy)(name);
}
function filterToolsByPolicy(tools, policy) {
if (!policy) return tools;
const matcher = makeToolPolicyMatcher(policy);
return tools.filter((tool) => matcher(tool.name));
}
function normalizeProviderKey(value) {
return value.trim().toLowerCase();
}
function resolveGroupContextFromSessionKey(sessionKey) {
const raw = (sessionKey ?? "").trim();
if (!raw) return {};
const parts = (resolveThreadParentSessionKey(raw) ?? raw).split(":").filter(Boolean);
let body = parts[0] === "agent" ? parts.slice(2) : parts;
if (body[0] === "subagent") body = body.slice(1);
if (body.length < 3) return {};
const [channel, kind, ...rest] = body;
if (kind !== "group" && kind !== "channel") return {};
const groupId = rest.join(":").trim();
if (!groupId) return {};
return {
channel: channel.trim().toLowerCase(),
groupId
};
}
function resolveProviderToolPolicy(params) {
const provider = params.modelProvider?.trim();
if (!provider || !params.byProvider) return;
const entries = Object.entries(params.byProvider);
if (entries.length === 0) return;
const lookup = /* @__PURE__ */ new Map();
for (const [key, value] of entries) {
const normalized = normalizeProviderKey(key);
if (!normalized) continue;
lookup.set(normalized, value);
}
const normalizedProvider = normalizeProviderKey(provider);
const rawModelId = params.modelId?.trim().toLowerCase();
const fullModelId = rawModelId && !rawModelId.includes("/") ? `${normalizedProvider}/${rawModelId}` : rawModelId;
const candidates = [...fullModelId ? [fullModelId] : [], normalizedProvider];
for (const key of candidates) {
const match = lookup.get(key);
if (match) return match;
}
}
function resolveEffectiveToolPolicy(params) {
const agentId = (typeof params.agentId === "string" && params.agentId.trim() ? normalizeAgentId(params.agentId) : void 0) ?? (params.sessionKey ? resolveAgentIdFromSessionKey(params.sessionKey) : void 0);
const agentTools = (params.config && agentId ? resolveAgentConfig(params.config, agentId) : void 0)?.tools;
const globalTools = params.config?.tools;
const profile = agentTools?.profile ?? globalTools?.profile;
const providerPolicy = resolveProviderToolPolicy({
byProvider: globalTools?.byProvider,
modelProvider: params.modelProvider,
modelId: params.modelId
});
const agentProviderPolicy = resolveProviderToolPolicy({
byProvider: agentTools?.byProvider,
modelProvider: params.modelProvider,
modelId: params.modelId
});
return {
agentId,
globalPolicy: pickSandboxToolPolicy(globalTools),
globalProviderPolicy: pickSandboxToolPolicy(providerPolicy),
agentPolicy: pickSandboxToolPolicy(agentTools),
agentProviderPolicy: pickSandboxToolPolicy(agentProviderPolicy),
profile,
providerProfile: agentProviderPolicy?.profile ?? providerPolicy?.profile,
profileAlsoAllow: Array.isArray(agentTools?.alsoAllow) ? agentTools?.alsoAllow : Array.isArray(globalTools?.alsoAllow) ? globalTools?.alsoAllow : void 0,
providerProfileAlsoAllow: Array.isArray(agentProviderPolicy?.alsoAllow) ? agentProviderPolicy?.alsoAllow : Array.isArray(providerPolicy?.alsoAllow) ? providerPolicy?.alsoAllow : void 0
};
}
function resolveGroupToolPolicy(params) {
if (!params.config) return;
const sessionContext = resolveGroupContextFromSessionKey(params.sessionKey);
const spawnedContext = resolveGroupContextFromSessionKey(params.spawnedBy);
const groupId = params.groupId ?? sessionContext.groupId ?? spawnedContext.groupId;
if (!groupId) return;
const channel = normalizeMessageChannel(params.messageProvider ?? sessionContext.channel ?? spawnedContext.channel);
if (!channel) return;
let dock;
try {
dock = getChannelDock(channel);
} catch {
dock = void 0;
}
return pickSandboxToolPolicy(dock?.groups?.resolveToolPolicy?.({
cfg: params.config,
groupId,
groupChannel: params.groupChannel,
groupSpace: params.groupSpace,
accountId: params.accountId,
senderId: params.senderId,
senderName: params.senderName,
senderUsername: params.senderUsername,
senderE164: params.senderE164
}) ?? resolveChannelGroupToolsPolicy({
cfg: params.config,
channel,
groupId,
accountId: params.accountId,
senderId: params.senderId,
senderName: params.senderName,
senderUsername: params.senderUsername,
senderE164: params.senderE164
}));
}
function isToolAllowedByPolicies(name, policies) {
return policies.every((policy) => isToolAllowedByPolicyName(name, policy));
}
//#endregion
export { resolveSubagentToolPolicy as a, resolveGroupToolPolicy as i, isToolAllowedByPolicies as n, pickSandboxToolPolicy as o, resolveEffectiveToolPolicy as r, filterToolsByPolicy as t };