squads-cli 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +196 -1152
  2. package/dist/auth-YW3UPFSB.js +23 -0
  3. package/dist/autonomy-BWTVDEAT.js +102 -0
  4. package/dist/autonomy-BWTVDEAT.js.map +1 -0
  5. package/dist/chunk-3KCWNZWW.js +401 -0
  6. package/dist/chunk-3KCWNZWW.js.map +1 -0
  7. package/dist/chunk-67RO2HKR.js +174 -0
  8. package/dist/chunk-67RO2HKR.js.map +1 -0
  9. package/dist/chunk-7JVD7RD4.js +275 -0
  10. package/dist/chunk-7JVD7RD4.js.map +1 -0
  11. package/dist/chunk-BODLDQY7.js +452 -0
  12. package/dist/chunk-BODLDQY7.js.map +1 -0
  13. package/dist/chunk-FFFCFZ6A.js +121 -0
  14. package/dist/chunk-FFFCFZ6A.js.map +1 -0
  15. package/dist/chunk-FIWT2NMM.js +165 -0
  16. package/dist/chunk-FIWT2NMM.js.map +1 -0
  17. package/dist/chunk-L6GQCHDF.js +222 -0
  18. package/dist/chunk-L6GQCHDF.js.map +1 -0
  19. package/dist/{chunk-O7UV3FWI.js → chunk-LDM62TIX.js} +2 -2
  20. package/dist/chunk-LDM62TIX.js.map +1 -0
  21. package/dist/chunk-LOA3KWYJ.js +294 -0
  22. package/dist/chunk-LOA3KWYJ.js.map +1 -0
  23. package/dist/chunk-NA45DFXY.js +616 -0
  24. package/dist/chunk-NA45DFXY.js.map +1 -0
  25. package/dist/{chunk-4CMAEQQY.js → chunk-NQN6JPI7.js} +4 -3
  26. package/dist/chunk-NQN6JPI7.js.map +1 -0
  27. package/dist/chunk-OQJHPULO.js +103 -0
  28. package/dist/chunk-OQJHPULO.js.map +1 -0
  29. package/dist/chunk-QHNUMM4V.js +87 -0
  30. package/dist/chunk-QHNUMM4V.js.map +1 -0
  31. package/dist/chunk-RM6BWILN.js +74 -0
  32. package/dist/chunk-RM6BWILN.js.map +1 -0
  33. package/dist/chunk-WBR5J7EX.js +90 -0
  34. package/dist/chunk-WBR5J7EX.js.map +1 -0
  35. package/dist/chunk-Z2UKDBNL.js +162 -0
  36. package/dist/chunk-Z2UKDBNL.js.map +1 -0
  37. package/dist/cli.js +2136 -12600
  38. package/dist/cli.js.map +1 -1
  39. package/dist/context-M2A2DOFV.js +291 -0
  40. package/dist/context-M2A2DOFV.js.map +1 -0
  41. package/dist/context-feed-JMNW4GAM.js +391 -0
  42. package/dist/context-feed-JMNW4GAM.js.map +1 -0
  43. package/dist/cost-N37I4UTA.js +274 -0
  44. package/dist/cost-N37I4UTA.js.map +1 -0
  45. package/dist/create-554W5HNU.js +286 -0
  46. package/dist/create-554W5HNU.js.map +1 -0
  47. package/dist/daemon-XWPQPPPN.js +546 -0
  48. package/dist/daemon-XWPQPPPN.js.map +1 -0
  49. package/dist/dashboard-L7YKVQEB.js +945 -0
  50. package/dist/dashboard-L7YKVQEB.js.map +1 -0
  51. package/dist/dashboard-MFNRLCEE.js +794 -0
  52. package/dist/dashboard-MFNRLCEE.js.map +1 -0
  53. package/dist/doctor-RG75M5RO.js +346 -0
  54. package/dist/doctor-RG75M5RO.js.map +1 -0
  55. package/dist/env-config-KCLDBKYX.js +21 -0
  56. package/dist/exec-JQKBF7BL.js +197 -0
  57. package/dist/exec-JQKBF7BL.js.map +1 -0
  58. package/dist/feedback-KA2UYBZG.js +229 -0
  59. package/dist/feedback-KA2UYBZG.js.map +1 -0
  60. package/dist/github-UQTM5KMS.js +23 -0
  61. package/dist/goal-EOPC5ZCD.js +168 -0
  62. package/dist/goal-EOPC5ZCD.js.map +1 -0
  63. package/dist/health-3FZDOSR5.js +209 -0
  64. package/dist/health-3FZDOSR5.js.map +1 -0
  65. package/dist/history-TFVXJEDH.js +229 -0
  66. package/dist/history-TFVXJEDH.js.map +1 -0
  67. package/dist/index.js +1 -1
  68. package/dist/index.js.map +1 -1
  69. package/dist/init-UOWTNMIE.js +747 -0
  70. package/dist/init-UOWTNMIE.js.map +1 -0
  71. package/dist/kpi-2SQ2WCVT.js +413 -0
  72. package/dist/kpi-2SQ2WCVT.js.map +1 -0
  73. package/dist/learn-6ERTERAO.js +269 -0
  74. package/dist/learn-6ERTERAO.js.map +1 -0
  75. package/dist/list-KSOMUBMB.js +92 -0
  76. package/dist/list-KSOMUBMB.js.map +1 -0
  77. package/dist/login-ST6PAXYE.js +155 -0
  78. package/dist/login-ST6PAXYE.js.map +1 -0
  79. package/dist/memory-3CSNKXIL.js +562 -0
  80. package/dist/memory-3CSNKXIL.js.map +1 -0
  81. package/dist/progress-FKG4V2VH.js +202 -0
  82. package/dist/progress-FKG4V2VH.js.map +1 -0
  83. package/dist/providers-66PDCORB.js +65 -0
  84. package/dist/providers-66PDCORB.js.map +1 -0
  85. package/dist/results-2MJFLWEO.js +224 -0
  86. package/dist/results-2MJFLWEO.js.map +1 -0
  87. package/dist/run-72OQLH5A.js +2685 -0
  88. package/dist/run-72OQLH5A.js.map +1 -0
  89. package/dist/session-6H67XPAQ.js +64 -0
  90. package/dist/session-6H67XPAQ.js.map +1 -0
  91. package/dist/{chunk-NHGLXN2F.js → sessions-GVQIMN4W.js} +23 -459
  92. package/dist/sessions-GVQIMN4W.js.map +1 -0
  93. package/dist/{squad-parser-4BI3G4RS.js → squad-parser-CM3HOIWM.js} +2 -2
  94. package/dist/squad-parser-CM3HOIWM.js.map +1 -0
  95. package/dist/stats-ONZI557Q.js +335 -0
  96. package/dist/stats-ONZI557Q.js.map +1 -0
  97. package/dist/status-FYH42FTB.js +346 -0
  98. package/dist/status-FYH42FTB.js.map +1 -0
  99. package/dist/sync-HJZJNXHW.js +800 -0
  100. package/dist/sync-HJZJNXHW.js.map +1 -0
  101. package/dist/update-B4WMUOPO.js +83 -0
  102. package/dist/update-B4WMUOPO.js.map +1 -0
  103. package/dist/{update-ALJKFFM7.js → update-L7FGHN6W.js} +2 -2
  104. package/dist/update-L7FGHN6W.js.map +1 -0
  105. package/package.json +18 -10
  106. package/dist/chunk-4CMAEQQY.js.map +0 -1
  107. package/dist/chunk-NHGLXN2F.js.map +0 -1
  108. package/dist/chunk-O7UV3FWI.js.map +0 -1
  109. package/dist/sessions-6PB7ALCE.js +0 -16
  110. /package/dist/{sessions-6PB7ALCE.js.map → auth-YW3UPFSB.js.map} +0 -0
  111. /package/dist/{squad-parser-4BI3G4RS.js.map → env-config-KCLDBKYX.js.map} +0 -0
  112. /package/dist/{update-ALJKFFM7.js.map → github-UQTM5KMS.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/run.ts","../src/lib/permissions.ts","../src/lib/workflow.ts","../src/lib/conversation.ts"],"sourcesContent":["import ora from 'ora';\nimport { spawn, execSync } from 'child_process';\nimport { join, dirname } from 'path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, cpSync, unlinkSync } from 'fs';\nimport {\n findSquadsDir,\n loadSquad,\n listAgents,\n loadAgentDefinition,\n parseAgentProvider,\n EffortLevel,\n Squad,\n} from '../lib/squad-parser.js';\nimport { resolveMcpConfigPath } from '../lib/mcp-config.js';\nimport {\n buildContextFromSquad,\n validateExecution,\n formatViolations,\n ExecutionRequest\n} from '../lib/permissions.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { track, Events, flushEvents } from '../lib/telemetry.js';\nimport { parseCooldown } from '../lib/cron.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport {\n getCLIConfig,\n isProviderCLIAvailable,\n} from '../lib/llm-clis.js';\nimport { detectProviderFromModel } from '../lib/providers.js';\nimport { loadSession, isLoggedIn } from '../lib/auth.js';\nimport { getApiUrl, getBridgeUrl } from '../lib/env-config.js';\nimport { runConversation, saveTranscript, type ConversationOptions } from '../lib/workflow.js';\nimport { reportExecutionStart, reportConversationResult, pushCognitionSignal } from '../lib/api-client.js';\nimport { getBotGitEnv, getBotPushUrl, getCoAuthorTrailer } from '../lib/github.js';\nimport { homedir } from 'os';\n\n// ── Operational constants (no magic numbers) ──────────────────────────\nconst CLOUD_POLL_INTERVAL_MS = 3000;\nconst CLOUD_POLL_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes max poll\nconst DEFAULT_LEARNINGS_LIMIT = 5;\nconst DEFAULT_CONTEXT_TOKENS = 8000;\nconst DEFAULT_FALLBACK_CHARS = 2000;\nconst MAX_AGENT_BRIEFS = 3;\nconst MAX_SQUAD_BRIEFS = 2;\nconst MAX_LEARNINGS_CHARS = 1500;\nconst MAX_LEAD_STATE_CHARS = 1000;\nconst EXECUTION_EVENT_TIMEOUT_MS = 5000;\nconst VERIFICATION_STATE_MAX_CHARS = 2000;\nconst VERIFICATION_EXEC_TIMEOUT_MS = 30000;\nconst DRYRUN_DEF_MAX_CHARS = 500;\nconst DRYRUN_CONTEXT_MAX_CHARS = 800;\nconst DEFAULT_SCHEDULED_COOLDOWN_MS = 6 * 60 * 60 * 1000; // 6 hours\nconst DEFAULT_TIMEOUT_MINUTES = 30;\nconst SOFT_DEADLINE_RATIO = 0.7;\nconst LOG_FILE_INIT_DELAY_MS = 500;\nconst VERBOSE_COMMAND_MAX_CHARS = 50;\n\ninterface RunOptions {\n verbose?: boolean;\n dryRun?: boolean;\n agent?: string;\n timeout?: number; // minutes, default 30\n execute?: boolean;\n parallel?: boolean; // Run all agents in parallel\n lead?: boolean; // Run as lead session using Task tool for parallelization\n foreground?: boolean; // Run in foreground (deprecated, now default)\n background?: boolean; // Run in background (detached process)\n watch?: boolean; // Run in background but tail the log\n useApi?: boolean; // Use API credits instead of subscription\n effort?: EffortLevel; // Effort level: high, medium, low\n skills?: string[]; // Skills to load (skill IDs or local paths)\n trigger?: 'manual' | 'scheduled' | 'event' | 'smart'; // Trigger source for telemetry\n provider?: string; // LLM provider: anthropic, google, openai, mistral, xai, aider, ollama\n model?: string; // Model to use (Claude aliases or full model IDs like gemini-2.5-flash)\n verify?: boolean; // Post-execution verification (default true, --no-verify to skip)\n cloud?: boolean; // Dispatch to cloud worker via API instead of local execution\n conversation?: boolean; // Run squad as multi-agent conversation (default for squad runs)\n task?: string; // Founder directive — replaces lead briefing in conversation mode\n maxTurns?: number; // Max conversation turns (default: 20)\n costCeiling?: number; // Cost ceiling in USD (default: 25)\n}\n\n/**\n * Execution context for telemetry tagging\n * Passed to Claude via environment variables for per-agent cost tracking\n */\ninterface ExecutionContext {\n squad: string;\n agent: string;\n taskType: 'evaluation' | 'execution' | 'research' | 'lead';\n trigger: 'manual' | 'scheduled' | 'event' | 'smart';\n executionId: string;\n}\n\n/**\n * Register execution context with the squads-bridge for telemetry\n * This allows the bridge to tag incoming OTel data with correct squad/agent info\n */\nasync function registerContextWithBridge(ctx: ExecutionContext): Promise<boolean> {\n const bridgeUrl = getBridgeUrl();\n\n try {\n const response = await fetch(`${bridgeUrl}/api/context/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n execution_id: ctx.executionId,\n squad: ctx.squad,\n agent: ctx.agent,\n task_type: ctx.taskType,\n trigger: ctx.trigger,\n }),\n });\n\n if (!response.ok) {\n // Non-fatal - continue even if bridge is unavailable\n return false;\n }\n return true;\n } catch {\n // Bridge not available - continue anyway\n return false;\n }\n}\n\n/**\n * Pre-execution gate check via bridge API.\n * Checks quota (monthly spend) and cooldown before running an agent.\n * Fails open (allows execution) if bridge is unavailable.\n */\ninterface PreflightResult {\n allowed: boolean;\n gates: {\n quota?: { ok: boolean; used: number; limit: number; remaining: number; period: string };\n cooldown?: { ok: boolean; elapsed_sec: number | null; min_gap_sec: number };\n };\n error?: string;\n}\n\nasync function checkPreflightGates(squad: string, agent: string): Promise<PreflightResult> {\n const bridgeUrl = getBridgeUrl();\n\n try {\n const response = await fetch(`${bridgeUrl}/api/execution/preflight`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ squad, agent }),\n });\n\n if (!response.ok) {\n // Fail open if bridge returns error\n return { allowed: true, gates: {} };\n }\n\n return await response.json() as PreflightResult;\n } catch {\n // Fail open if bridge is unavailable\n return { allowed: true, gates: {} };\n }\n}\n\n/**\n * Fetch relevant learnings from bridge for prompt injection.\n * Returns empty array if bridge is unavailable.\n */\ninterface Learning {\n content: string;\n importance: string;\n created_at: string;\n}\n\nasync function fetchLearnings(squad: string, limit = DEFAULT_LEARNINGS_LIMIT): Promise<Learning[]> {\n const bridgeUrl = getBridgeUrl();\n\n try {\n const response = await fetch(\n `${bridgeUrl}/api/learnings/relevant?squad=${encodeURIComponent(squad)}&limit=${limit}`\n );\n\n if (!response.ok) {\n return [];\n }\n\n const data = await response.json() as { learnings: Learning[] };\n return data.learnings || [];\n } catch {\n return [];\n }\n}\n\n/**\n * Load approval/escalation instructions from config file.\n * Returns the instructions content or empty string if not found.\n */\nfunction loadApprovalInstructions(): string {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return '';\n\n // Try .agents/config/approval-instructions.md\n const instructionsPath = join(dirname(squadsDir), 'config', 'approval-instructions.md');\n\n if (existsSync(instructionsPath)) {\n try {\n return readFileSync(instructionsPath, 'utf-8');\n } catch {\n return '';\n }\n }\n\n return '';\n}\n\n/**\n * Load post-execution instructions from .agents/config/post-execution.md.\n * Substitutes {{squadName}} and {{agentName}} placeholders.\n * Falls back to a minimal inline default if file not found.\n */\nfunction loadPostExecution(squadName: string, agentName: string): string {\n const squadsDir = findSquadsDir();\n if (squadsDir) {\n const postExecPath = join(dirname(squadsDir), 'config', 'post-execution.md');\n if (existsSync(postExecPath)) {\n try {\n const template = readFileSync(postExecPath, 'utf-8');\n return template\n .replace(/\\{\\{squadName\\}\\}/g, squadName)\n .replace(/\\{\\{agentName\\}\\}/g, agentName);\n } catch { /* fall through */ }\n }\n }\n // Minimal fallback if template file missing\n return `After completion:\n- Create a branch, commit with Conventional Commits, push, and open a PR targeting develop\n- NEVER commit to main directly\n- Type /exit when done`;\n}\n\n/**\n * Gather squad context for prompt injection.\n * Includes SQUAD.md mission/goals, agent's existing state, and relevant briefs.\n * This ensures agents build on existing knowledge rather than starting from scratch.\n */\nfunction gatherSquadContext(\n squadName: string,\n agentName: string,\n options: { verbose?: boolean; maxTokens?: number; agentPath?: string } = {}\n): string {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return '';\n\n const memoryDir = findMemoryDir();\n const maxTokens = options.maxTokens || DEFAULT_CONTEXT_TOKENS;\n const sections: string[] = [];\n let estimatedTokens = 0;\n\n // Helper to estimate tokens (rough: ~4 chars per token)\n const estimateTokens = (text: string) => Math.ceil(text.length / 4);\n\n // 1. SQUAD.md - mission, goals, and key context\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (existsSync(squadFile)) {\n try {\n const squadContent = readFileSync(squadFile, 'utf-8');\n // Extract key sections (skip frontmatter YAML, focus on mission/goals/output)\n const missionMatch = squadContent.match(/## Mission[\\s\\S]*?(?=\\n## |$)/i);\n const goalsMatch = squadContent.match(/## (?:Goals|Objectives)[\\s\\S]*?(?=\\n## |$)/i);\n const outputMatch = squadContent.match(/## Output[\\s\\S]*?(?=\\n## |$)/i);\n const contextMatch = squadContent.match(/## Context[\\s\\S]*?(?=\\n## |$)/i);\n\n let squadContext = '';\n if (missionMatch) squadContext += missionMatch[0] + '\\n';\n if (goalsMatch) squadContext += goalsMatch[0] + '\\n';\n if (outputMatch) squadContext += outputMatch[0] + '\\n';\n if (contextMatch) squadContext += contextMatch[0] + '\\n';\n\n // If no structured sections found, include first 2000 chars\n if (!squadContext && squadContent.length > 0) {\n squadContext = squadContent.substring(0, DEFAULT_FALLBACK_CHARS);\n }\n\n if (squadContext) {\n const tokens = estimateTokens(squadContext);\n if (estimatedTokens + tokens < maxTokens) {\n sections.push(`## Squad Context (${squadName})\\n${squadContext.trim()}`);\n estimatedTokens += tokens;\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n\n // 2. Agent's existing state (state.md) - what the agent knows\n if (memoryDir) {\n const stateFile = join(memoryDir, squadName, agentName, 'state.md');\n if (existsSync(stateFile)) {\n try {\n const stateContent = readFileSync(stateFile, 'utf-8');\n const tokens = estimateTokens(stateContent);\n\n if (estimatedTokens + tokens < maxTokens && stateContent.trim()) {\n sections.push(`## Your Previous State\\nThis is your memory from your last execution:\\n\\n${stateContent.trim()}`);\n estimatedTokens += tokens;\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n // 3. Related briefs (if any exist in memory/squad/agent/briefs/)\n if (memoryDir) {\n const briefsDir = join(memoryDir, squadName, agentName, 'briefs');\n if (existsSync(briefsDir)) {\n try {\n const briefFiles = readdirSync(briefsDir)\n .filter(f => f.endsWith('.md'))\n .slice(0, MAX_AGENT_BRIEFS);\n\n for (const briefFile of briefFiles) {\n const briefPath = join(briefsDir, briefFile);\n const briefContent = readFileSync(briefPath, 'utf-8');\n const tokens = estimateTokens(briefContent);\n\n if (estimatedTokens + tokens < maxTokens) {\n sections.push(`## Brief: ${briefFile.replace('.md', '')}\\n${briefContent.trim()}`);\n estimatedTokens += tokens;\n } else {\n break; // Stop adding briefs if we're over budget\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n // 4. Squad-level briefs (shared context for all agents in squad)\n if (memoryDir) {\n const squadBriefsDir = join(memoryDir, squadName, '_briefs');\n if (existsSync(squadBriefsDir)) {\n try {\n const squadBriefs = readdirSync(squadBriefsDir)\n .filter(f => f.endsWith('.md'))\n .slice(0, MAX_SQUAD_BRIEFS);\n\n for (const briefFile of squadBriefs) {\n const briefPath = join(squadBriefsDir, briefFile);\n const briefContent = readFileSync(briefPath, 'utf-8');\n const tokens = estimateTokens(briefContent);\n\n if (estimatedTokens + tokens < maxTokens) {\n sections.push(`## Squad Brief: ${briefFile.replace('.md', '')}\\n${briefContent.trim()}`);\n estimatedTokens += tokens;\n } else {\n break;\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n // 5. Daily briefing (cross-squad context)\n if (memoryDir) {\n const briefingPath = join(memoryDir, 'daily-briefing.md');\n if (existsSync(briefingPath)) {\n try {\n const briefingContent = readFileSync(briefingPath, 'utf-8');\n if (briefingContent.trim()) {\n const tokens = estimateTokens(briefingContent);\n if (estimatedTokens + tokens < maxTokens) {\n sections.push(`## Daily Briefing\\n${briefingContent.trim()}`);\n estimatedTokens += tokens;\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n // 6. Cross-squad learnings (from context_from in agent frontmatter)\n if (memoryDir && options.agentPath) {\n const frontmatter = parseAgentFrontmatter(options.agentPath);\n if (frontmatter.context_from && frontmatter.context_from.length > 0) {\n for (const relatedSquad of frontmatter.context_from) {\n // Related squad shared learnings\n const learningsPath = join(memoryDir, relatedSquad, 'shared', 'learnings.md');\n if (existsSync(learningsPath)) {\n try {\n let learningsContent = readFileSync(learningsPath, 'utf-8');\n if (learningsContent.trim()) {\n if (learningsContent.length > MAX_LEARNINGS_CHARS) {\n learningsContent = learningsContent.slice(0, MAX_LEARNINGS_CHARS) + '\\n...(truncated)';\n }\n const tokens = estimateTokens(learningsContent);\n if (estimatedTokens + tokens < maxTokens) {\n sections.push(`## ${relatedSquad} Squad Learnings\\n${learningsContent.trim()}`);\n estimatedTokens += tokens;\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n\n // Related squad lead state\n const leadStatePath = join(memoryDir, relatedSquad, `${relatedSquad}-lead`, 'state.md');\n if (existsSync(leadStatePath)) {\n try {\n let leadState = readFileSync(leadStatePath, 'utf-8');\n if (leadState.trim()) {\n if (leadState.length > MAX_LEAD_STATE_CHARS) {\n leadState = leadState.slice(0, MAX_LEAD_STATE_CHARS) + '\\n...(truncated)';\n }\n const tokens = estimateTokens(leadState);\n if (estimatedTokens + tokens < maxTokens) {\n sections.push(`## ${relatedSquad} Lead State\\n${leadState.trim()}`);\n estimatedTokens += tokens;\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n }\n }\n\n if (sections.length === 0) {\n return '';\n }\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Context: ${sections.length} sections (~${estimatedTokens} tokens)${RESET}`);\n }\n\n return `\\n# EXISTING CONTEXT\\nBuild on this existing knowledge - do NOT start from scratch:\\n\\n${sections.join('\\n\\n')}\\n`;\n}\n\n/**\n * Generate a unique execution ID for telemetry tracking\n */\nfunction generateExecutionId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `exec_${timestamp}_${random}`;\n}\n\n/**\n * Select MCP config based on squad name and context\n * Uses three-tier resolution:\n * 1. Squad context.mcp from SQUAD.md frontmatter (dynamic)\n * 2. User override at ~/.claude/mcp-configs/{squad}.json\n * 3. Legacy hardcoded mapping (backward compatibility)\n * 4. Fallback to ~/.claude.json\n */\nfunction selectMcpConfig(squadName: string, squad?: Squad | null): string {\n // Tier 1 & 2: Use new context-based resolution if squad has context.mcp\n if (squad?.context?.mcp && squad.context.mcp.length > 0) {\n return resolveMcpConfigPath(squadName, squad.context.mcp);\n }\n\n // Tier 3: Legacy hardcoded mapping (for squads without context block)\n const home = process.env.HOME || '';\n const configsDir = join(home, '.claude', 'mcp-configs');\n\n const squadConfigs: Record<string, string> = {\n website: 'website.json',\n research: 'research.json',\n intelligence: 'research.json',\n analytics: 'data.json',\n engineering: 'data.json',\n };\n\n const configFile = squadConfigs[squadName.toLowerCase()];\n if (configFile) {\n const configPath = join(configsDir, configFile);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n\n // Tier 4: No MCP config — return empty string to skip --mcp-config flag.\n // Previously fell back to ~/.claude.json but that's Claude's settings file,\n // not an MCP config, and causes claude to exit silently with no output.\n return '';\n}\n\n/**\n * Detect task type from agent name patterns\n * - *-eval, *-critic, *-review → evaluation\n * - *-lead, *-orchestrator → lead\n * - *-research, *-analyst → research\n * - everything else → execution\n */\nfunction detectTaskType(agentName: string): ExecutionContext['taskType'] {\n const name = agentName.toLowerCase();\n if (name.includes('eval') || name.includes('critic') || name.includes('review') || name.includes('test')) {\n return 'evaluation';\n }\n if (name.includes('lead') || name.includes('orchestrator')) {\n return 'lead';\n }\n if (name.includes('research') || name.includes('analyst') || name.includes('intel')) {\n return 'research';\n }\n return 'execution';\n}\n\n/** Claude Code --model flag aliases */\ntype ClaudeModelAlias = 'opus' | 'sonnet' | 'haiku';\n\n/**\n * Map full model names to Claude Code --model aliases.\n * Claude Code only accepts: opus, sonnet, haiku (not full model IDs)\n */\nfunction getClaudeModelAlias(model: string): ClaudeModelAlias | undefined {\n const lower = model.toLowerCase();\n\n // Direct aliases\n if (lower === 'opus' || lower === 'sonnet' || lower === 'haiku') {\n return lower as ClaudeModelAlias;\n }\n\n // Full model name mapping\n if (lower.includes('opus')) return 'opus';\n if (lower.includes('sonnet')) return 'sonnet';\n if (lower.includes('haiku')) return 'haiku';\n\n // Unknown Claude model - let Claude Code handle it\n return undefined;\n}\n\n/**\n * Resolve model based on squad context and task type.\n * Priority: explicit --model flag > squad context routing > undefined (provider default)\n *\n * Supports multi-provider models:\n * - Anthropic: claude-opus-4-5, claude-sonnet-4, claude-3-5-haiku, opus, sonnet, haiku\n * - Google: gemini-2.5-flash, gemini-2.5-pro, gemini-2.0-flash\n * - Others: model names passed through to provider CLI\n *\n * Routing logic:\n * - evaluation (critics, tests) → cheap model - simple validation\n * - research (analysts, intel) → default model - balanced\n * - execution (builders, fixers) → default model - balanced\n * - lead (orchestrators) → expensive model - complex coordination\n */\nfunction resolveModel(\n explicitModel: string | undefined,\n squad: Squad | null,\n taskType: ExecutionContext['taskType']\n): string | undefined {\n // Explicit --model flag always wins\n if (explicitModel) {\n return explicitModel;\n }\n\n // No squad context = let provider decide\n const modelConfig = squad?.context?.model;\n if (!modelConfig) {\n return undefined;\n }\n\n // Route by task type\n switch (taskType) {\n case 'evaluation':\n // Critics/evals are simple - use cheap model\n return modelConfig.cheap || modelConfig.default;\n case 'lead':\n // Leads need complex reasoning - use expensive model\n return modelConfig.expensive || modelConfig.default;\n case 'research':\n case 'execution':\n default:\n // Default for most tasks\n return modelConfig.default;\n }\n}\n\n/**\n * Ensure the project directory is trusted in Claude's config.\n * This prevents the workspace trust dialog from blocking autonomous execution.\n */\nfunction ensureProjectTrusted(projectPath: string): void {\n const configPath = join(process.env.HOME || '', '.claude.json');\n\n if (!existsSync(configPath)) {\n // No Claude config yet - will be created on first interactive run\n return;\n }\n\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n\n if (!config.projects) {\n config.projects = {};\n }\n\n if (!config.projects[projectPath]) {\n config.projects[projectPath] = {};\n }\n\n // Mark as trusted for autonomous execution\n if (!config.projects[projectPath].hasTrustDialogAccepted) {\n config.projects[projectPath].hasTrustDialogAccepted = true;\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n }\n } catch {\n // Don't fail execution if we can't update config\n // The dialog will just appear\n }\n}\n\n/**\n * Get the project root directory (where .agents/ lives)\n */\nfunction getProjectRoot(): string {\n const squadsDir = findSquadsDir();\n if (squadsDir) {\n // .agents/squads -> .agents -> project root\n return dirname(dirname(squadsDir));\n }\n return process.cwd();\n}\n\ninterface ExecutionRecord {\n squadName: string;\n agentName: string;\n executionId: string;\n startTime: string;\n endTime?: string;\n durationMs?: number;\n status: 'running' | 'completed' | 'failed';\n trigger?: 'manual' | 'scheduled' | 'event' | 'smart';\n taskType?: 'evaluation' | 'execution' | 'research' | 'lead';\n outcome?: string;\n error?: string;\n}\n\nfunction getExecutionLogPath(squadName: string, agentName: string): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n return join(memoryDir, squadName, agentName, 'executions.md');\n}\n\nfunction logExecution(record: ExecutionRecord): void {\n const logPath = getExecutionLogPath(record.squadName, record.agentName);\n if (!logPath) return;\n\n const dir = dirname(logPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n let content = '';\n if (existsSync(logPath)) {\n content = readFileSync(logPath, 'utf-8').trimEnd();\n } else {\n content = `# ${record.squadName}/${record.agentName} - Execution Log`;\n }\n\n // Structured entry format for parsing\n const entry = `\n\n---\n<!-- exec:${record.executionId} -->\n**${record.startTime}** | Status: ${record.status}\n- ID: \\`${record.executionId}\\`\n- Trigger: ${record.trigger || 'manual'}\n- Task Type: ${record.taskType || 'execution'}\n`;\n\n writeFileSync(logPath, content + entry);\n}\n\nfunction updateExecutionStatus(\n squadName: string,\n agentName: string,\n executionId: string,\n status: 'completed' | 'failed',\n details?: {\n outcome?: string;\n error?: string;\n durationMs?: number;\n }\n): void {\n const logPath = getExecutionLogPath(squadName, agentName);\n if (!logPath || !existsSync(logPath)) return;\n\n let content = readFileSync(logPath, 'utf-8');\n const endTime = new Date().toISOString();\n\n // Find and update the specific execution by ID\n const execMarker = `<!-- exec:${executionId} -->`;\n const markerIndex = content.indexOf(execMarker);\n\n if (markerIndex === -1) return;\n\n // Find the next entry marker or end of file\n const nextEntryIndex = content.indexOf('\\n---\\n', markerIndex + 1);\n const entryEnd = nextEntryIndex === -1 ? content.length : nextEntryIndex;\n\n // Extract and update the entry\n const entryStart = content.lastIndexOf('\\n---\\n', markerIndex);\n const currentEntry = content.slice(entryStart, entryEnd);\n\n // Build completion details\n const durationStr = details?.durationMs\n ? `${(details.durationMs / 1000).toFixed(1)}s`\n : 'unknown';\n\n let updatedEntry = currentEntry\n .replace(/Status: running/, `Status: ${status}`)\n + `- Completed: ${endTime}\n- Duration: ${durationStr}`;\n\n if (details?.outcome) {\n updatedEntry += `\\n- Outcome: ${details.outcome}`;\n }\n if (details?.error) {\n updatedEntry += `\\n- Error: ${details.error}`;\n }\n\n // Replace the entry in content\n content = content.slice(0, entryStart) + updatedEntry + content.slice(entryEnd);\n writeFileSync(logPath, content);\n}\n\n/**\n * Auto-commit agent work after execution completes.\n * Commits as the Agents Squads bot (if configured), pushes with bot token.\n * Falls back to user's git identity if bot not configured.\n */\nasync function autoCommitAgentWork(\n squadName: string,\n agentName: string,\n executionId: string,\n provider?: string,\n): Promise<{ committed: boolean; message?: string; error?: string }> {\n const { execSync } = await import('child_process');\n const { detectGitHubRepo } = await import('../lib/github.js');\n const projectRoot = getProjectRoot();\n\n try {\n // Check for uncommitted changes\n const status = execSync('git status --porcelain', {\n encoding: 'utf-8',\n cwd: projectRoot,\n }).trim();\n\n if (!status) {\n return { committed: false };\n }\n\n // Get bot identity for commits\n const botEnv = await getBotGitEnv();\n const execOpts = {\n cwd: projectRoot,\n env: { ...process.env, ...botEnv },\n };\n\n // Stage all changes (agent work should be committed)\n execSync('git add -A', execOpts);\n\n // Build commit message with provider-specific co-author\n // Write to temp file to avoid shell injection via squad/agent names\n const shortExecId = executionId.slice(0, 12);\n const coAuthor = getCoAuthorTrailer(provider || 'claude');\n const msgFile = join(projectRoot, '.git', 'SQUADS_COMMIT_MSG');\n writeFileSync(msgFile, `feat(${squadName}/${agentName}): execution ${shortExecId}\\n\\n${coAuthor}\\n`);\n\n // Commit using --file to avoid shell interpolation\n try {\n execSync(`git commit --file \"${msgFile}\"`, execOpts);\n } finally {\n try { unlinkSync(msgFile); } catch { /* ignore */ }\n }\n\n // Push to origin using bot token\n try {\n const { spawnSync } = await import('child_process');\n const repo = detectGitHubRepo(projectRoot);\n // Validate repo format (org/name) to prevent injection\n if (repo && /^[\\w.-]+\\/[\\w.-]+$/.test(repo)) {\n const pushUrl = await getBotPushUrl(repo);\n if (pushUrl) {\n // Use spawnSync with args array to avoid shell injection\n spawnSync('git', ['push', pushUrl, 'HEAD'], { ...execOpts, stdio: 'pipe' });\n } else {\n spawnSync('git', ['push', 'origin', 'HEAD'], { ...execOpts, stdio: 'pipe' });\n }\n } else {\n spawnSync('git', ['push', 'origin', 'HEAD'], { ...execOpts, stdio: 'pipe' });\n }\n } catch {\n // Push failed - continue, the commit is still local\n }\n\n return { committed: true, message: `Committed changes from ${agentName}` };\n } catch (error) {\n return { committed: false, error: String(error) };\n }\n}\n\n/**\n * Get the timestamp of the last execution from executions.md\n */\nfunction getLastExecutionTime(squadName: string, agentName: string): Date | null {\n const logPath = getExecutionLogPath(squadName, agentName);\n if (!logPath || !existsSync(logPath)) return null;\n\n const content = readFileSync(logPath, 'utf-8');\n\n // Find all timestamps in the format **2026-01-21T14:00:02.358Z**\n const timestamps = content.match(/\\*\\*(\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z)\\*\\*/g);\n if (!timestamps || timestamps.length === 0) return null;\n\n // Get the last (most recent) timestamp\n const lastTimestamp = timestamps[timestamps.length - 1].replace(/\\*\\*/g, '');\n return new Date(lastTimestamp);\n}\n\n/**\n * Local cooldown check - works without bridge\n * Returns { ok: true } if allowed, { ok: false, ... } if blocked\n */\nfunction checkLocalCooldown(\n squadName: string,\n agentName: string,\n cooldownMs: number\n): { ok: boolean; elapsedMs?: number; cooldownMs: number } {\n const lastExec = getLastExecutionTime(squadName, agentName);\n if (!lastExec) return { ok: true, cooldownMs };\n\n const elapsedMs = Date.now() - lastExec.getTime();\n if (elapsedMs < cooldownMs) {\n return { ok: false, elapsedMs, cooldownMs };\n }\n\n return { ok: true, elapsedMs, cooldownMs };\n}\n\n/**\n * Format milliseconds as human-readable duration\n */\nfunction formatDuration(ms: number): string {\n const hours = Math.floor(ms / (60 * 60 * 1000));\n const minutes = Math.floor((ms % (60 * 60 * 1000)) / (60 * 1000));\n\n if (hours >= 24) {\n const days = Math.floor(hours / 24);\n const remainingHours = hours % 24;\n return remainingHours > 0 ? `${days}d ${remainingHours}h` : `${days}d`;\n }\n if (hours > 0) {\n return minutes > 0 ? `${hours}h ${minutes}m` : `${hours}h`;\n }\n return `${minutes}m`;\n}\n\n/**\n * Extract MCP servers mentioned in an agent definition\n * Looks for patterns like: mcp-server-name, chrome-devtools, firecrawl, etc.\n */\nfunction extractMcpServersFromDefinition(definition: string): string[] {\n const servers: Set<string> = new Set();\n\n // Common MCP server patterns\n const knownServers = [\n 'chrome-devtools',\n 'firecrawl',\n 'context7',\n 'huggingface',\n ];\n\n // Check for known servers in the definition\n for (const server of knownServers) {\n if (definition.toLowerCase().includes(server)) {\n servers.add(server);\n }\n }\n\n // Look for mcp: blocks in YAML\n const mcpMatch = definition.match(/mcp:\\s*\\n((?:\\s*-\\s*\\S+\\s*\\n?)+)/i);\n if (mcpMatch) {\n const lines = mcpMatch[1].split('\\n');\n for (const line of lines) {\n const serverMatch = line.match(/^\\s*-\\s*(\\S+)/);\n if (serverMatch) {\n servers.add(serverMatch[1]);\n }\n }\n }\n\n return Array.from(servers);\n}\n\n/**\n * Parse frontmatter fields from an agent definition file.\n * Handles non-standard format where frontmatter appears after a heading.\n */\ninterface AgentFrontmatter {\n context_from?: string[];\n acceptance_criteria?: string;\n max_retries?: number;\n cooldown?: string;\n}\n\nfunction parseAgentFrontmatter(agentPath: string): AgentFrontmatter {\n if (!existsSync(agentPath)) return {};\n\n const content = readFileSync(agentPath, 'utf-8');\n const lines = content.split('\\n');\n let inFrontmatter = false;\n const yamlLines: string[] = [];\n\n for (const line of lines) {\n if (line.trim() === '---') {\n if (inFrontmatter) break;\n inFrontmatter = true;\n continue;\n }\n if (inFrontmatter) {\n yamlLines.push(line);\n }\n }\n\n if (yamlLines.length === 0) return {};\n\n const yaml = yamlLines.join('\\n');\n const result: AgentFrontmatter = {};\n\n // context_from: [operations, finance, product, growth]\n const contextMatch = yaml.match(/context_from:\\s*\\[([^\\]]+)\\]/);\n if (contextMatch) {\n result.context_from = contextMatch[1].split(',').map(s => s.trim());\n }\n\n // acceptance_criteria: |\\n - criteria1\\n - criteria2\n const criteriaMatch = yaml.match(/acceptance_criteria:\\s*\\|\\n((?:\\s+.+\\n?)*)/);\n if (criteriaMatch) {\n result.acceptance_criteria = criteriaMatch[1].replace(/^ {2}/gm, '').trim();\n }\n\n // max_retries: 2\n const retriesMatch = yaml.match(/max_retries:\\s*(\\d+)/);\n if (retriesMatch) {\n result.max_retries = parseInt(retriesMatch[1], 10);\n }\n\n // cooldown: \"30m\" or \"6h\" or \"2 hours\"\n const cooldownMatch = yaml.match(/cooldown:\\s*[\"']?([^\"'\\n]+)[\"']?/);\n if (cooldownMatch) {\n result.cooldown = cooldownMatch[1].trim();\n }\n\n return result;\n}\n\n/**\n * Emit an execution event to the API for tracking and routing.\n * Non-blocking and fail-safe — falls back to file if API unavailable.\n */\nasync function emitExecutionEvent(\n eventType: 'agent.completed' | 'agent.failed',\n data: { squad: string; agent: string; executionId: string; error?: string }\n): Promise<void> {\n const apiUrl = getApiUrl();\n\n if (apiUrl) {\n try {\n await fetch(`${apiUrl}/events/ingest`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n source: 'scheduler',\n event_type: eventType,\n data: {\n squad: data.squad,\n agent: data.agent,\n execution_id: data.executionId,\n ...(data.error ? { error: data.error } : {}),\n },\n }),\n signal: AbortSignal.timeout(EXECUTION_EVENT_TIMEOUT_MS),\n });\n return;\n } catch {\n // API unavailable — fall through to file\n }\n }\n\n // Fallback: write event to memory file\n try {\n const memDir = findMemoryDir();\n if (!memDir) return;\n\n const eventsDir = join(memDir, data.squad, data.agent);\n if (!existsSync(eventsDir)) {\n mkdirSync(eventsDir, { recursive: true });\n }\n\n const eventsPath = join(eventsDir, 'events.md');\n const timestamp = new Date().toISOString();\n const entry = `\\n## ${timestamp}: ${eventType}\\n- execution_id: ${data.executionId}\\n${data.error ? `- error: ${data.error}\\n` : ''}`;\n\n let existing = '';\n if (existsSync(eventsPath)) {\n existing = readFileSync(eventsPath, 'utf-8');\n }\n writeFileSync(eventsPath, existing + entry);\n } catch {\n // Truly fail-safe — never block execution\n }\n}\n\n/**\n * Verify execution against acceptance criteria using a lightweight model.\n * Returns pass/fail with reason. Used by the Ralph verification loop.\n */\nasync function verifyExecution(\n squadName: string,\n agentName: string,\n criteria: string,\n options: { verbose?: boolean } = {}\n): Promise<{ passed: boolean; reason: string }> {\n const { execSync } = await import('child_process');\n const projectRoot = getProjectRoot();\n\n // Gather evidence: state file + recent commits\n let stateContent = '';\n const memDir = findMemoryDir();\n if (memDir) {\n const statePath = join(memDir, squadName, agentName, 'state.md');\n if (existsSync(statePath)) {\n stateContent = readFileSync(statePath, 'utf-8').slice(0, VERIFICATION_STATE_MAX_CHARS);\n }\n }\n\n let recentCommits = '';\n try {\n recentCommits = execSync('git log --oneline -5 --no-color', {\n encoding: 'utf-8',\n cwd: projectRoot,\n }).trim();\n } catch {\n recentCommits = '(no commits found)';\n }\n\n const verifyPrompt = `You are verifying whether an agent completed its task successfully.\n\nAgent: ${squadName}/${agentName}\n\n## Acceptance Criteria\n${criteria}\n\n## Evidence\n\n### Agent State File\n${stateContent || '(empty or not found)'}\n\n### Recent Git Commits\n${recentCommits}\n\n## Instructions\nEvaluate whether the acceptance criteria are met based on the evidence.\nRespond with EXACTLY one line:\nPASS: <brief reason>\nor\nFAIL: <brief reason>`;\n\n try {\n const escapedPrompt = verifyPrompt.replace(/'/g, \"'\\\\''\");\n const result = execSync(\n `claude --print --model haiku -- '${escapedPrompt}'`,\n { encoding: 'utf-8', cwd: projectRoot, timeout: VERIFICATION_EXEC_TIMEOUT_MS }\n ).trim();\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Verification: ${result}${RESET}`);\n }\n\n if (result.startsWith('PASS')) {\n return { passed: true, reason: result.replace(/^PASS:\\s*/, '') };\n }\n return { passed: false, reason: result.replace(/^FAIL:\\s*/, '') };\n } catch (error) {\n if (options.verbose) {\n writeLine(` ${colors.dim}Verification error (defaulting to PASS): ${error}${RESET}`);\n }\n return { passed: true, reason: 'Verification unavailable — defaulting to pass' };\n }\n}\n\n// ── Cloud Dispatch ─────────────────────────────────────────────────────\n\n/**\n * Dispatch agent execution to cloud worker via API.\n * Posts to /agent-dispatch, then polls /agent-executions for status.\n */\nasync function runCloudDispatch(\n squadName: string,\n agentName: string,\n options: RunOptions\n): Promise<void> {\n const apiUrl = getApiUrl();\n\n if (!apiUrl) {\n writeLine(` ${colors.red}${icons.error} API URL not configured${RESET}`);\n writeLine(` ${colors.dim}Run: squads config use staging (or set SQUADS_API_URL)${RESET}`);\n process.exit(1);\n }\n\n // Require auth session\n if (!isLoggedIn()) {\n writeLine(` ${colors.red}${icons.error} Not logged in${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads login\\` to authenticate before using --cloud${RESET}`);\n process.exit(1);\n }\n\n const session = loadSession();\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Use access token if available, otherwise use API key\n if (session?.accessToken) {\n headers['Authorization'] = `Bearer ${session.accessToken}`;\n }\n\n const apiKey = process.env.SQUADS_PLATFORM_API_TOKEN || process.env.SCHEDULER_API_KEY;\n if (apiKey) {\n headers['X-API-Key'] = apiKey;\n }\n\n const spinner = ora(`Dispatching ${squadName}/${agentName} to cloud...`).start();\n\n try {\n // 1. Create dispatch request\n const dispatchRes = await fetch(`${apiUrl}/agent-dispatch`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n squad: squadName,\n agent: agentName,\n trigger_type: 'manual',\n trigger_data: {\n source: 'cli',\n cloud: true,\n model: options.model,\n provider: options.provider,\n effort: options.effort,\n },\n }),\n });\n\n if (!dispatchRes.ok) {\n const error = await dispatchRes.text();\n spinner.fail(`Dispatch failed: ${dispatchRes.status}`);\n writeLine(` ${colors.dim}${error}${RESET}`);\n process.exit(1);\n }\n\n const dispatch = await dispatchRes.json() as { dispatch_id: number; status: string };\n spinner.succeed(`Dispatched to cloud`);\n\n writeLine();\n writeLine(` ${colors.cyan}Dispatch ID${RESET} ${dispatch.dispatch_id}`);\n writeLine(` ${colors.cyan}Squad${RESET} ${squadName}`);\n writeLine(` ${colors.cyan}Agent${RESET} ${agentName}`);\n writeLine();\n\n // 2. Poll for execution status\n const pollSpinner = ora('Waiting for execution to start...').start();\n const pollStart = Date.now();\n let executionId: string | null = null;\n let lastStatus = '';\n\n while (Date.now() - pollStart < CLOUD_POLL_TIMEOUT_MS) {\n try {\n const execRes = await fetch(\n `${apiUrl}/agent-executions?squad=${encodeURIComponent(squadName)}&agent=${encodeURIComponent(agentName)}&limit=1`,\n { headers },\n );\n\n if (execRes.ok) {\n const executions = await execRes.json() as Array<{\n execution_id: string;\n status: string;\n summary?: string;\n error?: string;\n duration_seconds?: number;\n cost_usd?: number;\n }>;\n\n if (executions.length > 0) {\n const exec = executions[0];\n\n // Only track executions started after our dispatch\n if (!executionId && exec.status === 'running') {\n executionId = exec.execution_id;\n pollSpinner.text = `Running (${exec.execution_id})`;\n }\n\n if (executionId && exec.execution_id === executionId) {\n if (exec.status !== lastStatus) {\n lastStatus = exec.status;\n pollSpinner.text = `Status: ${exec.status}`;\n }\n\n if (exec.status === 'completed') {\n pollSpinner.succeed('Execution completed');\n writeLine();\n writeLine(` ${colors.cyan}Execution${RESET} ${exec.execution_id}`);\n if (exec.summary) {\n writeLine(` ${colors.cyan}Summary${RESET} ${exec.summary}`);\n }\n if (exec.duration_seconds) {\n writeLine(` ${colors.cyan}Duration${RESET} ${Math.round(exec.duration_seconds)}s`);\n }\n if (exec.cost_usd) {\n writeLine(` ${colors.cyan}Cost${RESET} $${exec.cost_usd.toFixed(4)}`);\n }\n writeLine();\n return;\n }\n\n if (exec.status === 'failed') {\n pollSpinner.fail('Execution failed');\n writeLine();\n if (exec.error) {\n writeLine(` ${colors.red}Error: ${exec.error}${RESET}`);\n }\n writeLine();\n process.exit(1);\n }\n\n if (exec.status === 'cancelled') {\n pollSpinner.warn('Execution cancelled');\n return;\n }\n }\n }\n }\n } catch {\n // Poll failures are non-fatal — retry on next interval\n }\n\n await new Promise(resolve => setTimeout(resolve, CLOUD_POLL_INTERVAL_MS));\n }\n\n pollSpinner.warn('Poll timeout — execution may still be running');\n writeLine(` ${colors.dim}Check status: squads trigger status${RESET}`);\n if (executionId) {\n writeLine(` ${colors.dim}Execution ID: ${executionId}${RESET}`);\n }\n } catch (error) {\n spinner.fail('Cloud dispatch failed');\n writeLine(` ${colors.red}${error instanceof Error ? error.message : String(error)}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Check your network and SQUADS_API_URL setting${RESET}`);\n process.exit(1);\n }\n}\n\nexport async function runCommand(\n target: string,\n options: RunOptions\n): Promise<void> {\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n // Execution is now the default behavior (no --execute flag needed)\n // --dry-run disables execution\n if (!options.dryRun && options.execute === undefined) {\n options.execute = true;\n }\n\n // Check if target uses squad/agent syntax (e.g., \"demo/researcher\")\n let squadName = target;\n let agentFromSlash: string | undefined;\n\n if (target.includes('/')) {\n const parts = target.split('/');\n squadName = parts[0];\n agentFromSlash = parts[1];\n if (!options.agent) {\n options.agent = agentFromSlash;\n }\n }\n\n // Cloud dispatch: skip local execution entirely\n if (options.cloud) {\n const agentName = options.agent || agentFromSlash;\n if (!agentName) {\n writeLine(` ${colors.red}${icons.error} --cloud requires a specific agent${RESET}`);\n writeLine(` ${colors.dim}Usage: squads run ${squadName} --cloud -a <agent>${RESET}`);\n writeLine(` ${colors.dim} or: squads run ${squadName}/<agent> --cloud${RESET}`);\n process.exit(1);\n }\n await track(Events.CLI_RUN, { type: 'cloud', target: `${squadName}/${agentName}` });\n await flushEvents();\n await runCloudDispatch(squadName, agentName, options);\n return;\n }\n\n // Check if target is a squad or an agent\n const squad = loadSquad(squadName);\n\n // Pre-flight executor check: verify CLI and auth before attempting execution\n // Only runs when we're actually going to execute (not dry-run)\n if (options.execute && !options.dryRun) {\n // Resolve the provider early so we check the right CLI\n const provider = options.provider || squad?.providers?.default || 'anthropic';\n const checksOk = await preflightExecutorCheck(provider);\n if (!checksOk) {\n process.exit(1);\n }\n }\n\n if (squad) {\n await track(Events.CLI_RUN, { type: 'squad', target: squad.name });\n await flushEvents(); // Ensure telemetry is sent before potential exit\n await runSquad(squad, squadsDir, options);\n } else {\n // Try to find as an agent\n const agents = listAgents(squadsDir);\n const agent = agents.find(a => a.name === target);\n\n if (agent && agent.filePath) {\n // Extract squad name from path\n const pathParts = agent.filePath.split('/');\n const squadIdx = pathParts.indexOf('squads');\n const squadName = squadIdx >= 0 ? pathParts[squadIdx + 1] : 'unknown';\n await runAgent(agent.name, agent.filePath, squadName, options);\n } else {\n writeLine(` ${colors.red}Squad or agent \"${target}\" not found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads list\\` to see available squads and agents.${RESET}`);\n process.exit(1);\n }\n }\n}\n\nasync function runSquad(\n squad: ReturnType<typeof loadSquad>,\n squadsDir: string,\n options: RunOptions\n): Promise<void> {\n if (!squad) return;\n\n // Inherit effort from squad config if not provided via CLI\n if (!options.effort && squad.effort) {\n options.effort = squad.effort;\n }\n\n const startTime = new Date().toISOString();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}run${RESET} ${colors.cyan}${squad.name}${RESET}`);\n writeLine();\n if (squad.mission) {\n writeLine(` ${colors.dim}${squad.mission}${RESET}`);\n writeLine();\n }\n writeLine(` ${colors.dim}Started: ${startTime}${RESET}`);\n writeLine();\n\n // LEAD MODE: Single orchestrator session using Task tool for parallelization\n if (options.lead) {\n await runLeadMode(squad, squadsDir, options);\n return;\n }\n\n // PARALLEL EXECUTION: --parallel --execute runs all agents simultaneously\n if (options.parallel) {\n const agentFiles = squad.agents\n .map(a => ({\n name: a.name,\n path: join(squadsDir, squad.dir, `${a.name}.md`)\n }))\n .filter(a => existsSync(a.path));\n\n if (agentFiles.length === 0) {\n writeLine(` ${icons.error} ${colors.red}No agent files found${RESET}`);\n return;\n }\n\n writeLine(` ${bold}Parallel execution${RESET} ${colors.dim}${agentFiles.length} agents${RESET}`);\n writeLine();\n\n if (!options.execute) {\n // Preview mode\n for (const agent of agentFiles) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name}${RESET}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Launch all agents in parallel:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --parallel`);\n writeLine();\n return;\n }\n\n // Execute all in parallel\n writeLine(` ${gradient('Launching')} ${agentFiles.length} agents in parallel...`);\n writeLine();\n\n const launches = agentFiles.map(agent =>\n runAgent(agent.name, agent.path, squad.dir, options)\n );\n\n await Promise.all(launches);\n\n writeLine();\n writeLine(` ${icons.success} All ${agentFiles.length} agents launched`);\n writeLine(` ${colors.dim}Monitor: tmux ls | grep squads-${squad.name}${RESET}`);\n writeLine(` ${colors.dim}Attach: tmux attach -t <session>${RESET}`);\n writeLine();\n return;\n }\n\n // If there's a pipeline, run agents in order\n if (squad.pipelines.length > 0) {\n const pipeline = squad.pipelines[0];\n writeLine(` ${bold}Pipeline${RESET} ${colors.dim}${pipeline.agents.join(' → ')}${RESET}`);\n writeLine();\n\n for (let i = 0; i < pipeline.agents.length; i++) {\n const agentName = pipeline.agents[i];\n const agentPath = join(squadsDir, squad.dir, `${agentName}.md`);\n\n if (existsSync(agentPath)) {\n writeLine(` ${colors.dim}[${i + 1}/${pipeline.agents.length}]${RESET}`);\n await runAgent(agentName, agentPath, squad.dir, options);\n writeLine();\n } else {\n writeLine(` ${icons.warning} ${colors.yellow}Agent ${agentName} not found, skipping${RESET}`);\n }\n }\n } else {\n // If specific agent requested via -a flag, run that agent\n if (options.agent) {\n const agentPath = join(squadsDir, squad.dir, `${options.agent}.md`);\n if (existsSync(agentPath)) {\n await runAgent(options.agent, agentPath, squad.dir, options);\n } else {\n writeLine(` ${icons.error} ${colors.red}Agent ${options.agent} not found${RESET}`);\n return;\n }\n } else {\n // Default: Run squad as multi-agent conversation\n // Lead briefs → scanners discover → workers execute → lead reviews → converge\n if (options.execute) {\n writeLine(` ${bold}Conversation mode${RESET} ${colors.dim}(lead → scan → work → review → verify)${RESET}`);\n writeLine();\n\n const convOptions: ConversationOptions = {\n task: options.task,\n maxTurns: options.maxTurns,\n costCeiling: options.costCeiling,\n verbose: options.verbose,\n model: options.model,\n };\n\n // Report execution start to API (fire-and-forget on failure)\n const apiExecId = await reportExecutionStart(squad.name, 'conversation', `conv-${Date.now()}`);\n\n const result = await runConversation(squad, convOptions);\n\n // Save transcript\n const transcriptPath = saveTranscript(result.transcript);\n\n // Report conversation result to API (fire-and-forget)\n if (apiExecId) {\n reportConversationResult(apiExecId, {\n turnCount: result.turnCount,\n totalCost: result.totalCost,\n converged: result.converged,\n reason: result.reason,\n agentsInvolved: [...new Set(result.transcript.turns.map(t => t.agent))],\n });\n }\n\n // Push conversation signal to cognition engine (fire-and-forget)\n pushCognitionSignal({\n source: 'execution',\n signal_type: result.converged ? 'conversation_converged' : 'conversation_stopped',\n value: result.totalCost,\n unit: 'usd',\n data: {\n turn_count: result.turnCount,\n converged: result.converged,\n reason: result.reason,\n agents_involved: [...new Set(result.transcript.turns.map(t => t.agent))],\n },\n entity_type: 'squad',\n entity_id: squad.name,\n confidence: 0.9,\n });\n\n writeLine();\n writeLine(` ${result.converged ? icons.success : icons.warning} ${result.converged ? 'Converged' : 'Stopped'}: ${result.reason}`);\n writeLine(` ${colors.dim}Turns: ${result.turnCount} | Cost: ~$${result.totalCost.toFixed(2)}${RESET}`);\n if (transcriptPath) {\n writeLine(` ${colors.dim}Transcript: ${transcriptPath}${RESET}`);\n }\n writeLine();\n } else {\n // Dry-run: show what would happen\n writeLine(` ${colors.dim}Default mode: conversation (lead → scan → work → review → verify)${RESET}`);\n writeLine();\n for (const agent of squad.agents) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name}${RESET} ${colors.dim}${agent.role}${RESET}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Run conversation:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --task \"review and merge open PRs\"`);\n writeLine();\n writeLine(` ${colors.dim}Run single agent:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} -a ${colors.cyan}<agent>${RESET}`);\n }\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}After execution, record outcome:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads feedback add ${colors.cyan}${squad.name}${RESET} ${colors.cyan}<1-5>${RESET} ${colors.cyan}\"<feedback>\"${RESET}`);\n writeLine();\n}\n\n/**\n * Lead mode: Single orchestrator session that uses Task tool for parallel work.\n * Benefits over --parallel:\n * - Single session overhead vs N sessions\n * - Lead coordinates and routes work intelligently\n * - Task agents share context when needed\n * - Better parallelization (Claude's native Task tool)\n */\nasync function runLeadMode(\n squad: ReturnType<typeof loadSquad>,\n squadsDir: string,\n options: RunOptions\n): Promise<void> {\n if (!squad) return;\n\n const agentFiles = squad.agents\n .map(a => ({\n name: a.name,\n path: join(squadsDir, squad.dir, `${a.name}.md`),\n role: a.role || '',\n }))\n .filter(a => existsSync(a.path));\n\n if (agentFiles.length === 0) {\n writeLine(` ${icons.error} ${colors.red}No agent files found${RESET}`);\n return;\n }\n\n writeLine(` ${bold}Lead mode${RESET} ${colors.dim}orchestrating ${agentFiles.length} agents${RESET}`);\n writeLine();\n\n // List available agents\n for (const agent of agentFiles) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name}${RESET} ${colors.dim}${agent.role}${RESET}`);\n }\n writeLine();\n\n if (!options.execute) {\n writeLine(` ${colors.dim}Launch lead session:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --lead`);\n writeLine();\n return;\n }\n\n // Build the lead prompt\n const timeoutMins = options.timeout || DEFAULT_TIMEOUT_MINUTES;\n const agentList = agentFiles.map(a => `- ${a.name}: ${a.role}`).join('\\n');\n const agentPaths = agentFiles.map(a => `- ${a.name}: ${a.path}`).join('\\n');\n\n const prompt = `You are the Lead of the ${squad.name} squad.\n\n## Mission\n${squad.mission || 'Execute squad operations efficiently.'}\n\n## Available Agents\n${agentList}\n\n## Agent Definition Files\n${agentPaths}\n\n## Your Role as Lead\n\n1. **Assess the situation**: Check for pending work:\n - Run \\`gh issue list --repo agents-squads/hq --label squad:${squad.name}\\` for assigned issues\n - Check .agents/memory/${squad.dir}/ for squad state and pending tasks\n - Review recent activity with \\`git log --oneline -10\\`\n\n2. **Delegate work using Task tool**: For each piece of work:\n - Use the Task tool with subagent_type=\"general-purpose\"\n - Include the agent definition file path in the prompt\n - Spawn multiple Task agents IN PARALLEL when work is independent\n - Example: \"Read ${agentFiles[0]?.path || 'agent.md'} and execute its instructions for [specific task]\"\n\n3. **Coordinate parallel execution**:\n - Independent tasks → spawn Task agents in parallel (single message, multiple tool calls)\n - Dependent tasks → run sequentially\n - Monitor progress and handle failures\n\n4. **Report and update memory**:\n - Update .agents/memory/${squad.dir}/state.md with completed work\n - Log learnings to learnings.md\n - Create issues for follow-up work if needed\n\n## Time Budget\nYou have ${timeoutMins} minutes. Prioritize high-impact work.\n\n## Critical Instructions\n- Use Task tool for delegation, NOT direct execution of agent work\n- Spawn parallel Task agents when work is independent\n- When done, type /exit to end the session\n- Do NOT wait for user input - work autonomously\n\n## Async Mode (CRITICAL)\nThis is ASYNC execution - Task agents must be fully autonomous:\n- **Findings** → Create GitHub issues (gh issue create)\n- **Code changes** → Create PRs (gh pr create)\n- **Analysis results** → Write to .agents/outputs/ or memory files\n- **NEVER wait for human review** - complete the work and move on\n- **NEVER ask clarifying questions** - make reasonable decisions\n\nInstruct each Task agent: \"Work autonomously. Output findings to GitHub issues. Output code changes as PRs. Do not wait for review.\"\n\nBegin by assessing pending work, then delegate to agents via Task tool.`;\n\n // Execute via Claude\n const claudeAvailable = await checkClaudeCliAvailable();\n if (!claudeAvailable) {\n writeLine(` ${colors.yellow}Claude CLI not found${RESET}`);\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n return;\n }\n\n // Determine execution mode (foreground is default, background is opt-in)\n const isBackground = options.background === true && !options.watch;\n const isWatch = options.watch === true;\n const isForeground = !isBackground && !isWatch;\n\n const modeText = isBackground ? ' (background)' : isWatch ? ' (watch)' : '';\n writeLine(` ${gradient('Launching')} lead session${modeText}...`);\n writeLine();\n\n try {\n // Find lead agent name from agent files or use default\n const leadAgentName = agentFiles.find(a => a.name.includes('lead'))?.name || `${squad.dir}-lead`;\n\n const result = await executeWithClaude(prompt, {\n verbose: options.verbose,\n timeoutMinutes: timeoutMins,\n foreground: options.foreground,\n background: options.background,\n watch: options.watch,\n useApi: options.useApi,\n effort: options.effort,\n skills: options.skills,\n trigger: options.trigger || 'manual',\n squadName: squad.dir,\n agentName: leadAgentName,\n model: options.model,\n });\n\n if (isForeground || isWatch) {\n writeLine();\n writeLine(` ${icons.success} Lead session completed`);\n } else {\n writeLine(` ${icons.success} Lead session launched in background`);\n writeLine(` ${colors.dim}${result}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}The lead will:${RESET}`);\n writeLine(` ${colors.dim} 1. Assess pending work (issues, memory)${RESET}`);\n writeLine(` ${colors.dim} 2. Spawn Task agents for parallel execution${RESET}`);\n writeLine(` ${colors.dim} 3. Coordinate and report results${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Monitor: squads workers${RESET}`);\n }\n } catch (error) {\n writeLine(` ${icons.error} ${colors.red}Failed to launch: ${error}${RESET}`);\n }\n}\n\nasync function runAgent(\n agentName: string,\n agentPath: string,\n squadName: string,\n options: RunOptions & { execute?: boolean }\n): Promise<void> {\n const spinner = ora(`Running agent: ${agentName}`).start();\n const startMs = Date.now();\n const startTime = new Date(startMs).toISOString();\n const executionId = generateExecutionId();\n const taskType = detectTaskType(agentName);\n\n const definition = loadAgentDefinition(agentPath);\n\n // Fetch learnings from bridge (needed for both dry-run preview and real execution)\n const learnings = await fetchLearnings(squadName);\n const learningContext = learnings.length > 0\n ? `\\n## Learnings from Previous Runs\\n${learnings.map(l => `- ${l.content}`).join('\\n')}\\n`\n : '';\n\n if (options.dryRun) {\n spinner.info(`[DRY RUN] Would run ${agentName}`);\n // Show context that would be injected\n const dryRunContext = gatherSquadContext(squadName, agentName, { verbose: options.verbose, agentPath });\n if (options.verbose) {\n writeLine(` ${colors.dim}Agent definition:${RESET}`);\n writeLine(` ${colors.dim}${definition.slice(0, DRYRUN_DEF_MAX_CHARS)}...${RESET}`);\n if (learnings.length > 0) {\n writeLine(` ${colors.dim}Learnings: ${learnings.length} from bridge${RESET}`);\n }\n if (dryRunContext || learningContext) {\n const fullContext = `${dryRunContext}${learningContext}`;\n writeLine();\n writeLine(` ${colors.cyan}Context to inject (${Math.ceil(fullContext.length / 4)} tokens):${RESET}`);\n writeLine(` ${colors.dim}${fullContext.slice(0, DRYRUN_CONTEXT_MAX_CHARS)}...${RESET}`);\n }\n }\n return;\n }\n\n // Pre-execution permission validation (Phase 3)\n const squadsDir = findSquadsDir();\n if (squadsDir) {\n const squadFilePath = join(squadsDir, squadName, 'SQUAD.md');\n if (existsSync(squadFilePath)) {\n const squadContent = readFileSync(squadFilePath, 'utf-8');\n const permContext = buildContextFromSquad(squadName, squadContent, agentName);\n\n // Build execution request from agent definition\n // For now, we validate MCP servers mentioned in the agent definition\n const mcpServers = extractMcpServersFromDefinition(definition);\n const execRequest: ExecutionRequest = {\n mcpServers\n };\n\n const permResult = validateExecution(permContext, execRequest);\n\n if (permResult.violations.length > 0) {\n spinner.stop();\n const violationLines = formatViolations(permResult);\n for (const line of violationLines) {\n writeLine(` ${line}`);\n }\n writeLine();\n\n if (!permResult.allowed) {\n writeLine(` ${colors.red}Execution blocked due to permission violations.${RESET}`);\n writeLine(` ${colors.dim}Configure permissions in ${squadFilePath}${RESET}`);\n return;\n }\n }\n }\n }\n\n // Preflight gate check (quota, cooldown) via bridge API\n const preflight = await checkPreflightGates(squadName, agentName);\n\n if (!preflight.allowed) {\n spinner.stop();\n writeLine();\n writeLine(` ${colors.red}${icons.error} Execution blocked by preflight gates${RESET}`);\n\n if (preflight.gates.quota && !preflight.gates.quota.ok) {\n writeLine(` ${colors.dim}Quota: $${preflight.gates.quota.used.toFixed(2)}/$${preflight.gates.quota.limit}/mo limit exceeded${RESET}`);\n }\n\n if (preflight.gates.cooldown && !preflight.gates.cooldown.ok) {\n const elapsed = preflight.gates.cooldown.elapsed_sec;\n const minGap = preflight.gates.cooldown.min_gap_sec;\n writeLine(` ${colors.dim}Cooldown: ${elapsed}s since last run (min: ${minGap}s)${RESET}`);\n }\n\n writeLine();\n return;\n }\n\n // Show preflight status in verbose mode\n if (options.verbose && Object.keys(preflight.gates).length > 0) {\n writeLine(` ${colors.dim}Preflight: quota ${preflight.gates.quota?.ok ? '✓' : '✗'} cooldown ${preflight.gates.cooldown?.ok ? '✓' : '✗'}${RESET}`);\n }\n\n // Local cooldown check (when bridge is unavailable or has no execution history)\n // Skip for manual triggers - only enforce for scheduled/cron runs\n const isScheduledRun = options.trigger === 'scheduled' || options.trigger === 'smart';\n const bridgeHasNoHistory = preflight.gates.cooldown?.elapsed_sec === null;\n if (isScheduledRun && (!preflight.gates.cooldown || bridgeHasNoHistory)) {\n // Read cooldown from agent frontmatter, fall back to default\n const frontmatterForCooldown = parseAgentFrontmatter(agentPath);\n const cooldownMs = frontmatterForCooldown.cooldown\n ? (parseCooldown(frontmatterForCooldown.cooldown) || DEFAULT_SCHEDULED_COOLDOWN_MS)\n : DEFAULT_SCHEDULED_COOLDOWN_MS;\n const localCooldown = checkLocalCooldown(squadName, agentName, cooldownMs);\n\n if (!localCooldown.ok) {\n spinner.stop();\n writeLine();\n writeLine(` ${colors.yellow}${icons.warning} Skipping: cooldown not elapsed${RESET}`);\n writeLine(` ${colors.dim}Last run: ${formatDuration(localCooldown.elapsedMs!)} ago (cooldown: ${formatDuration(localCooldown.cooldownMs)})${RESET}`);\n writeLine();\n return;\n }\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Local cooldown: ✓ (${formatDuration(localCooldown.elapsedMs || 0)} since last run)${RESET}`);\n }\n }\n\n // Log execution start\n logExecution({\n squadName,\n agentName,\n executionId,\n startTime,\n status: 'running',\n trigger: options.trigger || 'manual',\n taskType,\n });\n\n if (options.verbose && learnings.length > 0) {\n writeLine(` ${colors.dim}Injecting ${learnings.length} learnings${RESET}`);\n }\n\n // Load approval/escalation instructions\n const approvalInstructions = loadApprovalInstructions();\n const approvalContext = approvalInstructions\n ? `\\n${approvalInstructions}\\n`\n : '';\n\n // Gather squad context (SQUAD.md, agent state, briefs)\n const squadContext = gatherSquadContext(squadName, agentName, { verbose: options.verbose, agentPath });\n\n // Fetch cognition beliefs for prompt injection (Reflexion pattern)\n let cognitionContext = '';\n try {\n const { loadSession } = await import('../lib/auth.js');\n const { getApiUrl } = await import('../lib/env-config.js');\n const session = loadSession();\n if (session?.accessToken && session.status === 'active') {\n const safeSquadName = encodeURIComponent(squadName);\n const res = await fetch(`${getApiUrl()}/cognition/context/squad:${safeSquadName}`, {\n headers: { Authorization: `Bearer ${session.accessToken}` },\n signal: AbortSignal.timeout(3000),\n });\n if (res.ok) {\n const data = await res.json() as { markdown: string };\n if (data.markdown && !data.markdown.includes('No cognition data')) {\n cognitionContext = `\\n${data.markdown}\\n`;\n if (options.verbose) {\n writeLine(` ${colors.dim}Injecting cognition beliefs${RESET}`);\n }\n }\n }\n }\n } catch {\n // Silent — cognition injection is best-effort\n }\n\n // Generate the Claude Code prompt with timeout awareness\n const timeoutMins = options.timeout || DEFAULT_TIMEOUT_MINUTES;\n const prompt = `Execute the ${agentName} agent from squad ${squadName}.\n\nRead the agent definition at ${agentPath} and follow its instructions exactly.\n\nThe agent definition contains:\n- Purpose/role\n- Tools it can use (MCP servers, skills)\n- Step-by-step instructions\n- Expected output format\n\nTOOL PREFERENCE: Always prefer CLI tools over MCP servers when both can accomplish the task:\n- Use \\`squads\\` CLI for squad operations (run, memory, status, feedback)\n- Use \\`gh\\` CLI for GitHub (issues, PRs, repos)\n- Use \\`git\\` CLI for version control\n- Use Bash for file operations, builds, tests\n- Only use MCP tools when CLI cannot do it or MCP is significantly better\n${squadContext}${cognitionContext}${learningContext}${approvalContext}\nTIME LIMIT: You have ${timeoutMins} minutes. Work efficiently:\n- Focus on the most important tasks first\n- If a task is taking too long, move on and note it for next run\n- Aim to complete within ${Math.floor(timeoutMins * SOFT_DEADLINE_RATIO)} minutes\n\n${loadPostExecution(squadName, agentName)}`;\n\n // Resolve provider with full chain:\n // 1. Agent config (from agent file frontmatter/header)\n // 2. CLI option (--provider flag)\n // 3. Squad default (from SQUAD.md providers.default)\n // 4. Fallback to 'anthropic'\n const agentProvider = parseAgentProvider(agentPath);\n const squad = loadSquad(squadName);\n const squadDefaultProvider = squad?.providers?.default;\n\n const provider = agentProvider || options.provider || squadDefaultProvider || 'anthropic';\n const isAnthropic = provider === 'anthropic';\n\n if (options.verbose && (agentProvider || squadDefaultProvider)) {\n writeLine(` ${colors.dim}Provider resolution:${RESET}`);\n if (agentProvider) writeLine(` ${colors.dim}Agent: ${agentProvider}${RESET}`);\n if (options.provider) writeLine(` ${colors.dim}CLI: ${options.provider}${RESET}`);\n if (squadDefaultProvider) writeLine(` ${colors.dim}Squad: ${squadDefaultProvider}${RESET}`);\n writeLine(` ${colors.dim}→ Using: ${provider}${RESET}`);\n }\n\n // Check CLI availability\n const cliAvailable = isAnthropic\n ? await checkClaudeCliAvailable()\n : isProviderCLIAvailable(provider);\n\n if (options.execute && cliAvailable) {\n const cliConfig = getCLIConfig(provider);\n const cliName = cliConfig?.displayName || provider;\n\n // Determine execution mode (foreground is default, background is opt-in)\n const isBackground = options.background === true && !options.watch;\n const isWatch = options.watch === true;\n const isForeground = !isBackground && !isWatch;\n\n spinner.text = isBackground\n ? `Launching ${agentName} with ${cliName} in background...`\n : isWatch\n ? `Starting ${agentName} with ${cliName} (watch mode)...`\n : `Running ${agentName} with ${cliName}...`;\n\n // Parse frontmatter for verification criteria (Ralph loop)\n const frontmatter = parseAgentFrontmatter(agentPath);\n const hasCriteria = !!frontmatter.acceptance_criteria && options.verify !== false;\n const maxRetries = frontmatter.max_retries ?? 2;\n let currentPrompt = prompt;\n\n for (let attempt = 0; attempt <= (hasCriteria ? maxRetries : 0); attempt++) {\n try {\n let result: string;\n\n if (isAnthropic) {\n result = await executeWithClaude(currentPrompt, {\n verbose: options.verbose,\n timeoutMinutes: options.timeout || 30,\n foreground: options.foreground,\n background: options.background,\n watch: options.watch,\n useApi: options.useApi,\n effort: options.effort,\n skills: options.skills,\n trigger: options.trigger || 'manual',\n squadName,\n agentName,\n model: options.model,\n });\n } else {\n result = await executeWithProvider(provider, currentPrompt, {\n verbose: options.verbose,\n foreground: !isBackground,\n squadName,\n agentName,\n });\n }\n\n // Ralph loop: verify foreground execution against acceptance criteria\n if (hasCriteria && (isForeground || isWatch)) {\n const verification = await verifyExecution(\n squadName, agentName, frontmatter.acceptance_criteria!, { verbose: options.verbose }\n );\n if (!verification.passed && attempt < maxRetries) {\n writeLine(` ${colors.yellow}Verification: FAIL - ${verification.reason}${RESET}`);\n writeLine(` ${colors.dim}Retrying (${attempt + 1}/${maxRetries})...${RESET}`);\n currentPrompt = `${prompt}\\n\\n## PREVIOUS ATTEMPT FAILED\\nVerification found: ${verification.reason}\\nPlease address this issue and try again.`;\n continue;\n }\n if (verification.passed) {\n writeLine(` ${colors.green}Verification: PASS - ${verification.reason}${RESET}`);\n }\n }\n\n // Emit completion event (non-blocking)\n emitExecutionEvent('agent.completed', {\n squad: squadName, agent: agentName, executionId,\n }).catch(() => {});\n\n if (isForeground || isWatch) {\n spinner.succeed(`Agent ${agentName} completed (${cliName})`);\n } else {\n spinner.succeed(`Agent ${agentName} launched in background (${cliName})`);\n writeLine(` ${colors.dim}${result}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Monitor:${RESET} squads workers`);\n writeLine(` ${colors.dim}Memory:${RESET} squads memory show ${squadName}`);\n }\n break; // Success — exit retry loop\n } catch (error) {\n // Emit failure event (non-blocking)\n emitExecutionEvent('agent.failed', {\n squad: squadName, agent: agentName, executionId, error: String(error),\n }).catch(() => {});\n\n spinner.fail(`Agent ${agentName} failed to launch`);\n updateExecutionStatus(squadName, agentName, executionId, 'failed', {\n error: String(error),\n durationMs: Date.now() - startMs,\n });\n writeLine(` ${colors.red}${String(error)}${RESET}`);\n break; // Error — exit retry loop\n }\n }\n } else {\n // Show instructions for manual execution\n spinner.succeed(`Agent ${agentName} ready`);\n writeLine(` ${colors.dim}Execution logged: ${startTime}${RESET}`);\n\n if (!cliAvailable) {\n const cliConfig = getCLIConfig(provider);\n writeLine();\n writeLine(` ${colors.yellow}${cliConfig?.command || provider} CLI not found${RESET}`);\n writeLine(` ${colors.dim}Install: ${cliConfig?.install || 'squads providers'}${RESET}`);\n }\n\n writeLine();\n writeLine(` ${colors.dim}To launch as background task:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET} -a ${colors.cyan}${agentName}${RESET}`);\n if (provider !== 'anthropic') {\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET} -a ${colors.cyan}${agentName}${RESET} --provider=${provider}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Or run interactively:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} Run the ${colors.cyan}${agentName}${RESET} agent from ${agentPath}`);\n }\n}\n\nasync function checkClaudeCliAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const check = spawn('which', ['claude'], { stdio: 'pipe' });\n check.on('close', (code) => resolve(code === 0));\n check.on('error', () => resolve(false));\n });\n}\n\n/**\n * Pre-flight check for the executor (Claude Code or other provider CLI).\n * Runs once at the start of `squads run` before any agent execution.\n * Checks:\n * 1. CLI binary is available on PATH\n * 2. Authentication looks configured (credentials file or API key)\n * Skippable with SQUADS_SKIP_CHECKS=1 env var (for CI/CD).\n * Returns true if checks pass (or are skipped), false if execution should abort.\n */\nasync function preflightExecutorCheck(provider: string): Promise<boolean> {\n // Allow skipping for CI/CD or advanced users\n if (process.env.SQUADS_SKIP_CHECKS === '1') {\n return true;\n }\n\n const isAnthropic = provider === 'anthropic';\n\n // --- Check 1: CLI binary on PATH ---\n let cliFound: boolean;\n\n if (isAnthropic) {\n cliFound = await checkClaudeCliAvailable();\n } else {\n cliFound = isProviderCLIAvailable(provider);\n }\n\n if (!cliFound) {\n const cliConfig = getCLIConfig(provider);\n const cliName = cliConfig?.command || provider;\n const installCmd = cliConfig?.install || `See ${provider} documentation`;\n\n writeLine();\n writeLine(` ${icons.error} ${colors.red}${cliName} CLI not found${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}The ${cliName} command is required to run agents but was not found on your PATH.${RESET}`);\n writeLine();\n writeLine(` ${colors.cyan}Install:${RESET} ${installCmd}`);\n writeLine();\n writeLine(` ${colors.dim}Skip this check: SQUADS_SKIP_CHECKS=1 squads run ...${RESET}`);\n writeLine();\n return false;\n }\n\n // --- Check 2: Authentication (Anthropic only — other providers handle auth internally) ---\n if (isAnthropic) {\n const hasApiKey = !!process.env.ANTHROPIC_API_KEY;\n\n // Check for OAuth credentials (Max subscription or claude login)\n const home = homedir();\n const credentialsPath = join(home, '.claude', '.credentials.json');\n const hasOAuthCreds = existsSync(credentialsPath);\n\n if (!hasApiKey && !hasOAuthCreds) {\n // Auth may still work via OAuth (Max subscription) — warn but don't block\n writeLine(` ${colors.dim}${icons.progress} No API key or credentials file found — assuming OAuth${RESET}`);\n }\n }\n\n return true;\n}\n\ninterface ExecuteWithClaudeOptions {\n verbose?: boolean;\n timeoutMinutes?: number;\n foreground?: boolean; // Deprecated, now default\n background?: boolean; // Opt-in background mode\n watch?: boolean; // Background but tail log\n useApi?: boolean;\n effort?: EffortLevel;\n skills?: string[];\n trigger?: ExecutionContext['trigger'];\n squadName: string;\n agentName: string;\n model?: string; // Model to use (Claude aliases or full model IDs like gemini-2.5-flash)\n}\n\n/** Build agent environment variables for Claude execution */\nfunction buildAgentEnv(\n baseEnv: Record<string, string>,\n execContext: ExecutionContext,\n options?: { effort?: EffortLevel; skills?: string[]; includeOtel?: boolean }\n): Record<string, string> {\n const env: Record<string, string> = {\n ...baseEnv,\n SQUADS_SQUAD: execContext.squad,\n SQUADS_AGENT: execContext.agent,\n SQUADS_TASK_TYPE: execContext.taskType,\n SQUADS_TRIGGER: execContext.trigger,\n SQUADS_EXECUTION_ID: execContext.executionId,\n BRIDGE_API: getBridgeUrl(),\n };\n\n if (options?.includeOtel) {\n env.OTEL_RESOURCE_ATTRIBUTES = `squads.squad=${execContext.squad},squads.agent=${execContext.agent},squads.task_type=${execContext.taskType},squads.trigger=${execContext.trigger},squads.execution_id=${execContext.executionId}`;\n }\n\n if (options?.effort) env.CLAUDE_EFFORT = options.effort;\n if (options?.skills && options.skills.length > 0) env.CLAUDE_SKILLS = options.skills.join(',');\n\n return env;\n}\n\n/** Log verbose execution config (shared by foreground and background modes) */\nfunction logVerboseExecution(config: {\n projectRoot: string;\n mode: string;\n useApi?: boolean;\n execContext: ExecutionContext;\n effort?: EffortLevel;\n skills?: string[];\n resolvedModel?: string;\n claudeModelAlias?: string;\n explicitModel?: string;\n logFile?: string;\n mcpConfigPath?: string;\n}): void {\n writeLine(` ${colors.dim}Project: ${config.projectRoot}${RESET}`);\n writeLine(` ${colors.dim}Mode: ${config.mode}${RESET}`);\n if (config.logFile) writeLine(` ${colors.dim}Log: ${config.logFile}${RESET}`);\n if (config.mcpConfigPath) writeLine(` ${colors.dim}MCP config: ${config.mcpConfigPath}${RESET}`);\n if (config.useApi !== undefined) writeLine(` ${colors.dim}Auth: ${config.useApi ? 'API credits' : 'subscription'}${RESET}`);\n writeLine(` ${colors.dim}Execution: ${config.execContext.executionId}${RESET}`);\n writeLine(` ${colors.dim}Task type: ${config.execContext.taskType}${RESET}`);\n writeLine(` ${colors.dim}Trigger: ${config.execContext.trigger}${RESET}`);\n if (config.effort) writeLine(` ${colors.dim}Effort: ${config.effort}${RESET}`);\n if (config.skills && config.skills.length > 0) writeLine(` ${colors.dim}Skills: ${config.skills.join(', ')}${RESET}`);\n if (config.resolvedModel || config.claudeModelAlias) {\n const source = config.explicitModel ? 'explicit' : 'auto-routed';\n const displayModel = config.resolvedModel || config.claudeModelAlias;\n writeLine(` ${colors.dim}Model: ${displayModel} (${source})${RESET}`);\n }\n}\n\n/** Create an isolated worktree for agent execution (Node.js-based, for foreground mode) */\nfunction createAgentWorktree(projectRoot: string, squadName: string, agentName: string): string {\n const timestamp = Date.now();\n const branchName = `agent/${squadName}/${agentName}-${timestamp}`;\n const worktreePath = join(projectRoot, '..', '.worktrees', `${squadName}-${agentName}-${timestamp}`);\n\n try {\n mkdirSync(join(projectRoot, '..', '.worktrees'), { recursive: true });\n execSync(`git worktree add '${worktreePath}' -b '${branchName}' HEAD`, { cwd: projectRoot, stdio: 'pipe' });\n return worktreePath;\n } catch {\n return projectRoot; // Fall back to project root\n }\n}\n\n/** Build shell script for detached execution with worktree isolation */\nfunction buildDetachedShellScript(config: {\n projectRoot: string;\n squadName: string;\n agentName: string;\n timestamp: number;\n claudeModelAlias?: string;\n escapedPrompt: string;\n logFile: string;\n pidFile: string;\n}): string {\n const modelFlag = config.claudeModelAlias ? `--model ${config.claudeModelAlias}` : '';\n const branchName = `agent/${config.squadName}/${config.agentName}-${config.timestamp}`;\n const worktreeDir = `${config.projectRoot}/../.worktrees/${config.squadName}-${config.agentName}-${config.timestamp}`;\n const script = `mkdir -p '${config.projectRoot}/../.worktrees'; WORK_DIR='${config.projectRoot}'; if git -C '${config.projectRoot}' worktree add '${worktreeDir}' -b '${branchName}' HEAD 2>/dev/null; then WORK_DIR='${worktreeDir}'; fi; cd \"\\${WORK_DIR}\"; claude --print --dangerously-skip-permissions ${modelFlag} -- '${config.escapedPrompt}' > '${config.logFile}' 2>&1`;\n return `echo $$ > '${config.pidFile}'; ${script}`;\n}\n\n/** Prepare log directory and file paths for detached execution */\nfunction prepareLogFiles(projectRoot: string, squadName: string, agentName: string, timestamp: number): { logDir: string; logFile: string; pidFile: string } {\n const logDir = join(projectRoot, '.agents', 'logs', squadName);\n const logFile = join(logDir, `${agentName}-${timestamp}.log`);\n const pidFile = join(logDir, `${agentName}-${timestamp}.pid`);\n\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true });\n }\n\n return { logDir, logFile, pidFile };\n}\n\n/** Execute Claude in foreground mode (direct stdio, default) */\nfunction executeForeground(config: {\n prompt: string;\n claudeArgs: string[];\n agentEnv: Record<string, string>;\n projectRoot: string;\n squadName: string;\n agentName: string;\n execContext: ExecutionContext;\n startMs: number;\n provider?: string;\n}): Promise<string> {\n const workDir = createAgentWorktree(config.projectRoot, config.squadName, config.agentName);\n\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', config.claudeArgs, {\n stdio: 'inherit',\n cwd: workDir,\n env: config.agentEnv,\n });\n\n claude.on('close', async (code) => {\n const durationMs = Date.now() - config.startMs;\n\n if (code === 0) {\n updateExecutionStatus(config.squadName, config.agentName, config.execContext.executionId, 'completed', {\n outcome: 'Session completed successfully',\n durationMs,\n });\n\n const commitResult = await autoCommitAgentWork(config.squadName, config.agentName, config.execContext.executionId, config.provider);\n if (commitResult.committed) {\n writeLine();\n writeLine(` ${colors.green}Auto-committed agent work${RESET}`);\n }\n\n resolve('Session completed');\n } else {\n updateExecutionStatus(config.squadName, config.agentName, config.execContext.executionId, 'failed', {\n error: `Claude exited with code ${code}`,\n durationMs,\n });\n reject(new Error(`Claude exited with code ${code}`));\n }\n });\n\n claude.on('error', (err) => {\n const durationMs = Date.now() - config.startMs;\n updateExecutionStatus(config.squadName, config.agentName, config.execContext.executionId, 'failed', {\n error: String(err),\n durationMs,\n });\n reject(err);\n });\n });\n}\n\n/** Execute Claude in watch mode (background + tail log) */\nasync function executeWatch(config: {\n projectRoot: string;\n agentEnv: Record<string, string>;\n logFile: string;\n wrapperScript: string;\n}): Promise<string> {\n const child = spawn('sh', ['-c', config.wrapperScript], {\n cwd: config.projectRoot,\n detached: true,\n stdio: 'ignore',\n env: config.agentEnv,\n });\n child.unref();\n\n await new Promise(resolve => setTimeout(resolve, LOG_FILE_INIT_DELAY_MS));\n\n writeLine(` ${colors.dim}Tailing log (Ctrl+C to stop watching, agent continues)...${RESET}`);\n writeLine();\n\n const tail = spawn('tail', ['-f', config.logFile], { stdio: 'inherit' });\n\n process.on('SIGINT', () => {\n tail.kill();\n writeLine();\n writeLine(` ${colors.dim}Stopped watching. Agent continues in background.${RESET}`);\n writeLine(` ${colors.dim}Resume: tail -f ${config.logFile}${RESET}`);\n process.exit(0);\n });\n\n return new Promise((resolve) => {\n tail.on('close', () => {\n resolve(`Agent running in background. Log: ${config.logFile}`);\n });\n });\n}\n\nasync function executeWithClaude(\n prompt: string,\n options: ExecuteWithClaudeOptions\n): Promise<string> {\n const {\n verbose,\n timeoutMinutes: _timeoutMinutes = 30,\n foreground,\n background,\n watch,\n useApi,\n effort,\n skills,\n trigger = 'manual',\n squadName,\n agentName,\n model,\n } = options;\n\n // Determine execution mode\n const runInBackground = background === true && !watch;\n const runInWatch = watch === true;\n const runInForeground = !runInBackground && !runInWatch;\n\n const startMs = Date.now();\n const projectRoot = getProjectRoot();\n ensureProjectTrusted(projectRoot);\n\n // Resolve model and provider\n const squad = squadName !== 'unknown' ? loadSquad(squadName) : null;\n const mcpConfigPath = selectMcpConfig(squadName, squad);\n const taskType = detectTaskType(agentName);\n const resolvedModel = resolveModel(model, squad, taskType);\n const detectedProvider = resolvedModel ? detectProviderFromModel(resolvedModel) : 'anthropic';\n\n // Delegate to non-Anthropic providers\n if (detectedProvider !== 'anthropic' && detectedProvider !== 'unknown') {\n if (verbose) {\n const source = model ? 'explicit' : 'auto-routed';\n writeLine(` ${colors.dim}Model: ${resolvedModel} (${source})${RESET}`);\n writeLine(` ${colors.dim}Provider: ${detectedProvider}${RESET}`);\n }\n return executeWithProvider(detectedProvider, prompt, {\n verbose, foreground, cwd: projectRoot, squadName, agentName,\n });\n }\n\n const claudeModelAlias = resolvedModel ? getClaudeModelAlias(resolvedModel) : undefined;\n\n const execContext: ExecutionContext = {\n squad: squadName, agent: agentName, taskType, trigger,\n executionId: generateExecutionId(),\n };\n\n // Build base env: remove ANTHROPIC_API_KEY unless --use-api, remove CLAUDECODE\n const { ANTHROPIC_API_KEY: _apiKey, CLAUDECODE: _claudeCode, ...envWithoutApiKey } = process.env;\n const spawnEnv = useApi\n ? (() => { const { CLAUDECODE: _, ...rest } = process.env; return rest; })()\n : envWithoutApiKey;\n\n const escapedPrompt = prompt.replace(/'/g, \"'\\\\''\");\n\n await registerContextWithBridge(execContext);\n\n // ── Foreground mode ──────────────────────────────────────────────────\n if (runInForeground) {\n if (verbose) {\n logVerboseExecution({\n projectRoot, mode: 'foreground', useApi, execContext,\n effort, skills, resolvedModel, claudeModelAlias, explicitModel: model,\n });\n }\n\n // Build claude args as array to avoid shell escaping issues with large prompts\n const claudeArgs: string[] = [];\n if (!process.stdin.isTTY) claudeArgs.push('--print');\n claudeArgs.push('--dangerously-skip-permissions');\n if (mcpConfigPath) claudeArgs.push('--mcp-config', mcpConfigPath);\n if (claudeModelAlias) claudeArgs.push('--model', claudeModelAlias);\n claudeArgs.push('--', prompt);\n\n const agentEnv = buildAgentEnv(spawnEnv as Record<string, string>, execContext, {\n effort, skills, includeOtel: true,\n });\n\n return executeForeground({\n prompt, claudeArgs, agentEnv, projectRoot,\n squadName, agentName, execContext, startMs, provider,\n });\n }\n\n // ── Detached modes (watch + background) ──────────────────────────────\n const timestamp = Date.now();\n const { logFile, pidFile } = prepareLogFiles(projectRoot, squadName, agentName, timestamp);\n const agentEnv = buildAgentEnv(spawnEnv as Record<string, string>, execContext, {\n effort, skills, includeOtel: !runInWatch,\n });\n\n const wrapperScript = buildDetachedShellScript({\n projectRoot, squadName, agentName, timestamp,\n claudeModelAlias, escapedPrompt, logFile, pidFile,\n });\n\n if (runInWatch) {\n if (verbose) {\n logVerboseExecution({\n projectRoot, mode: 'watch (background + tail)',\n execContext, logFile,\n });\n }\n\n return executeWatch({ projectRoot, agentEnv, logFile, wrapperScript });\n }\n\n // ── Background mode ──────────────────────────────────────────────────\n if (verbose) {\n logVerboseExecution({\n projectRoot, mode: 'background', useApi, execContext,\n effort, skills, resolvedModel, claudeModelAlias,\n explicitModel: model, logFile, mcpConfigPath,\n });\n }\n\n const child = spawn('sh', ['-c', wrapperScript], {\n cwd: projectRoot,\n detached: true,\n stdio: 'ignore',\n env: agentEnv,\n });\n child.unref();\n\n if (verbose) {\n writeLine(` ${colors.dim}Monitor: tail -f ${logFile}${RESET}`);\n }\n\n return `Log: ${logFile}. Monitor: tail -f ${logFile}`;\n}\n\n/**\n * Execute agent with a non-Anthropic LLM CLI provider.\n *\n * Supports: google (gemini), openai (codex), mistral (vibe), xai (grok), aider, ollama\n *\n * Unlike executeWithClaude which has full session management,\n * other CLIs run in simpler non-interactive mode.\n */\nasync function executeWithProvider(\n provider: string,\n prompt: string,\n options: {\n verbose?: boolean;\n foreground?: boolean;\n cwd?: string;\n squadName?: string;\n agentName?: string;\n }\n): Promise<string> {\n const cliConfig = getCLIConfig(provider);\n\n if (!cliConfig) {\n throw new Error(`Unknown provider: ${provider}. Run 'squads providers' to see available providers.`);\n }\n\n if (!isProviderCLIAvailable(provider)) {\n throw new Error(`CLI '${cliConfig.command}' not found. Install: ${cliConfig.install}`);\n }\n\n const projectRoot = options.cwd || getProjectRoot();\n const squadName = options.squadName || 'unknown';\n const agentName = options.agentName || 'unknown';\n const timestamp = Date.now();\n\n // Build clean env: remove CLAUDECODE to allow nesting, pass squad context\n const { CLAUDECODE: _claudeCode, ...cleanEnv } = process.env;\n const providerEnv = {\n ...cleanEnv,\n SQUADS_SQUAD: squadName,\n SQUADS_AGENT: agentName,\n SQUADS_PROVIDER: provider,\n };\n\n // Create isolated worktree for this agent (same pattern as executeWithClaude)\n const branchName = `agent/${squadName}/${agentName}-${timestamp}`;\n const worktreePath = join(projectRoot, '..', '.worktrees', `${squadName}-${agentName}-${timestamp}`);\n let workDir = projectRoot;\n try {\n mkdirSync(join(projectRoot, '..', '.worktrees'), { recursive: true });\n execSync(`git worktree add '${worktreePath}' -b '${branchName}' HEAD`, { cwd: projectRoot, stdio: 'pipe' });\n workDir = worktreePath;\n } catch {\n // Worktree creation failed — fall back to project root\n }\n\n // Copy .agents directory into worktree so sandboxed providers can access\n // agent definitions, memory, and config files. Providers like Gemini restrict\n // file reads to the workspace directory, so these must be local.\n let effectivePrompt = prompt;\n if (workDir !== projectRoot) {\n const agentsDir = join(projectRoot, '.agents');\n const targetAgentsDir = join(workDir, '.agents');\n if (existsSync(agentsDir) && !existsSync(targetAgentsDir)) {\n try {\n cpSync(agentsDir, targetAgentsDir, { recursive: true });\n } catch {\n // Non-fatal: agent def may still be accessible if tracked in git\n }\n }\n // Rewrite absolute paths in prompt so sandboxed providers can resolve them\n effectivePrompt = prompt.replaceAll(projectRoot, workDir);\n }\n\n const args = cliConfig.buildArgs(effectivePrompt);\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Provider: ${cliConfig.displayName}${RESET}`);\n writeLine(` ${colors.dim}Command: ${cliConfig.command} ${args.join(' ').slice(0, VERBOSE_COMMAND_MAX_CHARS)}...${RESET}`);\n writeLine(` ${colors.dim}CWD: ${workDir}${RESET}`);\n if (workDir !== projectRoot) {\n writeLine(` ${colors.dim}Worktree: ${branchName}${RESET}`);\n }\n }\n\n // Foreground mode: run directly in terminal\n if (options.foreground) {\n return new Promise((resolve, reject) => {\n const proc = spawn(cliConfig.command, args, {\n stdio: 'inherit',\n cwd: workDir,\n env: providerEnv,\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve('Session completed');\n } else {\n reject(new Error(`${cliConfig.command} exited with code ${code}`));\n }\n });\n\n proc.on('error', (err) => {\n reject(err);\n });\n });\n }\n\n // Background mode: run detached with log file (matches executeWithClaude pattern)\n const logDir = join(projectRoot, '.agents', 'logs', squadName);\n const logFile = join(logDir, `${agentName}-${timestamp}.log`);\n const pidFile = join(logDir, `${agentName}-${timestamp}.pid`);\n\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true });\n }\n\n const escapedPrompt = effectivePrompt.replace(/'/g, \"'\\\\''\");\n const providerArgs = cliConfig.buildArgs(escapedPrompt).map(a => `'${a}'`).join(' ');\n const shellScript = `cd '${workDir}' && ${cliConfig.command} ${providerArgs} > '${logFile}' 2>&1`;\n const wrapperScript = `echo $$ > '${pidFile}'; ${shellScript}`;\n\n const child = spawn('sh', ['-c', wrapperScript], {\n cwd: workDir,\n detached: true,\n stdio: 'ignore',\n env: providerEnv,\n });\n\n child.unref();\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Log: ${logFile}${RESET}`);\n writeLine(` ${colors.dim}PID file: ${pidFile}${RESET}`);\n }\n\n return `Log: ${logFile}. Monitor: tail -f ${logFile}`;\n}\n\nexport async function runSquadCommand(\n squadName: string,\n options: RunOptions\n): Promise<void> {\n return runCommand(squadName, options);\n}\n","/**\n * Permission Engine for Squad Execution\n *\n * Phase 3 of the Squads as Execution Contexts RFC (#110)\n *\n * Validates execution requests against squad-defined permissions:\n * - Bash command allowlists\n * - File path permissions (read/write globs)\n * - MCP server allow/deny lists\n *\n * Supports three enforcement modes:\n * - warn: Log violations, continue execution\n * - strict: Block on any violation\n * - audit: Log to trail, continue execution\n */\n\nimport { minimatch } from 'minimatch';\n\nexport type EnforcementMode = 'warn' | 'strict' | 'audit';\n\n/**\n * Squad context for permission validation\n * Populated from SQUAD.md context YAML block (Phase 1)\n */\nexport interface SquadContext {\n squad: string;\n agent?: string;\n\n permissions: {\n mode: EnforcementMode;\n bash: string[]; // Allowed bash commands (e.g., ['npm', 'git', 'vercel'])\n write: string[]; // Write path globs (e.g., ['agents-squads-web/**'])\n read: string[]; // Read path globs (e.g., ['hq/.agents/**'])\n mcp: {\n allow: string[]; // Allowed MCP servers\n deny: string[]; // Denied MCP servers (takes precedence)\n };\n };\n}\n\n/**\n * Execution request to validate\n */\nexport interface ExecutionRequest {\n // Bash commands the agent might run\n bashCommands?: string[];\n\n // File paths to write\n writePaths?: string[];\n\n // File paths to read\n readPaths?: string[];\n\n // MCP servers to use\n mcpServers?: string[];\n}\n\n/**\n * Result of permission validation\n */\nexport interface PermissionResult {\n allowed: boolean;\n violations: PermissionViolation[];\n mode: EnforcementMode;\n}\n\n/**\n * Details of a permission violation\n */\nexport interface PermissionViolation {\n type: 'bash' | 'write' | 'read' | 'mcp';\n requested: string;\n reason: string;\n severity: 'error' | 'warning';\n}\n\n/**\n * Default permissive context for squads without explicit permissions\n */\nexport function getDefaultContext(squad: string, agent?: string): SquadContext {\n return {\n squad,\n agent,\n permissions: {\n mode: 'warn',\n bash: ['*'], // All commands allowed by default\n write: ['**'], // All paths writable by default\n read: ['**'], // All paths readable by default\n mcp: {\n allow: ['*'], // All MCP servers allowed\n deny: []\n }\n }\n };\n}\n\n/**\n * Check if a bash command is allowed\n */\nfunction validateBashCommand(\n command: string,\n allowedCommands: string[]\n): PermissionViolation | null {\n // Extract the base command (first word)\n const baseCommand = command.trim().split(/\\s+/)[0];\n\n // Check if wildcard allows all\n if (allowedCommands.includes('*')) {\n return null;\n }\n\n // Check if command is in allowlist\n const isAllowed = allowedCommands.some(allowed => {\n if (allowed === baseCommand) return true;\n // Support glob patterns\n if (allowed.includes('*')) {\n return minimatch(baseCommand, allowed);\n }\n return false;\n });\n\n if (!isAllowed) {\n return {\n type: 'bash',\n requested: baseCommand,\n reason: `Bash command '${baseCommand}' not in allowlist: [${allowedCommands.join(', ')}]`,\n severity: 'error'\n };\n }\n\n return null;\n}\n\n/**\n * Check if a file path matches any of the allowed globs\n */\nfunction validateFilePath(\n path: string,\n allowedGlobs: string[],\n operation: 'read' | 'write'\n): PermissionViolation | null {\n // Wildcard allows all\n if (allowedGlobs.includes('**') || allowedGlobs.includes('*')) {\n return null;\n }\n\n // Check against each glob\n const isAllowed = allowedGlobs.some(glob => minimatch(path, glob));\n\n if (!isAllowed) {\n return {\n type: operation,\n requested: path,\n reason: `${operation === 'write' ? 'Write' : 'Read'} to '${path}' not allowed. Permitted paths: [${allowedGlobs.join(', ')}]`,\n severity: 'error'\n };\n }\n\n return null;\n}\n\n/**\n * Check if an MCP server is allowed\n */\nfunction validateMcpServer(\n server: string,\n allow: string[],\n deny: string[]\n): PermissionViolation | null {\n // Deny list takes precedence\n const isDenied = deny.some(pattern => {\n if (pattern === server) return true;\n if (pattern.includes('*')) return minimatch(server, pattern);\n return false;\n });\n\n if (isDenied) {\n return {\n type: 'mcp',\n requested: server,\n reason: `MCP server '${server}' is explicitly denied`,\n severity: 'error'\n };\n }\n\n // Check allow list\n if (allow.includes('*')) {\n return null;\n }\n\n const isAllowed = allow.some(pattern => {\n if (pattern === server) return true;\n if (pattern.includes('*')) return minimatch(server, pattern);\n return false;\n });\n\n if (!isAllowed) {\n return {\n type: 'mcp',\n requested: server,\n reason: `MCP server '${server}' not in allowlist: [${allow.join(', ')}]`,\n severity: 'error'\n };\n }\n\n return null;\n}\n\n/**\n * Main validation function\n *\n * Validates an execution request against the squad's permission context\n */\nexport function validateExecution(\n context: SquadContext,\n request: ExecutionRequest\n): PermissionResult {\n const violations: PermissionViolation[] = [];\n\n // Validate bash commands\n if (request.bashCommands) {\n for (const cmd of request.bashCommands) {\n const violation = validateBashCommand(cmd, context.permissions.bash);\n if (violation) {\n violations.push(violation);\n }\n }\n }\n\n // Validate write paths\n if (request.writePaths) {\n for (const path of request.writePaths) {\n const violation = validateFilePath(path, context.permissions.write, 'write');\n if (violation) {\n violations.push(violation);\n }\n }\n }\n\n // Validate read paths\n if (request.readPaths) {\n for (const path of request.readPaths) {\n const violation = validateFilePath(path, context.permissions.read, 'read');\n if (violation) {\n violations.push(violation);\n }\n }\n }\n\n // Validate MCP servers\n if (request.mcpServers) {\n for (const server of request.mcpServers) {\n const violation = validateMcpServer(\n server,\n context.permissions.mcp.allow,\n context.permissions.mcp.deny\n );\n if (violation) {\n violations.push(violation);\n }\n }\n }\n\n // Determine if execution is allowed based on mode\n const hasErrors = violations.some(v => v.severity === 'error');\n const allowed = context.permissions.mode !== 'strict' || !hasErrors;\n\n return {\n allowed,\n violations,\n mode: context.permissions.mode\n };\n}\n\n/**\n * Format violations for display\n */\nexport function formatViolations(result: PermissionResult): string[] {\n const lines: string[] = [];\n\n if (result.violations.length === 0) {\n return lines;\n }\n\n const modeLabel = {\n warn: '⚠️ PERMISSION WARNING',\n strict: '🚫 PERMISSION DENIED',\n audit: '📝 PERMISSION AUDIT'\n }[result.mode];\n\n lines.push(modeLabel);\n lines.push('');\n\n for (const v of result.violations) {\n const icon = v.severity === 'error' ? '✗' : '⚠';\n lines.push(` ${icon} [${v.type}] ${v.reason}`);\n }\n\n if (result.mode === 'warn') {\n lines.push('');\n lines.push(' Continuing with warnings (mode: warn)');\n } else if (result.mode === 'audit') {\n lines.push('');\n lines.push(' Logged for audit, continuing (mode: audit)');\n } else if (!result.allowed) {\n lines.push('');\n lines.push(' Execution blocked (mode: strict)');\n }\n\n return lines;\n}\n\n/**\n * Parse permissions YAML block from SQUAD.md content\n *\n * Expected format in SQUAD.md:\n * ```yaml\n * permissions:\n * mode: warn | strict | audit\n * bash: [npm, git, vercel]\n * write: [agents-squads-web/**]\n * read: [hq/.agents/**]\n * mcp:\n * allow: [chrome-devtools, firecrawl]\n * deny: [restricted-server]\n * ```\n */\nexport function parsePermissionsYaml(content: string): Partial<SquadContext['permissions']> | null {\n // Find YAML code block\n const yamlMatch = content.match(/```ya?ml\\n([\\s\\S]*?)```/);\n if (!yamlMatch) return null;\n\n const yamlContent = yamlMatch[1];\n\n // Simple YAML parsing for permissions block\n const permissions: Partial<SquadContext['permissions']> = {};\n\n // Parse mode\n const modeMatch = yamlContent.match(/^\\s*mode:\\s*(warn|strict|audit)/m);\n if (modeMatch) {\n permissions.mode = modeMatch[1] as EnforcementMode;\n }\n\n // Parse bash allowlist\n const bashMatch = yamlContent.match(/^\\s*bash:\\s*\\[(.*?)\\]/m);\n if (bashMatch) {\n permissions.bash = bashMatch[1].split(',').map(s => s.trim());\n }\n\n // Parse write globs\n const writeMatch = yamlContent.match(/^\\s*write:\\s*\\[(.*?)\\]/m);\n if (writeMatch) {\n permissions.write = writeMatch[1].split(',').map(s => s.trim());\n }\n\n // Parse read globs\n const readMatch = yamlContent.match(/^\\s*read:\\s*\\[(.*?)\\]/m);\n if (readMatch) {\n permissions.read = readMatch[1].split(',').map(s => s.trim());\n }\n\n // Parse MCP allow/deny\n const mcpAllowMatch = yamlContent.match(/^\\s*allow:\\s*\\[(.*?)\\]/m);\n const mcpDenyMatch = yamlContent.match(/^\\s*deny:\\s*\\[(.*?)\\]/m);\n\n if (mcpAllowMatch || mcpDenyMatch) {\n permissions.mcp = {\n allow: mcpAllowMatch ? mcpAllowMatch[1].split(',').map(s => s.trim()) : ['*'],\n deny: mcpDenyMatch ? mcpDenyMatch[1].split(',').map(s => s.trim()) : []\n };\n }\n\n return Object.keys(permissions).length > 0 ? permissions : null;\n}\n\n/**\n * Build a SquadContext from SQUAD.md content\n */\nexport function buildContextFromSquad(\n squadName: string,\n squadContent: string,\n agentName?: string\n): SquadContext {\n // Start with defaults\n const context = getDefaultContext(squadName, agentName);\n\n // Parse permissions from content\n const parsed = parsePermissionsYaml(squadContent);\n\n if (parsed) {\n if (parsed.mode) context.permissions.mode = parsed.mode;\n if (parsed.bash) context.permissions.bash = parsed.bash;\n if (parsed.write) context.permissions.write = parsed.write;\n if (parsed.read) context.permissions.read = parsed.read;\n if (parsed.mcp) context.permissions.mcp = parsed.mcp;\n }\n\n return context;\n}\n","/**\n * Squad Conversation Workflow — Orchestrates multi-agent conversations.\n *\n * Lead briefs → scanners discover → workers execute → lead reviews →\n * loop until convergence or budget exhausted.\n *\n * CLI manages turns (deterministic), lead manages content (creative).\n */\n\nimport { join } from 'path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { execSync, exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\nimport {\n type AgentRole,\n type Transcript,\n classifyAgent,\n modelForRole,\n createTranscript,\n serializeTranscript,\n addTurn,\n detectConvergence,\n estimateTurnCost,\n} from './conversation.js';\nimport {\n type Squad,\n findSquadsDir,\n} from './squad-parser.js';\n\n// =============================================================================\n// Configuration\n// =============================================================================\n\nexport interface ConversationOptions {\n /** Override lead's briefing with a founder directive */\n task?: string;\n /** Maximum turns before stopping (default: 20) */\n maxTurns?: number;\n /** Cost ceiling in USD (default: 25) */\n costCeiling?: number;\n /** Verbose logging */\n verbose?: boolean;\n /** Model override for all agents */\n model?: string;\n}\n\nconst DEFAULT_MAX_TURNS = 20;\nconst DEFAULT_COST_CEILING = 25;\n\n// =============================================================================\n// Agent Turn Execution\n// =============================================================================\n\ninterface AgentTurnConfig {\n agentName: string;\n agentPath: string;\n role: AgentRole;\n squadName: string;\n model: string;\n transcript: Transcript;\n task?: string;\n /** Working directory for the agent process (defaults to process.cwd()) */\n cwd?: string;\n}\n\n/**\n * Execute a single agent turn via `claude --print`.\n * Returns the agent's text output.\n */\nfunction executeAgentTurn(config: AgentTurnConfig): string {\n const { agentName, agentPath, role, squadName, model, transcript, task } = config;\n\n // Build the prompt: agent definition + transcript context + role instructions\n const transcriptContext = serializeTranscript(transcript);\n\n let roleInstructions: string;\n switch (role) {\n case 'lead':\n if (transcript.turns.length === 0 && task) {\n // First turn with founder directive — replaces lead briefing\n roleInstructions = `## Founder Directive\\n\\n${task}\\n\\nBrief the team on this directive. Set priorities and assign work.`;\n } else if (transcript.turns.length === 0) {\n roleInstructions = `## Your Role: Lead\\n\\nYou are starting a new squad session. Brief the team:\\n1. Review open issues and PRs\\n2. Set priorities for this session\\n3. Assign work to workers\\n4. Be specific about what each worker should do`;\n } else {\n roleInstructions = `## Your Role: Lead (Review)\\n\\nReview the work done so far. Either:\\n- Request specific changes from workers\\n- Approve and signal completion if quality is sufficient\\n- Merge PRs that pass CI using \\`gh pr merge --squash --delete-branch\\``;\n }\n break;\n case 'scanner':\n roleInstructions = `## Your Role: Scanner\\n\\nScan for issues, gaps, and opportunities. Report findings concisely. Do NOT fix anything — just discover and report.`;\n break;\n case 'worker':\n roleInstructions = `## Your Role: Worker\\n\\nExecute the work assigned by the lead. Create branches, write code, open PRs to develop. Be focused and efficient.`;\n break;\n case 'verifier':\n roleInstructions = `## Your Role: Verifier\\n\\nVerify that work meets quality standards. Check PRs, run tests, validate output. Report pass/fail with specifics.`;\n break;\n }\n\n const prompt = `You are ${agentName} (${role}) in squad ${squadName}.\n\nRead your full agent definition at ${agentPath} and follow its instructions.\n\n${roleInstructions}\n\n${transcriptContext}\n\nIMPORTANT:\n- Be concise. Your output becomes part of a shared transcript.\n- Reference specific issue numbers, PR numbers, and file paths.\n- If you create a PR, include the PR number in your output.\n- If there's nothing to do, say \"Nothing to do\" clearly.\n- When done, summarize what you did in 2-3 sentences.`;\n\n // Resolve model: CLI override > role default\n const resolvedModel = config.model || modelForRole(role);\n\n // Execute via claude --print (captures output)\n const escapedPrompt = prompt.replace(/'/g, \"'\\\\''\");\n\n try {\n const output = execSync(\n `claude --print --dangerously-skip-permissions --model ${resolvedModel} -- '${escapedPrompt}'`,\n {\n cwd: config.cwd || process.cwd(),\n timeout: 15 * 60 * 1000, // 15 min per turn\n maxBuffer: 10 * 1024 * 1024, // 10MB\n encoding: 'utf-8',\n env: {\n ...process.env,\n CLAUDECODE: '', // Allow nested sessions\n ANTHROPIC_API_KEY: undefined, // Use Max subscription\n },\n }\n );\n return output.trim();\n } catch (err: unknown) {\n const error = err as { stdout?: string; stderr?: string; message?: string };\n // If the command produced output before failing, use it\n if (error.stdout && error.stdout.trim().length > 0) {\n return error.stdout.trim();\n }\n return `[ERROR] Agent ${agentName} failed: ${error.message || 'unknown error'}`;\n }\n}\n\n/**\n * Async version of executeAgentTurn for parallel execution.\n * Same logic, but returns a Promise instead of blocking.\n */\nfunction executeAgentTurnAsync(config: AgentTurnConfig): Promise<string> {\n const { agentName, agentPath, role, squadName, model, transcript, task } = config;\n\n let roleInstructions = '';\n switch (role) {\n case 'lead':\n roleInstructions = task\n ? `FOUNDER DIRECTIVE: ${task}\\n\\nBrief the team on this directive. Assign specific tasks to scanners and workers.`\n : 'Review the conversation so far. Assess worker output. Direct next actions or declare convergence.';\n break;\n case 'scanner':\n roleInstructions = 'Scan for issues, data, or signals relevant to the lead\\'s brief. Report findings concisely.';\n break;\n case 'worker':\n roleInstructions = 'Execute the specific task assigned by the lead. Produce concrete output (PRs, issues, content, analysis).';\n break;\n case 'verifier':\n roleInstructions = 'Verify the worker\\'s output meets quality standards. Check for errors, omissions, and alignment with goals.';\n break;\n }\n\n const transcriptContext = transcript.turns.length > 0\n ? `\\n== CONVERSATION SO FAR ==\\n${serializeTranscript(transcript)}\\n== END CONVERSATION ==`\n : '';\n\n const resolvedModel = config.model || modelForRole(role);\n const prompt = `You are ${agentName} (${role}) in squad ${squadName}.\n\nRead your full agent definition at ${agentPath} and follow its instructions.\n\n${roleInstructions}\n\n${transcriptContext}\n\nIMPORTANT:\n- Be concise. Your output becomes part of a shared transcript.\n- Reference specific issue numbers, PR numbers, and file paths.\n- If you create a PR, include the PR number in your output.\n- If there's nothing to do, say \"Nothing to do\" clearly.\n- When done, summarize what you did in 2-3 sentences.`;\n\n const escapedPrompt = prompt.replace(/'/g, \"'\\\\''\");\n\n return new Promise((resolve) => {\n exec(\n `claude --print --dangerously-skip-permissions --model ${resolvedModel} -- '${escapedPrompt}'`,\n {\n cwd: config.cwd || process.cwd(),\n timeout: 15 * 60 * 1000,\n maxBuffer: 10 * 1024 * 1024,\n encoding: 'utf-8',\n env: {\n ...process.env,\n CLAUDECODE: '',\n ANTHROPIC_API_KEY: undefined as unknown as string,\n },\n },\n (error, stdout, stderr) => {\n if (stdout && stdout.trim().length > 0) {\n resolve(stdout.trim());\n } else if (error) {\n resolve(`[ERROR] Agent ${agentName} failed: ${error.message || 'unknown error'}`);\n } else {\n resolve('[No output]');\n }\n }\n );\n });\n}\n\n// =============================================================================\n// Conversation Orchestrator\n// =============================================================================\n\ninterface ClassifiedAgent {\n name: string;\n role: AgentRole;\n path: string;\n}\n\n/**\n * Build the turn order for a squad conversation.\n * Returns agents grouped by role in execution order.\n */\nfunction buildTurnPlan(squad: Squad, squadsDir: string): ClassifiedAgent[] {\n const agents: ClassifiedAgent[] = [];\n\n for (const agent of squad.agents) {\n const role = classifyAgent(agent.name, agent.role);\n if (!role) continue; // Unclassified agents are excluded\n\n const agentPath = join(squadsDir, squad.dir, `${agent.name}.md`);\n if (!existsSync(agentPath)) continue;\n\n agents.push({ name: agent.name, role, path: agentPath });\n }\n\n return agents;\n}\n\nexport interface ConversationResult {\n transcript: Transcript;\n turnCount: number;\n totalCost: number;\n converged: boolean;\n reason: string;\n}\n\n/**\n * Run a full squad conversation.\n *\n * Turn order per cycle:\n * 1. Lead briefs (or founder directive on first turn)\n * 2. Scanners discover (parallel-safe but run sequentially for simplicity)\n * 3. Workers execute\n * 4. Lead reviews\n * 5. Verifiers check (if workers produced output)\n * 6. Check convergence → loop or exit\n */\nexport async function runConversation(\n squad: Squad,\n options: ConversationOptions = {},\n): Promise<ConversationResult> {\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n return {\n transcript: createTranscript(squad.name),\n turnCount: 0,\n totalCost: 0,\n converged: true,\n reason: 'No squads directory found',\n };\n }\n\n const maxTurns = options.maxTurns || DEFAULT_MAX_TURNS;\n const costCeiling = options.costCeiling || DEFAULT_COST_CEILING;\n const transcript = createTranscript(squad.name);\n\n // Resolve squad's working directory from repo field (e.g. \"org/squads-cli\" → sibling repo dir)\n // squadsDir = /path/to/hq/.agents/squads → go up 3 levels to get parent of project root\n let squadCwd = process.cwd();\n if (squad.repo) {\n const repoName = squad.repo.split('/').pop();\n if (repoName) {\n const reposRoot = join(squadsDir, '..', '..', '..');\n const candidatePath = join(reposRoot, repoName);\n if (existsSync(candidatePath)) {\n squadCwd = candidatePath;\n }\n }\n }\n\n // Classify all agents\n const allAgents = buildTurnPlan(squad, squadsDir);\n const leads = allAgents.filter(a => a.role === 'lead');\n const scanners = allAgents.filter(a => a.role === 'scanner');\n const workers = allAgents.filter(a => a.role === 'worker');\n const verifiers = allAgents.filter(a => a.role === 'verifier');\n\n if (leads.length === 0) {\n return {\n transcript,\n turnCount: 0,\n totalCost: 0,\n converged: true,\n reason: 'No lead agent found — cannot orchestrate conversation',\n };\n }\n\n const lead = leads[0]; // Primary lead\n const log = (msg: string) => {\n if (options.verbose) {\n const ts = new Date().toISOString().slice(11, 19);\n process.stderr.write(` [${ts}] ${msg}\\n`);\n }\n };\n\n log(`Conversation: ${squad.name} | ${allAgents.length} agents | max ${maxTurns} turns | $${costCeiling} ceiling`);\n log(` Lead: ${lead.name} | Scanners: ${scanners.map(s => s.name).join(', ') || 'none'} | Workers: ${workers.map(w => w.name).join(', ') || 'none'} | Verifiers: ${verifiers.map(v => v.name).join(', ') || 'none'}`);\n\n // === CYCLE LOOP ===\n let cycleCount = 0;\n const MAX_CYCLES = 5; // Safety: max 5 full cycles (lead→scan→work→review→verify)\n\n while (cycleCount < MAX_CYCLES) {\n cycleCount++;\n log(`\\n--- Cycle ${cycleCount} ---`);\n\n // Step 1: Lead briefs\n log(`Turn ${transcript.turns.length + 1}: ${lead.name} (lead)`);\n const leadOutput = executeAgentTurn({\n agentName: lead.name,\n agentPath: lead.path,\n role: 'lead',\n squadName: squad.name,\n model: options.model || modelForRole('lead'),\n transcript,\n task: cycleCount === 1 ? options.task : undefined,\n cwd: squadCwd,\n });\n addTurn(transcript, lead.name, 'lead', leadOutput, estimateTurnCost(options.model || 'sonnet'));\n\n // Check convergence after lead\n let conv = detectConvergence(transcript, maxTurns, costCeiling);\n if (conv.converged) {\n log(`Converged after lead: ${conv.reason}`);\n return { transcript, turnCount: transcript.turns.length, totalCost: transcript.totalCost, converged: true, reason: conv.reason };\n }\n\n // Step 2: Scanners (only on first cycle) — run in parallel\n if (cycleCount === 1 && scanners.length > 0) {\n if (scanners.length === 1) {\n log(`Turn ${transcript.turns.length + 1}: ${scanners[0].name} (scanner)`);\n const output = executeAgentTurn({\n agentName: scanners[0].name,\n agentPath: scanners[0].path,\n role: 'scanner',\n squadName: squad.name,\n model: options.model || modelForRole('scanner'),\n transcript,\n cwd: squadCwd,\n });\n addTurn(transcript, scanners[0].name, 'scanner', output, estimateTurnCost(options.model || 'haiku'));\n } else {\n log(`Turns ${transcript.turns.length + 1}-${transcript.turns.length + scanners.length}: ${scanners.map(s => s.name).join(', ')} (scanners, parallel)`);\n const scannerPromises = scanners.map(scanner =>\n executeAgentTurnAsync({\n agentName: scanner.name,\n agentPath: scanner.path,\n role: 'scanner',\n squadName: squad.name,\n model: options.model || modelForRole('scanner'),\n transcript, // snapshot — all scanners see same context\n cwd: squadCwd,\n }).then(output => ({ agent: scanner, output }))\n );\n const scannerResults = await Promise.all(scannerPromises);\n for (const { agent, output } of scannerResults) {\n addTurn(transcript, agent.name, 'scanner', output, estimateTurnCost(options.model || 'haiku'));\n }\n }\n\n conv = detectConvergence(transcript, maxTurns, costCeiling);\n if (conv.converged) {\n return { transcript, turnCount: transcript.turns.length, totalCost: transcript.totalCost, converged: true, reason: conv.reason };\n }\n }\n\n // Step 3: Workers execute — run in parallel if multiple\n if (workers.length === 1) {\n log(`Turn ${transcript.turns.length + 1}: ${workers[0].name} (worker)`);\n const output = executeAgentTurn({\n agentName: workers[0].name,\n agentPath: workers[0].path,\n role: 'worker',\n squadName: squad.name,\n model: options.model || modelForRole('worker'),\n transcript,\n cwd: squadCwd,\n });\n if (output.startsWith('[ERROR]')) {\n process.stderr.write(` [WARN] Worker ${workers[0].name} errored: ${output}\\n`);\n }\n addTurn(transcript, workers[0].name, 'worker', output, estimateTurnCost(options.model || 'sonnet'));\n } else if (workers.length > 1) {\n log(`Turns ${transcript.turns.length + 1}-${transcript.turns.length + workers.length}: ${workers.map(w => w.name).join(', ')} (workers, parallel)`);\n const workerPromises = workers.map(worker =>\n executeAgentTurnAsync({\n agentName: worker.name,\n agentPath: worker.path,\n role: 'worker',\n squadName: squad.name,\n model: options.model || modelForRole('worker'),\n transcript, // snapshot — all workers see same context\n cwd: squadCwd,\n }).then(output => ({ agent: worker, output }))\n );\n const workerResults = await Promise.all(workerPromises);\n for (const { agent, output } of workerResults) {\n if (output.startsWith('[ERROR]')) {\n process.stderr.write(` [WARN] Worker ${agent.name} errored: ${output}\\n`);\n }\n addTurn(transcript, agent.name, 'worker', output, estimateTurnCost(options.model || 'sonnet'));\n }\n }\n\n conv = detectConvergence(transcript, maxTurns, costCeiling);\n if (conv.converged) {\n return { transcript, turnCount: transcript.turns.length, totalCost: transcript.totalCost, converged: true, reason: conv.reason };\n }\n\n // Step 4: Lead reviews worker output\n log(`Turn ${transcript.turns.length + 1}: ${lead.name} (lead review)`);\n const reviewOutput = executeAgentTurn({\n agentName: lead.name,\n agentPath: lead.path,\n role: 'lead',\n squadName: squad.name,\n model: options.model || modelForRole('lead'),\n transcript,\n cwd: squadCwd,\n });\n addTurn(transcript, lead.name, 'lead', reviewOutput, estimateTurnCost(options.model || 'sonnet'));\n\n conv = detectConvergence(transcript, maxTurns, costCeiling);\n if (conv.converged) {\n return { transcript, turnCount: transcript.turns.length, totalCost: transcript.totalCost, converged: true, reason: conv.reason };\n }\n\n // Step 5: Verifiers — run in parallel if multiple\n if (verifiers.length === 1) {\n log(`Turn ${transcript.turns.length + 1}: ${verifiers[0].name} (verifier)`);\n const output = executeAgentTurn({\n agentName: verifiers[0].name,\n agentPath: verifiers[0].path,\n role: 'verifier',\n squadName: squad.name,\n model: options.model || modelForRole('verifier'),\n transcript,\n cwd: squadCwd,\n });\n addTurn(transcript, verifiers[0].name, 'verifier', output, estimateTurnCost(options.model || 'haiku'));\n } else if (verifiers.length > 1) {\n log(`Turns ${transcript.turns.length + 1}-${transcript.turns.length + verifiers.length}: ${verifiers.map(v => v.name).join(', ')} (verifiers, parallel)`);\n const verifierPromises = verifiers.map(verifier =>\n executeAgentTurnAsync({\n agentName: verifier.name,\n agentPath: verifier.path,\n role: 'verifier',\n squadName: squad.name,\n model: options.model || modelForRole('verifier'),\n transcript,\n cwd: squadCwd,\n }).then(output => ({ agent: verifier, output }))\n );\n const verifierResults = await Promise.all(verifierPromises);\n for (const { agent, output } of verifierResults) {\n addTurn(transcript, agent.name, 'verifier', output, estimateTurnCost(options.model || 'haiku'));\n }\n }\n\n if (verifiers.length > 0) {\n conv = detectConvergence(transcript, maxTurns, costCeiling);\n if (conv.converged) {\n return { transcript, turnCount: transcript.turns.length, totalCost: transcript.totalCost, converged: true, reason: conv.reason };\n }\n }\n }\n\n return {\n transcript,\n turnCount: transcript.turns.length,\n totalCost: transcript.totalCost,\n converged: false,\n reason: `Max cycles reached (${MAX_CYCLES})`,\n };\n}\n\n// =============================================================================\n// Transcript Persistence\n// =============================================================================\n\n/** Save conversation transcript to .agents/conversations/{squad}/ */\nexport function saveTranscript(transcript: Transcript): string | null {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return null;\n\n const convDir = join(squadsDir, '..', 'conversations', transcript.squad);\n if (!existsSync(convDir)) {\n mkdirSync(convDir, { recursive: true });\n }\n\n const id = Date.now().toString(36);\n const filePath = join(convDir, `${id}.md`);\n\n const lines = [\n `# Conversation: ${transcript.squad}`,\n `Started: ${transcript.startedAt}`,\n `Turns: ${transcript.turns.length}`,\n `Estimated cost: $${transcript.totalCost.toFixed(2)}`,\n '',\n '---',\n '',\n ];\n\n for (const turn of transcript.turns) {\n lines.push(`## ${turn.agent} (${turn.role}) — ${turn.timestamp}`);\n lines.push('');\n lines.push(turn.content);\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n\n writeFileSync(filePath, lines.join('\\n'));\n return filePath;\n}\n","/**\n * Squad Conversation Protocol — Types, transcript management, and convergence detection.\n *\n * Agents share a conversation transcript. Lead briefs first, workers execute,\n * lead iterates with workers until quality converges, verifiers check final output.\n * CLI manages turns (deterministic), lead manages content (creative).\n */\n\n// =============================================================================\n// Agent Classification\n// =============================================================================\n\nexport type AgentRole = 'lead' | 'scanner' | 'worker' | 'verifier';\n\n/**\n * Classify an agent into a conversation role.\n * Primary: uses the role field from SQUAD.md agents table.\n * Fallback: matches against agent name (for squads without role descriptions).\n */\nexport function classifyAgent(agentName: string, roleDescription?: string): AgentRole | null {\n // Primary: parse the role description from SQUAD.md\n if (roleDescription) {\n const lower = roleDescription.toLowerCase();\n if (lower.includes('orchestrat') || lower.includes('triage') || lower.includes('coordinat')) return 'lead';\n if (lower.includes('scan') || lower.includes('monitor') || lower.includes('detect')) return 'scanner';\n if (lower.includes('verif') || lower.includes('review') || lower.includes('check') || lower.includes('critic')) return 'verifier';\n // Any role description that doesn't match above = worker (the default doer)\n return 'worker';\n }\n\n // Fallback: match against agent name (lead checked first to avoid substring collisions)\n const name = agentName.toLowerCase();\n if (name.includes('lead') || name.includes('orchestrator')) return 'lead';\n if (name.includes('scanner') || name.includes('scout') || name.includes('monitor')) return 'scanner';\n if (name.includes('verifier') || name.includes('critic') || name.includes('reviewer')) return 'verifier';\n if (name.includes('worker') || name.includes('solver') || name.includes('builder')) return 'worker';\n\n return null; // Unclassified — excluded from conversation\n}\n\n/** Map roles to model tiers for cost routing */\nexport function modelForRole(role: AgentRole): string {\n switch (role) {\n case 'lead': return 'sonnet';\n case 'worker': return 'sonnet';\n case 'scanner': return 'haiku';\n case 'verifier': return 'haiku';\n }\n}\n\n// =============================================================================\n// Transcript\n// =============================================================================\n\nexport interface Turn {\n /** Which agent produced this turn */\n agent: string;\n /** Classified role */\n role: AgentRole;\n /** The agent's full output */\n content: string;\n /** Timestamp */\n timestamp: string;\n /** Estimated cost for this turn */\n estimatedCost: number;\n}\n\nexport interface Transcript {\n squad: string;\n turns: Turn[];\n startedAt: string;\n /** Running cost estimate */\n totalCost: number;\n}\n\nexport function createTranscript(squad: string): Transcript {\n return {\n squad,\n turns: [],\n startedAt: new Date().toISOString(),\n totalCost: 0,\n };\n}\n\n/** Serialize transcript for prompt injection.\n * Compacts after 5 turns: keeps first brief + last lead review (natural summary)\n * + turns since that review. The lead review already summarizes prior work,\n * so it acts as a compaction point — no information lost, just compressed.\n */\nexport function serializeTranscript(transcript: Transcript): string {\n if (transcript.turns.length === 0) return '';\n\n let turns = transcript.turns;\n if (turns.length > 5) {\n const firstBrief = turns[0];\n\n // Find last lead review (any lead turn after the first brief)\n let lastReviewIdx = -1;\n for (let i = turns.length - 1; i > 0; i--) {\n if (turns[i].role === 'lead') {\n lastReviewIdx = i;\n break;\n }\n }\n\n if (lastReviewIdx > 0) {\n // First brief + last lead review + everything after it\n turns = [firstBrief, ...turns.slice(lastReviewIdx)];\n } else {\n // No lead review yet — keep first brief + last 3\n turns = [firstBrief, ...turns.slice(-3)];\n }\n }\n\n const lines = ['## Conversation So Far\\n'];\n if (turns.length < transcript.turns.length) {\n lines.push(`*(${transcript.turns.length - turns.length} earlier turns compacted — lead review below summarizes prior work)*\\n`);\n }\n for (const turn of turns) {\n lines.push(`### ${turn.agent} (${turn.role}) — ${turn.timestamp}`);\n lines.push(turn.content);\n lines.push('');\n }\n return lines.join('\\n');\n}\n\nexport function addTurn(\n transcript: Transcript,\n agent: string,\n role: AgentRole,\n content: string,\n estimatedCost: number,\n): void {\n transcript.turns.push({\n agent,\n role,\n content,\n timestamp: new Date().toISOString(),\n estimatedCost,\n });\n transcript.totalCost += estimatedCost;\n}\n\n// =============================================================================\n// Convergence Detection\n// =============================================================================\n\n/** Phrases that indicate work is done (matched case-insensitively via includes) */\nconst CONVERGENCE_PHRASES = [\n 'pr created', 'pr merged',\n 'issue closed', 'issue resolved',\n 'all tasks complete', 'all items complete', 'all issues resolved',\n 'nothing left to do', 'nothing remaining',\n 'session complete',\n 'queue empty',\n 'no open issues', 'no pending tasks', 'no pending issues',\n];\n\n/** Phrases in a verifier turn that signal approval → converge */\nconst VERIFIER_APPROVAL_PHRASES = [\n 'approved', 'lgtm', 'looks good',\n 'all checks pass', 'all tests pass', 'tests pass',\n 'passed', 'quality standards met',\n];\n\n/** Phrases in a verifier turn that signal rejection → continue cycle */\nconst VERIFIER_REJECTION_PHRASES = [\n 'failed', 'rejected', 'needs fixes', 'needs changes',\n 'does not pass', 'did not pass', 'failing',\n];\n\n/** Phrases that indicate more work needed */\nconst CONTINUATION_PHRASES = [\n 'needs review', 'needs feedback', 'needs input', 'need clarification',\n 'todo', 'fixme', 'blocked',\n 'waiting for', 'waiting on',\n 'will continue', 'will proceed', 'will work on',\n 'next step',\n 'in progress',\n];\n\nexport interface ConvergenceResult {\n converged: boolean;\n reason: string;\n}\n\n/**\n * Detect if the conversation has converged.\n * Continuation signals beat convergence signals (bias toward more work).\n */\nexport function detectConvergence(\n transcript: Transcript,\n maxTurns: number,\n costCeiling: number,\n): ConvergenceResult {\n // Hard limits\n if (transcript.turns.length >= maxTurns) {\n return { converged: true, reason: `Max turns reached (${maxTurns})` };\n }\n if (transcript.totalCost >= costCeiling) {\n return { converged: true, reason: `Cost ceiling reached ($${transcript.totalCost.toFixed(2)}/$${costCeiling})` };\n }\n\n // Check last turn content\n if (transcript.turns.length === 0) {\n return { converged: false, reason: 'No turns yet' };\n }\n\n const lastTurn = transcript.turns[transcript.turns.length - 1];\n const content = lastTurn.content;\n const lower = content.toLowerCase();\n\n // Verifier turns: check approval/rejection before generic signals\n if (lastTurn.role === 'verifier') {\n const rejected = VERIFIER_REJECTION_PHRASES.some(phrase => lower.includes(phrase));\n if (rejected) {\n return { converged: false, reason: 'Verifier rejected — continuing cycle' };\n }\n const approved = VERIFIER_APPROVAL_PHRASES.some(phrase => lower.includes(phrase));\n if (approved) {\n return { converged: true, reason: 'Verifier approved' };\n }\n }\n\n // Continuation signals beat convergence (bias toward completing work)\n const hasContinuation = CONTINUATION_PHRASES.some(phrase => lower.includes(phrase));\n if (hasContinuation) {\n return { converged: false, reason: 'Continuation signal detected' };\n }\n\n const hasConvergence = CONVERGENCE_PHRASES.some(phrase => lower.includes(phrase));\n if (hasConvergence) {\n return { converged: true, reason: 'Convergence signal detected' };\n }\n\n return { converged: false, reason: 'No signals detected, continuing' };\n}\n\n// =============================================================================\n// Cost Estimation\n// =============================================================================\n\n/** Rough cost estimates per model per turn (input + output) */\nconst COST_PER_TURN: Record<string, number> = {\n opus: 2.50,\n sonnet: 0.75,\n haiku: 0.10,\n};\n\nexport function estimateTurnCost(model: string): number {\n const key = model.includes('opus') ? 'opus'\n : model.includes('haiku') ? 'haiku'\n : 'sonnet';\n return COST_PER_TURN[key] || COST_PER_TURN.sonnet;\n}\n"],"mappings":"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","names":["execSync","join","existsSync","readFileSync","writeFileSync","mkdirSync","join","existsSync","readFileSync","writeFileSync","mkdirSync","provider","execSync","exec","squadName","loadSession","getApiUrl","agentEnv"]}
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ cleanupStaleSessions,
4
+ detectSquad,
5
+ startSession,
6
+ stopSession,
7
+ updateHeartbeat
8
+ } from "./chunk-BODLDQY7.js";
9
+ import {
10
+ RESET,
11
+ colors,
12
+ icons,
13
+ writeLine
14
+ } from "./chunk-N7KDWU4W.js";
15
+ import "./chunk-7OCVIDC7.js";
16
+
17
+ // src/commands/session.ts
18
+ async function sessionStartCommand(options = {}) {
19
+ cleanupStaleSessions();
20
+ const session = startSession(options.squad);
21
+ if (!options.quiet) {
22
+ if (session) {
23
+ writeLine(`${icons.active} Session started: ${colors.cyan}${session.sessionId}${RESET}`);
24
+ if (session.squad) {
25
+ writeLine(` ${colors.dim}Squad: ${session.squad}${RESET}`);
26
+ }
27
+ } else {
28
+ writeLine(`${colors.yellow}Could not start session (no .agents directory)${RESET}`);
29
+ }
30
+ }
31
+ }
32
+ async function sessionStopCommand(options = {}) {
33
+ const stopped = stopSession();
34
+ if (!options.quiet) {
35
+ if (stopped) {
36
+ writeLine(`${icons.progress} Session stopped`);
37
+ } else {
38
+ writeLine(`${colors.dim}No active session to stop${RESET}`);
39
+ }
40
+ }
41
+ }
42
+ async function sessionHeartbeatCommand(options = {}) {
43
+ const updated = updateHeartbeat();
44
+ if (!options.quiet) {
45
+ if (updated) {
46
+ writeLine(`${icons.active} Heartbeat updated`);
47
+ } else {
48
+ writeLine(`${colors.dim}No session to update${RESET}`);
49
+ }
50
+ }
51
+ }
52
+ async function detectSquadCommand() {
53
+ const squad = detectSquad();
54
+ if (squad) {
55
+ process.stdout.write(squad);
56
+ }
57
+ }
58
+ export {
59
+ detectSquadCommand,
60
+ sessionHeartbeatCommand,
61
+ sessionStartCommand,
62
+ sessionStopCommand
63
+ };
64
+ //# sourceMappingURL=session-6H67XPAQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/session.ts"],"sourcesContent":["/**\n * Session lifecycle commands: start, stop, heartbeat\n * Used by Claude Code hooks for session tracking\n */\n\nimport {\n startSession,\n stopSession,\n updateHeartbeat,\n detectSquad,\n cleanupStaleSessions,\n} from '../lib/sessions.js';\nimport {\n colors,\n RESET,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface SessionStartOptions {\n squad?: string;\n quiet?: boolean;\n}\n\ninterface SessionStopOptions {\n quiet?: boolean;\n}\n\ninterface SessionHeartbeatOptions {\n quiet?: boolean;\n}\n\n/**\n * Start a new session\n */\nexport async function sessionStartCommand(\n options: SessionStartOptions = {}\n): Promise<void> {\n // Clean up stale sessions first\n cleanupStaleSessions();\n\n const session = startSession(options.squad);\n\n if (!options.quiet) {\n if (session) {\n writeLine(`${icons.active} Session started: ${colors.cyan}${session.sessionId}${RESET}`);\n if (session.squad) {\n writeLine(` ${colors.dim}Squad: ${session.squad}${RESET}`);\n }\n } else {\n writeLine(`${colors.yellow}Could not start session (no .agents directory)${RESET}`);\n }\n }\n}\n\n/**\n * Stop current session\n */\nexport async function sessionStopCommand(\n options: SessionStopOptions = {}\n): Promise<void> {\n const stopped = stopSession();\n\n if (!options.quiet) {\n if (stopped) {\n writeLine(`${icons.progress} Session stopped`);\n } else {\n writeLine(`${colors.dim}No active session to stop${RESET}`);\n }\n }\n}\n\n/**\n * Update heartbeat for current session\n */\nexport async function sessionHeartbeatCommand(\n options: SessionHeartbeatOptions = {}\n): Promise<void> {\n const updated = updateHeartbeat();\n\n if (!options.quiet) {\n if (updated) {\n writeLine(`${icons.active} Heartbeat updated`);\n } else {\n writeLine(`${colors.dim}No session to update${RESET}`);\n }\n }\n}\n\n/**\n * Detect current squad based on cwd\n */\nexport async function detectSquadCommand(): Promise<void> {\n const squad = detectSquad();\n\n if (squad) {\n // Output just the squad name for use in shell scripts\n process.stdout.write(squad);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmCA,eAAsB,oBACpB,UAA+B,CAAC,GACjB;AAEf,uBAAqB;AAErB,QAAM,UAAU,aAAa,QAAQ,KAAK;AAE1C,MAAI,CAAC,QAAQ,OAAO;AAClB,QAAI,SAAS;AACX,gBAAU,GAAG,MAAM,MAAM,qBAAqB,OAAO,IAAI,GAAG,QAAQ,SAAS,GAAG,KAAK,EAAE;AACvF,UAAI,QAAQ,OAAO;AACjB,kBAAU,KAAK,OAAO,GAAG,UAAU,QAAQ,KAAK,GAAG,KAAK,EAAE;AAAA,MAC5D;AAAA,IACF,OAAO;AACL,gBAAU,GAAG,OAAO,MAAM,iDAAiD,KAAK,EAAE;AAAA,IACpF;AAAA,EACF;AACF;AAKA,eAAsB,mBACpB,UAA8B,CAAC,GAChB;AACf,QAAM,UAAU,YAAY;AAE5B,MAAI,CAAC,QAAQ,OAAO;AAClB,QAAI,SAAS;AACX,gBAAU,GAAG,MAAM,QAAQ,kBAAkB;AAAA,IAC/C,OAAO;AACL,gBAAU,GAAG,OAAO,GAAG,4BAA4B,KAAK,EAAE;AAAA,IAC5D;AAAA,EACF;AACF;AAKA,eAAsB,wBACpB,UAAmC,CAAC,GACrB;AACf,QAAM,UAAU,gBAAgB;AAEhC,MAAI,CAAC,QAAQ,OAAO;AAClB,QAAI,SAAS;AACX,gBAAU,GAAG,MAAM,MAAM,oBAAoB;AAAA,IAC/C,OAAO;AACL,gBAAU,GAAG,OAAO,GAAG,uBAAuB,KAAK,EAAE;AAAA,IACvD;AAAA,EACF;AACF;AAKA,eAAsB,qBAAoC;AACxD,QAAM,QAAQ,YAAY;AAE1B,MAAI,OAAO;AAET,YAAQ,OAAO,MAAM,KAAK;AAAA,EAC5B;AACF;","names":[]}