export type ToolProfileId = "minimal" | "coding" | "messaging" | "full"; type ToolProfilePolicy = { allow?: string[]; deny?: string[]; }; const TOOL_NAME_ALIASES: Record = { bash: "exec", "apply-patch": "apply_patch", }; export const TOOL_GROUPS: Record = { // NOTE: Keep canonical (lowercase) tool names here. "group:memory": ["memory_search", "memory_get"], "group:web": ["web_search", "web_fetch"], // Basic workspace/file tools "group:fs": ["read", "write", "edit", "apply_patch"], // Host/runtime execution tools "group:runtime": ["exec", "bash", "process"], // Session management tools "group:sessions": [ "sessions_list", "sessions_history", "sessions_send", "sessions_spawn", "session_status", ], // UI helpers "group:ui": ["browser", "canvas"], // Automation + infra "group:automation": ["cron", "gateway"], // Messaging surface "group:messaging": ["message"], // Nodes + device tools "group:nodes": ["nodes"], // All Clawdbot native tools (excludes provider plugins). "group:clawdbot": [ "browser", "canvas", "nodes", "cron", "message", "gateway", "agents_list", "sessions_list", "sessions_history", "sessions_send", "sessions_spawn", "session_status", "memory_search", "memory_get", "web_search", "web_fetch", "image", ], }; const TOOL_PROFILES: Record = { minimal: { allow: ["session_status"], }, coding: { allow: ["group:fs", "group:runtime", "group:sessions", "group:memory", "image"], }, messaging: { allow: [ "group:messaging", "sessions_list", "sessions_history", "sessions_send", "session_status", ], }, full: {}, }; export function normalizeToolName(name: string) { const normalized = name.trim().toLowerCase(); return TOOL_NAME_ALIASES[normalized] ?? normalized; } export function normalizeToolList(list?: string[]) { if (!list) return []; return list.map(normalizeToolName).filter(Boolean); } export function expandToolGroups(list?: string[]) { const normalized = normalizeToolList(list); const expanded: string[] = []; for (const value of normalized) { const group = TOOL_GROUPS[value]; if (group) { expanded.push(...group); continue; } expanded.push(value); } return Array.from(new Set(expanded)); } export function resolveToolProfilePolicy(profile?: string): ToolProfilePolicy | undefined { if (!profile) return undefined; const resolved = TOOL_PROFILES[profile as ToolProfileId]; if (!resolved) return undefined; if (!resolved.allow && !resolved.deny) return undefined; return { allow: resolved.allow ? [...resolved.allow] : undefined, deny: resolved.deny ? [...resolved.deny] : undefined, }; }