UNPKG

@gguf/claw

Version:

Multi-channel AI gateway with extensible messaging integrations

236 lines (232 loc) 9.36 kB
import { S as resolveThreadParentSessionKey, d as resolveAgentIdFromSessionKey } from "./session-key-BGiG_JcT.js"; import { r as resolveAgentConfig } from "./agent-scope-RzK9Zcks.js"; import { l as normalizeMessageChannel } from "./message-channel-CVHJDItx.js"; import { r as normalizeChannelId } from "./plugins-RqhjLCb6.js"; import { C as compileGlobPatterns, b as normalizeToolName, v as expandToolGroups, w as matchesAnyGlobPattern } from "./sandbox-CO-R8v6J.js"; import { o as resolveChannelGroupToolsPolicy, t as getChannelDock } from "./dock-BZuwgj1O.js"; //#region src/config/commands.ts function resolveAutoDefault(providerId) { const id = normalizeChannelId(providerId); if (!id) return false; if (id === "discord" || id === "telegram") return true; if (id === "slack") return false; return false; } function resolveNativeSkillsEnabled(params) { return resolveNativeCommandSetting(params); } function resolveNativeCommandsEnabled(params) { return resolveNativeCommandSetting(params); } function resolveNativeCommandSetting(params) { const { providerId, providerSetting, globalSetting } = params; const setting = providerSetting === void 0 ? globalSetting : providerSetting; if (setting === true) return true; if (setting === false) return false; return resolveAutoDefault(providerId); } function isNativeCommandsExplicitlyDisabled(params) { const { providerSetting, globalSetting } = params; if (providerSetting === false) return true; if (providerSetting === void 0) return globalSetting === false; return false; } function isRestartEnabled(config) { return config?.commands?.restart !== false; } //#endregion //#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 ?? 1; const deny = [...resolveSubagentDenyList(typeof depth === "number" && depth >= 0 ? depth : 1, maxSpawnDepth), ...Array.isArray(configured?.deny) ? configured.deny : []]; return { allow: Array.isArray(configured?.allow) ? configured.allow : void 0, 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 = 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, isRestartEnabled as c, resolveGroupToolPolicy as i, resolveNativeCommandsEnabled as l, isToolAllowedByPolicies as n, pickSandboxToolPolicy as o, resolveEffectiveToolPolicy as r, isNativeCommandsExplicitlyDisabled as s, filterToolsByPolicy as t, resolveNativeSkillsEnabled as u };