const AGENT_TEAMS_PREFIXES = ['mcp__agent-teams__', 'mcp__agent_teams__'] as const; const TASK_BOUNDARY_TOOL_NAMES = ['task_start', 'task_complete', 'task_set_status'] as const; const TASK_BOUNDARY_TOOL_SET = new Set(TASK_BOUNDARY_TOOL_NAMES); function escapeRegex(value: string): string { return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } const TASK_BOUNDARY_TOOL_LINE_PATTERN = new RegExp( `"name"\\s*:\\s*"(?:${[ ...TASK_BOUNDARY_TOOL_NAMES, ...TASK_BOUNDARY_TOOL_NAMES.map((toolName) => `proxy_${toolName}`), ...AGENT_TEAMS_PREFIXES.flatMap((prefix) => TASK_BOUNDARY_TOOL_NAMES.map((toolName) => `${prefix}${toolName}`) ), ...AGENT_TEAMS_PREFIXES.flatMap((prefix) => TASK_BOUNDARY_TOOL_NAMES.map((toolName) => `proxy_${prefix}${toolName}`) ), ] .map(escapeRegex) .join('|')})"` ); export function canonicalizeAgentTeamsToolName(rawName: string): string { const normalized = rawName.replace(/^proxy_/, ''); for (const prefix of AGENT_TEAMS_PREFIXES) { if (normalized.startsWith(prefix)) { return normalized.slice(prefix.length); } } return normalized; } export function isAgentTeamsTaskBoundaryToolName(rawName: string): boolean { return TASK_BOUNDARY_TOOL_SET.has(canonicalizeAgentTeamsToolName(rawName)); } export function lineHasAgentTeamsTaskBoundaryToolName(line: string): boolean { return TASK_BOUNDARY_TOOL_LINE_PATTERN.test(line); }