crewswarm-cli 0.1.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.
- package/LICENSE +21 -0
- package/README.md +209 -0
- package/bin/crew.js +94 -0
- package/dist/crew.mjs +22964 -0
- package/dist/crew.mjs.map +7 -0
- package/dist/engine.mjs +3381 -0
- package/dist/engine.mjs.map +7 -0
- package/dist/memory.mjs +850 -0
- package/dist/memory.mjs.map +7 -0
- package/package.json +113 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/logger.ts", "../src/mapping/index.ts", "../src/pty/index.ts", "../src/lsp/index.ts", "../src/strategies/index.ts", "../src/executor/local.ts", "../src/executor/profiles.ts", "../src/worker/autonomous-loop.ts", "../src/tools/gemini/definitions/base-declarations.ts", "../src/tools/docker-sandbox.ts", "../src/tools/gemini/crew-adapter.ts", "../src/learning/corrections.ts", "../src/collections/index.ts", "../src/executor/agentic-executor.ts", "../src/prompts/registry.ts", "../src/utils/structured-json.ts", "../src/prompts/dual-l2.ts", "../src/pipeline/context-pack.ts", "../src/pipeline/agent-memory.ts", "../src/utils/json-schemas.ts", "../src/metrics/json-parse.ts", "../src/pipeline/run-state.ts", "../src/capabilities/index.ts", "../src/pipeline/task-envelope.ts", "../src/cli/file-commands.ts", "../src/pipeline/unified.ts", "../src/orchestrator/worker-pool.ts", "../src/orchestrator/index.ts", "../src/memory/agentkeeper.ts", "../src/ci/index.ts", "../src/blast-radius/index.ts", "../src/context/codebase-rag.ts", "../src/status/dashboard.ts", "../src/repl/model-info.ts", "../src/shell/index.ts", "../src/cli/index.ts", "../src/agent/router.js", "../src/context/git.ts", "../src/agent/prompt.ts", "../src/tools/manager.js", "../src/config/manager.js", "../src/session/manager.ts", "../src/sandbox/index.ts", "../src/auth/token-finder.ts", "../src/planner/index.ts", "../src/cache/token-cache.ts", "../src/diagnostics/doctor.ts", "../src/mcp/index.ts", "../src/cost/predictor.ts", "../src/engines/index.ts", "../src/engines/session-layer.ts", "../src/session/conversation-transcript.ts", "../src/engines/native-session.ts", "../src/engines/tool-audit.ts", "../src/watch/index.ts", "../src/studio/broadcaster.ts", "../src/hello/index.ts", "../src/multirepo/index.ts", "../src/browser/index.ts", "../src/team/index.ts", "../src/voice/listener.ts", "../src/context/augment.ts", "../src/review/index.ts", "../src/headless/index.ts", "../src/runtime/execution-policy.ts", "../src/interface/server.ts", "../src/interface/mcp-handler.ts", "../src/metrics/pipeline.ts", "../src/sourcegraph/index.ts", "../src/repl/index.ts", "../src/memory/broker.ts", "../src/checkpoint/store.ts", "../src/risk/score.ts", "../src/tui/index.ts", "../src/xai/search.ts", "../src/config/repo-config.ts", "../src/github/nl.ts", "../src/config/model-policy.ts", "../src/autofix/store.ts", "../src/autofix/runner.ts"],
|
|
4
|
+
"sourcesContent": ["const useColor = Boolean(process.stdout?.isTTY) && !process.env.NO_COLOR;\n\nfunction ansi(code: string, text: string): string {\n if (!useColor) return text;\n return `\\u001b[${code}m${text}\\u001b[0m`;\n}\n\nconst color = {\n gray: (text: string) => ansi('90', text),\n red: (text: string) => ansi('31', text),\n yellow: (text: string) => ansi('33', text),\n green: (text: string) => ansi('32', text),\n blue: (text: string) => ansi('34', text),\n cyan: (text: string) => ansi('36', text),\n bold: (text: string) => ansi('1', text),\n};\n\nexport class Logger {\n level: string;\n prefix: string;\n\n constructor(options: { level?: string; prefix?: string } = {}) {\n this.level = options.level || 'info';\n this.prefix = options.prefix || '[CrewSwarm]';\n }\n\n formatMessage(level: string, message: string, ...args: any[]) {\n const timestamp = new Date().toISOString();\n const prefix = `${color.gray(timestamp)} ${this.prefix}`;\n \n let colorFn;\n switch (level) {\n case 'error': colorFn = color.red; break;\n case 'warn': colorFn = color.yellow; break;\n case 'success': colorFn = color.green; break;\n case 'debug': colorFn = color.gray; break;\n default: colorFn = color.blue;\n }\n\n return `${prefix} ${colorFn(`[${level.toUpperCase()}]`)} ${message}`;\n }\n\n info(message: string, ...args: any[]) {\n console.log(this.formatMessage('info', message), ...args);\n }\n\n error(message: string, ...args: any[]) {\n console.error(this.formatMessage('error', message), ...args);\n }\n\n warn(message: string, ...args: any[]) {\n console.warn(this.formatMessage('warn', message), ...args);\n }\n\n success(message: string, ...args: any[]) {\n console.log(this.formatMessage('success', message), ...args);\n }\n\n debug(message: string, ...args: any[]) {\n if (this.level === 'debug') {\n console.log(this.formatMessage('debug', message), ...args);\n }\n }\n\n highlightCodeBlocks(text: string) {\n if (!text.includes('```')) return text;\n\n const parts = text.split(/(```[\\s\\S]*?```)/g);\n return parts\n .map(part => {\n if (!part.startsWith('```')) return part;\n return color.cyan(part);\n })\n .join('');\n }\n\n printWithHighlight(text: string) {\n // Rich markdown rendering for terminal\n let output = this.highlightCodeBlocks(text);\n\n // Process line-by-line for headers, bullets, etc.\n output = output.split('\\n').map(line => {\n // Headers: # ## ###\n if (/^#{1,3}\\s/.test(line)) {\n return color.bold(color.cyan(line));\n }\n // Bullet points\n if (/^\\s*[-*]\\s/.test(line)) {\n return line.replace(/^(\\s*)([-*])(\\s)/, `$1${color.cyan('$2')}$3`);\n }\n // Numbered lists\n if (/^\\s*\\d+\\.\\s/.test(line)) {\n return line.replace(/^(\\s*)(\\d+\\.)(\\s)/, `$1${color.cyan('$2')}$3`);\n }\n return line;\n }).join('\\n');\n\n // Inline formatting (skip inside code blocks)\n // Bold: **text**\n output = output.replace(/\\*\\*([^*]+)\\*\\*/g, (_, t) => color.bold(t));\n // Inline code: `text`\n output = output.replace(/`([^`]+)`/g, (_, t) => color.cyan(t));\n\n console.log(output);\n }\n\n highlightDiff(diff: string) {\n return diff\n .split('\\n')\n .map(line => {\n if (line.startsWith('+') && !line.startsWith('+++')) return color.green(line);\n if (line.startsWith('-') && !line.startsWith('---')) return color.red(line);\n if (line.startsWith('@@')) return color.cyan(line);\n if (line.startsWith('diff') || line.startsWith('index') || line.startsWith('---') || line.startsWith('+++')) {\n return color.bold(line);\n }\n return line;\n })\n .join('\\n');\n }\n\n progress(current: number, total: number, label = 'Progress') {\n const safeTotal = Math.max(1, total);\n const clamped = Math.min(Math.max(current, 0), safeTotal);\n const width = 24;\n const filled = Math.round((clamped / safeTotal) * width);\n const bar = `${'='.repeat(filled)}${'-'.repeat(width - filled)}`;\n const pct = Math.round((clamped / safeTotal) * 100);\n console.log(`${color.blue(label)} [${bar}] ${pct}% (${clamped}/${safeTotal})`);\n }\n}\n\n/** Shared singleton logger instance for modules that need lightweight logging without injection. */\nexport const logger = new Logger({ level: process.env.CREW_LOG_LEVEL || 'info' });\n", "import { readdir, readFile, stat } from 'node:fs/promises';\nimport { dirname, extname, join, relative, resolve } from 'node:path';\nimport ignore from 'ignore';\n\nexport interface RepositoryGraphNode {\n path: string;\n imports: string[];\n importedBy: string[];\n}\n\nexport interface RepositoryGraph {\n root: string;\n nodeCount: number;\n edgeCount: number;\n nodes: RepositoryGraphNode[];\n}\n\nfunction toHtmlEscaped(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nconst SOURCE_EXTENSIONS = new Set([\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs'\n]);\n\nfunction createIgnoreMatcher(rootDir: string) {\n const ig = ignore();\n ig.add(['.git', 'node_modules', 'dist', 'build', '.crew', '.next', '.turbo', 'coverage']);\n return readFile(join(rootDir, '.gitignore'), 'utf8')\n .then(content => {\n ig.add(content);\n return ig;\n })\n .catch(() => ig);\n}\n\nasync function walkIncludedEntries(rootDir: string): Promise<Array<{ fullPath: string; relPath: string; isDir: boolean }>> {\n console.log(`[walkIncludedEntries] Starting walk for root: ${rootDir}`);\n const ig = await createIgnoreMatcher(rootDir);\n console.log(`[walkIncludedEntries] Ignore matcher created`);\n const out: Array<{ fullPath: string; relPath: string; isDir: boolean }> = [];\n\n async function walk(currentPath: string): Promise<void> {\n const relCurrentPath = relative(rootDir, currentPath);\n console.log(`[walk] Entering directory: ${relCurrentPath || '(root)'}`);\n \n let entries: string[];\n try {\n entries = await readdir(currentPath);\n console.log(`[walk] Directory ${relCurrentPath || '(root)'} contains ${entries.length} entries`);\n } catch (err) {\n console.log(`[walk] Failed to read directory ${relCurrentPath || '(root)'}: ${err}`);\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentPath, entry);\n const relPath = relative(rootDir, fullPath);\n console.log(`[walk] Processing entry: ${relPath}`);\n \n let entryStat;\n try {\n entryStat = await stat(fullPath);\n console.log(`[walk] Successfully stat'd: ${relPath}`);\n } catch (err) {\n console.log(`[walk] Failed to stat ${relPath}: ${err}`);\n continue;\n }\n\n const isDir = entryStat.isDirectory();\n console.log(`[walk] Entry ${relPath} is ${isDir ? 'directory' : 'file'}`);\n \n const checkPath = isDir ? `${relPath}/` : relPath;\n const shouldIgnore = ig.ignores(checkPath);\n console.log(`[walk] Ignore check for ${checkPath}: ${shouldIgnore ? 'IGNORED' : 'INCLUDED'}`);\n \n if (shouldIgnore) {\n console.log(`[walk] Skipping ignored path: ${checkPath}`);\n continue;\n }\n\n console.log(`[walk] Adding to output: ${relPath} (${isDir ? 'dir' : 'file'})`);\n out.push({ fullPath, relPath, isDir });\n \n if (isDir) {\n console.log(`[walk] Recursing into directory: ${relPath}`);\n await walk(fullPath);\n console.log(`[walk] Returned from directory: ${relPath}`);\n }\n }\n \n console.log(`[walk] Exiting directory: ${relCurrentPath || '(root)'}`);\n }\n\n await walk(rootDir);\n console.log(`[walkIncludedEntries] Walk complete. Found ${out.length} entries (${out.filter(e => e.isDir).length} dirs, ${out.filter(e => !e.isDir).length} files)`);\n return out;\n}\n\nfunction parseImports(content: string): string[] {\n const specs = new Set<string>();\n const patterns = [\n /import\\s+[^'\"]*?from\\s+['\"]([^'\"]+)['\"]/g,\n /import\\s*?\\(\\s*?['\"]([^'\"]+)['\"]\\s*?\\)/g,\n /export\\s+[^'\"]*?from\\s+['\"]([^'\"]+)['\"]/g,\n /require\\s*?\\(\\s*?['\"]([^'\"]+)['\"]\\s*?\\)/g\n ];\n\n for (const rx of patterns) {\n for (const match of content.matchAll(rx)) {\n if (match[1]) specs.add(match[1]);\n }\n }\n return Array.from(specs);\n}\n\nfunction resolveImport(fromFile: string, specifier: string, knownFiles: Set<string>): string | null {\n if (!specifier.startsWith('.')) return null;\n const fromDir = dirname(fromFile);\n const absBase = resolve(fromDir, specifier);\n const candidates = [\n absBase,\n `${absBase}.ts`,\n `${absBase}.tsx`,\n `${absBase}.js`,\n `${absBase}.jsx`,\n `${absBase}.mjs`,\n `${absBase}.cjs`,\n join(absBase, 'index.ts'),\n join(absBase, 'index.tsx'),\n join(absBase, 'index.js'),\n join(absBase, 'index.jsx'),\n join(absBase, 'index.mjs'),\n join(absBase, 'index.cjs')\n ];\n\n for (const candidate of candidates) {\n if (knownFiles.has(candidate)) return candidate;\n }\n return null;\n}\n\nexport async function buildRepositoryGraph(dirPath: string): Promise<RepositoryGraph> {\n const root = resolve(dirPath);\n const entries = await walkIncludedEntries(root);\n const sourceFiles = entries\n .filter(entry => !entry.isDir && SOURCE_EXTENSIONS.has(extname(entry.fullPath).toLowerCase()))\n .map(entry => entry.fullPath);\n\n const knownFileSet = new Set(sourceFiles);\n const importsByFile = new Map<string, Set<string>>();\n const importedByFile = new Map<string, Set<string>>();\n\n for (const file of sourceFiles) {\n importsByFile.set(file, new Set());\n importedByFile.set(file, new Set());\n }\n\n for (const file of sourceFiles) {\n let content = '';\n try {\n content = await readFile(file, 'utf8');\n } catch {\n continue;\n }\n const imports = parseImports(content);\n for (const specifier of imports) {\n const resolved = resolveImport(file, specifier, knownFileSet);\n if (!resolved) continue;\n importsByFile.get(file)?.add(resolved);\n importedByFile.get(resolved)?.add(file);\n }\n }\n\n const nodes: RepositoryGraphNode[] = sourceFiles.map(file => ({\n path: relative(root, file),\n imports: Array.from(importsByFile.get(file) || []).map(x => relative(root, x)).sort(),\n importedBy: Array.from(importedByFile.get(file) || []).map(x => relative(root, x)).sort()\n })).sort((a, b) => a.path.localeCompare(b.path));\n\n const edgeCount = nodes.reduce((sum, node) => sum + node.imports.length, 0);\n return {\n root,\n nodeCount: nodes.length,\n edgeCount,\n nodes\n };\n}\n\nexport async function buildRepositoryMap(dirPath: string): Promise<string> {\n const root = resolve(dirPath);\n const entries = await walkIncludedEntries(root);\n const lines: string[] = [];\n const rootName = root.split('/').pop() || '.';\n lines.push(`${rootName}/`);\n\n const byParent = new Map<string, Array<{ fullPath: string; relPath: string; isDir: boolean }>>();\n for (const entry of entries) {\n const parentRel = relative(root, dirname(entry.fullPath));\n const key = parentRel === '' ? '.' : parentRel;\n if (!byParent.has(key)) byParent.set(key, []);\n byParent.get(key)?.push(entry);\n }\n\n function render(relDir: string, prefix: string) {\n const bucket = (byParent.get(relDir) || []).slice().sort((a, b) => {\n if (a.isDir && !b.isDir) return -1;\n if (!a.isDir && b.isDir) return 1;\n return a.relPath.localeCompare(b.relPath);\n });\n\n for (let i = 0; i < bucket.length; i += 1) {\n const item = bucket[i];\n const isLast = i === bucket.length - 1;\n const marker = isLast ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 ';\n lines.push(`${prefix}${marker}${item.relPath.split('/').pop() || item.relPath}${item.isDir ? '/' : ''}`);\n if (item.isDir) {\n render(item.relPath, `${prefix}${isLast ? ' ' : '\u2502 '}`);\n }\n }\n }\n\n render('.', '');\n return `${lines.join('\\n')}\\n`;\n}\n\nexport function renderGraphHtml(graph: RepositoryGraph): string {\n const data = JSON.stringify(graph);\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <title>Repository Graph</title>\n <style>\n :root { --bg:#0f172a; --card:#111827; --text:#e5e7eb; --muted:#94a3b8; --link:#38bdf8; --edge:#334155; }\n body { margin:0; background:linear-gradient(120deg,#0b1220,#111827); color:var(--text); font:14px/1.4 ui-monospace,SFMono-Regular,Menlo,monospace; }\n .wrap { max-width:1200px; margin:0 auto; padding:24px; }\n h1 { margin:0 0 4px; font-size:20px; }\n .meta { color:var(--muted); margin-bottom:16px; }\n .search { width:100%; padding:10px 12px; border:1px solid #374151; border-radius:8px; background:#0b1020; color:var(--text); margin-bottom:14px; }\n .grid { display:grid; gap:10px; grid-template-columns:repeat(auto-fill,minmax(320px,1fr)); }\n .node { background:rgba(17,24,39,.8); border:1px solid #1f2937; border-radius:10px; padding:12px; }\n .path { color:var(--link); font-weight:600; margin-bottom:8px; word-break:break-all; }\n .label { color:var(--muted); font-size:12px; text-transform:uppercase; letter-spacing:.04em; }\n .list { margin:6px 0 0; padding-left:16px; max-height:120px; overflow:auto; }\n .empty { color:var(--muted); font-style:italic; }\n </style>\n</head>\n<body>\n <div class=\"wrap\">\n <h1>Repository Dependency Graph</h1>\n <div class=\"meta\" id=\"meta\"></div>\n <input id=\"search\" class=\"search\" placeholder=\"Filter nodes by path...\" />\n <div id=\"grid\" class=\"grid\"></div>\n </div>\n <script>\n const graph = ${data};\n const grid = document.getElementById('grid');\n const meta = document.getElementById('meta');\n const search = document.getElementById('search');\n const esc = s => String(s).replace(/[&<>\\\\\"]/g, c => ({'&':'&','<':'<','>':'>','\"':'"'}[c] || c));\n meta.textContent = \\`\\${graph.root} | nodes: \\${graph.nodeCount} | edges: \\${graph.edgeCount}\\`;\n function render(filter = '') {\n const q = filter.trim().toLowerCase();\n const nodes = graph.nodes.filter(n => !q || n.path.toLowerCase().includes(q));\n grid.innerHTML = nodes.map(n => \\`\n <article class=\"node\">\n <div class=\"path\">\\${esc(n.path)}</div>\n <div class=\"label\">imports</div>\n \\${n.imports.length ? '<ul class=\"list\">' + n.imports.map(i => '<li>' + esc(i) + '</li>').join('') + '</ul>' : '<div class=\"empty\">(none)</div>'}\n <div class=\"label\" style=\"margin-top:8px\">imported by</div>\n \\${n.importedBy.length ? '<ul class=\"list\">' + n.importedBy.map(i => '<li>' + esc(i) + '</li>').join('') + '</ul>' : '<div class=\"empty\">(none)</div>'}\n </article>\n \\`).join('');\n }\n render();\n search.addEventListener('input', () => render(search.value));\n </script>\n</body>\n</html>\n`;\n}\n\nexport function buildRepositoryGraphDot(graph: RepositoryGraph): string {\n const lines: string[] = [];\n lines.push('digraph RepositoryGraph {');\n lines.push(' rankdir=LR;');\n lines.push(' node [shape=box, style=rounded, fontsize=10];');\n\n for (const node of graph.nodes) {\n lines.push(` \"${node.path}\";`);\n }\n for (const node of graph.nodes) {\n for (const target of node.imports) {\n lines.push(` \"${node.path}\" -> \"${target}\";`);\n }\n }\n lines.push('}');\n return `${lines.join('\\n')}\\n`;\n}\n\nfunction escapeHtml(value: string): string {\n return String(value)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nexport function buildRepositoryGraphHtml(graph: RepositoryGraph): string {\n const payload = JSON.stringify(graph);\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Repository Graph</title>\n <style>\n :root { --bg:#0b1220; --panel:#111a2d; --text:#dbe7ff; --muted:#8fa7d1; --accent:#63d3ff; --line:#21314f; }\n * { box-sizing:border-box; }\n body { margin:0; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; background:linear-gradient(160deg,#0a1324,#101a31); color:var(--text); }\n .wrap { display:grid; grid-template-columns: 360px 1fr; min-height:100vh; }\n .left { border-right:1px solid var(--line); padding:16px; background:rgba(8,13,24,.6); }\n .right { padding:16px; }\n input { width:100%; padding:10px; border:1px solid var(--line); border-radius:10px; background:#0f1728; color:var(--text); }\n h1 { margin:0 0 8px; font-size:16px; color:var(--accent); }\n .meta { color:var(--muted); font-size:12px; margin-bottom:12px; }\n .list { margin-top:10px; max-height:calc(100vh - 130px); overflow:auto; border:1px solid var(--line); border-radius:10px; }\n .item { padding:10px 12px; border-bottom:1px solid var(--line); cursor:pointer; font-size:12px; }\n .item:hover, .item.active { background:#17223b; }\n .item:last-child { border-bottom:none; }\n .panel { border:1px solid var(--line); border-radius:12px; padding:14px; background:rgba(12,18,32,.75); }\n .k { color:var(--muted); font-size:12px; margin-top:10px; }\n .v { white-space:pre-wrap; font-size:12px; line-height:1.45; }\n @media (max-width: 900px) { .wrap { grid-template-columns: 1fr; } .left { border-right:none; border-bottom:1px solid var(--line); } }\n </style>\n</head>\n<body>\n <div class=\"wrap\">\n <aside class=\"left\">\n <h1>Repository Graph</h1>\n <div class=\"meta\">${escapeHtml(graph.root)}<br/>${graph.nodeCount} nodes \u2022 ${graph.edgeCount} edges</div>\n <input id=\"q\" placeholder=\"Filter files...\" />\n <div id=\"list\" class=\"list\"></div>\n </aside>\n <main class=\"right\">\n <div class=\"panel\">\n <h1 id=\"title\">Select a node</h1>\n <div class=\"k\">Imports</div>\n <div id=\"imports\" class=\"v\">(none)</div>\n <div class=\"k\">Imported By</div>\n <div id=\"importedBy\" class=\"v\">(none)</div>\n </div>\n </main>\n </div>\n <script>\n const graph = ${payload};\n const list = document.getElementById('list');\n const q = document.getElementById('q');\n const title = document.getElementById('title');\n const importsEl = document.getElementById('imports');\n const importedByEl = document.getElementById('importedBy');\n let activePath = '';\n function render(items) {\n list.innerHTML = '';\n for (const node of items) {\n const row = document.createElement('div');\n row.className = 'item' + (node.path === activePath ? ' active' : '');\n row.textContent = node.path;\n row.onclick = () => select(node.path);\n list.appendChild(row);\n }\n }\n function select(path) {\n activePath = path;\n const node = graph.nodes.find(n => n.path === path);\n if (!node) return;\n title.textContent = node.path;\n importsEl.textContent = node.imports.length ? node.imports.join('\\\\n') : '(none)';\n importedByEl.textContent = node.importedBy.length ? node.importedBy.join('\\\\n') : '(none)';\n render(filterNodes(q.value));\n }\n function filterNodes(text) {\n const t = String(text || '').toLowerCase().trim();\n if (!t) return graph.nodes;\n return graph.nodes.filter(n => n.path.toLowerCase().includes(t));\n }\n q.addEventListener('input', () => render(filterNodes(q.value)));\n render(graph.nodes);\n if (graph.nodes[0]) select(graph.nodes[0].path);\n </script>\n</body>\n</html>\n`;\n}\n", "import { spawn as spawnChild } from 'node:child_process';\n\nexport interface PtyRunOptions {\n cwd?: string;\n shell?: string;\n cols?: number;\n rows?: number;\n timeoutMs?: number;\n}\n\nexport interface PtyRunResult {\n success: boolean;\n exitCode: number;\n signal: string | null;\n output: string;\n}\n\nexport async function runPtyCommand(command: string, options: PtyRunOptions = {}): Promise<PtyRunResult> {\n if (!command || !String(command).trim()) {\n throw new Error('PTY command is required');\n }\n\n let ptyPackage: any = null;\n try {\n ptyPackage = await import('node-pty');\n } catch {\n ptyPackage = null;\n }\n\n if (ptyPackage?.spawn) {\n try {\n return await runWithNodePty(command, options, ptyPackage);\n } catch {\n return runWithInherit(command, options);\n }\n }\n return runWithInherit(command, options);\n}\n\nasync function runWithNodePty(command: string, options: PtyRunOptions, ptyPackage: any): Promise<PtyRunResult> {\n return new Promise(resolve => {\n const shell = options.shell || process.env.SHELL || '/bin/bash';\n const pty = ptyPackage.spawn(shell, ['-lc', command], {\n name: 'xterm-color',\n cwd: options.cwd || process.cwd(),\n cols: options.cols || process.stdout.columns || 120,\n rows: options.rows || process.stdout.rows || 30,\n env: process.env\n });\n\n let output = '';\n let done = false;\n\n const timeoutMs = options.timeoutMs || 0;\n const timer = timeoutMs > 0\n ? setTimeout(() => {\n if (done) return;\n done = true;\n pty.kill();\n resolve({ success: false, exitCode: -1, signal: 'SIGTERM', output });\n }, timeoutMs)\n : null;\n\n const onData = (data: string) => {\n output += data;\n process.stdout.write(data);\n };\n pty.onData(onData);\n\n const onResize = () => {\n const cols = process.stdout.columns || 120;\n const rows = process.stdout.rows || 30;\n try {\n pty.resize(cols, rows);\n } catch {\n // Ignore resize failures.\n }\n };\n process.stdout.on('resize', onResize);\n\n pty.onExit(({ exitCode, signal }: { exitCode: number; signal: number }) => {\n if (done) return;\n done = true;\n if (timer) clearTimeout(timer);\n process.stdout.off('resize', onResize);\n resolve({\n success: exitCode === 0,\n exitCode,\n signal: signal ? String(signal) : null,\n output\n });\n });\n });\n}\n\nasync function runWithInherit(command: string, options: PtyRunOptions): Promise<PtyRunResult> {\n return new Promise(resolve => {\n const shell = options.shell || process.env.SHELL || '/bin/bash';\n const child = spawnChild(shell, ['-lc', command], {\n cwd: options.cwd || process.cwd(),\n stdio: 'inherit'\n });\n\n const timeoutMs = options.timeoutMs || 0;\n const timer = timeoutMs > 0\n ? setTimeout(() => {\n child.kill('SIGTERM');\n }, timeoutMs)\n : null;\n\n child.on('close', (code, signal) => {\n if (timer) clearTimeout(timer);\n resolve({\n success: (code ?? -1) === 0,\n exitCode: code ?? -1,\n signal: signal ?? null,\n output: ''\n });\n });\n });\n}\n", "import { existsSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\n\n// Lazy-load typescript to avoid blocking ESM module init on Node 24+\n// (Node 24 ESM resolver can't resolve `import ts from 'typescript'` at top level)\nlet _ts: any;\nasync function ensureTs(): Promise<any> {\n if (!_ts) {\n _ts = await import('typescript').then(m => m.default ?? m);\n }\n return _ts;\n}\n\nexport interface LspDiagnostic {\n file: string;\n line: number;\n column: number;\n code: number;\n category: 'error' | 'warning' | 'suggestion' | 'message';\n message: string;\n}\n\nexport interface LspCompletion {\n name: string;\n kind: string;\n sortText?: string;\n}\n\nexport interface LspLocation {\n file: string;\n line: number;\n column: number;\n}\n\nexport interface LspSymbol {\n name: string;\n kind: string;\n line: number;\n column: number;\n}\n\ninterface LoadedProject {\n root: string;\n options: any;\n fileNames: string[];\n}\n\nfunction categoryToText(cat: number): LspDiagnostic['category'] {\n // ts.DiagnosticCategory.Error = 1, Warning = 0, Suggestion = 2, Message = 3\n if (cat === 1) return 'error';\n if (cat === 0) return 'warning';\n if (cat === 2) return 'suggestion';\n return 'message';\n}\n\nfunction loadProject(projectDir: string, ts: any): LoadedProject {\n const root = resolve(projectDir);\n const configPath = ts.findConfigFile(root, ts.sys.fileExists, 'tsconfig.json');\n if (!configPath) {\n throw new Error(`No tsconfig.json found at or above ${root}`);\n }\n\n const configFile = ts.readConfigFile(configPath, ts.sys.readFile);\n if (configFile.error) {\n throw new Error(ts.flattenDiagnosticMessageText(configFile.error.messageText, '\\n'));\n }\n\n const parsed = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n dirname(configPath)\n );\n if (parsed.errors.length > 0) {\n const first = parsed.errors[0];\n throw new Error(ts.flattenDiagnosticMessageText(first.messageText, '\\n'));\n }\n\n return {\n root,\n options: parsed.options,\n fileNames: parsed.fileNames\n };\n}\n\nexport async function typeCheckProject(projectDir: string, includeFiles: string[] = []): Promise<LspDiagnostic[]> {\n const ts = await ensureTs();\n const project = loadProject(projectDir, ts);\n const includeAbs = new Set(includeFiles.map(x => resolve(project.root, x)));\n const shouldFilter = includeAbs.size > 0;\n const host = ts.createCompilerHost(project.options, true);\n const program = ts.createProgram(project.fileNames, project.options, host);\n\n const diagnostics = ts.getPreEmitDiagnostics(program);\n const out: LspDiagnostic[] = [];\n for (const diagnostic of diagnostics) {\n const sourceFile = diagnostic.file;\n if (!sourceFile) continue;\n const absFile = resolve(sourceFile.fileName);\n if (shouldFilter && !includeAbs.has(absFile)) continue;\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(diagnostic.start ?? 0);\n out.push({\n file: absFile,\n line: line + 1,\n column: character + 1,\n code: diagnostic.code,\n category: categoryToText(diagnostic.category),\n message: ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n')\n });\n }\n return out;\n}\n\nfunction kindToText(kind: any): string {\n return String(kind || 'unknown');\n}\n\nfunction createLanguageService(projectDir: string, ts: any) {\n const project = loadProject(projectDir, ts);\n const sourceTexts = new Map<string, { version: number; text: string }>();\n for (const file of project.fileNames) {\n const text = ts.sys.readFile(file) || '';\n sourceTexts.set(resolve(file), { version: 1, text });\n }\n\n const serviceHost = {\n getCompilationSettings: () => project.options,\n getScriptFileNames: () => Array.from(sourceTexts.keys()),\n getScriptVersion: (fileName: string) => String(sourceTexts.get(resolve(fileName))?.version || 1),\n getScriptSnapshot: (fileName: string) => {\n const resolved = resolve(fileName);\n const entry = sourceTexts.get(resolved);\n if (!entry) return undefined;\n return ts.ScriptSnapshot.fromString(entry.text);\n },\n getCurrentDirectory: () => project.root,\n getDefaultLibFileName: (options: any) => ts.getDefaultLibFilePath(options),\n fileExists: ts.sys.fileExists,\n readFile: ts.sys.readFile,\n readDirectory: ts.sys.readDirectory,\n directoryExists: ts.sys.directoryExists,\n getDirectories: ts.sys.getDirectories\n };\n\n const service = ts.createLanguageService(serviceHost);\n return { service, project, sourceTexts };\n}\n\nfunction lineColToPosition(text: string, line: number, column: number): number {\n const lines = text.split('\\n');\n const lineIndex = Math.max(0, line - 1);\n const offset = lines.slice(0, lineIndex).reduce((sum: number, x: string) => sum + x.length + 1, 0) + Math.max(0, column - 1);\n return Math.min(offset, text.length);\n}\n\nexport async function getCompletions(\n projectDir: string,\n filePath: string,\n line: number,\n column: number,\n limit = 50,\n prefix = ''\n): Promise<LspCompletion[]> {\n const ts = await ensureTs();\n const { service, project, sourceTexts } = createLanguageService(projectDir, ts);\n try {\n const absFile = resolve(project.root, filePath);\n if (!existsSync(absFile)) {\n throw new Error(`File not found: ${absFile}`);\n }\n\n if (!sourceTexts.has(absFile)) {\n sourceTexts.set(absFile, { version: 1, text: ts.sys.readFile(absFile) || '' });\n }\n\n const fileText = sourceTexts.get(absFile)?.text || '';\n const lines = fileText.split('\\n');\n const lineIndex = Math.max(0, line - 1);\n const safeLine = lines[lineIndex] || '';\n const offset = lines.slice(0, lineIndex).reduce((sum: number, x: string) => sum + x.length + 1, 0) + Math.max(0, column - 1);\n const position = Math.min(offset, fileText.length);\n\n const completions = service.getCompletionsAtPosition(absFile, position, {\n includeCompletionsWithInsertText: true,\n includeCompletionsForModuleExports: true\n });\n\n const items = (completions?.entries || []).filter((entry: any) => {\n if (!prefix) return true;\n return entry.name.toLowerCase().startsWith(prefix.toLowerCase());\n });\n\n return items.slice(0, Math.max(1, limit)).map((entry: any) => ({\n name: entry.name,\n kind: kindToText(entry.kind),\n sortText: entry.sortText\n }));\n } finally {\n service.dispose();\n }\n}\n\nexport async function getDefinitions(projectDir: string, filePath: string, line: number, column: number): Promise<LspLocation[]> {\n const ts = await ensureTs();\n const { service, project, sourceTexts } = createLanguageService(projectDir, ts);\n try {\n const absFile = resolve(project.root, filePath);\n const fileText = sourceTexts.get(absFile)?.text || ts.sys.readFile(absFile) || '';\n const position = lineColToPosition(fileText, line, column);\n const defs = service.getDefinitionAtPosition(absFile, position) || [];\n return defs.map((def: any) => {\n const sf = service.getProgram()?.getSourceFile(def.fileName);\n const lc = sf?.getLineAndCharacterOfPosition(def.textSpan.start) || { line: 0, character: 0 };\n return {\n file: resolve(def.fileName),\n line: lc.line + 1,\n column: lc.character + 1\n };\n });\n } finally {\n service.dispose();\n }\n}\n\nexport async function getReferences(projectDir: string, filePath: string, line: number, column: number): Promise<LspLocation[]> {\n const ts = await ensureTs();\n const { service, project, sourceTexts } = createLanguageService(projectDir, ts);\n try {\n const absFile = resolve(project.root, filePath);\n const fileText = sourceTexts.get(absFile)?.text || ts.sys.readFile(absFile) || '';\n const position = lineColToPosition(fileText, line, column);\n const refs = service.getReferencesAtPosition(absFile, position) || [];\n return refs.map((ref: any) => {\n const sf = service.getProgram()?.getSourceFile(ref.fileName);\n const lc = sf?.getLineAndCharacterOfPosition(ref.textSpan.start) || { line: 0, character: 0 };\n return {\n file: resolve(ref.fileName),\n line: lc.line + 1,\n column: lc.character + 1\n };\n });\n } finally {\n service.dispose();\n }\n}\n\nexport async function getDocumentSymbols(projectDir: string, filePath: string): Promise<LspSymbol[]> {\n const ts = await ensureTs();\n const { service, project } = createLanguageService(projectDir, ts);\n try {\n const absFile = resolve(project.root, filePath);\n const nav = service.getNavigationTree(absFile);\n const out: LspSymbol[] = [];\n const walk = (node: any) => {\n for (const span of node.spans || []) {\n const sf = service.getProgram()?.getSourceFile(absFile);\n const lc = sf?.getLineAndCharacterOfPosition(span.start) || { line: 0, character: 0 };\n if (node.text && node.text !== '<global>') {\n out.push({\n name: node.text,\n kind: String(node.kind || 'unknown'),\n line: lc.line + 1,\n column: lc.character + 1\n });\n }\n }\n for (const child of node.childItems || []) walk(child);\n };\n walk(nav);\n return out;\n } finally {\n service.dispose();\n }\n}\n", "import { applyPatch } from 'diff';\n\nexport interface EditStrategy {\n name: string;\n apply(original: string, change: string): string;\n}\n\nexport class WholeFileStrategy implements EditStrategy {\n name = 'whole-file';\n apply(original: string, change: string): string {\n return change;\n }\n}\n\n/**\n * Aider-style Search/Replace Blocks\n */\nexport class SearchReplaceStrategy implements EditStrategy {\n name = 'search-replace';\n \n apply(originalContent: string, changePayload: string): string {\n const lines = changePayload.split('\\n');\n let currentContent = originalContent;\n \n let i = 0;\n while (i < lines.length) {\n if (lines[i].trim() === '<<<<<< SEARCH') {\n const searchStart = i + 1;\n let searchEnd = -1;\n let replaceEnd = -1;\n \n for (let j = i + 1; j < lines.length; j++) {\n if (lines[j].trim() === '======') {\n searchEnd = j;\n } else if (lines[j].trim() === '>>>>>> REPLACE') {\n replaceEnd = j;\n break;\n }\n }\n \n if (searchEnd !== -1 && replaceEnd !== -1) {\n const searchBlock = lines.slice(searchStart, searchEnd).join('\\n');\n const replaceBlock = lines.slice(searchEnd + 1, replaceEnd).join('\\n');\n \n if (searchBlock.trim() === '') {\n // Append if search is empty (or handle at start)\n currentContent += replaceBlock;\n } else if (currentContent.includes(searchBlock)) {\n currentContent = currentContent.replace(searchBlock, replaceBlock);\n } else {\n // Fallback: try fuzzy or just ignore?\n // For now, throw to signal failure\n throw new Error('Search block not found in content.');\n }\n i = replaceEnd + 1;\n } else {\n i++;\n }\n } else {\n i++;\n }\n }\n \n return currentContent;\n }\n}\n\n/**\n * Unified Diff format using 'diff' library\n */\nexport class UnifiedDiffStrategy implements EditStrategy {\n name = 'unified-diff';\n apply(original: string, diff: string): string {\n const result = applyPatch(original, diff);\n if (result === false) {\n throw new Error('Failed to apply unified diff patch.');\n }\n return result;\n }\n}\n\nexport function getStrategy(name: string): EditStrategy {\n switch (name) {\n case 'whole-file': return new WholeFileStrategy();\n case 'search-replace': return new SearchReplaceStrategy();\n case 'editblock': return new SearchReplaceStrategy(); // Alias\n case 'unified-diff': return new UnifiedDiffStrategy();\n default: return new WholeFileStrategy();\n }\n}\n", "// @ts-nocheck\n/**\n * Local LLM executor - runs tasks without gateway dependency\n * This is the standalone Tier 2 executor that handles tasks directly\n */\n\nimport { Logger } from '../utils/logger.js';\n\nexport interface ExecutorOptions {\n model?: string;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string; // Override default executor prompt with specialized persona\n jsonMode?: boolean; // Force JSON response mode (for routing/planning only)\n sessionId?: string; // Session ID for cache coherence (Grok, Anthropic)\n}\n\nexport interface ExecutorResult {\n success: boolean;\n result: string;\n model: string;\n promptTokens?: number;\n completionTokens?: number;\n cachedTokens?: number; // Cache hit tokens (Grok, OpenAI, Anthropic)\n costUsd?: number;\n}\n\nconst EXECUTOR_SYSTEM_PROMPT = `You are the conversational interface for CrewSwarm CLI.\n\n## Your Role\n- Handle user interaction, clarifications, and responses\n- Lead with the answer, not the reasoning. Skip preamble and filler.\n- Keep it concise and actionable - under 2000 chars\n- Match crew-lead's personality: sharp, direct, no filler\n\n## Personality\n- Be concise and sharp - no fluff\n- When the user is direct, match their energy\n- Research well, build anything, never make excuses\n\n## Technical Capabilities\nYou can:\n- Answer technical questions clearly\n- Write, edit, and explain code\n- Provide step-by-step guidance\n- Make architectural recommendations\n\n## Principles\n- Read before acting: never claim what a file contains without reading it first.\n- Match the request: do what was asked, don't over-scope or over-engineer.\n- Own mistakes: if wrong, say so briefly and fix it. Don't repeat failing approaches.\n- Never fabricate file contents, command output, or tool results.\n\nBe concise, accurate, and helpful. Format code in markdown blocks.`;\n\n\nexport class LocalExecutor {\n private logger = new Logger();\n private readonly timeoutMs = this.getTimeoutMs();\n\n /**\n * Execute a task using local LLM (no gateway required)\n */\n async execute(task: string, options: ExecutorOptions = {}): Promise<ExecutorResult> {\n const model = options.model || this.getDefaultModel();\n const systemPrompt = options.systemPrompt || EXECUTOR_SYSTEM_PROMPT;\n \n // Determine provider from model name\n // If a specific model is requested, ONLY try that provider (no fallbacks)\n // Fallbacks only apply for default/generic models\n let providers: string[] = [];\n \n if (model.startsWith('gemini')) {\n providers = ['gemini']; // Only Gemini for gemini-* models\n } else if (model.startsWith('deepseek')) {\n providers = ['deepseek']; // Only DeepSeek for deepseek-* models\n } else if (model.startsWith('grok')) {\n providers = ['grok']; // Only Grok for grok-* models\n } else if (model.startsWith('claude')) {\n providers = ['anthropic']; // Only Anthropic for claude-* models\n } else if (model.startsWith('gpt-')) {\n providers = ['openai']; // Only OpenAI for gpt-* models\n } else if (model.includes('llama') || model.includes('mixtral')) {\n providers = ['groq', 'grok', 'deepseek']; // Try multiple for generic models\n } else {\n // Generic/unknown model - try all providers\n providers = ['openai', 'anthropic', 'grok', 'gemini', 'deepseek'];\n }\n \n const failures: string[] = [];\n \n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[Executor] Model: ${model}, Providers: [${providers.join(', ')}]`);\n \n for (const provider of providers) {\n try {\n console.log(`[Executor] Trying provider: ${provider}`);\n const result = await this.executeWithProvider(provider, task, model, options, systemPrompt);\n if (result) return result;\n failures.push(`${provider}: returned null (API key missing or timed out)`);\n } catch (err) {\n const errMsg = (err as Error).message;\n failures.push(`${provider}: ${errMsg}`);\n this.logger.warn(`Provider ${provider} failed: ${errMsg}`);\n }\n }\n \n this.logger.error('All providers failed:', failures.join('; '));\n this.logger.debug('API keys present:', JSON.stringify({\n OPENAI: !!process.env.OPENAI_API_KEY,\n ANTHROPIC: !!process.env.ANTHROPIC_API_KEY,\n XAI: !!process.env.XAI_API_KEY,\n GEMINI: !!process.env.GEMINI_API_KEY,\n DEEPSEEK: !!process.env.DEEPSEEK_API_KEY\n }));\n \n throw new Error('No LLM providers available. Set OPENAI_API_KEY, ANTHROPIC_API_KEY, XAI_API_KEY, GEMINI_API_KEY, or DEEPSEEK_API_KEY');\n }\n\n private getTimeoutMs(): number {\n const raw = Number(process.env.CREW_EXECUTOR_TIMEOUT_MS || 90000);\n if (!Number.isFinite(raw) || raw < 1000) return 90000;\n return Math.floor(raw);\n }\n\n private getDefaultModel(): string {\n // Check environment variable first\n const envModel = process.env.CREW_EXECUTION_MODEL || process.env.CREW_CHAT_MODEL || process.env.CREW_REASONING_MODEL;\n if (envModel) return envModel;\n \n // Fall back to API key detection\n if (process.env.OPENAI_API_KEY) return 'gpt-4o';\n if (process.env.ANTHROPIC_API_KEY) return 'claude-3-5-sonnet-20241022';\n if (process.env.XAI_API_KEY) return 'grok-beta';\n if (process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY) return 'gemini-2.5-flash';\n if (process.env.DEEPSEEK_API_KEY) return 'deepseek-chat';\n return 'grok-beta';\n }\n\n private async executeWithProvider(\n provider: string,\n task: string,\n model: string,\n options: ExecutorOptions,\n systemPrompt: string\n ): Promise<ExecutorResult | null> {\n switch (provider) {\n case 'openai':\n return this.executeWithOpenAI(task, options, systemPrompt, options.sessionId);\n case 'groq':\n return this.executeWithGroq(task, options, systemPrompt);\n case 'grok':\n return this.executeWithGrok(task, options, systemPrompt, options.sessionId);\n case 'gemini':\n return this.executeWithGemini(task, options, systemPrompt);\n case 'deepseek':\n return this.executeWithDeepSeek(task, options, systemPrompt);\n case 'anthropic':\n return this.executeWithAnthropic(task, options, systemPrompt, options.sessionId);\n default:\n return null;\n }\n }\n\n private async executeWithGroq(task: string, options: ExecutorOptions, systemPrompt: string): Promise<ExecutorResult | null> {\n const apiKey = process.env.GROQ_API_KEY;\n if (!apiKey) return null;\n\n try {\n const response = await fetch('https://api.groq.com/openai/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`\n },\n signal: AbortSignal.timeout(this.timeoutMs),\n body: JSON.stringify({\n model: 'llama-3.3-70b-versatile',\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: task }\n ],\n temperature: options.temperature || 0.7,\n max_tokens: options.maxTokens || 2000\n })\n });\n\n if (!response.ok) {\n throw new Error(`Groq API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n const cost = this.calculateCost('groq-llama', data.usage?.prompt_tokens || 0, data.usage?.completion_tokens || 0);\n\n return {\n success: true,\n result: data.choices[0].message.content,\n costUsd: cost,\n model: 'llama-3.3-70b-versatile'\n };\n } catch (err) {\n this.logger.error(`Groq execution failed: ${(err as Error).message}`);\n return null;\n }\n }\n\n private async executeWithGrok(task: string, options: ExecutorOptions, systemPrompt: string, sessionId?: string): Promise<ExecutorResult | null> {\n const key = process.env.XAI_API_KEY;\n if (!key) return null;\n\n // Use model from env or options, fallback to grok-4-1-fast-reasoning\n const model = options.model || process.env.CREW_EXECUTION_MODEL || 'grok-4-1-fast-reasoning';\n\n try {\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[Grok] Starting API call (model: ${model})...`);\n const callStart = Date.now();\n \n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${key}`\n };\n \n // Add x-grok-conv-id for better cache coherence (increases cache hit rate)\n if (sessionId) {\n headers['x-grok-conv-id'] = sessionId;\n }\n \n const response = await fetch('https://api.x.ai/v1/chat/completions', {\n method: 'POST',\n headers,\n signal: AbortSignal.timeout(this.timeoutMs),\n body: JSON.stringify({\n model,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: task }\n ],\n temperature: options.temperature || 0.7,\n max_tokens: options.maxTokens || 4000\n })\n });\n\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[Grok] Response received in ${Date.now() - callStart}ms (status: ${response.status})`);\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n console.log(`[Grok] API error: ${response.status} - ${errorText}`);\n return null;\n }\n\n const data = await response.json() as any;\n const content = data?.choices?.[0]?.message?.content;\n if (!content) return null;\n\n // Track cache hits from Grok (50% savings on cached tokens)\n const cachedTokens = data?.usage?.prompt_tokens_details?.cached_tokens || 0;\n if (cachedTokens > 0) {\n const totalPrompt = data?.usage?.prompt_tokens || 0;\n const pct = Math.round((cachedTokens / totalPrompt) * 100);\n console.log(`[Grok] cache hit: ${cachedTokens}/${totalPrompt} tokens cached (${pct}%) \u2014 50% cost savings`);\n }\n\n return {\n success: true,\n result: content,\n model,\n promptTokens: data?.usage?.prompt_tokens,\n completionTokens: data?.usage?.completion_tokens,\n cachedTokens,\n costUsd: this.calculateGrokCostWithCache(data?.usage)\n };\n } catch (err) {\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[Grok] Exception: ${(err as Error).message}`);\n this.logger.debug(`Grok execution failed: ${(err as Error).message}`);\n return null;\n }\n }\n\n private calculateGrokCostWithCache(usage: any): number {\n if (!usage) return 0;\n \n const totalPrompt = usage.prompt_tokens || 0;\n const cachedTokens = usage.prompt_tokens_details?.cached_tokens || 0;\n const regularTokens = totalPrompt - cachedTokens;\n const completionTokens = usage.completion_tokens || 0;\n \n // Grok-4 pricing: $5/1M input, $15/1M output\n // Cached tokens: 50% discount\n const regularCost = (regularTokens * 5.00) / 1_000_000;\n const cachedCost = (cachedTokens * 2.50) / 1_000_000; // 50% off\n const outputCost = (completionTokens * 15.00) / 1_000_000;\n \n return regularCost + cachedCost + outputCost;\n }\n\n private async executeWithGemini(task: string, options: ExecutorOptions, systemPrompt: string): Promise<ExecutorResult | null> {\n const key = process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY;\n const verbose = process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true';\n if (!key) {\n if (verbose) console.log('[Gemini] No API key found');\n return null;\n }\n\n const model = options.model || this.getDefaultModel();\n if (verbose) console.log(`[Gemini] Starting API call (model: ${model})...`);\n\n // Use explicit jsonMode flag, or detect if task expects JSON output\n const expectsJson = options.jsonMode === true || (\n options.jsonMode !== false && (\n task.toLowerCase().includes('return only valid json') || \n (task.includes('{\"') && task.includes('\"}'))\n )\n );\n \n if (expectsJson && verbose) {\n console.log('[Gemini] JSON mode enabled');\n }\n\n try {\n const requestBody: any = {\n contents: [{\n parts: [{\n text: `${systemPrompt}\\n\\nUser task: ${task}`\n }]\n }],\n generationConfig: {\n temperature: options.temperature || 0.7,\n maxOutputTokens: options.maxTokens || 4000\n }\n };\n\n // Enable JSON mode for structured outputs\n if (expectsJson) {\n requestBody.generationConfig.responseMimeType = 'application/json';\n }\n\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${encodeURIComponent(key)}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n signal: AbortSignal.timeout(this.timeoutMs),\n body: JSON.stringify(requestBody)\n }\n );\n\n if (verbose) {\n console.log(`[Gemini] Response received (status: ${response.status})`);\n }\n \n if (!response.ok) {\n const errorText = await response.text();\n if (verbose) {\n console.log(`[Gemini] API error: ${response.status} - ${errorText}`);\n }\n return null;\n }\n\n const data = await response.json() as any;\n const content = data?.candidates?.[0]?.content?.parts?.[0]?.text;\n if (!content) return null;\n\n return {\n success: true,\n result: content,\n model: model,\n promptTokens: data?.usageMetadata?.promptTokenCount,\n completionTokens: data?.usageMetadata?.candidatesTokenCount,\n costUsd: this.calculateCost(model, \n data?.usageMetadata?.promptTokenCount || 0,\n data?.usageMetadata?.candidatesTokenCount || 0)\n };\n } catch (err) {\n this.logger.debug(`Gemini execution failed: ${(err as Error).message}`);\n return null;\n }\n }\n\n private async executeWithDeepSeek(task: string, options: ExecutorOptions, systemPrompt: string): Promise<ExecutorResult | null> {\n const key = process.env.DEEPSEEK_API_KEY;\n if (!key) {\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log('[DeepSeek] No API key found');\n return null;\n }\n\n const model = options.model || 'deepseek-chat';\n \n // For deepseek-reasoner on large tasks, allow much longer timeout\n const timeoutMs = model.includes('reasoner') && (options.maxTokens || 0) > 6000\n ? 10 * 60 * 1000 // 10 minutes for large reasoning tasks\n : this.timeoutMs;\n \n console.log(`[DeepSeek] Starting API call (model: ${model}, timeout: ${timeoutMs/1000}s)...`);\n\n try {\n const response = await fetch('https://api.deepseek.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${key}`\n },\n signal: AbortSignal.timeout(timeoutMs),\n body: JSON.stringify({\n model: model,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: task }\n ],\n temperature: options.temperature || 0.7,\n max_tokens: options.maxTokens || 4000\n })\n });\n\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[DeepSeek] Response received (status: ${response.status})`);\n\n if (!response.ok) {\n const errorText = await response.text();\n console.log(`[DeepSeek] API error: ${response.status} - ${errorText}`);\n return null;\n }\n\n const data = await response.json() as any;\n \n // deepseek-reasoner returns reasoning_content + content\n // deepseek-chat returns only content\n const reasoning_content = data?.choices?.[0]?.message?.reasoning_content;\n let content = data?.choices?.[0]?.message?.content;\n \n if (!content && !reasoning_content) {\n console.log('[DeepSeek] No content or reasoning_content in response');\n return null;\n }\n\n // Log reasoning trace if present (for deepseek-reasoner)\n if (reasoning_content && process.env.DEBUG_REASONING) {\n console.log(`[DeepSeek] Reasoning trace (${reasoning_content.length} chars):`, \n reasoning_content.substring(0, 200) + '...');\n }\n\n // Validate content is not just an empty brace or whitespace\n const trimmedContent = (content || '').trim();\n if (trimmedContent && trimmedContent !== '{' && trimmedContent !== '{}' && trimmedContent.length > 5) {\n // Valid content - use it\n } else if (reasoning_content) {\n // content is invalid/empty but we have reasoning - try to extract JSON from reasoning\n console.log('[DeepSeek] content field invalid, checking reasoning_content for JSON...');\n content = reasoning_content;\n } else {\n console.log('[DeepSeek] No valid content available');\n return null;\n }\n\n // Return ONLY the final answer content (content field)\n // The reasoning_content is internal CoT, not part of structured output\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[DeepSeek] \u2713 Success (${data?.usage?.prompt_tokens || 0} in, ${data?.usage?.completion_tokens || 0} out)`);\n\n return {\n success: true,\n result: content,\n model: model,\n promptTokens: data?.usage?.prompt_tokens,\n completionTokens: data?.usage?.completion_tokens,\n costUsd: this.calculateCost(model, data?.usage?.prompt_tokens || 0, data?.usage?.completion_tokens || 0)\n };\n } catch (err) {\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[DeepSeek] Exception: ${(err as Error).message}`);\n this.logger.debug(`DeepSeek execution failed: ${(err as Error).message}`);\n return null;\n }\n }\n\n private calculateCost(model: string, promptTokens: number, completionTokens: number): number {\n // Rough pricing (per 1M tokens) - March 2026\n const pricing: Record<string, { prompt: number; completion: number }> = {\n 'grok-beta': { prompt: 5, completion: 15 },\n 'grok-4-1-fast-reasoning': { prompt: 5, completion: 15 },\n 'gemini-2.0-flash-exp': { prompt: 0.075, completion: 0.30 },\n 'gemini-2.5-flash': { prompt: 0.075, completion: 0.30 },\n 'gemini-2.5-pro': { prompt: 1.25, completion: 5.00 },\n 'deepseek-chat': { prompt: 0.27, completion: 1.10 },\n 'deepseek-reasoner': { prompt: 0.55, completion: 2.19 },\n 'claude-3-5-sonnet-20241022': { prompt: 3.00, completion: 15.00 },\n 'claude-opus-4-6': { prompt: 5.00, completion: 25.00 },\n 'claude-haiku-4-5': { prompt: 1.00, completion: 5.00 }\n };\n\n const rates = pricing[model] || { prompt: 1, completion: 3 };\n return (promptTokens * rates.prompt + completionTokens * rates.completion) / 1_000_000;\n }\n\n /**\n * Execute with Anthropic (Claude) - supports explicit prompt caching for 90% savings\n */\n private async executeWithAnthropic(\n task: string, \n options: ExecutorOptions,\n systemPrompt: string,\n sessionId?: string\n ): Promise<ExecutorResult | null> {\n const apiKey = process.env.ANTHROPIC_API_KEY;\n if (!apiKey) return null;\n\n const model = options.model || 'claude-3-5-sonnet-20241022';\n \n try {\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[Anthropic] Starting API call (model: ${model})...`);\n const callStart = Date.now();\n\n // Use explicit cache control for 90% savings on system prompt\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n 'content-type': 'application/json'\n },\n signal: AbortSignal.timeout(this.timeoutMs),\n body: JSON.stringify({\n model,\n max_tokens: options.maxTokens || 4000,\n system: [\n {\n type: 'text',\n text: systemPrompt,\n cache_control: { type: 'ephemeral' } // Explicit cache control (90% savings!)\n }\n ],\n messages: [\n { role: 'user', content: task }\n ]\n })\n });\n\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[Anthropic] Response received in ${Date.now() - callStart}ms (status: ${response.status})`);\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n console.log(`[Anthropic] API error: ${response.status} - ${errorText}`);\n return null;\n }\n\n const data = await response.json() as any;\n const content = data?.content?.[0]?.text;\n if (!content) return null;\n\n // Track cache metrics (Anthropic reports detailed cache usage)\n const cacheCreateTokens = data?.usage?.cache_creation_input_tokens || 0;\n const cacheReadTokens = data?.usage?.cache_read_input_tokens || 0;\n const inputTokens = data?.usage?.input_tokens || 0;\n \n if (cacheReadTokens > 0) {\n const totalInput = inputTokens + cacheReadTokens;\n const pct = Math.round((cacheReadTokens / totalInput) * 100);\n console.log(`[Anthropic] cache hit: ${cacheReadTokens}/${totalInput} tokens cached (${pct}%) \u2014 90% cost savings`);\n } else if (cacheCreateTokens > 0) {\n console.log(`[Anthropic] cache write: ${cacheCreateTokens} tokens cached for future requests`);\n }\n\n return {\n success: true,\n result: content,\n model,\n promptTokens: inputTokens,\n completionTokens: data?.usage?.output_tokens,\n cachedTokens: cacheReadTokens,\n costUsd: this.calculateAnthropicCostWithCache(data?.usage)\n };\n } catch (err) {\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[Anthropic] Exception: ${(err as Error).message}`);\n this.logger.debug(`Anthropic execution failed: ${(err as Error).message}`);\n return null;\n }\n }\n\n private calculateAnthropicCostWithCache(usage: any): number {\n if (!usage) return 0;\n \n const inputBase = (usage.input_tokens || 0) * 3.00 / 1_000_000;\n const cacheWrite = (usage.cache_creation_input_tokens || 0) * 3.75 / 1_000_000; // 1.25x\n const cacheRead = (usage.cache_read_input_tokens || 0) * 0.30 / 1_000_000; // 0.1x (90% off!)\n const output = (usage.output_tokens || 0) * 15.00 / 1_000_000;\n \n return inputBase + cacheWrite + cacheRead + output;\n }\n\n /**\n * Execute with OpenAI (GPT-4, GPT-5)\n */\n private async executeWithOpenAI(\n task: string,\n options: ExecutorOptions,\n systemPrompt: string,\n sessionId?: string\n ): Promise<ExecutorResult | null> {\n const key = process.env.OPENAI_API_KEY;\n if (!key) {\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log('[OpenAI] No API key found');\n return null;\n }\n\n const model = options.model || 'gpt-4o';\n \n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[OpenAI] Starting API call (model: ${model})...`);\n\n try {\n // GPT-5+ uses max_completion_tokens, GPT-4 uses max_tokens\n const maxTokensParam = model.startsWith('gpt-5') || model.startsWith('gpt-6')\n ? 'max_completion_tokens'\n : 'max_tokens';\n // GPT-5/6 only support temperature=1 (default); other values cause 400\n const temp = (model.startsWith('gpt-5') || model.startsWith('gpt-6'))\n ? 1\n : (options.temperature ?? 0.7);\n const requestBody: any = {\n model,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: task }\n ],\n temperature: temp,\n [maxTokensParam]: options.maxTokens || 4000\n };\n \n if (options.jsonMode) {\n requestBody.response_format = { type: 'json_object' };\n }\n\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${key}`,\n 'Content-Type': 'application/json'\n },\n signal: AbortSignal.timeout(this.timeoutMs),\n body: JSON.stringify(requestBody)\n });\n\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[OpenAI] Response received (status: ${response.status})`);\n\n if (!response.ok) {\n const errorText = await response.text();\n console.log(`[OpenAI] API error: ${response.status} - ${errorText}`);\n return null;\n }\n\n const data = await response.json() as any;\n const content = data?.choices?.[0]?.message?.content;\n \n if (!content) {\n console.log('[OpenAI] No content in response');\n return null;\n }\n\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[OpenAI] \u2713 Success (${data?.usage?.prompt_tokens || 0} in, ${data?.usage?.completion_tokens || 0} out)`);\n\n return {\n success: true,\n result: content,\n model,\n promptTokens: data?.usage?.prompt_tokens,\n completionTokens: data?.usage?.completion_tokens,\n cachedTokens: 0,\n costUsd: this.calculateOpenAICost(model, data?.usage?.prompt_tokens || 0, data?.usage?.completion_tokens || 0)\n };\n } catch (err) {\n if (process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true') console.log(`[OpenAI] Exception: ${(err as Error).message}`);\n this.logger.debug(`OpenAI execution failed: ${(err as Error).message}`);\n return null;\n }\n }\n\n private calculateOpenAICost(model: string, promptTokens: number, completionTokens: number): number {\n // Pricing per 1M tokens\n const pricing: Record<string, { prompt: number; completion: number }> = {\n 'gpt-5.2': { prompt: 5, completion: 20 },\n 'gpt-5.2-2025-12-11': { prompt: 5, completion: 20 },\n 'gpt-5.2-codex': { prompt: 5, completion: 20 },\n 'gpt-5.1': { prompt: 4, completion: 16 },\n 'gpt-5.1-chat-latest': { prompt: 4, completion: 16 },\n 'gpt-5.1-codex': { prompt: 4, completion: 16 },\n 'gpt-5-mini': { prompt: 0.5, completion: 2 },\n 'gpt-5-nano': { prompt: 0.1, completion: 0.4 },\n 'gpt-4o': { prompt: 2.5, completion: 10 },\n 'gpt-4o-mini': { prompt: 0.15, completion: 0.6 },\n 'gpt-4-turbo': { prompt: 10, completion: 30 }\n };\n \n const rates = pricing[model] || pricing['gpt-4o'];\n return (promptTokens * rates.prompt + completionTokens * rates.completion) / 1_000_000;\n }\n}\n", "/**\n * Runtime profiles - replaces confusing mode system\n */\n\nexport type RuntimeProfile = 'chat' | 'builder' | 'orchestrator';\n\nexport interface ProfileConfig {\n name: RuntimeProfile;\n description: string;\n useLocalExecutor: boolean;\n useGateway: boolean;\n autoApply: boolean;\n showExecutionPath: boolean;\n}\n\nexport const RUNTIME_PROFILES: Record<RuntimeProfile, ProfileConfig> = {\n chat: {\n name: 'chat',\n description: 'Conversational mode - local LLM only, no code execution',\n useLocalExecutor: true,\n useGateway: false,\n autoApply: false,\n showExecutionPath: false\n },\n builder: {\n name: 'builder',\n description: 'Build mode - local execution with manual approval',\n useLocalExecutor: true,\n useGateway: false,\n autoApply: false,\n showExecutionPath: true\n },\n orchestrator: {\n name: 'orchestrator',\n description: 'Team mode - coordinates specialists via gateway',\n useLocalExecutor: false,\n useGateway: true,\n autoApply: false,\n showExecutionPath: true\n }\n};\n\nexport function getProfileConfig(profile: RuntimeProfile): ProfileConfig {\n return RUNTIME_PROFILES[profile];\n}\n\nexport function formatExecutionPath(parts: string[]): string {\n return parts.join(' \u2192 ');\n}\n", "/**\n * Autonomous Worker Loop\n * Implements OpenOrca-style THINK \u2192 ACT \u2192 OBSERVE pattern\n * \n * @license\n * Copyright 2026 CrewSwarm\n */\n\nexport interface ToolCall {\n tool: string;\n params: Record<string, any>;\n}\n\nexport interface TurnResult {\n turn: number;\n tool: string;\n params: Record<string, any>;\n result: any;\n error?: string;\n}\n\nexport interface AutonomousResult {\n success: boolean;\n turns: number;\n history: TurnResult[];\n finalResponse?: string;\n reason?: string;\n}\n\nexport interface AutonomousConfig {\n maxTurns?: number;\n repeatThreshold?: number;\n tools: any[];\n onProgress?: (turn: number, action: string) => void;\n}\n\nconst DEFAULT_MAX_TURNS = 25;\nconst DEFAULT_REPEAT_THRESHOLD = 10;\n\n/**\n * Execute task autonomously with up to MAX_TURNS iterations\n */\nexport async function executeAutonomous(\n task: string,\n executeLLM: (prompt: string, tools: any[], history: TurnResult[]) => Promise<{ toolCalls?: ToolCall[]; response: string; status?: string }>,\n executeTool: (tool: string, params: Record<string, any>) => Promise<any>,\n config: AutonomousConfig\n): Promise<AutonomousResult> {\n const maxTurns = config.maxTurns || DEFAULT_MAX_TURNS;\n const repeatThreshold = config.repeatThreshold || DEFAULT_REPEAT_THRESHOLD;\n const history: TurnResult[] = [];\n\n let lastResponseText = '';\n let staleCount = 0;\n\n for (let turn = 0; turn < maxTurns; turn++) {\n config.onProgress?.(turn + 1, 'THINKING');\n\n // THINK: LLM decides next action\n const response = await executeLLM(task, config.tools, history);\n\n // Check if task is complete\n if (response.status === 'COMPLETE' || !response.toolCalls || response.toolCalls.length === 0) {\n return {\n success: true,\n turns: turn + 1,\n history,\n finalResponse: response.response\n };\n }\n\n // Stale response detection: if LLM gives same text 2x in a row, it's done\n if (response.response && response.response.length > 20) {\n if (response.response === lastResponseText) {\n staleCount++;\n if (staleCount >= 2) {\n return {\n success: true,\n turns: turn + 1,\n history,\n finalResponse: response.response,\n reason: 'Detected stale response (same output repeated), treating as complete'\n };\n }\n } else {\n staleCount = 0;\n }\n lastResponseText = response.response;\n }\n\n // ACT: Execute tool calls \u2014 parallel when multiple, sequential when single\n if (response.toolCalls.length === 1) {\n // Single tool call \u2014 run directly\n const call = response.toolCalls[0];\n config.onProgress?.(turn + 1, `EXECUTING: ${call.tool}`);\n try {\n const result = await executeTool(call.tool, call.params);\n history.push({ turn: turn + 1, tool: call.tool, params: call.params, result });\n } catch (error: any) {\n history.push({ turn: turn + 1, tool: call.tool, params: call.params, result: null, error: error.message });\n }\n } else {\n // Multiple tool calls \u2014 run in parallel for speed\n config.onProgress?.(turn + 1, `EXECUTING ${response.toolCalls.length} tools in parallel`);\n const results = await Promise.allSettled(\n response.toolCalls.map(async (call) => {\n config.onProgress?.(turn + 1, `EXECUTING: ${call.tool}`);\n return { call, result: await executeTool(call.tool, call.params) };\n })\n );\n for (let i = 0; i < results.length; i++) {\n const r = results[i];\n const call = response.toolCalls[i];\n if (r.status === 'fulfilled') {\n history.push({ turn: turn + 1, tool: r.value.call.tool, params: r.value.call.params, result: r.value.result });\n } else {\n history.push({ turn: turn + 1, tool: call.tool, params: call.params, result: null, error: r.reason?.message || 'parallel execution failed' });\n }\n }\n }\n\n // Safety check: Detect if stuck in a loop\n if (turn > repeatThreshold && isRepeating(history, 3)) {\n return {\n success: false,\n turns: turn + 1,\n history,\n reason: 'Detected repeated actions, stopping to prevent infinite loop'\n };\n }\n }\n\n return {\n success: false,\n turns: maxTurns,\n history,\n reason: 'Maximum turns exceeded without completing task'\n };\n}\n\n/**\n * Detect if the agent is repeating the same actions\n */\nfunction isRepeating(history: TurnResult[], windowSize: number = 3): boolean {\n if (history.length < windowSize * 2) return false;\n\n const recentActions = history\n .slice(-windowSize)\n .map(h => `${h.tool}:${JSON.stringify(h.params)}`);\n\n const previousActions = history\n .slice(-windowSize * 2, -windowSize)\n .map(h => `${h.tool}:${JSON.stringify(h.params)}`);\n\n return JSON.stringify(recentActions) === JSON.stringify(previousActions);\n}\n\n/**\n * Format autonomous execution result for display\n */\nexport function formatAutonomousResult(result: AutonomousResult): string {\n let output = `\\n\uD83E\uDD16 Autonomous Execution ${result.success ? '\u2713' : '\u2717'}\\n`;\n output += `Turns: ${result.turns}/${result.history.length}\\n\\n`;\n\n for (const turn of result.history) {\n output += `Turn ${turn.turn}: ${turn.tool}\\n`;\n if (turn.error) {\n output += ` \u2717 Error: ${turn.error}\\n`;\n } else {\n const resultStr = typeof turn.result === 'string' \n ? turn.result.slice(0, 100) \n : JSON.stringify(turn.result).slice(0, 100);\n output += ` \u2713 ${resultStr}${resultStr.length >= 100 ? '...' : ''}\\n`;\n }\n }\n\n if (result.finalResponse) {\n output += `\\n\uD83D\uDCDD Final Response:\\n${result.finalResponse}\\n`;\n }\n\n if (result.reason) {\n output += `\\n\u26A0\uFE0F Stopped: ${result.reason}\\n`;\n }\n\n return output;\n}\n", "/**\n * @license\n * Copyright 2025 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Identity registry for all core tools.\n * Sits at the bottom of the dependency tree to prevent circular imports.\n */\n\n// ============================================================================\n// SHARED PARAMETER NAMES (used by multiple tools)\n// ============================================================================\n\nexport const PARAM_FILE_PATH = 'file_path';\nexport const PARAM_DIR_PATH = 'dir_path';\nexport const PARAM_PATTERN = 'pattern';\nexport const PARAM_CASE_SENSITIVE = 'case_sensitive';\nexport const PARAM_RESPECT_GIT_IGNORE = 'respect_git_ignore';\nexport const PARAM_RESPECT_GEMINI_IGNORE = 'respect_gemini_ignore';\nexport const PARAM_FILE_FILTERING_OPTIONS = 'file_filtering_options';\nexport const PARAM_DESCRIPTION = 'description';\n\n// ============================================================================\n// TOOL NAMES & TOOL-SPECIFIC PARAMETER NAMES\n// ============================================================================\n\n// -- glob --\nexport const GLOB_TOOL_NAME = 'glob';\n\n// -- grep_search --\nexport const GREP_TOOL_NAME = 'grep_search';\nexport const GREP_PARAM_INCLUDE_PATTERN = 'include_pattern';\nexport const GREP_PARAM_EXCLUDE_PATTERN = 'exclude_pattern';\nexport const GREP_PARAM_NAMES_ONLY = 'names_only';\nexport const GREP_PARAM_MAX_MATCHES_PER_FILE = 'max_matches_per_file';\nexport const GREP_PARAM_TOTAL_MAX_MATCHES = 'total_max_matches';\n// ripgrep only\nexport const GREP_PARAM_FIXED_STRINGS = 'fixed_strings';\nexport const GREP_PARAM_CONTEXT = 'context';\nexport const GREP_PARAM_AFTER = 'after';\nexport const GREP_PARAM_BEFORE = 'before';\nexport const GREP_PARAM_NO_IGNORE = 'no_ignore';\n\n// -- list_directory --\nexport const LS_TOOL_NAME = 'list_directory';\nexport const LS_PARAM_IGNORE = 'ignore';\n\n// -- read_file --\nexport const READ_FILE_TOOL_NAME = 'read_file';\nexport const READ_FILE_PARAM_START_LINE = 'start_line';\nexport const READ_FILE_PARAM_END_LINE = 'end_line';\n\n// -- run_shell_command --\nexport const SHELL_TOOL_NAME = 'run_shell_command';\nexport const SHELL_PARAM_COMMAND = 'command';\nexport const SHELL_PARAM_IS_BACKGROUND = 'is_background';\n\n// -- write_file --\nexport const WRITE_FILE_TOOL_NAME = 'write_file';\nexport const WRITE_FILE_PARAM_CONTENT = 'content';\n\n// -- replace (edit) --\nexport const EDIT_TOOL_NAME = 'replace';\nexport const EDIT_PARAM_INSTRUCTION = 'instruction';\nexport const EDIT_PARAM_OLD_STRING = 'old_string';\nexport const EDIT_PARAM_NEW_STRING = 'new_string';\nexport const EDIT_PARAM_ALLOW_MULTIPLE = 'allow_multiple';\n\n// -- google_web_search --\nexport const WEB_SEARCH_TOOL_NAME = 'google_web_search';\nexport const WEB_SEARCH_PARAM_QUERY = 'query';\n\n// -- write_todos --\nexport const WRITE_TODOS_TOOL_NAME = 'write_todos';\nexport const TODOS_PARAM_TODOS = 'todos';\nexport const TODOS_ITEM_PARAM_DESCRIPTION = 'description';\nexport const TODOS_ITEM_PARAM_STATUS = 'status';\n\n// -- web_fetch --\nexport const WEB_FETCH_TOOL_NAME = 'web_fetch';\nexport const WEB_FETCH_PARAM_PROMPT = 'prompt';\n\n// -- read_many_files --\nexport const READ_MANY_FILES_TOOL_NAME = 'read_many_files';\nexport const READ_MANY_PARAM_INCLUDE = 'include';\nexport const READ_MANY_PARAM_EXCLUDE = 'exclude';\nexport const READ_MANY_PARAM_RECURSIVE = 'recursive';\nexport const READ_MANY_PARAM_USE_DEFAULT_EXCLUDES = 'useDefaultExcludes';\n\n// -- save_memory --\nexport const MEMORY_TOOL_NAME = 'save_memory';\nexport const MEMORY_PARAM_FACT = 'fact';\n\n// -- get_internal_docs --\nexport const GET_INTERNAL_DOCS_TOOL_NAME = 'get_internal_docs';\nexport const DOCS_PARAM_PATH = 'path';\n\n// -- activate_skill --\nexport const ACTIVATE_SKILL_TOOL_NAME = 'activate_skill';\nexport const SKILL_PARAM_NAME = 'name';\n\n// -- ask_user --\nexport const ASK_USER_TOOL_NAME = 'ask_user';\nexport const ASK_USER_PARAM_QUESTIONS = 'questions';\n// ask_user question item params\nexport const ASK_USER_QUESTION_PARAM_QUESTION = 'question';\nexport const ASK_USER_QUESTION_PARAM_HEADER = 'header';\nexport const ASK_USER_QUESTION_PARAM_TYPE = 'type';\nexport const ASK_USER_QUESTION_PARAM_OPTIONS = 'options';\nexport const ASK_USER_QUESTION_PARAM_MULTI_SELECT = 'multiSelect';\nexport const ASK_USER_QUESTION_PARAM_PLACEHOLDER = 'placeholder';\n// ask_user option item params\nexport const ASK_USER_OPTION_PARAM_LABEL = 'label';\nexport const ASK_USER_OPTION_PARAM_DESCRIPTION = 'description';\n\n// -- exit_plan_mode --\nexport const EXIT_PLAN_MODE_TOOL_NAME = 'exit_plan_mode';\nexport const EXIT_PLAN_PARAM_PLAN_PATH = 'plan_path';\n\n// -- enter_plan_mode --\nexport const ENTER_PLAN_MODE_TOOL_NAME = 'enter_plan_mode';\nexport const PLAN_MODE_PARAM_REASON = 'reason';\n", "/**\n * Docker-based sandbox for safe command execution\n * Runs commands in isolated Docker containers with staged files\n */\n\nimport { execSync } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport { randomUUID } from 'crypto';\n\nexport interface DockerSandboxOptions {\n workDir: string;\n image?: string;\n timeout?: number;\n env?: Record<string, string>;\n}\n\nexport interface DockerSandboxResult {\n success: boolean;\n output: string;\n exitCode: number;\n duration: number;\n}\n\nexport class DockerSandbox {\n private readonly defaultImage = 'node:20-slim';\n private readonly defaultTimeout = 30000; // 30 seconds\n \n /**\n * Check if Docker is available and running\n */\n async isDockerAvailable(): Promise<boolean> {\n try {\n execSync('docker info', { \n stdio: 'ignore',\n timeout: 5000 \n });\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Copy staged files from sandbox to temp directory\n */\n private async prepareTempDir(sandbox: any, tempDir: string): Promise<number> {\n const pendingPaths = sandbox.getPendingPaths();\n const branch = sandbox.state?.branches?.[sandbox.getActiveBranch()];\n \n if (!branch) return 0;\n\n let fileCount = 0;\n for (const filePath of pendingPaths) {\n const fileData = branch[filePath];\n if (!fileData?.modified) continue;\n\n const fullPath = path.join(tempDir, filePath);\n const dir = path.dirname(fullPath);\n \n // Create directory structure\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Write staged content\n fs.writeFileSync(fullPath, fileData.modified, 'utf8');\n fileCount++;\n }\n\n return fileCount;\n }\n\n /**\n * Run command in Docker container with staged files\n */\n async runCommand(\n command: string,\n sandbox: any,\n options: Partial<DockerSandboxOptions> = {}\n ): Promise<DockerSandboxResult> {\n const startTime = Date.now();\n const tempDir = path.join('/tmp', `crew-sandbox-${randomUUID()}`);\n const image = options.image || this.defaultImage;\n const timeout = options.timeout || this.defaultTimeout;\n const workDir = options.workDir || process.cwd();\n\n try {\n // Create temp directory\n fs.mkdirSync(tempDir, { recursive: true });\n console.log(`[Docker] Created temp dir: ${tempDir}`);\n\n // Copy staged files to temp dir\n const fileCount = await this.prepareTempDir(sandbox, tempDir);\n console.log(`[Docker] Copied ${fileCount} staged file(s) to sandbox`);\n\n // Copy package.json if it exists (for npm commands)\n const pkgPath = path.join(workDir, 'package.json');\n if (fs.existsSync(pkgPath)) {\n fs.copyFileSync(pkgPath, path.join(tempDir, 'package.json'));\n console.log(`[Docker] Copied package.json`);\n }\n\n // Copy node_modules if npm/node command (for dependencies)\n const needsNodeModules = /\\b(npm|node|npx)\\b/.test(command);\n if (needsNodeModules) {\n const nodeModulesPath = path.join(workDir, 'node_modules');\n if (fs.existsSync(nodeModulesPath)) {\n console.log(`[Docker] Copying node_modules (this may take a few seconds)...`);\n execSync(`cp -r \"${nodeModulesPath}\" \"${tempDir}/\"`, {\n stdio: 'ignore',\n timeout: 10000\n });\n }\n }\n\n // Build environment variables\n const envFlags = options.env \n ? Object.entries(options.env).map(([k, v]) => `-e ${k}=\"${v}\"`).join(' ')\n : '';\n\n // Run command in Docker\n console.log(`[Docker] Running: ${command}`);\n const dockerCmd = `docker run --rm -v \"${tempDir}\":/work -w /work ${envFlags} ${image} sh -c \"${command.replace(/\"/g, '\\\\\"')}\"`;\n \n const output = execSync(dockerCmd, {\n encoding: 'utf8',\n timeout,\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n const duration = Date.now() - startTime;\n console.log(`[Docker] \u2713 Command completed in ${duration}ms`);\n\n return {\n success: true,\n output,\n exitCode: 0,\n duration\n };\n\n } catch (err: any) {\n const duration = Date.now() - startTime;\n console.log(`[Docker] \u2717 Command failed after ${duration}ms`);\n \n return {\n success: false,\n output: err.stdout || err.stderr || err.message,\n exitCode: err.status || 1,\n duration\n };\n\n } finally {\n // Cleanup temp directory\n try {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n console.log(`[Docker] Cleaned up temp dir`);\n }\n } catch (cleanupErr) {\n console.warn(`[Docker] Failed to cleanup ${tempDir}:`, cleanupErr);\n }\n }\n }\n\n /**\n * Pull Docker image if not present (with progress)\n */\n async ensureImage(image: string = this.defaultImage): Promise<boolean> {\n try {\n // Check if image exists\n execSync(`docker image inspect ${image}`, { \n stdio: 'ignore',\n timeout: 5000 \n });\n return true; // Image already exists\n } catch {\n // Image doesn't exist, pull it\n console.log(`[Docker] Pulling image ${image}...`);\n try {\n execSync(`docker pull ${image}`, {\n stdio: 'inherit', // Show progress\n timeout: 120000 // 2 minutes for image pull\n });\n console.log(`[Docker] \u2713 Image pulled successfully`);\n return true;\n } catch (pullErr) {\n console.error(`[Docker] Failed to pull image:`, pullErr);\n return false;\n }\n }\n }\n}\n", "/**\n * Adapter to use Gemini CLI tools with crew-cli's sandbox\n */\n\nimport { Sandbox } from '../../sandbox/index.js';\nimport { execSync } from 'node:child_process';\nimport { mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport {\n GLOB_TOOL_NAME,\n GREP_TOOL_NAME,\n LS_TOOL_NAME,\n READ_FILE_TOOL_NAME,\n SHELL_TOOL_NAME,\n WRITE_FILE_TOOL_NAME,\n EDIT_TOOL_NAME,\n WEB_SEARCH_TOOL_NAME,\n WRITE_TODOS_TOOL_NAME,\n WEB_FETCH_TOOL_NAME,\n READ_MANY_FILES_TOOL_NAME,\n MEMORY_TOOL_NAME,\n GET_INTERNAL_DOCS_TOOL_NAME,\n ACTIVATE_SKILL_TOOL_NAME,\n ASK_USER_TOOL_NAME,\n EXIT_PLAN_MODE_TOOL_NAME,\n ENTER_PLAN_MODE_TOOL_NAME\n} from './definitions/base-declarations.js';\n\n// Minimal adapter types\nexport interface ToolResult {\n success: boolean;\n output?: string;\n error?: string;\n}\n\n// Create config adapter for Gemini tools\nexport class CrewConfig {\n constructor(private workspaceRoot: string) {}\n \n getWorkspaceRoot() {\n return this.workspaceRoot;\n }\n \n getTargetDir() {\n return this.workspaceRoot;\n }\n}\n\n// Create message bus adapter (auto-approve for CLI)\nexport class CrewMessageBus {\n async requestConfirmation(): Promise<{ status: 'approved' }> {\n return { status: 'approved' }; // Auto-approve for CLI\n }\n}\n\n// Shell timeout: configurable via CREW_SHELL_TIMEOUT env (seconds), default 120s, max 600s\nfunction getShellTimeout(): number {\n const envVal = parseInt(process.env.CREW_SHELL_TIMEOUT || '', 10);\n if (envVal > 0) return Math.min(envVal * 1000, 600000); // max 600s\n return 120000; // default 120s\n}\n\n// Dangerous shell commands that should warn (matches Claude Code behavior)\nconst DANGEROUS_SHELL_PATTERNS = [\n /\\brm\\s+-rf?\\s/, // rm -r / rm -rf\n /\\bgit\\s+push\\s+.*--force/, // force push\n /\\bgit\\s+reset\\s+--hard/, // hard reset\n /\\bgit\\s+clean\\s+-f/, // clean untracked\n /\\bdrop\\s+table\\b/i, // SQL drop\n /\\bdrop\\s+database\\b/i, // SQL drop database\n /\\bkill\\s+-9\\b/, // kill -9\n /\\bmkfs\\b/, // format filesystem\n /\\bdd\\s+if=/, // dd (disk destroyer)\n];\n\n// Background shell processes tracked by ID\nconst _backgroundProcesses = new Map<string, { promise: Promise<ToolResult>; startedAt: number }>();\n\n// Main adapter class\nexport class GeminiToolAdapter {\n private config: CrewConfig;\n private messageBus: CrewMessageBus;\n private _filesRead = new Set<string>(); // Track reads for read-before-edit guard\n\n constructor(private sandbox: Sandbox) {\n const workspaceRoot = (sandbox as any).baseDir || process.cwd();\n this.config = new CrewConfig(workspaceRoot);\n this.messageBus = new CrewMessageBus();\n }\n\n private buildDynamicDeclarations(): any[] {\n // Pull canonical names from Gemini base declarations and hydrate schemas from static declarations.\n const staticDecls = this.getStaticToolDeclarations();\n const staticByName = new Map<string, any>(staticDecls.map((d: any) => [d.name, d]));\n const canonicalNames = [\n READ_FILE_TOOL_NAME,\n WRITE_FILE_TOOL_NAME,\n EDIT_TOOL_NAME,\n GLOB_TOOL_NAME,\n GREP_TOOL_NAME,\n LS_TOOL_NAME,\n SHELL_TOOL_NAME,\n WEB_SEARCH_TOOL_NAME,\n WEB_FETCH_TOOL_NAME,\n READ_MANY_FILES_TOOL_NAME,\n MEMORY_TOOL_NAME,\n WRITE_TODOS_TOOL_NAME,\n GET_INTERNAL_DOCS_TOOL_NAME,\n ACTIVATE_SKILL_TOOL_NAME,\n ASK_USER_TOOL_NAME,\n ENTER_PLAN_MODE_TOOL_NAME,\n EXIT_PLAN_MODE_TOOL_NAME,\n 'grep_search_ripgrep',\n 'tracker_create_task',\n 'tracker_update_task',\n 'tracker_get_task',\n 'tracker_list_tasks',\n 'tracker_add_dependency',\n 'tracker_visualize',\n 'spawn_agent',\n 'check_background_task'\n ];\n const canonical = canonicalNames.map((name) => {\n const found = staticByName.get(name);\n if (found) return found;\n return {\n name,\n description: `${name} tool`,\n parameters: { type: 'object', properties: {} }\n };\n });\n\n const aliases = [\n { alias: 'read_file', target: 'read_file' },\n { alias: 'write_file', target: 'write_file' },\n { alias: 'append_file', target: 'write_file' },\n { alias: 'edit', target: 'replace' },\n { alias: 'replace', target: 'replace' },\n { alias: 'glob', target: 'glob' },\n { alias: 'grep', target: 'grep_search' },\n { alias: 'grep_search', target: 'grep_search' },\n { alias: 'grep_search_ripgrep', target: 'grep_search_ripgrep' },\n { alias: 'list', target: 'list_directory' },\n { alias: 'list_directory', target: 'list_directory' },\n { alias: 'shell', target: 'run_shell_command' },\n { alias: 'run_cmd', target: 'run_shell_command' },\n { alias: 'run_shell_command', target: 'run_shell_command' },\n { alias: 'web_search', target: 'google_web_search' },\n { alias: 'google_web_search', target: 'google_web_search' },\n { alias: 'web_fetch', target: 'web_fetch' },\n { alias: 'save_memory', target: 'save_memory' },\n { alias: 'write_todos', target: 'write_todos' },\n { alias: 'get_internal_docs', target: 'get_internal_docs' },\n { alias: 'ask_user', target: 'ask_user' },\n { alias: 'enter_plan_mode', target: 'enter_plan_mode' },\n { alias: 'exit_plan_mode', target: 'exit_plan_mode' },\n { alias: 'activate_skill', target: 'activate_skill' },\n { alias: 'tracker_create_task', target: 'tracker_create_task' },\n { alias: 'tracker_update_task', target: 'tracker_update_task' },\n { alias: 'tracker_get_task', target: 'tracker_get_task' },\n { alias: 'tracker_list_tasks', target: 'tracker_list_tasks' },\n { alias: 'tracker_add_dependency', target: 'tracker_add_dependency' },\n { alias: 'tracker_visualize', target: 'tracker_visualize' },\n { alias: 'mkdir', target: 'write_file' },\n { alias: 'git', target: 'run_shell_command' },\n // LSP is not yet implemented \u2014 don't alias to read_file (misleads the model)\n // { alias: 'lsp', target: 'read_file' }\n ];\n\n const byName = new Map<string, any>();\n for (const decl of canonical) byName.set(decl.name, decl);\n for (const a of aliases) {\n const target = byName.get(a.target);\n if (!target) continue;\n if (!byName.has(a.alias)) {\n byName.set(a.alias, { ...target, name: a.alias });\n }\n }\n // Local compatibility schemas for non-Gemini built-ins we support in adapter.\n byName.set('mkdir', {\n name: 'mkdir',\n description: 'Create a directory path (staged via sandbox).',\n parameters: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Directory path to create' },\n dir_path: { type: 'string', description: 'Alternative directory path field' }\n }\n }\n });\n byName.set('git', {\n name: 'git',\n description: 'Run limited git subcommands (status/diff/log/add/commit/show/branch).',\n parameters: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Git subcommand and args' }\n },\n required: ['command']\n }\n });\n byName.set('lsp', {\n name: 'lsp',\n description: 'Run code-intel queries (symbols/refs/goto/diagnostics/complete).',\n parameters: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'LSP query string' }\n },\n required: ['query']\n }\n });\n return Array.from(byName.values());\n }\n\n private getStaticToolDeclarations() {\n return [\n { name: 'read_file', description: 'Read file', parameters: { type: 'object', properties: { file_path: { type: 'string' } }, required: ['file_path'] } },\n { name: 'write_file', description: 'Write file', parameters: { type: 'object', properties: { file_path: { type: 'string' }, content: { type: 'string' } }, required: ['file_path', 'content'] } },\n { name: 'replace', description: 'Replace text in file. old_string must uniquely match one location (use replace_all:true for all occurrences). You MUST read_file before editing.', parameters: { type: 'object', properties: { file_path: { type: 'string' }, old_string: { type: 'string' }, new_string: { type: 'string' }, replace_all: { type: 'boolean', description: 'Replace ALL occurrences (useful for renames). Default: false (unique match required)' } }, required: ['file_path', 'old_string', 'new_string'] } },\n { name: 'glob', description: 'Glob search', parameters: { type: 'object', properties: { pattern: { type: 'string' } }, required: ['pattern'] } },\n { name: 'grep_search', description: 'Search for regex/text in files. Supports output modes (content/files/count), context lines, case insensitivity, file type filters.', parameters: { type: 'object', properties: { pattern: { type: 'string' }, path: { type: 'string' }, dir_path: { type: 'string' }, output_mode: { type: 'string', description: 'content (matching lines), files (file paths only), count (match counts)' }, context: { type: 'number', description: 'Lines of context around matches' }, before: { type: 'number' }, after: { type: 'number' }, case_insensitive: { type: 'boolean' }, type: { type: 'string', description: 'File type filter (js, py, ts, go, etc.)' }, max_results: { type: 'number' } }, required: ['pattern'] } },\n { name: 'grep_search_ripgrep', description: 'Alias for grep_search with same capabilities', parameters: { type: 'object', properties: { pattern: { type: 'string' }, path: { type: 'string' }, dir_path: { type: 'string' }, output_mode: { type: 'string' }, context: { type: 'number' }, case_insensitive: { type: 'boolean' }, type: { type: 'string' }, max_results: { type: 'number' } }, required: ['pattern'] } },\n { name: 'list_directory', description: 'List directory', parameters: { type: 'object', properties: { dir_path: { type: 'string' }, path: { type: 'string' } } } },\n { name: 'run_shell_command', description: 'Run shell command (configurable timeout, Docker isolation when staged files exist). Use run_in_background:true for long-running commands.', parameters: { type: 'object', properties: { command: { type: 'string' }, run_in_background: { type: 'boolean', description: 'Run in background and return task ID. Use check_background_task to get result.' }, description: { type: 'string', description: 'Brief description of what the command does' } }, required: ['command'] } },\n { name: 'google_web_search', description: 'Web search', parameters: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] } },\n { name: 'web_fetch', description: 'Fetch URL', parameters: { type: 'object', properties: { url: { type: 'string' }, prompt: { type: 'string' } } } },\n { name: 'read_many_files', description: 'Read many files', parameters: { type: 'object', properties: { include: { type: 'string' }, exclude: { type: 'string' }, recursive: { type: 'boolean' } } } },\n { name: 'save_memory', description: 'Save memory fact', parameters: { type: 'object', properties: { fact: { type: 'string' } }, required: ['fact'] } },\n { name: 'write_todos', description: 'Write todos', parameters: { type: 'object', properties: { todos: { type: 'array', items: { type: 'object', properties: { text: { type: 'string' }, done: { type: 'boolean' } } } } }, required: ['todos'] } },\n { name: 'get_internal_docs', description: 'Read internal docs', parameters: { type: 'object', properties: { path: { type: 'string' } } } },\n { name: 'ask_user', description: 'Ask user placeholder', parameters: { type: 'object', properties: { questions: { type: 'array', items: { type: 'object', properties: { question: { type: 'string' } } } } } } },\n { name: 'enter_plan_mode', description: 'Enter plan mode', parameters: { type: 'object', properties: { reason: { type: 'string' } } } },\n { name: 'exit_plan_mode', description: 'Exit plan mode', parameters: { type: 'object', properties: { plan_path: { type: 'string' } } } },\n { name: 'activate_skill', description: 'Activate skill', parameters: { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] } },\n { name: 'tracker_create_task', description: 'Create tracker task', parameters: { type: 'object', properties: { title: { type: 'string' }, description: { type: 'string' }, type: { type: 'string' }, parentId: { type: 'string' }, dependencies: { type: 'array', items: { type: 'string' } } }, required: ['title', 'description', 'type'] } },\n { name: 'tracker_update_task', description: 'Update tracker task', parameters: { type: 'object', properties: { id: { type: 'string' } }, required: ['id'] } },\n { name: 'tracker_get_task', description: 'Get tracker task', parameters: { type: 'object', properties: { id: { type: 'string' } }, required: ['id'] } },\n { name: 'tracker_list_tasks', description: 'List tracker tasks', parameters: { type: 'object', properties: { status: { type: 'string' }, type: { type: 'string' }, parentId: { type: 'string' } } } },\n { name: 'tracker_add_dependency', description: 'Add tracker dependency', parameters: { type: 'object', properties: { taskId: { type: 'string' }, dependencyId: { type: 'string' } }, required: ['taskId', 'dependencyId'] } },\n { name: 'tracker_visualize', description: 'Visualize tracker graph', parameters: { type: 'object', properties: {} } },\n { name: 'spawn_agent', description: 'Spawn a sub-agent to handle a task autonomously in parallel. Use for independent research, file analysis, or coding subtasks. Returns the sub-agent result when complete.', parameters: { type: 'object', properties: { task: { type: 'string', description: 'Clear task description for the sub-agent' }, model: { type: 'string', description: 'Optional model override (default: use cheap model for workers)' }, max_turns: { type: 'number', description: 'Max turns for sub-agent (default: 15)' } }, required: ['task'] } },\n { name: 'check_background_task', description: 'Check the status/result of a background shell command. Returns result if done, or elapsed time if still running.', parameters: { type: 'object', properties: { task_id: { type: 'string', description: 'Task ID returned by run_shell_command with run_in_background:true' } }, required: ['task_id'] } }\n ];\n }\n\n /**\n * Execute a tool call from LLM\n */\n async executeTool(toolName: string, params: any): Promise<ToolResult> {\n try {\n switch (toolName) {\n // Canonical Gemini names + local aliases\n case 'write_file':\n return await this.writeFile(params);\n case 'replace':\n return await this.editFile({\n file_path: params.file_path,\n old_string: params.old_string,\n new_string: params.new_string,\n replace_all: params.replace_all\n });\n case 'append_file':\n return await this.appendFile(params);\n case 'read_file':\n return await this.readFile(params);\n case 'edit':\n return await this.editFile(params);\n case 'read_many_files':\n return await this.readManyFilesTool(params);\n case 'save_memory':\n return await this.saveMemoryTool(params);\n case 'write_todos':\n return await this.writeTodosTool(params);\n case 'get_internal_docs':\n return await this.getInternalDocsTool(params);\n case 'ask_user':\n return await this.askUserTool(params);\n case 'enter_plan_mode':\n return await this.enterPlanModeTool(params);\n case 'exit_plan_mode':\n return await this.exitPlanModeTool(params);\n case 'activate_skill':\n return await this.activateSkillTool(params);\n case 'mkdir':\n return await this.mkdirTool(params);\n case 'list':\n return await this.listTool(params);\n case 'list_directory':\n return await this.listTool({ dir_path: params.dir_path || params.path });\n case 'glob':\n return await this.globTool(params);\n case 'grep':\n return await this.grepTool(params);\n case 'grep_search':\n case 'grep_search_ripgrep':\n return await this.grepTool({\n pattern: params.pattern,\n path: params.dir_path || params.path,\n output_mode: params.output_mode,\n context: params.context,\n before: params.before,\n after: params.after,\n case_insensitive: params.case_insensitive,\n type: params.type,\n max_results: params.max_results\n });\n case 'git':\n return await this.gitTool(params);\n case 'shell':\n case 'run_cmd':\n case 'run_shell_command':\n return await this.shellTool(params);\n case 'lsp':\n return await this.lspTool(params);\n case 'web_search':\n case 'google_web_search':\n return await this.webSearchTool(params);\n case 'web_fetch':\n return await this.webFetchTool(params);\n case 'tracker_create_task':\n return await this.trackerCreateTaskTool(params);\n case 'tracker_update_task':\n return await this.trackerUpdateTaskTool(params);\n case 'tracker_get_task':\n return await this.trackerGetTaskTool(params);\n case 'tracker_list_tasks':\n return await this.trackerListTasksTool(params);\n case 'tracker_add_dependency':\n return await this.trackerAddDependencyTool(params);\n case 'tracker_visualize':\n return await this.trackerVisualizeTool();\n case 'spawn_agent':\n return await this.spawnAgentTool(params);\n case 'check_background_task':\n return await this.checkBackgroundTask(params);\n default:\n return {\n success: false,\n error: `Unknown tool: ${toolName}`\n };\n }\n } catch (err: any) {\n return {\n success: false,\n error: err.message\n };\n }\n }\n \n private async writeFile(params: { file_path: string; content: string }): Promise<ToolResult> {\n // Path traversal guard\n const fullPath = resolve(this.config.getWorkspaceRoot(), params.file_path);\n const wsRoot = resolve(this.config.getWorkspaceRoot());\n if (!fullPath.startsWith(wsRoot + '/') && fullPath !== wsRoot) {\n return { success: false, error: `Access denied: path \"${params.file_path}\" resolves outside workspace root.` };\n }\n // Stage in sandbox instead of writing directly\n await this.sandbox.addChange(params.file_path, params.content);\n return {\n success: true,\n output: `Staged ${params.file_path} (${params.content.length} bytes)`\n };\n }\n\n private async appendFile(params: { file_path: string; content: string }): Promise<ToolResult> {\n const filePath = resolve(this.config.getWorkspaceRoot(), params.file_path);\n let existing = '';\n try {\n const stagedContent = this.sandbox.getStagedContent?.(params.file_path)\n || this.sandbox.getStagedContent?.(filePath);\n existing = stagedContent ?? await readFile(filePath, 'utf8');\n } catch {\n existing = '';\n }\n const combined = `${existing}${params.content || ''}`;\n await this.sandbox.addChange(params.file_path, combined);\n return {\n success: true,\n output: `Appended ${params.file_path} (${(params.content || '').length} bytes)`\n };\n }\n \n private async readFile(params: { file_path: string; start_line?: number; end_line?: number }): Promise<ToolResult> {\n const filePath = resolve(this.config.getWorkspaceRoot(), params.file_path);\n\n // Path traversal guard: ensure resolved path is within workspace\n const wsRoot = resolve(this.config.getWorkspaceRoot());\n if (!filePath.startsWith(wsRoot + '/') && filePath !== wsRoot) {\n return { success: false, error: `Access denied: path \"${params.file_path}\" resolves outside workspace root.` };\n }\n\n // Track that this file has been read (for read-before-edit guard)\n this._filesRead.add(params.file_path);\n this._filesRead.add(filePath);\n\n // Check sandbox first for staged (not yet applied) changes\n const stagedContent = this.sandbox.getStagedContent?.(params.file_path)\n || this.sandbox.getStagedContent?.(filePath);\n const content = stagedContent ?? await readFile(filePath, 'utf8');\n \n if (params.start_line || params.end_line) {\n const lines = content.split('\\n');\n const start = (params.start_line || 1) - 1;\n const end = params.end_line || lines.length;\n const slice = lines.slice(start, end).join('\\n');\n return { success: true, output: slice };\n }\n \n return { success: true, output: content };\n }\n \n private async editFile(params: { file_path: string; old_string: string; new_string: string; replace_all?: boolean }): Promise<ToolResult> {\n const filePath = resolve(this.config.getWorkspaceRoot(), params.file_path);\n\n // Path traversal guard\n const wsRoot = resolve(this.config.getWorkspaceRoot());\n if (!filePath.startsWith(wsRoot + '/') && filePath !== wsRoot) {\n return { success: false, error: `Access denied: path \"${params.file_path}\" resolves outside workspace root.` };\n }\n\n // Read-before-edit guard: require the file to have been read first (matches Claude Code)\n if (!this._filesRead.has(params.file_path) && !this._filesRead.has(filePath)) {\n return {\n success: false,\n error: `You must read_file \"${params.file_path}\" before editing it. Never guess at file contents.`\n };\n }\n\n // Read current content (could be staged)\n const stagedContent = this.sandbox.getStagedContent?.(params.file_path)\n || this.sandbox.getStagedContent?.(filePath);\n const content = stagedContent ?? await readFile(filePath, 'utf8');\n\n if (!content.includes(params.old_string)) {\n return {\n success: false,\n error: `String not found in ${params.file_path}`\n };\n }\n\n const occurrences = content.split(params.old_string).length - 1;\n\n // replace_all mode: replace every occurrence (useful for renames)\n if (params.replace_all) {\n const updated = content.split(params.old_string).join(params.new_string);\n await this.sandbox.addChange(params.file_path, updated);\n const diagnostics = await this.shadowValidate(params.file_path);\n return {\n success: true,\n output: `Edited ${params.file_path} (${occurrences} replacements)${diagnostics}`\n };\n }\n\n // Default: unique match required\n if (occurrences > 1) {\n return {\n success: false,\n error: `old_string matches ${occurrences} locations in ${params.file_path}. Provide more context to make it unique, or use replace_all:true to replace all occurrences.`\n };\n }\n\n const updated = content.replace(params.old_string, params.new_string);\n await this.sandbox.addChange(params.file_path, updated);\n\n // Shadow validation: run diagnostics on the edited file (Cursor-style)\n const diagnostics = await this.shadowValidate(params.file_path);\n\n return {\n success: true,\n output: `Edited ${params.file_path}${diagnostics}`\n };\n }\n\n /**\n * Shadow validation: after an edit, check for type/lint errors using LSP.\n * Returns empty string if clean, or diagnostic summary if errors found.\n * Non-fatal \u2014 silently returns empty on any failure.\n */\n private async shadowValidate(filePath: string): Promise<string> {\n // Only validate TypeScript/JavaScript files\n if (!/\\.(ts|tsx|js|jsx|mjs|mts)$/.test(filePath)) return '';\n\n try {\n const lsp = await import('../../lsp/index.js');\n const diags = await lsp.typeCheckProject(this.config.getWorkspaceRoot(), [filePath]);\n\n // Filter to only errors in the edited file\n const fileErrors = diags.filter((d: any) =>\n d.category === 'error' && d.file?.endsWith(filePath)\n );\n\n if (fileErrors.length === 0) return '';\n\n const errorLines = fileErrors.slice(0, 5).map((d: any) =>\n ` ${d.file}:${d.line} \u2014 ${d.message}`\n );\n\n return `\\n\\n\u26A0\uFE0F Shadow validation found ${fileErrors.length} error(s) after edit:\\n${errorLines.join('\\n')}${fileErrors.length > 5 ? `\\n ... and ${fileErrors.length - 5} more` : ''}\\nFix these before moving on.`;\n } catch {\n // LSP not available or failed \u2014 non-fatal\n return '';\n }\n }\n\n private async mkdirTool(params: { path?: string; dir_path?: string }): Promise<ToolResult> {\n const dir = (params.path || params.dir_path || '').trim();\n if (!dir) return { success: false, error: 'mkdir requires path' };\n const keep = join(dir, '.gitkeep');\n await this.sandbox.addChange(keep, '');\n return { success: true, output: `Staged directory ${dir}` };\n }\n\n private async listTool(params: { path?: string; dir_path?: string }): Promise<ToolResult> {\n const target = (params.path || params.dir_path || '.').trim();\n const abs = resolve(process.cwd(), target);\n const items = await readdir(abs, { withFileTypes: true });\n const lines = items.map(i => `${i.isDirectory() ? 'd' : 'f'} ${i.name}`);\n return { success: true, output: lines.join('\\n') };\n }\n\n private async globTool(params: { pattern: string }): Promise<ToolResult> {\n const pattern = String(params.pattern || '').trim();\n if (!pattern) return { success: false, error: 'glob requires pattern' };\n try {\n const out = execSync(`rg --files -g ${JSON.stringify(pattern)}`, { cwd: process.cwd(), stdio: 'pipe', encoding: 'utf8' });\n return { success: true, output: out.trim() };\n } catch (err: any) {\n return { success: false, error: err?.stderr?.toString?.() || err?.message || 'glob failed' };\n }\n }\n\n private async grepTool(params: {\n pattern: string;\n path?: string;\n output_mode?: 'content' | 'files' | 'count';\n context?: number;\n before?: number;\n after?: number;\n case_insensitive?: boolean;\n type?: string;\n max_results?: number;\n }): Promise<ToolResult> {\n const pattern = String(params.pattern || '').trim();\n const searchPath = String(params.path || '.').trim();\n if (!pattern) return { success: false, error: 'grep requires pattern' };\n\n const args = ['rg'];\n\n // Output mode (matches Claude Code's Grep tool)\n const mode = params.output_mode || 'content';\n if (mode === 'files') {\n args.push('-l'); // files_with_matches\n } else if (mode === 'count') {\n args.push('-c'); // count\n } else {\n args.push('-n'); // line numbers for content mode\n }\n\n // Context flags\n if (params.context) args.push(`-C${params.context}`);\n else {\n if (params.before) args.push(`-B${params.before}`);\n if (params.after) args.push(`-A${params.after}`);\n }\n\n // Case insensitive\n if (params.case_insensitive) args.push('-i');\n\n // File type filter\n if (params.type) args.push(`--type=${params.type}`);\n\n // Max results\n if (params.max_results) args.push(`-m${params.max_results}`);\n\n args.push(JSON.stringify(pattern), JSON.stringify(searchPath));\n\n try {\n const out = execSync(args.join(' '), {\n cwd: process.cwd(),\n stdio: 'pipe',\n encoding: 'utf8'\n });\n return { success: true, output: out.trim() };\n } catch (err: any) {\n const text = `${err?.stdout?.toString?.() || ''}\\n${err?.stderr?.toString?.() || ''}`.trim();\n // rg returns exit code 1 for no matches \u2014 that's not an error\n if (err?.status === 1 && !text) return { success: true, output: '(no matches)' };\n return { success: false, error: text || err?.message || 'grep failed' };\n }\n }\n\n private async gitTool(params: { command: string }): Promise<ToolResult> {\n const command = String(params.command || '').trim();\n if (!command) return { success: false, error: 'git requires command' };\n\n // Expanded allowed subcommands (matches Claude Code git safety protocol)\n const allowed = ['status', 'diff', 'log', 'add', 'commit', 'show', 'branch', 'stash', 'tag', 'blame', 'checkout', 'switch', 'restore', 'rev-parse', 'remote', 'fetch', 'pull', 'push', 'merge', 'rebase', 'reset', 'cherry-pick', 'worktree'];\n const verb = command.split(/\\s+/)[0];\n if (!allowed.includes(verb)) {\n return { success: false, error: `git subcommand not allowed: ${verb}. Allowed: ${allowed.join(', ')}` };\n }\n\n // Safety guards (Claude Code pattern: never force push, never skip hooks)\n if (/--force|--force-with-lease/.test(command) && verb === 'push') {\n return { success: false, error: 'Force push is not allowed. Use a regular push or create a new branch.' };\n }\n if (/--no-verify/.test(command)) {\n return { success: false, error: 'Skipping hooks (--no-verify) is not allowed. Fix the hook issue instead.' };\n }\n if (verb === 'reset' && /--hard/.test(command)) {\n return { success: false, error: 'git reset --hard is destructive. Use git stash or git checkout <file> instead.' };\n }\n\n // Reject shell metacharacters to prevent command injection\n if (/[;&|`$(){}\\\\!<>]/.test(command)) {\n return { success: false, error: 'git command contains disallowed shell characters. Use only git arguments.' };\n }\n\n try {\n const args = command.split(/\\s+/).filter(Boolean);\n const { execFileSync } = await import('node:child_process');\n const out = execFileSync('git', args, {\n cwd: this.config.getWorkspaceRoot(),\n stdio: 'pipe',\n encoding: 'utf8',\n timeout: 30000\n });\n return { success: true, output: out.trim() };\n } catch (err: any) {\n const text = `${err?.stdout?.toString?.() || ''}\\n${err?.stderr?.toString?.() || ''}`.trim();\n return { success: false, error: text || err?.message || 'git failed' };\n }\n }\n\n private async shellTool(params: { command: string; run_in_background?: boolean; description?: string }): Promise<ToolResult> {\n const command = String(params.command || '').trim();\n if (!command) return { success: false, error: 'shell requires command' };\n\n // Dangerous command detection \u2014 block destructive patterns\n for (const pat of DANGEROUS_SHELL_PATTERNS) {\n if (pat.test(command)) {\n return { success: false, error: `Blocked: destructive command detected (${command.slice(0, 60)}). Use a safer alternative.` };\n }\n }\n\n // Background execution: run command asynchronously, return task ID\n if (params.run_in_background) {\n const taskId = `bg_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;\n const bgPromise = (async (): Promise<ToolResult> => {\n try {\n const { spawn } = await import('node:child_process');\n return new Promise((resolve) => {\n const proc = spawn('sh', ['-c', command], {\n cwd: this.config.getWorkspaceRoot(),\n stdio: 'pipe'\n });\n let stdout = '', stderr = '';\n proc.stdout?.on('data', (d: Buffer) => { stdout += d.toString(); });\n proc.stderr?.on('data', (d: Buffer) => { stderr += d.toString(); });\n const timeout = setTimeout(() => { proc.kill('SIGTERM'); resolve({ success: false, error: 'Background task timed out' }); }, getShellTimeout());\n proc.on('close', (code: number | null) => {\n clearTimeout(timeout);\n resolve(code === 0\n ? { success: true, output: stdout.trim() }\n : { success: false, error: (stderr || stdout).trim() || `exit code ${code}` });\n });\n });\n } catch (err: any) {\n return { success: false, error: err.message };\n }\n })();\n _backgroundProcesses.set(taskId, { promise: bgPromise, startedAt: Date.now() });\n return { success: true, output: `Background task started: ${taskId}\\nUse check_background_task with this ID to get the result.` };\n }\n \n try {\n // Check if we have staged files - if so, use Docker sandbox\n const hasStagedFiles = this.sandbox.getPendingPaths().length > 0;\n \n if (hasStagedFiles) {\n const { DockerSandbox } = await import('../docker-sandbox.js');\n const docker = new DockerSandbox();\n const dockerAvailable = await docker.isDockerAvailable();\n \n if (dockerAvailable) {\n console.log(`[GeminiAdapter] Running command in Docker with ${this.sandbox.getPendingPaths().length} staged file(s)`);\n const result = await docker.runCommand(command, this.sandbox, {\n workDir: this.config.getWorkspaceRoot(),\n timeout: getShellTimeout()\n });\n return {\n success: result.success,\n output: result.output,\n error: result.success ? undefined : result.output\n };\n } else {\n console.warn('[GeminiAdapter] Docker unavailable - running natively (staged files not available to command)');\n }\n }\n \n // Fallback: run natively from workspace root\n const out = execSync(command, {\n cwd: this.config.getWorkspaceRoot(),\n stdio: 'pipe',\n encoding: 'utf8',\n timeout: getShellTimeout()\n });\n return { success: true, output: out.trim() };\n } catch (err: any) {\n const text = `${err?.stdout?.toString?.() || ''}\\n${err?.stderr?.toString?.() || ''}`.trim();\n return { success: false, error: text || err?.message || 'shell failed' };\n }\n }\n\n private async webSearchTool(params: { query: string }): Promise<ToolResult> {\n const query = String(params.query || '').trim();\n if (!query) return { success: false, error: 'web_search requires query' };\n const braveKey = process.env.BRAVE_API_KEY || process.env.BRAVE_SEARCH_API_KEY;\n if (!braveKey) return { success: false, error: 'web_search unavailable (missing BRAVE_API_KEY)' };\n try {\n const res = await fetch(\n `https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=5`,\n {\n headers: {\n 'Accept': 'application/json',\n 'X-Subscription-Token': braveKey\n },\n signal: AbortSignal.timeout(10000)\n }\n );\n if (!res.ok) return { success: false, error: `web_search failed: HTTP ${res.status}` };\n const data: any = await res.json();\n const hits = (data?.web?.results || []).slice(0, 5);\n const formatted = hits.map((r: any, i: number) =>\n `${i + 1}. ${r.title || '(untitled)'}\\n${r.url || ''}\\n${r.description || ''}`\n ).join('\\n\\n');\n return { success: true, output: formatted || 'No results' };\n } catch (err: any) {\n return { success: false, error: err?.message || 'web_search failed' };\n }\n }\n\n private async webFetchTool(params: { url: string }): Promise<ToolResult> {\n const url = String(params.url || '').trim();\n if (!url || !/^https?:\\/\\//i.test(url)) {\n return { success: false, error: 'web_fetch requires valid http(s) url' };\n }\n try {\n const res = await fetch(url, {\n headers: { 'User-Agent': 'CrewSwarm-CLI/1.0' },\n signal: AbortSignal.timeout(12000)\n });\n if (!res.ok) return { success: false, error: `web_fetch failed: HTTP ${res.status}` };\n const ct = String(res.headers.get('content-type') || '');\n let text = await res.text();\n if (ct.includes('html')) {\n text = text\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<[^>]+>/g, ' ')\n .replace(/\\s{2,}/g, ' ')\n .trim();\n }\n return { success: true, output: text.slice(0, 12000) };\n } catch (err: any) {\n return { success: false, error: err?.message || 'web_fetch failed' };\n }\n }\n\n private async readManyFilesTool(params: {\n include?: string;\n exclude?: string | string[];\n recursive?: boolean;\n }): Promise<ToolResult> {\n const include = String(params.include || '**/*').trim();\n try {\n const out = execSync(`rg --files -g ${JSON.stringify(include)}`, {\n cwd: this.config.getWorkspaceRoot(),\n stdio: 'pipe',\n encoding: 'utf8'\n });\n const files = out.split('\\n').filter(Boolean).slice(0, 20);\n const chunks: string[] = [];\n for (const rel of files) {\n const full = resolve(this.config.getWorkspaceRoot(), rel);\n try {\n const content = await readFile(full, 'utf8');\n chunks.push(`--- ${rel} ---\\n${content.slice(0, 2000)}`);\n } catch {\n // Skip unreadable/non-text\n }\n }\n return { success: true, output: chunks.join('\\n\\n') || 'No readable files matched' };\n } catch (err: any) {\n return { success: false, error: err?.message || 'read_many_files failed' };\n }\n }\n\n private async saveMemoryTool(params: { fact: string }): Promise<ToolResult> {\n const fact = String(params.fact || '').trim();\n if (!fact) return { success: false, error: 'save_memory requires fact' };\n const memDir = resolve(this.config.getWorkspaceRoot(), '.crew');\n await mkdir(memDir, { recursive: true });\n const memFile = resolve(memDir, 'memory-facts.log');\n let prior = '';\n try { prior = await readFile(memFile, 'utf8'); } catch {}\n await writeFile(memFile, `${prior}${new Date().toISOString()} ${fact}\\n`, 'utf8');\n return { success: true, output: 'Memory saved' };\n }\n\n private async writeTodosTool(params: { todos: any[] }): Promise<ToolResult> {\n const todos = Array.isArray(params.todos) ? params.todos : [];\n const memDir = resolve(this.config.getWorkspaceRoot(), '.crew');\n await mkdir(memDir, { recursive: true });\n const todoFile = resolve(memDir, 'todos.json');\n await writeFile(todoFile, JSON.stringify(todos, null, 2), 'utf8');\n return { success: true, output: `Saved ${todos.length} todos` };\n }\n\n private async getInternalDocsTool(params: { path?: string }): Promise<ToolResult> {\n const target = String(params.path || 'AGENTS.md').trim();\n const abs = resolve(this.config.getWorkspaceRoot(), target);\n try {\n const content = await readFile(abs, 'utf8');\n return { success: true, output: content.slice(0, 12000) };\n } catch (err: any) {\n return { success: false, error: `get_internal_docs failed: ${err?.message || target}` };\n }\n }\n\n private async askUserTool(params: { questions?: any[] }): Promise<ToolResult> {\n const qs = Array.isArray(params.questions) ? params.questions : [];\n if (qs.length === 0) {\n return { success: false, error: 'ask_user requires at least one question' };\n }\n const now = new Date().toISOString();\n const request = {\n id: `ask-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`,\n ts: now,\n status: 'pending',\n questions: qs\n };\n const crewDir = this.crewDirPath();\n await mkdir(crewDir, { recursive: true });\n await this.appendJsonLine(this.askUserRequestsPath(), request);\n await writeFile(this.askUserLatestPath(), JSON.stringify(request, null, 2), 'utf8');\n const summary = qs.map((q: any, i: number) => `${i + 1}. ${q?.question || 'question'}`).join('\\n');\n return {\n success: true,\n output: `User input required (non-interactive runtime).\\nSaved request: ${this.relativeCrewPath(this.askUserLatestPath())}\\nQuestions:\\n${summary}`\n };\n }\n\n private async enterPlanModeTool(params: { reason?: string }): Promise<ToolResult> {\n const crewDir = this.crewDirPath();\n await mkdir(crewDir, { recursive: true });\n const state = {\n active: true,\n enteredAt: new Date().toISOString(),\n exitedAt: null,\n reason: String(params?.reason || '').trim() || null,\n planPath: null\n };\n await writeFile(this.planModeStatePath(), JSON.stringify(state, null, 2), 'utf8');\n return {\n success: true,\n output: `Plan mode entered${state.reason ? `: ${state.reason}` : ''} (${this.relativeCrewPath(this.planModeStatePath())})`\n };\n }\n\n private async exitPlanModeTool(params: { plan_path?: string }): Promise<ToolResult> {\n const crewDir = this.crewDirPath();\n await mkdir(crewDir, { recursive: true });\n let prior: any = {};\n try {\n prior = JSON.parse(await readFile(this.planModeStatePath(), 'utf8'));\n } catch {\n prior = {};\n }\n const state = {\n ...prior,\n active: false,\n exitedAt: new Date().toISOString(),\n planPath: String(params?.plan_path || '').trim() || prior?.planPath || null\n };\n await writeFile(this.planModeStatePath(), JSON.stringify(state, null, 2), 'utf8');\n return {\n success: true,\n output: `Plan mode exited${state.planPath ? `: ${state.planPath}` : ''} (${this.relativeCrewPath(this.planModeStatePath())})`\n };\n }\n\n private async activateSkillTool(params: { name?: string }): Promise<ToolResult> {\n const name = String(params?.name || '').trim();\n if (!name) return { success: false, error: 'activate_skill requires name' };\n const crewDir = this.crewDirPath();\n await mkdir(crewDir, { recursive: true });\n let state: any = { active: [] };\n try {\n state = JSON.parse(await readFile(this.activeSkillsPath(), 'utf8'));\n } catch {\n state = { active: [] };\n }\n const active = new Set(Array.isArray(state?.active) ? state.active : []);\n active.add(name);\n const next = {\n active: Array.from(active).sort(),\n updatedAt: new Date().toISOString()\n };\n await writeFile(this.activeSkillsPath(), JSON.stringify(next, null, 2), 'utf8');\n return { success: true, output: `Skill activated: ${name} (${this.relativeCrewPath(this.activeSkillsPath())})` };\n }\n\n private crewDirPath() {\n return resolve(this.config.getWorkspaceRoot(), '.crew');\n }\n\n private askUserRequestsPath() {\n return resolve(this.crewDirPath(), 'ask-user-requests.jsonl');\n }\n\n private askUserLatestPath() {\n return resolve(this.crewDirPath(), 'ask-user-latest.json');\n }\n\n private planModeStatePath() {\n return resolve(this.crewDirPath(), 'plan-mode.json');\n }\n\n private activeSkillsPath() {\n return resolve(this.crewDirPath(), 'active-skills.json');\n }\n\n private relativeCrewPath(absPath: string) {\n return absPath.replace(this.config.getWorkspaceRoot(), '.');\n }\n\n private async appendJsonLine(filePath: string, data: any): Promise<void> {\n let prior = '';\n try {\n prior = await readFile(filePath, 'utf8');\n } catch {\n prior = '';\n }\n const line = `${JSON.stringify(data)}\\n`;\n await writeFile(filePath, `${prior}${line}`, 'utf8');\n }\n\n private trackerFilePath() {\n return resolve(this.config.getWorkspaceRoot(), '.crew', 'tracker.json');\n }\n\n private async readTracker(): Promise<any[]> {\n try {\n const raw = await readFile(this.trackerFilePath(), 'utf8');\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n private async writeTracker(tasks: any[]): Promise<void> {\n const dir = resolve(this.config.getWorkspaceRoot(), '.crew');\n await mkdir(dir, { recursive: true });\n await writeFile(this.trackerFilePath(), JSON.stringify(tasks, null, 2), 'utf8');\n }\n\n private mkTrackerId() {\n return Math.random().toString(16).slice(2, 8);\n }\n\n private async trackerCreateTaskTool(params: any): Promise<ToolResult> {\n const tasks = await this.readTracker();\n const task = {\n id: this.mkTrackerId(),\n title: String(params?.title || 'Untitled'),\n description: String(params?.description || ''),\n type: String(params?.type || 'task'),\n status: 'open',\n parentId: params?.parentId || null,\n dependencies: Array.isArray(params?.dependencies) ? params.dependencies : []\n };\n tasks.push(task);\n await this.writeTracker(tasks);\n return { success: true, output: JSON.stringify(task, null, 2) };\n }\n\n private async trackerUpdateTaskTool(params: any): Promise<ToolResult> {\n const tasks = await this.readTracker();\n const id = String(params?.id || '');\n const idx = tasks.findIndex((t: any) => t.id === id);\n if (idx < 0) return { success: false, error: `Task not found: ${id}` };\n tasks[idx] = { ...tasks[idx], ...params };\n await this.writeTracker(tasks);\n return { success: true, output: JSON.stringify(tasks[idx], null, 2) };\n }\n\n private async trackerGetTaskTool(params: any): Promise<ToolResult> {\n const tasks = await this.readTracker();\n const id = String(params?.id || '');\n const task = tasks.find((t: any) => t.id === id);\n if (!task) return { success: false, error: `Task not found: ${id}` };\n return { success: true, output: JSON.stringify(task, null, 2) };\n }\n\n private async trackerListTasksTool(params: any): Promise<ToolResult> {\n const tasks = await this.readTracker();\n const filtered = tasks.filter((t: any) => {\n if (params?.status && t.status !== params.status) return false;\n if (params?.type && t.type !== params.type) return false;\n if (params?.parentId && t.parentId !== params.parentId) return false;\n return true;\n });\n return { success: true, output: JSON.stringify(filtered, null, 2) };\n }\n\n private async trackerAddDependencyTool(params: any): Promise<ToolResult> {\n const tasks = await this.readTracker();\n const taskId = String(params?.taskId || '');\n const depId = String(params?.dependencyId || '');\n const idx = tasks.findIndex((t: any) => t.id === taskId);\n if (idx < 0) return { success: false, error: `Task not found: ${taskId}` };\n const deps = new Set(Array.isArray(tasks[idx].dependencies) ? tasks[idx].dependencies : []);\n deps.add(depId);\n tasks[idx].dependencies = Array.from(deps);\n await this.writeTracker(tasks);\n return { success: true, output: JSON.stringify(tasks[idx], null, 2) };\n }\n\n private async trackerVisualizeTool(): Promise<ToolResult> {\n const tasks = await this.readTracker();\n const lines = tasks.map((t: any) => {\n const deps = Array.isArray(t.dependencies) && t.dependencies.length\n ? ` -> [${t.dependencies.join(', ')}]`\n : '';\n return `${t.id} [${t.status}] ${t.title}${deps}`;\n });\n return { success: true, output: lines.join('\\n') || '(no tasks)' };\n }\n\n private async lspTool(params: { query: string }): Promise<ToolResult> {\n const query = String(params.query || '').trim();\n if (!query) return { success: false, error: 'lsp requires query' };\n const lower = query.toLowerCase();\n const lsp = await import('../../lsp/index.js');\n if (lower.startsWith('symbols')) {\n const file = query.slice('symbols'.length).trim();\n if (!file) return { success: false, error: 'lsp symbols requires file path' };\n const symbols = await lsp.getDocumentSymbols(process.cwd(), file);\n return { success: true, output: symbols.map(s => `${file}:${s.line}:${s.column} ${s.kind} ${s.name}`).join('\\n') };\n }\n if (lower.startsWith('refs')) {\n const target = query.slice('refs'.length).trim();\n const match = target.match(/^(.+):(\\d+)(?::(\\d+))?$/);\n if (match) {\n const refs = await lsp.getReferences(process.cwd(), match[1], Number(match[2]), Number(match[3] || '1'));\n return { success: true, output: refs.map(r => `${r.file}:${r.line}:${r.column}`).join('\\n') };\n }\n if (target) return this.grepTool({ pattern: `\\\\b${target}\\\\b`, path: '.' });\n return { success: false, error: 'lsp refs requires symbol or file:line[:col]' };\n }\n if (lower.startsWith('goto')) {\n const target = query.slice('goto'.length).trim();\n const match = target.match(/^(.+):(\\d+)(?::(\\d+))?$/);\n if (!match) return { success: false, error: 'lsp goto format: file:line[:col]' };\n const defs = await lsp.getDefinitions(process.cwd(), match[1], Number(match[2]), Number(match[3] || '1'));\n return { success: true, output: defs.map(d => `${d.file}:${d.line}:${d.column}`).join('\\n') };\n }\n if (lower.startsWith('diagnostics') || lower === 'check') {\n const diags = await lsp.typeCheckProject(process.cwd(), []);\n return { success: true, output: diags.map(d => `${d.file}:${d.line}:${d.column} [${d.category}] ${d.message}`).join('\\n') };\n }\n if (lower.startsWith('complete')) {\n const target = query.slice('complete'.length).trim();\n const match = target.match(/^(.+):(\\d+):(\\d+)(?:\\s+(.+))?$/);\n if (!match) return { success: false, error: 'lsp complete format: file:line:col [prefix]' };\n const items = await lsp.getCompletions(process.cwd(), match[1], Number(match[2]), Number(match[3]), 50, match[4] || '');\n return { success: true, output: items.map(i => `${i.name} (${i.kind})`).join('\\n') };\n }\n return { success: false, error: `Unsupported lsp query: ${query}` };\n }\n\n private async checkBackgroundTask(params: { task_id: string }): Promise<ToolResult> {\n const taskId = String(params.task_id || '').trim();\n if (!taskId) return { success: false, error: 'check_background_task requires task_id' };\n const bg = _backgroundProcesses.get(taskId);\n if (!bg) return { success: false, error: `No background task found with ID: ${taskId}` };\n\n // Check if done (non-blocking with race against a resolved promise)\n const done = await Promise.race([\n bg.promise.then(r => ({ done: true as const, result: r })),\n new Promise<{ done: false }>(resolve => setTimeout(() => resolve({ done: false }), 50))\n ]);\n\n if (!done.done) {\n const elapsed = Math.round((Date.now() - bg.startedAt) / 1000);\n return { success: true, output: `Task ${taskId} still running (${elapsed}s elapsed). Check again later.` };\n }\n\n _backgroundProcesses.delete(taskId);\n return done.result;\n }\n\n // Track sub-agent depth to prevent infinite recursion\n private static _spawnDepth = 0;\n private static readonly MAX_SPAWN_DEPTH = 3;\n\n private async spawnAgentTool(params: { task: string; model?: string; max_turns?: number }): Promise<ToolResult> {\n const task = String(params.task || '').trim();\n if (!task) return { success: false, error: 'spawn_agent requires task' };\n\n if (GeminiToolAdapter._spawnDepth >= GeminiToolAdapter.MAX_SPAWN_DEPTH) {\n return { success: false, error: `Sub-agent depth limit reached (max ${GeminiToolAdapter.MAX_SPAWN_DEPTH}). Complete this task directly instead.` };\n }\n\n const maxTurns = Math.min(params.max_turns || 15, 25);\n const model = params.model || process.env.CREW_WORKER_MODEL || process.env.CREW_EXECUTION_MODEL || '';\n const branchName = `sub-agent-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n\n try {\n // Create isolated sandbox branch for sub-agent\n await this.sandbox.createBranch(branchName);\n\n GeminiToolAdapter._spawnDepth++;\n\n const { runAgenticWorker } = await import('../../executor/agentic-executor.js');\n const result = await runAgenticWorker(task, this.sandbox, {\n model,\n maxTurns,\n stream: false, // Sub-agents don't stream to stdout\n verbose: Boolean(process.env.CREW_DEBUG),\n tier: 'fast' // Default to cheap model for sub-agents\n });\n\n GeminiToolAdapter._spawnDepth--;\n\n // Merge sub-agent changes back to parent branch\n const parentBranch = this.sandbox.getActiveBranch();\n if (parentBranch !== branchName) {\n // Already switched back by the sub-agent's sandbox ops \u2014 merge explicitly\n await this.sandbox.mergeBranch(branchName, parentBranch);\n } else {\n // Switch back to parent and merge\n const branches = this.sandbox.getBranches();\n const parent = branches.find(b => b !== branchName) || 'main';\n await this.sandbox.switchBranch(parent);\n await this.sandbox.mergeBranch(branchName, parent);\n }\n\n // Clean up the branch\n try { await this.sandbox.deleteBranch(branchName); } catch { /* ignore */ }\n\n const output = [\n `Sub-agent completed in ${result.turns || 0} turns (${result.modelUsed || 'unknown'})`,\n result.cost ? `Cost: $${result.cost.toFixed(4)}` : '',\n `Status: ${result.success ? 'SUCCESS' : 'FAILED'}`,\n '',\n result.output?.slice(0, 3000) || '(no output)'\n ].filter(Boolean).join('\\n');\n\n return { success: result.success, output };\n } catch (err: any) {\n GeminiToolAdapter._spawnDepth = Math.max(0, GeminiToolAdapter._spawnDepth - 1);\n // Try to clean up branch\n try { await this.sandbox.switchBranch('main'); } catch { /* ignore */ }\n try { await this.sandbox.deleteBranch(branchName); } catch { /* ignore */ }\n return { success: false, error: `Sub-agent failed: ${err.message}` };\n }\n }\n\n /**\n * Get tool declarations for LLM function calling\n */\n getToolDeclarations() {\n const dynamicEnabled = process.env.CREW_GEMINI_DYNAMIC_DECLARATIONS !== 'false';\n if (dynamicEnabled) {\n try {\n const decls = this.buildDynamicDeclarations();\n if (decls.length > 0) return decls;\n } catch {\n // Fallback to static declarations below.\n }\n }\n return [\n {\n name: 'read_file',\n description: 'Read the contents of a file. ALWAYS read files before editing them. Use start_line/end_line for large files.',\n parameters: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Relative path from project root' },\n start_line: { type: 'number', description: 'Start line number (1-based, optional)' },\n end_line: { type: 'number', description: 'End line number (inclusive, optional)' }\n },\n required: ['file_path']\n }\n },\n {\n name: 'glob',\n description: 'Find files matching a glob pattern. Use this to discover file structure. Examples: \"**/*.ts\", \"src/**/*.tsx\", \"*.json\"',\n parameters: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Glob pattern (e.g. \"src/**/*.ts\")' }\n },\n required: ['pattern']\n }\n },\n {\n name: 'grep',\n description: 'Search for text/regex patterns in files. Returns matching lines with file paths and line numbers.',\n parameters: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Regex or text pattern to search for' },\n path: { type: 'string', description: 'Directory or file to search in (default: \".\")' }\n },\n required: ['pattern']\n }\n },\n {\n name: 'grep_search',\n description: 'Canonical alias for grep. Search for regex/text in files.',\n parameters: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Regex/text pattern' },\n dir_path: { type: 'string', description: 'Path to search (default: .)' }\n },\n required: ['pattern']\n }\n },\n {\n name: 'grep_search_ripgrep',\n description: 'Ripgrep-optimized canonical name. Routed to grep tool in this adapter.',\n parameters: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Regex/text pattern' },\n dir_path: { type: 'string', description: 'Path to search (default: .)' },\n path: { type: 'string', description: 'Alternative path field' }\n },\n required: ['pattern']\n }\n },\n {\n name: 'write_file',\n description: 'Write content to a file (creates or overwrites). Changes are staged in sandbox. Use for new files or full rewrites.',\n parameters: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Relative path from project root' },\n content: { type: 'string', description: 'Complete file content' }\n },\n required: ['file_path', 'content']\n }\n },\n {\n name: 'append_file',\n description: 'Append content to an existing file. Creates file if it does not exist. Changes are staged in sandbox.',\n parameters: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Relative path from project root' },\n content: { type: 'string', description: 'Content to append' }\n },\n required: ['file_path', 'content']\n }\n },\n {\n name: 'edit',\n description: 'Edit a file by replacing an exact string match. ALWAYS read the file first to get the exact string. Use for targeted changes.',\n parameters: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Relative path from project root' },\n old_string: { type: 'string', description: 'Exact string to find (must match precisely)' },\n new_string: { type: 'string', description: 'Replacement string' }\n },\n required: ['file_path', 'old_string', 'new_string']\n }\n },\n {\n name: 'replace',\n description: 'Canonical alias for edit. Replace exact old_string with new_string.',\n parameters: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Relative path from project root' },\n old_string: { type: 'string', description: 'Exact string to replace' },\n new_string: { type: 'string', description: 'Replacement string' }\n },\n required: ['file_path', 'old_string', 'new_string']\n }\n },\n {\n name: 'shell',\n description: 'Run a shell command (e.g. npm test, node script.js, cat, ls). Use for build verification, running tests, or commands not covered by other tools.',\n parameters: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Shell command to execute' }\n },\n required: ['command']\n }\n },\n {\n name: 'run_cmd',\n description: 'Alias for shell. Run a shell command. Prefer this for compatibility with existing prompts.',\n parameters: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Shell command to execute' }\n },\n required: ['command']\n }\n },\n {\n name: 'run_shell_command',\n description: 'Canonical alias for shell/run_cmd.',\n parameters: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Shell command to execute' }\n },\n required: ['command']\n }\n },\n {\n name: 'mkdir',\n description: 'Create a directory (staged via .gitkeep in sandbox).',\n parameters: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Directory path to create' },\n dir_path: { type: 'string', description: 'Alternate directory path field' }\n },\n required: []\n }\n },\n {\n name: 'list',\n description: 'List files and directories for a path.',\n parameters: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to list (default: .)' },\n dir_path: { type: 'string', description: 'Alternate path field' }\n },\n required: []\n }\n },\n {\n name: 'list_directory',\n description: 'Canonical alias for list.',\n parameters: {\n type: 'object',\n properties: {\n dir_path: { type: 'string', description: 'Directory path to list (default: .)' }\n },\n required: []\n }\n },\n {\n name: 'git',\n description: 'Run git subcommands (status, diff, log, show, branch). Use to understand repo state and recent changes.',\n parameters: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Git subcommand (e.g. \"diff HEAD~3\", \"log --oneline -10\")' }\n },\n required: ['command']\n }\n },\n {\n name: 'lsp',\n description: 'Code intelligence: \"symbols <file>\" for outline, \"refs <file:line:col>\" for references, \"goto <file:line:col>\" for definition, \"diagnostics\" for type errors.',\n parameters: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'LSP query (e.g. \"symbols src/app.ts\", \"goto src/app.ts:42:5\")' }\n },\n required: ['query']\n }\n },\n {\n name: 'web_search',\n description: 'Search the web via Brave Search API (requires BRAVE_API_KEY).',\n parameters: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' }\n },\n required: ['query']\n }\n },\n {\n name: 'google_web_search',\n description: 'Canonical alias for web_search.',\n parameters: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' }\n },\n required: ['query']\n }\n },\n {\n name: 'web_fetch',\n description: 'Fetch content from a URL and return cleaned text for analysis.',\n parameters: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'http(s) URL to fetch' }\n },\n required: ['url']\n }\n },\n {\n name: 'read_many_files',\n description: 'Read multiple files by include glob and return concatenated excerpts.',\n parameters: {\n type: 'object',\n properties: {\n include: { type: 'string', description: 'Glob include pattern (default: **/*)' },\n exclude: { type: 'string', description: 'Optional exclude glob' },\n recursive: { type: 'boolean', description: 'Recursive search (optional)' }\n },\n required: []\n }\n },\n {\n name: 'save_memory',\n description: 'Save a memory fact to local project memory log.',\n parameters: {\n type: 'object',\n properties: {\n fact: { type: 'string', description: 'Memory fact to persist' }\n },\n required: ['fact']\n }\n },\n {\n name: 'write_todos',\n description: 'Persist todo items for the current project.',\n parameters: {\n type: 'object',\n properties: {\n todos: { type: 'array', description: 'Todo items array' }\n },\n required: ['todos']\n }\n },\n {\n name: 'get_internal_docs',\n description: 'Read internal docs by relative path (default AGENTS.md).',\n parameters: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Relative doc path' }\n },\n required: []\n }\n },\n {\n name: 'ask_user',\n description: 'Non-interactive placeholder for ask-user; returns summarized questions.',\n parameters: {\n type: 'object',\n properties: {\n questions: { type: 'array', description: 'Question descriptors' }\n },\n required: []\n }\n },\n {\n name: 'enter_plan_mode',\n description: 'Enter plan mode (no-op marker in CLI adapter).',\n parameters: {\n type: 'object',\n properties: {\n reason: { type: 'string', description: 'Plan mode reason' }\n },\n required: []\n }\n },\n {\n name: 'exit_plan_mode',\n description: 'Exit plan mode (no-op marker in CLI adapter).',\n parameters: {\n type: 'object',\n properties: {\n plan_path: { type: 'string', description: 'Optional plan file path' }\n },\n required: []\n }\n },\n {\n name: 'activate_skill',\n description: 'Activate a named skill (adapter acknowledgment).',\n parameters: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Skill name' }\n },\n required: ['name']\n }\n },\n {\n name: 'tracker_create_task',\n description: 'Create tracker task in local .crew/tracker.json.',\n parameters: {\n type: 'object',\n properties: {\n title: { type: 'string' },\n description: { type: 'string' },\n type: { type: 'string' },\n parentId: { type: 'string' },\n dependencies: { type: 'array' }\n },\n required: ['title', 'description', 'type']\n }\n },\n {\n name: 'tracker_update_task',\n description: 'Update tracker task by id.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n title: { type: 'string' },\n description: { type: 'string' },\n status: { type: 'string' },\n dependencies: { type: 'array' }\n },\n required: ['id']\n }\n },\n {\n name: 'tracker_get_task',\n description: 'Get tracker task by id.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string' }\n },\n required: ['id']\n }\n },\n {\n name: 'tracker_list_tasks',\n description: 'List tracker tasks with optional filters.',\n parameters: {\n type: 'object',\n properties: {\n status: { type: 'string' },\n type: { type: 'string' },\n parentId: { type: 'string' }\n },\n required: []\n }\n },\n {\n name: 'tracker_add_dependency',\n description: 'Add dependency between tracker tasks.',\n parameters: {\n type: 'object',\n properties: {\n taskId: { type: 'string' },\n dependencyId: { type: 'string' }\n },\n required: ['taskId', 'dependencyId']\n }\n },\n {\n name: 'tracker_visualize',\n description: 'Visualize tracker tasks as ASCII list.',\n parameters: {\n type: 'object',\n properties: {},\n required: []\n }\n }\n ];\n }\n}\n", "import { access, copyFile, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface CorrectionEntry {\n timestamp: string;\n prompt: string;\n original: string;\n corrected: string;\n agent?: string;\n tags?: string[];\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport class CorrectionStore {\n baseDir: string;\n stateDir: string;\n dataPath: string;\n\n constructor(baseDir = process.cwd()) {\n this.baseDir = baseDir;\n this.stateDir = join(baseDir, '.crew');\n this.dataPath = join(this.stateDir, 'training-data.jsonl');\n }\n\n async ensureReady(): Promise<void> {\n if (!(await pathExists(this.stateDir))) {\n await mkdir(this.stateDir, { recursive: true });\n }\n\n if (!(await pathExists(this.dataPath))) {\n await writeFile(this.dataPath, '', 'utf8');\n }\n }\n\n async record(entry: Omit<CorrectionEntry, 'timestamp'>): Promise<CorrectionEntry> {\n await this.ensureReady();\n\n const payload: CorrectionEntry = {\n timestamp: nowIso(),\n ...entry\n };\n\n await writeFile(this.dataPath, `${JSON.stringify(payload)}\\n`, {\n encoding: 'utf8',\n flag: 'a'\n });\n\n return payload;\n }\n\n async loadAll(): Promise<CorrectionEntry[]> {\n await this.ensureReady();\n const raw = await readFile(this.dataPath, 'utf8');\n const lines = raw.split('\\n').map(line => line.trim()).filter(Boolean);\n return lines.map(line => JSON.parse(line) as CorrectionEntry);\n }\n\n async summary(): Promise<{ count: number; latest?: CorrectionEntry }> {\n const all = await this.loadAll();\n return {\n count: all.length,\n latest: all.length > 0 ? all[all.length - 1] : undefined\n };\n }\n\n async exportTo(path: string): Promise<void> {\n await this.ensureReady();\n await copyFile(this.dataPath, path);\n }\n}\n", "/**\n * Collections Search \u2014 lightweight local RAG over docs and markdown files.\n *\n * Indexes markdown / text files under configurable paths, builds a simple\n * TF-IDF\u2013style term index, and returns ranked chunks with source attribution.\n */\n\nimport { readdir, readFile, stat } from 'node:fs/promises';\nimport { extname, join, relative, resolve } from 'node:path';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CollectionChunk {\n /** Relative path from the collection root */\n source: string;\n /** 1-based line number where the chunk starts */\n startLine: number;\n /** The raw text of the chunk */\n text: string;\n /** Relevance score (higher = more relevant) */\n score: number;\n}\n\nexport interface CollectionIndex {\n root: string;\n fileCount: number;\n chunkCount: number;\n /** term \u2192 Set of chunk indices */\n terms: Map<string, Set<number>>;\n chunks: CollectionChunk[];\n}\n\nexport interface BuildCollectionOptions {\n includeCode?: boolean;\n}\n\nexport interface SearchResult {\n query: string;\n hits: CollectionChunk[];\n totalChunks: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst DOC_EXTENSIONS = new Set(['.md', '.mdx', '.txt', '.rst', '.adoc']);\nconst CODE_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.json',\n '.py', '.go', '.rs', '.java', '.kt', '.swift',\n '.sh', '.bash', '.zsh', '.yaml', '.yml', '.toml'\n]);\n\nconst IGNORED_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', '.crew',\n '.next', '.turbo', 'coverage', '__pycache__'\n]);\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9\\s_-]/g, ' ')\n .split(/\\s+/)\n .filter(t => t.length > 1);\n}\n\nfunction hashToken(token: string, dim: number): number {\n let h = 2166136261;\n for (let i = 0; i < token.length; i++) {\n h ^= token.charCodeAt(i);\n h = Math.imul(h, 16777619);\n }\n return Math.abs(h) % dim;\n}\n\nfunction toHashedVector(text: string, dim = 256): Float64Array {\n const vec = new Float64Array(dim);\n const toks = tokenize(text);\n for (const t of toks) {\n vec[hashToken(t, dim)] += 1;\n }\n // l2 normalize\n let norm = 0;\n for (let i = 0; i < dim; i++) norm += vec[i] * vec[i];\n norm = Math.sqrt(norm);\n if (norm > 0) {\n for (let i = 0; i < dim; i++) vec[i] /= norm;\n }\n return vec;\n}\n\nfunction cosineSimilarity(a: Float64Array, b: Float64Array): number {\n const dim = Math.min(a.length, b.length);\n let dot = 0;\n for (let i = 0; i < dim; i++) {\n dot += a[i] * b[i];\n }\n return dot;\n}\n\n/**\n * Split a file into chunks \u2014 one chunk per heading section, or fixed-size\n * paragraphs for files without headings.\n */\nfunction chunkFile(content: string, source: string): CollectionChunk[] {\n const lines = content.split('\\n');\n const chunks: CollectionChunk[] = [];\n let currentLines: string[] = [];\n let currentStart = 1;\n\n const flush = () => {\n const text = currentLines.join('\\n').trim();\n if (text.length > 0) {\n chunks.push({ source, startLine: currentStart, text, score: 0 });\n }\n currentLines = [];\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Split on markdown headings\n if (/^#{1,4}\\s/.test(line) && currentLines.length > 0) {\n flush();\n currentStart = i + 1;\n }\n currentLines.push(line);\n\n // Also split on large paragraphs (every ~40 lines if no heading)\n if (currentLines.length >= 40 && !/^#{1,4}\\s/.test(line)) {\n flush();\n currentStart = i + 2;\n }\n }\n flush();\n return chunks;\n}\n\n// ---------------------------------------------------------------------------\n// Walk & Index\n// ---------------------------------------------------------------------------\n\nasync function walkDocs(rootDir: string, includeCode = false): Promise<string[]> {\n const files: string[] = [];\n\n async function walk(dir: string) {\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return;\n }\n for (const entry of entries) {\n if (IGNORED_DIRS.has(entry)) continue;\n const fullPath = join(dir, entry);\n let st;\n try {\n st = await stat(fullPath);\n } catch {\n continue;\n }\n if (st.isDirectory()) {\n await walk(fullPath);\n } else {\n const ext = extname(entry).toLowerCase();\n if (DOC_EXTENSIONS.has(ext) || (includeCode && CODE_EXTENSIONS.has(ext))) {\n files.push(fullPath);\n }\n }\n }\n }\n\n await walk(rootDir);\n return files;\n}\n\nexport async function buildCollectionIndex(\n paths: string[],\n options: BuildCollectionOptions = {}\n): Promise<CollectionIndex> {\n const allChunks: CollectionChunk[] = [];\n const roots = paths.map(p => resolve(p));\n let fileCount = 0;\n\n for (const rootPath of roots) {\n let st;\n try {\n st = await stat(rootPath);\n } catch {\n continue;\n }\n\n const files = st.isDirectory() ? await walkDocs(rootPath, Boolean(options.includeCode)) : [rootPath];\n\n for (const file of files) {\n let content: string;\n try {\n content = await readFile(file, 'utf8');\n } catch {\n continue;\n }\n fileCount++;\n const rel = relative(resolve(rootPath, st.isDirectory() ? '.' : '..'), file);\n const chunks = chunkFile(content, rel);\n allChunks.push(...chunks);\n }\n }\n\n // Build inverted term index\n const terms = new Map<string, Set<number>>();\n for (let i = 0; i < allChunks.length; i++) {\n const tokens = tokenize(allChunks[i].text);\n for (const token of tokens) {\n if (!terms.has(token)) terms.set(token, new Set());\n terms.get(token)!.add(i);\n }\n }\n\n return {\n root: roots[0] || '.',\n fileCount,\n chunkCount: allChunks.length,\n terms,\n chunks: allChunks\n };\n}\n\n// ---------------------------------------------------------------------------\n// Search\n// ---------------------------------------------------------------------------\n\nexport function searchCollection(\n index: CollectionIndex,\n query: string,\n maxResults = 10\n): SearchResult {\n const queryTokens = tokenize(query);\n if (queryTokens.length === 0) {\n return { query, hits: [], totalChunks: index.chunkCount };\n }\n\n // Score each chunk by number of matching query terms + term rarity (IDF-like)\n const scores = new Float64Array(index.chunkCount);\n\n for (const token of queryTokens) {\n const matchingChunks = index.terms.get(token);\n if (!matchingChunks) continue;\n // IDF-like weight: rarer terms score higher\n const idf = Math.log(1 + index.chunkCount / matchingChunks.size);\n for (const idx of matchingChunks) {\n scores[idx] += idf;\n }\n }\n\n // Collect non-zero scores\n const candidates: Array<{ idx: number; score: number }> = [];\n for (let i = 0; i < scores.length; i++) {\n if (scores[i] > 0) {\n candidates.push({ idx: i, score: scores[i] });\n }\n }\n\n // Sort descending by score\n candidates.sort((a, b) => b.score - a.score);\n\n const queryVector = toHashedVector(query);\n const maxTfidf = candidates.length > 0 ? candidates[0].score : 1;\n const tfidfWeight = 0.7;\n const vectorWeight = 0.3;\n\n const hybrid = candidates.map(c => {\n const chunk = index.chunks[c.idx];\n const chunkVector = toHashedVector(chunk.text);\n const cosine = Math.max(0, cosineSimilarity(queryVector, chunkVector));\n const tfidfNorm = maxTfidf > 0 ? (c.score / maxTfidf) : 0;\n const hybridScore = (tfidfNorm * tfidfWeight) + (cosine * vectorWeight);\n return { idx: c.idx, score: hybridScore };\n });\n\n hybrid.sort((a, b) => b.score - a.score);\n\n const hits = hybrid.slice(0, maxResults).map(c => ({\n ...index.chunks[c.idx],\n score: Math.round(c.score * 1000) / 1000\n }));\n\n return { query, hits, totalChunks: index.chunkCount };\n}\n", "/**\n * Agentic L3 Executor v2 \u2014 10/10 competitive CLI engine\n *\n * Features:\n * - 34+ tools via GeminiToolAdapter (LSP, git, web, memory, tracker, etc.)\n * - Streaming output \u2014 real-time token display as LLM generates\n * - JIT context discovery \u2014 files discovered by tools are indexed for next turn\n * - Turn compression \u2014 Topic-Action-Summary keeps prompts lean on long sessions\n * - Multi-model routing \u2014 cheap models for simple tasks, heavy for complex\n * - Auto-retry \u2014 failed tool calls retry up to 3 times with correction\n * - Repo-map context \u2014 TF-IDF semantic search injected before execution\n */\n\nimport type { AutonomousResult, TurnResult } from '../worker/autonomous-loop.js';\nimport type { ToolDeclaration } from '../tools/base.js';\nimport type { Sandbox } from '../sandbox/index.js';\nimport { executeAutonomous } from '../worker/autonomous-loop.js';\nimport { GeminiToolAdapter } from '../tools/gemini/crew-adapter.js';\nimport {\n openAICompatibleTurn,\n anthropicTurn,\n type LLMTurnResult\n} from './multi-turn-drivers.js';\nimport { CorrectionStore } from '../learning/corrections.js';\n\n// ---------------------------------------------------------------------------\n// System prompt\n// ---------------------------------------------------------------------------\n\n// Repair common JSON quirks from provider tool call responses\nfunction repairJson(raw: string): string {\n if (!raw || raw.trim() === '') return '{}';\n let s = raw.trim();\n // Remove trailing commas before } or ]\n s = s.replace(/,\\s*([}\\]])/g, '$1');\n // Fix single quotes to double quotes (but not inside strings)\n if (!s.includes('\"') && s.includes(\"'\")) {\n s = s.replace(/'/g, '\"');\n }\n // Fix unquoted keys: { key: \"value\" } \u2192 { \"key\": \"value\" }\n s = s.replace(/([{,])\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*:/g, '$1\"$2\":');\n // Handle truncated JSON from streaming \u2014 close open braces/brackets\n const openBraces = (s.match(/{/g) || []).length;\n const closeBraces = (s.match(/}/g) || []).length;\n for (let i = 0; i < openBraces - closeBraces; i++) s += '}';\n const openBrackets = (s.match(/\\[/g) || []).length;\n const closeBrackets = (s.match(/]/g) || []).length;\n for (let i = 0; i < openBrackets - closeBrackets; i++) s += ']';\n return s;\n}\n\nconst L3_SYSTEM_PROMPT = `You are a senior AI engineer executing coding tasks autonomously.\n\n## Cognitive Loop: THINK \u2192 ACT \u2192 OBSERVE\n\nEvery turn, follow this exact pattern:\n\n**THINK** (internal reasoning, 1-3 sentences):\n- What is the current state? What do I know from previous tool results?\n- What is the minimal next action to make progress?\n- Am I done? If so, summarize and stop.\n\n**ACT** (one or more tool calls):\n- Choose the most targeted tool for the job.\n- Prefer small, verifiable steps over large changes.\n- When multiple independent lookups are needed, call multiple tools in parallel.\n\n**OBSERVE** (after tools return):\n- Did the tool succeed or fail? What does the output tell me?\n- Do I need to adjust my approach?\n\n## Operating Principles\n\n- Match the request. Do what was asked \u2014 nothing more. A bug fix is just a bug fix. Don't refactor adjacent code, add docstrings to unchanged functions, or suggest rewrites beyond the task scope.\n- Simplest approach first. Don't over-engineer. Three similar lines are better than a premature abstraction. Only add error handling, validation, or fallbacks at system boundaries (user input, external APIs), not for internal guarantees.\n- Own mistakes. If a tool call fails or your approach is wrong, say so briefly and try a different approach. Don't repeat the same failing action. If the same failure pattern repeats twice, switch strategy.\n- Be security-conscious. Don't introduce injection, XSS, or hardcoded secrets. Validate at trust boundaries.\n\n## Available Tools\n\n**Files**: read_file, write_file, replace (edit with replace_all flag), read_many_files, glob, grep_search (output_mode: content/files/count, context, type filter), list_directory, mkdir\n**Shell**: run_shell_command (Docker isolation when staged files exist; run_in_background for long commands; configurable timeout via CREW_SHELL_TIMEOUT, default 120s, max 600s), check_background_task\n**Git**: git (status, diff, log, add, commit, show, branch, stash, tag, blame, checkout, fetch, pull, merge, rebase, cherry-pick, worktree \u2014 force-push and --no-verify blocked)\n**Web**: google_web_search, web_fetch\n**Memory**: save_memory (persist facts across sessions), write_todos\n**Docs**: get_internal_docs (read project documentation)\n**Agents**: spawn_agent (spawn autonomous sub-agent for independent subtasks \u2014 isolated sandbox branch, cheap model by default, merges changes on completion)\n\n## File Reading Strategy\n\n1. ALWAYS read a file before editing it. Never guess at file contents.\n2. For large files (500+ lines): read specific line ranges instead of the whole file.\n3. If a read_file result looks truncated, re-read with a narrower range around the area of interest.\n4. Use grep_search to locate exact strings before attempting replace/edit.\n\n## Edit Strategy\n\n1. ALWAYS read_file before editing. Edits on unread files will be rejected.\n2. Use replace (edit) for surgical changes \u2014 provide exact old_string that uniquely matches.\n3. Use replace_all:true when renaming a variable/function across the file.\n4. For new files, use write_file.\n5. Never rewrite an entire existing file \u2014 always use targeted edits.\n6. If an edit fails with \"not unique\", provide more surrounding context or use replace_all:true.\n7. If an edit fails with \"String not found\", re-read the file and retry with current content.\n\n## Shell Strategy\n\n1. For long-running commands (builds, tests, installs), use run_in_background:true.\n2. Use check_background_task to poll for results.\n3. Prefer dedicated tools over shell: use read_file not cat, grep_search not rg, glob not find.\n4. Never use destructive commands (rm -rf, git reset --hard) without explicit task instruction.\n\n## Verification\n\n1. After code changes: run the build command (usually \"npm run build\" or \"tsc --noEmit\").\n2. After logic changes: run relevant tests (\"npm test\", or specific test file).\n3. Check git diff to confirm only intended changes were made.\n\n## Output\n\n- Lead with what you did, not how you thought about it. Skip preamble.\n- For informational queries (listing files, reading code, checking status): include the actual tool output in your response so the user sees the data.\n- For code changes: concise summary of files modified, what changed, verification result.\n- When you used a tool to answer a question, show the results \u2014 don't just say \"I listed the files\" without showing them.\n\n## Stop Conditions \u2014 When to Finish\n\n- The task is fully complete and verified.\n- You have confirmed the changes work (via build, test, or diagnostic check).\n- Do NOT keep reading files or running tools after the work is done.\n- Do NOT repeat yourself or restate your work \u2014 just give a concise summary.\n\n## Anti-Patterns to Avoid\n\n- Do NOT read every file in the project to \"understand context\" \u2014 read only what's needed.\n- Do NOT make speculative changes to files you haven't read.\n- Do NOT run the same command twice if it already succeeded.\n- Do NOT apologize or explain failures at length \u2014 just fix them and move on.\n- Do NOT add features, refactor, or \"improve\" code beyond what the task asks.\n- Do NOT add comments, docstrings, or type annotations to code you didn't change.`;\n\n// ---------------------------------------------------------------------------\n// Corrections injection \u2014 load recent corrections to prevent repeat mistakes\n// ---------------------------------------------------------------------------\n\nasync function loadCorrectionsContext(projectDir: string): Promise<string> {\n try {\n const store = new CorrectionStore(projectDir);\n const entries = await store.loadAll();\n if (entries.length === 0) return '';\n\n // Take last 10 corrections (most recent = most relevant)\n const recent = entries.slice(-10);\n const lines = recent.map(c => {\n const tags = c.tags?.length ? ` [${c.tags.join(', ')}]` : '';\n return `- ${c.prompt.slice(0, 100)}${tags}: ${c.corrected.slice(0, 200)}`;\n });\n\n return `\\n\\n## Past Corrections (avoid repeating these mistakes)\\n${lines.join('\\n')}`;\n } catch {\n return ''; // No corrections file or parse error \u2014 non-fatal\n }\n}\n\n// ---------------------------------------------------------------------------\n// Turn Compression \u2014 Topic-Action-Summary model\n// ---------------------------------------------------------------------------\n\ninterface CompressedTurn {\n turn: number;\n topic: string; // what was being worked on\n action: string; // tool + brief params\n outcome: string; // success/fail + short result\n}\n\nfunction compressTurnHistory(history: TurnResult[]): CompressedTurn[] {\n return history.map(h => {\n const paramStr = JSON.stringify(h.params);\n // Extract the most important param (usually file_path, pattern, or command)\n const keyParam = h.params.file_path || h.params.pattern || h.params.command\n || h.params.query || h.params.path || h.params.dir_path || '';\n const action = `${h.tool}(${String(keyParam).slice(0, 80)})`;\n\n const isError = Boolean(h.error);\n const resultText = isError\n ? h.error!\n : (typeof h.result === 'object' && h.result && 'output' in h.result)\n ? String((h.result as any).output ?? '')\n : String(h.result ?? '');\n\n // Compress outcome to most useful info\n const outcome = isError\n ? `FAIL: ${resultText.slice(0, 120)}`\n : `OK: ${resultText.slice(0, 120)}`;\n\n // Infer topic from tool + params\n const topic = h.params.file_path\n ? String(h.params.file_path).split('/').pop() || 'file'\n : h.tool;\n\n return { turn: h.turn, topic, action, outcome };\n });\n}\n\n/** Format a tool result as a string, truncated for context */\nfunction formatToolResult(h: TurnResult, maxLen = 1500): string {\n const res = h.error\n ? `ERROR: ${h.error}`\n : (typeof h.result === 'object' && h.result && 'output' in h.result)\n ? String((h.result as { output?: string }).output ?? '')\n : String(h.result ?? '');\n return res.slice(0, maxLen);\n}\n\n/**\n * Convert TurnResult[] into provider-specific structured messages.\n * Each TurnResult becomes an assistant tool_call + user tool_result pair.\n * For long histories, middle turns are compressed to text summary while\n * the first 3 (initial context) and last 5 (recent work) use full structured format.\n */\nfunction historyToGeminiContents(history: TurnResult[]): any[] {\n if (history.length === 0) return [];\n const contents: any[] = [];\n\n // Selective compression: keep first 3 + last 5 detailed, compress only middle\n const firstN = 3;\n const lastN = 5;\n const needsCompression = history.length > firstN + lastN;\n const headDetailed = needsCompression ? history.slice(0, firstN) : [];\n const middleTurns = needsCompression ? history.slice(firstN, -lastN) : [];\n const structuredTurns = needsCompression ? history.slice(-lastN) : history;\n\n // Emit head turns (initial context) as full structured messages\n for (const h of headDetailed) {\n contents.push({\n role: 'model',\n parts: [{ functionCall: { name: h.tool, args: h.params } }]\n });\n const resultObj = h.error\n ? { error: h.error }\n : (typeof h.result === 'object' && h.result) ? h.result : { output: formatToolResult(h) };\n contents.push({\n role: 'user',\n parts: [{ functionResponse: { name: h.tool, response: resultObj } }]\n });\n }\n\n // Emit compressed summary of middle turns\n if (middleTurns.length > 0) {\n const compressed = compressTurnHistory(middleTurns);\n const summary = compressed.map(c => `[${c.turn}] ${c.action} \u2192 ${c.outcome}`).join('\\n');\n contents.push(\n { role: 'model', parts: [{ text: `[Earlier execution summary]\\n${summary}` }] },\n { role: 'user', parts: [{ text: 'Acknowledged. Continue with the task.' }] }\n );\n }\n\n for (const h of structuredTurns) {\n // Model made a tool call\n contents.push({\n role: 'model',\n parts: [{ functionCall: { name: h.tool, args: h.params } }]\n });\n // User provided tool result\n const resultObj = h.error\n ? { error: h.error }\n : (typeof h.result === 'object' && h.result) ? h.result : { output: formatToolResult(h) };\n contents.push({\n role: 'user',\n parts: [{ functionResponse: { name: h.tool, response: resultObj } }]\n });\n }\n return contents;\n}\n\nfunction historyToOpenAIMessages(history: TurnResult[]): any[] {\n if (history.length === 0) return [];\n const messages: any[] = [];\n\n // Selective compression: keep first 3 + last 5 detailed, compress only middle\n const firstN = 3;\n const lastN = 5;\n const needsCompression = history.length > firstN + lastN;\n const headDetailed = needsCompression ? history.slice(0, firstN) : [];\n const middleTurns = needsCompression ? history.slice(firstN, -lastN) : [];\n const structuredTurns = needsCompression ? history.slice(-lastN) : history;\n\n // Emit head turns (initial context) as full structured messages\n for (const h of headDetailed) {\n const callId = `call_${h.turn}_${h.tool}`;\n messages.push({\n role: 'assistant',\n tool_calls: [{\n id: callId,\n type: 'function',\n function: { name: h.tool, arguments: JSON.stringify(h.params) }\n }]\n });\n messages.push({\n role: 'tool',\n tool_call_id: callId,\n content: formatToolResult(h)\n });\n }\n\n // Emit compressed summary of middle turns\n if (middleTurns.length > 0) {\n const compressed = compressTurnHistory(middleTurns);\n const summary = compressed.map(c => `[${c.turn}] ${c.action} \u2192 ${c.outcome}`).join('\\n');\n messages.push(\n { role: 'assistant', content: `[Earlier execution summary]\\n${summary}` },\n { role: 'user', content: 'Acknowledged. Continue with the task.' }\n );\n }\n\n for (const h of structuredTurns) {\n const callId = `call_${h.turn}_${h.tool}`;\n messages.push({\n role: 'assistant',\n tool_calls: [{\n id: callId,\n type: 'function',\n function: { name: h.tool, arguments: JSON.stringify(h.params) }\n }]\n });\n messages.push({\n role: 'tool',\n tool_call_id: callId,\n content: formatToolResult(h)\n });\n }\n return messages;\n}\n\nfunction historyToAnthropicMessages(history: TurnResult[]): any[] {\n if (history.length === 0) return [];\n const messages: any[] = [];\n\n // Selective compression: keep first 3 + last 5 detailed, compress only middle\n const firstN = 3;\n const lastN = 5;\n const needsCompression = history.length > firstN + lastN;\n const headDetailed = needsCompression ? history.slice(0, firstN) : [];\n const middleTurns = needsCompression ? history.slice(firstN, -lastN) : [];\n const structuredTurns = needsCompression ? history.slice(-lastN) : history;\n\n // Emit head turns (initial context) as full structured messages\n for (const h of headDetailed) {\n const useId = `tu_${h.turn}_${h.tool}`;\n messages.push({\n role: 'assistant',\n content: [{\n type: 'tool_use',\n id: useId,\n name: h.tool,\n input: h.params\n }]\n });\n messages.push({\n role: 'user',\n content: [{\n type: 'tool_result',\n tool_use_id: useId,\n content: formatToolResult(h)\n }]\n });\n }\n\n // Emit compressed summary of middle turns\n if (middleTurns.length > 0) {\n const compressed = compressTurnHistory(middleTurns);\n const summary = compressed.map(c => `[${c.turn}] ${c.action} \u2192 ${c.outcome}`).join('\\n');\n messages.push(\n { role: 'assistant', content: `[Earlier execution summary]\\n${summary}` },\n { role: 'user', content: 'Acknowledged. Continue with the task.' }\n );\n }\n\n for (const h of structuredTurns) {\n const useId = `tu_${h.turn}_${h.tool}`;\n messages.push({\n role: 'assistant',\n content: [{\n type: 'tool_use',\n id: useId,\n name: h.tool,\n input: h.params\n }]\n });\n messages.push({\n role: 'user',\n content: [{\n type: 'tool_result',\n tool_use_id: useId,\n content: formatToolResult(h)\n }]\n });\n }\n return messages;\n}\n\n/** Legacy text-based history for fallback (markers-only providers) */\nfunction historyToContext(history: TurnResult[]): string {\n if (history.length === 0) return '';\n\n // For short histories, use detailed format\n if (history.length <= 5) {\n const lines = history.map(h => {\n return `[Turn ${h.turn}] ${h.tool}(${JSON.stringify(h.params).slice(0, 200)}) \u2192 ${formatToolResult(h, 800)}`;\n });\n return '\\n\\nPrevious tool results:\\n' + lines.join('\\n');\n }\n\n // For longer histories, use compressed Topic-Action-Summary\n const compressed = compressTurnHistory(history);\n const recentDetailed = history.slice(-3); // Keep last 3 turns detailed\n const olderCompressed = compressed.slice(0, -3);\n\n let ctx = '\\n\\nExecution summary (compressed):\\n';\n ctx += olderCompressed.map(c =>\n `[${c.turn}] ${c.action} \u2192 ${c.outcome}`\n ).join('\\n');\n\n ctx += '\\n\\nRecent actions (detailed):\\n';\n ctx += recentDetailed.map(h => {\n return `[Turn ${h.turn}] ${h.tool}(${JSON.stringify(h.params).slice(0, 200)}) \u2192 ${formatToolResult(h, 800)}`;\n }).join('\\n');\n\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Multi-model routing \u2014 more providers, task-based selection\n// ---------------------------------------------------------------------------\n\ninterface ProviderEntry {\n id: string;\n envKey: string;\n model: string;\n driver: 'gemini' | 'openai' | 'anthropic' | 'openrouter';\n apiUrl?: string;\n modelPrefix?: string;\n tier: 'fast' | 'standard' | 'heavy'; // for complexity-based routing\n}\n\nconst PROVIDER_ORDER: ProviderEntry[] = [\n // Heavy tier \u2014 L2 brain (complex multi-file tasks, planning)\n { id: 'openai', envKey: 'OPENAI_API_KEY', model: 'gpt-4.1', driver: 'openai', apiUrl: 'https://api.openai.com/v1/chat/completions', modelPrefix: 'gpt', tier: 'heavy' },\n { id: 'anthropic', envKey: 'ANTHROPIC_API_KEY', model: 'claude-sonnet-4-20250514', driver: 'anthropic', modelPrefix: 'claude', tier: 'heavy' },\n { id: 'grok', envKey: 'XAI_API_KEY', model: 'grok-3-mini-beta', driver: 'openai', apiUrl: 'https://api.x.ai/v1/chat/completions', modelPrefix: 'grok', tier: 'heavy' },\n // Standard tier \u2014 L3 workers (execution, parallel tasks)\n { id: 'gemini', envKey: 'GEMINI_API_KEY', model: 'gemini-2.5-flash', driver: 'gemini', modelPrefix: 'gemini', tier: 'standard' },\n { id: 'gemini', envKey: 'GOOGLE_API_KEY', model: 'gemini-2.5-flash', driver: 'gemini', modelPrefix: 'gemini', tier: 'standard' },\n { id: 'deepseek', envKey: 'DEEPSEEK_API_KEY', model: 'deepseek-chat', driver: 'openai', apiUrl: 'https://api.deepseek.com/v1/chat/completions', modelPrefix: 'deepseek', tier: 'standard' },\n { id: 'kimi', envKey: 'MOONSHOT_API_KEY', model: 'moonshot-v1-128k', driver: 'openai', apiUrl: 'https://api.moonshot.cn/v1/chat/completions', modelPrefix: 'kimi', tier: 'standard' },\n // Fast tier \u2014 L1 routing (classification, cheap)\n { id: 'groq', envKey: 'GROQ_API_KEY', model: 'llama-3.3-70b-versatile', driver: 'openai', apiUrl: 'https://api.groq.com/openai/v1/chat/completions', modelPrefix: 'llama', tier: 'fast' },\n // Fallback \u2014 free tier\n { id: 'openrouter', envKey: 'OPENROUTER_API_KEY', model: 'google/gemini-2.0-flash-exp:free', driver: 'openrouter', apiUrl: 'https://openrouter.ai/api/v1/chat/completions', modelPrefix: 'openrouter', tier: 'standard' },\n // Additional providers (OpenAI-compatible, cheap workers)\n { id: 'together', envKey: 'TOGETHER_API_KEY', model: 'Qwen/Qwen3.5-397B-A17B', driver: 'openai', apiUrl: 'https://api.together.xyz/v1/chat/completions', modelPrefix: 'qwen', tier: 'standard' },\n { id: 'fireworks', envKey: 'FIREWORKS_API_KEY', model: 'accounts/fireworks/models/qwen3.5-397b-a17b', driver: 'openai', apiUrl: 'https://api.fireworks.ai/inference/v1/chat/completions', modelPrefix: 'fireworks', tier: 'standard' },\n];\n\nfunction resolveProvider(modelOverride?: string, preferTier?: string): { key: string; model: string; driver: string; apiUrl?: string; id: string } | null {\n const effectiveModel = (modelOverride || process.env.CREW_EXECUTION_MODEL || '').trim().toLowerCase();\n\n // If a specific model is requested, find the matching provider\n if (effectiveModel) {\n for (const p of PROVIDER_ORDER) {\n const key = process.env[p.envKey];\n if (!key || key.length < 5) continue;\n if (p.envKey === 'GOOGLE_API_KEY' && process.env.GEMINI_API_KEY) continue;\n if (p.modelPrefix && effectiveModel.includes(p.modelPrefix)) {\n return { key, model: modelOverride || process.env.CREW_EXECUTION_MODEL || p.model, driver: p.driver, apiUrl: p.apiUrl, id: p.id };\n }\n }\n }\n\n // Tier-based routing\n const targetTier = preferTier || 'standard';\n // Try preferred tier first, then fall back to any\n const tieredOrder = [\n ...PROVIDER_ORDER.filter(p => p.tier === targetTier),\n ...PROVIDER_ORDER.filter(p => p.tier !== targetTier)\n ];\n\n for (const p of tieredOrder) {\n const key = process.env[p.envKey];\n if (!key || key.length < 5) continue;\n if (p.envKey === 'GOOGLE_API_KEY' && process.env.GEMINI_API_KEY) continue;\n return { key, model: p.model, driver: p.driver, apiUrl: p.apiUrl, id: p.id };\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming LLM turn \u2014 real-time token output\n// ---------------------------------------------------------------------------\n\n/** Image attachment for multimodal input */\nexport interface ImageAttachment {\n data: string; // base64-encoded image data\n mimeType: string; // e.g. 'image/png', 'image/jpeg'\n}\n\nasync function executeStreamingGeminiTurn(\n fullTask: string,\n tools: ToolDeclaration[],\n key: string,\n model: string,\n systemPrompt: string,\n stream: boolean,\n images?: ImageAttachment[],\n historyMessages?: any[]\n): Promise<LLMTurnResult> {\n const functionDeclarations = tools.map(t => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters\n }));\n\n // Build user parts: text + optional images\n const userParts: any[] = [{ text: `${systemPrompt}\\n\\nTask:\\n${fullTask}` }];\n if (images?.length) {\n for (const img of images) {\n userParts.push({ inlineData: { mimeType: img.mimeType, data: img.data } });\n }\n }\n const contents: any[] = [\n { role: 'user', parts: userParts },\n // Insert structured history (tool call/result pairs)\n ...(historyMessages || []),\n // Continuation prompt if we have history\n ...(historyMessages?.length ? [{ role: 'user', parts: [{ text: 'Continue executing the task based on the results above.' }] }] : [])\n ];\n\n const endpoint = stream ? 'streamGenerateContent' : 'generateContent';\n const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:${endpoint}?key=${encodeURIComponent(key)}${stream ? '&alt=sse' : ''}`;\n\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n signal: AbortSignal.timeout(120000),\n body: JSON.stringify({\n contents,\n tools: [{ functionDeclarations }],\n generationConfig: { temperature: 0.3, maxOutputTokens: 8192 }\n })\n });\n\n if (!res.ok) {\n const err = await res.text();\n throw new Error(`Gemini API ${res.status}: ${err.slice(0, 300)}`);\n }\n\n if (stream && res.body) {\n // Parse SSE stream\n let fullText = '';\n const toolCalls: Array<{ tool: string; params: Record<string, any> }> = [];\n let totalCost = 0;\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const jsonStr = line.slice(6).trim();\n if (!jsonStr || jsonStr === '[DONE]') continue;\n\n try {\n const chunk = JSON.parse(jsonStr);\n const parts = chunk?.candidates?.[0]?.content?.parts ?? [];\n\n for (const part of parts) {\n if (part.text) {\n process.stdout.write(part.text);\n fullText += part.text;\n }\n if (part.functionCall) {\n toolCalls.push({\n tool: part.functionCall.name || '',\n params: part.functionCall.args || {}\n });\n }\n }\n\n // Accumulate usage\n const usage = chunk?.usageMetadata;\n if (usage) {\n totalCost = (usage.promptTokenCount || 0) * 0.075 / 1_000_000\n + (usage.candidatesTokenCount || 0) * 0.30 / 1_000_000;\n }\n } catch {\n // Skip malformed chunks\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (fullText) process.stdout.write('\\n');\n\n if (toolCalls.length > 0) {\n return { toolCalls, response: fullText, cost: totalCost };\n }\n return { response: fullText, status: 'COMPLETE', cost: totalCost };\n }\n\n // Non-streaming fallback\n const data = await res.json() as any;\n const parts = data?.candidates?.[0]?.content?.parts ?? [];\n const usage = data?.usageMetadata ?? {};\n const cost = (usage.promptTokenCount || 0) * 0.075 / 1_000_000 + (usage.candidatesTokenCount || 0) * 0.30 / 1_000_000;\n\n const toolCalls: Array<{ tool: string; params: Record<string, any> }> = [];\n for (const part of parts) {\n if (part.functionCall) {\n toolCalls.push({ tool: part.functionCall.name || '', params: part.functionCall.args || {} });\n }\n }\n\n if (toolCalls.length > 0) return { toolCalls, response: '', cost };\n\n const textPart = parts.find((p: any) => p.text);\n return { response: textPart?.text ?? '', status: 'COMPLETE', cost };\n}\n\nasync function executeStreamingOpenAITurn(\n fullTask: string,\n tools: ToolDeclaration[],\n apiUrl: string,\n apiKey: string,\n model: string,\n systemPrompt: string,\n stream: boolean,\n images?: ImageAttachment[],\n historyMessages?: any[]\n): Promise<LLMTurnResult> {\n // Build user content: text + optional images as content array\n let userContent: any = fullTask;\n if (images?.length) {\n const parts: any[] = [{ type: 'text', text: fullTask }];\n for (const img of images) {\n parts.push({\n type: 'image_url',\n image_url: { url: `data:${img.mimeType};base64,${img.data}` }\n });\n }\n userContent = parts;\n }\n const messages = [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userContent },\n // Insert structured history (assistant tool_calls + tool results)\n ...(historyMessages || [])\n ];\n\n const openaiTools = tools.map(t => ({\n type: 'function' as const,\n function: { name: t.name, description: t.description, parameters: t.parameters }\n }));\n\n // GPT-5/6 only support temperature=1; other values cause 400\n const temp = (model?.startsWith?.('gpt-5') || model?.startsWith?.('gpt-6')) ? 1 : 0.3;\n const body: any = {\n model,\n messages,\n tools: openaiTools,\n temperature: temp,\n max_tokens: 8192,\n stream\n };\n\n const res = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`\n },\n signal: AbortSignal.timeout(120000),\n body: JSON.stringify(body)\n });\n\n if (!res.ok) {\n const err = await res.text();\n throw new Error(`OpenAI API ${res.status}: ${err.slice(0, 300)}`);\n }\n\n if (stream && res.body) {\n let fullText = '';\n const toolCallAccumulator = new Map<number, { name: string; args: string }>();\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const jsonStr = line.slice(6).trim();\n if (!jsonStr || jsonStr === '[DONE]') continue;\n\n try {\n const chunk = JSON.parse(jsonStr);\n const delta = chunk?.choices?.[0]?.delta;\n if (!delta) continue;\n\n // Stream text content\n if (delta.content) {\n process.stdout.write(delta.content);\n fullText += delta.content;\n }\n\n // Accumulate tool calls (streamed in pieces)\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index ?? 0;\n if (!toolCallAccumulator.has(idx)) {\n toolCallAccumulator.set(idx, { name: '', args: '' });\n }\n const acc = toolCallAccumulator.get(idx)!;\n if (tc.function?.name) acc.name += tc.function.name;\n if (tc.function?.arguments) acc.args += tc.function.arguments;\n }\n }\n } catch {\n // Skip malformed chunks\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (fullText) process.stdout.write('\\n');\n\n // Parse accumulated tool calls\n const toolCalls: Array<{ tool: string; params: Record<string, any> }> = [];\n for (const [, tc] of toolCallAccumulator) {\n if (tc.name) {\n let params = {};\n try { params = JSON.parse(repairJson(tc.args)); } catch {}\n toolCalls.push({ tool: tc.name, params });\n }\n }\n\n if (toolCalls.length > 0) return { toolCalls, response: fullText, cost: 0 };\n return { response: fullText, status: 'COMPLETE', cost: 0 };\n }\n\n // Non-streaming fallback to multi-turn-drivers\n // (this path shouldn't be hit normally since we always stream)\n const data = await res.json() as any;\n const choice = data?.choices?.[0];\n const msg = choice?.message;\n\n if (msg?.tool_calls?.length > 0) {\n const toolCalls = msg.tool_calls.map((tc: any) => {\n let params = {};\n try { params = JSON.parse(repairJson(tc.function?.arguments || '{}')); } catch {}\n return { tool: tc.function?.name || '', params };\n });\n return { toolCalls, response: msg?.content || '', cost: 0 };\n }\n\n return { response: msg?.content || '', status: 'COMPLETE', cost: 0 };\n}\n\nasync function executeStreamingAnthropicTurn(\n fullTask: string,\n tools: ToolDeclaration[],\n apiKey: string,\n model: string,\n systemPrompt: string,\n stream: boolean,\n images?: ImageAttachment[],\n historyMessages?: any[]\n): Promise<LLMTurnResult> {\n // Build user content: text + optional images\n let userContent: any = fullTask;\n if (images?.length) {\n const parts: any[] = [{ type: 'text', text: fullTask }];\n for (const img of images) {\n parts.push({\n type: 'image',\n source: { type: 'base64', media_type: img.mimeType, data: img.data }\n });\n }\n userContent = parts;\n }\n\n const anthropicTools = tools.map(t => ({\n name: t.name,\n description: t.description,\n input_schema: t.parameters\n }));\n\n const body: any = {\n model,\n max_tokens: 8192,\n system: systemPrompt,\n messages: [\n { role: 'user', content: userContent },\n // Insert structured history (assistant tool_use + user tool_result)\n ...(historyMessages || [])\n ],\n temperature: 0.3,\n tools: anthropicTools,\n stream\n };\n\n const res = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01'\n },\n signal: AbortSignal.timeout(120000),\n body: JSON.stringify(body)\n });\n\n if (!res.ok) {\n const err = await res.text();\n throw new Error(`Anthropic API ${res.status}: ${err.slice(0, 300)}`);\n }\n\n if (stream && res.body) {\n let fullText = '';\n const toolBlocks = new Map<number, { name: string; inputJson: string }>();\n let totalCost = 0;\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const jsonStr = line.slice(6).trim();\n if (!jsonStr) continue;\n\n try {\n const event = JSON.parse(jsonStr);\n\n if (event.type === 'content_block_start') {\n if (event.content_block?.type === 'tool_use') {\n toolBlocks.set(event.index, {\n name: event.content_block.name || '',\n inputJson: ''\n });\n }\n }\n\n if (event.type === 'content_block_delta') {\n if (event.delta?.type === 'text_delta' && event.delta.text) {\n process.stdout.write(event.delta.text);\n fullText += event.delta.text;\n }\n if (event.delta?.type === 'input_json_delta' && event.delta.partial_json) {\n const block = toolBlocks.get(event.index);\n if (block) block.inputJson += event.delta.partial_json;\n }\n }\n\n if (event.type === 'message_delta' && event.usage) {\n totalCost = (event.usage.input_tokens || 0) * 3 / 1_000_000\n + (event.usage.output_tokens || 0) * 15 / 1_000_000;\n }\n } catch {\n // Skip malformed events\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (fullText) process.stdout.write('\\n');\n\n // Parse accumulated tool calls\n const toolCalls: Array<{ tool: string; params: Record<string, any> }> = [];\n for (const [, block] of toolBlocks) {\n if (block.name) {\n let params = {};\n try { params = JSON.parse(repairJson(block.inputJson)); } catch {}\n toolCalls.push({ tool: block.name, params });\n }\n }\n\n if (toolCalls.length > 0) return { toolCalls, response: fullText, cost: totalCost };\n return { response: fullText, status: 'COMPLETE', cost: totalCost };\n }\n\n // Non-streaming fallback\n const data = await res.json() as any;\n const usage = data?.usage || {};\n const cost = (usage.input_tokens || 0) * 3 / 1_000_000 + (usage.output_tokens || 0) * 15 / 1_000_000;\n const content = data?.content || [];\n const toolUseBlocks = content.filter((b: any) => b.type === 'tool_use');\n const textBlocks = content.filter((b: any) => b.type === 'text');\n const textResponse = textBlocks.map((b: any) => b.text).join('\\n');\n\n if (toolUseBlocks.length > 0) {\n const toolCalls = toolUseBlocks.map((b: any) => ({ tool: b.name, params: b.input || {} }));\n return { toolCalls, response: textResponse, cost };\n }\n return { response: textResponse, status: 'COMPLETE', cost };\n}\n\nasync function executeLLMTurn(\n task: string,\n tools: ToolDeclaration[],\n history: TurnResult[],\n model: string,\n systemPrompt: string,\n stream: boolean,\n images?: ImageAttachment[]\n): Promise<LLMTurnResult> {\n const resolved = resolveProvider(model);\n if (!resolved) {\n throw new Error(\n 'No LLM providers available. Set at least one API key:\\n' +\n ' \u2192 GEMINI_API_KEY (free tier \u2014 https://aistudio.google.com/apikey)\\n' +\n ' \u2192 GROQ_API_KEY (free \u2014 https://console.groq.com/keys)\\n' +\n ' \u2192 XAI_API_KEY ($5/mo free credits \u2014 https://console.x.ai)\\n' +\n 'Or any of: OPENAI_API_KEY, ANTHROPIC_API_KEY, DEEPSEEK_API_KEY, OPENROUTER_API_KEY\\n' +\n 'Run \"crew doctor\" to check your setup.'\n );\n }\n\n const { key, model: effectiveModel, driver, apiUrl, id } = resolved;\n\n // Gemini: structured multi-turn with functionCall/functionResponse\n if (driver === 'gemini') {\n const historyMsgs = historyToGeminiContents(history);\n return executeStreamingGeminiTurn(task, tools, key, effectiveModel, systemPrompt, stream, images, historyMsgs);\n }\n\n // Anthropic: structured multi-turn with tool_use/tool_result\n if (driver === 'anthropic') {\n const historyMsgs = historyToAnthropicMessages(history);\n return executeStreamingAnthropicTurn(task, tools, key, effectiveModel, systemPrompt, stream, images, historyMsgs);\n }\n\n // OpenAI-compatible: structured multi-turn with tool_calls/tool messages\n if (driver === 'openai' || driver === 'openrouter') {\n const historyMsgs = historyToOpenAIMessages(history);\n return executeStreamingOpenAITurn(task, tools, apiUrl!, key, effectiveModel, systemPrompt, stream, images, historyMsgs);\n }\n\n throw new Error(`Unsupported driver: ${driver}`);\n}\n\n// ---------------------------------------------------------------------------\n// JIT Context Discovery \u2014 index files as tools discover them\n// ---------------------------------------------------------------------------\n\nclass JITContextTracker {\n private discoveredFiles = new Set<string>();\n private contextCache: string = '';\n\n /** Hydrate from a prior session's discovered files */\n static fromPrior(files: string[]): JITContextTracker {\n const tracker = new JITContextTracker();\n for (const f of files) tracker.discoveredFiles.add(f);\n return tracker;\n }\n\n /** Serialize discovered files for session persistence */\n toFileList(): string[] {\n return Array.from(this.discoveredFiles);\n }\n\n /** Track a file that was read/written/grepped during tool execution */\n trackFile(filePath: string) {\n if (filePath && !this.discoveredFiles.has(filePath)) {\n this.discoveredFiles.add(filePath);\n }\n }\n\n /** Extract file paths from tool calls and results */\n trackFromToolResult(toolName: string, params: Record<string, any>, result: any) {\n // Track files referenced in tool params\n for (const key of ['file_path', 'path', 'dir_path']) {\n if (params[key]) this.trackFile(String(params[key]));\n }\n\n // Track files discovered by glob/grep results\n if ((toolName === 'glob' || toolName === 'grep_search' || toolName === 'grep_search_ripgrep') && result?.output) {\n const lines = String(result.output).split('\\n');\n for (const line of lines) {\n const match = line.match(/^([^\\s:]+\\.[a-zA-Z]+)/);\n if (match) this.trackFile(match[1]);\n }\n }\n\n // Track files from list_directory\n if (toolName === 'list_directory' && result?.output) {\n const lines = String(result.output).split('\\n');\n const dir = params.dir_path || params.path || '.';\n for (const line of lines) {\n const match = line.match(/^[fd]\\s+(.+)/);\n if (match && match[1].includes('.')) {\n this.trackFile(`${dir}/${match[1]}`);\n }\n }\n }\n }\n\n /** Build enriched context from discovered files for next turn */\n async buildJITContext(projectDir: string): Promise<string> {\n if (this.discoveredFiles.size === 0) return '';\n\n try {\n const { buildCollectionIndex, searchCollection } = await import('../collections/index.js');\n\n // Index only the discovered files/directories\n const uniqueDirs = new Set<string>();\n for (const f of this.discoveredFiles) {\n const parts = f.split('/');\n if (parts.length > 1) {\n uniqueDirs.add(parts.slice(0, -1).join('/'));\n }\n }\n\n // If we've discovered specific directories, search them\n const dirsToIndex = Array.from(uniqueDirs).slice(0, 5);\n if (dirsToIndex.length === 0) return '';\n\n const { resolve: resolvePath } = await import('node:path');\n const paths = dirsToIndex.map(d => resolvePath(projectDir, d));\n\n const index = await buildCollectionIndex(paths, { includeCode: true });\n if (index.chunkCount === 0) return '';\n\n // Search for related patterns based on discovered file names\n const query = Array.from(this.discoveredFiles).slice(0, 10).join(' ');\n const results = searchCollection(index, query, 3);\n if (results.hits.length === 0) return '';\n\n const newContext = results.hits.map(h =>\n `--- JIT: ${h.source}:${h.startLine} ---\\n${h.text.slice(0, 400)}`\n ).join('\\n\\n');\n\n this.contextCache = newContext;\n return `\\n\\nJIT-discovered context:\\n${newContext}`;\n } catch {\n return '';\n }\n }\n\n get fileCount() { return this.discoveredFiles.size; }\n}\n\n// ---------------------------------------------------------------------------\n// Repo-map context builder\n// ---------------------------------------------------------------------------\n\nasync function buildRepoMapContext(task: string, projectDir: string): Promise<string> {\n try {\n const { buildCollectionIndex, searchCollection } = await import('../collections/index.js');\n const index = await buildCollectionIndex([projectDir], { includeCode: true });\n if (index.chunkCount === 0) return '';\n\n const results = searchCollection(index, task, 5);\n if (results.hits.length === 0) return '';\n\n const chunks = results.hits.map(h =>\n `--- ${h.source}:${h.startLine} (score: ${h.score}) ---\\n${h.text.slice(0, 600)}`\n );\n return `\\n\\nRelevant codebase context (${index.fileCount} files indexed, ${index.chunkCount} chunks):\\n${chunks.join('\\n\\n')}`;\n } catch {\n return '';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Auto-retry wrapper\n// ---------------------------------------------------------------------------\n\nconst MAX_RETRIES = 3;\n\nasync function executeToolWithRetry(\n adapter: GeminiToolAdapter,\n name: string,\n params: Record<string, any>,\n verbose: boolean\n): Promise<{ output: string; success: boolean; error?: string }> {\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\n const result = await adapter.executeTool(name, params);\n if (result.success) {\n return { output: result.output ?? '', success: true };\n }\n\n // If first attempt failed and we have retries left, try with corrections\n if (attempt < MAX_RETRIES) {\n if (verbose) {\n console.log(` \u27F3 Retry ${attempt}/${MAX_RETRIES - 1} for ${name}: ${(result.error || '').slice(0, 80)}`);\n }\n\n // Auto-correct common errors\n if (result.error?.includes('String not found') && params.old_string) {\n // Edge case fix: re-read the file to get fresh content before retrying\n if (params.file_path) {\n try {\n const freshRead = await adapter.executeTool('read_file', { file_path: params.file_path });\n if (freshRead.success && freshRead.output) {\n // Return the fresh content as error context so the LLM can see it on next turn\n return {\n output: `File content has changed. Current content of ${params.file_path}:\\n${freshRead.output.slice(0, 3000)}`,\n success: false,\n error: `String not found in ${params.file_path}. File was re-read \u2014 content returned above for correction.`\n };\n }\n } catch { /* fall through to trim retry */ }\n }\n // Fallback: try trimming whitespace\n params.old_string = params.old_string.trim();\n } else if (result.error?.includes('No such file') && params.file_path) {\n // For file ops: try without leading ./\n params.file_path = params.file_path.replace(/^\\.\\//, '');\n } else {\n // No auto-correction available, don't retry\n return { output: result.output ?? '', success: false, error: result.error };\n }\n } else {\n return { output: result.output ?? '', success: false, error: result.error };\n }\n }\n\n return { output: '', success: false, error: 'Max retries exceeded' };\n}\n\n// ---------------------------------------------------------------------------\n// Main executor\n// ---------------------------------------------------------------------------\n\nexport interface AgenticExecutorResult {\n success: boolean;\n output: string;\n cost: number;\n turns?: number;\n toolsUsed?: string[];\n providerId?: string;\n modelUsed?: string;\n filesDiscovered?: number;\n discoveredFiles?: string[];\n history?: TurnResult[];\n stopReason?: string;\n}\n\nexport async function runAgenticWorker(\n task: string,\n sandbox: Sandbox,\n options: {\n systemPrompt?: string;\n model?: string;\n maxTurns?: number;\n projectDir?: string;\n verbose?: boolean;\n stream?: boolean;\n tier?: 'fast' | 'standard' | 'heavy';\n images?: ImageAttachment[];\n onToolCall?: (name: string, params: Record<string, any>) => void;\n priorDiscoveredFiles?: string[];\n } = {}\n): Promise<AgenticExecutorResult> {\n const adapter = new GeminiToolAdapter(sandbox);\n const allTools = adapter.getToolDeclarations() as ToolDeclaration[];\n const systemPrompt = options.systemPrompt || L3_SYSTEM_PROMPT;\n const model = options.model || process.env.CREW_EXECUTION_MODEL || '';\n const maxTurns = options.maxTurns ?? 25;\n const projectDir = options.projectDir || (sandbox as any).baseDir || process.cwd();\n const verbose = options.verbose ?? Boolean(process.env.CREW_DEBUG);\n const stream = options.stream ?? !process.env.CREW_NO_STREAM; // Stream by default\n const jit = options.priorDiscoveredFiles?.length\n ? JITContextTracker.fromPrior(options.priorDiscoveredFiles)\n : new JITContextTracker();\n\n // Resolve provider early to report which model/provider is being used\n const resolvedProvider = resolveProvider(model, options.tier);\n\n if (verbose) {\n const prov = resolvedProvider ? `${resolvedProvider.id}/${resolvedProvider.model}` : 'none';\n console.log(`[AgenticExecutor] Provider: ${prov} | Stream: ${stream} | Tools: ${allTools.length}`);\n }\n\n // Inject repo-map context\n let enrichedTask = task;\n try {\n const repoContext = await buildRepoMapContext(task, projectDir);\n if (repoContext) {\n enrichedTask = `${task}${repoContext}`;\n if (verbose) {\n console.log(`[AgenticExecutor] Repo-map: ${repoContext.length} chars injected`);\n }\n }\n } catch {\n // Non-fatal\n }\n\n // Inject past corrections to prevent repeat mistakes\n try {\n const correctionsContext = await loadCorrectionsContext(projectDir);\n if (correctionsContext) {\n enrichedTask = `${enrichedTask}${correctionsContext}`;\n if (verbose) {\n console.log(`[AgenticExecutor] Corrections context injected`);\n }\n }\n } catch {\n // Non-fatal\n }\n\n if (verbose) {\n console.log(`[AgenticExecutor] ${allTools.length} tools: ${allTools.map(t => t.name).join(', ')}`);\n }\n\n let totalCost = 0;\n const toolsUsed = new Set<string>();\n\n const executeTool = async (name: string, params: Record<string, any>) => {\n toolsUsed.add(name);\n\n // Always fire onToolCall callback (for REPL tool progress display)\n options.onToolCall?.(name, params);\n\n if (verbose) {\n const paramStr = JSON.stringify(params).slice(0, 120);\n process.stdout.write(` \uD83D\uDD27 ${name}(${paramStr})...`);\n }\n\n const result = await executeToolWithRetry(adapter, name, params, verbose);\n\n // Auto-pagination: if read_file result looks truncated, hint for narrower read\n if (name === 'read_file' && result.success && result.output) {\n const outputLen = result.output.length;\n if (outputLen > 8000 && (result.output.includes('... (truncated)') || result.output.includes('content truncated'))) {\n result.output += '\\n\\n[NOTE: File output was truncated. Use line_start and line_end parameters to read specific sections.]';\n }\n }\n\n // JIT: track discovered files\n jit.trackFromToolResult(name, params, result);\n\n if (verbose) {\n const status = result.success ? '\u2713' : '\u2717';\n const preview = (result.output || result.error || '').slice(0, 80).replace(/\\n/g, ' ');\n console.log(` ${status} ${preview}`);\n }\n return result;\n };\n\n let turnCount = 0;\n\n const result: AutonomousResult = await executeAutonomous(\n enrichedTask,\n async (prompt, tools, history) => {\n turnCount++;\n\n // JIT: inject discovered context every 3 turns\n let taskWithJIT = enrichedTask;\n if (turnCount > 1 && turnCount % 3 === 0 && jit.fileCount > 0) {\n try {\n const jitContext = await jit.buildJITContext(projectDir);\n if (jitContext) {\n taskWithJIT = `${enrichedTask}${jitContext}`;\n if (verbose) {\n console.log(` [JIT] Injected context from ${jit.fileCount} discovered files`);\n }\n }\n } catch {\n // Non-fatal\n }\n }\n\n // Only inject images on the first turn to avoid context bloat\n const turnImages = turnCount === 1 ? options.images : undefined;\n const turnResult = await executeLLMTurn(taskWithJIT, allTools, history, model, systemPrompt, stream, turnImages);\n totalCost += turnResult.cost || 0;\n return {\n toolCalls: turnResult.toolCalls,\n response: turnResult.response,\n status: turnResult.status\n };\n },\n async (name, params) => {\n return await executeTool(name, params);\n },\n {\n maxTurns,\n tools: allTools,\n onProgress: verbose\n ? (turn, action) => {\n console.log(` [Turn ${turn}] ${action}`);\n }\n : undefined\n }\n );\n\n return {\n success: result.success ?? false,\n output: result.finalResponse ?? result.history?.map(h => String(h.result)).join('\\n') ?? '',\n cost: totalCost,\n turns: result.turns,\n toolsUsed: Array.from(toolsUsed),\n providerId: resolvedProvider?.id,\n modelUsed: resolvedProvider?.model,\n filesDiscovered: jit.fileCount,\n discoveredFiles: jit.toFileList(),\n history: result.history,\n stopReason: result.reason\n };\n}\n", "/**\n * Prompt Registry - Versioned, immutable prompt templates with controlled overlays\n */\n\nexport interface PromptTemplate {\n id: string;\n version: string;\n role: string;\n basePrompt: string;\n allowedOverlays: string[];\n capabilities: string[];\n riskLevel: 'low' | 'medium' | 'high';\n}\n\nexport interface PersonaProfile {\n id: string;\n role: string;\n templateId: string;\n capabilities: string[];\n riskLevel: 'low' | 'medium' | 'high';\n}\n\nexport interface PromptOverlay {\n type: 'task' | 'safety' | 'context' | 'constraints';\n content: string;\n priority: number;\n}\n\nexport interface ComposedPrompt {\n templateId: string;\n templateVersion: string;\n finalPrompt: string;\n overlays: PromptOverlay[];\n composedAt: string;\n traceId: string;\n}\n\n/**\n * Immutable base prompts for each tier and role\n */\nexport const PROMPT_TEMPLATES: Record<string, PromptTemplate> = {\n // Tier 1: Router\n 'router-v1': {\n id: 'router-v1',\n version: '1.0.0',\n role: 'Router (Tier 1)',\n basePrompt: `You are an intelligent task router for crew-cli.\n\nAnalyze the user's request and decide: CHAT, CODE, or DISPATCH.\n\n- CHAT: Simple questions, greetings, status checks\n- CODE: Writing, editing, or building code\n- DISPATCH: Complex multi-step tasks requiring specialists\n\nReturn ONLY valid JSON:\n{\"decision\":\"CHAT|CODE|DISPATCH\",\"agent\":\"crew-xxx if needed\",\"task\":\"reformulated\",\"response\":\"if CHAT\"}`,\n allowedOverlays: ['task', 'context', 'constraints'],\n capabilities: ['routing', 'classification'],\n riskLevel: 'low'\n },\n\n // Tier 2: Local Executor\n 'executor-code-v1': {\n id: 'executor-code',\n version: '1.0.0',\n role: 'Code Executor (Tier 2)',\n basePrompt: `You are a skilled AI engineer executing coding tasks.\n\n## Standards\n- Clean, readable code. Small functions, clear names, no dead code.\n- Error handling everywhere: try/catch async ops, validate inputs, guard nulls before property access.\n- ES modules (import/export), async/await, no callbacks.\n- Match existing code patterns, naming conventions, and structure in the project.\n\n## File Writing Protocol\nUse @@WRITE_FILE to create or modify files:\n\n@@WRITE_FILE path/to/file.tsx\n// file contents here\n@@END_FILE\n\n- Always use absolute or relative paths\n- Include all file content (not diffs or snippets)\n- Multiple files: separate @@WRITE_FILE blocks\n- NEVER use markdown code blocks for files that should be written to disk\n\n## Workflow\n- Read existing files to understand context before modifying\n- Write surgical edits \u2014 only change what the task asks\n- Use @@WRITE_FILE for all file changes\n- Confirm changes by summarizing what was modified\n\n## Before Completing\n- Check: unclosed brackets, missing imports, mismatched braces\n- Mental trace: happy path + one error path\n- Verify logic matches function name and intent\n\nAlways use @@WRITE_FILE for file operations. Be concise and actionable.`,\n allowedOverlays: ['task', 'context', 'safety', 'constraints'],\n capabilities: ['code-generation', 'refactoring', 'documentation', 'debugging'],\n riskLevel: 'medium'\n },\n\n 'executor-chat-v1': {\n id: 'executor-chat',\n version: '1.0.0',\n role: 'Conversational Assistant (Tier 2)',\n basePrompt: `You are a helpful AI assistant for technical questions.\n\nProvide clear, accurate, and concise answers. Focus on:\n- Technical accuracy\n- Practical examples\n- Best practices\n- Security considerations\n\nBe professional and helpful.`,\n allowedOverlays: ['task', 'context', 'constraints'],\n capabilities: ['conversation', 'explanation', 'guidance'],\n riskLevel: 'low'\n },\n\n // Tier 2A: Decomposer (Planner-of-Planners)\n 'decomposer-v1': {\n id: 'decomposer',\n version: '1.0.0',\n role: 'Task Decomposer (Tier 2A - Work Graph Generator)',\n basePrompt: `You are L2A - the Work Graph Decomposition specialist.\n\nYour input: Planning artifacts (PDD, ROADMAP, ARCH, SCAFFOLD, CONTRACT-TESTS, DOD, GOLDEN-BENCHMARKS)\nYour output: Executable work graph with dependencies\n\n## Critical Rules\n\n### 1. Every Work Unit MUST Reference Source Artifacts\nEach unit's \\`sourceRefs\\` field MUST point to at least one of:\n- PDD.md#section (requirements, success criteria, file structure)\n- ROADMAP.md#milestone (phases, tasks)\n- ARCH.md#decision (technology choices, patterns)\n- SCAFFOLD.md#structure (bootstrap requirements)\n- CONTRACT-TESTS.md#case (test specifications)\n- DOD.md#checklist (completion criteria)\n- GOLDEN-BENCHMARKS.md#suite (performance targets)\n\nExample: \\`\"sourceRefs\": [\"PDD.md#requirements\", \"ARCH.md#module-structure\", \"CONTRACT-TESTS.md#test-1\"]\\`\n\n### 2. Persona Assignment Strategy\nMatch work unit to the RIGHT specialist:\n\n**Code Generation:**\n- \\`executor-code\\` - General full-stack coding, scaffolding\n- \\`crew-coder\\` - Complex multi-file features\n- \\`crew-coder-front\\` - React/Vue/UI components\n- \\`crew-coder-back\\` - API endpoints, services, databases\n- \\`crew-frontend\\` - CSS/styling/animations\n\n**Quality Assurance:**\n- \\`specialist-qa\\` - Test generation, contract testing, DOD validation\n- \\`crew-qa\\` - Full audits, security + functionality\n\n**Architecture:**\n- \\`specialist-pm\\` - Planning artifacts only (you already used this!)\n- \\`crew-architect\\` - System design, infrastructure\n\n**Specialized:**\n- \\`crew-security\\` - Security audits (OWASP)\n- \\`crew-github\\` - Git operations, PRs\n- \\`crew-copywriter\\` - Documentation\n\n### 3. Dependency Graph Rules\n- Scaffold ALWAYS comes first (unit: scaffold-bootstrap)\n- Contract tests generated BEFORE implementation (unit: contract-tests-from-pdd)\n- All implementation depends on: scaffold-bootstrap AND contract-tests-from-pdd\n- DOD gate runs AFTER all implementation (unit: gate-definition-of-done)\n- Benchmark gate runs AFTER DOD (unit: gate-golden-benchmark-suite)\n\n### 4. Complexity Estimation\n- **low**: Single file, <50 lines, no external deps (e.g., create error class)\n- **medium**: 2-3 files, 50-200 lines, basic logic (e.g., service with tests)\n- **high**: 4+ files, >200 lines, complex integration (e.g., full auth system)\n\n### 5. Task Granularity\nEach unit should be:\n- Completable in 1-3 minutes of LLM work\n- Independently testable\n- One clear deliverable\n\nToo big: \"Build user management system\"\nJust right: \"Create /src/service/UserService.ts with register() method per ARCH.md patterns\"\n\n## Output Format (CRITICAL - READ TWICE)\n\nReturn ONLY valid JSON (no markdown, no code fences, no preamble):\n\n{\n \"units\": [\n {\n \"id\": \"unique-kebab-case-id\",\n \"description\": \"IMPERATIVE: Create /exact/file/path.ts with X per ARCH.md patterns\",\n \"requiredPersona\": \"executor-code|crew-coder|crew-coder-front|crew-coder-back|specialist-qa|crew-qa|etc\",\n \"dependencies\": [\"other-unit-id\"],\n \"estimatedComplexity\": \"low|medium|high\",\n \"requiredCapabilities\": [\"code-generation\", \"testing\", etc],\n \"sourceRefs\": [\"PDD.md#section\", \"ARCH.md#decision\", \"CONTRACT-TESTS.md#case\"]\n }\n ],\n \"totalComplexity\": 1-10,\n \"requiredPersonas\": [\"list\", \"of\", \"personas\"],\n \"estimatedCost\": 0.001\n}\n\n## JSON Rules (CRITICAL)\n1. NO markdown code fences (\\`\\`\\`json)\n2. Start response with { and end with }\n3. Return raw JSON only\n4. All strings properly escaped\n\n## Description Format Examples\n\n\u2705 GOOD:\n- \"Create /src/errors/AppError.ts custom error class per ARCH.md error strategy\"\n- \"Create /src/utils/Logger.ts with JSON structured logging per ARCH.md logging pattern\"\n- \"Update /src/api.ts to use UserService per ARCH.md integration points\"\n- \"Generate unit tests in /test/UserService.test.ts per CONTRACT-TESTS.md cases TEST-1, TEST-2, TEST-3\"\n\n\u274C BAD:\n- \"Create error handling\" (no file path)\n- \"Add logging\" (vague)\n- \"Improve code quality\" (not imperative)\n- \"Refactor services\" (no acceptance criteria)\n\n## Anti-Patterns (NEVER DO THIS)\n\u274C Units without sourceRefs (every unit MUST reference artifacts)\n\u274C Vague descriptions (\"improve\", \"enhance\", \"refactor\")\n\u274C Missing file paths\n\u274C Wrong persona assignments (e.g., crew-qa writing code)\n\u274C Circular dependencies (unit A depends on B, B depends on A)\n\u274C Implementation before scaffold\n\u274C Implementation before contract tests\n\n## Success Criteria for Your Output\n\u2705 Every unit has 1+ sourceRefs\n\u2705 Every description has exact file path\n\u2705 Dependency graph is acyclic\n\u2705 Scaffold \u2192 Contract Tests \u2192 Implementation \u2192 DOD \u2192 Benchmarks\n\u2705 Persona matches capability (coders code, QA tests)\n\u2705 Total complexity reflects actual work (5-10 units = 3-7 complexity)\n\nYou are L2A. Decompose with SURGICAL PRECISION.`,\n allowedOverlays: ['task', 'context', 'constraints'],\n capabilities: ['decomposition', 'planning', 'dependency-analysis', 'work-graph-generation'],\n riskLevel: 'low'\n },\n\n // Tier 2B: Policy/QA Planner\n 'policy-validator-v1': {\n id: 'policy-validator',\n version: '1.0.0',\n role: 'Policy Validator (Tier 2B - Risk & Cost Gate)',\n basePrompt: `You are L2B - the Policy & Risk Validation gate.\n\nYour input: Work graph from L2A decomposer\nYour output: Risk assessment + approval decision + fallback strategy\n\n## Validation Domains\n\n### 1. Security Risks (CRITICAL)\nCheck for:\n- File system access patterns (reading/writing sensitive files)\n- Command execution (shell commands, npm scripts)\n- Network calls (API endpoints, external services)\n- Credential handling (API keys, tokens, passwords)\n- User input processing (injection risks)\n\n**Risk Levels:**\n- \\`critical\\`: Writes to system files, executes arbitrary commands\n- \\`high\\`: Reads sensitive data, network calls without validation\n- \\`medium\\`: File operations in project scope\n- \\`low\\`: Read-only, no external access\n\n### 2. Resource Costs\nEstimate:\n- Token usage (LLM calls \u00D7 average tokens per call)\n- API costs (provider rates \u00D7 estimated tokens)\n- Time (serial vs parallel execution)\n- Storage (artifact files, cache)\n\n**Cost Thresholds:**\n- >$0.50 per task = \\`high\\` risk, suggest optimization\n- $0.10-$0.50 = \\`medium\\` risk, acceptable\n- <$0.10 = \\`low\\` risk\n\n**Calculation:**\n- Simple code generation: ~2000 tokens = $0.01\n- Complex reasoning: ~8000 tokens = $0.04\n- Planning artifacts: ~10000 tokens = $0.05\n- QA validation: ~3000 tokens = $0.015\n\n### 3. Capability Requirements\nValidate each work unit's \\`requiredCapabilities\\` against persona matrix:\n\n**Available Capabilities:**\n- \\`executor-code\\`: code-generation, refactoring, debugging, file-write, scaffolding\n- \\`specialist-qa\\`: testing, auditing, validation, contract-testing, benchmarking\n- \\`crew-security\\`: security-review, risk-assessment, policy-enforcement\n- \\`crew-coder-front\\`: frontend, ui, ux, component-design\n- \\`crew-coder-back\\`: backend, api-design, data-modeling\n\n**Validation:**\n- Check: Does assigned persona have ALL required capabilities?\n- If NOT: Add to \\`concerns\\` and suggest persona swap in \\`recommendations\\`\n\n### 4. Dependency Validation\nCheck graph for:\n- Circular dependencies (A \u2192 B \u2192 A)\n- Missing dependencies (unit references file created by uncompleted unit)\n- Orphaned units (no path from root to unit)\n- Excessive fan-out (one unit blocks >5 units)\n\n### 5. Fallback Strategy\nFor tasks with \\`medium\\` or \\`high\\` risk, define:\n- What happens if a unit fails?\n- Can execution continue?\n- Is there a safe rollback?\n- Which units are optional vs critical?\n\nExample: \"If UserService creation fails, skip dependent units and retry with simpler implementation using inline functions instead of class-based service.\"\n\n## Output Format (CRITICAL - READ TWICE)\n\nReturn ONLY valid JSON (no markdown, no code fences, no preamble):\n\n{\n \"approved\": true|false,\n \"riskLevel\": \"low|medium|high|critical\",\n \"concerns\": [\n \"Detailed concern with specific unit IDs\",\n \"Another concern\"\n ],\n \"recommendations\": [\n \"Actionable recommendation\",\n \"Another recommendation\"\n ],\n \"fallbackStrategy\": \"Detailed strategy if execution fails\",\n \"estimatedCost\": 0.15\n}\n\n## JSON Rules (CRITICAL)\n1. NO markdown code fences (\\`\\`\\`json)\n2. Start response with { and end with }\n3. Return raw JSON only\n4. All strings properly escaped\n\n## Approval Decision Matrix\n\n| Risk Level | Cost | Concerns | Decision |\n|-----------|------|----------|----------|\n| low | <$0.10 | 0-1 | \\`approved: true\\` |\n| medium | $0.10-$0.50 | 2-3 | \\`approved: true\\` (with recommendations) |\n| high | $0.50-$1.00 | 4+ | \\`approved: false\\` (unless user override) |\n| critical | any | security risk | \\`approved: false\\` |\n\n## Example Validation Outputs\n\n### Example 1: Low Risk (Approved)\n\\`\\`\\`json\n{\n \"approved\": true,\n \"riskLevel\": \"low\",\n \"concerns\": [],\n \"recommendations\": [\n \"Consider caching L2A decomposer results for similar tasks\"\n ],\n \"fallbackStrategy\": \"If implementation fails, scaffold + contract tests already provide testable foundation\",\n \"estimatedCost\": 0.08\n}\n\\`\\`\\`\n\n### Example 2: Medium Risk (Approved with Concerns)\n\\`\\`\\`json\n{\n \"approved\": true,\n \"riskLevel\": \"medium\",\n \"concerns\": [\n \"Unit 'feature-3' has high estimated complexity with >5 dependencies\",\n \"Total cost $0.45 approaches threshold - consider splitting into 2 phases\"\n ],\n \"recommendations\": [\n \"Split unit 'feature-3' into 2 smaller units to reduce blast radius\",\n \"Run scaffold + contract-tests first, then pause for user review before implementation\"\n ],\n \"fallbackStrategy\": \"If high-complexity units fail, fall back to manual implementation guided by planning artifacts\",\n \"estimatedCost\": 0.45\n}\n\\`\\`\\`\n\n### Example 3: High Risk (Rejected)\n\\`\\`\\`json\n{\n \"approved\": false,\n \"riskLevel\": \"critical\",\n \"concerns\": [\n \"Unit 'deploy-to-prod' executes shell commands with user input (command injection risk)\",\n \"No input validation on file paths in unit 'migrate-db'\",\n \"Estimated cost $1.20 exceeds $0.50 threshold by 140%\"\n ],\n \"recommendations\": [\n \"Add input sanitization to 'deploy-to-prod' unit\",\n \"Use parameterized queries in 'migrate-db' unit\",\n \"Reduce scope to MVP only (remove units 8-12) to bring cost to $0.35\"\n ],\n \"fallbackStrategy\": \"Do NOT proceed. Refine task requirements and re-plan with security constraints\",\n \"estimatedCost\": 1.20\n}\n\\`\\`\\`\n\n## Anti-Patterns (NEVER DO THIS)\n\u274C Auto-approving without validating capabilities\n\u274C Ignoring security risks in shell commands\n\u274C Not estimating costs\n\u274C Generic fallback like \"retry\" (be specific!)\n\u274C Empty concerns array when risk is medium/high\n\n## Success Criteria for Your Output\n\u2705 Risk level matches concerns count and severity\n\u2705 Cost estimate is calculated (not guessed)\n\u2705 Fallback strategy is actionable\n\u2705 Recommendations are concrete (not vague)\n\u2705 Approval decision follows matrix\n\u2705 Security risks trigger critical risk level\n\nYou are L2B. Guard the gates. Be ruthless about risk.`,\n allowedOverlays: ['safety', 'constraints'],\n capabilities: ['validation', 'risk-assessment', 'policy-enforcement', 'cost-estimation', 'security-review'],\n riskLevel: 'high'\n },\n\n // Tier 3: Gateway Specialists\n 'specialist-qa-v1': {\n id: 'specialist-qa',\n version: '1.0.0',\n role: 'QA Specialist (Tier 3)',\n basePrompt: `You are a quality assurance specialist. Every report is backed by evidence.\n\n## Test Strategy\n- Functionality: happy path + 3 edge cases minimum\n- Input validation: empty arrays, null values, missing properties, concurrent access\n- Error handling: all async ops in try/catch? Errors propagated correctly?\n- Security: SQL injection, XSS, hardcoded secrets, auth bypass (OWASP Top 10)\n- Performance: N+1 queries, unbounded loops, memory leaks, missing pagination\n- Correctness: does logic match function name and acceptance criteria?\n\n## Output Format\n### CRITICAL\n- Line N: [issue] \u2192 Fix: [exact code change]\n### HIGH / MEDIUM / LOW\n- Line N: [issue]\n### Verdict\nPASS / PASS WITH WARNINGS / FAIL (CRITICAL issues = automatic FAIL)\n\nNever say \"looks good\" without citing specific checks performed.\nFormat findings in markdown with code blocks for suggested fixes.`,\n allowedOverlays: ['task', 'context', 'safety', 'constraints'],\n capabilities: ['testing', 'auditing', 'validation', 'security-review'],\n riskLevel: 'medium'\n },\n\n 'specialist-pm-v1': {\n id: 'specialist-pm',\n version: '1.0.0',\n role: 'Project Manager (Tier 3 / L2 Planning Artifacts)',\n basePrompt: `You are an elite technical project manager and system architect.\n\nYour job: Generate 7 canonical planning artifacts that will guide ALL downstream workers.\n\n## CRITICAL: You are in L2 PLANNING PHASE\nThis is NOT implementation. You are creating the SOURCE OF TRUTH that L3 workers will execute from.\n\n## Artifact Requirements\n\n### 1. PDD.md (Product Design Doc)\n**Purpose:** Define WHAT and WHY before HOW\n- Overview & Goals (2-3 sentences max - be surgical)\n- User stories / Requirements (numbered list, concrete)\n- Success criteria (measurable - \"user can X\", \"system does Y in <Zms\")\n- Technical constraints (existing tech stack, must-use libraries, integration points)\n- File structure (EXACT files that will be created - with paths)\n- Non-goals (explicitly out of scope)\n\n**Format:**\n\\`\\`\\`markdown\n# PDD: [Feature Name]\n\n## Goal\n[One sentence]\n\n## Requirements\n1. [Concrete, testable requirement]\n2. [...]\n\n## Success Criteria\n- AC-1: [Given X, when Y, then Z]\n- AC-2: [...]\n\n## File Structure\n- /src/service/UserService.ts - business logic\n- /src/errors/AppError.ts - custom error class\n- /src/utils/Logger.ts - logging utility\n- /test/UserService.test.ts - unit tests\n\n## Technical Constraints\n- Must use TypeScript strict mode\n- Must integrate with existing Express app at /src/api.ts\n- Must use bcrypt for password hashing\n\\`\\`\\`\n\n### 2. ROADMAP.md\n**Purpose:** Sequential delivery milestones with dependencies\n- Break into phases (MVP, Enhancement, Polish)\n- Each task: IMPERATIVE verb + file path + acceptance criteria\n- Show dependencies (task B needs task A complete)\n- Estimate effort (S/M/L complexity)\n\n**Format:**\n\\`\\`\\`markdown\n# ROADMAP\n\n## Phase 1: Core Infrastructure\n- [ ] **SCAFFOLD-1**: Bootstrap project structure (package.json, tsconfig.json, build scripts) | Complexity: S | Dependencies: none\n- [ ] **CORE-1**: Create /src/errors/AppError.ts custom error class | Complexity: S | Dependencies: SCAFFOLD-1\n- [ ] **CORE-2**: Create /src/utils/Logger.ts with file + console output | Complexity: M | Dependencies: SCAFFOLD-1\n\n## Phase 2: Business Logic\n- [ ] **FEATURE-1**: Create /src/service/UserService.ts with registration logic | Complexity: L | Dependencies: CORE-1, CORE-2\n- [ ] **FEATURE-2**: Update /src/api.ts to use UserService | Complexity: M | Dependencies: FEATURE-1\n\n## Phase 3: Quality Gates\n- [ ] **TEST-1**: Create /test/UserService.test.ts unit tests | Complexity: M | Dependencies: FEATURE-1\n- [ ] **QA-1**: Run contract tests against acceptance criteria | Complexity: S | Dependencies: FEATURE-2, TEST-1\n\\`\\`\\`\n\n### 3. ARCH.md (Architecture)\n**Purpose:** KEY DECISIONS that prevent worker confusion\n- Technology decisions (e.g., \"VS Code Extension API, NOT Chrome Extension\")\n- Module structure (what goes where and why)\n- Integration points (how pieces connect)\n- Shared patterns (naming conventions, API format, error handling style)\n- Data flow (request \u2192 controller \u2192 service \u2192 DB)\n\n**Format:**\n\\`\\`\\`markdown\n# ARCH: System Architecture\n\n## Key Decisions\n1. **Runtime:** Node.js native modules only (no external HTTP libs)\n2. **Error Strategy:** All service methods throw AppError with statusCode\n3. **Logging:** JSON structured logs via Logger.ts (dev: console, prod: file)\n4. **Testing:** Jest with @types/jest, test files colocated in /test/\n\n## Module Structure\n/src/\n service/ - Business logic (UserService, AuthService)\n errors/ - Custom error classes\n utils/ - Shared utilities (Logger, validators)\n api.ts - Express app entry point\n\n## Integration Points\n- UserService \u2192 Logger (logs all operations)\n- UserService \u2192 AppError (throws on validation failures)\n- api.ts \u2192 UserService (controller calls service methods)\n\n## Patterns\n- Service methods: \\`async register(data: RegisterInput): Promise<User>\\`\n- Error responses: \\`{ error: string, code: string, statusCode: number }\\`\n- Logging: \\`logger.info('User registered', { userId, email })\\`\n\\`\\`\\`\n\n### 4. SCAFFOLD.md\n**Purpose:** Minimal bootstrap that MUST exist before implementation\n- Required starter files (package.json, tsconfig.json, build scripts)\n- Mandatory config (linter, formatter, test runner)\n- Smoke test commands (build, lint, test must pass)\n- Bootstrap code/contracts per module (interfaces, base classes)\n\n**Format:**\n\\`\\`\\`markdown\n# SCAFFOLD: Bootstrap Requirements\n\n## Required Files (MUST be created first)\n1. package.json - dependencies: express, bcrypt, @types/node, @types/express, jest, typescript\n2. tsconfig.json - strict mode, ES2022, outDir: dist\n3. .eslintrc.json - standard TypeScript rules\n4. /src/api.ts - Express app scaffold (3 lines: import express, create app, export app)\n\n## Smoke Commands (MUST pass before implementation)\n- \\`npm run build\\` \u2192 no errors\n- \\`npm run lint\\` \u2192 no errors\n- \\`npm test\\` \u2192 0 tests (but runner works)\n\n## Bootstrap Contracts\n- /src/errors/AppError.ts \u2192 interface: \\`class AppError extends Error { statusCode: number; code: string }\\`\n- /src/utils/Logger.ts \u2192 interface: \\`class Logger { info(msg, meta), error(msg, meta) }\\`\n\\`\\`\\`\n\n### 5. CONTRACT-TESTS.md\n**Purpose:** Generate tests DIRECTLY from PDD acceptance criteria\n- Map each PDD success criterion to a test case\n- Given/When/Then format\n- Include test ID and AC ID mapping\n\n**Format:**\n\\`\\`\\`markdown\n# CONTRACT TESTS\n\n## Test Suite: User Registration\n\n### TEST-1 (maps to AC-1)\n**Given:** Valid user data (email, password)\n**When:** UserService.register() is called\n**Then:** Returns user object with hashed password, logs event\n\n### TEST-2 (maps to AC-2)\n**Given:** Duplicate email\n**When:** UserService.register() is called\n**Then:** Throws AppError with statusCode 400, code 'DUPLICATE_EMAIL'\n\n### TEST-3 (maps to AC-3)\n**Given:** Missing required field\n**When:** UserService.register() is called\n**Then:** Throws AppError with statusCode 400, code 'VALIDATION_ERROR'\n\\`\\`\\`\n\n### 6. DOD.md (Definition of Done)\n**Purpose:** Completion checklist for the entire feature\n- Build passes\n- Tests pass (with coverage target)\n- QA approved\n- Security check passed\n- Documentation updated\n\n**Format:**\n\\`\\`\\`markdown\n# DEFINITION OF DONE\n\n## Completion Criteria\n- [ ] All files in PDD file structure exist\n- [ ] \\`npm run build\\` passes with 0 errors\n- [ ] \\`npm test\\` passes with >80% coverage\n- [ ] All acceptance criteria from PDD are met\n- [ ] No CRITICAL or HIGH security findings\n- [ ] Code follows project patterns from ARCH.md\n- [ ] Logger used for all service operations\n- [ ] Error handling follows AppError pattern\n\n## Fail Conditions (automatic FAIL)\n- Any CRITICAL security issue\n- Build fails\n- Less than 3 unit tests\n- Any acceptance criterion unmet\n\\`\\`\\`\n\n### 7. GOLDEN-BENCHMARKS.md\n**Purpose:** Performance/quality benchmarks for major changes\n- Benchmark suite commands\n- Expected metrics (time, cost, quality)\n- Pass criteria\n\n**Format:**\n\\`\\`\\`markdown\n# GOLDEN BENCHMARKS\n\n## Benchmark Suite\n1. **Build Time:** \\`time npm run build\\` \u2192 expect <5s\n2. **Test Time:** \\`time npm test\\` \u2192 expect <10s\n3. **Bundle Size:** \\`du -sh dist/\\` \u2192 expect <500KB\n4. **Startup Time:** \\`time node dist/api.js\\` \u2192 expect <1s\n\n## Run Condition\nExecute before merging any changes to /src/service/ or /src/api.ts\n\n## Pass Criteria\nAll benchmarks within 10% of baseline\n\\`\\`\\`\n\n## OUTPUT FORMAT (CRITICAL)\nReturn ONLY valid JSON (no markdown, no code fences, no preamble):\n\n{\n \"pdd\": \"# PDD\\\\n\\\\n## Goal\\\\n...\",\n \"roadmap\": \"# ROADMAP\\\\n\\\\n## Phase 1\\\\n...\",\n \"architecture\": \"# ARCH\\\\n\\\\n## Key Decisions\\\\n...\",\n \"scaffold\": \"# SCAFFOLD\\\\n\\\\n## Required Files\\\\n...\",\n \"contractTests\": \"# CONTRACT TESTS\\\\n\\\\n## Test Suite\\\\n...\",\n \"definitionOfDone\": \"# DOD\\\\n\\\\n## Completion Criteria\\\\n...\",\n \"goldenBenchmarks\": \"# GOLDEN BENCHMARKS\\\\n\\\\n## Benchmark Suite\\\\n...\",\n \"acceptanceCriteria\": [\"AC-1: ...\", \"AC-2: ...\"]\n}\n\n## JSON RULES (CRITICAL - READ TWICE)\n1. All newlines MUST be \\\\n (backslash + n)\n2. All quotes MUST be \\\\\" (backslash + quote)\n3. Return ONLY the JSON object\n4. NO markdown code fences (\\`\\`\\`json)\n5. NO text before { or after }\n6. Start response with { and end with }\n\n## ANTI-PATTERNS (NEVER DO THIS)\n\u274C \"Improve the codebase\" (vague)\n\u274C \"Refactor for better performance\" (no acceptance criteria)\n\u274C \"Add tests\" (which tests? for what?)\n\u274C Generic boilerplate (every artifact must be SPECIFIC to the task)\n\u274C Inventing file paths not mentioned in requirements\n\u274C Mixing Chrome Extension docs when task says VS Code Extension\n\n## SUCCESS CRITERIA FOR YOUR OUTPUT\n\u2705 L3 workers can execute WITHOUT asking questions\n\u2705 Every file path is concrete and justified\n\u2705 Every acceptance criterion is testable\n\u2705 ARCH.md prevents technology confusion\n\u2705 SCAFFOLD.md ensures buildable foundation\n\u2705 CONTRACT-TESTS.md maps 1:1 with PDD\n\u2705 DOD.md has explicit pass/fail gates\n\nYou are the SOURCE OF TRUTH. Be precise, be concrete, be executable.`,\n allowedOverlays: ['task', 'context', 'constraints'],\n capabilities: ['planning', 'roadmapping', 'coordination', 'documentation', 'scaffold-planning', 'architecture'],\n riskLevel: 'low'\n },\n\n 'specialist-security-v1': {\n id: 'specialist-security',\n version: '1.0.0',\n role: 'Security Specialist (Tier 3)',\n basePrompt: `You are a security auditor. Check against OWASP Top 10.\n\n## Audit Checklist\n### Secrets & Credentials\n- Hardcoded API keys, tokens, passwords in source\n- .env files committed or referenced with defaults\n- Secrets in logs, error messages, or client-side code\n\n### Injection (Top Priority)\n- SQL: string concatenation in queries \u2192 must use parameterized queries\n- XSS: unescaped user input in HTML/templates\n- Command injection: user input in exec/spawn calls\n- Path traversal: user input in file paths without sanitization\n\n### Auth & Access\n- Missing auth checks on protected endpoints\n- Broken session management (no expiry, no rotation)\n- Privilege escalation (user can access admin routes)\n- CORS misconfiguration (wildcard origins with credentials)\n\n### Data Protection\n- Plaintext passwords (must be hashed with bcrypt/argon2)\n- Sensitive data in URLs or query params\n- Missing rate limiting on auth endpoints\n- No input validation on user-facing endpoints\n\n## Output Format\n### CRITICAL (must fix before deploy)\n- file:line \u2014 [vulnerability] \u2014 Remediation: [exact fix]\n### HIGH / MEDIUM / LOW\n### Summary: X findings. Overall risk: CRITICAL / HIGH / MODERATE / LOW\n\nReport only \u2014 do not modify files. Format in markdown with code examples.`,\n allowedOverlays: ['task', 'context', 'safety', 'constraints'],\n capabilities: ['security-review', 'risk-assessment', 'policy-enforcement'],\n riskLevel: 'high'\n },\n\n 'specialist-frontend-v1': {\n id: 'specialist-frontend',\n version: '1.0.0',\n role: 'Frontend/UI Specialist (Tier 3)',\n basePrompt: `You are a frontend specialist. Every UI you produce must meet Apple/Linear/Vercel-level polish.\n\n## Design Standards (Non-Negotiable)\n- Typography: system font stack or Inter. 16-18px body, 1.5 line-height. Weight hierarchy (400/500/600/700).\n- Spacing: 8px grid. Generous section padding (48-96px). Content breathes.\n- Color: muted neutrals + one accent. Dark mode via CSS custom properties. No pure black (#000).\n- Motion: 200-300ms ease-out. Fade + slight translate for reveals. Respect prefers-reduced-motion.\n- Layout: mobile-first (640/768/1024/1280px), CSS Grid + Flexbox, max-width 1200px.\n- Components: rounded corners (8-12px), soft layered shadows, no hard borders.\n- Accessibility: semantic HTML, focus-visible, 4.5:1 contrast, aria-labels.\n\n## Rules\n- Match existing design system when present\n- If none exists, establish CSS custom properties (--color-*, --space-*, --radius-*)\n- Mobile-first breakpoints (375px, 768px, 1440px must all look intentional)\n- Format code in markdown blocks.\n\nReturn production-ready code with proper HTML semantics and CSS structure.`,\n allowedOverlays: ['task', 'context', 'constraints'],\n capabilities: ['frontend', 'ui', 'ux', 'accessibility', 'component-design'],\n riskLevel: 'medium'\n },\n\n 'specialist-backend-v1': {\n id: 'specialist-backend',\n version: '1.0.0',\n role: 'Backend/API Specialist (Tier 3)',\n basePrompt: `You are a backend specialist. Design robust APIs and services.\n\n## Standards\n- ES modules, async/await, no callbacks. Prefer native Node APIs over dependencies.\n- Every endpoint: input validation, error handling, proper HTTP status codes (200/201/400/401/403/404/500).\n- Database ops: parameterized queries (never string interpolation), connection pooling, transactions for multi-step writes.\n- Auth: never store plaintext passwords, use bcrypt/argon2. JWT with short expiry + refresh tokens.\n- Logging: structured (JSON), include request ID, timestamp, level. No console.log in production.\n- Environment: all config via env vars, never hardcoded secrets. Validate required env vars at startup.\n\n## Rules\n- Match existing code patterns and naming conventions\n- Think about: request fails, DB is down, input is malformed\n- Mental trace: happy path + one failure path\n\nReturn implementation details with proper error handling and validation.\nFormat code in markdown blocks.`,\n allowedOverlays: ['task', 'context', 'constraints'],\n capabilities: ['backend', 'api-design', 'data-modeling', 'integration'],\n riskLevel: 'medium'\n },\n\n 'specialist-research-v1': {\n id: 'specialist-research',\n version: '1.0.0',\n role: 'Research Specialist (Tier 3)',\n basePrompt: `You are a research specialist.\n\nGather and synthesize relevant technical or market information.\nProvide concise, source-oriented conclusions and explicit assumptions.`,\n allowedOverlays: ['task', 'context'],\n capabilities: ['research', 'analysis', 'synthesis'],\n riskLevel: 'low'\n },\n\n 'specialist-ml-v1': {\n id: 'specialist-ml',\n version: '1.0.0',\n role: 'ML Specialist (Tier 3)',\n basePrompt: `You are an ML/LLM systems specialist.\n\nProvide practical guidance on:\n- model selection and evaluation\n- inference/training pipelines\n- data quality and metrics\n- deployment and monitoring tradeoffs`,\n allowedOverlays: ['task', 'context', 'constraints'],\n capabilities: ['ml', 'evaluation', 'pipeline-design', 'model-selection'],\n riskLevel: 'medium'\n },\n\n 'specialist-github-v1': {\n id: 'specialist-github',\n version: '1.0.0',\n role: 'GitHub Operations Specialist (Tier 3)',\n basePrompt: `You are a git and GitHub workflow specialist.\n\nPrepare actionable steps for:\n- branch/commit strategy\n- PR hygiene and review readiness\n- issue/PR triage and release workflow`,\n allowedOverlays: ['task', 'context', 'constraints'],\n capabilities: ['git', 'github', 'release-management'],\n riskLevel: 'low'\n },\n\n 'specialist-docs-v1': {\n id: 'specialist-docs',\n version: '1.0.0',\n role: 'Documentation Specialist (Tier 3)',\n basePrompt: `You are a documentation specialist.\n\nWrite clear, accurate technical docs:\n- setup and usage\n- architecture decisions\n- operational runbooks\n- change logs and migration notes`,\n allowedOverlays: ['task', 'context', 'constraints'],\n capabilities: ['documentation', 'technical-writing', 'onboarding'],\n riskLevel: 'low'\n }\n};\n\n/**\n * Prompt Composer - Safely composes prompts from templates + overlays\n */\nexport class PromptComposer {\n private traceLog: ComposedPrompt[] = [];\n\n /**\n * Get a template by ID (for extracting system prompts)\n */\n getTemplate(templateId: string): PromptTemplate | undefined {\n return PROMPT_TEMPLATES[templateId];\n }\n\n /**\n * Compose a prompt from template + controlled overlays\n */\n compose(\n templateId: string,\n overlays: PromptOverlay[],\n traceId: string\n ): ComposedPrompt {\n const template = PROMPT_TEMPLATES[templateId];\n if (!template) {\n throw new Error(`Unknown prompt template: ${templateId}`);\n }\n\n // Validate overlays are allowed\n for (const overlay of overlays) {\n if (!template.allowedOverlays.includes(overlay.type)) {\n throw new Error(\n `Overlay type \"${overlay.type}\" not allowed for template \"${templateId}\"`\n );\n }\n }\n\n // Sort overlays by priority\n const sortedOverlays = [...overlays].sort((a, b) => a.priority - b.priority);\n\n // Compose final prompt\n let finalPrompt = template.basePrompt;\n for (const overlay of sortedOverlays) {\n finalPrompt += `\\n\\n[${overlay.type.toUpperCase()}]\\n${overlay.content}`;\n }\n\n const composed: ComposedPrompt = {\n templateId: template.id,\n templateVersion: template.version,\n finalPrompt,\n overlays: sortedOverlays,\n composedAt: new Date().toISOString(),\n traceId\n };\n\n this.traceLog.push(composed);\n return composed;\n }\n\n /**\n * Get trace history for debugging\n */\n getTrace(traceId?: string): ComposedPrompt[] {\n if (traceId) {\n return this.traceLog.filter(c => c.traceId === traceId);\n }\n return this.traceLog;\n }\n\n /**\n * Clear trace history\n */\n clearTrace() {\n this.traceLog = [];\n }\n}\n\n/**\n * Capability Matrix - Define what each persona can do\n */\nexport const CAPABILITY_MATRIX: Record<string, string[]> = {\n 'router': ['routing', 'classification'],\n 'executor-code': ['code-generation', 'refactoring', 'documentation', 'debugging', 'file-write', 'scaffolding', 'bootstrap'],\n 'executor-chat': ['conversation', 'explanation', 'guidance'],\n 'decomposer': ['decomposition', 'planning', 'dependency-analysis'],\n 'policy-validator': ['validation', 'risk-assessment', 'policy-enforcement'],\n 'specialist-qa': ['testing', 'auditing', 'validation', 'security-review', 'file-read', 'contract-testing', 'definition-of-done', 'benchmarking'],\n 'specialist-pm': ['planning', 'roadmapping', 'coordination', 'documentation', 'file-write', 'scaffold-planning'],\n 'specialist-security': ['security-review', 'risk-assessment', 'policy-enforcement'],\n 'specialist-frontend': ['frontend', 'ui', 'ux', 'accessibility', 'component-design'],\n 'specialist-backend': ['backend', 'api-design', 'data-modeling', 'integration'],\n 'specialist-research': ['research', 'analysis', 'synthesis'],\n 'specialist-ml': ['ml', 'evaluation', 'pipeline-design', 'model-selection'],\n 'specialist-github': ['git', 'github', 'release-management'],\n 'specialist-docs': ['documentation', 'technical-writing', 'onboarding']\n};\n\n// Standalone persona coverage aligned with CrewSwarm's broader 20-role roster.\nexport const PERSONA_PROFILES: Record<string, PersonaProfile> = {\n 'crew-coder': {\n id: 'crew-coder',\n role: 'Full Stack Coder',\n templateId: 'executor-code-v1',\n capabilities: ['code-generation', 'refactoring', 'debugging'],\n riskLevel: 'medium'\n },\n 'crew-coder-front': {\n id: 'crew-coder-front',\n role: 'Frontend Engineer',\n templateId: 'specialist-frontend-v1',\n capabilities: ['frontend', 'ui', 'component-design'],\n riskLevel: 'medium'\n },\n 'crew-coder-back': {\n id: 'crew-coder-back',\n role: 'Backend Engineer',\n templateId: 'specialist-backend-v1',\n capabilities: ['backend', 'api-design', 'integration'],\n riskLevel: 'medium'\n },\n 'crew-frontend': {\n id: 'crew-frontend',\n role: 'UI/UX Specialist',\n templateId: 'specialist-frontend-v1',\n capabilities: ['ui', 'ux', 'accessibility'],\n riskLevel: 'medium'\n },\n 'crew-qa': {\n id: 'crew-qa',\n role: 'Quality Assurance',\n templateId: 'specialist-qa-v1',\n capabilities: ['testing', 'auditing', 'validation'],\n riskLevel: 'medium'\n },\n 'crew-fixer': {\n id: 'crew-fixer',\n role: 'Bug Fixer',\n templateId: 'executor-code-v1',\n capabilities: ['debugging', 'refactoring', 'code-generation'],\n riskLevel: 'medium'\n },\n 'crew-security': {\n id: 'crew-security',\n role: 'Security Auditor',\n templateId: 'specialist-security-v1',\n capabilities: ['security-review', 'risk-assessment'],\n riskLevel: 'high'\n },\n 'crew-pm': {\n id: 'crew-pm',\n role: 'Product Manager',\n templateId: 'specialist-pm-v1',\n capabilities: ['planning', 'roadmapping', 'coordination'],\n riskLevel: 'low'\n },\n 'crew-main': {\n id: 'crew-main',\n role: 'Coordinator',\n templateId: 'executor-chat-v1',\n capabilities: ['conversation', 'synthesis'],\n riskLevel: 'low'\n },\n 'crew-orchestrator': {\n id: 'crew-orchestrator',\n role: 'Orchestrator',\n templateId: 'executor-chat-v1',\n capabilities: ['coordination', 'planning'],\n riskLevel: 'low'\n },\n orchestrator: {\n id: 'orchestrator',\n role: 'Orchestrator Alias',\n templateId: 'executor-chat-v1',\n capabilities: ['coordination', 'planning'],\n riskLevel: 'low'\n },\n 'crew-architect': {\n id: 'crew-architect',\n role: 'Architecture Specialist',\n templateId: 'specialist-backend-v1',\n capabilities: ['api-design', 'system-design', 'integration'],\n riskLevel: 'medium'\n },\n 'crew-researcher': {\n id: 'crew-researcher',\n role: 'Research Specialist',\n templateId: 'specialist-research-v1',\n capabilities: ['research', 'analysis', 'synthesis'],\n riskLevel: 'low'\n },\n 'crew-copywriter': {\n id: 'crew-copywriter',\n role: 'Content Specialist',\n templateId: 'specialist-docs-v1',\n capabilities: ['documentation', 'technical-writing'],\n riskLevel: 'low'\n },\n 'crew-seo': {\n id: 'crew-seo',\n role: 'SEO Specialist',\n templateId: 'specialist-research-v1',\n capabilities: ['research', 'analysis', 'content-strategy'],\n riskLevel: 'low'\n },\n 'crew-ml': {\n id: 'crew-ml',\n role: 'ML Specialist',\n templateId: 'specialist-ml-v1',\n capabilities: ['ml', 'evaluation', 'pipeline-design'],\n riskLevel: 'medium'\n },\n 'crew-github': {\n id: 'crew-github',\n role: 'GitHub Specialist',\n templateId: 'specialist-github-v1',\n capabilities: ['git', 'github', 'release-management'],\n riskLevel: 'low'\n },\n 'crew-mega': {\n id: 'crew-mega',\n role: 'Heavy Generalist',\n templateId: 'executor-code-v1',\n capabilities: ['code-generation', 'planning', 'debugging'],\n riskLevel: 'medium'\n },\n 'crew-telegram': {\n id: 'crew-telegram',\n role: 'Telegram Channel Agent',\n templateId: 'executor-chat-v1',\n capabilities: ['conversation', 'integration'],\n riskLevel: 'low'\n },\n 'crew-whatsapp': {\n id: 'crew-whatsapp',\n role: 'WhatsApp Channel Agent',\n templateId: 'executor-chat-v1',\n capabilities: ['conversation', 'integration'],\n riskLevel: 'low'\n }\n};\n\n/**\n * Check if a persona has a required capability\n */\nexport function hasCapability(templateId: string, capability: string): boolean {\n const normalized = String(templateId || '').replace(/-v\\d+$/, '');\n const capabilities = CAPABILITY_MATRIX[templateId] || CAPABILITY_MATRIX[normalized] || [];\n return capabilities.includes(capability);\n}\n\n/**\n * Get risk level for a template\n */\nexport function getRiskLevel(templateId: string): 'low' | 'medium' | 'high' | 'unknown' {\n const template = PROMPT_TEMPLATES[templateId];\n return template?.riskLevel || 'unknown';\n}\n\nexport function getTemplateForPersona(persona: string): string {\n const key = String(persona || '').trim();\n const profile = PERSONA_PROFILES[key];\n if (profile?.templateId) return profile.templateId;\n\n if (key === 'specialist-qa') return 'specialist-qa-v1';\n if (key === 'specialist-pm') return 'specialist-pm-v1';\n if (key === 'specialist-security') return 'specialist-security-v1';\n if (key.startsWith('specialist-')) return 'executor-chat-v1';\n return 'executor-code-v1';\n}\n", "export interface JsonParseOptions {\n label?: string;\n schemaHint?: string;\n maxAttempts?: number;\n validate?: (parsed: any) => { ok: boolean; errors?: string[] };\n onAttempt?: (meta: {\n label: string;\n attempt: number;\n success: boolean;\n repaired: boolean;\n error?: string;\n }) => void | Promise<void>;\n repair?: (prompt: string) => Promise<string>;\n}\n\nexport function extractJsonCandidate(raw: string): string {\n const text = String(raw || '');\n const fenced = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n const candidate = fenced?.[1] || text;\n const start = candidate.indexOf('{');\n const end = candidate.lastIndexOf('}');\n if (start < 0 || end < 0 || end <= start) {\n throw new Error('Expected JSON object in model response');\n }\n return candidate.slice(start, end + 1);\n}\n\nexport function sanitizeBrokenJson(jsonText: string): string {\n const src = String(jsonText || '');\n let out = '';\n let inString = false;\n let escaped = false;\n for (let i = 0; i < src.length; i += 1) {\n const ch = src[i];\n if (escaped) {\n out += ch;\n escaped = false;\n continue;\n }\n if (ch === '\\\\') {\n out += ch;\n escaped = true;\n continue;\n }\n if (ch === '\"') {\n out += ch;\n inString = !inString;\n continue;\n }\n if (inString) {\n if (ch === '\\n') { out += '\\\\n'; continue; }\n if (ch === '\\r') { out += '\\\\r'; continue; }\n if (ch === '\\t') { out += '\\\\t'; continue; }\n const code = ch.charCodeAt(0);\n if (code >= 0 && code < 0x20) {\n out += `\\\\u${code.toString(16).padStart(4, '0')}`;\n continue;\n }\n }\n out += ch;\n }\n\n // Repair common commas/termination issues.\n let fixed = out.replace(/,\\s*([}\\]])/g, '$1').replace(/,+/g, ',');\n const openBraces = (fixed.match(/\\{/g) || []).length;\n const closeBraces = (fixed.match(/\\}/g) || []).length;\n if (openBraces > closeBraces) fixed += '}'.repeat(openBraces - closeBraces);\n const openBrackets = (fixed.match(/\\[/g) || []).length;\n const closeBrackets = (fixed.match(/\\]/g) || []).length;\n if (openBrackets > closeBrackets) fixed += ']'.repeat(openBrackets - closeBrackets);\n return fixed;\n}\n\nexport function parseJsonObject(raw: string): any {\n const candidate = extractJsonCandidate(raw);\n try {\n return JSON.parse(candidate);\n } catch {\n return JSON.parse(sanitizeBrokenJson(candidate));\n }\n}\n\nfunction buildRepairPrompt(raw: string, schemaHint?: string): string {\n return [\n 'Convert the following content to STRICT valid JSON.',\n 'Return exactly one JSON object. No markdown. No commentary.',\n schemaHint ? `Schema hint:\\n${schemaHint}` : '',\n '',\n '[RAW OUTPUT]',\n String(raw || '').slice(0, 16000)\n ].join('\\n');\n}\n\nexport async function parseJsonObjectWithRepair(raw: string, options: JsonParseOptions = {}): Promise<any> {\n const label = options.label || 'JSON';\n const maxAttempts = Math.max(1, Number(options.maxAttempts || 2));\n let lastError = '';\n let candidateRaw = String(raw || '');\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n const repaired = attempt > 1;\n try {\n const parsed = parseJsonObject(candidateRaw);\n if (options.validate) {\n const verdict = options.validate(parsed);\n if (!verdict.ok) {\n throw new Error((verdict.errors || []).join('; ') || 'schema validation failed');\n }\n }\n await options.onAttempt?.({ label, attempt, success: true, repaired });\n return parsed;\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n console.log(`[JSON Parse Error] ${label} attempt ${attempt}: ${lastError}`);\n console.log(`[JSON Parse Error] Raw response (first 500 chars): ${candidateRaw.substring(0, 500)}`);\n await options.onAttempt?.({ label, attempt, success: false, repaired, error: lastError });\n if (attempt >= maxAttempts || !options.repair) break;\n const repairPrompt = buildRepairPrompt(candidateRaw, options.schemaHint);\n candidateRaw = await options.repair(repairPrompt);\n }\n }\n\n throw new Error(`${label} parse failed after ${maxAttempts} attempt(s): ${lastError}`);\n}\n", "/**\n * Dual-Tier Level 2 Planning System\n * L2A: Decomposer - breaks complex tasks into work graphs\n * L2B: Policy Validator - validates plans for risk/cost/compliance\n */\n\nimport { PromptComposer, PromptOverlay } from './registry.js';\nimport { LocalExecutor } from '../executor/local.js';\nimport { Logger } from '../utils/logger.js';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { resolve, join } from 'node:path';\nimport { parseJsonObjectWithRepair } from '../utils/structured-json.js';\n\nexport interface WorkUnit {\n id: string;\n description: string;\n requiredPersona: string;\n dependencies: string[];\n estimatedComplexity: 'low' | 'medium' | 'high';\n requiredCapabilities: string[];\n sourceRefs?: string[];\n allowedPaths?: string[];\n verification?: string[];\n escalationHints?: string[];\n maxFilesTouched?: number;\n}\n\nexport interface PlanningArtifacts {\n pdd: string;\n roadmap: string;\n architecture: string;\n scaffold: string;\n contractTests: string;\n definitionOfDone: string;\n goldenBenchmarks: string;\n acceptanceCriteria: string[];\n outputDir: string;\n files: {\n pdd: string;\n roadmap: string;\n architecture: string;\n scaffold: string;\n contractTests: string;\n definitionOfDone: string;\n goldenBenchmarks: string;\n };\n}\n\nexport interface WorkGraph {\n units: WorkUnit[];\n totalComplexity: number;\n requiredPersonas: string[];\n estimatedCost: number;\n planningArtifacts?: PlanningArtifacts;\n planMode?: 'lightweight' | 'full';\n}\n\nexport interface PolicyValidation {\n approved: boolean;\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n concerns: string[];\n recommendations: string[];\n fallbackStrategy?: string;\n estimatedCost: number;\n}\n\nexport interface DualL2Result {\n workGraph: WorkGraph;\n validation: PolicyValidation;\n traceId: string;\n executionPath: string[];\n artifacts?: PlanningArtifacts;\n}\n\nexport class DualL2Planner {\n private logger = new Logger();\n private composer = new PromptComposer();\n private executor = new LocalExecutor();\n\n private getReasoningModel(): string | undefined {\n const model = String(process.env.CREW_REASONING_MODEL || '').trim();\n return model || undefined;\n }\n \n private getChatModel(): string | undefined {\n // For structured JSON outputs, use fast chat models, not reasoning models\n const chatModel = String(process.env.CREW_CHAT_MODEL || '').trim();\n const reasoningModel = String(process.env.CREW_REASONING_MODEL || '').trim();\n \n // Avoid reasoning-only models for structured JSON\n // deepseek-reasoner, gemini-*-preview, etc.\n if (reasoningModel && \n !reasoningModel.includes('deepseek-reasoner') && \n !reasoningModel.includes('-preview')) {\n return reasoningModel;\n }\n \n return chatModel || undefined;\n }\n\n private getL2AModel(): string | undefined {\n const model = String(process.env.CREW_L2A_MODEL || '').trim();\n if (model) return model;\n return this.getChatModel();\n }\n\n private getL2BModel(): string | undefined {\n const model = String(process.env.CREW_L2B_MODEL || '').trim();\n if (model) return model;\n return this.getChatModel();\n }\n\n private extractAllowedPaths(task: string): string[] {\n const found = new Set<string>();\n const fileNamed = [...task.matchAll(/file named\\s+[\"'`]?([A-Za-z0-9._/-]+\\.[A-Za-z0-9]+)[\"'`]?/gi)];\n for (const match of fileNamed) {\n const path = String(match[1] || '').trim();\n if (path) found.add(path);\n }\n\n const pathLike = [...task.matchAll(/(?:^|[\\s(\"'`])([A-Za-z0-9._/-]+\\.[A-Za-z0-9]+)(?=$|[\\s)\"'`,.:;])/g)];\n for (const match of pathLike) {\n const path = String(match[1] || '').trim();\n if (path && !path.startsWith('ac-')) found.add(path);\n }\n\n return Array.from(found).slice(0, 3);\n }\n\n private isLightweightTask(task: string, context: string = ''): boolean {\n const text = `${task}\\n${context}`.toLowerCase();\n if (text.length > 1200) return false;\n\n const broadSignals = [\n 'roadmap',\n 'architecture',\n 'planning',\n 'phase 1',\n 'phase 2',\n 'phase 3',\n 'entire project',\n 'whole project',\n 'multi-agent',\n 'benchmark suite',\n 'golden benchmark',\n 'definition of done',\n 'contract tests',\n 'scaffold',\n 'deploy',\n 'migration',\n 'refactor the entire',\n 'across the repo'\n ];\n if (broadSignals.some(signal => text.includes(signal))) return false;\n\n const paths = this.extractAllowedPaths(task);\n const narrowIntent = /(create|write|update|modify|edit|add|fix|rename)\\b/.test(text);\n return narrowIntent && paths.length > 0 && paths.length <= 3;\n }\n\n private buildLightweightPlan(task: string, context: string, traceId: string): DualL2Result {\n const allowedPaths = this.extractAllowedPaths(task);\n const artifacts: PlanningArtifacts = {\n pdd: `# PDD\\n\\n## Overview\\n- Execute a small scoped implementation task.\\n\\n## Requirements\\n- ${task}`,\n roadmap: `# ROADMAP\\n\\n## Phase 1\\n- Complete the requested small file-scoped task.`,\n architecture: `# ARCH\\n\\n## Scope\\n- Lightweight single-step implementation.\\n- Limit edits to explicit task paths.`,\n scaffold: '',\n contractTests: '',\n definitionOfDone: '',\n goldenBenchmarks: '',\n acceptanceCriteria: [\n `Complete task exactly as requested: ${task}`\n ],\n outputDir: '',\n files: {\n pdd: '',\n roadmap: '',\n architecture: '',\n scaffold: '',\n contractTests: '',\n definitionOfDone: '',\n goldenBenchmarks: ''\n }\n };\n\n const workGraph: WorkGraph = {\n units: [\n {\n id: 'lightweight-execute',\n description: task,\n requiredPersona: 'executor-code',\n dependencies: [],\n estimatedComplexity: allowedPaths.length > 1 ? 'medium' : 'low',\n requiredCapabilities: ['code-generation', 'file-write', 'code-reading'],\n sourceRefs: ['PDD.md#overview', 'ROADMAP.md#phase-1', 'ARCH.md#scope'],\n allowedPaths,\n verification: allowedPaths.map(path => `Confirm ${path} exists and matches the requested content/behavior.`),\n escalationHints: [\n 'Escalate if completing the task requires editing files outside the allowed paths.',\n 'Escalate after two failed verification attempts.'\n ],\n maxFilesTouched: Math.max(1, allowedPaths.length)\n }\n ],\n totalComplexity: allowedPaths.length > 1 ? 3 : 1,\n requiredPersonas: ['executor-code'],\n estimatedCost: 0.001,\n planningArtifacts: artifacts,\n planMode: 'lightweight'\n };\n\n return {\n workGraph,\n validation: {\n approved: true,\n riskLevel: 'low',\n concerns: [],\n recommendations: ['Keep edits within explicit allowedPaths.'],\n fallbackStrategy: 'Escalate to full planner if the task expands beyond the scoped files.',\n estimatedCost: 0.001\n },\n traceId,\n executionPath: ['dual-l2-planner', 'l2a-lightweight', 'l2b-lightweight'],\n artifacts\n };\n }\n\n private async parseStructuredJson<T>(raw: string, label: string, schemaHint?: string): Promise<T> {\n // Strip markdown code fences if present\n let cleaned = raw.trim();\n if (cleaned.startsWith('```json')) {\n cleaned = cleaned.replace(/^```json\\n?/, '').replace(/\\n?```$/, '');\n } else if (cleaned.startsWith('```')) {\n cleaned = cleaned.replace(/^```\\n?/, '').replace(/\\n?```$/, '');\n }\n \n // Log parse attempt\n console.log(`[JSON Parse] ${label}: raw=${raw.length} chars, cleaned=${cleaned.length} chars`);\n \n const parsed = await parseJsonObjectWithRepair(cleaned, {\n label,\n schemaHint,\n repair: async (repairPrompt: string) => {\n const repaired = await this.executor.execute(repairPrompt, {\n model: String(process.env.CREW_JSON_REPAIR_MODEL || this.getChatModel() || this.getReasoningModel() || '').trim() || undefined,\n temperature: 0,\n maxTokens: 1500\n });\n return String(repaired.result || '');\n }\n });\n \n console.log(`[JSON Parse] ${label}: \u2713 success`);\n return parsed as T;\n }\n\n /**\n * Run dual-tier Level 2 planning\n * L2A: Decompose task into work graph\n * L2B: Validate work graph against policy\n */\n async plan(\n task: string,\n context: string = '',\n traceId: string\n ): Promise<DualL2Result> {\n const executionPath: string[] = ['dual-l2-planner'];\n\n try {\n if (this.isLightweightTask(task, context)) {\n executionPath.push('l2a-lightweight');\n return this.buildLightweightPlan(task, context, traceId);\n }\n\n // L2A-PHASE-0: Generate planning artifacts (PDD, ROADMAP, ARCH)\n executionPath.push('l2a-planning-artifacts');\n const planningArtifacts = await this.generatePlanningArtifacts(task, context, traceId);\n\n // L2A-PHASE-1: Decomposer - break down the task with artifacts\n executionPath.push('l2a-decomposer');\n const rawGraph = await this.decompose(task, context, traceId, planningArtifacts);\n const workGraph = this.enforceMandatoryExecutionGraph(rawGraph);\n\n // L2B: Policy Validator - validate the plan\n executionPath.push('l2b-policy-validator');\n const validation = await this.validate(workGraph, task, traceId);\n\n return {\n workGraph,\n validation,\n traceId,\n executionPath,\n artifacts: planningArtifacts\n };\n } catch (err) {\n this.logger.error(`Dual-L2 planning failed: ${(err as Error).message}`);\n throw err;\n }\n }\n\n /**\n * L2A-PHASE-0: Generate planning artifacts before decomposition\n /**\n * Generate planning artifacts in 3 passes to avoid JSON truncation\n * Pass 1: Core docs (PDD, ROADMAP, ARCH) + acceptance criteria\n * Pass 2: Implementation docs (SCAFFOLD, CONTRACT-TESTS)\n * Pass 3: Quality gates (DOD, GOLDEN-BENCHMARKS)\n */\n private async generatePlanningArtifacts(\n task: string,\n context: string,\n traceId: string\n ): Promise<PlanningArtifacts> {\n console.log('[L2A Planning] Multi-pass artifact generation...');\n \n // Pass 1: Core planning artifacts\n console.log('[L2A Planning] Pass 1/3: Core docs (PDD + ROADMAP + ARCH)...');\n const coreResult = await this.generateCoreArtifacts(task, context, traceId);\n \n // Pass 2: Implementation artifacts (use core context)\n console.log('[L2A Planning] Pass 2/3: Implementation docs (SCAFFOLD + CONTRACT-TESTS)...');\n const implResult = await this.generateImplArtifacts(task, coreResult, traceId);\n \n // Pass 3: Quality gate artifacts (use core + impl context)\n console.log('[L2A Planning] Pass 3/3: Quality gates (DOD + GOLDEN-BENCHMARKS)...');\n const gateResult = await this.generateGateArtifacts(task, coreResult, traceId);\n \n // Write all artifacts to disk\n const baseDir = process.env.CREW_PIPELINE_ARTIFACT_DIR\n ? resolve(process.env.CREW_PIPELINE_ARTIFACT_DIR)\n : resolve(process.cwd(), '.crew', 'pipeline-artifacts', traceId);\n await mkdir(baseDir, { recursive: true });\n \n const files = {\n pdd: join(baseDir, 'PDD.md'),\n roadmap: join(baseDir, 'ROADMAP.md'),\n architecture: join(baseDir, 'ARCH.md'),\n scaffold: join(baseDir, 'SCAFFOLD.md'),\n contractTests: join(baseDir, 'CONTRACT-TESTS.md'),\n definitionOfDone: join(baseDir, 'DOD.md'),\n goldenBenchmarks: join(baseDir, 'GOLDEN-BENCHMARKS.md')\n };\n \n await Promise.all([\n writeFile(files.pdd, coreResult.pdd, 'utf8'),\n writeFile(files.roadmap, coreResult.roadmap, 'utf8'),\n writeFile(files.architecture, coreResult.architecture, 'utf8'),\n writeFile(files.scaffold, implResult.scaffold, 'utf8'),\n writeFile(files.contractTests, implResult.contractTests, 'utf8'),\n writeFile(files.definitionOfDone, gateResult.definitionOfDone, 'utf8'),\n writeFile(files.goldenBenchmarks, gateResult.goldenBenchmarks, 'utf8')\n ]);\n \n console.log('[L2A Planning] \u2705 All artifacts generated:');\n console.log(` PDD.md: ${coreResult.pdd.length} chars`);\n console.log(` ROADMAP.md: ${coreResult.roadmap.length} chars`);\n console.log(` ARCH.md: ${coreResult.architecture.length} chars`);\n console.log(` SCAFFOLD.md: ${implResult.scaffold.length} chars`);\n console.log(` CONTRACT-TESTS.md: ${implResult.contractTests.length} chars`);\n console.log(` DOD.md: ${gateResult.definitionOfDone.length} chars`);\n console.log(` GOLDEN-BENCHMARKS.md: ${gateResult.goldenBenchmarks.length} chars`);\n console.log(` Dir: ${baseDir}`);\n \n return {\n pdd: coreResult.pdd,\n roadmap: coreResult.roadmap,\n architecture: coreResult.architecture,\n scaffold: implResult.scaffold,\n contractTests: implResult.contractTests,\n definitionOfDone: gateResult.definitionOfDone,\n goldenBenchmarks: gateResult.goldenBenchmarks,\n acceptanceCriteria: coreResult.acceptanceCriteria,\n outputDir: baseDir,\n files\n };\n }\n\n /**\n * Pass 1: Generate core planning artifacts (PDD + ROADMAP + ARCH + acceptance criteria)\n */\n private async generateCoreArtifacts(\n task: string,\n context: string,\n traceId: string\n ): Promise<{ pdd: string; roadmap: string; architecture: string; acceptanceCriteria: string[] }> {\n const overlays: PromptOverlay[] = [\n { type: 'task', content: `Task: ${task}`, priority: 1 }\n ];\n\n if (context) {\n overlays.push({ type: 'context', content: `Context:\\n${context}`, priority: 2 });\n }\n\n overlays.push({\n type: 'constraints',\n content: `Generate THREE core planning artifacts as compact bullet lists:\n\n**1. PDD.md** (Product Design Doc):\n- Overview (1-2 sentences)\n- Requirements (bullet list, max 5 items)\n- Success criteria (bullet list, max 3 items)\n- File structure (bullet list of files to create)\n\n**2. ROADMAP.md**:\n- Phase 1, Phase 2, Phase 3 (bullet list per phase)\n- Dependencies (\u2192 syntax: \"task-2 \u2192 task-5\")\n- Critical path (ordered list of must-complete tasks)\n\n**3. ARCH.md**:\n- Tech stack (bullet list: framework, language, key libs)\n- Module structure (bullet list of modules with 1-line purpose)\n- Patterns (e.g., \"API format: REST JSON\", \"naming: camelCase\")\n- **CRITICAL: Module system** - Inspect test files mentioned in task/context:\n - If you see \\`import { something } from\\` in tests \u2192 write: \"Module system: **ESM** - use \\`export\\` keyword\"\n - If you see \\`const x = require()\\` in tests \u2192 write: \"Module system: **CommonJS** - use \\`module.exports\\`\"\n - Implementation code MUST use the SAME module system as tests\n\nReturn ONLY valid JSON (no markdown, no code fences):\n{\n \"pdd\": \"# PDD\\\\n\\\\n## Overview\\\\n- bullet\\\\n\\\\n## Requirements\\\\n- req1\\\\n- req2\",\n \"roadmap\": \"# ROADMAP\\\\n\\\\n## Phase 1\\\\n- task1\\\\n- task2\",\n \"architecture\": \"# ARCH\\\\n\\\\n## Stack\\\\n- Node 20\\\\n- TypeScript\\\\n- Module system: **ESM** - use export keyword\",\n \"acceptanceCriteria\": [\"ac-1: criteria\", \"ac-2: criteria\"]\n}\n\nCRITICAL: Escape \\\\n for newlines, \\\\\" for quotes. Return JSON only.`,\n priority: 3\n });\n\n const composedPrompt = this.composer.compose('specialist-pm-v1', overlays, `${traceId}-core`);\n const reasoningModel = this.getReasoningModel();\n console.log(`[DualL2] Core artifacts - model: ${reasoningModel || 'undefined (will use executor default)'}`);\n const result = await this.executor.execute(composedPrompt.finalPrompt, {\n model: reasoningModel,\n temperature: 0, // Deterministic for JSON\n maxTokens: 4000,\n jsonMode: true // Structured output where supported\n });\n\n if (!result.success) {\n throw new Error(`Core artifacts generation failed: ${result.result}`);\n }\n\n const parsed = await this.parseStructuredJson<{\n pdd: string;\n roadmap: string;\n architecture: string;\n acceptanceCriteria: string[];\n }>(\n result.result,\n 'Core artifacts (Pass 1)',\n '{\"pdd\":\"...\",\"roadmap\":\"...\",\"architecture\":\"...\",\"acceptanceCriteria\":[\"ac-1\"]}'\n );\n\n return {\n pdd: String(parsed.pdd || `# PDD\\\\n\\\\n## Task\\\\n${task}\\\\n`).trim(),\n roadmap: String(parsed.roadmap || `# ROADMAP\\\\n\\\\n- Implement: ${task}\\\\n`).trim(),\n architecture: String(parsed.architecture || `# ARCH\\\\n\\\\n## System\\\\nDerived from requirements.\\\\n`).trim(),\n acceptanceCriteria: Array.isArray(parsed.acceptanceCriteria)\n ? parsed.acceptanceCriteria.map(v => String(v).trim()).filter(Boolean)\n : []\n };\n }\n\n /**\n * Pass 2: Generate implementation artifacts (SCAFFOLD + CONTRACT-TESTS)\n */\n private async generateImplArtifacts(\n task: string,\n coreContext: { pdd: string; roadmap: string; architecture: string; acceptanceCriteria: string[] },\n traceId: string\n ): Promise<{ scaffold: string; contractTests: string }> {\n const overlays: PromptOverlay[] = [\n { type: 'task', content: `Task: ${task}`, priority: 1 },\n {\n type: 'context',\n content: `**Core Planning Context:**\nPDD Summary: ${coreContext.pdd.slice(0, 300)}...\nROADMAP Summary: ${coreContext.roadmap.slice(0, 200)}...\nARCH Summary: ${coreContext.architecture.slice(0, 200)}...\nAcceptance Criteria: ${coreContext.acceptanceCriteria.slice(0, 3).join('; ')}`,\n priority: 2\n },\n {\n type: 'constraints',\n content: `Generate TWO implementation artifacts as compact bullet lists:\n\n**1. SCAFFOLD.md** (Bootstrap checklist):\n- File tree (bullet list: path + 1-line purpose)\n- Config files needed (package.json, tsconfig.json, etc.)\n- Build smoke command (e.g., \"npm run build\")\n- Test smoke command (e.g., \"npm test\")\n\n**2. CONTRACT-TESTS.md**:\n- Map each acceptance criterion to 1-2 tests\n- Format: \"Test ac-1: Given X, When Y, Then Z\"\n- Include file path where test should live\n\nReturn ONLY valid JSON (no markdown, no code fences):\n{\n \"scaffold\": \"# SCAFFOLD\\\\n\\\\n## Files\\\\n- src/index.ts: entry point\\\\n\\\\n## Build\\\\n- npm run build\",\n \"contractTests\": \"# CONTRACT TESTS\\\\n\\\\n- Test ac-1: Given ..., When ..., Then ...\\\\n File: tests/ac1.test.ts\"\n}\n\nCRITICAL: Escape \\\\n for newlines, \\\\\" for quotes. Return JSON only.`,\n priority: 3\n }\n ];\n\n const composedPrompt = this.composer.compose('specialist-pm-v1', overlays, `${traceId}-impl`);\n const result = await this.executor.execute(composedPrompt.finalPrompt, {\n model: this.getReasoningModel(),\n temperature: 0, // Deterministic for JSON\n maxTokens: 3000,\n jsonMode: true\n });\n\n if (!result.success) {\n throw new Error(`Implementation artifacts generation failed: ${result.result}`);\n }\n\n const parsed = await this.parseStructuredJson<{\n scaffold: string;\n contractTests: string;\n }>(\n result.result,\n 'Implementation artifacts (Pass 2)',\n '{\"scaffold\":\"...\",\"contractTests\":\"...\"}'\n );\n\n return {\n scaffold: String(parsed.scaffold || `# SCAFFOLD\\\\n\\\\n- Initialize project\\\\n- Add scripts\\\\n`).trim(),\n contractTests: String(parsed.contractTests || `# CONTRACT TESTS\\\\n\\\\n- Map acceptance criteria to tests\\\\n`).trim()\n };\n }\n\n /**\n * Pass 3: Generate quality gate artifacts (DOD + GOLDEN-BENCHMARKS)\n */\n private async generateGateArtifacts(\n task: string,\n coreContext: { pdd: string; roadmap: string; acceptanceCriteria: string[] },\n traceId: string\n ): Promise<{ definitionOfDone: string; goldenBenchmarks: string }> {\n const overlays: PromptOverlay[] = [\n { type: 'task', content: `Task: ${task}`, priority: 1 },\n {\n type: 'context',\n content: `**Planning Context:**\nAcceptance Criteria: ${coreContext.acceptanceCriteria.join('; ')}\nPDD Summary: ${coreContext.pdd.slice(0, 200)}...`,\n priority: 2\n },\n {\n type: 'constraints',\n content: `Generate TWO quality gate artifacts as compact checklists:\n\n**1. DOD.md** (Definition of Done):\n- Build checklist (e.g., \"\u2713 npm run build succeeds\")\n- Test checklist (e.g., \"\u2713 all tests pass\", \"\u2713 coverage >80%\")\n- QA checklist (e.g., \"\u2713 no linter errors\")\n- Security checklist (e.g., \"\u2713 no hardcoded secrets\")\n\n**2. GOLDEN-BENCHMARKS.md**:\n- Benchmark suite command (e.g., \"npm run benchmark\")\n- Pass criteria (e.g., \"\u2713 all tasks <500ms\", \"\u2713 cost <$0.10\")\n- When to run (e.g., \"on major refactors\", \"before release\")\n\nReturn ONLY valid JSON (no markdown, no code fences):\n{\n \"definitionOfDone\": \"# DOD\\\\n\\\\n## Build\\\\n- \u2713 npm run build\\\\n\\\\n## Tests\\\\n- \u2713 all pass\",\n \"goldenBenchmarks\": \"# GOLDEN BENCHMARKS\\\\n\\\\n## Command\\\\n- npm run benchmark\\\\n\\\\n## Criteria\\\\n- \u2713 <500ms\"\n}\n\nCRITICAL: Escape \\\\n for newlines, \\\\\" for quotes. Return JSON only.`,\n priority: 3\n }\n ];\n\n const composedPrompt = this.composer.compose('specialist-pm-v1', overlays, `${traceId}-gates`);\n const result = await this.executor.execute(composedPrompt.finalPrompt, {\n model: this.getReasoningModel(),\n temperature: 0, // Deterministic for JSON\n maxTokens: 2000,\n jsonMode: true\n });\n\n if (!result.success) {\n throw new Error(`Quality gate artifacts generation failed: ${result.result}`);\n }\n\n const parsed = await this.parseStructuredJson<{\n definitionOfDone: string;\n goldenBenchmarks: string;\n }>(\n result.result,\n 'Quality gates (Pass 3)',\n '{\"definitionOfDone\":\"...\",\"goldenBenchmarks\":\"...\"}'\n );\n\n return {\n definitionOfDone: String(parsed.definitionOfDone || `# DOD\\\\n\\\\n- Build passes\\\\n- Tests pass\\\\n`).trim(),\n goldenBenchmarks: String(parsed.goldenBenchmarks || `# GOLDEN BENCHMARKS\\\\n\\\\n- Run on major changes\\\\n`).trim()\n };\n }\n\n\n /**\n * L2A: Decompose task into work graph\n */\n private async decompose(\n task: string,\n context: string,\n traceId: string,\n planningArtifacts?: PlanningArtifacts\n ): Promise<WorkGraph> {\n const overlays: PromptOverlay[] = [\n {\n type: 'task',\n content: `User task: ${task}`,\n priority: 1\n }\n ];\n\n if (context) {\n overlays.push({\n type: 'context',\n content: `Context:\\n${context}`,\n priority: 2\n });\n }\n\n // Add planning artifacts to context if available\n if (planningArtifacts) {\n overlays.push({\n type: 'context',\n content: `Planning artifacts for decomposition:\n[PDD.md]\n${planningArtifacts.pdd}\n\n[ROADMAP.md]\n${planningArtifacts.roadmap}\n\n[ARCH.md]\n${planningArtifacts.architecture}\n\n[SCAFFOLD.md]\n${planningArtifacts.scaffold}\n\n[CONTRACT-TESTS.md]\n${planningArtifacts.contractTests}\n\n[DOD.md]\n${planningArtifacts.definitionOfDone}\n\n[GOLDEN-BENCHMARKS.md]\n${planningArtifacts.goldenBenchmarks}`,\n priority: 2\n });\n }\n\n overlays.push({\n type: 'constraints',\n content: `Return ONLY valid JSON with this structure:\n{\n \"units\": [\n {\n \"id\": \"unique-id\",\n \"description\": \"what to do\",\n \"requiredPersona\": \"executor-code\",\n \"dependencies\": [\"id1\", \"id2\"],\n \"estimatedComplexity\": \"low|medium|high\",\n \"requiredCapabilities\": [\"code-generation\", \"file-write\", \"code-reading\"],\n \"sourceRefs\": [\"PDD.md#section\", \"ROADMAP.md#milestone\", \"ARCH.md#decision\", \"CONTRACT-TESTS.md#case\", \"DOD.md#checklist\"],\n \"allowedPaths\": [\"src/auth/jwt.ts\", \"test/auth/jwt.test.ts\"],\n \"verification\": [\"Run npm test -- jwt\", \"Confirm src/auth/jwt.ts was updated\"],\n \"escalationHints\": [\"Escalate if auth logic requires changes outside src/auth\", \"Escalate after two failed verification attempts\"],\n \"maxFilesTouched\": 2\n }\n ],\n \"totalComplexity\": 1-10,\n \"requiredPersonas\": [\"executor-code\"],\n \"estimatedCost\": 0.001\n}\n\nRules:\n- CRITICAL: In standalone crew-cli mode, ALL units MUST use requiredPersona=\"executor-code\" (the local L3 worker). Do NOT use crew-coder, crew-qa, or any remote agent personas.\n- requiredCapabilities can be: [\"code-generation\", \"file-write\", \"code-reading\"] only. NO \"filesystem\" or other non-existent capabilities.\n- Every unit must include at least one sourceRefs entry.\n- sourceRefs must reference one or more of: PDD.md, ROADMAP.md, ARCH.md, CONTRACT-TESTS.md, DOD.md, SCAFFOLD.md, GOLDEN-BENCHMARKS.md.\n- Every unit must include explicit allowedPaths. Use the smallest concrete file list possible.\n- Every unit must include explicit verification steps. Verification must mention exact commands or exact file-state checks.\n- Every unit must include escalationHints. Tell the worker when to stop and escalate.\n- maxFilesTouched must be 1-3 for normal tasks. Only use a higher number if absolutely necessary.\n- Keep each unit tightly scoped to one artifact or one small cluster of files. Do not create broad \"entire project\" tasks.\n- DO NOT wrap in markdown code fences (NO \\`\\`\\`json)\n- Start response with { and end with }\n- Return raw JSON only`,\n priority: 3\n });\n\n const composedPrompt = this.composer.compose('decomposer-v1', overlays, traceId);\n\n const result = await this.executor.execute(composedPrompt.finalPrompt, {\n model: this.getL2AModel(), // Dedicated L2A model when configured\n temperature: 0.3,\n maxTokens: 8000 // Increased for complete work graph JSON (was 4000)\n });\n\n if (!result.success) {\n throw new Error(`Decomposer failed: ${result.result}`);\n }\n\n // Debug: write BEFORE parsing\n const rawOutput = result.result || '';\n if (process.env.DEBUG_JSON_PARSE) {\n const fs = await import('fs');\n fs.writeFileSync('/tmp/gemini-decomposer-response.txt', `Length: ${rawOutput.length}\\n\\n${rawOutput}`);\n console.log('[DualL2] Debug: wrote decomposer response to /tmp/gemini-decomposer-response.txt');\n }\n\n const workGraph = await this.parseStructuredJson<WorkGraph>(\n rawOutput,\n 'Decomposer',\n '{\"units\":[{\"id\":\"unit-1\",\"description\":\"Update src/example.ts\",\"requiredPersona\":\"executor-code\",\"dependencies\":[],\"estimatedComplexity\":\"low\",\"requiredCapabilities\":[\"code-generation\",\"file-write\"],\"sourceRefs\":[\"ROADMAP.md#item\"],\"allowedPaths\":[\"src/example.ts\"],\"verification\":[\"Confirm src/example.ts changed\"],\"escalationHints\":[\"Escalate if another file must be edited\"],\"maxFilesTouched\":1}],\"totalComplexity\":1,\"requiredPersonas\":[\"executor-code\"],\"estimatedCost\":0.01}'\n );\n for (const unit of (workGraph.units || [])) {\n if (!Array.isArray(unit.sourceRefs) || unit.sourceRefs.length === 0) {\n unit.sourceRefs = ['PDD.md#overview', 'ROADMAP.md#milestones', 'ARCH.md#architecture', 'CONTRACT-TESTS.md#cases', 'DOD.md#checklist'];\n }\n if (!Array.isArray(unit.allowedPaths)) {\n unit.allowedPaths = [];\n }\n if (!Array.isArray(unit.verification) || unit.verification.length === 0) {\n unit.verification = ['Report the exact files changed.'];\n }\n if (!Array.isArray(unit.escalationHints) || unit.escalationHints.length === 0) {\n unit.escalationHints = ['Escalate after two failed verification attempts.'];\n }\n if (typeof unit.maxFilesTouched !== 'number' || !Number.isFinite(unit.maxFilesTouched) || unit.maxFilesTouched < 1) {\n unit.maxFilesTouched = unit.allowedPaths.length > 0 ? unit.allowedPaths.length : 1;\n }\n }\n \n // Attach planning artifacts to work graph for L3 workers\n workGraph.planningArtifacts = planningArtifacts;\n \n return workGraph;\n }\n\n /**\n * L2B: Validate work graph against policy\n */\n private async validate(\n workGraph: WorkGraph,\n originalTask: string,\n traceId: string\n ): Promise<PolicyValidation> {\n const overlays: PromptOverlay[] = [\n {\n type: 'safety',\n content: `Original task: ${originalTask}\n\nWork graph to validate:\n${JSON.stringify(workGraph, null, 2)}\n\nAvailable capability matrix (crew-cli standalone mode):\n- executor-code: ALL basic capabilities (code-generation, file-write, code-reading, testing)\n\nValidate for:\n1. Security risks (file access outside project, network calls, shell execution)\n2. Resource costs (estimated tokens, time, API calls)\n3. Persona requirements (ALL units must use requiredPersona=\"executor-code\" in standalone mode)\n4. Fallback strategy (what if a unit fails?)\n\nCRITICAL VALIDATIONS:\n- REJECT if any unit has requiredPersona != \"executor-code\" (remote agents like crew-coder, crew-qa not available in standalone mode)\n- APPROVE all file operations to project directory (expected and safe in standalone mode)\n- APPROVE all requiredCapabilities for executor-code (no capability restrictions for local L3 worker)\n\nReturn ONLY valid JSON:\n{\n \"approved\": true|false,\n \"riskLevel\": \"low|medium|high|critical\",\n \"concerns\": [\"list\", \"of\", \"concerns\"],\n \"recommendations\": [\"list\", \"of\", \"recommendations\"],\n \"fallbackStrategy\": \"what to do if this fails\",\n \"estimatedCost\": 0.001\n}`,\n priority: 1\n },\n {\n type: 'constraints',\n content: `Cost limit: $0.50 per task\nRisk tolerance: medium\nAPPROVE: All executor-code units with any capabilities\nAPPROVE: File writes to project directory\nREJECT: Remote agent personas (crew-coder, crew-qa, etc.) - not available in standalone mode`,\n priority: 2\n }\n ];\n\n const composedPrompt = this.composer.compose('policy-validator-v1', overlays, traceId);\n\n const result = await this.executor.execute(composedPrompt.finalPrompt, {\n model: this.getL2BModel(), // Dedicated L2B model when configured\n temperature: 0.1,\n maxTokens: 1000\n });\n\n if (!result.success) {\n throw new Error(`Policy validator failed: ${result.result}`);\n }\n\n const validation = await this.parseStructuredJson<PolicyValidation>(\n result.result,\n 'Policy validator',\n '{\"approved\":true,\"riskLevel\":\"low\",\"concerns\":[],\"recommendations\":[],\"estimatedCost\":0.01}'\n );\n return validation;\n }\n\n /**\n * Get composed prompts for trace debugging\n */\n getTrace(traceId: string) {\n return this.composer.getTrace(traceId);\n }\n\n private enforceMandatoryExecutionGraph(workGraph: WorkGraph): WorkGraph {\n const units = Array.isArray(workGraph.units) ? [...workGraph.units] : [];\n const byId = new Map(units.map(u => [u.id, u]));\n const gateIds = new Set(['scaffold-bootstrap', 'contract-tests-from-pdd', 'gate-definition-of-done', 'gate-golden-benchmark-suite']);\n\n const addUnit = (unit: WorkUnit) => {\n if (!byId.has(unit.id)) {\n units.push(unit);\n byId.set(unit.id, unit);\n }\n };\n\n addUnit({\n id: 'scaffold-bootstrap',\n description: 'Mandatory scaffold phase: produce project skeleton, starter files, and build/test smoke scaffolding exactly per SCAFFOLD.md.',\n requiredPersona: 'executor-code',\n dependencies: [],\n estimatedComplexity: 'low',\n requiredCapabilities: ['scaffolding', 'code-generation'],\n sourceRefs: ['SCAFFOLD.md#structure', 'ARCH.md#module-structure'],\n allowedPaths: ['.'],\n verification: ['Confirm the scaffold files required by SCAFFOLD.md now exist.'],\n escalationHints: ['Escalate if the scaffold requires changes outside the project workspace.'],\n maxFilesTouched: 3\n });\n\n addUnit({\n id: 'contract-tests-from-pdd',\n description: 'Generate contract tests from PDD acceptance criteria and map each test to acceptance IDs before feature implementation.',\n requiredPersona: 'executor-code',\n dependencies: ['scaffold-bootstrap'],\n estimatedComplexity: 'medium',\n requiredCapabilities: ['code-generation', 'file-write', 'code-reading'],\n sourceRefs: ['PDD.md#success-criteria', 'CONTRACT-TESTS.md#cases'],\n allowedPaths: ['test/', 'tests/', '__tests__/'],\n verification: ['Confirm contract tests were created from CONTRACT-TESTS.md cases.'],\n escalationHints: ['Escalate if the correct test directory cannot be determined.'],\n maxFilesTouched: 3\n });\n\n for (const unit of units) {\n if (gateIds.has(unit.id)) continue;\n const deps = new Set(Array.isArray(unit.dependencies) ? unit.dependencies : []);\n deps.add('scaffold-bootstrap');\n deps.add('contract-tests-from-pdd');\n unit.dependencies = Array.from(deps).filter(dep => dep !== unit.id);\n }\n\n const implUnitIds = units\n .filter(u => !gateIds.has(u.id))\n .map(u => u.id);\n\n addUnit({\n id: 'gate-definition-of-done',\n description: 'Definition of done gate: verify completion criteria from DOD.md are met and return explicit pass/fail with failed checks.',\n requiredPersona: 'executor-code',\n dependencies: implUnitIds,\n estimatedComplexity: 'low',\n requiredCapabilities: ['code-reading'],\n sourceRefs: ['DOD.md#checklist', 'PDD.md#success-criteria'],\n allowedPaths: ['.'],\n verification: ['Return explicit pass/fail against DOD.md and list failed checks if any.'],\n escalationHints: ['Escalate if the definition-of-done checks require missing artifacts.'],\n maxFilesTouched: 1\n });\n\n addUnit({\n id: 'gate-golden-benchmark-suite',\n description: 'Run golden benchmark suite for major changes using GOLDEN-BENCHMARKS.md and report command outputs, timing, and pass/fail.',\n requiredPersona: 'executor-code',\n dependencies: ['gate-definition-of-done'],\n estimatedComplexity: 'medium',\n requiredCapabilities: ['code-reading'],\n sourceRefs: ['GOLDEN-BENCHMARKS.md#suite', 'ROADMAP.md#critical-path'],\n allowedPaths: ['.'],\n verification: ['Report the benchmark command, timing, and pass/fail outcome.'],\n escalationHints: ['Escalate if the benchmark command is missing or ambiguous.'],\n maxFilesTouched: 1\n });\n\n for (const unit of units) {\n unit.dependencies = Array.from(new Set(unit.dependencies || [])).filter(dep => dep !== unit.id);\n }\n\n return {\n ...workGraph,\n units,\n requiredPersonas: Array.from(new Set(units.map(u => u.requiredPersona))),\n estimatedCost: Math.max(Number(workGraph.estimatedCost || 0), 0) + 0.002\n };\n }\n}\n", "import { randomUUID } from 'node:crypto';\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, readdirSync, statSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { PlanningArtifacts } from '../prompts/dual-l2.js';\n\ninterface ContextChunk {\n id: string;\n source: 'PDD.md' | 'ROADMAP.md' | 'ARCH.md' | 'SCAFFOLD.md' | 'CONTRACT-TESTS.md' | 'DOD.md' | 'GOLDEN-BENCHMARKS.md';\n ordinal: number;\n text: string;\n terms: string[];\n}\n\ninterface ContextPack {\n id: string;\n traceId: string;\n createdAt: string;\n chunks: ContextChunk[];\n}\n\nexport class ContextPackManager {\n private packs = new Map<string, ContextPack>();\n private cacheDir = resolve(process.cwd(), '.crew', 'context-packs');\n private ttlHours = this.resolveTtlHours();\n\n createPack(traceId: string, artifacts: PlanningArtifacts): string {\n this.ensureCacheDir();\n this.compactCache();\n const key = this.computePackKey(artifacts);\n const id = `pack-${key.slice(0, 12)}`;\n const path = join(this.cacheDir, `${key}.json`);\n const nowIso = new Date().toISOString();\n\n if (existsSync(path)) {\n try {\n const parsed = JSON.parse(readFileSync(path, 'utf8'));\n const chunks = Array.isArray(parsed?.chunks) ? parsed.chunks : [];\n const cached: ContextPack = {\n id,\n traceId,\n createdAt: String(parsed?.createdAt || nowIso),\n chunks\n };\n this.packs.set(id, cached);\n return id;\n } catch {\n // Rebuild cache on parse failure.\n }\n }\n\n const chunks: ContextChunk[] = [\n ...this.chunkDoc('PDD.md', artifacts.pdd),\n ...this.chunkDoc('ROADMAP.md', artifacts.roadmap),\n ...this.chunkDoc('ARCH.md', artifacts.architecture),\n ...this.chunkDoc('SCAFFOLD.md', artifacts.scaffold),\n ...this.chunkDoc('CONTRACT-TESTS.md', artifacts.contractTests),\n ...this.chunkDoc('DOD.md', artifacts.definitionOfDone),\n ...this.chunkDoc('GOLDEN-BENCHMARKS.md', artifacts.goldenBenchmarks)\n ];\n const pack: ContextPack = {\n id,\n traceId,\n createdAt: nowIso,\n chunks\n };\n this.packs.set(id, pack);\n writeFileSync(path, JSON.stringify({ createdAt: nowIso, chunks }, null, 2), 'utf8');\n return id;\n }\n\n retrieve(packId: string, options: {\n query: string;\n sourceRefs?: string[];\n budgetChars?: number;\n maxChunks?: number;\n }): string {\n const pack = this.packs.get(packId);\n if (!pack) return '';\n\n const queryTerms = this.extractTerms(options.query || '');\n const refSources = new Set(\n (options.sourceRefs || [])\n .map(ref => String(ref || '').trim())\n .filter(Boolean)\n .map(ref => {\n const file = ref.split('#')[0] || '';\n if (file.endsWith('PDD.md')) return 'PDD.md';\n if (file.endsWith('ROADMAP.md')) return 'ROADMAP.md';\n if (file.endsWith('ARCH.md')) return 'ARCH.md';\n if (file.endsWith('SCAFFOLD.md')) return 'SCAFFOLD.md';\n if (file.endsWith('CONTRACT-TESTS.md')) return 'CONTRACT-TESTS.md';\n if (file.endsWith('DOD.md')) return 'DOD.md';\n if (file.endsWith('GOLDEN-BENCHMARKS.md')) return 'GOLDEN-BENCHMARKS.md';\n return '';\n })\n .filter(Boolean)\n );\n\n const scored = pack.chunks.map(chunk => {\n let score = 0;\n if (refSources.has(chunk.source)) score += 100;\n for (const term of queryTerms) {\n if (chunk.terms.includes(term)) score += 3;\n }\n return { chunk, score };\n });\n\n scored.sort((a, b) => b.score - a.score || a.chunk.ordinal - b.chunk.ordinal);\n\n const maxChunks = Math.max(1, Number(options.maxChunks || 6));\n const budget = Math.max(1200, Number(options.budgetChars || 6000));\n const selected: ContextChunk[] = [];\n let used = 0;\n\n for (const item of scored) {\n if (selected.length >= maxChunks) break;\n const block = `[${item.chunk.source}#${item.chunk.ordinal}]\\n${item.chunk.text}\\n`;\n if (used + block.length > budget) continue;\n selected.push(item.chunk);\n used += block.length;\n }\n\n return selected\n .map(c => `[${c.source}#${c.ordinal}]\\n${c.text}`)\n .join('\\n\\n');\n }\n\n getPackStats(packId: string): { chunks: number } {\n const pack = this.packs.get(packId);\n return { chunks: pack?.chunks.length || 0 };\n }\n\n private resolveTtlHours(): number {\n const raw = Number(process.env.CREW_CONTEXT_PACK_TTL_HOURS || 24);\n if (!Number.isFinite(raw) || raw < 1) return 24;\n return Math.min(24 * 14, Math.floor(raw));\n }\n\n private ensureCacheDir() {\n if (!existsSync(this.cacheDir)) {\n mkdirSync(this.cacheDir, { recursive: true });\n }\n }\n\n private computePackKey(artifacts: PlanningArtifacts): string {\n const body = [\n artifacts.pdd,\n artifacts.roadmap,\n artifacts.architecture,\n artifacts.scaffold,\n artifacts.contractTests,\n artifacts.definitionOfDone,\n artifacts.goldenBenchmarks\n ].join('\\n---\\n');\n return createHash('sha256').update(body).digest('hex');\n }\n\n private compactCache() {\n if (!existsSync(this.cacheDir)) return;\n const now = Date.now();\n const ttlMs = this.ttlHours * 60 * 60 * 1000;\n for (const entry of readdirSync(this.cacheDir)) {\n const full = join(this.cacheDir, entry);\n try {\n const stat = statSync(full);\n if ((now - stat.mtimeMs) > ttlMs) {\n unlinkSync(full);\n }\n } catch {\n // Best effort cleanup.\n }\n }\n }\n\n private chunkDoc(source: ContextChunk['source'], text: string): ContextChunk[] {\n const raw = String(text || '').trim();\n if (!raw) return [];\n const normalized = raw.replace(/\\r\\n/g, '\\n');\n const chunkSize = 2200;\n const overlap = 200;\n const out: ContextChunk[] = [];\n let start = 0;\n let ordinal = 1;\n while (start < normalized.length) {\n const end = Math.min(normalized.length, start + chunkSize);\n const slice = normalized.slice(start, end);\n out.push({\n id: `${source}-${ordinal}`,\n source,\n ordinal,\n text: slice,\n terms: this.extractTerms(slice)\n });\n if (end >= normalized.length) break;\n start = Math.max(start + 1, end - overlap);\n ordinal += 1;\n }\n return out;\n }\n\n private extractTerms(input: string): string[] {\n const words = String(input || '')\n .toLowerCase()\n .split(/[^a-z0-9_.#-]+/g)\n .filter(w => w.length >= 3);\n return Array.from(new Set(words)).slice(0, 300);\n }\n}\n", "/**\n * AgentMemory - Cognitive persistence layer for cross-model memory continuity\n * Inspired by AgentKeeper (https://github.com/Thinklanceai/agentkeeper)\n * \n * Extends ContextPackManager with:\n * - Critical fact prioritization\n * - Cross-provider memory persistence\n * - Token budget management\n * - Provider-agnostic context injection\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nexport interface MemoryFact {\n id: string;\n content: string;\n critical: boolean;\n timestamp: string;\n tags: string[];\n provider?: string;\n}\n\nexport interface AgentMemoryState {\n agentId: string;\n facts: MemoryFact[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport class AgentMemory {\n private state: AgentMemoryState;\n private storageDir: string;\n\n constructor(agentId: string, options?: { storageDir?: string }) {\n // Use CREW_MEMORY_DIR for shared cross-system memory, or local dir for CLI-only\n const baseDir = options?.storageDir || \n process.env.CREW_MEMORY_DIR || \n process.cwd();\n this.storageDir = resolve(baseDir, '.crew', 'agent-memory');\n this.ensureStorageDir();\n this.state = this.loadOrCreate(agentId);\n }\n\n /**\n * Store a fact in agent memory\n */\n remember(content: string, options: {\n critical?: boolean;\n tags?: string[];\n provider?: string;\n } = {}): string {\n const fact: MemoryFact = {\n id: randomUUID(),\n content,\n critical: options.critical || false,\n timestamp: new Date().toISOString(),\n tags: options.tags || [],\n provider: options.provider\n };\n\n this.state.facts.push(fact);\n this.state.updatedAt = new Date().toISOString();\n this.persist();\n return fact.id;\n }\n\n /**\n * Remove a fact by ID\n */\n forget(factId: string): boolean {\n const before = this.state.facts.length;\n this.state.facts = this.state.facts.filter(f => f.id !== factId);\n if (this.state.facts.length < before) {\n this.state.updatedAt = new Date().toISOString();\n this.persist();\n return true;\n }\n return false;\n }\n\n /**\n * Recall facts optimized for current context\n * Priority: critical facts first, then most recent\n */\n recall(options: {\n tokenBudget?: number;\n criticalOnly?: boolean;\n tags?: string[];\n provider?: string;\n } = {}): string {\n const budget = options.tokenBudget || 2000;\n const estimatedCharsPerToken = 4; // Conservative estimate\n const charBudget = budget * estimatedCharsPerToken;\n\n // Filter facts\n let facts = this.state.facts;\n \n if (options.criticalOnly) {\n facts = facts.filter(f => f.critical);\n }\n \n if (options.tags && options.tags.length > 0) {\n facts = facts.filter(f => \n options.tags!.some(tag => f.tags.includes(tag))\n );\n }\n\n if (options.provider) {\n facts = facts.filter(f => !f.provider || f.provider === options.provider);\n }\n\n // Sort: critical first, then newest\n facts.sort((a, b) => {\n if (a.critical && !b.critical) return -1;\n if (!a.critical && b.critical) return 1;\n return new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime();\n });\n\n // Pack into budget\n const selected: MemoryFact[] = [];\n let used = 0;\n\n for (const fact of facts) {\n const block = `[${fact.critical ? 'CRITICAL' : 'INFO'}] ${fact.content}\\n`;\n if (used + block.length > charBudget) break;\n selected.push(fact);\n used += block.length;\n }\n\n if (selected.length === 0) return '';\n\n // Format for injection\n const header = '=== AGENT MEMORY (Context from previous decisions) ===\\n';\n const body = selected.map(f => \n `[${f.critical ? 'CRITICAL' : 'INFO'}] ${f.content}`\n ).join('\\n');\n const footer = '\\n=== END AGENT MEMORY ===\\n';\n\n return header + body + footer;\n }\n\n /**\n * Search facts by lexical similarity for brokered retrieval.\n */\n search(query: string, options: {\n maxResults?: number;\n tags?: string[];\n provider?: string;\n } = {}): MemoryFact[] {\n const maxResults = Math.max(1, Number(options.maxResults || 5));\n const qTokens = new Set(\n String(query || '')\n .toLowerCase()\n .replace(/[^a-z0-9\\s_-]/g, ' ')\n .split(/\\s+/)\n .filter(t => t.length > 2)\n );\n\n let facts = this.state.facts.slice();\n if (options.tags && options.tags.length > 0) {\n facts = facts.filter(f => options.tags!.some(tag => f.tags.includes(tag)));\n }\n if (options.provider) {\n facts = facts.filter(f => !f.provider || f.provider === options.provider);\n }\n\n const score = (fact: MemoryFact): number => {\n const toks = new Set(\n String(fact.content || '')\n .toLowerCase()\n .replace(/[^a-z0-9\\s_-]/g, ' ')\n .split(/\\s+/)\n .filter(t => t.length > 2)\n );\n if (qTokens.size === 0 || toks.size === 0) return 0;\n let inter = 0;\n for (const t of qTokens) {\n if (toks.has(t)) inter += 1;\n }\n const sim = inter / Math.max(qTokens.size, toks.size);\n return sim + (fact.critical ? 0.1 : 0);\n };\n\n const ranked = facts\n .map(f => ({ fact: f, score: score(f) }))\n .filter(x => x.score > 0.12)\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults)\n .map(x => x.fact);\n\n return ranked;\n }\n\n /**\n * Get memory statistics\n */\n stats(): {\n totalFacts: number;\n criticalFacts: number;\n providers: string[];\n oldestFact: string | null;\n newestFact: string | null;\n } {\n const facts = this.state.facts || [];\n const timestamps = facts.map(f => f.timestamp).sort();\n const providers = Array.from(new Set(\n facts.map(f => f.provider).filter(Boolean) as string[]\n ));\n\n return {\n totalFacts: facts.length,\n criticalFacts: facts.filter(f => f.critical).length,\n providers,\n oldestFact: timestamps[0] || null,\n newestFact: timestamps[timestamps.length - 1] || null\n };\n }\n\n /**\n * Clear all facts (useful for testing)\n */\n clear(): void {\n this.state.facts = [];\n this.state.updatedAt = new Date().toISOString();\n this.persist();\n }\n\n private loadOrCreate(agentId: string): AgentMemoryState {\n const path = this.getStatePath(agentId);\n \n if (existsSync(path)) {\n try {\n const raw = readFileSync(path, 'utf8');\n return JSON.parse(raw);\n } catch (err) {\n console.warn(`[AgentMemory] Failed to load state for ${agentId}, creating new`);\n }\n }\n\n const now = new Date().toISOString();\n return {\n agentId,\n facts: [],\n createdAt: now,\n updatedAt: now\n };\n }\n\n private persist(): void {\n const path = this.getStatePath(this.state.agentId);\n writeFileSync(path, JSON.stringify(this.state, null, 2), 'utf8');\n }\n\n private getStatePath(agentId: string): string {\n return join(this.storageDir, `${agentId}.json`);\n }\n\n private ensureStorageDir(): void {\n if (!existsSync(this.storageDir)) {\n mkdirSync(this.storageDir, { recursive: true });\n }\n }\n}\n\n/**\n * Global memory instance for pipeline-wide memory\n */\nlet _pipelineMemory: AgentMemory | null = null;\n\nexport function getPipelineMemory(agentId: string = 'pipeline'): AgentMemory {\n if (!_pipelineMemory) {\n _pipelineMemory = new AgentMemory(agentId);\n }\n return _pipelineMemory;\n}\n\n/**\n * Get or create a crew-wide memory instance (shared across CLI and gateway)\n */\nexport function getCrewMemory(crewId: string = 'crew-lead'): AgentMemory {\n // Always create fresh instance to ensure latest state from shared storage\n return new AgentMemory(crewId);\n}\n", "export interface ValidationResult {\n ok: boolean;\n errors: string[];\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return Boolean(v) && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction result(errors: string[]): ValidationResult {\n return { ok: errors.length === 0, errors };\n}\n\nexport function validateRouterDecision(v: any): ValidationResult {\n const errors: string[] = [];\n if (!isObject(v)) return result(['must be object']);\n const decision = String(v.decision || '').trim();\n // Normalize: lowercase, replace underscores with hyphens, strip whitespace\n const lower = decision.toLowerCase().replace(/_/g, '-').replace(/\\s+/g, '-');\n // Accept any string that normalizeDecision() in unified.ts would handle,\n // plus common LLM variations (underscores, extra words, etc.)\n const looksLikeDecision =\n lower.length > 0 &&\n (\n lower.includes('direct') ||\n lower.includes('answer') ||\n lower.includes('chat') ||\n lower.includes('local') ||\n lower.includes('code') ||\n lower.includes('parallel') ||\n lower.includes('dispatch') ||\n lower.includes('simple') ||\n lower.includes('execute') ||\n lower.includes('run') ||\n lower.includes('plan') ||\n lower.includes('build') ||\n lower.includes('implement')\n );\n if (!looksLikeDecision) {\n errors.push('invalid decision');\n }\n if (!String(v.reasoning || '').trim()) errors.push('missing reasoning');\n return result(errors);\n}\n\nexport function validateWorkGraph(v: any): ValidationResult {\n const errors: string[] = [];\n if (!isObject(v)) return result(['must be object']);\n if (!Array.isArray(v.units)) errors.push('units must be array');\n if (!Array.isArray(v.requiredPersonas)) errors.push('requiredPersonas must be array');\n if (typeof v.totalComplexity !== 'number') errors.push('totalComplexity must be number');\n if (typeof v.estimatedCost !== 'number') errors.push('estimatedCost must be number');\n for (const unit of Array.isArray(v.units) ? v.units : []) {\n if (!isObject(unit)) { errors.push('unit must be object'); continue; }\n if (!String(unit.id || '').trim()) errors.push('unit.id missing');\n if (!String(unit.description || '').trim()) errors.push('unit.description missing');\n if (!String(unit.requiredPersona || '').trim()) errors.push('unit.requiredPersona missing');\n if (!Array.isArray(unit.dependencies)) errors.push('unit.dependencies must be array');\n if (!Array.isArray(unit.requiredCapabilities)) errors.push('unit.requiredCapabilities must be array');\n if (!Array.isArray(unit.sourceRefs) || unit.sourceRefs.length === 0) errors.push(`unit.sourceRefs missing for ${String(unit.id || 'unknown')}`);\n if (!Array.isArray(unit.allowedPaths)) errors.push(`unit.allowedPaths must be array for ${String(unit.id || 'unknown')}`);\n if (!Array.isArray(unit.verification) || unit.verification.length === 0) errors.push(`unit.verification missing for ${String(unit.id || 'unknown')}`);\n if (!Array.isArray(unit.escalationHints) || unit.escalationHints.length === 0) errors.push(`unit.escalationHints missing for ${String(unit.id || 'unknown')}`);\n if (typeof unit.maxFilesTouched !== 'number' || !Number.isFinite(unit.maxFilesTouched) || unit.maxFilesTouched < 1) {\n errors.push(`unit.maxFilesTouched invalid for ${String(unit.id || 'unknown')}`);\n }\n }\n return result(errors);\n}\n\nexport function validatePolicyValidation(v: any): ValidationResult {\n const errors: string[] = [];\n if (!isObject(v)) return result(['must be object']);\n if (typeof v.approved !== 'boolean') errors.push('approved must be boolean');\n if (!['low', 'medium', 'high', 'critical'].includes(String(v.riskLevel || ''))) errors.push('invalid riskLevel');\n if (!Array.isArray(v.concerns)) errors.push('concerns must be array');\n if (!Array.isArray(v.recommendations)) errors.push('recommendations must be array');\n if (typeof v.estimatedCost !== 'number') errors.push('estimatedCost must be number');\n return result(errors);\n}\n", "import { appendFile, mkdir } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\n\nexport async function recordJsonParseMetric(entry: {\n label: string;\n attempt: number;\n success: boolean;\n repaired: boolean;\n error?: string;\n traceId?: string;\n}) {\n try {\n const dir = resolve(process.cwd(), '.crew');\n await mkdir(dir, { recursive: true });\n const path = join(dir, 'json-parse-metrics.jsonl');\n await appendFile(path, `${JSON.stringify({ ts: new Date().toISOString(), ...entry })}\\n`, 'utf8');\n } catch {\n // Best-effort observability.\n }\n}\n\n", "export type PipelinePhase =\n | 'init'\n | 'plan'\n | 'execute'\n | 'validate'\n | 'complete'\n | 'failed';\n\nconst ORDER: PipelinePhase[] = ['init', 'plan', 'execute', 'validate', 'complete'];\n\nexport class PipelineRunState {\n private phase: PipelinePhase = 'init';\n private timeline: Array<{ phase: PipelinePhase; ts: string; note?: string }> = [\n { phase: 'init', ts: new Date().toISOString() }\n ];\n\n transition(next: PipelinePhase, note?: string) {\n if (next === 'failed') {\n this.phase = 'failed';\n this.timeline.push({ phase: 'failed', ts: new Date().toISOString(), note });\n return;\n }\n const currentIdx = ORDER.indexOf(this.phase);\n const nextIdx = ORDER.indexOf(next);\n if (currentIdx < 0 || nextIdx < 0 || nextIdx < currentIdx || nextIdx - currentIdx > 1) {\n throw new Error(`Invalid phase transition: ${this.phase} -> ${next}`);\n }\n this.phase = next;\n this.timeline.push({ phase: next, ts: new Date().toISOString(), note });\n }\n\n current() {\n return this.phase;\n }\n\n getTimeline() {\n return [...this.timeline];\n }\n}\n\n", "export interface CapabilityMap {\n canRead: boolean;\n canWrite: boolean;\n canPty: boolean;\n canLsp: boolean;\n canDispatch: boolean;\n canGit: boolean;\n mode: 'standalone' | 'connected';\n}\n\nexport function resolveCapabilityMap(mode: 'standalone' | 'connected'): CapabilityMap {\n const pty = process.env.CREW_DISABLE_PTY === 'true' ? false : true;\n const lsp = process.env.CREW_DISABLE_LSP === 'true' ? false : true;\n return {\n canRead: true,\n canWrite: true,\n canPty: pty,\n canLsp: lsp,\n canDispatch: mode === 'connected',\n canGit: true,\n mode\n };\n}\n\nexport function missingForRequiredCapabilities(required: string[], caps: CapabilityMap): string[] {\n const req = new Set((required || []).map(v => String(v).toLowerCase().trim()).filter(Boolean));\n const missing: string[] = [];\n if (req.has('dispatch') && !caps.canDispatch) missing.push('dispatch');\n if ((req.has('write') || req.has('write-file') || req.has('code-generation')) && !caps.canWrite) missing.push('write');\n if (req.has('pty') && !caps.canPty) missing.push('pty');\n if ((req.has('lsp') || req.has('type-check')) && !caps.canLsp) missing.push('lsp');\n if ((req.has('git') || req.has('github')) && !caps.canGit) missing.push('git');\n return missing;\n}\n\n", "import type { WorkGraph, WorkUnit } from '../prompts/dual-l2.js';\n\nexport interface WorkerTaskEnvelope {\n id: string;\n goal: string;\n persona: string;\n dependencies: string[];\n allowedPaths: string[];\n verification: string[];\n requiredCapabilities: string[];\n sourceRefs?: string[];\n estimatedComplexity?: 'low' | 'medium' | 'high';\n escalationHints?: string[];\n maxFilesTouched?: number;\n}\n\nexport interface WorkerTaskValidation {\n ok: boolean;\n errors: string[];\n warnings: string[];\n}\n\nconst FILE_PATH_RE = /(?:^|[\\s(])((?:\\.{0,2}\\/|\\/)?(?:[\\w.-]+\\/)*[\\w.-]+\\.[A-Za-z0-9]+)\\b/g;\nconst CANONICAL_SOURCE_RE = /^(PDD|ROADMAP|ARCH|CONTRACT-TESTS|DOD|SCAFFOLD|GOLDEN-BENCHMARKS)\\.md#/;\nconst BROAD_SCOPE_RE = /\\b(entire|whole|all files|entire project|whole project|entire codebase|everything)\\b/i;\nconst ACTION_VERB_RE = /\\b(add|build|create|edit|fix|implement|refactor|remove|rename|replace|update|verify|write)\\b/i;\n\nfunction unique<T>(items: T[]): T[] {\n return Array.from(new Set(items));\n}\n\nfunction extractPaths(text: string): string[] {\n const matches: string[] = [];\n let match;\n while ((match = FILE_PATH_RE.exec(text)) !== null) {\n const raw = String(match[1] || '').trim();\n if (!raw) continue;\n matches.push(raw.replace(/[),.;:]+$/, ''));\n }\n return unique(matches);\n}\n\nfunction defaultVerification(unit: WorkUnit, allowedPaths: string[]): string[] {\n const checks: string[] = [];\n if (allowedPaths.length > 0) {\n checks.push(`Confirm the requested changes exist in: ${allowedPaths.join(', ')}`);\n }\n checks.push('Report the exact files changed.');\n if ((unit.requiredCapabilities || []).includes('testing')) {\n checks.push('Run the relevant test or validation command and report the result.');\n }\n return checks;\n}\n\nfunction defaultEscalationHints(unit: WorkUnit, allowedPaths: string[]): string[] {\n const hints: string[] = [];\n if (allowedPaths.length === 0) {\n hints.push('Escalate if the required file paths are ambiguous.');\n }\n if (unit.estimatedComplexity === 'high') {\n hints.push('Escalate if the task expands beyond the stated scope or requires architectural decisions.');\n }\n hints.push('Escalate after two failed attempts on the same verification step.');\n return hints;\n}\n\nexport function createWorkerTaskEnvelope(unit: WorkUnit): WorkerTaskEnvelope {\n const allowedPaths = Array.isArray(unit.allowedPaths) && unit.allowedPaths.length > 0\n ? unique(unit.allowedPaths.map(String))\n : extractPaths(unit.description || '');\n const verification = Array.isArray(unit.verification) && unit.verification.length > 0\n ? unique(unit.verification.map(String))\n : defaultVerification(unit, allowedPaths);\n\n const envelope: WorkerTaskEnvelope = {\n id: unit.id,\n goal: unit.description,\n persona: unit.requiredPersona,\n dependencies: Array.isArray(unit.dependencies) ? unit.dependencies : [],\n allowedPaths,\n verification,\n requiredCapabilities: Array.isArray(unit.requiredCapabilities) ? unit.requiredCapabilities : [],\n };\n\n // Only populate optional advisory fields when there's actual data\n const sourceRefs = Array.isArray(unit.sourceRefs) ? unit.sourceRefs.map(String).filter(Boolean) : [];\n if (sourceRefs.length > 0) {\n envelope.sourceRefs = sourceRefs;\n }\n\n if (unit.estimatedComplexity && ['low', 'medium', 'high'].includes(unit.estimatedComplexity)) {\n envelope.estimatedComplexity = unit.estimatedComplexity;\n }\n\n const escalationHints = Array.isArray(unit.escalationHints) && unit.escalationHints.length > 0\n ? unique(unit.escalationHints.map(String))\n : defaultEscalationHints(unit, allowedPaths);\n if (escalationHints.length > 0) {\n envelope.escalationHints = escalationHints;\n }\n\n if (typeof unit.maxFilesTouched === 'number' && Number.isFinite(unit.maxFilesTouched) && unit.maxFilesTouched > 0) {\n envelope.maxFilesTouched = Math.floor(unit.maxFilesTouched);\n } else if (allowedPaths.length > 0) {\n envelope.maxFilesTouched = allowedPaths.length;\n }\n\n return envelope;\n}\n\nexport function validateWorkerTaskEnvelope(task: WorkerTaskEnvelope): WorkerTaskValidation {\n const errors: string[] = [];\n const warnings: string[] = [];\n if (!String(task.id || '').trim()) errors.push('task.id missing');\n if (!String(task.goal || '').trim()) errors.push('task.goal missing');\n if (!String(task.persona || '').trim()) errors.push('task.persona missing');\n if (!Array.isArray(task.dependencies)) errors.push('task.dependencies must be array');\n if (!Array.isArray(task.allowedPaths)) errors.push('task.allowedPaths must be array');\n if (!Array.isArray(task.verification) || task.verification.length === 0) errors.push('task.verification missing');\n if (!Array.isArray(task.requiredCapabilities)) errors.push('task.requiredCapabilities must be array');\n if (task.sourceRefs !== undefined && !Array.isArray(task.sourceRefs)) errors.push('task.sourceRefs must be array if provided');\n if (task.maxFilesTouched !== undefined && (typeof task.maxFilesTouched !== 'number' || !Number.isFinite(task.maxFilesTouched) || task.maxFilesTouched < 1)) {\n errors.push('task.maxFilesTouched invalid');\n }\n if (task.estimatedComplexity !== undefined && !['low', 'medium', 'high'].includes(String(task.estimatedComplexity || ''))) {\n errors.push('task.estimatedComplexity invalid');\n }\n const goal = String(task.goal || '').trim();\n if (goal.length < 20) errors.push('task.goal too short');\n if (!ACTION_VERB_RE.test(goal)) warnings.push('task.goal may be too vague; no concrete action verb found');\n if (BROAD_SCOPE_RE.test(goal)) {\n // Ad-hoc tasks from raw user input may contain broad language \u2014 warn, don't reject\n if (task.sourceRefs?.includes('adhoc#request') || task.sourceRefs?.includes('request#user-input')) {\n warnings.push('task.goal may be too broad for a single worker');\n } else {\n errors.push('task.goal too broad');\n }\n }\n if (task.estimatedComplexity && task.estimatedComplexity !== 'low' && task.allowedPaths.length === 0) {\n warnings.push('task.allowedPaths empty for non-trivial task');\n }\n if (task.allowedPaths.length > 3) {\n warnings.push('task.allowedPaths spans more than 3 paths; consider decomposing further');\n }\n if (task.maxFilesTouched && task.maxFilesTouched > 3 && task.estimatedComplexity !== 'high') {\n warnings.push('task.maxFilesTouched > 3 for non-high-complexity task');\n }\n if (task.verification.length > 5) {\n warnings.push('task.verification has many checks; consider splitting the task');\n }\n if (Array.isArray(task.sourceRefs) && task.sourceRefs.length > 0) {\n const invalidSourceRefs = task.sourceRefs.filter(ref => !CANONICAL_SOURCE_RE.test(String(ref)));\n if (invalidSourceRefs.length > 0) {\n warnings.push(`task.sourceRefs include non-canonical refs: ${invalidSourceRefs.join(', ')}`);\n }\n }\n return { ok: errors.length === 0, errors, warnings };\n}\n\nexport function buildWorkerTasks(workGraph: WorkGraph): WorkerTaskEnvelope[] {\n return (workGraph.units || []).map(createWorkerTaskEnvelope);\n}\n\nexport function createAdHocWorkerTask(input: {\n id: string;\n goal: string;\n persona?: string;\n sourceRefs?: string[];\n estimatedComplexity?: 'low' | 'medium' | 'high';\n requiredCapabilities?: string[];\n maxFilesTouched?: number;\n}): WorkerTaskEnvelope {\n const goal = String(input.goal || '').trim();\n const allowedPaths = extractPaths(goal);\n const sourceRefs = Array.isArray(input.sourceRefs) && input.sourceRefs.length > 0\n ? input.sourceRefs.map(String)\n : ['adhoc#request'];\n const requiredCapabilities = Array.isArray(input.requiredCapabilities) && input.requiredCapabilities.length > 0\n ? input.requiredCapabilities.map(String)\n : ['code-generation'];\n return {\n id: input.id,\n goal,\n persona: input.persona || 'executor-code',\n dependencies: [],\n allowedPaths,\n verification: [\n ...(allowedPaths.length > 0 ? [`Confirm the requested changes exist in: ${allowedPaths.join(', ')}`] : []),\n 'Report the exact files changed.',\n 'Run relevant verification if code was modified.'\n ],\n requiredCapabilities,\n sourceRefs,\n estimatedComplexity: input.estimatedComplexity || 'medium',\n escalationHints: [\n ...(allowedPaths.length === 0 ? ['Escalate if the file scope is ambiguous.'] : []),\n 'Escalate after two failed attempts on the same verification step.'\n ],\n maxFilesTouched: typeof input.maxFilesTouched === 'number' && Number.isFinite(input.maxFilesTouched) && input.maxFilesTouched > 0\n ? Math.floor(input.maxFilesTouched)\n : Math.max(1, allowedPaths.length || 1)\n };\n}\n", "/**\n * Direct File Command Parser for crew-cli\n * \n * Adds support for @@WRITE_FILE...@@END_FILE syntax similar to\n * OpenCode/Codex/Gemini CLI protocols.\n * \n * Usage:\n * crew chat \"@@WRITE_FILE hello.txt\n * Hello World\n * @@END_FILE\"\n */\n\nexport interface FileCommand {\n type: 'write' | 'mkdir' | 'delete';\n path: string;\n content?: string;\n}\n\n/**\n * Parse @@WRITE_FILE...@@END_FILE blocks from input\n */\nexport function parseDirectFileCommands(input: string): FileCommand[] {\n const commands: FileCommand[] = [];\n \n // Match @@WRITE_FILE path\\ncontent\\n@@END_FILE\n const writeFileRegex = /@@WRITE_FILE\\s+([^\\n]+)\\n([\\s\\S]*?)@@END_FILE/g;\n \n let match;\n while ((match = writeFileRegex.exec(input)) !== null) {\n const path = match[1].trim();\n const content = match[2] || '';\n \n commands.push({\n type: 'write',\n path,\n content\n });\n }\n \n // Match @@MKDIR path\n const mkdirRegex = /@@MKDIR\\s+([^\\n]+)/g;\n while ((match = mkdirRegex.exec(input)) !== null) {\n commands.push({\n type: 'mkdir',\n path: match[1].trim()\n });\n }\n \n return commands;\n}\n\n/**\n * Parse write: syntax (OpenCode/Codex style)\n * Format: write: path/to/file.txt\n * Content follows on next lines until next command or EOF\n */\nexport function parseWriteSyntax(input: string): FileCommand[] {\n const commands: FileCommand[] = [];\n const lines = input.split('\\n');\n \n let i = 0;\n while (i < lines.length) {\n const line = lines[i].trim();\n \n if (line.startsWith('write:')) {\n const path = line.substring(6).trim();\n const contentLines: string[] = [];\n \n i++;\n // Collect content until next command or EOF\n while (i < lines.length) {\n const nextLine = lines[i];\n if (nextLine.trim().match(/^(write:|mkdir:|delete:|@@\\w+)/)) {\n break;\n }\n contentLines.push(nextLine);\n i++;\n }\n \n commands.push({\n type: 'write',\n path,\n content: contentLines.join('\\n')\n });\n } else if (line.startsWith('mkdir:')) {\n commands.push({\n type: 'mkdir',\n path: line.substring(6).trim()\n });\n i++;\n } else {\n i++;\n }\n }\n \n return commands;\n}\n\n/**\n * Remove direct command blocks from input (for LLM processing)\n */\nexport function stripDirectCommands(input: string): string {\n let stripped = input;\n \n // Remove @@WRITE_FILE...@@END_FILE blocks\n stripped = stripped.replace(/@@WRITE_FILE\\s+[^\\n]+\\n[\\s\\S]*?@@END_FILE/g, '');\n \n // Remove @@MKDIR commands\n stripped = stripped.replace(/@@MKDIR\\s+[^\\n]+/g, '');\n \n // Remove write:/mkdir: blocks\n stripped = stripped.replace(/^(write|mkdir):\\s+[^\\n]+(\\n(?!write:|mkdir:|@@)[^\\n]*)*$/gm, '');\n \n return stripped.trim();\n}\n\n/**\n * Check if input contains any direct commands\n */\nexport function hasDirectCommands(input: string): boolean {\n return /@@WRITE_FILE|@@MKDIR|^write:|^mkdir:/m.test(input);\n}\n\n/**\n * Execute direct commands using sandbox\n */\nexport async function executeDirectCommands(\n commands: FileCommand[],\n sandbox: any, // Sandbox instance\n logger?: any\n): Promise<string[]> {\n const appliedFiles: string[] = [];\n \n for (const cmd of commands) {\n try {\n if (cmd.type === 'write') {\n await sandbox.addChange(cmd.path, cmd.content || '');\n appliedFiles.push(cmd.path);\n logger?.info(`Staged: ${cmd.path}`);\n } else if (cmd.type === 'mkdir') {\n // For mkdir, we can create an empty .gitkeep file\n const keepPath = `${cmd.path}/.gitkeep`;\n await sandbox.addChange(keepPath, '');\n appliedFiles.push(keepPath);\n logger?.info(`Created directory: ${cmd.path}`);\n }\n } catch (err) {\n logger?.error(`Failed to stage ${cmd.path}: ${(err as Error).message}`);\n }\n }\n \n return appliedFiles;\n}\n\n/**\n * Example usage in crew chat command:\n * \n * ```typescript\n * const directCommands = [\n * ...parseDirectFileCommands(input),\n * ...parseWriteSyntax(input)\n * ];\n * \n * if (directCommands.length > 0) {\n * const appliedFiles = await executeDirectCommands(\n * directCommands,\n * sandbox,\n * logger\n * );\n * \n * // Strip direct commands from input before LLM call\n * const llmInput = stripDirectCommands(input);\n * \n * if (llmInput) {\n * // Continue with LLM for remaining natural language\n * } else {\n * // Pure direct commands, no LLM needed\n * return { appliedFiles, response: `Staged ${appliedFiles.length} files` };\n * }\n * }\n * ```\n */\n", "/**\n * Unified 3-Tier Pipeline\n * \n * L1: Chat Interface (REPL/CLI) - User interaction only\n * L2: Router + Reasoner + Planner - Unified orchestration layer\n * L3: Parallel Executors - Specialized workers\n */\n\nimport { LocalExecutor } from '../executor/local.js';\nimport { runAgenticWorker } from '../executor/agentic-executor.js';\nimport { DualL2Planner, WorkGraph, PolicyValidation } from '../prompts/dual-l2.js';\nimport { PromptComposer, PromptOverlay, getTemplateForPersona } from '../prompts/registry.js';\nimport { Logger } from '../utils/logger.js';\nimport { randomUUID } from 'crypto';\nimport { ContextPackManager } from './context-pack.js';\nimport { getPipelineMemory } from './agent-memory.js';\nimport { appendFile, mkdir, readFile } from 'node:fs/promises';\nimport { resolve, join, normalize } from 'node:path';\nimport { parseJsonObject, parseJsonObjectWithRepair } from '../utils/structured-json.js';\nimport { validatePolicyValidation, validateRouterDecision, validateWorkGraph } from '../utils/json-schemas.js';\nimport { recordJsonParseMetric } from '../metrics/json-parse.js';\nimport { PipelineRunState } from './run-state.js';\nimport { missingForRequiredCapabilities, resolveCapabilityMap } from '../capabilities/index.js';\nimport { buildWorkerTasks, createAdHocWorkerTask, validateWorkerTaskEnvelope, type WorkerTaskEnvelope } from './task-envelope.js';\n// Structure analyzer temporarily disabled - file missing\n// import { analyzeProjectStructure, formatStructureContext } from '../utils/structure-analyzer.js';\n\nexport interface L1Request {\n userInput: string;\n context?: string;\n sessionId: string;\n resume?: {\n fromPhase?: 'plan' | 'execute' | 'validate';\n priorPlan?: L2Plan;\n priorResponse?: string;\n priorExecutionResults?: L3Result;\n };\n}\n\nexport interface L2Plan {\n decision: 'direct-answer' | 'execute-local' | 'execute-parallel' | 'execute-direct';\n reasoning: string;\n workGraph?: WorkGraph;\n validation?: PolicyValidation;\n directResponse?: string;\n traceId: string;\n}\n\nexport interface L3Result {\n success: boolean;\n results: Array<{\n workUnitId: string;\n persona: string;\n output: string;\n cost: number;\n filesChanged: string[];\n verification: string[];\n verificationPassed: boolean;\n escalationNeeded: boolean;\n escalationReason?: string;\n toolsUsed?: string[];\n failedToolCalls?: number;\n turns?: number;\n stopReason?: string;\n shellResults?: Array<{ command: string; exitCode: number; output: string }>;\n }>;\n totalCost: number;\n executionTimeMs: number;\n metrics?: {\n contextChunksUsed: number;\n contextCharsSaved: number;\n };\n}\n\nexport interface PipelineResult {\n response: string;\n executionPath: string[];\n plan?: L2Plan;\n executionResults?: L3Result;\n totalCost: number;\n traceId: string;\n phase: 'complete' | 'failed';\n timeline: Array<{ phase: string; ts: string; note?: string }>;\n}\n\n/**\n * Unified Pipeline - Single path for all operations\n */\nexport class UnifiedPipeline {\n private logger = new Logger();\n private composer = new PromptComposer();\n private executor = new LocalExecutor();\n private planner = new DualL2Planner();\n private contextPacks = new ContextPackManager();\n private sandbox: any; // Injected Sandbox instance\n private session?: any; // Optional SessionManager for cache tracking\n\n constructor(sandbox?: any, session?: any) {\n this.sandbox = sandbox;\n this.session = session;\n }\n\n private async trackCacheHit(cachedTokens: number, totalTokens: number, model: string) {\n if (!this.session || !cachedTokens || cachedTokens === 0) return;\n \n // Calculate savings based on provider\n let savingsRate = 0;\n if (model.startsWith('claude')) {\n savingsRate = 0.90; // Anthropic: 90% savings on cached tokens\n } else if (model.startsWith('grok')) {\n savingsRate = 0.50; // Grok: 50% savings on cached tokens\n } else if (model.startsWith('deepseek')) {\n savingsRate = 0.50; // DeepSeek: estimated 50% savings\n } else if (model.startsWith('gemini')) {\n savingsRate = 0.50; // Gemini: estimated 50% savings\n }\n \n if (savingsRate === 0) return;\n \n // Calculate USD saved (rough estimate based on model pricing)\n const baseRate = model.startsWith('claude') ? 3.00 : \n model.startsWith('grok') ? 5.00 :\n model.startsWith('gemini') ? 0.075 : 0.27;\n const usdSaved = (cachedTokens * baseRate * savingsRate) / 1_000_000;\n \n await this.session.trackCacheSavings({\n hit: true,\n tokensSaved: cachedTokens,\n usdSaved\n });\n }\n\n private normalizeDecision(raw: string): 'direct-answer' | 'execute-local' | 'execute-parallel' | 'execute-direct' {\n // Normalize: lowercase, underscores\u2192hyphens, collapse whitespace\n const value = String(raw || '').trim().toLowerCase().replace(/_/g, '-').replace(/\\s+/g, '-');\n if (value === 'direct-answer' || value === 'chat' || value === 'answer') return 'direct-answer';\n if (value === 'execute-direct' || value === 'direct-execute' || value === 'simple' || value === 'run' || value === 'execute') return 'execute-direct';\n if (value === 'execute-local' || value === 'code') {\n return process.env.CREW_ALLOW_EXECUTE_LOCAL === 'true'\n ? 'execute-local'\n : 'execute-parallel';\n }\n if (value === 'execute-parallel' || value === 'dispatch' || value === 'plan' || value === 'build' || value === 'implement') return 'execute-parallel';\n // Fallback: if it contains recognizable fragments, route accordingly\n if (value.includes('direct') && value.includes('answer')) return 'direct-answer';\n if (value.includes('direct')) return 'execute-direct';\n if (value.includes('parallel') || value.includes('dispatch')) return 'execute-parallel';\n return 'execute-parallel';\n }\n\n private getReasoningModel(): string | undefined {\n const model = String(process.env.CREW_REASONING_MODEL || process.env.CREW_CHAT_MODEL || '').trim();\n return model || undefined;\n }\n \n private getRouterModel(): string | undefined {\n // Router needs structured JSON, so avoid pure reasoning models\n const routerModel = String(process.env.CREW_ROUTER_MODEL || '').trim();\n if (routerModel) return routerModel;\n \n // If CREW_REASONING_MODEL is a reasoning-only model (deepseek-reasoner, gemini-*-preview),\n // fall back to chat model for structured output\n const reasoningModel = String(process.env.CREW_REASONING_MODEL || '').trim();\n if (reasoningModel && \n !reasoningModel.includes('deepseek-reasoner') && \n !reasoningModel.includes('-preview')) {\n return reasoningModel;\n }\n \n // Default to chat model for structured decisions\n return String(process.env.CREW_CHAT_MODEL || '').trim() || undefined;\n }\n\n private getQaModel(): string | undefined {\n const model = String(process.env.CREW_QA_MODEL || process.env.CREW_REASONING_MODEL || '').trim();\n return model || undefined;\n }\n\n private getJsonRepairModel(): string | undefined {\n const explicit = String(process.env.CREW_JSON_REPAIR_MODEL || '').trim();\n if (explicit) return explicit;\n if (process.env.GROQ_API_KEY) return 'llama-3.3-70b-versatile';\n return this.getRouterModel() || this.getReasoningModel();\n }\n\n private getJsonParseAttempts(): number {\n const n = Number(process.env.CREW_JSON_PARSE_MAX_ATTEMPTS || 2);\n if (!Number.isFinite(n) || n < 1) return 2;\n return Math.min(4, Math.floor(n));\n }\n\n private qaLoopEnabled(): boolean {\n return process.env.CREW_QA_LOOP_ENABLED === 'true';\n }\n\n private scaffoldGateEnabled(): boolean {\n const raw = String(process.env.CREW_SCAFFOLD_GATE_ENABLED || 'true').trim().toLowerCase();\n return raw !== 'false' && raw !== '0' && raw !== 'off';\n }\n\n private definitionOfDoneEnabled(): boolean {\n const raw = String(process.env.CREW_DOD_GATE_ENABLED || 'true').trim().toLowerCase();\n return raw !== 'false' && raw !== '0' && raw !== 'off';\n }\n\n private goldenBenchmarkGateEnabled(): boolean {\n const raw = String(process.env.CREW_GOLDEN_BENCH_GATE_ENABLED || 'true').trim().toLowerCase();\n return raw !== 'false' && raw !== '0' && raw !== 'off';\n }\n\n private qaMaxRounds(): number {\n const value = Number(process.env.CREW_QA_MAX_ROUNDS || 2);\n if (!Number.isFinite(value) || value < 1) return 2;\n return Math.min(5, Math.floor(value));\n }\n\n private getExtraL2ValidatorModels(): string[] {\n const raw = String(process.env.CREW_L2_EXTRA_VALIDATORS || '').trim();\n if (!raw) return [];\n return raw\n .split(',')\n .map(v => v.trim())\n .filter(Boolean);\n }\n\n private getMaxParallelWorkers(): number {\n const raw = Number(process.env.CREW_MAX_PARALLEL_WORKERS || 6);\n if (!Number.isFinite(raw) || raw < 1) return 6;\n return Math.min(32, Math.floor(raw));\n }\n\n private parseWorkerOutput(raw: string): { output: string; summary?: string; edits?: string[]; validation?: string[] } {\n const text = String(raw || '').trim();\n const start = text.indexOf('{');\n const end = text.lastIndexOf('}');\n if (start >= 0 && end > start) {\n try {\n const parsed = JSON.parse(text.slice(start, end + 1));\n const output = String(parsed.output || parsed.result || '').trim();\n if (output) {\n return {\n output,\n summary: typeof parsed.summary === 'string' ? parsed.summary : undefined,\n edits: Array.isArray(parsed.edits) ? parsed.edits.map(String) : undefined,\n validation: Array.isArray(parsed.validation) ? parsed.validation.map(String) : undefined\n };\n }\n } catch {\n // Fall back to raw output.\n }\n }\n return { output: text };\n }\n\n // NOTE: Files are extracted from claimed tool calls in worker history,\n // not from actual filesystem state. A worker could claim a write_file\n // call that the sandbox rejected, or the file could have been\n // overwritten by a later worker. Filesystem verification is not yet\n // implemented.\n private extractFilesChanged(history: Array<{ tool: string; params: Record<string, any>; error?: string }> = []): string[] {\n const changed = new Set<string>();\n for (const turn of history) {\n if (turn?.error) continue;\n if (!['write_file', 'replace'].includes(String(turn.tool || ''))) continue;\n const filePath = String(turn.params?.file_path || '').trim();\n if (filePath) changed.add(filePath);\n }\n return Array.from(changed);\n }\n\n private extractShellResults(\n history: Array<{ tool: string; params: Record<string, any>; result?: any; error?: string }> = []\n ): Array<{ command: string; exitCode: number; output: string }> {\n const results: Array<{ command: string; exitCode: number; output: string }> = [];\n for (const turn of history) {\n const tool = String(turn?.tool || '');\n if (tool !== 'run_shell_command' && tool !== 'check_background_task') continue;\n const command = String(turn.params?.command || turn.params?.task_id || '').trim();\n const rawOutput = String(turn.result?.output || turn.result || '').trim();\n const exitCode = turn?.error ? 1 : (typeof turn.result?.exitCode === 'number' ? turn.result.exitCode : 0);\n results.push({\n command,\n exitCode,\n output: rawOutput.slice(0, 500)\n });\n }\n return results;\n }\n\n private collectVerificationSignals(\n history: Array<{ tool: string; params: Record<string, any>; result?: any; error?: string }> = [],\n parsed: { output: string; validation?: string[] },\n task: WorkerTaskEnvelope\n ): { verification: string[]; verificationPassed: boolean; escalationNeeded: boolean; escalationReason?: string } {\n const verification = new Set<string>(Array.isArray(parsed.validation) ? parsed.validation : []);\n let verificationPassed = false;\n let escalationNeeded = false;\n let escalationReason: string | undefined;\n\n for (const turn of history) {\n const tool = String(turn?.tool || '');\n if (turn?.error) continue;\n if (tool === 'run_shell_command' || tool === 'check_background_task') {\n const command = String(turn.params?.command || turn.params?.task_id || '').trim();\n const output = String(turn.result?.output || turn.result || '').trim();\n verification.add(command ? `Command succeeded: ${command}` : 'Verification command succeeded.');\n if (output) {\n verification.add(`Verification output: ${output.slice(0, 200)}`);\n }\n verificationPassed = true;\n }\n }\n\n // No prose keyword fallback \u2014 verification requires shell evidence\n // (exit code 0 from run_shell_command/check_background_task) or\n // structured validation fields from the worker output.\n if (!verificationPassed && task.verification.length > 0) {\n escalationNeeded = true;\n escalationReason = 'No shell verification command was executed';\n }\n\n return {\n verification: Array.from(verification),\n verificationPassed,\n escalationNeeded,\n escalationReason\n };\n }\n\n private countFailedToolCalls(history: Array<{ tool: string; params: Record<string, any>; error?: string }> = []): number {\n return history.filter(turn => Boolean(turn?.error)).length;\n }\n\n private hasRepeatedFailedAction(history: Array<{ tool: string; params: Record<string, any>; error?: string }> = []): boolean {\n const failures = history\n .filter(turn => Boolean(turn?.error))\n .map(turn => `${String(turn.tool || '')}:${JSON.stringify(turn.params || {})}`);\n if (failures.length < 2) return false;\n const last = failures[failures.length - 1];\n const prev = failures[failures.length - 2];\n return last === prev;\n }\n\n private containsLegacyFileCommands(text: string): boolean {\n const value = String(text || '');\n return value.includes('@@WRITE_FILE')\n || value.includes('@@MKDIR')\n || /(^|\\n)\\s*FILE:\\s+/im.test(value)\n || /(^|\\n)\\s*write:\\s+/im.test(value);\n }\n\n private shouldParseLegacyCommands(result: { output: string; filesChanged?: string[] }): boolean {\n const hasLegacy = (!Array.isArray(result.filesChanged) || result.filesChanged.length === 0)\n && this.containsLegacyFileCommands(result.output);\n if (hasLegacy) {\n this.logger.warn('[DEPRECATED] Legacy file commands detected (@@WRITE_FILE, FILE:, write:). Use structured tool calls instead.');\n }\n return hasLegacy;\n }\n\n private buildStructuredEvidence(executionResults?: L3Result): Array<{\n workUnitId: string;\n persona: string;\n filesChanged: string[];\n shellResults: Array<{ command: string; exitCode: number; output: string }>;\n verificationPassed: boolean;\n verificationEvidence: string;\n workerOutput: string;\n escalationNeeded: boolean;\n escalationReason?: string;\n failedToolCalls?: number;\n turns?: number;\n stopReason?: string;\n }> {\n if (!executionResults || !Array.isArray(executionResults.results) || executionResults.results.length === 0) {\n return [];\n }\n return executionResults.results.map(result => {\n const shellResults = Array.isArray(result.shellResults) ? result.shellResults : [];\n const verificationEvidence = result.verification.length > 0\n ? result.verification.join(' | ')\n : 'No shell verification command was executed';\n return {\n workUnitId: result.workUnitId,\n persona: result.persona,\n filesChanged: result.filesChanged,\n shellResults,\n verificationPassed: result.verificationPassed,\n verificationEvidence,\n workerOutput: result.output,\n escalationNeeded: result.escalationNeeded,\n escalationReason: result.escalationReason,\n failedToolCalls: result.failedToolCalls,\n turns: result.turns,\n stopReason: result.stopReason\n };\n });\n }\n\n private buildExecutionAuditContext(executionResults?: L3Result): string {\n const evidence = this.buildStructuredEvidence(executionResults);\n if (evidence.length === 0) {\n return 'No execution metadata available.';\n }\n return evidence.map(e => {\n const lines = [\n `Unit: ${e.workUnitId}`,\n `Persona: ${e.persona}`,\n `Files changed: ${JSON.stringify(e.filesChanged)}`,\n `Verification passed: ${e.verificationPassed}`,\n `Verification evidence: ${e.verificationEvidence}`,\n `Shell results: ${JSON.stringify(e.shellResults)}`,\n `Escalation needed: ${e.escalationNeeded}`,\n ];\n if (e.escalationReason) lines.push(`Escalation reason: ${e.escalationReason}`);\n if (typeof e.failedToolCalls === 'number') lines.push(`Failed tool calls: ${e.failedToolCalls}`);\n if (typeof e.turns === 'number') lines.push(`Turns: ${e.turns}`);\n if (e.stopReason) lines.push(`Stop reason: ${e.stopReason}`);\n return lines.join('\\n');\n }).join('\\n\\n');\n }\n\n private appendExecutionAuditContext(response: string, executionResults?: L3Result): string {\n if (!executionResults || !Array.isArray(executionResults.results) || executionResults.results.length === 0) {\n return response;\n }\n return `${response}\\n\\nExecution metadata:\\n${this.buildExecutionAuditContext(executionResults)}`;\n }\n\n private extractRequestedPaths(task: string): string[] {\n const found = new Set<string>();\n const fileNamed = [...String(task || '').matchAll(/file named\\s+[\"'`]?([A-Za-z0-9._/-]+\\.[A-Za-z0-9]+)[\"'`]?/gi)];\n for (const match of fileNamed) {\n const filePath = String(match[1] || '').trim();\n if (filePath) found.add(filePath);\n }\n const pathLike = [...String(task || '').matchAll(/(?:^|[\\s(\"'`])([A-Za-z0-9._/-]+\\.[A-Za-z0-9]+)(?=$|[\\s)\"'`,.:;])/g)];\n for (const match of pathLike) {\n const filePath = String(match[1] || '').trim();\n if (filePath && !filePath.startsWith('ac-')) found.add(filePath);\n }\n return Array.from(found).slice(0, 4);\n }\n\n private isSmallScopedTask(request: L1Request, plan: L2Plan): boolean {\n if (plan.workGraph?.planMode === 'lightweight') return true;\n const text = String(request.userInput || '').toLowerCase();\n if (text.length > 1200) return false;\n const paths = this.extractRequestedPaths(text);\n const narrowIntent = /(create|write|update|modify|edit|add|fix|rename)\\b/.test(text);\n const broadSignals = [\n 'roadmap',\n 'architecture',\n 'planning',\n 'entire project',\n 'whole project',\n 'phase 1',\n 'phase 2',\n 'phase 3',\n 'contract tests',\n 'golden benchmark',\n 'definition of done'\n ];\n return narrowIntent && paths.length > 0 && paths.length <= 4 && !broadSignals.some(signal => text.includes(signal));\n }\n\n private async passesDeterministicSmallTaskGate(\n request: L1Request,\n plan: L2Plan,\n executionResults?: L3Result\n ): Promise<boolean> {\n if (!this.isSmallScopedTask(request, plan)) return false;\n\n const scopedPaths = plan.workGraph?.units?.flatMap(unit => Array.isArray(unit.allowedPaths) ? unit.allowedPaths : []).filter(Boolean);\n const paths = scopedPaths && scopedPaths.length > 0 ? scopedPaths : this.extractRequestedPaths(request.userInput);\n if (paths.length === 0) return false;\n\n if (executionResults?.results?.length) {\n const hasBlockingEscalation = executionResults.results.some(result => {\n if (!result.escalationNeeded) return false;\n const reason = String(result.escalationReason || '').toLowerCase();\n return reason.includes('outside allowed scope')\n || reason.includes('touched')\n || reason.includes('too many failed tool calls')\n || reason.includes('repeated the same failing tool action')\n || reason.includes('did not reach a successful completion state')\n || reason.includes('without producing any file changes');\n });\n if (hasBlockingEscalation) return false;\n if (executionResults.results.some(result => result.verificationPassed)) return true;\n }\n\n const contents = new Map();\n for (const relPath of paths) {\n const staged = this.sandbox.getStagedContent(relPath);\n if (typeof staged === 'string') {\n contents.set(relPath, staged);\n continue;\n }\n try {\n const content = await readFile(resolve(process.cwd(), relPath), 'utf8');\n contents.set(relPath, content);\n } catch {\n return false;\n }\n }\n\n const taskText = String(request.userInput || '');\n const exactLines = [...taskText.matchAll(/\"([^\"]+)\"/g)].map(match => String(match[1] || ''));\n if (/containing exactly/i.test(taskText) && paths.length === 1 && exactLines.length > 0) {\n const actual = String(contents.get(paths[0]) || '').trim();\n const expected = exactLines.join('\\n').trim();\n return actual === expected;\n }\n\n for (const relPath of paths) {\n const content = String(contents.get(relPath) || '');\n if (relPath.endsWith('SUMMARY.md') && !content.trim()) return false;\n if (relPath.endsWith('math.ts') && /add\\(a,\\s*b\\)/i.test(taskText)) {\n const looksTypedAdd = /export\\s+(function|const)\\s+add\\s*\\(\\s*a\\s*:\\s*[^,]+,\\s*b\\s*:\\s*[^)]+\\)/.test(content)\n || /export\\s+const\\s+add\\s*=\\s*\\(\\s*a\\s*:\\s*[^,]+,\\s*b\\s*:\\s*[^)]+\\)/.test(content);\n if (!looksTypedAdd) return false;\n }\n }\n\n return true;\n }\n\n private buildWorkerExecutionResult(\n task: WorkerTaskEnvelope,\n parsed: { output: string; validation?: string[] },\n workerResult: {\n cost?: number;\n success?: boolean;\n toolsUsed?: string[];\n history?: Array<{ tool: string; params: Record<string, any>; result?: any; error?: string }>;\n stopReason?: string;\n }\n ) {\n const history = Array.isArray(workerResult.history) ? workerResult.history : [];\n const filesChanged = this.extractFilesChanged(history);\n const shellResults = this.extractShellResults(history);\n const verificationState = this.collectVerificationSignals(history, parsed, task);\n const failedToolCalls = this.countFailedToolCalls(history);\n const repeatedFailedAction = this.hasRepeatedFailedAction(history);\n\n let escalationNeeded = verificationState.escalationNeeded || workerResult.success === false;\n let escalationReason = verificationState.escalationReason;\n\n if (!escalationReason && workerResult.success === false) {\n escalationReason = workerResult.stopReason || 'Worker did not reach a successful completion state.';\n } else if (!escalationReason && workerResult.stopReason && !String(workerResult.stopReason).toLowerCase().includes('complete')) {\n escalationNeeded = true;\n escalationReason = workerResult.stopReason;\n }\n\n const normalizedAllowedPaths = task.allowedPaths.map(path => normalize(String(path)).replace(/\\\\/g, '/'));\n const outOfScopeFiles = filesChanged.filter(file => {\n const normalizedFile = normalize(String(file)).replace(/\\\\/g, '/');\n if (normalizedAllowedPaths.length === 0 || normalizedAllowedPaths.includes('.')) return false;\n return !normalizedAllowedPaths.some(allowed => (\n normalizedFile === allowed ||\n normalizedFile.startsWith(`${allowed}/`) ||\n (allowed.endsWith('/') && normalizedFile.startsWith(allowed))\n ));\n });\n if (outOfScopeFiles.length > 0) {\n escalationNeeded = true;\n escalationReason = `Worker changed files outside allowed scope: ${outOfScopeFiles.join(', ')}`;\n } else if (task.maxFilesTouched && filesChanged.length > task.maxFilesTouched) {\n escalationNeeded = true;\n escalationReason = `Worker touched ${filesChanged.length} files but task budget was ${task.maxFilesTouched}.`;\n } else if (task.requiredCapabilities.includes('file-write') && filesChanged.length === 0 && !this.containsLegacyFileCommands(parsed.output)) {\n escalationNeeded = true;\n escalationReason = 'Worker completed without producing any file changes for a file-write task.';\n } else if (failedToolCalls >= 2 && repeatedFailedAction) {\n escalationNeeded = true;\n escalationReason = 'Worker repeated the same failing tool action multiple times.';\n } else if (failedToolCalls >= 3) {\n escalationNeeded = true;\n escalationReason = 'Worker accumulated too many failed tool calls.';\n }\n\n return {\n workUnitId: task.id,\n persona: task.persona,\n output: parsed.output,\n cost: workerResult.cost || 0,\n filesChanged,\n verification: verificationState.verification,\n verificationPassed: verificationState.verificationPassed,\n escalationNeeded,\n escalationReason,\n toolsUsed: workerResult.toolsUsed || [],\n failedToolCalls,\n turns: workerResult.turns,\n stopReason: workerResult.stopReason,\n shellResults\n };\n }\n\n private async recordPipelineMetrics(entry: {\n traceId: string;\n decision: string;\n qaEnabled: boolean;\n qaApproved: boolean;\n qaRounds: number;\n contextChunksUsed: number;\n contextCharsSaved: number;\n totalCost: number;\n executionPath: string[];\n }): Promise<void> {\n try {\n const dir = resolve(process.cwd(), '.crew');\n await mkdir(dir, { recursive: true });\n const path = join(dir, 'pipeline-metrics.jsonl');\n await appendFile(path, `${JSON.stringify({ ts: new Date().toISOString(), ...entry })}\\n`, 'utf8');\n } catch {\n // Best-effort observability only.\n }\n }\n\n private async writeRunCheckpoint(traceId: string, payload: Record<string, unknown>): Promise<void> {\n try {\n const dir = resolve(process.cwd(), '.crew', 'pipeline-runs');\n await mkdir(dir, { recursive: true });\n const path = join(dir, `${traceId}.jsonl`);\n await appendFile(path, `${JSON.stringify({ ts: new Date().toISOString(), ...payload })}\\n`, 'utf8');\n } catch {\n // Best-effort checkpointing only.\n }\n }\n\n private parseJsonObject(raw: string): any {\n return parseJsonObject(raw);\n }\n\n private async parseRouterDecision(raw: string, traceId: string, sessionId?: string): Promise<any> {\n return parseJsonObjectWithRepair(raw, {\n label: `L2 router (${traceId})`,\n schemaHint: '{\"decision\":\"direct-answer|execute-direct|execute-local|execute-parallel\",\"reasoning\":\"...\",\"directResponse\":\"...\",\"complexity\":\"low|medium|high\",\"estimatedCost\":0.001}',\n maxAttempts: this.getJsonParseAttempts(),\n validate: validateRouterDecision,\n onAttempt: async meta => {\n await recordJsonParseMetric({ ...meta, traceId });\n },\n repair: async (repairPrompt: string) => {\n const repaired = await this.executor.execute(repairPrompt, {\n model: this.getJsonRepairModel(),\n temperature: 0,\n maxTokens: 1000,\n sessionId\n });\n return String(repaired.result || '');\n }\n });\n }\n\n private async qaAuditResponse(response: string, traceId: string, round: number, sessionId?: string, executionResults?: L3Result): Promise<{\n approved: boolean;\n summary: string;\n issues: Array<{ severity: 'high' | 'medium' | 'low'; problem: string; requiredFix: string }>;\n cost: number;\n }> {\n const evidence = this.buildStructuredEvidence(executionResults);\n const hasStructuredEvidence = evidence.length > 0;\n\n const overlays: PromptOverlay[] = [\n {\n type: 'task',\n content: `Audit this generated output for correctness, completeness, and coherence.\n\nEvaluate based on STRUCTURED EVIDENCE first (shell results, exit codes, files changed), not narrative quality.\nIf shell commands passed with exit code 0 and files were modified as expected, approve regardless of prose quality.\nOnly reject based on prose if structured evidence is missing or contradictory.`,\n priority: 1\n },\n {\n type: 'context',\n content: hasStructuredEvidence\n ? `Round: ${round}\\n\\nStructured evidence:\\n${JSON.stringify(evidence, null, 2)}\\n\\nWorker output:\\n${response}`\n : `Round: ${round}\\n\\nGenerated output:\\n${response}`,\n priority: 2\n },\n {\n type: 'constraints',\n content: `Return ONLY valid JSON:\n{\n \"approved\": true|false,\n \"summary\": \"short summary\",\n \"issues\": [\n {\n \"severity\": \"high|medium|low\",\n \"problem\": \"what is wrong\",\n \"requiredFix\": \"what to change\"\n }\n ]\n}\n\nIf output has blockers, set approved=false.`,\n priority: 3\n }\n ];\n const prompt = this.composer.compose('specialist-qa-v1', overlays, `${traceId}-qa-${round}`);\n const result = await this.executor.execute(prompt.finalPrompt, {\n model: this.getQaModel(),\n temperature: 0.1,\n maxTokens: 2000,\n sessionId,\n jsonMode: true\n });\n const rawResult = String(result.result || '');\n try {\n const parsed = this.parseJsonObject(rawResult);\n const issues = Array.isArray(parsed.issues) ? parsed.issues : [];\n return {\n approved: Boolean(parsed.approved),\n summary: String(parsed.summary || ''),\n issues,\n cost: Number(result.costUsd || 0)\n };\n } catch {\n // QA parse failure: use deterministic heuristic on raw text instead of auto-approving\n this.logger.warn(`QA audit response was not valid JSON (round ${round}), falling back to text analysis`);\n const lower = rawResult.toLowerCase();\n const hasRejectSignals = lower.includes('reject') || lower.includes('fail') || lower.includes('incorrect') || lower.includes('missing') || lower.includes('wrong');\n const hasApproveSignals = lower.includes('approved') || lower.includes('looks good') || lower.includes('correct') || lower.includes('passes');\n const approved = hasApproveSignals && !hasRejectSignals;\n return {\n approved,\n summary: `QA parse failed \u2014 text heuristic: ${approved ? 'likely approved' : 'likely rejected'}`,\n issues: hasRejectSignals ? [{ severity: 'medium' as const, problem: 'QA returned non-JSON with rejection signals', requiredFix: 'Review worker output manually' }] : [],\n cost: Number(result.costUsd || 0)\n };\n }\n }\n\n private async fixerPatchResponse(\n response: string,\n issues: Array<{ severity: 'high' | 'medium' | 'low'; problem: string; requiredFix: string }>,\n traceId: string,\n round: number,\n sessionId?: string\n ): Promise<{ output: string; cost: number }> {\n const overlays: PromptOverlay[] = [\n {\n type: 'task',\n content: `Fix the generated output according to QA issues and return a corrected output body.`,\n priority: 1\n },\n {\n type: 'context',\n content: `Round: ${round}\\n\\nIssues:\\n${JSON.stringify(issues, null, 2)}\\n\\nCurrent output:\\n${response}`,\n priority: 2\n },\n {\n type: 'constraints',\n content: `Return only corrected output content, no extra commentary.`,\n priority: 3\n }\n ];\n const templateId = getTemplateForPersona('crew-fixer');\n const prompt = this.composer.compose(templateId, overlays, `${traceId}-fix-${round}`);\n const result = await this.executor.execute(prompt.finalPrompt, {\n temperature: 0.2,\n maxTokens: 5000,\n sessionId\n });\n return {\n output: String(result.result || ''),\n cost: Number(result.costUsd || 0)\n };\n }\n\n private async runQaFixerLoop(\n response: string,\n traceId: string,\n executionResults?: L3Result,\n sessionId?: string\n ): Promise<{\n response: string;\n addedCost: number;\n approved: boolean;\n rounds: number;\n lastSummary: string;\n }> {\n let working = response;\n let addedCost = 0;\n let approved = false;\n let lastSummary = '';\n const rounds = this.qaMaxRounds();\n\n for (let round = 1; round <= rounds; round++) {\n const qaPayload = this.appendExecutionAuditContext(working, executionResults);\n const qa = await this.qaAuditResponse(qaPayload, traceId, round, sessionId, executionResults);\n addedCost += qa.cost;\n lastSummary = qa.summary;\n if (qa.approved) {\n approved = true;\n return { response: working, addedCost, approved, rounds: round, lastSummary };\n }\n const fix = await this.fixerPatchResponse(working, qa.issues, traceId, round, sessionId);\n addedCost += fix.cost;\n if (fix.output.trim()) {\n working = fix.output;\n }\n }\n\n // Final gate check after last fixer round.\n const finalQa = await this.qaAuditResponse(\n this.appendExecutionAuditContext(working, executionResults),\n traceId,\n rounds + 1,\n sessionId,\n executionResults\n );\n addedCost += finalQa.cost;\n lastSummary = finalQa.summary;\n approved = finalQa.approved;\n return { response: working, addedCost, approved, rounds: rounds + 1, lastSummary };\n }\n\n /**\n * Apply any pending sandbox file writes to disk.\n * Workers stage files via write_file/edit tools \u2192 sandbox.addChange(),\n * but those changes need to be flushed to disk after execution.\n */\n private async flushSandbox(): Promise<void> {\n if (!this.sandbox) return;\n const pending = this.sandbox.getPendingPaths();\n if (pending.length === 0) return;\n await this.sandbox.apply();\n this.logger.info(`Applied ${pending.length} staged file(s) to disk: ${pending.join(', ')}`);\n }\n\n private autoCheckpointEnabled(): boolean {\n const raw = String(process.env.CREW_AUTO_CHECKPOINT || 'true').trim().toLowerCase();\n return raw !== 'false' && raw !== '0' && raw !== 'off';\n }\n\n /**\n * Git checkpoint at task boundary \u2014 auto-commit changes so user can revert.\n * Uses a predictable branch-style commit message for easy rollback.\n */\n private async gitCheckpoint(traceId: string, executionResults?: L3Result): Promise<void> {\n try {\n const { execSync } = await import('node:child_process');\n const cwd = (this.sandbox as any)?.baseDir || process.cwd();\n\n // Check if we're in a git repo with changes\n const status = execSync('git status --porcelain', { encoding: 'utf8', cwd }).trim();\n if (!status) return; // nothing to commit\n\n // Collect changed files from execution results\n const filesChanged = (executionResults?.results || [])\n .flatMap(r => r.filesChanged || [])\n .filter(Boolean);\n\n // Build descriptive commit message\n const filesSummary = filesChanged.length > 0\n ? filesChanged.slice(0, 5).join(', ') + (filesChanged.length > 5 ? ` (+${filesChanged.length - 5} more)` : '')\n : 'pipeline changes';\n const msg = `checkpoint(crew-cli): ${filesSummary} [${traceId.slice(0, 8)}]`;\n\n execSync('git add -A', { cwd, stdio: 'ignore' });\n execSync(`git commit -m \"${msg.replace(/\"/g, '\\\\\"')}\" --no-verify`, { cwd, stdio: 'ignore' });\n this.logger.info(`Checkpoint committed: ${msg}`);\n } catch {\n // Best-effort \u2014 don't fail the pipeline if git isn't available or commit fails\n }\n }\n\n private isMajorChange(workGraph?: WorkGraph): boolean {\n if (!workGraph) return false;\n const complexity = Number(workGraph.totalComplexity || 0);\n const unitCount = Array.isArray(workGraph.units) ? workGraph.units.length : 0;\n return complexity >= 7 || unitCount >= 8;\n }\n\n private assertMandatoryWorkGraphGates(workGraph: WorkGraph) {\n if (!this.scaffoldGateEnabled()) return;\n if (process.env.CREW_DUAL_L2_ENABLED !== 'true') return;\n if (workGraph.planMode === 'lightweight') return;\n const ids = new Set((workGraph.units || []).map(u => u.id));\n const required = ['scaffold-bootstrap', 'contract-tests-from-pdd', 'gate-definition-of-done', 'gate-golden-benchmark-suite'];\n const missing = required.filter(id => !ids.has(id));\n if (missing.length > 0) {\n throw new Error(`Mandatory pipeline gates missing: ${missing.join(', ')}`);\n }\n }\n\n private buildValidatedWorkerTasks(workGraph: WorkGraph): WorkerTaskEnvelope[] {\n const tasks = buildWorkerTasks(workGraph);\n const errors: string[] = [];\n const warnings: string[] = [];\n for (const task of tasks) {\n const check = validateWorkerTaskEnvelope(task);\n if (!check.ok) {\n errors.push(`${task.id}: ${check.errors.join(', ')}`);\n }\n if (Array.isArray(check.warnings) && check.warnings.length > 0) {\n warnings.push(`${task.id}: ${check.warnings.join(', ')}`);\n }\n }\n if (warnings.length > 0) {\n this.logger.warn(`L2\u2192L3 worker task warnings: ${warnings.join(' | ')}`);\n }\n if (errors.length > 0) {\n throw new Error(`Invalid L2\u2192L3 worker tasks: ${errors.join(' | ')}`);\n }\n return tasks;\n }\n\n private async runDefinitionOfDoneGate(\n response: string,\n request: L1Request,\n plan: L2Plan,\n traceId: string,\n sessionId?: string\n ): Promise<{ approved: boolean; summary: string; cost: number; ran: boolean }> {\n if (!this.definitionOfDoneEnabled()) return { approved: true, summary: 'DoD gate disabled', cost: 0, ran: false };\n\n const artifacts = plan.workGraph?.planningArtifacts;\n if (!artifacts?.definitionOfDone?.trim()) {\n return { approved: true, summary: 'No DOD artifact present', cost: 0, ran: false };\n }\n const overlays: PromptOverlay[] = [\n {\n type: 'task',\n content: 'Run a strict Definition of Done gate. Approve only if all required completion criteria are satisfied.',\n priority: 1\n },\n {\n type: 'context',\n content: `User request:\\n${request.userInput}\\n\\nGenerated response:\\n${response}`,\n priority: 2\n },\n {\n type: 'context',\n content: artifacts\n ? `DOD.md:\\n${artifacts.definitionOfDone}\\n\\nPDD acceptance criteria:\\n${(artifacts.acceptanceCriteria || []).join('\\n')}`\n : 'No DOD artifacts available.',\n priority: 3\n },\n {\n type: 'constraints',\n content: `Return ONLY valid JSON:\n{\n \"approved\": true|false,\n \"summary\": \"short summary\",\n \"failedChecks\": [\"list of failed checklist items\"]\n}`,\n priority: 4\n }\n ];\n const prompt = this.composer.compose('specialist-qa-v1', overlays, `${traceId}-dod`);\n const res = await this.executor.execute(prompt.finalPrompt, {\n model: this.getQaModel(),\n temperature: 0.1,\n maxTokens: 1200,\n sessionId\n });\n const rawDod = String(res.result || '');\n try {\n const parsed = this.parseJsonObject(rawDod);\n const failed = Array.isArray(parsed.failedChecks) ? parsed.failedChecks : [];\n const approved = Boolean(parsed.approved) && failed.length === 0;\n return {\n approved,\n summary: String(parsed.summary || ''),\n cost: Number(res.costUsd || 0),\n ran: true\n };\n } catch {\n this.logger.warn('DoD QA response was not valid JSON, falling back to text analysis');\n const lower = rawDod.toLowerCase();\n const hasRejectSignals = lower.includes('fail') || lower.includes('reject') || lower.includes('missing') || lower.includes('incorrect');\n return {\n approved: !hasRejectSignals,\n summary: `DoD parse failed \u2014 text heuristic: ${hasRejectSignals ? 'likely rejected' : 'likely approved'}`,\n cost: Number(res.costUsd || 0),\n ran: true\n };\n }\n }\n\n private async runGoldenBenchmarkGate(\n executionResults: L3Result | undefined,\n plan: L2Plan,\n traceId: string,\n sessionId?: string\n ): Promise<{ approved: boolean; summary: string; cost: number; ran: boolean }> {\n if (!this.goldenBenchmarkGateEnabled()) return { approved: true, summary: 'Golden benchmark gate disabled', cost: 0, ran: false };\n if (!this.isMajorChange(plan.workGraph)) return { approved: true, summary: 'Not a major change', cost: 0, ran: false };\n\n const benchmarkOutput = (executionResults?.results || [])\n .find(r => r.workUnitId === 'gate-golden-benchmark-suite')?.output || '';\n if (!benchmarkOutput.trim()) {\n return { approved: false, summary: 'Missing golden benchmark gate output', cost: 0, ran: true };\n }\n\n const overlays: PromptOverlay[] = [\n {\n type: 'task',\n content: 'Validate that golden benchmark suite was executed and results indicate pass for major change.',\n priority: 1\n },\n {\n type: 'context',\n content: `Benchmark gate output:\\n${benchmarkOutput}`,\n priority: 2\n },\n {\n type: 'constraints',\n content: `Return ONLY valid JSON:\n{\n \"approved\": true|false,\n \"summary\": \"short summary\",\n \"evidence\": [\"signals proving benchmark run happened\"]\n}`,\n priority: 3\n }\n ];\n const prompt = this.composer.compose('specialist-qa-v1', overlays, `${traceId}-golden-bench`);\n const res = await this.executor.execute(prompt.finalPrompt, {\n model: this.getQaModel(),\n temperature: 0.1,\n maxTokens: 1000,\n sessionId\n });\n const rawGolden = String(res.result || '');\n try {\n const parsed = this.parseJsonObject(rawGolden);\n return {\n approved: Boolean(parsed.approved),\n summary: String(parsed.summary || ''),\n cost: Number(res.costUsd || 0),\n ran: true\n };\n } catch {\n this.logger.warn('Golden benchmark QA response was not valid JSON, falling back to text analysis');\n const lower = rawGolden.toLowerCase();\n const hasRejectSignals = lower.includes('fail') || lower.includes('reject') || lower.includes('not pass');\n return {\n approved: !hasRejectSignals,\n summary: `Golden bench parse failed \u2014 text heuristic: ${hasRejectSignals ? 'likely rejected' : 'likely approved'}`,\n cost: Number(res.costUsd || 0),\n ran: true\n };\n }\n }\n\n private async runExtraL2Validators(\n request: L1Request,\n plan: L2Plan,\n traceId: string\n ): Promise<{ approved: boolean; summary: string; cost: number; ran: boolean }> {\n const models = this.getExtraL2ValidatorModels();\n if (models.length === 0) return { approved: true, summary: 'No extra L2 validators configured', cost: 0, ran: false };\n if (!plan.workGraph) return { approved: true, summary: 'No work graph to validate', cost: 0, ran: false };\n\n let totalCost = 0;\n const failures: string[] = [];\n\n for (const model of models) {\n const overlays: PromptOverlay[] = [\n {\n type: 'safety',\n content: `Validate this plan from an independent L2 pass.\\n\\nTask:\\n${request.userInput}\\n\\nPlan:\\n${JSON.stringify(plan.workGraph, null, 2)}`,\n priority: 1\n },\n {\n type: 'constraints',\n content: `Return ONLY valid JSON:\n{\n \"approved\": true|false,\n \"summary\": \"short summary\",\n \"issues\": [\"optional issue list\"]\n}`,\n priority: 2\n }\n ];\n const prompt = this.composer.compose('policy-validator-v1', overlays, `${traceId}-l2-extra-${model}`);\n const res = await this.executor.execute(prompt.finalPrompt, {\n model,\n temperature: 0.1,\n maxTokens: 1000\n });\n totalCost += Number(res.costUsd || 0);\n try {\n const parsed = this.parseJsonObject(String(res.result || ''));\n if (!Boolean(parsed.approved)) {\n failures.push(`${model}: ${String(parsed.summary || 'rejected')}`);\n }\n } catch {\n const rawExtra = String(res.result || '').toLowerCase();\n const hasRejectSignals = rawExtra.includes('reject') || rawExtra.includes('fail') || rawExtra.includes('unsafe');\n if (hasRejectSignals) {\n failures.push(`${model}: non-JSON response with rejection signals`);\n }\n this.logger.warn(`Extra L2 validator ${model} returned non-JSON, text heuristic: ${hasRejectSignals ? 'rejected' : 'approved'}`);\n }\n }\n\n if (failures.length > 0) {\n return {\n approved: false,\n summary: failures.join(' | '),\n cost: totalCost,\n ran: true\n };\n }\n return {\n approved: true,\n summary: `Extra L2 validators approved (${models.join(', ')})`,\n cost: totalCost,\n ran: true\n };\n }\n\n /**\n * Execute request through unified pipeline\n */\n async execute(request: L1Request): Promise<PipelineResult> {\n const traceId = `pipeline-${randomUUID()}`;\n const executionPath: string[] = ['l1-interface'];\n const startTime = Date.now();\n const runState = new PipelineRunState();\n const sessionId = request.sessionId || (this.session ? await this.session.getSessionId() : undefined);\n\n try {\n // L2: Router + Reasoner + Planner (or resume from prior plan)\n executionPath.push('l2-orchestrator');\n runState.transition('plan');\n await this.writeRunCheckpoint(traceId, { phase: 'plan', userInput: request.userInput, sessionId: request.sessionId });\n const resumeFrom = request.resume?.fromPhase;\n const canReusePlan = (resumeFrom === 'execute' || resumeFrom === 'validate') && Boolean(request.resume?.priorPlan);\n const plan = canReusePlan\n ? (request.resume?.priorPlan as L2Plan)\n : await this.l2Orchestrate(request, traceId, request.sessionId);\n if (canReusePlan) {\n executionPath.push('resume-plan-loaded');\n }\n await this.writeRunCheckpoint(traceId, {\n phase: 'plan.completed',\n decision: plan.decision,\n plan\n });\n\n // Store L2 decisions in agent memory for cross-model continuity\n const memory = getPipelineMemory();\n memory.remember(`L2 Decision: ${plan.decision} - ${plan.reasoning || 'direct execution'}`, {\n critical: true,\n tags: ['l2-decision', traceId],\n provider: 'pipeline'\n });\n\n let response: string;\n let executionResults: L3Result | undefined;\n let totalCost = 0;\n let qaApproved = true;\n let qaRounds = 0;\n let contextChunksUsed = 0;\n let contextCharsSaved = 0;\n let parallelExecuted = false;\n\n // Execute based on L2 decision\n runState.transition('execute');\n await this.writeRunCheckpoint(traceId, { phase: 'execute', decision: plan.decision });\n if (resumeFrom === 'validate' && request.resume?.priorResponse) {\n response = String(request.resume.priorResponse || '');\n executionResults = request.resume.priorExecutionResults;\n totalCost = Number(request.resume.priorExecutionResults?.totalCost || 0);\n executionPath.push('resume-validate-only');\n }\n else if (plan.decision === 'direct-answer') {\n executionPath.push('l2-direct-response');\n response = plan.directResponse || 'No response generated';\n totalCost = 0.0001; // Minimal cost for routing\n } \n else if (plan.decision === 'execute-local') {\n executionPath.push('l3-executor-single');\n const result = await this.l3ExecuteSingle(\n createAdHocWorkerTask({\n id: 'single-task',\n goal: request.userInput,\n persona: 'executor-code',\n sourceRefs: ['request#user-input']\n }),\n request.context || '',\n traceId\n );\n response = result.output;\n totalCost = result.cost;\n\n // Apply any tool-based file writes staged during worker execution\n await this.flushSandbox();\n\n // Parse and apply file commands from the output\n const { parseDirectFileCommands } = await import('../cli/file-commands.js');\n const fileCommands = this.shouldParseLegacyCommands(result) ? parseDirectFileCommands(response) : [];\n if (fileCommands.length > 0 && this.sandbox) {\n await this.sandbox.load(); // Ensure sandbox is loaded\n \n for (const cmd of fileCommands) {\n if (cmd.type === 'write') {\n await this.sandbox.addChange(cmd.path, cmd.content || '');\n this.logger.info(`Staged file: ${cmd.path}`);\n } else if (cmd.type === 'mkdir') {\n await this.sandbox.addChange(cmd.path + '/.gitkeep', '');\n this.logger.info(`Staged directory: ${cmd.path}`);\n }\n }\n \n // Auto-apply if --apply flag was used\n if (request.autoApply) {\n await this.sandbox.apply();\n this.logger.info(`Applied ${fileCommands.length} file change(s)`);\n }\n }\n \n executionResults = {\n success: true,\n results: [result],\n totalCost: result.cost,\n executionTimeMs: Date.now() - startTime\n };\n }\n else if (plan.decision === 'execute-direct') {\n // execute-direct: skip L2 planning entirely, go straight to L3 single execution\n executionPath.push('l3-executor-direct');\n const directTask = createAdHocWorkerTask({\n id: 'direct-task',\n goal: request.userInput,\n persona: 'executor-code',\n sourceRefs: ['request#user-input'],\n estimatedComplexity: 'low'\n });\n const result = await this.l3ExecuteSingle(\n directTask,\n request.context || '',\n traceId\n );\n response = result.output;\n totalCost = result.cost;\n\n // Apply any tool-based file writes staged during worker execution\n await this.flushSandbox();\n\n // Parse and apply file commands from the output\n const { parseDirectFileCommands: parseDirectCmds } = await import('../cli/file-commands.js');\n const directFileCommands = this.shouldParseLegacyCommands(result) ? parseDirectCmds(response) : [];\n if (directFileCommands.length > 0 && this.sandbox) {\n await this.sandbox.load();\n for (const cmd of directFileCommands) {\n if (cmd.type === 'write') {\n await this.sandbox.addChange(cmd.path, cmd.content || '');\n this.logger.info(`Staged file: ${cmd.path}`);\n } else if (cmd.type === 'mkdir') {\n await this.sandbox.addChange(cmd.path + '/.gitkeep', '');\n this.logger.info(`Staged directory: ${cmd.path}`);\n }\n }\n if (request.autoApply) {\n await this.sandbox.apply();\n this.logger.info(`Applied ${directFileCommands.length} file change(s)`);\n }\n }\n\n executionResults = {\n success: true,\n results: [result],\n totalCost: result.cost,\n executionTimeMs: Date.now() - startTime\n };\n }\n else if (plan.decision === 'execute-parallel') {\n if (!plan.workGraph) {\n this.logger.warn('execute-parallel without workGraph \u2014 routing to execute-direct instead');\n executionPath.push('l3-executor-direct');\n const fallbackTask = createAdHocWorkerTask({\n id: 'direct-task',\n goal: request.userInput,\n persona: 'executor-code',\n sourceRefs: ['request#user-input'],\n estimatedComplexity: 'low'\n });\n const result = await this.l3ExecuteSingle(\n fallbackTask,\n request.context || '',\n traceId\n );\n response = result.output;\n totalCost = result.cost;\n\n // Apply any tool-based file writes staged during worker execution\n await this.flushSandbox();\n\n // Parse and apply file commands from the output\n const { parseDirectFileCommands } = await import('../cli/file-commands.js');\n const fileCommands = this.shouldParseLegacyCommands(result) ? parseDirectFileCommands(response) : [];\n if (fileCommands.length > 0 && this.sandbox) {\n await this.sandbox.load();\n for (const cmd of fileCommands) {\n if (cmd.type === 'write') {\n await this.sandbox.addChange(cmd.path, cmd.content || '');\n this.logger.info(`Staged file: ${cmd.path}`);\n } else if (cmd.type === 'mkdir') {\n await this.sandbox.addChange(cmd.path + '/.gitkeep', '');\n this.logger.info(`Staged directory: ${cmd.path}`);\n }\n }\n if (request.autoApply) {\n await this.sandbox.apply();\n this.logger.info(`Applied ${fileCommands.length} file change(s)`);\n }\n }\n\n executionResults = {\n success: true,\n results: [result],\n totalCost: result.cost,\n executionTimeMs: Date.now() - startTime\n };\n } else {\n executionPath.push('l3-executor-parallel');\n executionResults = await this.l3ExecuteParallel(\n plan.workGraph,\n request.context || '',\n traceId\n );\n parallelExecuted = true;\n response = this.synthesizeResults(executionResults);\n totalCost = executionResults.totalCost;\n const metrics = (executionResults as any)?.metrics;\n contextChunksUsed = Number(metrics?.contextChunksUsed || 0);\n contextCharsSaved = Number(metrics?.contextCharsSaved || 0);\n\n // Apply any tool-based file writes staged during worker execution\n await this.flushSandbox();\n\n // Parse and apply file commands from parallel worker outputs\n const { parseDirectFileCommands } = await import('../cli/file-commands.js');\n const allFileCommands: any[] = [];\n for (const result of executionResults.results) {\n if (!this.shouldParseLegacyCommands(result)) continue;\n const commands = parseDirectFileCommands(result.output);\n allFileCommands.push(...commands);\n }\n \n if (allFileCommands.length > 0 && this.sandbox) {\n await this.sandbox.load();\n for (const cmd of allFileCommands) {\n if (cmd.type === 'write') {\n await this.sandbox.addChange(cmd.path, cmd.content || '');\n this.logger.info(`Staged file: ${cmd.path}`);\n } else if (cmd.type === 'mkdir') {\n await this.sandbox.addChange(cmd.path + '/.gitkeep', '');\n this.logger.info(`Staged directory: ${cmd.path}`);\n }\n }\n \n if (request.autoApply) {\n await this.sandbox.apply();\n this.logger.info(`Applied ${allFileCommands.length} file change(s)`);\n }\n }\n }\n }\n else {\n throw new Error(`Unknown decision: ${plan.decision}`);\n }\n\n if (plan.decision !== 'direct-answer') {\n const deterministicQaApproved = await this.passesDeterministicSmallTaskGate(request, plan, executionResults);\n if (deterministicQaApproved) {\n qaApproved = true;\n qaRounds = 0;\n executionPath.push('l3-qa-approved-deterministic');\n } else if (this.qaLoopEnabled()) {\n executionPath.push('l3-qa-gate');\n const qaLoop = await this.runQaFixerLoop(response, traceId, executionResults, sessionId);\n response = qaLoop.response;\n totalCost += qaLoop.addedCost;\n qaRounds = qaLoop.rounds;\n qaApproved = qaLoop.approved;\n executionPath.push(qaLoop.approved ? 'l3-qa-approved' : 'l3-qa-rejected');\n if (!qaLoop.approved) {\n throw new Error(`QA gate failed after ${qaLoop.rounds} rounds. ${qaLoop.lastSummary || ''}`.trim());\n }\n }\n }\n\n runState.transition('validate');\n await this.writeRunCheckpoint(traceId, {\n phase: 'validate.input',\n response,\n executionResults\n });\n if (plan.decision === 'execute-parallel' && parallelExecuted) {\n const l2extra = await this.runExtraL2Validators(request, plan, traceId);\n if (l2extra.ran) executionPath.push('l2-extra-validators');\n totalCost += l2extra.cost;\n if (!l2extra.approved) {\n throw new Error(`Extra L2 validation failed. ${l2extra.summary}`.trim());\n }\n }\n\n if (plan.decision === 'execute-parallel' && parallelExecuted) {\n const dod = await this.runDefinitionOfDoneGate(response, request, plan, traceId, sessionId);\n if (dod.ran) executionPath.push('l3-definition-of-done-gate');\n totalCost += dod.cost;\n if (!dod.approved) {\n throw new Error(`Definition of done gate failed. ${dod.summary}`.trim());\n }\n }\n\n if (plan.decision === 'execute-parallel' && parallelExecuted) {\n const bench = await this.runGoldenBenchmarkGate(executionResults, plan, traceId, sessionId);\n if (bench.ran) executionPath.push('l3-golden-benchmark-gate');\n totalCost += bench.cost;\n if (!bench.approved) {\n throw new Error(`Golden benchmark gate failed. ${bench.summary}`.trim());\n }\n }\n\n runState.transition('complete');\n\n // Auto-checkpoint: git commit at task boundary if files were changed\n if (plan.decision !== 'direct-answer' && this.autoCheckpointEnabled()) {\n await this.gitCheckpoint(traceId, executionResults);\n }\n\n await this.writeRunCheckpoint(traceId, {\n phase: 'complete',\n decision: plan.decision,\n totalCost,\n durationMs: Date.now() - startTime,\n qaApproved\n });\n\n await this.recordPipelineMetrics({\n traceId,\n decision: plan.decision,\n qaEnabled: this.qaLoopEnabled(),\n qaApproved,\n qaRounds,\n contextChunksUsed,\n contextCharsSaved,\n totalCost,\n executionPath\n });\n\n return {\n response,\n executionPath,\n plan,\n executionResults,\n totalCost,\n traceId,\n phase: 'complete',\n timeline: runState.getTimeline()\n };\n } catch (err) {\n runState.transition('failed', (err as Error).message);\n await this.writeRunCheckpoint(traceId, {\n phase: 'failed',\n error: (err as Error).message,\n executionPath\n });\n this.logger.error(`Pipeline execution failed: ${(err as Error).message}`);\n throw err;\n }\n }\n\n /**\n * L2-only route planning for orchestrator integration.\n * This runs L2 reasoning (and optional dual-L2 planning) without executing L3 workers.\n */\n async routeOnly(request: L1Request): Promise<{\n decision: 'CHAT' | 'CODE' | 'DISPATCH';\n agent?: string;\n task?: string;\n response?: string;\n explanation?: string;\n traceId: string;\n }> {\n const traceId = `pipeline-${randomUUID()}`;\n const plan = await this.l2Orchestrate(request, traceId, request.sessionId);\n\n if (plan.decision === 'direct-answer') {\n return {\n decision: 'CHAT',\n response: plan.directResponse || 'No response generated',\n explanation: plan.reasoning,\n traceId\n };\n }\n\n if (plan.decision === 'execute-local' || plan.decision === 'execute-direct') {\n return {\n decision: 'CODE',\n agent: 'crew-coder',\n task: request.userInput,\n explanation: plan.reasoning,\n traceId\n };\n }\n\n return {\n decision: 'DISPATCH',\n agent: 'crew-main',\n task: request.userInput,\n explanation: plan.reasoning,\n traceId\n };\n }\n\n /**\n * L2: Unified Orchestration Layer\n * Combines routing + reasoning + planning into single decision\n */\n private async l2Orchestrate(\n request: L1Request,\n traceId: string,\n sessionId?: string\n ): Promise<L2Plan> {\n // Step 1: Router - classify the request\n const overlays: PromptOverlay[] = [\n {\n type: 'task',\n content: `User request: ${request.userInput}`,\n priority: 1\n }\n ];\n\n if (request.context) {\n overlays.push({\n type: 'context',\n content: `Context:\\n${request.context}`,\n priority: 2\n });\n }\n\n const projectDir = (this.sandbox as any)?.baseDir || process.cwd();\n overlays.push({\n type: 'constraints',\n content: `You are operating in project directory: ${projectDir}\nYou have full file system access with tools: list_directory, read_file, write_file, grep_search, glob, run_shell_command, git, and more.\n\nAnalyze this request and decide:\n\n1. DIRECT-ANSWER: ONLY for greetings (\"hi\", \"hello\") or meta-questions about your identity/capabilities\n \u2192 Provide immediate text response\n \u2192 Do NOT use this for any question about files, code, project state, or folder contents \u2014 use EXECUTE-DIRECT instead\n\n2. EXECUTE-DIRECT: Simple task or question that can be answered by reading files, listing directories, or a single focused action\n \u2192 Questions about files, folder contents, code, project structure \u2192 use tools to answer\n \u2192 Single file create/edit, small bug fix, one-liner change\n \u2192 Bypasses L2 planning overhead entirely\n\n3. EXECUTE-LOCAL: DEPRECATED - only for testing/debugging\n \u2192 Not used in production\n\n4. EXECUTE-PARALLEL: Multi-file or complex coding/implementation tasks (default for code)\n \u2192 Any request involving writing, modifying, or refactoring multiple files\n \u2192 L2 will decompose into work units for L3 workers\n \u2192 After execution, L2 runs QA validation\n \u2192 If QA fails, expensive fixer runs, then QA again\n \u2192 Use dual-L2 planner for work graph\n\n**Choose EXECUTE-DIRECT for:**\n- Any question about files, folders, code, or project state (use tools to look)\n- Creating or editing a single file\n- Small, focused bug fixes\n- Simple code generation with obvious scope\n\n**Choose EXECUTE-PARALLEL for:**\n- Multi-file features, APIs, or refactors\n- Implementing features that span modules\n- Test creation across multiple files\n- Documentation generation for entire projects\n\nReturn ONLY valid JSON:\n{\n \"decision\": \"direct-answer|execute-direct|execute-parallel\",\n \"reasoning\": \"why this path was chosen\",\n \"directResponse\": \"if direct-answer, provide response here\",\n \"complexity\": \"low|medium|high\",\n \"estimatedCost\": 0.001\n}`,\n priority: 3\n }\n );\n\n const composedPrompt = this.composer.compose('router-v1', overlays, traceId);\n \n const verbose = process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true';\n if (verbose) {\n console.log(`[L2 Router] Calling ${this.executor.constructor.name}...`);\n console.log(`[L2 Router] Prompt length: ${composedPrompt.finalPrompt.length} chars`);\n console.log(`[L2 Router] Request: ${request.userInput.substring(0, 100)}...`);\n }\n\n const routerStart = Date.now();\n const requestedRouterModel = this.getRouterModel();\n const result = await this.executor.execute(composedPrompt.finalPrompt, {\n model: requestedRouterModel,\n temperature: 0.3,\n maxTokens: 8000, // L2 gets expensive model budget - only place we use it\n jsonMode: true, // Router needs JSON\n sessionId: request.sessionId // Pass session ID for cache coherence\n });\n if (verbose) {\n console.log(`[L2 Router] \u2705 Response in ${Date.now() - routerStart}ms`);\n console.log(`[L2 Router] Model requested: ${requestedRouterModel || '(default)'} | used: ${result.model || '(unknown)'}`);\n }\n\n // Track cache savings from router call\n if (result.cachedTokens) {\n const totalTokens = (result.promptTokens || 0) + (result.cachedTokens || 0);\n await this.trackCacheHit(result.cachedTokens, totalTokens, result.model);\n }\n\n if (!result.success) {\n throw new Error(`L2 orchestration failed: ${result.result}`);\n }\n\n const decision = await this.parseRouterDecision(String(result.result || ''), traceId, sessionId);\n const normalizedDecision = this.normalizeDecision(decision.decision);\n\n // Step 2: If complex AND Dual-L2 enabled, run planner\n let workGraph: WorkGraph | undefined;\n let validation: PolicyValidation | undefined;\n\n const dualL2Enabled = process.env.CREW_DUAL_L2_ENABLED === 'true';\n\n if (normalizedDecision === 'execute-parallel' && dualL2Enabled) {\n console.log('[L2 Planner] Dual-L2 enabled, calling DualL2Planner...');\n \n const planStart = Date.now();\n const dualL2Result = await this.planner.plan(\n request.userInput,\n request.context || '',\n traceId\n );\n console.log(`[L2 Planner] \u2705 Plan complete in ${Date.now() - planStart}ms`);\n console.log(`[L2 Planner] Work units: ${dualL2Result.workGraph?.units?.length || 0}`);\n \n workGraph = dualL2Result.workGraph;\n validation = dualL2Result.validation;\n\n if (workGraph) {\n const graphCheck = validateWorkGraph(workGraph);\n if (!graphCheck.ok) {\n throw new Error(`Planner returned invalid work graph: ${graphCheck.errors.join('; ')}`);\n }\n this.buildValidatedWorkerTasks(workGraph);\n }\n if (validation) {\n const policyCheck = validatePolicyValidation(validation);\n if (!policyCheck.ok) {\n throw new Error(`Planner returned invalid validation payload: ${policyCheck.errors.join('; ')}`);\n }\n }\n\n if (workGraph) {\n const mode = String(process.env.CREW_INTERFACE_MODE || 'standalone').toLowerCase() === 'connected'\n ? 'connected'\n : 'standalone';\n const caps = resolveCapabilityMap(mode);\n for (const unit of workGraph.units || []) {\n const missing = missingForRequiredCapabilities(unit.requiredCapabilities || [], caps);\n if (missing.length > 0) {\n throw new Error(\n `Capability gate failed for unit \"${unit.id}\" (${unit.requiredPersona}): missing ${missing.join(', ')} in ${caps.mode} mode`\n );\n }\n }\n }\n\n // HARD RISK GATE - Block critical risk tasks\n if (!validation.approved) {\n throw new Error(\n `Task rejected by policy validator:\\n${validation.concerns.join('\\n')}\\n\\n` +\n `Recommendations:\\n${validation.recommendations.join('\\n')}`\n );\n }\n\n const allowCritical = process.env.CREW_ALLOW_CRITICAL === 'true';\n if (validation.riskLevel === 'critical' && !allowCritical) {\n throw new Error(\n `CRITICAL RISK detected. Task blocked.\\n${validation.concerns.join('\\n')}\\n` +\n `Use CREW_ALLOW_CRITICAL=true to override (not recommended).`\n );\n }\n }\n\n return {\n decision: normalizedDecision,\n reasoning: decision.reasoning,\n workGraph,\n validation,\n directResponse: decision.directResponse,\n traceId\n };\n }\n\n /**\n * L3: Single Executor\n */\n private async l3ExecuteSingle(\n task: WorkerTaskEnvelope,\n context: string,\n traceId: string\n ): Promise<{\n workUnitId: string;\n persona: string;\n output: string;\n cost: number;\n filesChanged: string[];\n verification: string[];\n verificationPassed: boolean;\n escalationNeeded: boolean;\n escalationReason?: string;\n toolsUsed?: string[];\n }> {\n // Structure analyzer temporarily disabled\n // const structure = await analyzeProjectStructure(process.cwd());\n // const structureContext = formatStructureContext(structure);\n // const enhancedTask = `${structureContext}\\n\\n${task}`;\n const check = validateWorkerTaskEnvelope(task);\n if (!check.ok) {\n throw new Error(`Invalid single worker task: ${check.errors.join(', ')}`);\n }\n const enhancedTask = task.goal;\n \n const overlays: PromptOverlay[] = [\n { type: 'task', content: enhancedTask, priority: 1 }\n ];\n\n if (context) {\n overlays.push({ type: 'context', content: context, priority: 2 });\n }\n overlays.push({\n type: 'constraints',\n content: `Worker task contract:\n- Allowed paths: ${task.allowedPaths.length > 0 ? task.allowedPaths.join(', ') : '(no explicit paths extracted)'}\n- Verification: ${task.verification.join(' | ')}\n- Escalate when: ${(task.escalationHints || []).join(' | ')}`,\n priority: 3\n });\n\n // Get sessionId from session manager if available\n const sessionId = this.session ? await this.session.getSessionId() : undefined;\n\n const composedPrompt = this.composer.compose('executor-code-v1', overlays, traceId);\n\n // Use built-in L3_SYSTEM_PROMPT (has THINK\u2192ACT\u2192OBSERVE + tool list)\n const result = await runAgenticWorker(enhancedTask, this.sandbox, {\n model: process.env.CREW_EXECUTION_MODEL || 'gemini-2.5-flash',\n maxTurns: 25\n });\n\n const parsed = this.parseWorkerOutput(String(result.output || ''));\n return this.buildWorkerExecutionResult(task, parsed, result);\n }\n\n /**\n * L3: Parallel Executors\n * Execute work units in dependency order with parallelization\n */\n private async l3ExecuteParallel(\n workGraph: WorkGraph,\n context: string,\n traceId: string\n ): Promise<L3Result> {\n const verbose = process.env.CREW_VERBOSE === 'true' || process.env.CREW_DEBUG === 'true';\n if (verbose) {\n console.log('[L3 Execute] Starting parallel execution...');\n console.log(`[L3 Execute] Total work units: ${workGraph.units.length}`);\n }\n \n // HARD COST GATE - Block before execution\n if (workGraph.estimatedCost > 0.50) {\n throw new Error(\n `Task cost $${workGraph.estimatedCost.toFixed(3)} exceeds limit ($0.50). ` +\n `Use /approve-cost to override or simplify the task.`\n );\n }\n\n this.assertMandatoryWorkGraphGates(workGraph);\n const workerTasks = this.buildValidatedWorkerTasks(workGraph);\n\n // Get sessionId from session manager if available\n const sessionId = this.session ? await this.session.getSessionId() : undefined;\n\n const startTime = Date.now();\n const results: L3Result['results'] = [];\n const completed = new Set<string>();\n const outputByUnit = new Map<string, string>();\n let totalCost = 0;\n // Accumulate discovered files across batches so later workers inherit context.\n // Load prior JIT context from session if available.\n let accumulatedDiscoveredFiles: string[] = [];\n if (this.session) {\n try {\n accumulatedDiscoveredFiles = await this.session.loadJITContext();\n } catch { /* first run \u2014 no prior context */ }\n }\n let contextChunksUsed = 0;\n let contextCharsSaved = 0;\n const artifactPackId = workGraph.planningArtifacts\n ? this.contextPacks.createPack(traceId, workGraph.planningArtifacts)\n : '';\n\n // Sort work units by dependency order\n const sorted = this.topologicalSort(workerTasks);\n\n // Execute in batches (units with no pending dependencies)\n const maxWorkers = this.getMaxParallelWorkers();\n for (const batch of this.getBatches(sorted)) {\n if (verbose) {\n console.log(`[L3 Batch] Executing ${batch.length} units in parallel...`);\n console.log(`[L3 Batch] Units: ${batch.map(u => u.id).join(', ')}`);\n console.log(`[L3 Batch] Concurrency cap: ${maxWorkers}`);\n }\n \n const batchStart = Date.now();\n const runUnit = async (unit: typeof batch[number]) => {\n // Check dependencies\n for (const depId of unit.dependencies) {\n if (!completed.has(depId)) {\n throw new Error(`Dependency ${depId} not completed for ${unit.id}`);\n }\n }\n\n // Resolve prompt template from persona registry (covers full standalone role set).\n const templateId = getTemplateForPersona(unit.persona);\n\n // Structure analyzer temporarily disabled\n // const structure = await analyzeProjectStructure(process.cwd());\n // const structureContext = formatStructureContext(structure);\n // const enhancedDescription = `${structureContext}\\n\\n${unit.description}`;\n const enhancedDescription = unit.goal;\n\n const overlays: PromptOverlay[] = [\n { type: 'task', content: enhancedDescription, priority: 1 },\n { type: 'context', content: context, priority: 2 }\n ];\n\n // Inject agent memory for cross-model continuity\n const memory = getPipelineMemory();\n const memoryContext = memory.recall({\n tokenBudget: 500,\n tags: ['l2-decision', traceId],\n provider: 'pipeline'\n });\n if (memoryContext) {\n overlays.push({\n type: 'context',\n content: memoryContext,\n priority: 0\n });\n }\n\n if (artifactPackId) {\n const fullArtifactChars = (workGraph.planningArtifacts?.pdd?.length || 0)\n + (workGraph.planningArtifacts?.roadmap?.length || 0)\n + (workGraph.planningArtifacts?.architecture?.length || 0);\n const artifactContext = this.contextPacks.retrieve(artifactPackId, {\n query: unit.goal,\n sourceRefs: unit.sourceRefs || [],\n budgetChars: Number(process.env.CREW_CONTEXT_BUDGET_CHARS || 7000),\n maxChunks: Number(process.env.CREW_CONTEXT_MAX_CHUNKS || 8)\n });\n const usedChunks = (artifactContext.match(/\\[(PDD|ROADMAP|ARCH|SCAFFOLD|CONTRACT-TESTS|DOD|GOLDEN-BENCHMARKS)\\.md#/g) || []).length;\n contextChunksUsed += usedChunks;\n contextCharsSaved += Math.max(0, fullArtifactChars - artifactContext.length);\n overlays.push({\n type: 'context',\n content: `Context pack id: ${artifactPackId}\\n${artifactContext}`,\n priority: 2\n });\n }\n\n // Add outputs from completed dependencies (bounded) so downstream workers remain coherent.\n const dependencyOutputs: string[] = [];\n for (const depId of unit.dependencies) {\n const depOutput = outputByUnit.get(depId);\n if (depOutput) {\n dependencyOutputs.push(`[Output from ${depId}]:\\n${depOutput.substring(0, 1500)}`);\n }\n }\n if (dependencyOutputs.length > 0) {\n overlays.push({\n type: 'context',\n content: `Dependency outputs:\\n${dependencyOutputs.join('\\n\\n')}`,\n priority: 3\n });\n }\n\n if (Array.isArray(unit.sourceRefs) && unit.sourceRefs.length > 0) {\n overlays.push({\n type: 'context',\n content: `Required source refs for this unit: ${unit.sourceRefs.join(', ')}`,\n priority: 3\n });\n }\n overlays.push({\n type: 'constraints',\n content: `Worker task contract:\n- Allowed paths: ${unit.allowedPaths.length > 0 ? unit.allowedPaths.join(', ') : '(no explicit paths extracted)'}\n- Verification: ${unit.verification.join(' | ')}\n- Escalate when: ${(unit.escalationHints || []).join(' | ')}`,\n priority: 3\n });\n \n // Only add JSON constraint for non-coding workers\n // Coding workers (crew-coder, crew-coder-front, crew-coder-back, crew-frontend, crew-fixer) \n // should use @@WRITE_FILE format instead\n const codingPersonas = ['crew-coder', 'crew-coder-front', 'crew-coder-back', 'crew-frontend', 'crew-fixer', 'crew-mega'];\n if (!codingPersonas.includes(unit.persona)) {\n overlays.push({\n type: 'constraints',\n content: `Return ONLY valid JSON:\n{\n \"output\": \"primary result text for this unit\",\n \"summary\": \"short summary\",\n \"edits\": [\"optional changed files or actions\"],\n \"validation\": [\"optional checks or caveats\"]\n}`,\n priority: 4\n });\n }\n\n const composedPrompt = this.composer.compose(templateId, overlays, `${traceId}-${unit.id}`);\n \n if (verbose) {\n console.log(` [${unit.id}] ${unit.persona} executing (agentic)...`);\n }\n const unitStart = Date.now();\n \n // Use built-in L3_SYSTEM_PROMPT (has THINK\u2192ACT\u2192OBSERVE + tool list)\n // Do NOT override with template basePrompt \u2014 those are generic and don't mention tools\n const result = await this.runWorker(composedPrompt.finalPrompt, {\n model: process.env.CREW_EXECUTION_MODEL || 'gemini-2.5-flash',\n maxTurns: 25,\n verbose,\n priorDiscoveredFiles: accumulatedDiscoveredFiles.length > 0 ? accumulatedDiscoveredFiles : undefined\n });\n const parsed = this.parseWorkerOutput(String(result.output || ''));\n\n // Accumulate discovered files for subsequent batches\n if (result.discoveredFiles?.length) {\n for (const f of result.discoveredFiles) {\n if (!accumulatedDiscoveredFiles.includes(f)) accumulatedDiscoveredFiles.push(f);\n }\n }\n\n if (verbose) {\n console.log(` [${unit.id}] \u2705 Complete in ${Date.now() - unitStart}ms ($${result.cost?.toFixed(6) || 0}) [${result.turns ?? 0} turns]`);\n }\n\n completed.add(unit.id);\n outputByUnit.set(unit.id, parsed.output);\n\n // Store worker output in memory for cross-model continuity\n getPipelineMemory().remember(\n `Worker ${unit.id} (${unit.persona}): ${parsed.output.substring(0, 300)}...`,\n { critical: false, tags: ['l3-output', traceId, unit.id], provider: 'pipeline' }\n );\n\n return this.buildWorkerExecutionResult(unit, parsed, result);\n };\n\n const batchResults: Array<{\n workUnitId: string;\n persona: string;\n output: string;\n cost: number;\n filesChanged: string[];\n verification: string[];\n verificationPassed: boolean;\n escalationNeeded: boolean;\n escalationReason?: string;\n toolsUsed?: string[];\n shellResults?: Array<{ command: string; exitCode: number; output: string }>;\n }> = [];\n const queue = batch.slice();\n const workers = Array.from({ length: Math.min(maxWorkers, queue.length) }, async () => {\n while (queue.length > 0) {\n const next = queue.shift();\n if (!next) break;\n const res = await runUnit(next);\n batchResults.push(res);\n }\n });\n await Promise.all(workers);\n if (verbose) {\n console.log(`[L3 Batch] \u2705 Batch complete in ${Date.now() - batchStart}ms`);\n }\n \n results.push(...batchResults);\n totalCost += batchResults.reduce((sum, r) => sum + r.cost, 0);\n\n // HARD COST GATE - Check during execution\n if (totalCost > 0.50) {\n throw new Error(\n `Execution cost $${totalCost.toFixed(3)} exceeded limit ($0.50) during execution. ` +\n `Partial results saved but task aborted.`\n );\n }\n }\n\n // Persist JIT context for subsequent CLI invocations\n if (this.session && accumulatedDiscoveredFiles.length > 0) {\n try { await this.session.saveJITContext(accumulatedDiscoveredFiles); } catch { /* best-effort */ }\n }\n\n return {\n success: true,\n results,\n totalCost,\n executionTimeMs: Date.now() - startTime,\n metrics: {\n contextChunksUsed,\n contextCharsSaved\n }\n };\n }\n\n /**\n * Topological sort for dependency ordering\n */\n private topologicalSort<T extends { id: string; dependencies: string[] }>(units: T[]): T[] {\n const sorted: T[] = [];\n const visited = new Set<string>();\n const temp = new Set<string>();\n\n const visit = (unitId: string) => {\n if (temp.has(unitId)) {\n throw new Error(`Circular dependency detected: ${unitId}`);\n }\n if (visited.has(unitId)) return;\n\n temp.add(unitId);\n\n const unit = units.find(u => u.id === unitId);\n if (!unit) throw new Error(`Unit not found: ${unitId}`);\n\n for (const depId of unit.dependencies) {\n visit(depId);\n }\n\n temp.delete(unitId);\n visited.add(unitId);\n sorted.push(unit);\n };\n\n for (const unit of units) {\n if (!visited.has(unit.id)) {\n visit(unit.id);\n }\n }\n\n return sorted;\n }\n\n /**\n * Group units into parallel execution batches\n */\n private getBatches<T extends { id: string; dependencies: string[] }>(sortedUnits: T[]): Array<T[]> {\n const batches: Array<T[]> = [];\n const completed = new Set<string>();\n\n while (completed.size < sortedUnits.length) {\n const batch = sortedUnits.filter(unit => \n !completed.has(unit.id) &&\n unit.dependencies.every(depId => completed.has(depId))\n );\n\n if (batch.length === 0) {\n throw new Error('Unable to resolve dependencies');\n }\n\n batches.push(batch);\n batch.forEach(unit => completed.add(unit.id));\n }\n\n return batches;\n }\n\n /**\n * Synthesize parallel results into coherent response\n */\n private synthesizeResults(results: L3Result): string {\n const sections = results.results.map(r => {\n const filesChanged = r.filesChanged || [];\n const verification = r.verification || [];\n const metadata = [\n `Files: ${filesChanged.length > 0 ? filesChanged.join(', ') : '(none reported)'}`,\n `Verification: ${r.verificationPassed ? 'passed' : 'not confirmed'}`,\n ...(verification.length > 0 ? [`Evidence: ${verification.join(' | ')}`] : []),\n ...(r.escalationNeeded ? [`Escalation: ${r.escalationReason || 'required'}`] : [])\n ].join('\\n');\n return `### ${r.persona} (${r.workUnitId})\\n\\n${metadata}\\n\\n${r.output}`;\n });\n\n return sections.join('\\n\\n---\\n\\n');\n }\n\n /**\n * Run a worker unit \u2014 delegates to agentic executor by default.\n * Can be overridden in tests to use a mock executor.\n */\n async runWorker(prompt: string, options: { model?: string; maxTurns?: number; verbose?: boolean; priorDiscoveredFiles?: string[] }): Promise<{ output: string; cost?: number; turns?: number; discoveredFiles?: string[] }> {\n if (this.executor && typeof this.executor.execute === 'function') {\n const result = await this.executor.execute(prompt, options);\n return { output: String(result.result || ''), cost: result.costUsd || 0, turns: 1 };\n }\n return runAgenticWorker(prompt, this.sandbox, options);\n }\n\n /**\n * Check if native Gemini tool loop can be used for a given model\n */\n private canUseNativeGeminiToolLoop(modelId: string): boolean {\n if (!process.env.GEMINI_API_KEY) return false;\n const mode = (process.env.CREW_TOOL_MODE || 'auto').toLowerCase();\n if (mode === 'markers') return false;\n const lower = String(modelId || '').toLowerCase();\n return lower.includes('gemini');\n }\n\n /**\n * Parse tool call markers from LLM output\n */\n private parseToolCalls(output: string): Array<{ toolName: string; params: Record<string, string> }> {\n const calls: Array<{ toolName: string; params: Record<string, string> }> = [];\n const lines = output.split('\\n');\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n\n // @@WRITE_FILE <path>\n const writeMatch = line.match(/^@@WRITE_FILE\\s+(.+)$/);\n if (writeMatch) {\n const filePath = writeMatch[1].trim().replace(/[`;\\s]+$/g, '');\n // Find @@END_FILE\n let content = '';\n let found = false;\n let j = i + 1;\n while (j < lines.length) {\n if (lines[j].trim() === '@@END_FILE') {\n found = true;\n break;\n }\n content += (content ? '\\n' : '') + lines[j];\n j++;\n }\n if (found) {\n calls.push({ toolName: 'write_file', params: { file_path: filePath, content } });\n i = j + 1;\n continue;\n }\n // No terminator \u2014 skip just the @@WRITE_FILE line\n i++;\n continue;\n }\n\n // @@EDIT \"old\" \u2192 \"new\" <path>\n const editMatch = line.match(/^@@EDIT\\s+\"(.+?)\"\\s*\u2192\\s*\"(.+?)\"\\s+(.+)$/);\n if (editMatch) {\n let editPath = editMatch[3].trim().replace(/[`;\\s]+$/g, '');\n // Reject paths with @@ (likely garbled)\n if (!editPath.includes('@@')) {\n calls.push({ toolName: 'edit', params: { path: editPath, old: editMatch[1], new: editMatch[2] } });\n }\n i++;\n continue;\n }\n\n // @@MKDIR <path>\n const mkdirMatch = line.match(/^@@MKDIR\\s+(.+)$/);\n if (mkdirMatch) {\n const dirPath = mkdirMatch[1].trim().replace(/[`;\\s]+$/g, '');\n if (!dirPath.includes('@@')) {\n calls.push({ toolName: 'mkdir', params: { path: dirPath } });\n }\n i++;\n continue;\n }\n\n i++;\n }\n\n return calls;\n }\n\n /**\n * Get execution trace\n */\n getTrace(traceId: string) {\n return {\n composedPrompts: this.composer.getTrace(traceId),\n plannerTrace: this.planner.getTrace(traceId)\n };\n }\n}\n", "// @ts-nocheck\nimport { AgentRouter } from '../agent/router.js';\nimport { Sandbox } from '../sandbox/index.js';\nimport { Logger } from '../utils/logger.js';\nimport type { Orchestrator } from './index.js';\nimport { AgentKeeper } from '../memory/agentkeeper.js';\n\nexport interface WorkerTask {\n id: string;\n agent: string;\n prompt: string;\n context?: string;\n retries?: number;\n}\n\nexport interface WorkerPoolOptions {\n router: AgentRouter;\n orchestrator: Orchestrator;\n sandbox: Sandbox;\n keeper?: AgentKeeper;\n concurrency?: number;\n maxRetries?: number;\n timeoutMs?: number;\n}\n\nexport interface TaskResult {\n taskId: string;\n success: boolean;\n result?: any;\n error?: string;\n edits?: string[];\n}\n\nexport class WorkerPool {\n private queue: WorkerTask[] = [];\n private activeWorkers = 0;\n private concurrency: number;\n private maxRetries: number;\n private timeoutMs: number;\n private logger = new Logger();\n\n constructor(private options: WorkerPoolOptions) {\n this.concurrency = options.concurrency || 3;\n this.maxRetries = options.maxRetries || 2;\n this.timeoutMs = options.timeoutMs || 120000;\n }\n\n public enqueue(task: WorkerTask) {\n this.queue.push({\n ...task,\n retries: task.retries || 0\n });\n }\n\n public enqueueAll(tasks: WorkerTask[]) {\n for (const t of tasks) {\n this.enqueue(t);\n }\n }\n\n public async runAll(options: { sessionId: string; projectDir: string; runId?: string }): Promise<TaskResult[]> {\n const results: TaskResult[] = [];\n \n return new Promise((resolve) => {\n const checkQueue = async () => {\n if (this.queue.length === 0 && this.activeWorkers === 0) {\n resolve(results);\n return;\n }\n\n while (this.activeWorkers < this.concurrency && this.queue.length > 0) {\n const task = this.queue.shift();\n if (!task) continue;\n\n this.activeWorkers++;\n \n this.executeTask(task, options)\n .then((result) => {\n results.push(result);\n this.activeWorkers--;\n checkQueue();\n })\n .catch((err) => {\n this.logger.error(`Worker pool critical failure for task ${task.id}: ${err.message}`);\n results.push({ taskId: task.id, success: false, error: err.message });\n this.activeWorkers--;\n checkQueue();\n });\n }\n };\n\n checkQueue();\n });\n }\n\n private async executeTask(task: WorkerTask, options: { sessionId: string; projectDir: string; runId?: string }): Promise<TaskResult> {\n this.logger.info(`[WorkerPool] Starting task: ${task.id} with agent ${task.agent}`);\n \n let attempt = 0;\n while (attempt <= this.maxRetries) {\n try {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Timeout after ${this.timeoutMs}ms`)), this.timeoutMs);\n });\n\n const fullPrompt = task.context ? `${task.prompt}\n\n${task.context}` : task.prompt;\n\n const dispatchPromise = this.options.router.dispatch(task.agent, fullPrompt, {\n sessionId: options.sessionId,\n project: options.projectDir,\n timeout: this.timeoutMs.toString()\n });\n\n const result = await Promise.race([dispatchPromise, timeoutPromise]) as any;\n\n const responseText = String(result.result || '');\n const edits = await this.options.orchestrator.parseAndApplyToSandbox(responseText);\n if (this.options.keeper && responseText.trim().length > 0) {\n const saved = await this.options.keeper.recordSafe({\n runId: options.runId || 'worker-run',\n tier: 'worker',\n task: task.prompt,\n result: responseText,\n agent: task.agent,\n metadata: {\n taskId: task.id,\n edits: edits.length,\n retries: attempt\n }\n });\n if (!saved.ok) {\n this.logger.warn(`[WorkerPool] Memory write skipped for task ${task.id}: ${saved.error}`);\n }\n }\n\n this.logger.success(`[WorkerPool] Task completed: ${task.id}`);\n return {\n taskId: task.id,\n success: true,\n result: responseText,\n edits\n };\n\n } catch (err) {\n attempt++;\n this.logger.warn(`[WorkerPool] Task ${task.id} failed (attempt ${attempt}/${this.maxRetries + 1}): ${(err as Error).message}`);\n \n if (attempt > this.maxRetries) {\n return {\n taskId: task.id,\n success: false,\n error: err.message\n };\n }\n \n // Wait before retry\n await new Promise(r => setTimeout(r, 2000 * attempt));\n }\n }\n \n return { taskId: task.id, success: false, error: 'Max retries exceeded' };\n }\n}\n", "// @ts-nocheck\nimport { Sandbox } from '../sandbox/index.js';\nimport { AgentRouter } from '../agent/router.js';\nimport { Logger } from '../utils/logger.js';\nimport { getStrategy } from '../strategies/index.js';\nimport { SessionManager } from '../session/manager.js';\nimport { readFile } from 'node:fs/promises';\nimport { LocalExecutor } from '../executor/local.js';\nimport { getProfileConfig, type RuntimeProfile } from '../executor/profiles.js';\nimport { UnifiedPipeline } from '../pipeline/unified.js';\nimport { parseJsonObjectWithRepair } from '../utils/structured-json.js';\n\nexport { WorkerPool } from './worker-pool.js';\nexport type { WorkerTask, TaskResult, WorkerPoolOptions } from './worker-pool.js';\n\nconst ROUTING_SYSTEM_PROMPT = `You are the intelligent routing system for crew-cli, a multi-agent orchestration platform.\n\nRoute this request to one of: CHAT, CODE, DISPATCH, SKILL.\n\n- CHAT: Simple conversation, greetings, status checks, or informational questions about the system\n- CODE: Code editing, building, implementing, creating, refactoring, or any development task\n- DISPATCH: Specific agent request (QA, PM, security, fixer, etc) or complex multi-step tasks\n- SKILL: Explicit skill invocation\n\nFor CHAT decisions, provide a helpful conversational response in the \"response\" field.\n\nReturn ONLY a JSON object in this exact format:\n{\"decision\":\"CHAT|CODE|DISPATCH|SKILL\",\"agent\":\"crew-xxx if needed\",\"task\":\"reformulated task\",\"response\":\"your chat response if CHAT\"}`;\n\nexport enum RouteDecision {\n CHAT = 'CHAT',\n CODE = 'CODE',\n DISPATCH = 'DISPATCH',\n SKILL = 'SKILL'\n}\n\nexport interface RouteResult {\n decision: RouteDecision;\n agent?: string;\n task?: string;\n explanation?: string;\n response?: string; // For CHAT decisions, the LLM's conversational response\n}\n\nexport class Orchestrator {\n private logger = new Logger();\n private localExecutor = new LocalExecutor();\n private pipeline: UnifiedPipeline;\n\n constructor(\n private router: AgentRouter,\n private sandbox: Sandbox,\n private session: SessionManager,\n private profile: RuntimeProfile = 'builder'\n ) {\n this.pipeline = new UnifiedPipeline(sandbox, session);\n }\n\n /**\n * Decides which path to take based on user input.\n */\n async route(input: string): Promise<RouteResult> {\n const useUnifiedRouter = this.shouldUseUnifiedRouter();\n if (useUnifiedRouter) {\n try {\n const routed = await this.pipeline.routeOnly({\n userInput: input,\n sessionId: 'crew-cli'\n });\n const result: RouteResult = {\n decision: routed.decision as RouteDecision,\n agent: routed.agent,\n task: routed.task,\n response: routed.response,\n explanation: routed.explanation\n };\n await this.logRoutingDecision(input, result);\n return result;\n } catch (err) {\n // Fall through to deterministic routing if unified planner fails.\n console.warn(`[Orchestrator] routeOnly failed, falling back to legacy router: ${(err as Error).message}`);\n }\n }\n\n const llmDecision = await this.routeWithLLM(input);\n if (llmDecision) {\n if (llmDecision.decision === RouteDecision.CHAT && this.isExecutionIntent(input)) {\n llmDecision.decision = RouteDecision.CODE;\n llmDecision.agent = llmDecision.agent || 'crew-coder';\n llmDecision.task = llmDecision.task || input;\n llmDecision.explanation = 'Execution intent detected; bypassing chat-only route';\n }\n llmDecision.agent = this.normalizeAgentName(llmDecision.agent);\n // Ensure CODE decisions always have an agent\n if (llmDecision.decision === RouteDecision.CODE && !llmDecision.agent) {\n llmDecision.agent = 'crew-coder';\n }\n await this.logRoutingDecision(input, llmDecision);\n return llmDecision;\n }\n\n const lower = input.toLowerCase();\n let result: RouteResult;\n\n // Skill calling detection\n if (lower.startsWith('skill:') || lower.includes('run skill')) {\n result = { decision: RouteDecision.SKILL, explanation: 'Detected skill request' };\n }\n // Planning/PM tasks - roadmap, planning, architecture, research\n else if (\n lower.includes('roadmap') ||\n lower.includes('plan for') ||\n lower.includes('planning') ||\n lower.includes('architecture') ||\n lower.includes('design doc') ||\n (lower.includes('build') && (lower.includes('website') || lower.includes('app') || lower.includes('system'))) ||\n (lower.includes('research') && (lower.includes('indepth') || lower.includes('in-depth')))\n ) {\n result = { decision: RouteDecision.DISPATCH, agent: 'crew-pm', task: input };\n }\n // Specialist dispatch detection\n else if (lower.includes('ask') || lower.includes('tell')) {\n if (lower.includes('fixer') || lower.includes('fix')) {\n result = { decision: RouteDecision.DISPATCH, agent: 'crew-fixer', task: input };\n } else if (lower.includes('qa') || lower.includes('test')) {\n result = { decision: RouteDecision.DISPATCH, agent: 'crew-qa', task: input };\n } else if (lower.includes('frontend') || lower.includes('ui')) {\n result = { decision: RouteDecision.DISPATCH, agent: 'crew-frontend', task: input };\n } else if (lower.includes('security') || lower.includes('audit')) {\n result = { decision: RouteDecision.DISPATCH, agent: 'crew-security', task: input };\n } else {\n result = { decision: RouteDecision.DISPATCH, agent: 'crew-main', task: input };\n }\n }\n // Code generation/building detection\n else if (\n lower.includes('create') || \n lower.includes('implement') || \n lower.includes('modify') || \n lower.includes('add') || \n lower.includes('write') ||\n lower.includes('change') ||\n lower.includes('update') ||\n lower.includes('build') ||\n lower.includes('make')\n ) {\n result = { decision: RouteDecision.CODE, agent: 'crew-coder', task: input };\n }\n // Simple questions about system capabilities\n else if (\n (lower.includes('what') || lower.includes('how') || lower.includes('which')) &&\n (lower.includes('model') || lower.includes('version') || lower.includes('agent'))\n ) {\n result = { \n decision: RouteDecision.CHAT, \n response: \"I'm crew-cli, a multi-agent orchestration system. I can build code, plan projects, fix bugs, review security, and coordinate specialists. Try asking me to build something or create a roadmap!\",\n explanation: 'System info query'\n };\n }\n else if (\n lower === 'hello' ||\n lower === 'hi' ||\n lower === 'hey' ||\n lower.startsWith('hello ') ||\n lower.startsWith('hi ') ||\n lower.startsWith('hey ')\n ) {\n result = {\n decision: RouteDecision.CHAT,\n response: 'Hey. What do you want to build or fix?',\n explanation: 'Greeting'\n };\n }\n else {\n result = { decision: RouteDecision.DISPATCH, agent: 'crew-main', task: input };\n }\n\n await this.logRoutingDecision(input, result);\n return result;\n }\n\n private shouldUseUnifiedRouter(): boolean {\n const explicitLegacy = String(process.env.CREW_LEGACY_ROUTER || '').trim().toLowerCase();\n if (explicitLegacy === '1' || explicitLegacy === 'true' || explicitLegacy === 'yes') {\n return false;\n }\n const explicit = String(process.env.CREW_USE_UNIFIED_ROUTER || '').trim().toLowerCase();\n if (!explicit) return true;\n return !(explicit === '0' || explicit === 'false' || explicit === 'no' || explicit === 'off');\n }\n\n private isExecutionIntent(input: string): boolean {\n const lower = String(input || '').toLowerCase();\n return /\\b(implement|create|build|write|fix|refactor|modify|update|add|patch|test|run tests|make tests pass)\\b/.test(lower)\n || /\\/src\\/|\\.ts\\b|\\.js\\b|\\.tsx\\b|\\.py\\b/.test(lower);\n }\n\n private async getGeminiADCToken(): Promise<string | null> {\n try {\n const adcPath = process.env.GOOGLE_APPLICATION_CREDENTIALS || \n `${process.env.HOME}/.config/gcloud/application_default_credentials.json`;\n \n const { readFile } = await import('node:fs/promises');\n const credentialsJson = await readFile(adcPath, 'utf8');\n const credentials = JSON.parse(credentialsJson);\n \n if (credentials.type !== 'authorized_user' || !credentials.refresh_token) {\n return null;\n }\n \n // Exchange refresh token for access token\n const tokenResponse = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n client_id: credentials.client_id,\n client_secret: credentials.client_secret,\n refresh_token: credentials.refresh_token,\n grant_type: 'refresh_token'\n })\n });\n \n if (!tokenResponse.ok) return null;\n \n const tokenData = await tokenResponse.json() as any;\n return tokenData.access_token || null;\n } catch {\n return null;\n }\n }\n\n private normalizeAgentName(raw?: string): string | undefined {\n if (!raw) return raw;\n const lower = raw.toLowerCase().replace(/[^a-z]/g, '');\n const aliases: Record<string, string> = {\n fixer: 'crew-fixer', thefixer: 'crew-fixer', crewfixer: 'crew-fixer',\n coder: 'crew-coder', thecoder: 'crew-coder', crewcoder: 'crew-coder',\n qa: 'crew-qa', theqa: 'crew-qa', crewqa: 'crew-qa',\n frontend: 'crew-frontend', thefrontend: 'crew-frontend', crewfrontend: 'crew-frontend',\n main: 'crew-main', crewmain: 'crew-main',\n security: 'crew-security', crewsecurity: 'crew-security',\n pm: 'crew-pm', crewpm: 'crew-pm',\n copywriter: 'crew-copywriter', crewcopywriter: 'crew-copywriter',\n };\n return aliases[lower] || (raw.startsWith('crew-') ? raw : undefined);\n }\n\n private getJsonRepairModel(): string | undefined {\n const explicit = String(process.env.CREW_JSON_REPAIR_MODEL || '').trim();\n if (explicit) return explicit;\n if (process.env.GROQ_API_KEY) return 'llama-3.3-70b-versatile';\n if (process.env.XAI_API_KEY) return 'grok-4-1-fast-reasoning';\n if (process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY) return 'gemini-2.5-flash';\n if (process.env.DEEPSEEK_API_KEY) return 'deepseek-chat';\n return undefined;\n }\n\n private async parseRouteJson(raw: string, fallbackTask: string): Promise<RouteResult | null> {\n try {\n const parsed = await parseJsonObjectWithRepair(raw, {\n label: 'Route decision',\n schemaHint: '{\"decision\":\"CHAT|CODE|DISPATCH|SKILL\",\"agent\":\"crew-coder\",\"task\":\"...\",\"response\":\"...\"}',\n repair: async (repairPrompt: string) => {\n const res = await this.localExecutor.execute(repairPrompt, {\n model: this.getJsonRepairModel(),\n temperature: 0,\n maxTokens: 500\n });\n return String(res.result || '');\n }\n });\n const decision = String(parsed.decision || '').toUpperCase();\n if (!Object.values(RouteDecision).includes(decision as RouteDecision)) return null;\n return {\n decision: decision as RouteDecision,\n agent: parsed.agent || undefined,\n task: parsed.task || fallbackTask,\n response: parsed.response || undefined,\n explanation: parsed.explanation || 'LLM-based routing'\n };\n } catch {\n return null;\n }\n }\n\n private async routeWithLLM(input: string): Promise<RouteResult | null> {\n // Read routing priority from env (default: grok,gemini,deepseek)\n const routingOrder = (process.env.CREW_ROUTING_ORDER || 'grok,gemini,deepseek')\n .toLowerCase()\n .split(',')\n .map(s => s.trim());\n \n for (const provider of routingOrder) {\n let result: RouteResult | null = null;\n \n switch (provider) {\n case 'grok':\n case 'xai':\n result = await this.routeWithGrok(input);\n break;\n case 'gemini':\n const geminiKey = process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY;\n if (geminiKey) {\n result = await this.routeWithGemini(input, geminiKey);\n } else {\n const adcToken = await this.getGeminiADCToken();\n if (adcToken) {\n result = await this.routeWithGemini(input, adcToken);\n }\n }\n break;\n case 'deepseek':\n result = await this.routeWithDeepSeek(input);\n break;\n case 'groq':\n if (process.env.GROQ_ROUTING_ENABLED === 'true') {\n result = await this.routeWithGroq(input);\n }\n break;\n }\n \n if (result) return result;\n }\n \n return null; // Use fallback heuristic routing\n }\n\n private async routeWithGrok(input: string): Promise<RouteResult | null> {\n const key = process.env.XAI_API_KEY;\n if (!key) return null;\n\n try {\n const response = await fetch('https://api.x.ai/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${key}`\n },\n body: JSON.stringify({\n model: 'grok-beta',\n messages: [\n {\n role: 'system',\n content: ROUTING_SYSTEM_PROMPT\n },\n {\n role: 'user',\n content: input\n }\n ],\n temperature: 0.3\n })\n });\n\n if (!response.ok) return null;\n\n const data = await response.json() as any;\n const content = data?.choices?.[0]?.message?.content;\n if (!content) return null;\n\n const routed = await this.parseRouteJson(content, input);\n if (!routed) return null;\n routed.explanation = routed.explanation || 'Grok routing';\n return routed;\n } catch {\n return null;\n }\n }\n\n private async routeWithDeepSeek(input: string): Promise<RouteResult | null> {\n const key = process.env.DEEPSEEK_API_KEY;\n if (!key) return null;\n\n try {\n const response = await fetch('https://api.deepseek.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${key}`\n },\n body: JSON.stringify({\n model: 'deepseek-chat',\n messages: [\n {\n role: 'system',\n content: ROUTING_SYSTEM_PROMPT\n },\n {\n role: 'user',\n content: input\n }\n ],\n temperature: 0.3\n })\n });\n\n if (!response.ok) return null;\n\n const data = await response.json() as any;\n const content = data?.choices?.[0]?.message?.content;\n if (!content) return null;\n\n const routed = await this.parseRouteJson(content, input);\n if (!routed) return null;\n routed.explanation = routed.explanation || 'DeepSeek routing';\n return routed;\n } catch {\n return null;\n }\n }\n\n private async routeWithGroq(input: string): Promise<RouteResult | null> {\n const key = process.env.GROQ_API_KEY;\n if (!key) return null;\n\n try {\n const response = await fetch('https://api.groq.com/openai/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${key}`\n },\n body: JSON.stringify({\n model: 'llama-3.3-70b-versatile',\n messages: [\n {\n role: 'system',\n content: ROUTING_SYSTEM_PROMPT\n },\n {\n role: 'user',\n content: input\n }\n ],\n temperature: 0.3\n })\n });\n\n if (!response.ok) return null;\n\n const data = await response.json() as any;\n const content = data?.choices?.[0]?.message?.content;\n if (!content) return null;\n\n const routed = await this.parseRouteJson(content, input);\n if (!routed) return null;\n routed.explanation = routed.explanation || 'LLM-based routing';\n return routed;\n } catch {\n return null;\n }\n }\n\n private async routeWithGemini(input: string, apiKey: string): Promise<RouteResult | null> {\n try {\n const response = await fetch('https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=' + encodeURIComponent(apiKey), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n contents: [{\n parts: [{\n text: `${ROUTING_SYSTEM_PROMPT}\\n\\nUser request: ${input}`\n }]\n }],\n generationConfig: {\n temperature: 0,\n maxOutputTokens: 500\n }\n })\n });\n\n if (!response.ok) return null;\n const data = await response.json() as any;\n const content = data?.candidates?.[0]?.content?.parts?.[0]?.text;\n if (!content) return null;\n\n const routed = await this.parseRouteJson(content, input);\n if (!routed) return null;\n routed.explanation = routed.explanation || 'Routed via Gemini 2.0 Flash (2M context)';\n return routed;\n } catch {\n return null;\n }\n }\n\n private async logRoutingDecision(input: string, result: RouteResult) {\n await this.session.appendRouting({\n input,\n decision: result.decision,\n agent: result.agent,\n explanation: result.explanation\n });\n }\n\n /**\n * Tracks cost for a given model and token counts.\n */\n async trackCost(model: string, promptTokens: number, completionTokens: number) {\n // Simple cost estimation (can be expanded with model-specific pricing)\n const costPerMillion = 1.0; // placeholder: $1.00 per 1M tokens\n const usd = ((promptTokens + completionTokens) / 1_000_000) * costPerMillion;\n \n await this.session.trackCost({\n model,\n promptTokens,\n completionTokens,\n usd\n });\n }\n\n /**\n * Parses output for Aider-style SEARCH/REPLACE blocks.\n */\n /**\n * Execute a task locally without gateway (Tier 2 direct execution)\n */\n async executeLocally(task: string, options: { model?: string } = {}): Promise<any> {\n try {\n const result = await this.localExecutor.execute(task, {\n model: options.model,\n temperature: 0.7,\n maxTokens: 4000\n });\n\n return {\n success: result.success,\n result: result.result,\n model: result.model,\n promptTokens: result.promptTokens,\n completionTokens: result.completionTokens,\n costUsd: result.costUsd\n };\n } catch (err) {\n return {\n success: false,\n result: `Local execution failed: ${(err as Error).message}`,\n model: 'none',\n error: (err as Error).message\n };\n }\n }\n\n /**\n * Execute full unified L1->L2->L3 pipeline locally.\n */\n async executePipeline(\n task: string,\n context = '',\n sessionId = 'crew-cli',\n resume?: {\n fromPhase?: 'plan' | 'execute' | 'validate';\n priorPlan?: any;\n priorResponse?: string;\n priorExecutionResults?: any;\n },\n preClassifiedDecision?: 'direct-answer' | 'execute-parallel',\n directResponse?: string\n ): Promise<any> {\n const out = await this.pipeline.execute({\n userInput: task,\n context,\n sessionId,\n preClassifiedDecision,\n directResponse,\n resume\n });\n return {\n ...out,\n success: true,\n result: out.response,\n costUsd: out.totalCost,\n model: 'unified-pipeline'\n };\n }\n\n /**\n * Get current runtime profile configuration\n */\n getProfile() {\n return getProfileConfig(this.profile);\n }\n\n /**\n * Set runtime profile\n */\n setProfile(profile: RuntimeProfile) {\n this.profile = profile;\n }\n\n /**\n * Get execution trace for debugging\n */\n getTrace(traceId: string) {\n return this.pipeline.getTrace(traceId);\n }\n\n /**\n * Execute a task using the agentic executor with full file tools.\n * This is the primary execution path \u2014 single worker with THINK\u2192ACT\u2192OBSERVE loop\n * and 34+ tools (read_file, write_file, replace, bash, grep, etc.).\n * Equivalent to how Claude Code, Codex CLI, and Gemini CLI execute tasks.\n */\n async executeAgentic(\n task: string,\n options: {\n model?: string;\n onToolCall?: (name: string, params: Record<string, any>) => void;\n conversationContext?: string;\n sessionId?: string;\n verbose?: boolean;\n } = {}\n ): Promise<any> {\n try {\n const fullTask = options.conversationContext\n ? `## Recent conversation context\\n${options.conversationContext}\\n\\n## Current task\\n${task}`\n : task;\n\n const result = await this.pipeline.execute({\n userInput: fullTask,\n sessionId: options.sessionId || 'crew-cli',\n context: options.conversationContext\n });\n\n return {\n success: result.phase === 'complete',\n result: result.response,\n response: result.response,\n model: options.model || process.env.CREW_EXECUTION_MODEL || 'gemini-2.5-flash',\n turns: result.executionResults?.results?.length || 0,\n toolsUsed: Array.from(new Set((result.executionResults?.results || []).flatMap(r => r.toolsUsed || []))),\n costUsd: result.totalCost || 0,\n totalCost: result.totalCost || 0,\n plan: result.plan,\n traceId: result.traceId,\n timeline: result.timeline,\n executionPath: result.executionPath\n };\n } catch (err) {\n return {\n success: false,\n result: `Agentic execution failed: ${(err as Error).message}`,\n response: `Agentic execution failed: ${(err as Error).message}`,\n model: options.model || process.env.CREW_EXECUTION_MODEL || 'gemini-2.5-flash',\n error: (err as Error).message\n };\n }\n }\n\n async parseAndApplyToSandbox(agentOutput: string): Promise<string[]> {\n const lines = agentOutput.split('\\n');\n const changedFiles: string[] = [];\n\n // First parse @@WRITE_FILE/@@MKDIR/write: syntax commands.\n try {\n const { parseDirectFileCommands, parseWriteSyntax, executeDirectCommands } = await import('../cli/file-commands.js');\n const directCommands = [\n ...parseDirectFileCommands(agentOutput),\n ...parseWriteSyntax(agentOutput)\n ];\n if (directCommands.length > 0) {\n const directChanged = await executeDirectCommands(directCommands, this.sandbox, this.logger);\n changedFiles.push(...directChanged);\n }\n } catch (err) {\n this.logger.error(`Direct command parsing failed: ${(err as Error).message}`);\n }\n \n let i = 0;\n while (i < lines.length) {\n const line = lines[i].trim();\n \n // Support @@WRITE_FILE format (CrewSwarm tool syntax)\n if (line.startsWith('@@WRITE_FILE')) {\n const filePath = line.replace('@@WRITE_FILE', '').trim();\n let blockContent = '';\n let j = i + 1;\n \n while (j < lines.length && !lines[j].trim().startsWith('@@END_FILE')) {\n blockContent += lines[j] + '\\n';\n j++;\n }\n \n if (blockContent.trim().length > 0) {\n await this.sandbox.addChange(filePath, blockContent.trimEnd() + '\\n');\n changedFiles.push(filePath);\n }\n \n i = j + 1; // Skip past @@END_FILE\n }\n // Support \"FILE: path/to/file\" or \"File: path/to/file\"\n else if (line.toLowerCase().startsWith('file:')) {\n const filePath = line.split(':')[1].trim();\n let blockContent = '';\n let j = i + 1;\n \n while (j < lines.length && !lines[j].trim().toLowerCase().startsWith('file:') && !lines[j].trim().startsWith('@@WRITE_FILE')) {\n blockContent += lines[j] + '\\n';\n j++;\n }\n\n if (blockContent.includes('<<<<<< SEARCH')) {\n try {\n this.logger.info(`Detected edit block for ${filePath}`);\n \n let originalContent = '';\n try {\n originalContent = await readFile(filePath, 'utf8');\n } catch {\n originalContent = '';\n }\n const modifiedContent = this.extractBlocksAndApply(blockContent, originalContent);\n await this.sandbox.addChange(filePath, modifiedContent);\n changedFiles.push(filePath);\n } catch (err) {\n this.logger.error(`Error parsing blocks for ${filePath}: ${(err as Error).message}`);\n }\n } else if (blockContent.trim().length > 0) {\n // Whole-file fallback: if a FILE block does not include edit markers, store as full rewrite.\n await this.sandbox.addChange(filePath, blockContent.trimEnd() + '\\n');\n changedFiles.push(filePath);\n }\n \n i = j;\n } else {\n i++;\n }\n }\n\n return Array.from(new Set(changedFiles));\n }\n\n private extractBlocksAndApply(blockContent: string, originalContent: string): string {\n // This uses the SearchReplaceStrategy logic\n const strategy = getStrategy('search-replace');\n return strategy.apply(originalContent, blockContent);\n }\n}\n", "/**\n * AgentKeeper \u2014 cross-tier persistent task memory.\n *\n * Stores planner decisions, worker outputs, and task results in a local\n * append-only JSONL store (`.crew/agentkeeper.jsonl`). Supports retrieval\n * of prior entries by task similarity so repeated tasks can reuse earlier\n * decomposition patterns. Compaction keeps the store bounded.\n */\n\nimport { appendFile, mkdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface MemoryEntry {\n id: string;\n runId: string;\n tier: 'planner' | 'worker' | 'orchestrator';\n task: string;\n result: string;\n structured?: {\n problem?: string;\n plan?: string[];\n edits?: Array<{ path?: string; summary?: string }>;\n validation?: { lintPassed?: boolean; testsPassed?: boolean; notes?: string };\n outcome?: string;\n };\n agent?: string;\n model?: string;\n metadata?: Record<string, unknown>;\n timestamp: string;\n}\n\nexport interface MemoryMatch {\n entry: MemoryEntry;\n score: number;\n}\n\nexport interface CompactionResult {\n entriesBefore: number;\n entriesAfter: number;\n bytesFreed: number;\n}\n\ninterface AgentKeeperOptions {\n storageDir?: string;\n maxEntries?: number;\n maxBytes?: number;\n maxAgeDays?: number;\n autoCompactEvery?: number;\n semanticDedupe?: boolean;\n dedupeThreshold?: number;\n}\n\ninterface RecallOptions {\n preferSuccessful?: boolean;\n pathHints?: string[];\n nowMs?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction tokenize(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9\\s_-]/g, ' ')\n .split(/\\s+/)\n .filter(t => t.length > 2)\n );\n}\n\nfunction similarity(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 || b.size === 0) return 0;\n let intersection = 0;\n for (const token of a) {\n if (b.has(token)) intersection++;\n }\n return intersection / Math.max(a.size, b.size);\n}\n\n// ---------------------------------------------------------------------------\n// AgentKeeper class\n// ---------------------------------------------------------------------------\n\nexport class AgentKeeper {\n private storePath: string;\n private maxEntries: number;\n private maxBytes: number;\n private maxAgeDays: number;\n private autoCompactEvery: number;\n private semanticDedupe: boolean;\n private dedupeThreshold: number;\n private writeCount = 0;\n\n constructor(baseDir: string, options: AgentKeeperOptions = {}) {\n const storageBase = options.storageDir || process.env.CREW_MEMORY_DIR || baseDir;\n this.storePath = join(storageBase, '.crew', 'agentkeeper.jsonl');\n this.maxEntries = options.maxEntries ?? 500;\n this.maxBytes = options.maxBytes ?? 2_000_000;\n this.maxAgeDays = options.maxAgeDays ?? 30;\n this.autoCompactEvery = options.autoCompactEvery ?? 20;\n this.semanticDedupe = options.semanticDedupe ?? true;\n this.dedupeThreshold = options.dedupeThreshold ?? 0.9;\n }\n\n private redactText(input: string): string {\n let out = String(input || '');\n const replacements: Array<[RegExp, string]> = [\n [/\\bsk-[A-Za-z0-9]{16,}\\b/g, '[REDACTED_API_KEY]'],\n [/\\b(?:ghp|gho|ghu|ghs|github_pat)_[A-Za-z0-9_]{16,}\\b/g, '[REDACTED_GITHUB_TOKEN]'],\n [/\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi, '[REDACTED_EMAIL]'],\n [/\\beyJ[A-Za-z0-9_\\-]{8,}\\.[A-Za-z0-9_\\-]{8,}\\.[A-Za-z0-9_\\-]{8,}\\b/g, '[REDACTED_JWT]'],\n [/\\b[A-Fa-f0-9]{40,}\\b/g, '[REDACTED_HEX_TOKEN]'],\n [/\\b[A-Za-z0-9+/]{80,}={0,2}\\b/g, '[REDACTED_BASE64_BLOB]']\n ];\n for (const [rx, replacement] of replacements) {\n out = out.replace(rx, replacement);\n }\n return out;\n }\n\n private sanitizeText(input: string, maxChars = 6000): string {\n const redacted = this.redactText(String(input || ''));\n if (redacted.length <= maxChars) return redacted;\n return `${redacted.slice(0, maxChars)}\\n... [truncated ${redacted.length - maxChars} chars]`;\n }\n\n private sanitizeMetadata(value: unknown, depth = 0): unknown {\n if (depth > 3) return '[TRUNCATED_DEPTH]';\n if (value === null || value === undefined) return value;\n if (typeof value === 'string') return this.sanitizeText(value, 1000);\n if (typeof value === 'number' || typeof value === 'boolean') return value;\n if (Array.isArray(value)) return value.slice(0, 50).map(item => this.sanitizeMetadata(item, depth + 1));\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>).slice(0, 100)) {\n out[k] = this.sanitizeMetadata(v, depth + 1);\n }\n return out;\n }\n return String(value);\n }\n\n private normalizeStructured(structured: MemoryEntry['structured']): MemoryEntry['structured'] | undefined {\n if (!structured) return undefined;\n const out: NonNullable<MemoryEntry['structured']> = {};\n if (structured.problem) out.problem = this.sanitizeText(structured.problem, 1200);\n if (Array.isArray(structured.plan)) {\n out.plan = structured.plan.slice(0, 50).map(step => this.sanitizeText(step, 300));\n }\n if (Array.isArray(structured.edits)) {\n out.edits = structured.edits.slice(0, 100).map(edit => ({\n path: edit.path ? this.sanitizeText(edit.path, 300) : undefined,\n summary: edit.summary ? this.sanitizeText(edit.summary, 300) : undefined\n }));\n }\n if (structured.validation) {\n out.validation = {\n lintPassed: Boolean(structured.validation.lintPassed),\n testsPassed: Boolean(structured.validation.testsPassed),\n notes: structured.validation.notes ? this.sanitizeText(structured.validation.notes, 600) : undefined\n };\n }\n if (structured.outcome) out.outcome = this.sanitizeText(structured.outcome, 600);\n return out;\n }\n\n private estimateStoreBytes(entries: MemoryEntry[]): number {\n return entries.reduce((sum, entry) => sum + Buffer.byteLength(JSON.stringify(entry) + '\\n', 'utf8'), 0);\n }\n\n private pruneEntries(entries: MemoryEntry[]): MemoryEntry[] {\n const now = Date.now();\n const maxAgeMs = Math.max(1, this.maxAgeDays) * 24 * 60 * 60 * 1000;\n let kept = entries.filter(entry => {\n const ts = Date.parse(entry.timestamp || '');\n if (!Number.isFinite(ts)) return true;\n return now - ts <= maxAgeMs;\n });\n\n if (kept.length > this.maxEntries) {\n kept = kept.slice(-this.maxEntries);\n }\n\n while (kept.length > 1 && this.estimateStoreBytes(kept) > this.maxBytes) {\n kept = kept.slice(1);\n }\n\n return kept;\n }\n\n private dedupeSemantically(entries: MemoryEntry[]): MemoryEntry[] {\n if (!this.semanticDedupe || entries.length < 2) return entries;\n\n const keptNewestFirst: MemoryEntry[] = [];\n const keptTokens: Array<Set<string>> = [];\n const descending = entries.slice().reverse();\n\n for (const entry of descending) {\n const entryText = `${entry.task || ''}\\n${String(entry.result || '').slice(0, 1200)}`;\n const entryTokenSet = tokenize(entryText);\n if (entryTokenSet.size < 6) {\n keptNewestFirst.push(entry);\n keptTokens.push(entryTokenSet);\n continue;\n }\n let duplicate = false;\n\n for (let i = 0; i < keptNewestFirst.length; i += 1) {\n const existing = keptNewestFirst[i];\n if (existing.tier !== entry.tier) continue;\n if ((existing.agent || '') !== (entry.agent || '')) continue;\n if (keptTokens[i].size < 6) continue;\n const sim = similarity(entryTokenSet, keptTokens[i]);\n if (sim >= this.dedupeThreshold) {\n duplicate = true;\n break;\n }\n }\n\n if (!duplicate) {\n keptNewestFirst.push(entry);\n keptTokens.push(entryTokenSet);\n }\n }\n\n return keptNewestFirst.reverse();\n }\n\n private async maybeAutoCompact(): Promise<void> {\n this.writeCount += 1;\n if (this.writeCount % this.autoCompactEvery !== 0) return;\n try {\n await this.compact();\n } catch {\n // Never fail runtime flows due to maintenance compaction.\n }\n }\n\n /** Append a new memory entry. */\n async record(entry: Omit<MemoryEntry, 'id' | 'timestamp'>): Promise<MemoryEntry> {\n await mkdir(dirname(this.storePath), { recursive: true });\n const full: MemoryEntry = {\n ...entry,\n id: randomUUID(),\n task: this.sanitizeText(entry.task, 1200),\n result: this.sanitizeText(entry.result, 6000),\n structured: this.normalizeStructured(entry.structured),\n metadata: this.sanitizeMetadata(entry.metadata) as Record<string, unknown> | undefined,\n timestamp: new Date().toISOString()\n };\n const line = JSON.stringify(full) + '\\n';\n await appendFile(this.storePath, line, 'utf8');\n await this.maybeAutoCompact();\n return full;\n }\n\n /** Best-effort append: never throws, returns success state. */\n async recordSafe(entry: Omit<MemoryEntry, 'id' | 'timestamp'>): Promise<{ ok: boolean; entry?: MemoryEntry; error?: string }> {\n try {\n const saved = await this.record(entry);\n return { ok: true, entry: saved };\n } catch (error) {\n return { ok: false, error: (error as Error).message };\n }\n }\n\n /** Load all entries from the JSONL store. */\n async loadAll(): Promise<MemoryEntry[]> {\n let raw: string;\n try {\n raw = await readFile(this.storePath, 'utf8');\n } catch {\n return [];\n }\n const entries: MemoryEntry[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n entries.push(JSON.parse(line));\n } catch {\n // skip malformed lines\n }\n }\n return entries;\n }\n\n /**\n * Retrieve entries similar to the given task description.\n * Returns up to `maxResults` matches sorted by similarity score descending.\n */\n async recall(task: string, maxResults = 5, options: RecallOptions = {}): Promise<MemoryMatch[]> {\n const entries = await this.loadAll();\n if (entries.length === 0) return [];\n\n const queryTokens = tokenize(task);\n const now = options.nowMs || Date.now();\n const hints = new Set((options.pathHints || []).map(x => String(x || '').trim()).filter(Boolean));\n const scored: MemoryMatch[] = [];\n\n for (const entry of entries) {\n const entryTokens = tokenize(entry.task);\n const sim = similarity(queryTokens, entryTokens);\n\n let recencyBoost = 0;\n const ts = Date.parse(entry.timestamp || '');\n if (Number.isFinite(ts)) {\n const ageDays = Math.max(0, (now - ts) / (24 * 60 * 60 * 1000));\n recencyBoost = Math.max(0, 1 - Math.min(ageDays, 30) / 30) * 0.15;\n }\n\n let successBoost = 0;\n const success = Boolean((entry.metadata as any)?.success)\n || Boolean(entry.structured?.outcome?.toLowerCase().includes('success'));\n if (options.preferSuccessful !== false && success) {\n successBoost = 0.1;\n }\n\n let pathBoost = 0;\n if (hints.size > 0) {\n const entryPaths = new Set<string>();\n for (const edit of entry.structured?.edits || []) {\n if (edit.path) entryPaths.add(edit.path);\n }\n const metadataPaths = (entry.metadata as any)?.paths;\n if (Array.isArray(metadataPaths)) {\n for (const p of metadataPaths) {\n entryPaths.add(String(p || ''));\n }\n }\n let overlap = 0;\n for (const h of hints) {\n if (entryPaths.has(h)) overlap += 1;\n }\n if (overlap > 0) {\n pathBoost = Math.min(0.2, overlap / Math.max(1, hints.size) * 0.2);\n }\n }\n\n const score = sim + recencyBoost + successBoost + pathBoost;\n if (score > 0.15) {\n scored.push({ entry, score: Math.round(score * 100) / 100 });\n }\n }\n\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, maxResults);\n }\n\n /**\n * Format recalled memories into a context block for prompt injection.\n * Recent entries shown full, older entries compressed (progressive disclosure pattern).\n */\n async recallAsContext(task: string, maxResults = 3, options: RecallOptions = {}): Promise<string> {\n const matches = await this.recall(task, maxResults, options);\n if (matches.length === 0) return '';\n\n const lines = ['## Prior Task Memory'];\n const keepFullCount = Math.min(5, Math.ceil(matches.length * 0.5)); // Keep top 50% full\n \n for (let i = 0; i < matches.length; i++) {\n const m = matches[i];\n const isFull = i < keepFullCount;\n \n // Full version for recent/high-scoring entries\n if (isFull) {\n const resultPreview = m.entry.result.length > 400\n ? m.entry.result.slice(0, 400) + '...'\n : m.entry.result;\n lines.push(`### [${m.entry.tier}] ${m.entry.task} (score: ${m.score})`);\n if (m.entry.agent) lines.push(`Agent: ${m.entry.agent}`);\n lines.push(`Result: ${resultPreview}`);\n lines.push('');\n } else {\n // Compressed version for older/lower-scoring entries\n const hasError = /error|failed|exception/i.test(m.entry.result);\n const statusIcon = hasError ? '\u274C' : '\u2713';\n const preview = m.entry.result.slice(0, 120);\n lines.push(`### ${statusIcon} [${m.entry.tier}] ${m.entry.task}`);\n lines.push(`${preview}... [${hasError ? 'failed' : 'completed'}]`);\n lines.push('');\n }\n }\n return lines.join('\\n');\n }\n\n /**\n * Compact the store: keep only the most recent `maxEntries` entries.\n */\n async compact(): Promise<CompactionResult> {\n const entries = await this.loadAll();\n const entriesBefore = entries.length;\n\n let bytesBefore = 0;\n try {\n const st = await stat(this.storePath);\n bytesBefore = st.size;\n } catch {\n bytesBefore = 0;\n }\n\n const deduped = this.dedupeSemantically(entries);\n const kept = this.pruneEntries(deduped);\n if (kept.length === entries.length) {\n return { entriesBefore, entriesAfter: kept.length, bytesFreed: 0 };\n }\n const content = kept.map(e => JSON.stringify(e)).join('\\n') + '\\n';\n await writeFile(this.storePath, content, 'utf8');\n\n let bytesAfter = 0;\n try {\n const st = await stat(this.storePath);\n bytesAfter = st.size;\n } catch {\n bytesAfter = content.length;\n }\n\n return {\n entriesBefore,\n entriesAfter: kept.length,\n bytesFreed: Math.max(0, bytesBefore - bytesAfter)\n };\n }\n\n /** Get summary stats. */\n async stats(): Promise<{ entries: number; byTier: Record<string, number>; byAgent: Record<string, number>; bytes: number }> {\n const entries = await this.loadAll();\n const byTier: Record<string, number> = {};\n const byAgent: Record<string, number> = {};\n for (const e of entries) {\n byTier[e.tier] = (byTier[e.tier] || 0) + 1;\n if (e.agent) byAgent[e.agent] = (byAgent[e.agent] || 0) + 1;\n }\n return { entries: entries.length, byTier, byAgent, bytes: this.estimateStoreBytes(entries) };\n }\n}\n", "// @ts-nocheck\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { AgentRouter } from '../agent/router.js';\nimport { Orchestrator } from '../orchestrator/index.js';\nimport { Sandbox } from '../sandbox/index.js';\nimport { SessionManager } from '../session/manager.js';\n\nconst execAsync = promisify(exec);\n\nexport interface CheckRunResult {\n success: boolean;\n command: string;\n stdout: string;\n stderr: string;\n}\n\nexport async function runCheckCommand(command: string, cwd = process.cwd()): Promise<CheckRunResult> {\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd,\n maxBuffer: 1024 * 1024 * 4\n });\n return {\n success: true,\n command,\n stdout: String(stdout || ''),\n stderr: String(stderr || '')\n };\n } catch (error) {\n return {\n success: false,\n command,\n stdout: String(error?.stdout || ''),\n stderr: String(error?.stderr || error?.message || '')\n };\n }\n}\n\nexport interface CiFixOptions {\n command: string;\n maxAttempts: number;\n cwd?: string;\n router: AgentRouter;\n orchestrator: Orchestrator;\n sandbox: Sandbox;\n session: SessionManager;\n}\n\nexport async function runCiFixLoop(options: CiFixOptions) {\n const cwd = options.cwd || process.cwd();\n const attempts = Math.max(1, options.maxAttempts || 3);\n const runHistory: Array<{ attempt: number; success: boolean; stderr: string }> = [];\n\n for (let attempt = 1; attempt <= attempts; attempt++) {\n const checkResult = await runCheckCommand(options.command, cwd);\n runHistory.push({\n attempt,\n success: checkResult.success,\n stderr: checkResult.stderr\n });\n\n if (checkResult.success) {\n return {\n success: true,\n attemptsUsed: attempt,\n history: runHistory\n };\n }\n\n const task = [\n `CI check failed on attempt ${attempt}/${attempts}.`,\n `Command: ${options.command}`,\n 'Please return concrete file edits in FILE: path + SEARCH/REPLACE or full content blocks.',\n '',\n 'STDOUT:',\n checkResult.stdout.slice(0, 6000),\n '',\n 'STDERR:',\n checkResult.stderr.slice(0, 6000)\n ].join('\\n');\n\n const fixResult = await options.router.dispatch('crew-fixer', task, {\n sessionId: await options.session.getSessionId(),\n project: cwd\n });\n\n await options.orchestrator.parseAndApplyToSandbox(String(fixResult.result || ''));\n if (options.sandbox.hasChanges()) {\n await options.sandbox.apply();\n }\n }\n\n return {\n success: false,\n attemptsUsed: attempts,\n history: runHistory\n };\n}\n", "/**\n * Blast Radius Analysis \u2014 safe refactoring guard.\n *\n * Uses the repository dependency graph + git diff to compute which files and\n * symbols are affected by a set of changes, and assigns a risk score.\n */\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { relative, resolve } from 'node:path';\nimport { buildRepositoryGraph, type RepositoryGraph, type RepositoryGraphNode } from '../mapping/index.js';\n\nconst execFileAsync = promisify(execFile);\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type RiskLevel = 'low' | 'medium' | 'high';\n\nexport interface AffectedFile {\n /** Relative path of the affected file */\n path: string;\n /** How it is affected: directly changed, or transitively impacted */\n relation: 'changed' | 'direct-importer' | 'transitive-importer';\n /** Depth from the changed file (0 = changed, 1 = direct importer, \u2026) */\n depth: number;\n}\n\nexport interface BlastRadiusReport {\n /** Changed files extracted from git diff */\n changedFiles: string[];\n /** All affected files (changed + importers, transitively) */\n affectedFiles: AffectedFile[];\n /** Total unique files impacted */\n impactCount: number;\n /** Risk level */\n risk: RiskLevel;\n /** Human-readable summary */\n summary: string;\n}\n\n// ---------------------------------------------------------------------------\n// Utility functions\n// ---------------------------------------------------------------------------\n\nfunction severityRank(level: RiskLevel): number {\n if (level === 'high') return 3;\n if (level === 'medium') return 2;\n return 1;\n}\n\nexport function isSeverityAtLeast(actual: RiskLevel, threshold: RiskLevel): boolean {\n return severityRank(actual) >= severityRank(threshold);\n}\n\n// ---------------------------------------------------------------------------\n// Git diff parsing\n// ---------------------------------------------------------------------------\n\nasync function getChangedFiles(cwd: string, diffRef?: string): Promise<string[]> {\n const args = diffRef\n ? ['diff', '--name-only', diffRef]\n : ['diff', '--name-only', 'HEAD'];\n\n try {\n const { stdout } = await execFileAsync('git', args, { cwd, maxBuffer: 1024 * 1024 });\n return stdout.trim().split('\\n').filter(Boolean);\n } catch {\n // Fallback: unstaged changes\n try {\n const { stdout } = await execFileAsync('git', ['diff', '--name-only'], { cwd, maxBuffer: 1024 * 1024 });\n return stdout.trim().split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Transitive impact traversal\n// ---------------------------------------------------------------------------\n\nfunction collectImporters(\n graph: RepositoryGraph,\n startFiles: Set<string>,\n maxDepth = 5\n): AffectedFile[] {\n const nodeByPath = new Map<string, RepositoryGraphNode>();\n for (const node of graph.nodes) {\n nodeByPath.set(node.path, node);\n }\n\n const visited = new Map<string, AffectedFile>();\n\n // Seed with changed files\n for (const file of startFiles) {\n visited.set(file, { path: file, relation: 'changed', depth: 0 });\n }\n\n // BFS through importedBy edges\n let frontier = new Set(startFiles);\n\n for (let depth = 1; depth <= maxDepth && frontier.size > 0; depth++) {\n const nextFrontier = new Set<string>();\n for (const file of frontier) {\n const node = nodeByPath.get(file);\n if (!node) continue;\n for (const importer of node.importedBy) {\n if (visited.has(importer)) continue;\n const relation: AffectedFile['relation'] = depth === 1 ? 'direct-importer' : 'transitive-importer';\n visited.set(importer, { path: importer, relation, depth });\n nextFrontier.add(importer);\n }\n }\n frontier = nextFrontier;\n }\n\n return Array.from(visited.values()).sort((a, b) => a.depth - b.depth || a.path.localeCompare(b.path));\n}\n\n// ---------------------------------------------------------------------------\n// Risk scoring\n// ---------------------------------------------------------------------------\n\nfunction assessRisk(changedCount: number, impactCount: number, totalNodes: number): RiskLevel {\n // For very small repos (<10 files), use absolute counts only\n if (totalNodes < 10) {\n if (impactCount > 8) return 'high';\n if (impactCount > 4) return 'medium';\n return 'low';\n }\n\n const impactRatio = totalNodes > 0 ? impactCount / totalNodes : 0;\n\n // High: >30% of codebase affected or >20 files impacted\n if (impactRatio > 0.3 || impactCount > 20) return 'high';\n // Medium: >10% or >8 files\n if (impactRatio > 0.1 || impactCount > 8) return 'medium';\n return 'low';\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function analyzeBlastRadius(\n cwd: string,\n options: { diffRef?: string; maxDepth?: number; changedFiles?: string[] } = {}\n): Promise<BlastRadiusReport> {\n const rootDir = resolve(cwd);\n const maxDepth = options.maxDepth ?? 5;\n\n // 1. Get changed files from git diff or explicit list\n let rawChanged = options.changedFiles ?? await getChangedFiles(rootDir, options.diffRef);\n\n // 2. Build repository dependency graph\n const graph = await buildRepositoryGraph(rootDir);\n\n // Normalize changed file paths to match graph paths (relative)\n const graphPaths = new Set(graph.nodes.map(n => n.path));\n const changedSet = new Set<string>();\n for (const file of rawChanged) {\n const rel = relative(rootDir, resolve(rootDir, file));\n if (graphPaths.has(rel)) changedSet.add(rel);\n }\n\n // 3. Traverse import graph for transitive impact\n const affectedFiles = collectImporters(graph, changedSet, maxDepth);\n const impactCount = affectedFiles.length;\n\n // 4. Assess risk\n const risk = assessRisk(changedSet.size, impactCount, graph.nodeCount);\n\n // 5. Build summary\n const changedList = Array.from(changedSet);\n const directImporters = affectedFiles.filter(f => f.relation === 'direct-importer').length;\n const transitiveImporters = affectedFiles.filter(f => f.relation === 'transitive-importer').length;\n\n const riskEmoji = { low: 'LOW', medium: 'MEDIUM', high: 'HIGH' }[risk];\n const lines = [\n `Blast Radius: ${riskEmoji}`,\n ` Changed files: ${changedSet.size}`,\n ` Direct importers: ${directImporters}`,\n ` Transitive importers: ${transitiveImporters}`,\n ` Total impacted: ${impactCount} / ${graph.nodeCount} source files`\n ];\n\n if (risk === 'high') {\n lines.push('', ' \u26A0 HIGH RISK \u2014 review affected files carefully before applying.');\n }\n\n return {\n changedFiles: changedList,\n affectedFiles,\n impactCount,\n risk,\n summary: lines.join('\\n')\n };\n}\n", "/**\n * Codebase RAG - Auto-load relevant files for LLM context\n * \n * Three modes:\n * 1. Keyword-based (fast, local, no cost)\n * 2. Import graph (smarter, local, no cost)\n * 3. Semantic (best, requires embeddings, ~$0.02 one-time)\n */\n\nimport { execSync } from 'node:child_process';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { relative, join } from 'node:path';\nimport { buildRepositoryGraph } from '../mapping/index.js';\nimport type { RepositoryGraph } from '../mapping/index.js';\n\nexport type RagMode = 'keyword' | 'import-graph' | 'semantic' | 'off';\n\nexport interface RagOptions {\n mode?: RagMode;\n tokenBudget?: number;\n maxFiles?: number;\n sessionHistory?: any[];\n cacheDir?: string;\n}\n\nexport interface RagResult {\n context: string;\n filesLoaded: string[];\n mode: RagMode;\n tokenEstimate: number;\n}\n\n/**\n * Extract keywords from user query\n */\nfunction extractKeywords(query: string): string[] {\n return (query\n .toLowerCase()\n .match(/\\b[a-z]{3,}\\b/g) || [])\n .filter(kw => !STOP_WORDS.has(kw));\n}\n\nconst STOP_WORDS = new Set([\n 'the', 'and', 'for', 'with', 'this', 'that', 'from', 'are', 'was', 'were',\n 'will', 'can', 'could', 'should', 'would', 'add', 'create', 'make', 'write',\n 'update', 'fix', 'change', 'modify', 'delete', 'remove', 'get', 'set'\n]);\n\n/**\n * Phase 1: Keyword-based file matching\n */\nasync function keywordBasedSearch(\n query: string,\n cwd: string,\n options: RagOptions\n): Promise<Array<{ file: string; score: number }>> {\n const keywords = extractKeywords(query);\n \n if (keywords.length === 0) return [];\n \n try {\n // Grep for files containing keywords\n const pattern = keywords.slice(0, 5).join('|');\n const stdout = execSync(\n `rg -l \"${pattern}\" --type-add 'code:*.{ts,js,tsx,jsx,py,go,rs,java}' -t code`,\n {\n cwd,\n encoding: 'utf8',\n maxBuffer: 1024 * 1024,\n stdio: ['pipe', 'pipe', 'ignore']\n }\n );\n \n const files = stdout.trim().split('\\n').filter(Boolean);\n \n // Score files by keyword density in filename\n return files.map(file => {\n let score = 0;\n const lowerFile = file.toLowerCase();\n \n for (const kw of keywords) {\n if (lowerFile.includes(kw)) score += 2;\n }\n \n // Boost recently accessed files\n for (const entry of options.sessionHistory || []) {\n if (entry.output?.includes(file)) score += 3;\n }\n \n return { file, score };\n });\n } catch (err) {\n // Grep failed or no matches\n return [];\n }\n}\n\n/**\n * Phase 2: Import graph expansion\n */\nasync function expandWithImports(\n files: string[],\n cwd: string,\n maxDepth: number = 1\n): Promise<Set<string>> {\n const expanded = new Set<string>(files);\n \n try {\n const graph = await buildRepositoryGraph(cwd);\n \n for (const file of files) {\n const node = graph.nodes.find(n => n.path === file || join(cwd, n.path) === file);\n \n if (node) {\n // Add direct imports\n for (const importPath of node.imports.slice(0, 5)) {\n expanded.add(importPath);\n }\n \n // Add what imports this file (reverse dependencies)\n for (const importedByPath of node.importedBy.slice(0, 3)) {\n expanded.add(importedByPath);\n }\n }\n }\n } catch (err) {\n // Graph building failed, return original files\n console.warn('[RAG] Import graph expansion failed:', err.message);\n }\n \n return expanded;\n}\n\n/**\n * Phase 3: Semantic search using embeddings\n */\ninterface EmbeddingEntry {\n file: string;\n embedding: number[];\n hash: string;\n}\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) return 0;\n \n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n \n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n \n return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));\n}\n\nasync function generateEmbedding(text: string): Promise<number[]> {\n // Check for OpenAI API key\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new Error('OPENAI_API_KEY not set - required for semantic RAG');\n }\n \n const response = await fetch('https://api.openai.com/v1/embeddings', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n model: 'text-embedding-3-small',\n input: text.slice(0, 8000) // Max ~8K chars\n })\n });\n \n if (!response.ok) {\n throw new Error(`Embedding API failed: ${response.statusText}`);\n }\n \n const data = await response.json();\n return data.data[0].embedding;\n}\n\nasync function loadEmbeddingsIndex(cacheDir: string): Promise<EmbeddingEntry[]> {\n const indexPath = join(cacheDir, 'embeddings.json');\n \n if (!existsSync(indexPath)) {\n return [];\n }\n \n try {\n const raw = await readFile(indexPath, 'utf8');\n return JSON.parse(raw);\n } catch {\n return [];\n }\n}\n\nasync function saveEmbeddingsIndex(\n cacheDir: string,\n embeddings: EmbeddingEntry[]\n): Promise<void> {\n const indexPath = join(cacheDir, 'embeddings.json');\n await mkdir(cacheDir, { recursive: true });\n await writeFile(indexPath, JSON.stringify(embeddings, null, 2), 'utf8');\n}\n\nasync function semanticSearch(\n query: string,\n cwd: string,\n options: RagOptions\n): Promise<Array<{ file: string; score: number }>> {\n const cacheDir = options.cacheDir || join(cwd, '.crew', 'rag-cache');\n \n // Load existing embeddings\n let embeddings = await loadEmbeddingsIndex(cacheDir);\n \n // If empty, need to build index first\n if (embeddings.length === 0) {\n console.log('[RAG] No embeddings index found. Building index...');\n console.log('[RAG] This is a one-time operation (~30s for 1K files)');\n \n try {\n // Find all code files\n const stdout = execSync(\n `rg --files --type-add 'code:*.{ts,js,tsx,jsx,py,go,rs,java}' -t code`,\n { cwd, encoding: 'utf8', maxBuffer: 1024 * 1024 }\n );\n \n const files = stdout.trim().split('\\n').filter(Boolean).slice(0, 1000); // Max 1K files\n \n console.log(`[RAG] Generating embeddings for ${files.length} files...`);\n \n // Generate embeddings (batched)\n const batchSize = 10;\n for (let i = 0; i < files.length; i += batchSize) {\n const batch = files.slice(i, i + batchSize);\n \n for (const file of batch) {\n try {\n const content = await readFile(join(cwd, file), 'utf8');\n const embedding = await generateEmbedding(content);\n embeddings.push({\n file,\n embedding,\n hash: '' // Could add content hash for staleness detection\n });\n } catch (err) {\n console.warn(`[RAG] Failed to embed ${file}:`, err.message);\n }\n }\n \n // Progress\n console.log(`[RAG] Progress: ${Math.min(i + batchSize, files.length)}/${files.length}`);\n }\n \n // Save index\n await saveEmbeddingsIndex(cacheDir, embeddings);\n console.log(`[RAG] Index saved to ${cacheDir}/embeddings.json`);\n } catch (err) {\n console.warn('[RAG] Failed to build embeddings index:', err.message);\n return [];\n }\n }\n \n // Generate query embedding\n const queryEmbedding = await generateEmbedding(query);\n \n // Compute similarities\n const scored = embeddings.map(entry => ({\n file: entry.file,\n score: cosineSimilarity(queryEmbedding, entry.embedding)\n }));\n \n scored.sort((a, b) => b.score - a.score);\n \n return scored;\n}\n\n/**\n * Main entry point - auto-load relevant files\n */\nexport async function autoLoadRelevantFiles(\n query: string,\n cwd: string,\n options: RagOptions = {}\n): Promise<RagResult> {\n const mode = options.mode || 'keyword';\n const tokenBudget = options.tokenBudget || 8000;\n const maxFiles = options.maxFiles || 10;\n \n if (mode === 'off') {\n return {\n context: '',\n filesLoaded: [],\n mode: 'off',\n tokenEstimate: 0\n };\n }\n \n let scoredFiles: Array<{ file: string; score: number }> = [];\n \n // Step 1: Get initial matches\n if (mode === 'semantic') {\n try {\n scoredFiles = await semanticSearch(query, cwd, options);\n } catch (err) {\n console.warn('[RAG] Semantic search failed, falling back to keyword:', err.message);\n scoredFiles = await keywordBasedSearch(query, cwd, options);\n }\n } else {\n scoredFiles = await keywordBasedSearch(query, cwd, options);\n }\n \n if (scoredFiles.length === 0) {\n return {\n context: '',\n filesLoaded: [],\n mode,\n tokenEstimate: 0\n };\n }\n \n // Step 2: Expand with imports (if mode is import-graph or semantic)\n let filesToLoad = scoredFiles.map(x => x.file);\n \n if (mode === 'import-graph' || mode === 'semantic') {\n const expanded = await expandWithImports(filesToLoad.slice(0, 5), cwd);\n filesToLoad = Array.from(expanded);\n }\n \n // Step 3: Load files within budget\n const loaded: string[] = [];\n let contextParts: string[] = [];\n let charsUsed = 0;\n const charBudget = tokenBudget * 4; // ~4 chars per token\n \n // Re-score expanded files (prioritize original matches)\n const originalSet = new Set(scoredFiles.slice(0, 10).map(x => x.file));\n const finalScored = filesToLoad.map(file => ({\n file,\n score: originalSet.has(file) ? 10 : 1\n }));\n \n finalScored.sort((a, b) => b.score - a.score);\n \n for (const { file } of finalScored.slice(0, maxFiles)) {\n try {\n const fullPath = join(cwd, file);\n const content = await readFile(fullPath, 'utf8');\n \n if (charsUsed + content.length > charBudget) {\n // Budget exceeded, stop loading\n break;\n }\n \n const relPath = relative(cwd, file);\n contextParts.push(`\\n=== ${relPath} ===\\n${content}`);\n loaded.push(relPath);\n charsUsed += content.length;\n } catch (err) {\n // File read failed, skip\n console.warn(`[RAG] Failed to read ${file}:`, err.message);\n }\n }\n \n if (loaded.length === 0) {\n return {\n context: '',\n filesLoaded: [],\n mode,\n tokenEstimate: 0\n };\n }\n \n const context = `## Relevant Codebase Context (${loaded.length} files loaded)\\n${contextParts.join('\\n\\n')}`;\n const tokenEstimate = Math.ceil(charsUsed / 4);\n \n return {\n context,\n filesLoaded: loaded,\n mode,\n tokenEstimate\n };\n}\n\n/**\n * Check if query should trigger RAG\n */\nexport function shouldUseRag(query: string): boolean {\n const lower = query.toLowerCase();\n \n // Execution intents\n const hasExecutionIntent = /\\b(implement|create|build|write|fix|refactor|modify|update|add|patch|test)\\b/.test(lower);\n \n // Code references\n const hasCodeReference = /\\/src\\/|\\.ts\\b|\\.js\\b|\\.tsx\\b|\\.py\\b|\\.go\\b/.test(query);\n \n // File operations\n const hasFileOperation = /\\b(file|function|class|component|endpoint|route|middleware)\\b/.test(lower);\n \n return hasExecutionIntent || hasCodeReference || hasFileOperation;\n}\n\n/**\n * Rebuild embeddings index (for semantic mode)\n */\nexport async function rebuildEmbeddingsIndex(\n cwd: string,\n cacheDir?: string\n): Promise<void> {\n const dir = cacheDir || join(cwd, '.crew', 'rag-cache');\n \n // Clear existing index\n const indexPath = join(dir, 'embeddings.json');\n if (existsSync(indexPath)) {\n await writeFile(indexPath, '[]', 'utf8');\n }\n \n // Trigger rebuild by running a semantic search\n await semanticSearch('rebuild index', cwd, { cacheDir: dir });\n}\n", "import chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\n/**\n * Dynamic CrewSwarm status dashboard\n * Shows REAL system information, not hardcoded values\n */\n\ninterface StatusInfo {\n online: boolean;\n activeAgents: number;\n queuedTasks: number;\n runningTasks: number;\n models: string[];\n gatewayUrl: string;\n version: string;\n}\n\nexport async function getSystemStatus(): Promise<StatusInfo> {\n const status: StatusInfo = {\n online: false,\n activeAgents: 0,\n queuedTasks: 0,\n runningTasks: 0,\n models: [],\n gatewayUrl: process.env.CREW_LEAD_URL || 'http://127.0.0.1:5010',\n version: '0.1.0-alpha'\n };\n\n // Check which API keys are available (relevant for standalone mode)\n const providers: string[] = [];\n if (process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY) providers.push('Gemini');\n if (process.env.GROQ_API_KEY) providers.push('Groq');\n if (process.env.XAI_API_KEY) providers.push('Grok');\n if (process.env.OPENAI_API_KEY) providers.push('OpenAI');\n if (process.env.ANTHROPIC_API_KEY) providers.push('Anthropic');\n if (process.env.DEEPSEEK_API_KEY) providers.push('DeepSeek');\n status.models = providers;\n status.online = providers.length > 0; // \"online\" if at least one provider is available\n\n // Check if gateway is reachable (optional, for connected mode)\n try {\n // Read auth token from ~/.crewswarm/config.json\n let authToken = '';\n try {\n const { readFileSync } = await import('node:fs');\n const { homedir } = await import('node:os');\n const cfg = JSON.parse(readFileSync(`${homedir()}/.crewswarm/config.json`, 'utf8'));\n authToken = cfg?.rt?.authToken || '';\n } catch { /* no config */ }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 800);\n const headers: Record<string, string> = {};\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n const statusCheck = await fetch(`${status.gatewayUrl}/status`, {\n signal: controller.signal,\n headers\n });\n clearTimeout(timeoutId);\n if (statusCheck.ok) {\n const data = await statusCheck.json() as any;\n status.activeAgents = Array.isArray(data.agents) ? data.agents.length : 1;\n }\n } catch {\n // Gateway not reachable \u2014 standalone mode only\n }\n\n return status;\n}\n\nexport function renderStatusDashboard(status: StatusInfo): string {\n const { online, activeAgents, models } = status;\n \n // Colors\n const border = chalk.cyan;\n const label = chalk.gray;\n const value = chalk.white.bold;\n const accent = chalk.blue;\n\n // Provider status bar\n const providerCount = models.length;\n const maxProviders = 6;\n const filled = Math.min(10, Math.floor((providerCount / maxProviders) * 10));\n const empty = 10 - filled;\n const progressBar = chalk.green('\u2588'.repeat(filled)) + chalk.gray('\u2591'.repeat(empty));\n\n const statusText = online ? chalk.green('READY') : chalk.red('NO API KEYS');\n const gatewayText = activeAgents > 0 \n ? chalk.green(`CONNECTED`) + chalk.gray(` (${activeAgents} agents)`)\n : chalk.gray('STANDALONE');\n const modelStack = models.length > 0 ? models.join(' / ') : chalk.red('None \u2014 add API keys');\n\n const lines = [\n border('\u250C\u2500[ CREW-CLI :: AGENTIC CODING ENGINE ]\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510'),\n '',\n ` ${label('STATUS')} : ${statusText}`,\n ` ${label('MODE')} : ${gatewayText}`,\n ` ${label('PROVIDERS')} : ${value(modelStack)}`,\n '',\n ` ${accent('Provider Coverage')}: ${progressBar} ${providerCount}/${maxProviders}`,\n '',\n ` ${chalk.italic.gray('\"One idea. One Build. One Crew.\"')}`,\n '',\n border('\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518')\n ];\n\n return lines.join('\\n');\n}\n\nexport async function displayStatus(): Promise<void> {\n const status = await getSystemStatus();\n console.log('\\n' + renderStatusDashboard(status) + '\\n');\n}\n", "/**\n * Model info for enhanced /model display\n * Benchmark scores from OpenRouter coding leaderboard (March 2026)\n */\n\nexport interface ModelInfo {\n name: string;\n provider: string;\n codingScore: number; // OpenRouter coding benchmark (0-100)\n inputCost: number; // $/1M input tokens\n outputCost: number; // $/1M output tokens\n contextWindow: string; // human-readable\n tier: 'heavy' | 'standard' | 'fast';\n note?: string;\n}\n\nexport const MODEL_CATALOG: ModelInfo[] = [\n // Heavy tier \u2014 L2 brain\n { name: 'gpt-5.4', provider: 'OpenAI', codingScore: 57.3, inputCost: 3.00, outputCost: 15.00, contextWindow: '128K', tier: 'heavy', note: '#1 coding' },\n { name: 'gemini-3.1-pro', provider: 'Google', codingScore: 55.5, inputCost: 2.00, outputCost: 12.00, contextWindow: '200K', tier: 'heavy', note: '#2 coding' },\n { name: 'gpt-5.3-codex', provider: 'OpenAI', codingScore: 53.1, inputCost: 3.00, outputCost: 15.00, contextWindow: '128K', tier: 'heavy' },\n { name: 'claude-sonnet-4.6', provider: 'Anthropic', codingScore: 50.9, inputCost: 3.00, outputCost: 15.00, contextWindow: '200K', tier: 'heavy' },\n { name: 'claude-opus-4.6', provider: 'Anthropic', codingScore: 48.1, inputCost: 3.00, outputCost: 15.00, contextWindow: '200K', tier: 'heavy' },\n { name: 'grok-4.20-beta', provider: 'xAI', codingScore: 42.2, inputCost: 2.00, outputCost: 6.00, contextWindow: '2M', tier: 'heavy', note: '2M context' },\n { name: 'grok-4', provider: 'xAI', codingScore: 40.5, inputCost: 3.00, outputCost: 15.00, contextWindow: '256K', tier: 'heavy' },\n\n // Standard tier \u2014 L3 workers\n { name: 'gemini-2.5-pro', provider: 'Google', codingScore: 46.7, inputCost: 1.25, outputCost: 10.00, contextWindow: '1M', tier: 'standard' },\n { name: 'gemini-3-pro', provider: 'Google', codingScore: 46.5, inputCost: 2.00, outputCost: 12.00, contextWindow: '200K', tier: 'standard' },\n { name: 'glm-5', provider: 'Z-AI', codingScore: 44.2, inputCost: 0.50, outputCost: 2.00, contextWindow: '128K', tier: 'standard' },\n { name: 'gemini-3-flash', provider: 'Google', codingScore: 42.6, inputCost: 0.50, outputCost: 3.00, contextWindow: '1M', tier: 'standard' },\n { name: 'minimax-m2.7', provider: 'MiniMax', codingScore: 41.9, inputCost: 0.30, outputCost: 1.00, contextWindow: '128K', tier: 'standard' },\n { name: 'qwen3.5-397b', provider: 'Qwen', codingScore: 41.3, inputCost: 0.30, outputCost: 0.90, contextWindow: '128K', tier: 'standard' },\n { name: 'gemini-2.5-flash', provider: 'Google', codingScore: 38.0, inputCost: 0.30, outputCost: 2.50, contextWindow: '1M', tier: 'standard', note: 'free tier' },\n { name: 'kimi-k2.5', provider: 'Moonshot', codingScore: 39.5, inputCost: 0.60, outputCost: 2.00, contextWindow: '128K', tier: 'standard' },\n { name: 'deepseek-v3.2', provider: 'DeepSeek', codingScore: 36.0, inputCost: 0.28, outputCost: 0.42, contextWindow: '164K', tier: 'standard', note: 'cheapest' },\n\n // Fast tier \u2014 L1 routing\n { name: 'grok-4.1-fast', provider: 'xAI', codingScore: 35.0, inputCost: 0.20, outputCost: 0.50, contextWindow: '2M', tier: 'fast', note: '2M, $0.20/M' },\n { name: 'llama-3.3-70b', provider: 'Groq', codingScore: 28.0, inputCost: 0.075, outputCost: 0.30, contextWindow: '128K', tier: 'fast', note: 'free tier' },\n { name: 'gemini-2.5-flash-lite', provider: 'Google', codingScore: 25.0, inputCost: 0.10, outputCost: 0.40, contextWindow: '1M', tier: 'fast', note: 'cheapest' },\n];\n\nexport function findModelInfo(modelName: string): ModelInfo | undefined {\n const lower = modelName.toLowerCase();\n return MODEL_CATALOG.find(m => lower.includes(m.name.toLowerCase()) || m.name.toLowerCase().includes(lower));\n}\n\nexport function formatModelTable(models: ModelInfo[]): string {\n const header = ` ${'Model'.padEnd(24)} ${'Score'.padStart(5)} ${'In $/M'.padStart(7)} ${'Out $/M'.padStart(8)} ${'Context'.padStart(8)} ${'Note'.padEnd(14)}`;\n const sep = ` ${'\u2500'.repeat(24)} ${'\u2500'.repeat(5)} ${'\u2500'.repeat(7)} ${'\u2500'.repeat(8)} ${'\u2500'.repeat(8)} ${'\u2500'.repeat(14)}`;\n const rows = models.map(m => {\n const score = m.codingScore.toFixed(1).padStart(5);\n const inCost = `$${m.inputCost.toFixed(2)}`.padStart(7);\n const outCost = `$${m.outputCost.toFixed(2)}`.padStart(8);\n const ctx = m.contextWindow.padStart(8);\n const note = (m.note || '').padEnd(14);\n return ` ${m.name.padEnd(24)} ${score} ${inCost} ${outCost} ${ctx} ${note}`;\n });\n return [header, sep, ...rows].join('\\n');\n}\n", "import { AgentRouter } from '../agent/router.js';\nimport { Logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n// Lazy-loaded to avoid blocking bundle import (inquirer v9 uses top-level await)\nconst getInquirer = () => import('inquirer').then(m => m.default);\nimport { runPtyCommand } from '../pty/index.js';\nimport { platform, release } from 'node:os';\n\nexport interface ShellCopilotOptions {\n projectDir?: string;\n gateway?: string;\n model?: string;\n}\n\nexport async function runShellCopilot(\n request: string,\n router: AgentRouter,\n options: ShellCopilotOptions = {}\n): Promise<void> {\n const logger = new Logger();\n const projectDir = options.projectDir || process.cwd();\n \n const systemContext = `You are a shell command assistant (like GitHub Copilot CLI).\nThe user is on ${platform()} ${release()}.\nProvide a single valid shell command that answers the user's request.\nThen provide a brief explanation of the command.\nDO NOT EXECUTE ANY TOOLS. DO NOT RUN COMMANDS. Just output the text.\n\nFormat your output EXACTLY like this:\nCOMMAND:\n\\`\\`\\`bash\n<the exact shell command>\n\\`\\`\\`\n\nEXPLANATION:\n<brief explanation of what the command does, arguments, etc.>\n`;\n\n let currentRequest = request;\n \n while (true) {\n logger.info(`Translating request into shell command...`);\n \n let result;\n try {\n const fullTask = `${systemContext}\\n\\nUser Request: ${currentRequest}`;\n result = await router.dispatch('crew-main', fullTask, {\n project: projectDir,\n gateway: options.gateway,\n model: options.model,\n skipPreamble: true,\n injectGitContext: false,\n direct: true,\n bypass: true\n });\n } catch (err) {\n logger.error(`Failed to generate command: ${(err as Error).message}`);\n return;\n }\n\n const text = String(result.result || '');\n \n const commandMatch = text.match(/COMMAND:\\s*```(?:bash|sh)?\\s*([\\s\\S]*?)\\s*```/i) || text.match(/```(?:bash|sh)?\\s*([\\s\\S]*?)\\s*```/i);\n const explanationMatch = text.match(/EXPLANATION:\\s*([\\s\\S]*)/i);\n \n let command = commandMatch ? commandMatch[1].trim() : '';\n let explanation = explanationMatch ? explanationMatch[1].trim() : text.trim();\n \n if (!command) {\n // Fallback if formatting failed but it looks like a command\n const lines = text.split('\\n').filter(l => l.trim().length > 0);\n if (lines.length > 0 && !lines[0].includes(' ')) {\n command = lines[0];\n explanation = text;\n } else {\n logger.error('Could not parse a valid command from the response.');\n console.log(chalk.gray(text));\n return;\n }\n }\n\n console.log(chalk.blue('\\n--- Proposed Command ---'));\n console.log(chalk.green.bold(`> ${command}`));\n console.log(chalk.gray(`\\n${explanation}\\n`));\n\n const inquirer = await getInquirer();\n const { action } = await inquirer.prompt([{\n type: 'list',\n name: 'action',\n message: 'What would you like to do?',\n choices: [\n { name: 'Run this command', value: 'run' },\n { name: 'Revise query', value: 'revise' },\n { name: 'Cancel', value: 'cancel' }\n ]\n }]);\n\n if (action === 'cancel') {\n logger.info('Cancelled.');\n return;\n }\n\n if (action === 'revise') {\n const { newQuery } = await (await getInquirer()).prompt([{\n type: 'input',\n name: 'newQuery',\n message: 'Revise your query:',\n default: currentRequest\n }]);\n currentRequest = newQuery;\n continue; // loop back\n }\n\n if (action === 'run') {\n logger.info(`Executing: ${command}`);\n try {\n const ptyResult = await runPtyCommand(command, { cwd: projectDir });\n if (!ptyResult.success) {\n process.exit(ptyResult.exitCode || 1);\n }\n } catch (err) {\n logger.error(`Execution failed: ${(err as Error).message}`);\n }\n return;\n }\n }\n}\n", "#!/usr/bin/env node\n// @ts-nocheck\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { AgentRouter } from '../agent/router.js';\nimport { ToolManager } from '../tools/manager.js';\nimport { ConfigManager } from '../config/manager.js';\nimport { Logger } from '../utils/logger.js';\nimport { SessionManager } from '../session/manager.js';\nimport { Sandbox } from '../sandbox/index.js';\nimport { Orchestrator } from '../orchestrator/index.js';\nimport { TokenFinder } from '../auth/token-finder.js';\nimport { Planner } from '../planner/index.js';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport {\n compareVersions,\n getInstalledCliVersion,\n getLatestCliVersion,\n isGlobalInstallLinked,\n runDoctorChecks,\n summarizeDoctorResults\n} from '../diagnostics/doctor.js';\nimport { compareModelCosts, estimateCost, getCheapestAlternative } from '../cost/predictor.js';\nimport { CorrectionStore } from '../learning/corrections.js';\nimport { runEngine } from '../engines/index.js';\nimport { startWatchMode } from '../watch/index.js';\nimport { getBanner } from '../hello/index.js';\nimport { collectMultiRepoContext, detectBreakingApiSignals, findSiblingRepos, getRepoSummary, syncRepoSnapshots } from '../multirepo/index.js';\nimport { runCiFixLoop } from '../ci/index.js';\nimport { compareScreenshots, runBrowserDebug } from '../browser/index.js';\nimport { downloadTeamContext, getTeamSyncStatus, loadPrivacyControls, savePrivacyControls, uploadTeamContext } from '../team/index.js';\nimport { appendVoiceTranscript, recordAudio, speakWithSkill, transcribeAudio } from '../voice/listener.js';\nimport { buildFileContextBlock, buildImageContextBlock, buildRepoContextBlock, collectOption, enforceContextBudget, mergeTaskWithContext, readStdinText } from '../context/augment.js';\nimport { detectHighSeverityFindings, getReviewPayload } from '../review/index.js';\nimport { addMcpServer, doctorMcpServers, listMcpServers, removeMcpServer } from '../mcp/index.js';\nimport { getHeadlessState, runHeadlessTask, setHeadlessPaused } from '../headless/index.js';\nimport { startUnifiedServer } from '../interface/server.js';\nimport { createSrcBatchPlan, runSrcCli } from '../sourcegraph/index.js';\nimport { getProjectContext } from '../context/git.js';\nimport { startRepl } from '../repl/index.js';\nimport { startTui } from '../tui/index.js';\nimport { TokenCache } from '../cache/token-cache.js';\nimport { analyzeBlastRadius, isSeverityAtLeast } from '../blast-radius/index.js';\nimport { AgentKeeper } from '../memory/agentkeeper.js';\nimport { CheckpointStore } from '../checkpoint/store.js';\nimport { scorePatchRisk } from '../risk/score.js';\nimport { runXSearch } from '../xai/search.js';\nimport { MemoryBroker } from '../memory/broker.js';\nimport { getNestedValue, loadResolvedRepoConfig, readRepoConfig, redactRepoConfigForDisplay, setRepoConfigValue } from '../config/repo-config.js';\nimport { commandToShell, describeIntent, executeGitHubIntent, parseGitHubIntent, requiresConfirmation, runGitHubDoctor, buildGitHubCommand } from '../github/nl.js';\nimport { loadModelPolicy } from '../config/model-policy.js';\nimport { AutoFixStore, type AutoFixApplyPolicy, type AutoFixJobStatus } from '../autofix/store.js';\nimport { runAutoFixJob } from '../autofix/runner.js';\nimport { loadPipelineMetricsSummary } from '../metrics/pipeline.js';\nimport { randomUUID } from 'node:crypto';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { enforceStrictPreflight, getCapabilityHandshake, getExecutionPolicy, isRetryableError, isRiskBlocked, withRetries } from '../runtime/execution-policy.js';\n\n\nconst program = new Command();\n\nexport function parseHeadlessShortcutArgs(args: string[]) {\n const enabled = args.includes('--headless');\n if (!enabled) return { enabled: false };\n\n const readValue = (...names: string[]) => {\n for (let i = 0; i < args.length; i += 1) {\n if (names.includes(args[i])) return args[i + 1];\n }\n return undefined;\n };\n\n return {\n enabled: true,\n json: args.includes('--json'),\n alwaysApprove: args.includes('--always-approve'),\n out: readValue('--out'),\n task: readValue('-t', '--task'),\n agent: readValue('--agent'),\n gateway: readValue('-g', '--gateway')\n };\n}\n\nfunction extractValidationSignals(result: any, requireValidation: boolean) {\n if (!requireValidation) {\n return {\n required: false,\n passed: true,\n lintPassed: undefined as boolean | undefined,\n testsPassed: undefined as boolean | undefined,\n notes: ''\n };\n }\n\n const candidates = [\n result?.validation,\n result?.metadata?.validation,\n result?.meta?.validation\n ].filter(Boolean);\n const merged = Object.assign({}, ...candidates);\n\n let lintPassed: boolean | undefined;\n let testsPassed: boolean | undefined;\n const hasLint = typeof merged?.lintPassed === 'boolean' || typeof result?.lintPassed === 'boolean';\n const hasTests = typeof merged?.testsPassed === 'boolean' || typeof result?.testsPassed === 'boolean';\n if (hasLint) lintPassed = Boolean(merged?.lintPassed ?? result?.lintPassed);\n if (hasTests) testsPassed = Boolean(merged?.testsPassed ?? result?.testsPassed);\n\n let explicitPass: boolean | undefined;\n if (typeof merged?.passed === 'boolean') explicitPass = merged.passed;\n else if (typeof merged?.ok === 'boolean') explicitPass = merged.ok;\n else if (typeof merged?.success === 'boolean') explicitPass = merged.success;\n\n if (explicitPass === undefined && !hasLint && !hasTests) {\n const text = String(result?.result || '').toLowerCase();\n if (/\\btests?\\s+(all\\s+)?passed\\b/.test(text)) testsPassed = true;\n if (/\\b(?:lint|eslint|typecheck|type-check)\\s+passed\\b/.test(text)) lintPassed = true;\n if (/\\btests?\\s+failed\\b/.test(text)) testsPassed = false;\n if (/\\b(?:lint|eslint|typecheck|type-check)\\s+failed\\b/.test(text)) lintPassed = false;\n }\n\n const anySignal = explicitPass !== undefined || lintPassed !== undefined || testsPassed !== undefined;\n const checks: boolean[] = [];\n if (explicitPass !== undefined) checks.push(explicitPass);\n if (lintPassed !== undefined) checks.push(lintPassed);\n if (testsPassed !== undefined) checks.push(testsPassed);\n const passed = anySignal && checks.every(Boolean);\n const notes = passed\n ? 'validation-signals-present'\n : anySignal\n ? 'validation-failed'\n : 'validation-signals-missing';\n\n return {\n required: true,\n passed,\n lintPassed,\n testsPassed,\n notes\n };\n}\n\ntype SubscriptionEngineId = 'cursor' | 'claude-cli' | 'codex-cli';\n\ninterface SubscriptionEngineProbe {\n id: SubscriptionEngineId;\n binary: string;\n installed: boolean;\n authenticated: boolean;\n ready: boolean;\n notes: string[];\n version: string;\n}\n\nfunction hasBinary(bin: string): boolean {\n try {\n execSync(`command -v ${bin}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction readBinaryVersion(bin: string): string {\n try {\n return String(execSync(`${bin} --version`, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] })).trim();\n } catch {\n return '';\n }\n}\n\nfunction commandOutput(command: string): { ok: boolean; output: string } {\n try {\n const output = String(execSync(`${command} 2>&1`, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] })).trim();\n return { ok: true, output };\n } catch (error: any) {\n const output = String(error?.stdout || error?.stderr || '').trim();\n return { ok: false, output };\n }\n}\n\nfunction detectCliAuthStatus(): { claude: boolean; codex: boolean; cursor: boolean } {\n const claude = hasBinary('claude')\n ? (() => {\n const result = commandOutput('claude auth status');\n const text = (result.output || '').toLowerCase();\n if (!text) return false;\n if (/\"loggedin\"\\s*:\\s*true/.test(text)) return true;\n if (text.includes('logged in')) return true;\n return false;\n })()\n : false;\n\n const codex = hasBinary('codex')\n ? (() => {\n const result = commandOutput('codex login status');\n const text = (result.output || '').toLowerCase();\n return text.includes('logged in');\n })()\n : false;\n\n const cursor = hasBinary('cursor') && existsSync(join(homedir(), '.cursor', 'User', 'globalStorage', 'state.vscdb'));\n\n return { claude, codex, cursor };\n}\n\nfunction detectSubscriptionEngines(tokens: Record<string, string | undefined>): SubscriptionEngineProbe[] {\n const cursorInstalled = hasBinary('cursor');\n const claudeInstalled = hasBinary('claude');\n const codexInstalled = hasBinary('codex');\n const cliAuth = detectCliAuthStatus();\n\n const cursorAuth = Boolean(tokens.cursor || cliAuth.cursor);\n const claudeAuth = Boolean(tokens.claude || process.env.ANTHROPIC_API_KEY || cliAuth.claude);\n const codexAuth = Boolean(tokens.openai || process.env.OPENAI_API_KEY || cliAuth.codex);\n\n return [\n {\n id: 'cursor',\n binary: 'cursor',\n installed: cursorInstalled,\n authenticated: cursorAuth,\n ready: cursorInstalled && cursorAuth,\n notes: [\n cursorInstalled ? 'binary-ok' : 'missing-binary',\n cursorAuth ? 'auth-ok' : 'auth-not-detected'\n ],\n version: cursorInstalled ? readBinaryVersion('cursor') : ''\n },\n {\n id: 'claude-cli',\n binary: 'claude',\n installed: claudeInstalled,\n authenticated: claudeAuth,\n ready: claudeInstalled && claudeAuth,\n notes: [\n claudeInstalled ? 'binary-ok' : 'missing-binary',\n claudeAuth ? 'auth-ok' : 'auth-not-detected'\n ],\n version: claudeInstalled ? readBinaryVersion('claude') : ''\n },\n {\n id: 'codex-cli',\n binary: 'codex',\n installed: codexInstalled,\n authenticated: codexAuth,\n ready: codexInstalled && codexAuth,\n notes: [\n codexInstalled ? 'binary-ok' : 'missing-binary',\n codexAuth ? 'auth-ok' : 'auth-not-detected'\n ],\n version: codexInstalled ? readBinaryVersion('codex') : ''\n }\n ];\n}\n\nfunction shouldRetryWithFallback(error: unknown): boolean {\n const text = String((error as Error)?.message || '').toLowerCase();\n return isRetryableError(error) || text.includes('empty');\n}\n\nfunction printJsonEnvelope(kind: string, payload: Record<string, unknown>) {\n console.log(JSON.stringify({\n version: 'v1',\n kind,\n ts: new Date().toISOString(),\n ...payload\n }, null, 2));\n}\n\nasync function loadPipelineRunEvents(traceId: string, baseDir = process.cwd()): Promise<any[]> {\n const path = join(baseDir, '.crew', 'pipeline-runs', `${traceId}.jsonl`);\n const raw = await readFile(path, 'utf8');\n return raw\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean)\n .map(line => {\n try {\n return JSON.parse(line);\n } catch {\n return null;\n }\n })\n .filter(Boolean);\n}\n\nfunction inferResumeTask(events: any[]): { task: string; phase: string } | null {\n if (!Array.isArray(events) || events.length === 0) return null;\n const firstPlan = events.find(e => String(e?.phase || '') === 'plan' && typeof e?.userInput === 'string');\n const last = events[events.length - 1];\n if (!firstPlan?.userInput) return null;\n return {\n task: String(firstPlan.userInput),\n phase: String(last?.phase || 'unknown')\n };\n}\n\nfunction extractResumeArtifacts(events: any[]): {\n priorPlan?: any;\n priorResponse?: string;\n priorExecutionResults?: any;\n} {\n const planEvent = [...events].reverse().find(e => String(e?.phase || '') === 'plan.completed' && e?.plan);\n const validateInput = [...events].reverse().find(e => String(e?.phase || '') === 'validate.input');\n return {\n priorPlan: planEvent?.plan,\n priorResponse: typeof validateInput?.response === 'string' ? validateInput.response : undefined,\n priorExecutionResults: validateInput?.executionResults\n };\n}\n\nasync function runValidationCommands(commands: string[] = [], cwd = process.cwd()) {\n if (!Array.isArray(commands) || commands.length === 0) {\n return { passed: true, failedCommand: '', output: '' };\n }\n for (const cmd of commands) {\n try {\n const out = execSync(cmd, {\n cwd,\n stdio: 'pipe',\n encoding: 'utf8',\n maxBuffer: 2 * 1024 * 1024\n });\n if (String(out || '').trim().length > 0) {\n // keep deterministic side-effect free behavior, no streaming here.\n }\n } catch (error) {\n return {\n passed: false,\n failedCommand: cmd,\n output: String((error as any)?.stderr || (error as Error)?.message || '')\n };\n }\n }\n return { passed: true, failedCommand: '', output: '' };\n}\n\nasync function runLspAutoFixCycle(\n projectDir: string,\n maxAttempts: number,\n options: {\n router: AgentRouter;\n orchestrator: Orchestrator;\n sessionId: string;\n gateway?: string;\n model?: string;\n fallbackModels?: string[];\n checkpoints?: CheckpointStore;\n runId?: string;\n logger: Logger;\n }\n): Promise<{ fixed: boolean; attempts: number; remainingDiagnostics: number }> {\n const { typeCheckProject } = await import('../lsp/index.js');\n const cappedAttempts = Math.max(1, maxAttempts);\n let diagnostics = await typeCheckProject(projectDir, []);\n if (diagnostics.length === 0) return { fixed: true, attempts: 0, remainingDiagnostics: 0 };\n\n let attempts = 0;\n while (attempts < cappedAttempts && diagnostics.length > 0) {\n attempts += 1;\n const top = diagnostics.slice(0, 30);\n const summary = top\n .map(d => `${d.file}:${d.line}:${d.column} [${d.category}] TS${d.code} ${d.message}`)\n .join('\\n');\n const task = [\n 'Run a targeted TypeScript auto-fix pass for the following diagnostics.',\n 'Apply minimal safe changes only.',\n 'Diagnostics:',\n summary\n ].join('\\n');\n\n const dispatched = await dispatchWithFallback(\n options.router,\n 'crew-fixer',\n task,\n {\n project: projectDir,\n sessionId: options.sessionId,\n gateway: options.gateway,\n model: options.model\n },\n options.fallbackModels || [],\n options.checkpoints,\n options.runId\n );\n const response = String(dispatched.result?.result || '');\n const edits = await options.orchestrator.parseAndApplyToSandbox(response);\n options.logger.info(`LSP auto-fix attempt ${attempts}: ${diagnostics.length} diagnostics, ${edits.length} sandbox edit(s).`);\n await options.checkpoints?.append(String(options.runId || ''), 'lsp.autofix.attempt', {\n attempt: attempts,\n diagnostics: diagnostics.length,\n edits: edits.length\n });\n diagnostics = await typeCheckProject(projectDir, []);\n }\n\n return {\n fixed: diagnostics.length === 0,\n attempts,\n remainingDiagnostics: diagnostics.length\n };\n}\n\nasync function dispatchWithFallback(\n router: AgentRouter,\n agent: string,\n task: string,\n options: any,\n fallbackModels: string[] = [],\n checkpoint?: CheckpointStore,\n runId?: string\n) {\n const tried: string[] = [];\n const primary = String(options.model || '').trim();\n if (primary) tried.push(primary);\n const chain = [primary, ...fallbackModels].map(x => String(x || '').trim()).filter(Boolean);\n if (chain.length === 0) {\n const result = await router.dispatch(agent, task, options);\n return { result, usedModel: primary || 'default', attempts: tried };\n }\n\n let lastError: Error | null = null;\n for (let i = 0; i < chain.length; i++) {\n const model = chain[i];\n tried.push(model);\n try {\n if (checkpoint && runId) {\n await checkpoint.append(runId, 'dispatch.model.attempt', { model, index: i + 1 });\n }\n const result = await router.dispatch(agent, task, { ...options, model });\n if (checkpoint && runId) {\n await checkpoint.append(runId, 'dispatch.model.success', { model, index: i + 1 });\n }\n return { result, usedModel: model, attempts: tried };\n } catch (error) {\n lastError = error as Error;\n if (checkpoint && runId) {\n await checkpoint.append(runId, 'dispatch.model.failed', { model, error: String((error as Error).message || error) });\n }\n const retryable = shouldRetryWithFallback(error);\n const hasNext = i < chain.length - 1;\n if (!retryable || !hasNext) break;\n }\n }\n\n throw lastError || new Error('Dispatch failed across fallback chain');\n}\n\nexport function parseConfigValue(raw: string, asJson = false): unknown {\n const text = String(raw ?? '').trim();\n if (asJson) {\n return JSON.parse(text);\n }\n if (text === 'true') return true;\n if (text === 'false') return false;\n if (text === 'null') return null;\n if (/^-?\\d+(\\.\\d+)?$/.test(text)) return Number(text);\n return text;\n}\n\nexport async function main(args = []) {\n // \u2500\u2500 Fast-path for lightweight commands that don't need full startup \u2500\u2500\n const firstArg = (args.find(a => !a.startsWith('-')) || '').toLowerCase();\n if (['doctor', 'update', 'version'].includes(firstArg)) {\n const lightweight = new Command();\n lightweight.name('crew');\n\n lightweight\n .command('doctor')\n .description('Run local diagnostics (Node, Git, config, API keys, gateway)')\n .option('-g, --gateway <url>', 'Gateway URL to check', 'http://localhost:5010')\n .option('--update-tag <tag>', 'Version channel for update check', 'latest')\n .action(async options => {\n const checks = await runDoctorChecks({ gateway: options.gateway, updateTag: options.updateTag });\n const summary = summarizeDoctorResults(checks);\n\n console.log(chalk.blue('\\ncrew doctor\\n'));\n checks.forEach(check => {\n let marker = check.ok ? chalk.green('\u2713') : chalk.red('\u2717');\n if (check.name === 'CLI update status' && String(check.details || '').toLowerCase().includes('update available')) {\n marker = chalk.yellow('!');\n }\n console.log(` ${marker} ${check.name} ${chalk.gray(`\u2014 ${check.details}`)}`);\n if (!check.ok && check.hint) {\n check.hint.split('\\n').forEach(line => console.log(chalk.yellow(` ${line}`)));\n }\n });\n\n console.log();\n const summaryColor = summary.failed === 0 ? chalk.green : chalk.red;\n console.log(summaryColor(` ${summary.passed} passed, ${summary.failed} failed\\n`));\n\n if (summary.failed > 0) process.exit(1);\n });\n\n lightweight\n .command('update')\n .description('Check for updates and install latest crew-cli globally')\n .option('--check', 'Only check availability, do not install', false)\n .option('--tag <tag>', 'Update channel/tag (default: latest)', 'latest')\n .option('-y, --yes', 'Skip confirmation prompt', false)\n .action(async options => {\n const installed = await getInstalledCliVersion();\n const latest = await getLatestCliVersion(options.tag || 'latest');\n if (!latest) {\n console.log(chalk.yellow('Unable to check latest version from npm right now.'));\n return;\n }\n if (!installed) {\n console.log(chalk.yellow(`Current version unknown. Latest available: ${latest}`));\n return;\n }\n const cmp = compareVersions(installed, latest);\n if (cmp >= 0) {\n console.log(chalk.green(`\u2713 Up to date (${installed})`));\n } else {\n console.log(chalk.yellow(`Update available: ${installed} \u2192 ${latest}`));\n console.log(chalk.gray('Run: npm i -g crewswarm-cli@latest'));\n }\n });\n\n lightweight\n .command('version')\n .description('Show crew-cli version')\n .action(async () => {\n const v = await getInstalledCliVersion();\n console.log(v || 'unknown');\n });\n\n await lightweight.parseAsync(args, { from: 'user' });\n process.exit(0);\n }\n\n const normalizedArgs = [...args];\n if (normalizedArgs.includes('--legacy-router')) {\n process.env.CREW_LEGACY_ROUTER = 'true';\n process.env.CREW_USE_UNIFIED_ROUTER = 'false';\n const idx = normalizedArgs.indexOf('--legacy-router');\n normalizedArgs.splice(idx, 1);\n args = normalizedArgs;\n }\n\n // Show banner on first launch (or always if CREW_SHOW_BANNER=1)\n const bannerFile = join(process.env.HOME || homedir(), '.crew', 'cli-banner-seen');\n const showAlways = process.env.CREW_SHOW_BANNER === '1';\n \n if (showAlways || !existsSync(bannerFile)) {\n const banner = `\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 \u2551\n\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557 \u2551\n\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2551\n\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2551\n\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2551\n\u2551 \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2554\u2588\u2588\u2588\u2554\u255D \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2551\n\u2551 \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u255D\u255A\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u2551\n\u2551 \u2551\n\u2551 \uD83C\uDFAA One idea. One Build. One Crew. \u2551\n\u2551 \u2551\n\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n`;\n console.log(chalk.cyan(banner));\n \n // Mark as seen (best effort)\n try {\n await mkdir(dirname(bannerFile), { recursive: true });\n await writeFile(bannerFile, new Date().toISOString());\n } catch (e) {\n logger.error(`Failed to mark banner as seen: ${e.message}`);\n }\n }\n\n // (fast-path for doctor/update/version is at the top of main())\n\n const logger = new Logger();\n const config = new ConfigManager();\n const toolManager = new ToolManager(config);\n const agentRouter = new AgentRouter(config, toolManager);\n const sessionManager = new SessionManager(process.cwd());\n const sandbox = new Sandbox(process.cwd());\n const orchestrator = new Orchestrator(agentRouter, sandbox, sessionManager);\n const corrections = new CorrectionStore(process.cwd());\n const tokenCache = new TokenCache(process.cwd());\n const agentKeeper = new AgentKeeper(process.cwd());\n const checkpoints = new CheckpointStore(process.cwd());\n const autoFixStore = new AutoFixStore(process.cwd());\n const repoConfig = await loadResolvedRepoConfig(process.cwd());\n const modelPolicy = await loadModelPolicy(process.cwd());\n const cliDefaults = repoConfig.cli || {};\n const plannerPolicy = modelPolicy.tiers?.planner || {};\n const executorPolicy = modelPolicy.tiers?.executor || {};\n const workerPolicy = modelPolicy.tiers?.worker || {};\n const plannerPrimary = plannerPolicy.primary || cliDefaults.model || '';\n const executorPrimary = executorPolicy.primary || cliDefaults.model || '';\n const workerPrimary = workerPolicy.primary || cliDefaults.model || '';\n\n await sessionManager.ensureInitialized();\n await toolManager.initialize();\n await sandbox.load();\n\n const getStandaloneRuntime = async (projectDir?: string) => {\n const targetDir = projectDir || process.cwd();\n if (targetDir === process.cwd()) {\n return { sandbox, orchestrator, sessionManager };\n }\n const scopedSession = new SessionManager(targetDir);\n const scopedSandbox = new Sandbox(targetDir);\n const scopedOrchestrator = new Orchestrator(agentRouter, scopedSandbox, scopedSession);\n await scopedSession.ensureInitialized();\n await scopedSandbox.load();\n return {\n sandbox: scopedSandbox,\n orchestrator: scopedOrchestrator,\n sessionManager: scopedSession\n };\n };\n\n // Show banner on new sessions\n const sessionData = await sessionManager.loadSession();\n if (sessionData.history.length === 0 && !args.includes('--headless') && !args.includes('--json')) {\n console.log(getBanner());\n }\n\n try {\n await agentKeeper.compact();\n } catch {\n // Never fail startup due to maintenance compaction.\n }\n\n const headlessShortcut = parseHeadlessShortcutArgs(args);\n if (headlessShortcut.enabled) {\n if (!headlessShortcut.task) {\n console.error('Missing task for headless mode. Use -t \"your task\".');\n process.exit(1);\n }\n const result = await runHeadlessTask({\n task: headlessShortcut.task,\n json: headlessShortcut.json,\n alwaysApprove: headlessShortcut.alwaysApprove,\n out: headlessShortcut.out,\n agent: headlessShortcut.agent,\n gateway: headlessShortcut.gateway,\n projectDir: process.cwd(),\n router: agentRouter,\n orchestrator,\n sandbox,\n session: sessionManager\n });\n if (!result.success) process.exit(1);\n return;\n }\n\n const cliVersion = (await getInstalledCliVersion()) || '0.1.0-alpha';\n\n program\n .name('crew')\n .description('CrewSwarm CLI - Agent orchestration made simple')\n .version(cliVersion);\n\n program.option('--legacy-router', 'Use legacy routing path (disables UnifiedPipeline default)', false);\n\n program\n .command('chat')\n .description('Chat with CrewSwarm (automatically routed to best agent)')\n .argument('<input...>', 'Message or question')\n .option('-p, --project <path>', 'Project directory')\n .option('-g, --gateway <url>', 'Override gateway URL')\n .option('-m, --model <id>', 'Model override for direct/bypass gateway paths', executorPrimary || undefined)\n .option('--engine <id>', 'Engine override for direct/bypass gateway paths (e.g. cursor)', cliDefaults.engine || undefined)\n .option('--direct', 'Request direct execution path on gateway', false)\n .option('--bypass', 'Request bypass/orchestrator-skip path on gateway', false)\n .option('--crew', 'Use full multi-agent crew via gateway (like OpenCode PM loop)', false)\n .option('--apply', 'Auto-apply sandbox changes to disk after completion', false)\n .option('--image <path>', 'Attach an image file to the prompt (repeatable)', collectOption, [])\n .option('--context-image <path>', 'Attach an image file as context (repeatable)', collectOption, [])\n .option('--image-max-bytes <n>', 'Max bytes per image context payload', '250000')\n .option('--cross-repo', 'Inject sibling repository context', false)\n .option('--context-file <path>', 'Attach a file as additional context (repeatable)', collectOption, [])\n .option('--context-repo <path>', 'Attach git context from another repo (repeatable)', collectOption, [])\n .option('--stdin', 'Read additional context from stdin', false)\n .option('--max-context-tokens <n>', 'Max context token budget (approx, chars/4)')\n .option('--context-budget-mode <mode>', 'trim | stop when budget exceeded', 'trim')\n .option('--docs', 'Inject matching docs context via collections search', false)\n .option('--docs-path <paths...>', 'Custom paths for docs search (default: docs/ + project root)')\n .option('--docs-code', 'Include source code files in docs retrieval index', Boolean(cliDefaults.docsCode))\n .option('--fallback-model <id>', 'Fallback model chain entry (repeatable)', collectOption, [])\n .option('--retry-attempts <n>', 'Retry attempts for transient failures', '2')\n .option('--strict-preflight', 'Block execution if doctor checks fail', false)\n .option('--json', 'Output machine-readable JSON envelope', false)\n .action(async (inputArray, options) => {\n let input = inputArray.join(' ');\n try {\n const policy = getExecutionPolicy({\n strictPreflight: Boolean(options.strictPreflight),\n retryAttempts: Number.parseInt(options.retryAttempts || '2', 10)\n });\n await enforceStrictPreflight(policy, options.gateway);\n const fileBlock = await buildFileContextBlock(options.contextFile || []);\n const repoBlock = await buildRepoContextBlock(options.contextRepo || []);\n const imagePaths = [...(options.image || []), ...(options.contextImage || [])];\n const imageBlock = await buildImageContextBlock(\n imagePaths,\n Number.parseInt(options.imageMaxBytes || '250000', 10)\n );\n const stdinText = options.stdin ? await readStdinText() : '';\n const stdinBlock = stdinText ? `## Stdin Context\\n\\`\\`\\`text\\n${stdinText}\\n\\`\\`\\`` : '';\n\n let docsBlock = '';\n if (options.docs) {\n const { buildCollectionIndex, searchCollection } = await import('../collections/index.js');\n const docsPaths = options.docsPath && options.docsPath.length > 0\n ? options.docsPath\n : [join(process.cwd(), 'docs'), process.cwd()];\n const index = await buildCollectionIndex(docsPaths, {\n includeCode: Boolean(options.docsCode)\n });\n const result = searchCollection(index, input, 5);\n if (result.hits.length > 0) {\n const chunks = result.hits.map(h => `### ${h.source}:${h.startLine} (score: ${h.score})\\n${h.text}`);\n docsBlock = `## Docs Context (auto-retrieved)\\n${chunks.join('\\n\\n')}`;\n }\n }\n\n const budget = enforceContextBudget(\n input,\n [fileBlock, repoBlock, imageBlock, stdinBlock, docsBlock],\n options.maxContextTokens ? Number.parseInt(options.maxContextTokens, 10) : undefined,\n options.contextBudgetMode === 'stop' ? 'stop' : 'trim'\n );\n if (budget.exceeded) {\n throw new Error(`Context budget exceeded (~${budget.estimatedTokens} tokens > ${options.maxContextTokens}). Use --context-budget-mode trim or raise budget.`);\n }\n if (budget.trimmed) {\n logger.warn(`Context trimmed to stay under budget (~${budget.estimatedTokens} tokens).`);\n }\n input = budget.task;\n\n if (options.crossRepo) {\n const multiContext = await collectMultiRepoContext(options.project || process.cwd());\n input = `${input}\\n\\n${multiContext}`;\n }\n\n const projectDir = options.project || process.cwd();\n\n // crew-CLI: use connected mode (gateway dispatch) when --gateway or --crew is specified\n // Otherwise use standalone agentic executor with built-in tools\n const useConnected = Boolean(options.gateway || options.crew);\n const useLegacyStandalone = String(process.env.CREW_LEGACY_ROUTER || '').toLowerCase() === 'true';\n const fallbackModels = (options.fallbackModel && options.fallbackModel.length > 0)\n ? options.fallbackModel\n : (executorPolicy.fallback || []);\n const capabilityHandshake = getCapabilityHandshake(useConnected ? 'connected' : 'standalone');\n\n // crew-CLI uses agentic executor (standalone) unless explicitly connected\n if (!useConnected && !useLegacyStandalone) {\n logger.info('Executing in standalone mode (agentic executor with file tools)');\n const standaloneRuntime = await getStandaloneRuntime(projectDir);\n const result = await withRetries(\n async () => standaloneRuntime.orchestrator.executeAgentic(input, {\n sessionId: await standaloneRuntime.sessionManager.getSessionId(),\n model: options.model\n }),\n policy\n );\n const responseText = String(result.response || result.result || '');\n const edits = await standaloneRuntime.orchestrator.parseAndApplyToSandbox(responseText);\n const hasPendingChanges = standaloneRuntime.sandbox.hasChanges();\n let appliedPaths: string[] = [];\n if (hasPendingChanges && options.apply) {\n appliedPaths = standaloneRuntime.sandbox.getPendingPaths();\n await standaloneRuntime.sandbox.apply();\n }\n await standaloneRuntime.sessionManager.appendHistory({\n input,\n response: responseText,\n decision: result.plan?.decision || 'execute',\n agent: 'unified-pipeline',\n model: String(result.plan?.validation?.modelUsed || 'unknown'),\n costUsd: result.totalCost\n });\n\n console.log(\n JSON.stringify(\n {\n version: 'v1',\n kind: 'chat.result',\n ts: new Date().toISOString(),\n route: result.plan\n ? {\n decision: result.plan.decision.toUpperCase(),\n explanation: result.plan.reasoning\n }\n : { decision: 'EXECUTE', explanation: 'Direct L3 execution' },\n agent: 'unified-pipeline',\n response: responseText,\n edits: edits.length > 0 ? edits : undefined,\n applied: appliedPaths.length > 0 ? appliedPaths : undefined,\n needsApproval: hasPendingChanges && appliedPaths.length === 0,\n traceId: result.traceId,\n timeline: result.timeline,\n capabilityHandshake\n },\n null,\n 2\n )\n );\n return;\n }\n\n // Connected mode or legacy: route first, then dispatch\n const route = await orchestrator.route(input);\n\n if (route.decision === 'CHAT' || route.decision === 'CODE' || route.decision === 'DISPATCH') {\n const agent = route.agent || 'crew-main';\n logger.info(`Routing to ${agent} (Decision: ${route.decision})`);\n\n const result = await dispatchWithFallback(\n agentRouter,\n agent,\n input,\n {\n project: projectDir,\n sessionId: await sessionManager.getSessionId(),\n gateway: options.gateway,\n model: options.model,\n engine: options.engine,\n direct: options.direct,\n bypass: options.bypass,\n images: options.image || []\n },\n fallbackModels,\n checkpoints,\n `chat-${randomUUID()}`\n );\n\n const rawResponse = result.response || result.result || '';\n const responseText = typeof rawResponse === 'object' \n ? (rawResponse.result || rawResponse.output || rawResponse.message || JSON.stringify(rawResponse, null, 2))\n : String(rawResponse);\n // Try to parse any edits\n const edits = await orchestrator.parseAndApplyToSandbox(responseText);\n let appliedPaths: string[] = [];\n if (edits.length > 0 && (options.apply || options.crew)) {\n appliedPaths = sandbox.getPendingPaths();\n await sandbox.apply();\n }\n if (options.json) {\n printJsonEnvelope('chat.result', {\n route,\n agent,\n response: responseText,\n edits,\n applied: appliedPaths.length > 0 ? appliedPaths : undefined,\n needsApproval: edits.length > 0 && appliedPaths.length === 0,\n traceId: result.traceId || null,\n timeline: Array.isArray(result.timeline) ? result.timeline : [],\n capabilityHandshake\n });\n return;\n }\n console.log(chalk.blue('\\n--- Agent Response ---'));\n console.log(responseText);\n if (Array.isArray(result.timeline) && result.timeline.length > 0) {\n console.log(chalk.gray('\\nPipeline timeline:'));\n for (const step of result.timeline) {\n console.log(chalk.gray(` - ${step.phase} @ ${step.ts}`));\n }\n }\n if (edits.length > 0) {\n if (appliedPaths.length > 0) {\n logger.success(`\u2713 Applied ${appliedPaths.length} files to disk`);\n appliedPaths.forEach(f => logger.info(` - ${f}`));\n } else {\n logger.success(`Added changes to ${edits.length} files in sandbox. Run \"crew preview\" to review.`);\n }\n }\n } else if (route.decision === 'SKILL') {\n logger.info('Detected skill request. Please use \"crew skill <name>\" for now.');\n }\n } catch (error) {\n logger.error('Chat failed:', error.message);\n process.exit(1);\n }\n });\n\n program\n .command('auto')\n .description('Autonomous mode - LLM iterates on task until completion without approval prompts')\n .argument('<task...>', 'Task description')\n .option('-p, --project <path>', 'Project directory', process.cwd())\n .option('-g, --gateway <url>', 'Override gateway URL')\n .option('-m, --model <id>', 'Model override', workerPrimary || undefined)\n .option('--fallback-model <id>', 'Fallback model chain entry (repeatable)', collectOption, [])\n .option('--max-iterations <n>', 'Maximum autonomous iterations', '10')\n .option('--auto-apply', 'Automatically apply sandbox changes when task completes', false)\n .option('--cross-repo', 'Inject sibling repository context', false)\n .option('--cache', 'Enable output cache for autonomous iterations', false)\n .option('--cache-ttl <sec>', 'Output cache TTL in seconds', '1800')\n .option('--no-memory', 'Disable shared AgentKeeper memory')\n .option('--memory-max <n>', 'Max recalled memory entries', String(cliDefaults.memoryMax ?? 3))\n .option('--memory-require-validation', 'Store memory only when validation is marked passed', false)\n .option('--lsp-auto-fix', 'Run LSP diagnostics and auto-dispatch fixes after edits', false)\n .option('--lsp-auto-fix-max-attempts <n>', 'Max LSP auto-fix attempts per iteration', '3')\n .option('--no-blast-radius-gate', 'Disable blast-radius safety gate before auto-apply')\n .option('--blast-radius-threshold <level>', 'Blast-radius gate threshold: low|medium|high', 'high')\n .option('--force-auto-apply', 'Bypass blast-radius gate and auto-apply anyway', false)\n .option('--escalate-risk', 'Escalate high-risk patches to QA and Security before completion', false)\n .option('--risk-threshold <level>', 'Escalation threshold: low|medium|high', 'high')\n .action(async (taskArray, options) => {\n const task = taskArray.join(' ');\n const projectDir = options.project || process.cwd();\n const maxIterations = Number.parseInt(options.maxIterations || '10', 10);\n const fallbackModels = (options.fallbackModel && options.fallbackModel.length > 0)\n ? options.fallbackModel\n : (workerPolicy.fallback || []);\n\n logger.info(chalk.cyan(`\uD83E\uDD16 Autonomous Mode: ${task}`));\n logger.info(chalk.gray(` Max iterations: ${maxIterations}`));\n logger.info(chalk.gray(` Project: ${projectDir}\\n`));\n\n let currentTask = task;\n let iteration = 0;\n let failedRun = false;\n const runId = `auto-${randomUUID()}`;\n const useMemory = options.memory !== false;\n await checkpoints.beginRun({ runId, mode: 'auto', task });\n\n if (useMemory) {\n const matches = await agentKeeper.recall(task, Number.parseInt(options.memoryMax || '3', 10), {\n preferSuccessful: true\n });\n const avgScore = matches.length\n ? matches.reduce((sum, m) => sum + Number(m.score || 0), 0) / matches.length\n : 0;\n await sessionManager.trackMemoryRecall({\n used: true,\n miss: matches.length === 0,\n matchCount: matches.length,\n qualityScore: avgScore\n });\n if (matches.length > 0) {\n const memoryContext = await agentKeeper.recallAsContext(task, Number.parseInt(options.memoryMax || '3', 10), {\n preferSuccessful: true\n });\n currentTask = `${currentTask}\\n\\n${memoryContext}`;\n }\n }\n\n if (options.crossRepo) {\n const multiContext = await collectMultiRepoContext(projectDir);\n currentTask = `${currentTask}\\n\\n${multiContext}`;\n }\n\n while (iteration < maxIterations) {\n iteration += 1;\n logger.info(chalk.blue(`\\n[Iteration ${iteration}/${maxIterations}]`));\n\n try {\n const route = await orchestrator.route(currentTask);\n const agent = route.agent || 'crew-main';\n \n logger.info(chalk.gray(` Routing to: ${agent}`));\n\n const useCache = Boolean(options.cache);\n const cacheKey = TokenCache.hashKey(JSON.stringify({\n kind: 'auto-output',\n agent,\n task: currentTask,\n projectDir,\n gateway: options.gateway || '',\n model: options.model || ''\n }));\n\n let result: any;\n if (useCache) {\n const cached = await tokenCache.get<any>('output', cacheKey);\n if (cached.hit && cached.value) {\n logger.info(chalk.gray(' Using cached output.'));\n result = cached.value;\n await sessionManager.trackCacheSavings({\n hit: true,\n tokensSaved: Number(cached.meta?.tokensSaved || 0),\n usdSaved: Number(cached.meta?.usdSaved || 0)\n });\n } else {\n await sessionManager.trackCacheSavings({ miss: true });\n const dispatched = await dispatchWithFallback(\n agentRouter,\n agent,\n currentTask,\n {\n project: projectDir,\n sessionId: await sessionManager.getSessionId(),\n gateway: options.gateway,\n model: options.model\n },\n fallbackModels,\n checkpoints,\n runId\n );\n result = dispatched.result;\n const estTokens = Math.ceil((String(currentTask).length + String(result.result || '').length) / 4);\n await tokenCache.set(\n 'output',\n cacheKey,\n result,\n Number.parseInt(options.cacheTtl || '1800', 10),\n { tokensSaved: estTokens, usdSaved: estTokens / 1_000_000, source: 'auto-output' }\n );\n }\n } else {\n const dispatched = await dispatchWithFallback(\n agentRouter,\n agent,\n currentTask,\n {\n project: projectDir,\n sessionId: await sessionManager.getSessionId(),\n gateway: options.gateway,\n model: options.model\n },\n fallbackModels,\n checkpoints,\n runId\n );\n result = dispatched.result;\n }\n\n await sessionManager.appendHistory({\n type: 'auto_iteration',\n agent,\n iteration,\n task: currentTask,\n success: Boolean(result.success),\n result: result.result\n });\n if (useMemory) {\n const response = String(result.result || '').trim();\n const isControlPrompt =\n currentTask.startsWith('The previous changes have been staged in sandbox') ||\n currentTask.startsWith('Continue working on:');\n const hasSignal = response.length > 0;\n const isSuccessful = Boolean(result.success);\n const validation = extractValidationSignals(result, Boolean(options.memoryRequireValidation));\n if (hasSignal && isSuccessful && !isControlPrompt && validation.passed) {\n const saved = await agentKeeper.recordSafe({\n runId,\n tier: 'worker',\n task,\n result: response,\n agent,\n structured: {\n problem: task,\n validation: {\n lintPassed: validation.lintPassed,\n testsPassed: validation.testsPassed,\n notes: validation.notes\n },\n outcome: 'success'\n },\n metadata: {\n iteration,\n promptKind: 'user-task',\n success: true,\n validationRequired: validation.required,\n validationPassed: validation.passed\n }\n });\n if (!saved.ok) {\n logger.warn(`Memory write skipped: ${saved.error}`);\n }\n }\n }\n\n if (result.costUsd && result.model) {\n await sessionManager.trackCost({\n model: result.model,\n usd: result.costUsd,\n promptTokens: result.promptTokens || 0,\n completionTokens: result.completionTokens || 0\n });\n }\n\n const responseText = String(result.result || '');\n console.log(chalk.cyan('\\n Response:'));\n logger.printWithHighlight(responseText);\n\n // Parse and add to sandbox\n const edits = await orchestrator.parseAndApplyToSandbox(responseText);\n await checkpoints.append(runId, 'auto.iteration', {\n iteration,\n agent,\n success: Boolean(result.success),\n edits: edits.length\n });\n if (edits.length > 0) {\n logger.success(` \u2713 Added ${edits.length} file changes to sandbox`);\n if (options.lspAutoFix) {\n const lspFix = await runLspAutoFixCycle(\n projectDir,\n Number.parseInt(options.lspAutoFixMaxAttempts || '3', 10),\n {\n router: agentRouter,\n orchestrator,\n sessionId: await sessionManager.getSessionId(),\n gateway: options.gateway,\n model: options.model,\n fallbackModels,\n checkpoints,\n runId,\n logger\n }\n );\n if (lspFix.fixed) {\n logger.success(` \u2713 LSP auto-fix complete (${lspFix.attempts} attempt(s)).`);\n } else {\n logger.warn(` \u26A0 LSP auto-fix incomplete (${lspFix.remainingDiagnostics} diagnostics remain after ${lspFix.attempts} attempt(s)).`);\n }\n }\n }\n\n // Check if task appears complete\n const lowerResponse = responseText.toLowerCase();\n const completionSignals = [\n 'task complete', 'task is complete', 'implementation complete',\n 'all done', 'finished', 'successfully implemented',\n 'no further changes needed', 'ready for review'\n ];\n \n const hasCompletionSignal = completionSignals.some(signal => lowerResponse.includes(signal));\n \n if (hasCompletionSignal) {\n logger.success(chalk.green(`\\n\u2713 Task appears complete after ${iteration} iteration(s)`));\n break;\n }\n\n // If we have sandbox changes, ask the LLM to verify and continue or finish\n if (edits.length > 0 && iteration < maxIterations) {\n currentTask = `The previous changes have been staged in sandbox. Please verify the implementation is complete and correct. If there are any remaining issues, fix them. If everything looks good, respond with \"Task complete.\"`;\n } else if (iteration >= maxIterations) {\n logger.warn(chalk.yellow(`\\n\u26A0\uFE0F Reached max iterations (${maxIterations})`));\n break;\n } else {\n // No edits detected, ask for next step\n currentTask = `Continue working on: ${task}`;\n }\n } catch (err) {\n logger.error(`Iteration ${iteration} failed: ${(err as Error).message}`);\n failedRun = true;\n await checkpoints.append(runId, 'auto.error', {\n iteration,\n error: (err as Error).message\n });\n \n await sessionManager.appendHistory({\n type: 'auto_error',\n iteration,\n task: currentTask,\n error: (err as Error).message\n });\n \n break;\n }\n }\n\n // Show final sandbox state\n const activeBranch = sandbox.getActiveBranch();\n if (sandbox.hasChanges(activeBranch)) {\n console.log(chalk.blue('\\n--- Pending Changes ---'));\n console.log(logger.highlightDiff(sandbox.preview(activeBranch)));\n \n if (options.autoApply) {\n try {\n const paths = sandbox.getPendingPaths(activeBranch);\n const report = await analyzeBlastRadius(projectDir, { changedFiles: paths });\n const patchRisk = scorePatchRisk({\n blastRadius: report,\n changedFiles: paths.length\n });\n logger.info(`Patch confidence: ${(patchRisk.confidence * 100).toFixed(0)}% (risk score ${patchRisk.riskScore}/100, ${patchRisk.riskLevel})`);\n await checkpoints.append(runId, 'patch.risk', {\n riskLevel: patchRisk.riskLevel,\n riskScore: patchRisk.riskScore,\n confidence: patchRisk.confidence\n });\n if (options.escalateRisk && isSeverityAtLeast(patchRisk.riskLevel, String(options.riskThreshold || 'high').toLowerCase() as any)) {\n const escalationTask = `High-risk patch review requested.\\nRisk score: ${patchRisk.riskScore}/100 (${patchRisk.riskLevel}).\\nFiles: ${paths.join(', ')}.\\nPlease review for correctness, regressions, and security concerns.`;\n const qa = await dispatchWithFallback(agentRouter, 'crew-qa', escalationTask, {\n project: projectDir,\n sessionId: await sessionManager.getSessionId(),\n gateway: options.gateway\n }, fallbackModels, checkpoints, runId);\n const sec = await dispatchWithFallback(agentRouter, 'crew-security', escalationTask, {\n project: projectDir,\n sessionId: await sessionManager.getSessionId(),\n gateway: options.gateway\n }, fallbackModels, checkpoints, runId);\n logger.info(chalk.yellow('\\n--- QA Escalation ---'));\n logger.printWithHighlight(String(qa.result.result || ''));\n logger.info(chalk.yellow('\\n--- Security Escalation ---'));\n logger.printWithHighlight(String(sec.result.result || ''));\n }\n if (options.blastRadiusGate && !options.forceAutoApply) {\n const threshold = (String(options.blastRadiusThreshold || 'high').toLowerCase() as 'low' | 'medium' | 'high');\n logger.info(`Blast radius: ${report.summary}`);\n if (isSeverityAtLeast(report.risk, threshold)) {\n logger.warn('Auto-apply blocked by blast-radius safety gate.');\n logger.warn(`Changed files: ${report.changedFiles.length}, direct impacts: ${report.affectedFiles.filter(f => f.relation === 'direct-importer').length}, transitive impacts: ${report.affectedFiles.filter(f => f.relation === 'transitive-importer').length}`);\n logger.warn('Re-run with --force-auto-apply or lower --blast-radius-threshold to override.');\n return;\n }\n }\n await sandbox.apply(activeBranch);\n logger.success(`\\n\u2713 Auto-applied changes to: ${paths.join(', ')}`);\n } catch (applyErr) {\n logger.error(`Auto-apply failed: ${(applyErr as Error).message}`);\n logger.info('Run \"crew apply\" manually to apply changes.');\n }\n } else {\n logger.info('\\nRun \"crew apply\" to write changes to disk, or \"crew preview\" to review.');\n }\n }\n\n const cost = await sessionManager.loadCost();\n logger.info(chalk.gray(`\\nTotal session cost: $${cost.totalUsd.toFixed(4)}`));\n if (useMemory) {\n const saved = await agentKeeper.recordSafe({\n runId,\n tier: 'orchestrator',\n task,\n result: sandbox.hasChanges(sandbox.getActiveBranch())\n ? `Autonomous run finished with pending changes on branch ${sandbox.getActiveBranch()}`\n : 'Autonomous run finished with no pending changes',\n agent: 'crew-main',\n structured: {\n problem: task,\n outcome: 'run-complete'\n },\n metadata: {\n iterations: iteration,\n autoApply: Boolean(options.autoApply)\n }\n });\n if (!saved.ok) {\n logger.warn(`Memory write skipped: ${saved.error}`);\n }\n if (iteration >= 5) {\n try {\n await agentKeeper.compact();\n } catch {\n // Best-effort maintenance.\n }\n }\n }\n await checkpoints.finish(runId, failedRun ? 'failed' : 'completed');\n });\n\n const autofix = program\n .command('autofix')\n .description('Background AutoFix queue and worker (safe unattended fix cycles)');\n\n autofix\n .command('enqueue')\n .description('Queue a background AutoFix job')\n .argument('<task...>', 'Task description')\n .option('-p, --project <path>', 'Project directory', process.cwd())\n .option('-g, --gateway <url>', 'Override gateway URL')\n .option('-m, --model <id>', 'Model override', workerPrimary || undefined)\n .option('--fallback-model <id>', 'Fallback model chain entry (repeatable)', collectOption, [])\n .option('--max-iterations <n>', 'Maximum AutoFix iterations per job', '6')\n .option('--validate-cmd <cmd>', 'Validation command gate (repeatable)', collectOption, [])\n .option('--auto-apply-policy <mode>', 'never|safe|force', 'safe')\n .option('--blast-radius-threshold <level>', 'Blast-radius threshold: low|medium|high', 'high')\n .option('--lsp-auto-fix', 'Run TypeScript diagnostics auto-fix loop after edits', false)\n .option('--lsp-auto-fix-max-attempts <n>', 'Max LSP auto-fix attempts', '3')\n .action(async (taskArray, options) => {\n const task = taskArray.join(' ').trim();\n if (!task) {\n logger.error('Task is required.');\n process.exit(1);\n }\n const fallbackModels = (options.fallbackModel && options.fallbackModel.length > 0)\n ? options.fallbackModel\n : (workerPolicy.fallback || []);\n const policyRaw = String(options.autoApplyPolicy || 'safe').toLowerCase();\n const autoApplyPolicy: AutoFixApplyPolicy = policyRaw === 'force'\n ? 'force'\n : policyRaw === 'never'\n ? 'never'\n : 'safe';\n const threshold = String(options.blastRadiusThreshold || 'high').toLowerCase();\n const blastRadiusThreshold = threshold === 'low' || threshold === 'medium' || threshold === 'high'\n ? threshold\n : 'high';\n const job = await autoFixStore.enqueue({\n task,\n projectDir: options.project || process.cwd(),\n config: {\n maxIterations: Number.parseInt(options.maxIterations || '6', 10),\n model: options.model,\n fallbackModels,\n gateway: options.gateway,\n validateCommands: options.validateCmd || [],\n autoApplyPolicy,\n blastRadiusThreshold,\n lspAutoFix: Boolean(options.lspAutoFix),\n lspAutoFixMaxAttempts: Number.parseInt(options.lspAutoFixMaxAttempts || '3', 10)\n }\n });\n logger.success(`Queued AutoFix job ${job.id}`);\n logger.info(`Policy: ${job.config.autoApplyPolicy} | Max iterations: ${job.config.maxIterations} | Project: ${job.projectDir}`);\n });\n\n autofix\n .command('list')\n .description('List background AutoFix jobs')\n .option('--status <status>', 'Filter by status: queued|running|completed|failed|canceled')\n .option('--max <n>', 'Maximum jobs to show', '30')\n .action(async (options) => {\n const statusRaw = String(options.status || '').toLowerCase();\n const allowed: AutoFixJobStatus[] = ['queued', 'running', 'completed', 'failed', 'canceled'];\n const filterStatus = allowed.includes(statusRaw as AutoFixJobStatus)\n ? statusRaw as AutoFixJobStatus\n : undefined;\n const jobs = await autoFixStore.list({ status: filterStatus });\n const max = Math.max(1, Number.parseInt(options.max || '30', 10));\n const sliced = jobs.slice(0, max);\n if (sliced.length === 0) {\n logger.info('No AutoFix jobs found.');\n return;\n }\n for (const job of sliced) {\n const summary = job.result?.applied\n ? 'applied'\n : job.result?.proposalPath\n ? `proposal: ${job.result.proposalPath}`\n : '';\n logger.info(`${job.id} | ${job.status} | ${job.updatedAt} | ${job.task}${summary ? ` | ${summary}` : ''}`);\n }\n });\n\n autofix\n .command('show')\n .description('Show one AutoFix job in detail')\n .argument('<jobId>', 'AutoFix job id')\n .action(async (jobId) => {\n const job = await autoFixStore.get(jobId);\n if (!job) {\n logger.error(`Job not found: ${jobId}`);\n process.exit(1);\n }\n console.log(JSON.stringify(job, null, 2));\n });\n\n autofix\n .command('cancel')\n .description('Cancel a queued/running AutoFix job')\n .argument('<jobId>', 'AutoFix job id')\n .action(async (jobId) => {\n const ok = await autoFixStore.cancel(jobId);\n if (!ok) {\n logger.error(`Unable to cancel job ${jobId}. It may be missing or already final.`);\n process.exit(1);\n }\n logger.success(`Canceled ${jobId}`);\n });\n\n autofix\n .command('worker')\n .description('Run background AutoFix worker loop')\n .option('--once', 'Process at most one queued job and exit', false)\n .option('--max-jobs <n>', 'Stop after processing N jobs (0 = unlimited)', '0')\n .option('--poll-ms <ms>', 'Poll interval when queue is empty', '5000')\n .option('--worker-id <id>', 'Worker identity for lock/debug info', `worker-${process.pid}`)\n .action(async (options) => {\n const once = Boolean(options.once);\n const maxJobs = Math.max(0, Number.parseInt(options.maxJobs || '0', 10));\n const pollMs = Math.max(1000, Number.parseInt(options.pollMs || '5000', 10));\n const workerId = String(options.workerId || `worker-${process.pid}`);\n let processed = 0;\n\n logger.info(`AutoFix worker started (${workerId})`);\n while (true) {\n const job = await autoFixStore.claimNext(workerId);\n if (!job) {\n if (once || (maxJobs > 0 && processed >= maxJobs)) break;\n await new Promise(resolve => setTimeout(resolve, pollMs));\n continue;\n }\n\n logger.info(`Running ${job.id}: ${job.task}`);\n try {\n const result = await runAutoFixJob(job, {\n router: agentRouter,\n orchestrator,\n sandbox,\n session: sessionManager,\n logger,\n checkpoints\n });\n await autoFixStore.markCompleted(job.id, {\n ...result,\n completedAt: new Date().toISOString()\n });\n logger.success(`Completed ${job.id} | applied=${result.applied} | files=${result.editedFiles.length}`);\n } catch (error) {\n const message = String((error as Error).message || error);\n await autoFixStore.markFailed(job.id, message, {\n failedAt: new Date().toISOString()\n });\n logger.error(`Failed ${job.id}: ${message}`);\n }\n\n processed += 1;\n if (once || (maxJobs > 0 && processed >= maxJobs)) break;\n }\n logger.info(`AutoFix worker exiting (${workerId}). Jobs processed: ${processed}`);\n });\n\n program\n .command('repl')\n .description('Start interactive REPL mode for continuous conversations')\n .option('-p, --project <path>', 'Project directory', process.cwd())\n .option('-m, --mode <mode>', 'Initial REPL mode (manual|assist|autopilot)', 'manual')\n .option('--interface-mode <mode>', 'Initial interface mode (standalone|connected)')\n .option('--pick-interface', 'Show connected/standalone picker on REPL launch', false)\n .option('--strict-preflight', 'Block launch if doctor checks fail', false)\n .option('-g, --gateway <url>', 'Gateway URL for strict preflight checks')\n .action(async (options) => {\n const projectDir = options.project || process.cwd();\n const initialMode = options.mode?.toLowerCase();\n if (initialMode && !['manual', 'assist', 'autopilot'].includes(initialMode)) {\n console.error(chalk.red(`Invalid mode \"${initialMode}\". Must be one of: manual, assist, autopilot`));\n process.exit(1);\n }\n const interfaceMode = String(options.interfaceMode || '').toLowerCase();\n if (interfaceMode && !['standalone', 'connected'].includes(interfaceMode)) {\n console.error(chalk.red(`Invalid interface mode \"${interfaceMode}\". Must be one of: standalone, connected`));\n process.exit(1);\n }\n try {\n const policy = getExecutionPolicy({ strictPreflight: Boolean(options.strictPreflight) });\n await enforceStrictPreflight(policy, options.gateway);\n await startRepl({\n router: agentRouter,\n orchestrator,\n sandbox,\n session: sessionManager,\n logger,\n projectDir,\n repoConfig,\n initialMode: initialMode as 'manual' | 'assist' | 'autopilot' | undefined,\n initialInterfaceMode: (interfaceMode || undefined) as 'standalone' | 'connected' | undefined,\n promptInterfaceMode: Boolean(options.pickInterface) || (!interfaceMode && process.stdin.isTTY)\n });\n } catch (error) {\n console.error('Error starting REPL:', error);\n process.exit(1);\n }\n });\n\n program\n .command('tui')\n .description('Start terminal UI mode (same runtime/controller as REPL, improved layout)')\n .option('-p, --project <path>', 'Project directory', process.cwd())\n .option('-m, --mode <mode>', 'Initial TUI mode (manual|assist|autopilot)', 'manual')\n .option('--strict-preflight', 'Block launch if doctor checks fail', false)\n .option('-g, --gateway <url>', 'Gateway URL for strict preflight checks')\n .action(async (options) => {\n const projectDir = options.project || process.cwd();\n const initialMode = options.mode?.toLowerCase();\n if (initialMode && !['manual', 'assist', 'autopilot'].includes(initialMode)) {\n console.error(chalk.red(`Invalid mode \"${initialMode}\". Must be one of: manual, assist, autopilot`));\n process.exit(1);\n }\n try {\n const policy = getExecutionPolicy({ strictPreflight: Boolean(options.strictPreflight) });\n await enforceStrictPreflight(policy, options.gateway);\n await startTui({\n router: agentRouter,\n orchestrator,\n sandbox,\n session: sessionManager,\n logger,\n projectDir,\n repoConfig,\n initialMode: initialMode as 'manual' | 'assist' | 'autopilot' | undefined\n });\n } catch (error) {\n console.error('Error starting TUI:', error);\n process.exit(1);\n }\n });\n\n program\n .command('dispatch')\n .description('Dispatch a task to an agent')\n .argument('<agent>', 'Agent name')\n .argument('<task>', 'Task description')\n .option('-p, --project <path>', 'Project directory')\n .option('-g, --gateway <url>', 'Override gateway URL')\n .option('-t, --timeout <ms>', 'Timeout in milliseconds', '30000')\n .option('-m, --model <id>', 'Model ID for cost estimate', executorPrimary || 'openai/gpt-4o-mini')\n .option('--fallback-model <id>', 'Fallback model chain entry (repeatable)', collectOption, [])\n .option('--engine <id>', 'Engine override for direct/bypass gateway paths (e.g. cursor)')\n .option('--direct', 'Request direct execution path on gateway', false)\n .option('--bypass', 'Request bypass/orchestrator-skip path on gateway', false)\n .option('--output-tokens <count>', 'Expected completion tokens for estimate', '1200')\n .option('--max-cost <usd>', 'Require confirmation if estimate exceeds this USD amount', String(executorPolicy.maxCostUsd ?? 1))\n .option('--skip-cost-check', 'Skip cost estimate confirmation gate', false)\n .option('--cross-repo', 'Inject sibling repository context', false)\n .option('--cache', 'Enable output cache for dispatch result', false)\n .option('--cache-ttl <sec>', 'Output cache TTL in seconds', '1800')\n .option('--no-memory', 'Disable shared AgentKeeper memory')\n .option('--memory-max <n>', 'Max recalled memory entries', String(cliDefaults.memoryMax ?? 3))\n .option('--memory-require-validation', 'Store memory only when validation is marked passed', false)\n .option('--image <path>', 'Attach an image file to the task (repeatable)', collectOption, [])\n .option('--context-image <path>', 'Attach an image file as context (repeatable)', collectOption, [])\n .option('--image-max-bytes <n>', 'Max bytes per image context payload', '250000')\n .option('--context-file <path>', 'Attach a file as additional context (repeatable)', collectOption, [])\n .option('--context-repo <path>', 'Attach git context from another repo (repeatable)', collectOption, [])\n .option('--stdin', 'Read additional context from stdin', false)\n .option('--max-context-tokens <n>', 'Max context token budget (approx, chars/4)')\n .option('--context-budget-mode <mode>', 'trim | stop when budget exceeded', 'trim')\n .option('--docs', 'Inject matching docs context via collections search', false)\n .option('--docs-path <paths...>', 'Custom paths for docs search (default: docs/ + project root)')\n .option('--docs-code', 'Include source code files in docs retrieval index', Boolean(cliDefaults.docsCode))\n .option('--escalate-risk', 'Escalate high-risk patches to QA and Security', false)\n .option('--risk-threshold <level>', 'Escalation threshold: low|medium|high', 'high')\n .option('--retry-attempts <n>', 'Retry attempts for transient failures', '2')\n .option('--strict-preflight', 'Block execution if doctor checks fail', false)\n .option('--json', 'Output machine-readable JSON envelope', false)\n .action(async (agent, task, options) => {\n let finalTask = task;\n const runId = `dispatch-${randomUUID()}`;\n const fallbackModels = (options.fallbackModel && options.fallbackModel.length > 0)\n ? options.fallbackModel\n : (executorPolicy.fallback || []);\n try {\n const policy = getExecutionPolicy({\n strictPreflight: Boolean(options.strictPreflight),\n retryAttempts: Number.parseInt(options.retryAttempts || '2', 10),\n riskThreshold: String(options.riskThreshold || 'high').toLowerCase() as any\n });\n await enforceStrictPreflight(policy, options.gateway);\n await checkpoints.beginRun({ runId, mode: 'dispatch', task });\n const useMemory = options.memory !== false;\n if (useMemory) {\n const pathHints = (options.contextFile || []).map((p: string) => String(p).trim()).filter(Boolean);\n const matches = await agentKeeper.recall(finalTask, Number.parseInt(options.memoryMax || '3', 10), {\n preferSuccessful: true,\n pathHints\n });\n const avgScore = matches.length\n ? matches.reduce((sum, m) => sum + Number(m.score || 0), 0) / matches.length\n : 0;\n await sessionManager.trackMemoryRecall({\n used: true,\n miss: matches.length === 0,\n matchCount: matches.length,\n qualityScore: avgScore\n });\n if (matches.length > 0) {\n const memoryContext = await agentKeeper.recallAsContext(finalTask, Number.parseInt(options.memoryMax || '3', 10), {\n preferSuccessful: true,\n pathHints\n });\n finalTask = `${finalTask}\\n\\n${memoryContext}`;\n }\n }\n const fileBlock = await buildFileContextBlock(options.contextFile || []);\n const repoBlock = await buildRepoContextBlock(options.contextRepo || []);\n const imagePaths = [...(options.image || []), ...(options.contextImage || [])];\n const imageBlock = await buildImageContextBlock(\n imagePaths,\n Number.parseInt(options.imageMaxBytes || '250000', 10)\n );\n const stdinText = options.stdin ? await readStdinText() : '';\n const stdinBlock = stdinText ? `## Stdin Context\\n\\`\\`\\`text\\n${stdinText}\\n\\`\\`\\`` : '';\n\n let docsBlock = '';\n if (options.docs) {\n const { buildCollectionIndex, searchCollection } = await import('../collections/index.js');\n const docsPaths = options.docsPath && options.docsPath.length > 0\n ? options.docsPath\n : [join(process.cwd(), 'docs'), process.cwd()];\n const index = await buildCollectionIndex(docsPaths, {\n includeCode: Boolean(options.docsCode)\n });\n const result = searchCollection(index, task, 5);\n if (result.hits.length > 0) {\n const chunks = result.hits.map(h => `### ${h.source}:${h.startLine} (score: ${h.score})\\n${h.text}`);\n docsBlock = `## Docs Context (auto-retrieved)\\n${chunks.join('\\n\\n')}`;\n }\n }\n\n const budget = enforceContextBudget(\n finalTask,\n [fileBlock, repoBlock, imageBlock, stdinBlock, docsBlock],\n options.maxContextTokens ? Number.parseInt(options.maxContextTokens, 10) : undefined,\n options.contextBudgetMode === 'stop' ? 'stop' : 'trim'\n );\n if (budget.exceeded) {\n throw new Error(`Context budget exceeded (~${budget.estimatedTokens} tokens > ${options.maxContextTokens}). Use --context-budget-mode trim or raise budget.`);\n }\n if (budget.trimmed) {\n logger.warn(`Context trimmed to stay under budget (~${budget.estimatedTokens} tokens).`);\n }\n finalTask = budget.task;\n\n if (options.crossRepo) {\n const multiContext = await collectMultiRepoContext(options.project || process.cwd());\n finalTask = `${finalTask}\\n\\n${multiContext}`;\n }\n\n const sessionId = await sessionManager.getSessionId();\n const projectDir = options.project || process.cwd();\n const outputTokens = Number.parseInt(options.outputTokens || '1200', 10);\n const maxCost = Number.parseFloat(options.maxCost || '1');\n const estimate = estimateCost(finalTask, options.model, outputTokens);\n const cheapest = getCheapestAlternative(finalTask, outputTokens);\n\n logger.info(\n `Estimated cost (${estimate.model}): $${estimate.totalUsd.toFixed(4)} ` +\n `(in:${estimate.inputTokens} tok, out:${estimate.outputTokens} tok)`\n );\n\n if (cheapest.model !== estimate.model) {\n logger.info(\n `Cheaper alternative: ${cheapest.model} ($${cheapest.totalUsd.toFixed(4)})`\n );\n }\n\n if (!options.skipCostCheck && estimate.totalUsd > maxCost) {\n const { confirm } = await (await import('inquirer')).default.prompt([{\n type: 'confirm',\n name: 'confirm',\n message: `Estimated cost $${estimate.totalUsd.toFixed(4)} exceeds limit $${maxCost.toFixed(2)}. Continue?`,\n default: false\n }]);\n\n if (!confirm) {\n logger.warn('Dispatch cancelled by cost guard.');\n return;\n }\n }\n\n const dispatchOptions = {\n ...options,\n project: projectDir,\n sessionId,\n images: options.image || []\n };\n\n await sessionManager.appendHistory({\n type: 'dispatch_request',\n agent,\n task: finalTask,\n projectDir\n });\n\n logger.info(`Dispatching task to ${agent}: ${finalTask}`);\n let result: any;\n if (options.cache) {\n const cacheKey = TokenCache.hashKey(JSON.stringify({\n kind: 'dispatch-output',\n agent,\n task: finalTask,\n projectDir,\n gateway: options.gateway || '',\n model: options.model || '',\n engine: options.engine || '',\n direct: Boolean(options.direct),\n bypass: Boolean(options.bypass)\n }));\n const cached = await tokenCache.get<any>('output', cacheKey);\n if (cached.hit && cached.value) {\n logger.info('Using cached dispatch output.');\n result = cached.value;\n await sessionManager.trackCacheSavings({\n hit: true,\n tokensSaved: Number(cached.meta?.tokensSaved || 0),\n usdSaved: Number(cached.meta?.usdSaved || 0)\n });\n } else {\n await sessionManager.trackCacheSavings({ miss: true });\n const dispatched = await dispatchWithFallback(\n agentRouter,\n agent,\n finalTask,\n dispatchOptions,\n fallbackModels,\n checkpoints,\n runId\n );\n result = dispatched.result;\n await tokenCache.set(\n 'output',\n cacheKey,\n result,\n Number.parseInt(options.cacheTtl || '1800', 10),\n {\n tokensSaved: estimate.inputTokens + estimate.outputTokens,\n usdSaved: estimate.totalUsd,\n source: 'dispatch-output'\n }\n );\n }\n } else {\n const dispatched = await withRetries(\n async () => dispatchWithFallback(\n agentRouter,\n agent,\n finalTask,\n dispatchOptions,\n fallbackModels,\n checkpoints,\n runId\n ),\n policy,\n { shouldRetry: shouldRetryWithFallback }\n );\n result = dispatched.result;\n }\n\n await sessionManager.appendHistory({\n type: 'dispatch_result',\n agent,\n taskId: result.taskId || null,\n success: Boolean(result.success),\n result: result.result\n });\n if (useMemory) {\n const response = String(result.result || '').trim();\n const validation = extractValidationSignals(result, Boolean(options.memoryRequireValidation));\n if (Boolean(result.success) && response.length > 0 && validation.passed) {\n const saved = await agentKeeper.recordSafe({\n runId,\n tier: 'orchestrator',\n task,\n result: response,\n agent,\n structured: {\n problem: task,\n validation: {\n lintPassed: validation.lintPassed,\n testsPassed: validation.testsPassed,\n notes: validation.notes\n },\n outcome: 'success'\n },\n metadata: {\n taskId: result.taskId || null,\n success: true,\n validationRequired: validation.required,\n validationPassed: validation.passed\n }\n });\n if (!saved.ok) {\n logger.warn(`Memory write skipped: ${saved.error}`);\n }\n }\n }\n await sessionManager.appendRouting({\n route: 'DISPATCH',\n model: result.model || 'unknown',\n agent,\n taskId: result.taskId || null\n });\n await sessionManager.trackCost({\n model: result.model || estimate.model || 'unknown',\n usd: result.costUsd || estimate.totalUsd || 0,\n promptTokens: result.promptTokens || estimate.inputTokens || 0,\n completionTokens: result.completionTokens || estimate.outputTokens || 0\n });\n\n const responseText = String(result.result || '');\n const edits = await orchestrator.parseAndApplyToSandbox(responseText);\n const capabilityHandshake = getCapabilityHandshake('standalone');\n await checkpoints.append(runId, 'dispatch.completed', {\n agent,\n success: Boolean(result.success),\n edits: edits.length\n });\n let riskReport: any = null;\n let patchRisk: any = null;\n if (edits.length > 0) {\n riskReport = await analyzeBlastRadius(process.cwd(), { changedFiles: edits });\n patchRisk = scorePatchRisk({\n blastRadius: riskReport,\n changedFiles: edits.length\n });\n logger.info(`Patch confidence: ${(patchRisk.confidence * 100).toFixed(0)}% (risk score ${patchRisk.riskScore}/100, ${patchRisk.riskLevel})`);\n if (options.escalateRisk && isSeverityAtLeast(patchRisk.riskLevel, String(options.riskThreshold || 'high').toLowerCase() as any)) {\n const escalationTask = `High-risk patch review requested.\\nRisk score: ${patchRisk.riskScore}/100 (${patchRisk.riskLevel}).\\nFiles: ${edits.join(', ')}.\\nPlease review for correctness, regressions, and security concerns.`;\n const qa = await dispatchWithFallback(agentRouter, 'crew-qa', escalationTask, {\n project: projectDir,\n sessionId,\n gateway: options.gateway\n }, fallbackModels, checkpoints, runId);\n const sec = await dispatchWithFallback(agentRouter, 'crew-security', escalationTask, {\n project: projectDir,\n sessionId,\n gateway: options.gateway\n }, fallbackModels, checkpoints, runId);\n logger.info(chalk.yellow('\\n--- QA Escalation ---'));\n logger.printWithHighlight(String(qa.result.result || ''));\n logger.info(chalk.yellow('\\n--- Security Escalation ---'));\n logger.printWithHighlight(String(sec.result.result || ''));\n }\n }\n\n if (options.json) {\n printJsonEnvelope('dispatch.result', {\n runId,\n agent,\n taskId: result.taskId || null,\n success: Boolean(result.success),\n response: responseText,\n edits,\n needsApproval: edits.length > 0,\n risk: patchRisk || null,\n blastRadius: riskReport || null,\n capabilityHandshake\n });\n await checkpoints.finish(runId, 'completed');\n return;\n }\n\n logger.success('Task completed:', result);\n await checkpoints.finish(runId, 'completed');\n } catch (error) {\n await sessionManager.appendHistory({\n type: 'dispatch_error',\n agent,\n task: finalTask,\n error: error.message\n });\n await checkpoints.append(runId, 'dispatch.error', { error: error.message });\n await checkpoints.finish(runId, 'failed');\n logger.error('Dispatch failed:', error.message);\n process.exit(1);\n }\n });\n\n program\n .command('status')\n .description('Show CrewSwarm orchestration status dashboard')\n .action(async () => {\n const { displayStatus } = await import('../status/dashboard.ts');\n await displayStatus();\n });\n\n program\n .command('capabilities')\n .description('Show runtime capability handshake for current interface mode')\n .option('--json', 'Output as JSON', false)\n .action(options => {\n // crew-CLI is always standalone - no connected mode\n const mode = 'standalone';\n const handshake = getCapabilityHandshake(mode);\n if (options.json) {\n printJsonEnvelope('capabilities', { handshake });\n return;\n }\n console.log(chalk.blue('\\n--- Capability Handshake ---\\n'));\n console.log(` mode : ${handshake.mode}`);\n console.log(` can_read : ${handshake.can_read}`);\n console.log(` can_write : ${handshake.can_write}`);\n console.log(` can_pty : ${handshake.can_pty}`);\n console.log(` can_lsp : ${handshake.can_lsp}`);\n console.log(` can_dispatch: ${handshake.can_dispatch}`);\n console.log(` can_git : ${handshake.can_git}`);\n });\n\n program\n .command('run')\n .description('Execute unified pipeline task (supports phase-aware resume from trace checkpoint)')\n .option('-t, --task <text>', 'Task text for a new run')\n .option('--resume <traceId>', 'Resume/replay a prior pipeline trace id')\n .option('--from-phase <phase>', 'Resume from phase: plan|execute|validate')\n .option('--retry-attempts <n>', 'Retry attempts for transient failures', '2')\n .option('--strict-preflight', 'Block execution if doctor checks fail', false)\n .option('-g, --gateway <url>', 'Gateway URL for strict preflight checks')\n .option('--json', 'Output machine-readable JSON envelope', false)\n .action(async options => {\n try {\n const policy = getExecutionPolicy({\n strictPreflight: Boolean(options.strictPreflight),\n retryAttempts: Number.parseInt(options.retryAttempts || '2', 10)\n });\n await enforceStrictPreflight(policy, options.gateway);\n\n let task = String(options.task || '').trim();\n let resumedFrom: string | null = null;\n let previousPhase: string | null = null;\n let resumeContext: any = undefined;\n\n if (options.resume) {\n const traceId = String(options.resume).trim();\n const events = await loadPipelineRunEvents(traceId, process.cwd());\n const resumeInfo = inferResumeTask(events);\n if (!resumeInfo) {\n throw new Error(`Unable to infer task from trace ${traceId}.`);\n }\n task = task || resumeInfo.task;\n resumedFrom = traceId;\n previousPhase = resumeInfo.phase;\n const requestedPhase = String(options.fromPhase || '').toLowerCase();\n const fromPhase = requestedPhase || (previousPhase === 'failed' ? 'execute' : 'plan');\n if (!['plan', 'execute', 'validate'].includes(fromPhase)) {\n throw new Error(`Invalid --from-phase \"${fromPhase}\". Use plan|execute|validate.`);\n }\n const artifacts = extractResumeArtifacts(events);\n if (fromPhase === 'execute' || fromPhase === 'validate') {\n if (!artifacts.priorPlan) {\n throw new Error(`Trace ${traceId} missing prior plan artifact; cannot resume from ${fromPhase}.`);\n }\n }\n if (fromPhase === 'validate' && !artifacts.priorResponse) {\n throw new Error(`Trace ${traceId} missing prior validation input; cannot resume from validate.`);\n }\n resumeContext = {\n fromPhase,\n priorPlan: artifacts.priorPlan,\n priorResponse: artifacts.priorResponse,\n priorExecutionResults: artifacts.priorExecutionResults\n };\n\n if (previousPhase === 'complete' && fromPhase === 'plan') {\n if (options.json) {\n printJsonEnvelope('run.resume', {\n resumedFrom,\n previousPhase,\n task,\n skipped: true,\n reason: 'already-complete'\n });\n return;\n }\n logger.info(`Trace ${traceId} already completed. Re-running task for deterministic replay.`);\n }\n }\n\n if (!task) {\n throw new Error('Provide --task for a new run or --resume <traceId> for replay.');\n }\n\n const sessionId = await sessionManager.getSessionId();\n const result = await withRetries(\n async () => orchestrator.executePipeline(task, '', sessionId, resumeContext),\n policy\n );\n const responseText = String(result.response || result.result || '');\n const edits = await orchestrator.parseAndApplyToSandbox(responseText);\n const capabilityHandshake = getCapabilityHandshake(\n String(process.env.CREW_INTERFACE_MODE || 'standalone').toLowerCase() === 'connected'\n ? 'connected'\n : 'standalone'\n );\n\n if (options.json) {\n printJsonEnvelope('run.result', {\n task,\n resumedFrom,\n previousPhase,\n resumedPhase: resumeContext?.fromPhase || null,\n traceId: result.traceId || null,\n phase: result.phase || null,\n decision: result.plan?.decision || null,\n executionPath: Array.isArray(result.executionPath) ? result.executionPath : [],\n timeline: Array.isArray(result.timeline) ? result.timeline : [],\n response: responseText,\n edits,\n needsApproval: edits.length > 0,\n capabilityHandshake\n });\n return;\n }\n\n logger.printWithHighlight(responseText);\n if (Array.isArray(result.timeline) && result.timeline.length > 0) {\n console.log(chalk.gray('\\nPipeline timeline:'));\n for (const step of result.timeline) {\n console.log(chalk.gray(` - ${step.phase} @ ${step.ts}`));\n }\n }\n if (edits.length > 0) {\n logger.success(`Staged ${edits.length} file change(s). Run \"crew preview\" then \"crew apply\".`);\n }\n } catch (error) {\n logger.error(`Run failed: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\n program\n .command('map')\n .description('Generate a repository structure graph respecting .gitignore')\n .option('--graph', 'Emit dependency graph instead of tree output', false)\n .option('--visualize', 'Generate interactive HTML graph (implies --graph)', false)\n .option('--out <path>', 'Output path for --visualize HTML', join(process.cwd(), '.crew', 'repo-graph.html'))\n .option('--json', 'Emit graph as JSON', false)\n .option('--max-nodes <n>', 'Limit graph nodes in text mode', '200')\n .action(async (options) => {\n const {\n buildRepositoryGraph,\n buildRepositoryMap,\n buildRepositoryGraphDot,\n buildRepositoryGraphHtml\n } = await import('../mapping/index.js');\n try {\n if (options.graph || options.visualize) {\n const graph = await buildRepositoryGraph(process.cwd());\n if (options.visualize) {\n const htmlPath = String(options.out || join(process.cwd(), '.crew', 'repo-graph.html'));\n await mkdir(dirname(htmlPath), { recursive: true });\n const html = buildRepositoryGraphHtml(graph);\n await writeFile(htmlPath, html, 'utf8');\n const dotPath = `${htmlPath}.dot`;\n await writeFile(dotPath, buildRepositoryGraphDot(graph), 'utf8');\n logger.success(`Wrote graph visualization: ${htmlPath}`);\n logger.info(`Wrote Graphviz DOT: ${dotPath}`);\n return;\n }\n if (options.json) {\n console.log(JSON.stringify(graph, null, 2));\n return;\n }\n const maxNodes = Number.parseInt(options.maxNodes || '200', 10);\n console.log(chalk.blue('--- Repository Dependency Graph ---'));\n console.log(`Root: ${graph.root}`);\n console.log(`Nodes: ${graph.nodeCount}`);\n console.log(`Edges: ${graph.edgeCount}`);\n const shown = graph.nodes.slice(0, Math.max(1, maxNodes));\n for (const node of shown) {\n const imports = node.imports.length ? node.imports.join(', ') : '(none)';\n const importedBy = node.importedBy.length ? node.importedBy.join(', ') : '(none)';\n console.log(`\\n- ${node.path}`);\n console.log(` imports: ${imports}`);\n console.log(` importedBy: ${importedBy}`);\n }\n if (graph.nodes.length > shown.length) {\n console.log(`\\n... ${graph.nodes.length - shown.length} more nodes omitted`);\n }\n return;\n }\n\n const map = await buildRepositoryMap(process.cwd());\n console.log(chalk.blue('--- Repository Tree Map ---'));\n console.log(map);\n } catch (err) {\n logger.error(`Failed to generate map: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n const lsp = program\n .command('lsp')\n .description('Language-server style utilities (typecheck, completions)');\n\n lsp\n .command('check')\n .description('Run TypeScript diagnostics for the current project')\n .argument('[files...]', 'Optional relative files to filter diagnostics')\n .option('--json', 'Emit JSON', false)\n .action(async (files, options) => {\n try {\n const { typeCheckProject } = await import('../lsp/index.js');\n const diagnostics = typeCheckProject(process.cwd(), files || []);\n if (options.json) {\n console.log(JSON.stringify({ count: diagnostics.length, diagnostics }, null, 2));\n return;\n }\n if (diagnostics.length === 0) {\n logger.success('No LSP diagnostics found.');\n return;\n }\n console.log(chalk.yellow(`Found ${diagnostics.length} diagnostic(s):`));\n for (const diag of diagnostics) {\n console.log(`${diag.category.toUpperCase()} ${diag.code} ${diag.file}:${diag.line}:${diag.column}`);\n console.log(` ${diag.message}`);\n }\n process.exit(1);\n } catch (error) {\n logger.error(`LSP check failed: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\n lsp\n .command('complete')\n .description('Get code completions at a cursor position')\n .argument('<file>', 'Relative or absolute path to source file')\n .argument('<line>', '1-based line number')\n .argument('<column>', '1-based column number')\n .option('--prefix <text>', 'Filter completions by prefix', '')\n .option('--limit <n>', 'Max completion count', '50')\n .option('--json', 'Emit JSON', false)\n .action(async (file, line, column, options) => {\n try {\n const { getCompletions } = await import('../lsp/index.js');\n const completions = getCompletions(\n process.cwd(),\n file,\n Number.parseInt(line, 10),\n Number.parseInt(column, 10),\n Number.parseInt(options.limit || '50', 10),\n String(options.prefix || '')\n );\n if (options.json) {\n console.log(JSON.stringify({ count: completions.length, completions }, null, 2));\n return;\n }\n if (completions.length === 0) {\n logger.warn('No completions found.');\n return;\n }\n console.log(chalk.blue(`Completions (${completions.length}):`));\n completions.forEach(item => {\n console.log(`- ${item.name} (${item.kind})`);\n });\n } catch (error) {\n logger.error(`LSP completion failed: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\n program\n .command('pty')\n .description('Run an interactive command in a pseudo-terminal')\n .argument('<command...>', 'Command to execute in PTY')\n .option('-p, --project <path>', 'Working directory', process.cwd())\n .option('--timeout <ms>', 'Timeout in milliseconds (0 disables)', '0')\n .action(async (commandArray, options) => {\n const command = commandArray.join(' ');\n try {\n const { runPtyCommand } = await import('../pty/index.js');\n const result = await runPtyCommand(command, {\n cwd: options.project || process.cwd(),\n timeoutMs: Number.parseInt(options.timeout || '0', 10)\n });\n if (!result.success) {\n process.exit(result.exitCode === 0 ? 1 : result.exitCode);\n }\n } catch (error) {\n logger.error(`PTY command failed: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\n program\n .command('shell')\n .description('Translate natural language into a shell command and execute it (GitHub Copilot CLI style)')\n .argument('<request...>', 'Natural language request (e.g. \"list files sorted by size\")')\n .option('-m, --model <id>', 'Model override for shell command generation')\n .action(async (requestArray, options) => {\n const { runShellCopilot } = await import('../shell/index.js');\n await runShellCopilot(requestArray.join(' '), agentRouter, {\n projectDir: process.cwd(),\n model: options.model\n });\n });\n\n program\n .command('exec')\n .description('Run a one-shot task or interactive terminal command with PTY support')\n .argument('<command>', 'Command to run')\n .argument('[args...]', 'Arguments for the command')\n .option('-m, --model <id>', 'Model override for one-shot task fallback')\n .option('--json', 'Output machine-readable JSON envelope for one-shot task fallback', false)\n .action(async (command, args, options) => {\n const looksLikeNaturalLanguage =\n args.length === 0 &&\n typeof command === 'string' &&\n /\\s/.test(command.trim());\n\n if (looksLikeNaturalLanguage) {\n logger.info('Interpreting `crew exec` input as a one-shot task. Use `crew exec <cmd> [args...]` for PTY commands.');\n try {\n const standaloneRuntime = await getStandaloneRuntime(process.cwd());\n const result = await standaloneRuntime.orchestrator.executeAgentic(command, {\n sessionId: await standaloneRuntime.sessionManager.getSessionId(),\n model: options.model\n });\n const responseText = String(result.response || result.result || '');\n const edits = await standaloneRuntime.orchestrator.parseAndApplyToSandbox(responseText);\n await standaloneRuntime.sessionManager.appendHistory({\n input: command,\n response: responseText,\n decision: result.plan?.decision || 'execute',\n agent: 'unified-pipeline',\n model: String(result.plan?.validation?.modelUsed || options.model || 'unknown'),\n costUsd: result.totalCost\n });\n if (options.json) {\n printJsonEnvelope('exec.result', {\n route: result.plan\n ? {\n decision: result.plan.decision.toUpperCase(),\n explanation: result.plan.reasoning\n }\n : { decision: 'EXECUTE', explanation: 'Direct L3 execution' },\n agent: 'unified-pipeline',\n response: responseText,\n edits,\n needsApproval: edits.length > 0,\n traceId: result.traceId,\n timeline: result.timeline\n });\n return;\n }\n console.log(responseText);\n if (edits.length > 0) {\n logger.success(`Added changes to ${edits.length} files in sandbox. Run \"crew preview\" to review.`);\n }\n return;\n } catch (err) {\n logger.error(`One-shot task failed: ${(err as Error).message}`);\n process.exit(1);\n }\n }\n\n // Unified: use src/pty implementation (has fallback logic)\n const { runPtyCommand } = await import('../pty/index.js');\n try {\n const fullCommand = [command, ...args].join(' ');\n const result = await runPtyCommand(fullCommand);\n process.exit(result.exitCode);\n } catch (err) {\n logger.error(`Interactive command failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n program\n .command('lsp-check')\n .description('Run LSP type checking on a file')\n .argument('<file>', 'File to check')\n .action(async (file) => {\n const { LspService } = await import('../lsp/index.js');\n const service = new LspService(process.cwd());\n const diagnostics = service.getDiagnostics(file);\n \n if (diagnostics.length === 0) {\n logger.success('No type errors found.');\n } else {\n console.log(chalk.red(`Found ${diagnostics.length} errors:`));\n diagnostics.forEach(d => console.log(`- ${d}`));\n }\n });\n\n program\n .command('lsp-complete')\n .description('Get LSP autocomplete suggestions at a specific position')\n .argument('<file>', 'File path')\n .argument('<line>', 'Line number (1-based)')\n .argument('<char>', 'Character number (1-based)')\n .action(async (file, lineStr, charStr) => {\n const { LspService } = await import('../lsp/index.js');\n const service = new LspService(process.cwd());\n const line = parseInt(lineStr, 10);\n const char = parseInt(charStr, 10);\n const completions = service.getCompletions(file, line, char);\n \n if (completions.length === 0) {\n logger.info('No completions found.');\n } else {\n console.log(chalk.blue(`--- Autocomplete (${completions.length}) ---`));\n console.log(completions.slice(0, 50).join(', ') + (completions.length > 50 ? '...' : ''));\n }\n });\n\n program\n .command('explore')\n .description('Speculative execution: run a task on 3 parallel branches with different strategies')\n .argument('<task...>', 'Task to explore')\n .option('-p, --project <path>', 'Project directory')\n .option('-g, --gateway <url>', 'Override gateway URL')\n .action(async (taskArray, options) => {\n const task = taskArray.join(' ');\n const projectDir = options.project || process.cwd();\n const sessionId = await sessionManager.getSessionId();\n\n logger.info(chalk.blue(`\\n\uD83D\uDD00 Exploring 3 approaches for: ${task}`));\n\n const branches = [\n { name: 'explore-minimal', prompt: `Implement this task with the MINIMAL possible changes. Be extremely concise and surgical: \"${task}\"` },\n { name: 'explore-clean', prompt: `Implement this task following CLEAN ARCHITECTURE principles. Prioritize maintainability and best practices: \"${task}\"` },\n { name: 'explore-pragmatic', prompt: `Implement this task with a PRAGMATIC approach. Balance speed and quality: \"${task}\"` }\n ];\n\n const originalBranch = sandbox.getActiveBranch();\n const results: any[] = [];\n\n // Run in parallel\n await Promise.all(branches.map(async (b) => {\n try {\n logger.info(chalk.gray(` Starting ${b.name}...`));\n \n // Create and switch to branch\n try {\n await sandbox.createBranch(b.name, originalBranch);\n } catch {\n await sandbox.switchBranch(b.name);\n await sandbox.rollback(b.name);\n }\n\n const result = await agentRouter.dispatch('crew-coder', b.prompt, {\n project: projectDir,\n sessionId: `${sessionId}-${b.name}`,\n gateway: options.gateway\n });\n\n const edits = await orchestrator.parseAndApplyToSandbox(String(result.result || ''));\n \n results.push({\n name: b.name,\n success: true,\n edits: edits.length,\n result: result.result\n });\n\n logger.success(` \u2713 Completed ${b.name} (${edits.length} files)`);\n } catch (err) {\n logger.error(` \u2717 ${b.name} failed: ${(err as Error).message}`);\n results.push({ name: b.name, success: false, error: (err as Error).message });\n }\n }));\n\n // Switch back to original branch\n await sandbox.switchBranch(originalBranch);\n\n console.log(chalk.blue('\\n--- Exploration Results ---'));\n results.forEach(r => {\n if (r.success) {\n console.log(chalk.green(` ${r.name}: ${r.edits} files modified`));\n } else {\n console.log(chalk.red(` ${r.name}: Failed (${r.error})`));\n }\n });\n\n const { choice } = await (import('inquirer')).then(m => m.default.prompt([{\n type: 'list',\n name: 'choice',\n message: 'Which approach would you like to inspect or merge?',\n choices: [\n ...results.filter(r => r.success).map(r => r.name),\n 'none'\n ]\n }]));\n\n if (choice !== 'none') {\n await sandbox.switchBranch(choice);\n logger.info(`Switched to branch: ${choice}. Use \"crew preview\" to review or \"crew merge ${choice} main\" to merge.`);\n }\n });\n\n program\n .command('repos-scan')\n .description('Detect sibling git repositories')\n .action(async () => {\n const repos = await findSiblingRepos(process.cwd());\n if (repos.length === 0) {\n console.log(chalk.yellow('No sibling repositories found.'));\n return;\n }\n console.log(chalk.blue('Sibling repos:'));\n repos.forEach(path => console.log(`- ${path}`));\n });\n\n program\n .command('repos-context')\n .description('Show cross-repo context for sibling repositories')\n .action(async () => {\n const context = await collectMultiRepoContext(process.cwd());\n console.log(context);\n });\n\n program\n .command('repos-sync')\n .description('Sync and store sibling repository snapshots to .crew/multi-repo-sync.json')\n .action(async () => {\n const outPath = await syncRepoSnapshots(process.cwd());\n logger.success(`Wrote snapshot to ${outPath}`);\n });\n\n program\n .command('repos-warn')\n .description('Warn about potential cross-repo API breaking changes')\n .action(async () => {\n const repos = await findSiblingRepos(process.cwd());\n if (repos.length === 0) {\n console.log(chalk.yellow('No sibling repositories found.'));\n return;\n }\n\n let hasWarnings = false;\n for (const repo of repos) {\n const summary = await getRepoSummary(repo);\n const warnings = await detectBreakingApiSignals(repo);\n if (warnings.length > 0) {\n hasWarnings = true;\n console.log(chalk.red(`\\n[${summary.name}]`));\n warnings.forEach(w => console.log(`- ${w}`));\n }\n }\n\n if (!hasWarnings) {\n console.log(chalk.green('No obvious API-breaking signals detected in sibling repos.'));\n }\n });\n\n program\n .command('sync')\n .description('Upload/download team context and merge team corrections')\n .option('--upload', 'Upload local .crew session/corrections to team store')\n .option('--download', 'Download shared team context into local .crew')\n .option('--status', 'Show team sync status and privacy controls')\n .action(async options => {\n if (options.upload) {\n const result = await uploadTeamContext(process.cwd());\n logger.success(`Uploaded team context: ${result.sessionOut}, ${result.correctionsOut}`);\n }\n if (options.download) {\n const result = await downloadTeamContext(process.cwd());\n logger.success(`Downloaded/merged team context. Corrections entries: ${result.mergedCount}`);\n }\n if (options.status || (!options.upload && !options.download)) {\n const status = await getTeamSyncStatus(process.cwd());\n console.log(chalk.blue('--- Team Sync Status ---'));\n console.log(`Dir: ${status.teamDir}`);\n console.log(`Files: ${status.files.length}`);\n console.log(`Privacy: ${JSON.stringify(status.privacy)}`);\n }\n });\n\n const configCmd = program\n .command('config')\n .description('Manage repo-level configuration in .crew/config.json and .crew/config.local.json');\n\n configCmd\n .command('show')\n .description('Show resolved/team/user repo configuration')\n .option('--scope <scope>', 'resolved | team | user', 'resolved')\n .option('--json', 'Output JSON', false)\n .action(async (options) => {\n const scope = String(options.scope || 'resolved').toLowerCase();\n if (!['resolved', 'team', 'user'].includes(scope)) {\n logger.error('Invalid scope. Use: resolved | team | user');\n process.exit(1);\n }\n const value = scope === 'resolved'\n ? await loadResolvedRepoConfig(process.cwd())\n : await readRepoConfig(process.cwd(), scope as 'team' | 'user');\n const redacted = redactRepoConfigForDisplay(value);\n if (options.json) {\n console.log(JSON.stringify(redacted, null, 2));\n return;\n }\n console.log(chalk.blue(`--- Repo Config (${scope}) ---`));\n console.log(JSON.stringify(redacted, null, 2));\n });\n\n configCmd\n .command('get')\n .description('Get a repo config value by dotted key path')\n .argument('<key>', 'Dotted key path (e.g. cli.model)')\n .option('--scope <scope>', 'resolved | team | user', 'resolved')\n .option('--json', 'Output JSON', false)\n .action(async (key, options) => {\n const scope = String(options.scope || 'resolved').toLowerCase();\n if (!['resolved', 'team', 'user'].includes(scope)) {\n logger.error('Invalid scope. Use: resolved | team | user');\n process.exit(1);\n }\n const source = scope === 'resolved'\n ? await loadResolvedRepoConfig(process.cwd())\n : await readRepoConfig(process.cwd(), scope as 'team' | 'user');\n const value = getNestedValue(source as Record<string, unknown>, String(key));\n if (value === undefined) {\n logger.warn(`No value found for key \"${key}\" in ${scope} config.`);\n process.exit(1);\n }\n const redacted = redactRepoConfigForDisplay(value);\n if (options.json) {\n console.log(JSON.stringify(redacted, null, 2));\n return;\n }\n if (typeof redacted === 'object') {\n console.log(JSON.stringify(redacted, null, 2));\n } else {\n console.log(String(redacted));\n }\n });\n\n configCmd\n .command('set')\n .description('Set a repo config value by dotted key path')\n .argument('<key>', 'Dotted key path (e.g. repl.autoApply)')\n .argument('<value>', 'Value (string by default, or JSON with --json)')\n .option('--scope <scope>', 'team | user', 'user')\n .option('--json', 'Parse value as JSON', false)\n .action(async (key, value, options) => {\n const scope = String(options.scope || 'user').toLowerCase();\n if (!['team', 'user'].includes(scope)) {\n logger.error('Invalid scope for set. Use: team | user');\n process.exit(1);\n }\n let parsedValue: unknown;\n try {\n parsedValue = parseConfigValue(String(value), Boolean(options.json));\n } catch (error) {\n logger.error(`Invalid value: ${(error as Error).message}`);\n process.exit(1);\n }\n await setRepoConfigValue(process.cwd(), scope as 'team' | 'user', String(key), parsedValue);\n logger.success(`Set ${scope}.${String(key)} = ${JSON.stringify(redactRepoConfigForDisplay(parsedValue))}`);\n });\n\n program\n .command('github')\n .description('Natural language GitHub issue/PR flows via gh CLI')\n .argument('<request...>', 'Natural language request or \"doctor\"')\n .option('--repo <owner/name>', 'Override GitHub repository (default: current git remote)')\n .option('--limit <n>', 'Default list limit for list requests', '10')\n .option('-y, --yes', 'Skip confirmation gate for mutating actions', false)\n .option('--dry-run', 'Parse and print the exact gh command without executing', false)\n .option('--json', 'Output raw gh JSON for list flows when available', false)\n .action(async (requestArray, options) => {\n const request = String((requestArray || []).join(' ') || '').trim();\n if (request.toLowerCase() === 'doctor') {\n const checks = await runGitHubDoctor(process.cwd(), options.repo);\n let failed = false;\n for (const check of checks) {\n const marker = check.ok ? chalk.green('\u2713') : chalk.red('\u2717');\n console.log(`${marker} ${check.name}: ${check.details}`);\n if (!check.ok) failed = true;\n }\n if (failed) process.exit(1);\n return;\n }\n const intent = parseGitHubIntent(request, {\n defaultLimit: Number.parseInt(options.limit || '10', 10)\n });\n if (intent.kind === 'unknown') {\n logger.error(intent.reason);\n logger.info('Try examples:');\n logger.info(' crew github \"list open issues limit 20\"');\n logger.info(' crew github \"create issue \\\\\"Fix login bug\\\\\" body: repro steps...\"');\n logger.info(' crew github \"update issue #42 close\"');\n logger.info(' crew github \"create draft pr \\\\\"Refactor auth\\\\\" body: summary...\"');\n process.exit(1);\n }\n\n logger.info(`Intent: ${describeIntent(intent)}`);\n const ghArgs = buildGitHubCommand(intent, options.repo);\n if (options.dryRun) {\n console.log(chalk.blue('\\n--- GitHub Dry Run ---'));\n console.log(`Intent: ${describeIntent(intent)}`);\n console.log(`Command: ${commandToShell(ghArgs)}`);\n return;\n }\n if (requiresConfirmation(intent) && !options.yes) {\n const answer = await (await import('inquirer')).default.prompt([{\n type: 'confirm',\n name: 'confirm',\n message: `Proceed with: ${describeIntent(intent)}?`,\n default: false\n }]);\n if (!answer.confirm) {\n logger.warn('Cancelled.');\n return;\n }\n }\n\n try {\n const output = await executeGitHubIntent(intent, {\n cwd: process.cwd(),\n repo: options.repo\n });\n if (options.json || intent.kind === 'issue_create' || intent.kind === 'issue_update' || intent.kind === 'pr_draft') {\n console.log(output);\n return;\n }\n try {\n const parsed = JSON.parse(output);\n console.log(JSON.stringify(parsed, null, 2));\n } catch {\n console.log(output);\n }\n } catch (error) {\n logger.error(`GitHub command failed: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\n program\n .command('privacy')\n .description('Configure privacy controls for team sync')\n .option('--preset <name>', 'full | metadata | no-content')\n .option('--share-prompt <bool>', 'true|false')\n .option('--share-original <bool>', 'true|false')\n .option('--share-corrected <bool>', 'true|false')\n .option('--share-tags <bool>', 'true|false')\n .action(async options => {\n const current = await loadPrivacyControls(process.cwd());\n const parseBool = (value: string | undefined, fallback: boolean) => {\n if (value === undefined) return fallback;\n return String(value).toLowerCase() === 'true';\n };\n\n let next = { ...current };\n if (options.preset) {\n const preset = String(options.preset).toLowerCase();\n if (preset === 'full') {\n next = { sharePrompt: true, shareOriginal: true, shareCorrected: true, shareTags: true };\n } else if (preset === 'metadata') {\n next = { sharePrompt: false, shareOriginal: false, shareCorrected: false, shareTags: true };\n } else if (preset === 'no-content') {\n next = { sharePrompt: false, shareOriginal: false, shareCorrected: false, shareTags: false };\n }\n }\n\n next = {\n sharePrompt: parseBool(options.sharePrompt, next.sharePrompt),\n shareOriginal: parseBool(options.shareOriginal, next.shareOriginal),\n shareCorrected: parseBool(options.shareCorrected, next.shareCorrected),\n shareTags: parseBool(options.shareTags, next.shareTags)\n };\n\n await savePrivacyControls(next, process.cwd());\n logger.success(`Saved privacy controls: ${JSON.stringify(next)}`);\n });\n\n program\n .command('listen')\n .description('Voice mode: record speech, transcribe via Whisper, run command, and optionally speak response')\n .option('--duration-sec <n>', 'Recording duration in seconds', '6')\n .option('--provider <id>', 'STT provider: auto | groq | openai | whisper-cli', 'auto')\n .option('--text <value>', 'Skip recording and use raw text directly')\n .option('--continuous', 'Keep listening in a loop', false)\n .option('--max-rounds <n>', 'Maximum rounds in continuous mode', '5')\n .option('--no-tts', 'Disable TTS response playback')\n .option('--tts-skill <id>', 'CrewSwarm skill for TTS', 'elevenlabs.tts')\n .action(async options => {\n const durationSec = Number.parseInt(options.durationSec || '6', 10);\n const maxRounds = Math.max(1, Number.parseInt(options.maxRounds || '5', 10));\n let round = 0;\n\n while (true) {\n round += 1;\n if (options.continuous) {\n logger.progress(round - 1, maxRounds, 'Listen');\n }\n\n let userText = String(options.text || '').trim();\n if (!userText) {\n logger.info(`Listening for ${durationSec}s...`);\n const audioPath = await recordAudio({ durationSec });\n userText = await transcribeAudio(audioPath, {\n provider: options.provider\n });\n }\n\n if (!userText) {\n logger.warn('No speech detected.');\n if (!options.continuous || round >= maxRounds) break;\n continue;\n }\n\n await appendVoiceTranscript(process.cwd(), 'user', userText);\n logger.info(`Heard: ${userText}`);\n\n const route = await orchestrator.route(userText);\n const agent = route.agent || 'crew-main';\n const response = await agentRouter.dispatch(agent, userText, {\n sessionId: await sessionManager.getSessionId(),\n project: process.cwd()\n });\n\n const responseText = String(response.result || '');\n logger.printWithHighlight(responseText);\n await appendVoiceTranscript(process.cwd(), 'assistant', responseText);\n\n if (options.tts) {\n try {\n await speakWithSkill(agentRouter, responseText, options.ttsSkill || 'elevenlabs.tts');\n logger.success(`Spoken via ${options.ttsSkill || 'elevenlabs.tts'}`);\n } catch (ttsErr) {\n logger.warn(`TTS failed: ${(ttsErr as Error).message}`);\n }\n }\n\n if (!options.continuous || round >= maxRounds) {\n if (options.continuous) {\n logger.progress(maxRounds, maxRounds, 'Listen');\n }\n break;\n }\n }\n });\n\n program\n .command('review')\n .description('Analyze current git diff before commit and request a QA-style review')\n .option('--agent <id>', 'Agent to run review with', 'crew-qa')\n .option('--strict', 'Exit non-zero if review includes high-severity findings', false)\n .action(async options => {\n const review = await getReviewPayload(process.cwd());\n if (!review.hasChanges) {\n logger.warn('No staged/unstaged git diff detected.');\n return;\n }\n logger.info(`Dispatching diff review to ${options.agent}`);\n const result = await agentRouter.dispatch(options.agent, review.payload, {\n sessionId: await sessionManager.getSessionId(),\n project: process.cwd(),\n injectGitContext: false\n });\n const text = String(result.result || '');\n logger.printWithHighlight(text);\n if (options.strict) {\n const strict = detectHighSeverityFindings(text);\n if (strict.hasHighSeverity) {\n logger.error(`Strict review failed due to high-severity markers: ${strict.matches.join(', ')}`);\n process.exit(1);\n }\n }\n });\n\n program\n .command('context')\n .description('Inspect current prompt/context footprint')\n .option('-p, --project <path>', 'Project directory', process.cwd())\n .action(async options => {\n const project = options.project || process.cwd();\n const gitContext = await getProjectContext(project);\n const session = await sessionManager.loadSession();\n const tokenEstimate = Math.ceil((gitContext.length + JSON.stringify(session.history).length) / 4);\n\n console.log(chalk.blue('--- Context Report ---'));\n console.log(`Project: ${project}`);\n console.log(`Session entries: ${session.history.length}`);\n console.log(`Git context chars: ${gitContext.length}`);\n console.log(`Estimated tokens in active context: ~${tokenEstimate}`);\n });\n\n program\n .command('compact')\n .description('Compact local session/cost context windows to keep prompts lean')\n .option('--history <n>', 'Keep last N history entries', '200')\n .option('--cost <n>', 'Keep last N cost entries', '500')\n .option('--write-summary', 'Write compact context summary file', true)\n .action(async options => {\n const result = await sessionManager.compact({\n keepHistory: Number.parseInt(options.history || '200', 10),\n keepCostEntries: Number.parseInt(options.cost || '500', 10)\n });\n\n if (options.writeSummary) {\n const session = await sessionManager.loadSession();\n const last = session.history.slice(-10);\n const summary = [\n '# Compact Context Summary',\n '',\n `Updated: ${new Date().toISOString()}`,\n `History entries kept: ${session.history.length}`,\n '',\n '## Recent activity',\n ...last.map((entry: any) => `- ${entry.timestamp} ${entry.type}${entry.agent ? ` (${entry.agent})` : ''}`)\n ].join('\\n');\n await writeFile(join(process.cwd(), '.crew', 'context-summary.md'), `${summary}\\n`, 'utf8');\n }\n\n logger.success(\n `Compacted session history ${result.historyBefore} -> ${result.historyAfter}, ` +\n `cost entries ${result.costBefore} -> ${result.costAfter}`\n );\n });\n\n const mcp = program\n .command('mcp')\n .description('Manage MCP server entries (add/list/remove)');\n\n mcp\n .command('list')\n .description('List local MCP servers from .crew/mcp-servers.json')\n .action(async () => {\n const servers = await listMcpServers(process.cwd());\n const names = Object.keys(servers);\n if (!names.length) {\n logger.warn('No MCP servers configured.');\n return;\n }\n names.forEach(name => {\n const item = servers[name];\n console.log(`- ${name}: ${item.url}${item.bearerTokenEnvVar ? ` (token env: ${item.bearerTokenEnvVar})` : ''}`);\n });\n });\n\n mcp\n .command('doctor')\n .description('Validate MCP server config, env tokens, and reachability')\n .action(async () => {\n const checks = await doctorMcpServers(process.cwd());\n checks.forEach(check => {\n const marker = check.ok ? chalk.green('\u2713') : chalk.red('\u2717');\n console.log(`${marker} ${check.server}: ${check.details}`);\n });\n if (checks.some(x => !x.ok)) process.exit(1);\n });\n\n mcp\n .command('add')\n .description('Add an MCP server entry')\n .argument('<name>', 'Server name')\n .requiredOption('--url <url>', 'MCP server URL')\n .option('--bearer-token-env-var <var>', 'Bearer token env variable name')\n .option('--header <kv>', 'Custom header key:value (repeatable)', collectOption, [])\n .option('--client <id>', 'Optional client sync: cursor | claude | opencode | codex')\n .action(async (name, options) => {\n const headers: Record<string, string> = {};\n for (const raw of options.header || []) {\n const [key, ...rest] = String(raw).split(':');\n if (key && rest.length) headers[key.trim()] = rest.join(':').trim();\n }\n await addMcpServer(name, {\n url: options.url,\n bearerTokenEnvVar: options.bearerTokenEnvVar,\n headers\n }, process.cwd(), options.client);\n logger.success(`Added MCP server \"${name}\"`);\n });\n\n mcp\n .command('remove')\n .description('Remove an MCP server entry')\n .argument('<name>', 'Server name')\n .option('--client <id>', 'Optional client sync removal: cursor | claude | opencode | codex')\n .action(async (name, options) => {\n await removeMcpServer(name, process.cwd(), options.client);\n logger.success(`Removed MCP server \"${name}\"`);\n });\n\n const headless = program\n .command('headless')\n .description('Headless execution controls for CI automation');\n\n headless\n .command('run')\n .requiredOption('-t, --task <text>', 'Task text')\n .option('--agent <id>', 'Override routed agent')\n .option('-g, --gateway <url>', 'Override gateway URL')\n .option('--json', 'Emit JSONL events', false)\n .option('--always-approve', 'Auto-apply sandbox changes', false)\n .option('--force-auto-apply', 'Bypass risk gate for auto-apply', false)\n .option('--risk-threshold <level>', 'Auto-apply risk threshold (low|medium|high)', 'high')\n .option('--retry-attempts <n>', 'Retry attempts for transient failures', '2')\n .option('--fallback-model <id>', 'Fallback model chain entry (repeatable)', collectOption, [])\n .option('--strict-preflight', 'Block execution if doctor checks fail', false)\n .option('--out <path>', 'Write JSONL events to file (for CI artifacts)')\n .action(async options => {\n const policy = getExecutionPolicy({\n strictPreflight: Boolean(options.strictPreflight),\n retryAttempts: Number.parseInt(options.retryAttempts || '2', 10),\n riskThreshold: String(options.riskThreshold || 'high').toLowerCase() as any,\n forceAutoApply: Boolean(options.forceAutoApply)\n });\n await enforceStrictPreflight(policy, options.gateway);\n const result = await runHeadlessTask({\n task: options.task,\n agent: options.agent,\n json: options.json,\n alwaysApprove: options.alwaysApprove,\n forceAutoApply: options.forceAutoApply,\n riskThreshold: policy.riskThreshold,\n retryAttempts: policy.retryAttempts,\n fallbackModels: options.fallbackModel || [],\n out: options.out,\n gateway: options.gateway,\n projectDir: process.cwd(),\n router: agentRouter,\n orchestrator,\n sandbox,\n session: sessionManager\n });\n if (!result.success) process.exit(1);\n });\n\n headless\n .command('pause')\n .description('Pause headless execution')\n .action(async () => {\n await setHeadlessPaused(true, process.cwd());\n logger.success('Headless mode paused.');\n });\n\n headless\n .command('resume')\n .description('Resume headless execution')\n .action(async () => {\n await setHeadlessPaused(false, process.cwd());\n logger.success('Headless mode resumed.');\n });\n\n headless\n .command('status')\n .description('Show headless pause/resume state')\n .action(async () => {\n const state = await getHeadlessState(process.cwd());\n console.log(`paused=${state.paused} updatedAt=${state.updatedAt || 'n/a'}`);\n });\n\n program\n .command('src')\n .description('Run Sourcegraph src CLI commands (for batch codemods/search)')\n .allowUnknownOption(true)\n .argument('<args...>', 'Arguments passed to src CLI')\n .action(async (srcArgs: string[]) => {\n if (srcArgs[0] === 'batch-plan') {\n const args = srcArgs.slice(1);\n const readValue = (...names: string[]) => {\n for (let i = 0; i < args.length; i += 1) {\n if (names.includes(args[i])) return args[i + 1];\n }\n return undefined;\n };\n const repos: string[] = [];\n for (let i = 0; i < args.length; i += 1) {\n if (args[i] === '--repo' && args[i + 1]) repos.push(args[i + 1]);\n }\n const plan = await createSrcBatchPlan({\n query: readValue('--query', '-q') || '',\n repos,\n execute: args.includes('--execute'),\n specPath: readValue('--spec')\n }, process.cwd());\n\n if (plan.success) {\n logger.success(plan.message);\n return;\n }\n logger.error(plan.message);\n process.exit(1);\n }\n\n const result = await runSrcCli(srcArgs, process.cwd());\n if (result.stdout) process.stdout.write(result.stdout);\n if (result.stderr) process.stderr.write(result.stderr);\n if (!result.success) process.exit(result.code || 1);\n });\n\n program\n .command('estimate')\n .description('Estimate token usage and compare model costs before execution')\n .argument('<task...>', 'Task or prompt text')\n .option('--output-tokens <count>', 'Expected completion tokens', '1200')\n .action((taskArray, options) => {\n const task = taskArray.join(' ');\n const outputTokens = Number.parseInt(options.outputTokens || '1200', 10);\n const estimates = compareModelCosts(task, outputTokens);\n\n console.log(chalk.blue('--- Cost Estimates (lowest first) ---'));\n estimates.forEach(item => {\n console.log(\n `${chalk.green(item.model)} ` +\n `total=$${item.totalUsd.toFixed(4)} ` +\n `(in ${item.inputTokens} tok, out ${item.outputTokens} tok)`\n );\n });\n });\n\n program\n .command('list')\n .description('List available agents')\n .action(async () => {\n try {\n const agents = await agentRouter.listAgents();\n agents.forEach(agent => {\n console.log(chalk.green(`\u2713 ${agent.name}`), chalk.gray(`- ${agent.role}`));\n });\n } catch (error) {\n logger.error('Failed to list agents:', error.message);\n process.exit(1);\n }\n });\n\n program\n .command('status')\n .description('Check system status')\n .action(async () => {\n try {\n const status = await agentRouter.getStatus();\n console.log(chalk.blue('System Status:'));\n console.log(`Agents Online: ${status.agentsOnline}`);\n console.log(`Tasks Active: ${status.tasksActive}`);\n console.log(`RT Bus: ${status.rtBusStatus}`);\n } catch (error) {\n logger.error('Status check failed:', error.message);\n process.exit(1);\n }\n });\n\n program\n .command('history')\n .description('Show recent session activity history')\n .option('-n, --limit <count>', 'Number of entries to show', '5')\n .action(async (options) => {\n const session = await sessionManager.loadSession();\n const limit = Number.parseInt(options.limit || '5', 10);\n const entries = session.history.slice(-limit);\n\n console.log(chalk.blue(`--- Recent History (${entries.length} entries) ---`));\n entries.forEach((e: any, i: number) => {\n const time = e.timestamp.split('T')[1].split('.')[0];\n console.log(`${chalk.gray(`[${time}]`)} ${chalk.bold(e.type)}: ${e.agent || e.skill || ''}`);\n if (e.task) console.log(chalk.gray(` Task: ${e.task.slice(0, 60)}...`));\n });\n });\n\n program\n .command('cost')\n .description('Show total usage cost summary')\n .option('--summary', 'Show breakdown by model', true)\n .action(async () => {\n const cost = await sessionManager.loadCost();\n const pipeline = await loadPipelineMetricsSummary(process.cwd());\n console.log(chalk.blue('--- Cost Summary ---'));\n console.log(`Total Spent: ${chalk.green(`$${cost.totalUsd.toFixed(4)}`)}`);\n \n if (Object.keys(cost.byModel).length > 0) {\n console.log(chalk.gray('\\nBreakdown by model:'));\n Object.entries(cost.byModel).forEach(([model, usd]: [string, any]) => {\n console.log(`- ${model}: $${usd.toFixed(4)}`);\n });\n }\n const cache = cost.cacheSavings || {};\n console.log(chalk.gray('\\nCache savings:'));\n console.log(`- hits: ${Number(cache.hits || 0)}`);\n console.log(`- misses: ${Number(cache.misses || 0)}`);\n console.log(`- tokens saved (est): ${Number(cache.tokensSaved || 0)}`);\n console.log(`- usd saved (est): $${Number(cache.usdSaved || 0).toFixed(4)}`);\n const memory = cost.memoryMetrics || {};\n const recallUsed = Number(memory.recallUsed || 0);\n const recallMisses = Number(memory.recallMisses || 0);\n const matchCount = Number(memory.totalMatches ?? memory.matchCount ?? 0);\n const avgQuality = Number(\n memory.averageQualityScore\n ?? (recallUsed > 0 ? (Number(memory.qualityScoreSum || 0) / recallUsed) : 0)\n );\n console.log(chalk.gray('\\nMemory recall metrics:'));\n console.log(`- recall_used: ${recallUsed}`);\n console.log(`- recall_misses: ${recallMisses}`);\n console.log(`- match_count: ${matchCount}`);\n console.log(`- quality_score_avg: ${avgQuality.toFixed(3)}`);\n console.log(chalk.gray('\\nPipeline metrics:'));\n console.log(`- runs: ${pipeline.runs}`);\n console.log(`- qa_approved: ${pipeline.qaApproved}`);\n console.log(`- qa_rejected: ${pipeline.qaRejected}`);\n const avgRounds = pipeline.runs > 0 ? (pipeline.qaRoundsTotal / pipeline.runs) : 0;\n console.log(`- qa_rounds_avg: ${avgRounds.toFixed(2)}`);\n console.log(`- context_chunks_used: ${pipeline.contextChunksUsed}`);\n console.log(`- context_chars_saved_est: ${pipeline.contextCharsSaved}`);\n });\n\n program\n .command('clear')\n .description('Clear local crew-cli session state (.crew)')\n .action(async () => {\n try {\n await sessionManager.clear();\n logger.success('Cleared session state in .crew/');\n } catch (error) {\n logger.error('Failed to clear session state:', error.message);\n process.exit(1);\n }\n });\n\n program\n .command('skill')\n .description('Call a CrewSwarm skill by name')\n .argument('<name>', 'Skill name, e.g. zeroeval.benchmark')\n .option('--params <json>', 'JSON params payload', '{}')\n .option('-g, --gateway <url>', 'Override gateway URL')\n .action(async (name, options) => {\n try {\n let params = {};\n try {\n params = JSON.parse(options.params || '{}');\n } catch {\n throw new Error('Invalid JSON passed to --params');\n }\n\n await sessionManager.appendHistory({\n type: 'skill_request',\n skill: name,\n params\n });\n\n const result = await agentRouter.callSkill(name, params, {\n gateway: options.gateway\n });\n\n await sessionManager.appendHistory({\n type: 'skill_result',\n skill: name,\n success: Boolean(result.success)\n });\n await sessionManager.appendRouting({\n route: 'SKILL',\n model: 'n/a',\n skill: name\n });\n\n logger.success('Skill completed:', result);\n } catch (error) {\n await sessionManager.appendHistory({\n type: 'skill_error',\n skill: name,\n error: error.message\n });\n logger.error('Skill call failed:', error.message);\n process.exit(1);\n }\n });\n\n program\n .command('x-search')\n .description('Run native Grok X/Twitter search via xAI Responses API')\n .argument('<query...>', 'Search query')\n .option('--model <id>', 'xAI model', 'grok-4-1-fast-reasoning')\n .option('--from-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--to-date <date>', 'End date (YYYY-MM-DD)')\n .option('--allow-handle <handle>', 'Allowed X handle (repeatable)', collectOption, [])\n .option('--exclude-handle <handle>', 'Excluded X handle (repeatable)', collectOption, [])\n .option('--images', 'Enable image understanding in x_search tool', false)\n .option('--videos', 'Enable video understanding in x_search tool', false)\n .option('--json', 'Output full JSON payload', false)\n .action(async (queryArray, options) => {\n try {\n const query = queryArray.join(' ').trim();\n const result = await runXSearch(query, {\n model: options.model,\n fromDate: options.fromDate,\n toDate: options.toDate,\n allowedHandles: options.allowHandle || [],\n excludedHandles: options.excludeHandle || [],\n enableImages: Boolean(options.images),\n enableVideos: Boolean(options.videos)\n });\n if (options.json) {\n console.log(JSON.stringify(result.raw, null, 2));\n return;\n }\n console.log(chalk.blue('\\n--- X Search Result ---\\n'));\n logger.printWithHighlight(result.text);\n if (result.citations.length > 0) {\n console.log(chalk.gray('\\nCitations:'));\n for (const c of result.citations) console.log(`- ${c}`);\n }\n } catch (error) {\n logger.error('x-search failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\n program\n .command('plan')\n .description('Generate a detailed plan for a task and execute it step-by-step or in parallel')\n .argument('<task...>', 'Task to plan and execute')\n .option('--parallel', 'Execute plan steps in parallel using worker pool', false)\n .option('--concurrency <n>', 'Maximum parallel workers', '3')\n .option('-m, --model <id>', 'Model override for plan execution', plannerPrimary || undefined)\n .option('--fallback-model <id>', 'Fallback model chain entry (repeatable)', collectOption, [])\n .option('--resume <runId>', 'Resume a prior plan run from checkpoint')\n .option('--validate-cmd <cmd>', 'Validation command (repeatable, hard gate)', collectOption, [])\n .option('--reflect-agent <id>', 'Agent used for reflect step', 'crew-main')\n .option('--no-cache', 'Disable planner cache')\n .option('--cache-ttl <sec>', 'Planner cache TTL in seconds', '3600')\n .option('--no-memory', 'Disable shared AgentKeeper memory')\n .option('--memory-max <n>', 'Max recalled memory entries', '3')\n .option('--memory-require-validation', 'Store memory only when validation is marked passed', false)\n .option('--json', 'Output machine-readable JSON envelope and skip interactive prompts', false)\n .option('--yes', 'Auto-approve plan execution without confirmation', false)\n .action(async (taskArray, options) => {\n const task = taskArray.join(' ');\n const planner = new Planner(agentRouter, sessionManager, process.cwd());\n const runId = options.resume ? String(options.resume) : `plan-${randomUUID()}`;\n const validationCommands = options.validateCmd || [];\n const fallbackModels = (options.fallbackModel && options.fallbackModel.length > 0)\n ? options.fallbackModel\n : (plannerPolicy.fallback || []);\n const existingRun = options.resume ? await checkpoints.load(runId) : null;\n if (!existingRun) {\n await checkpoints.beginRun({ runId, mode: 'plan', task });\n }\n \n logger.info(`Generating plan for: ${task}`);\n const plan = await planner.generatePlan(task, {\n useCache: options.cache,\n cacheTtlSeconds: Number.parseInt(options.cacheTtl || '3600', 10),\n useMemory: options.memory,\n memoryMaxResults: Number.parseInt(options.memoryMax || '3', 10),\n runId\n });\n await checkpoints.append(runId, 'plan.generated', { steps: plan.steps.length });\n \n console.log(chalk.blue('\\n--- Proposed Plan ---'));\n plan.steps.forEach(s => console.log(`${s.id}. ${s.task}`));\n\n let completedSteps = new Set<number>();\n if (options.resume) {\n const prior = existingRun || await checkpoints.load(runId);\n if (prior) {\n completedSteps = new Set(CheckpointStore.completedPlanSteps(prior));\n if (completedSteps.size > 0) {\n logger.info(`Resuming from checkpoint ${runId}; skipping completed steps: ${Array.from(completedSteps).join(', ')}`);\n }\n }\n }\n \n // Skip confirmation prompt in programmatic/JSON mode or when --yes flag is set\n let confirm = true;\n \n if (!options.json && !options.yes) {\n const result = await (import('inquirer')).then(m => m.default.prompt([{\n type: 'confirm',\n name: 'confirm',\n message: `Execute this plan ${options.parallel ? 'in parallel' : 'step-by-step'}?`,\n default: true\n }]));\n confirm = result.confirm;\n }\n \n if (!confirm) {\n if (options.json) {\n printJsonEnvelope('plan.cancelled', { reason: 'user_declined' });\n } else {\n logger.warn('Plan cancelled.');\n }\n return;\n }\n \n if (options.parallel) {\n const { WorkerPool } = await import('../orchestrator/index.js');\n const pool = new WorkerPool({\n router: agentRouter,\n orchestrator,\n sandbox,\n keeper: options.memory !== false ? agentKeeper : undefined,\n concurrency: Number.parseInt(options.concurrency || '3', 10)\n });\n\n logger.info(`Starting parallel execution with concurrency ${options.concurrency}`);\n \n pool.enqueueAll(plan.steps.map(s => ({\n id: `step-${s.id}`,\n agent: 'crew-coder',\n prompt: s.task\n })));\n\n const results = await pool.runAll({\n sessionId: await sessionManager.getSessionId(),\n projectDir: process.cwd(),\n runId\n });\n\n const successCount = results.filter(r => r.success).length;\n const failedCount = results.length - successCount;\n \n logger.info(`Parallel execution complete: ${successCount} succeeded, ${failedCount} failed.`);\n results.forEach(r => {\n if (!r.success) {\n logger.error(`Task ${r.taskId} failed: ${r.error}`);\n }\n });\n } else {\n for (const step of plan.steps) {\n if (completedSteps.has(step.id)) {\n continue;\n }\n logger.progress(step.id - 1, plan.steps.length, 'Plan');\n logger.info(`Step ${step.id}: ${step.task}`);\n try {\n await checkpoints.append(runId, 'plan.step.started', { stepId: step.id, task: step.task });\n const dispatched = await dispatchWithFallback(\n agentRouter,\n 'crew-coder',\n step.task,\n {\n sessionId: await sessionManager.getSessionId(),\n project: process.cwd(),\n model: options.model\n },\n fallbackModels,\n checkpoints,\n runId\n );\n const result = dispatched.result;\n logger.printWithHighlight(chalk.gray(String(result.result || '')));\n \n const edits = await orchestrator.parseAndApplyToSandbox(result.result);\n const validationGate = await runValidationCommands(validationCommands, process.cwd());\n await checkpoints.append(runId, 'plan.step.validation', {\n stepId: step.id,\n passed: validationGate.passed,\n failedCommand: validationGate.failedCommand || null\n });\n if (!validationGate.passed) {\n logger.error(`Validation failed at step ${step.id}: ${validationGate.failedCommand}`);\n logger.printWithHighlight(String(validationGate.output || ''));\n await checkpoints.append(runId, 'plan.step.failed', {\n stepId: step.id,\n reason: 'validation-failed',\n command: validationGate.failedCommand\n });\n await checkpoints.finish(runId, 'failed');\n process.exit(1);\n }\n if (options.memory !== false) {\n const response = String(result.result || '').trim();\n const validation = extractValidationSignals(result, Boolean(options.memoryRequireValidation));\n if (response.length > 0 && validation.passed) {\n const saved = await agentKeeper.recordSafe({\n runId,\n tier: 'worker',\n task: step.task,\n result: response,\n agent: 'crew-coder',\n structured: {\n problem: step.task,\n edits: edits.map((path: string) => ({ path })),\n validation: {\n lintPassed: validation.lintPassed,\n testsPassed: validation.testsPassed,\n notes: validation.notes\n },\n outcome: 'success'\n },\n metadata: {\n stepId: step.id,\n edits: edits.length,\n success: true,\n paths: edits,\n validationRequired: validation.required,\n validationPassed: validation.passed\n }\n });\n if (!saved.ok) {\n logger.warn(`Memory write skipped: ${saved.error}`);\n }\n }\n }\n if (edits.length > 0) {\n logger.success(`Added changes to ${edits.length} files in sandbox for step ${step.id}.`);\n const report = await analyzeBlastRadius(process.cwd(), { changedFiles: edits });\n const patchRisk = scorePatchRisk({\n blastRadius: report,\n validationPassed: validationGate.passed,\n changedFiles: edits.length\n });\n logger.info(`Step ${step.id} patch confidence: ${(patchRisk.confidence * 100).toFixed(0)}% (${patchRisk.riskLevel}, ${patchRisk.riskScore}/100)`);\n }\n const reflectPrompt = [\n `Reflect on this completed step and decide next action.`,\n `Step: ${step.task}`,\n `Output summary: ${String(result.result || '').slice(0, 1200)}`,\n `Validation: ${validationGate.passed ? 'passed' : 'failed'}`,\n `Return concise guidance for next step execution.`\n ].join('\\n');\n const reflect = await dispatchWithFallback(\n agentRouter,\n options.reflectAgent || 'crew-main',\n reflectPrompt,\n {\n sessionId: await sessionManager.getSessionId(),\n project: process.cwd()\n },\n fallbackModels,\n checkpoints,\n runId\n );\n logger.info(chalk.gray(`Reflect (${options.reflectAgent || 'crew-main'}): ${String(reflect.result.result || '').slice(0, 180)}`));\n await checkpoints.append(runId, 'plan.step.completed', {\n stepId: step.id,\n edits: edits.length\n });\n } catch (err) {\n logger.error(`Failed at step ${step.id}: ${err.message}`);\n await checkpoints.append(runId, 'plan.step.failed', {\n stepId: step.id,\n reason: String(err.message || err)\n });\n await checkpoints.finish(runId, 'failed');\n break;\n }\n }\n logger.progress(plan.steps.length, plan.steps.length, 'Plan');\n }\n \n logger.success('Plan execution complete. Use \"crew preview\" to review changes.');\n await checkpoints.finish(runId, 'completed');\n if (options.memory !== false) {\n try {\n await agentKeeper.compact();\n } catch {\n // Best-effort maintenance.\n }\n }\n });\n\n program\n .command('auth')\n .description('Search for local OAuth tokens from other coding CLIs')\n .option('--link', 'Probe local subscription engines and show routing readiness')\n .option('--no-link', 'Disable engine probe/autolink behavior')\n .option('--apply', 'Persist auto-plumbed engine defaults to repo config.local.json')\n .option('--scope <scope>', 'Config scope for --apply: user|team', 'user')\n .action(async (options) => {\n const argv = process.argv.slice(2);\n const explicitLinkFlag = argv.includes('--link') || argv.includes('--no-link');\n const explicitApplyFlag = argv.includes('--apply');\n const implicitConnectMode = !explicitLinkFlag && !explicitApplyFlag;\n\n const finder = new TokenFinder();\n const tokens = await finder.findTokens();\n \n console.log(chalk.blue('--- Local Tokens Found ---'));\n if (tokens.claude) console.log(chalk.green('\u2713 Claude Code session found'));\n if (tokens.openai) console.log(chalk.green('\u2713 OpenAI config key found'));\n if (tokens.gemini) console.log(chalk.green('\u2713 Gemini ADC credentials found'));\n if (Object.keys(tokens).length === 0) {\n console.log(chalk.yellow('No local tokens detected.'));\n }\n\n const linkEnabled = options.link !== false;\n if (!linkEnabled) return;\n\n const probes = detectSubscriptionEngines(tokens);\n const ready = probes.filter(p => p.ready).map(p => p.id);\n const installed = probes.filter(p => p.installed).map(p => p.id);\n\n console.log(chalk.blue('\\n--- Engine Auto-Plumb Probe ---'));\n for (const probe of probes) {\n const status = probe.ready\n ? chalk.green('ready')\n : probe.installed\n ? chalk.yellow('partial')\n : chalk.red('missing');\n const version = probe.version ? ` (${probe.version})` : '';\n console.log(`- ${probe.id.padEnd(10)} ${status}${version}`);\n console.log(chalk.gray(` notes: ${probe.notes.join(', ')}`));\n }\n\n if (installed.length === 0) {\n console.log(chalk.yellow('\\nNo subscription CLIs detected (cursor/claude/codex).'));\n return;\n }\n\n if (ready.length === 0) {\n console.log(chalk.yellow('\\nNo engine is fully ready yet. Install/login first, then rerun `crew auth --link --apply`.'));\n return;\n }\n\n const preferredOrder: SubscriptionEngineId[] = ['cursor', 'claude-cli', 'codex-cli'];\n const preferredReady = preferredOrder.filter(id => ready.includes(id));\n const recommended = preferredReady[0];\n console.log(chalk.green(`\\nRecommended default engine: ${recommended}`));\n console.log(chalk.gray(`Preferred ready order: ${preferredReady.join(' -> ')}`));\n\n const shouldApply = Boolean(options.apply || implicitConnectMode);\n if (!shouldApply) {\n console.log(chalk.gray('Use --apply to persist this into .crew/config.local.json'));\n return;\n }\n\n const scope = String(options.scope || 'user').toLowerCase();\n if (scope !== 'user' && scope !== 'team') {\n throw new Error(`Invalid scope \"${scope}\". Use user or team.`);\n }\n\n await setRepoConfigValue(process.cwd(), scope as 'user' | 'team', 'cli.engine', recommended);\n await setRepoConfigValue(process.cwd(), scope as 'user' | 'team', 'repl.engine', recommended);\n await setRepoConfigValue(process.cwd(), scope as 'user' | 'team', 'cli.preferredEngines', preferredReady);\n\n console.log(chalk.green('\\n\u2713 Auto-plumb applied'));\n if (implicitConnectMode) {\n console.log(chalk.gray(' mode: implicit (crew auth)'));\n }\n console.log(chalk.gray(` scope: ${scope}`));\n console.log(chalk.gray(` cli.engine: ${recommended}`));\n console.log(chalk.gray(` repl.engine: ${recommended}`));\n console.log(chalk.gray(` cli.preferredEngines: ${preferredReady.join(', ')}`));\n });\n\n program\n .command('correction')\n .description('Record a user correction for local training data (.crew/training-data.jsonl)')\n .requiredOption('--prompt <text>', 'Original user request/prompt')\n .requiredOption('--original <text>', 'Initial model output before correction')\n .requiredOption('--corrected <text>', 'Final corrected output')\n .option('--agent <id>', 'Agent/model identifier')\n .option('--tags <csv>', 'Comma-separated tags')\n .action(async options => {\n try {\n const tags = options.tags\n ? String(options.tags).split(',').map((x: string) => x.trim()).filter(Boolean)\n : [];\n\n const entry = await corrections.record({\n prompt: options.prompt,\n original: options.original,\n corrected: options.corrected,\n agent: options.agent,\n tags\n });\n\n logger.success(`Saved correction at ${entry.timestamp}`);\n } catch (error) {\n logger.error('Failed to save correction:', (error as Error).message);\n process.exit(1);\n }\n });\n\n program\n .command('tune')\n .description('Summarize or export local correction dataset')\n .option('-e, --export <path>', 'Export training JSONL to a target path')\n .option('--format <kind>', 'Export format: raw | lora', 'raw')\n .action(async options => {\n try {\n const summary = await corrections.summary();\n console.log(chalk.blue('--- Local Training Data ---'));\n console.log(`Entries: ${summary.count}`);\n if (summary.latest) {\n console.log(`Latest: ${summary.latest.timestamp}`);\n console.log(`Agent: ${summary.latest.agent || 'n/a'}`);\n }\n\n if (options.export) {\n if (options.format === 'lora') {\n const entries = await corrections.loadAll();\n const lines = entries.map(entry => JSON.stringify({\n instruction: entry.prompt,\n input: entry.original,\n output: entry.corrected,\n metadata: {\n timestamp: entry.timestamp,\n agent: entry.agent || null,\n tags: entry.tags || []\n }\n }));\n const { writeFile } = await import('node:fs/promises');\n await writeFile(options.export, `${lines.join('\\n')}\\n`, 'utf8');\n } else {\n await corrections.exportTo(options.export);\n }\n logger.success(`Exported dataset to ${options.export} (${options.format})`);\n }\n } catch (error) {\n logger.error('Tune command failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\n program\n .command('engine')\n .description('Run a prompt through a direct engine integration')\n .requiredOption(\n '-e, --engine <id>',\n 'gemini-api | claude-api | gemini-cli | codex-cli | claude-cli | cursor | cursor-cli (Cursor agent CLI, not IDE opener)'\n )\n .requiredOption('-p, --prompt <text>', 'Prompt text')\n .option('-m, --model <id>', 'Model override')\n .option('-t, --timeout <ms>', 'Timeout in milliseconds', '600000')\n .action(async options => {\n const result = await runEngine(options.engine, options.prompt, {\n model: options.model,\n timeoutMs: Number.parseInt(options.timeout || '600000', 10)\n });\n\n if (result.stdout) logger.printWithHighlight(result.stdout);\n if (result.stderr) console.error(chalk.red(result.stderr));\n if (!result.success) process.exit(1);\n });\n\n program\n .command('watch')\n .description('Watch files, detect TODOs, and offer auto-implementation dispatch')\n .option('-d, --dir <path>', 'Directory to watch', process.cwd())\n .action(async options => {\n const root = options.dir || process.cwd();\n logger.info(`Watching ${root} for TODOs...`);\n const watcher = startWatchMode(root, async event => {\n if (event.type === 'todo_detected') {\n logger.warn(`TODO detected in ${event.file} (${event.todoCount})`);\n const todoText = (event.todos || []).slice(0, 3).join('\\n');\n const { confirm } = await (await import('inquirer')).default.prompt([{\n type: 'confirm',\n name: 'confirm',\n message: `Dispatch TODO implementation for ${event.file}?`,\n default: false\n }]);\n\n if (confirm) {\n await agentRouter.dispatch('crew-coder', `Implement TODOs in ${event.file}:\\n${todoText}`, {\n sessionId: await sessionManager.getSessionId(),\n project: process.cwd()\n });\n logger.success(`Dispatched TODO implementation for ${event.file}`);\n }\n }\n });\n\n process.on('SIGINT', () => {\n watcher.close();\n logger.info('Watch mode stopped.');\n process.exit(0);\n });\n });\n\n program\n .command('browser-debug')\n .description('Launch Chrome in debug mode, collect console errors, and capture a screenshot')\n .requiredOption('--url <url>', 'Target URL')\n .option('--duration-ms <ms>', 'Capture duration in milliseconds', '5000')\n .option('--port <n>', 'Remote debug port', '9222')\n .option('--screenshot <path>', 'Screenshot output path')\n .action(async options => {\n const result = await runBrowserDebug(options.url, {\n durationMs: Number.parseInt(options.durationMs || '5000', 10),\n port: Number.parseInt(options.port || '9222', 10),\n screenshotPath: options.screenshot\n });\n console.log(chalk.blue('--- Browser Debug ---'));\n console.log(`Errors: ${result.consoleErrors.length}`);\n result.consoleErrors.forEach(err => console.log(`- ${err}`));\n if (result.screenshotPath) {\n console.log(`Screenshot: ${result.screenshotPath}`);\n }\n });\n\n program\n .command('browser-diff')\n .description('Compare two screenshots and report byte-level diff')\n .argument('<a>', 'First screenshot path')\n .argument('<b>', 'Second screenshot path')\n .action(async (a, b) => {\n const diff = await compareScreenshots(a, b);\n console.log(chalk.blue('--- Screenshot Diff ---'));\n console.log(`Diff bytes: ${diff.diffBytes}`);\n console.log(`Diff percent: ${diff.diffPercent.toFixed(2)}%`);\n });\n\n program\n .command('browser-fix')\n .description('Collect browser errors / failing UI tests and dispatch to crew-fixer')\n .requiredOption('--url <url>', 'Target URL')\n .option('--duration-ms <ms>', 'Capture duration in milliseconds', '5000')\n .option('--test-command <cmd>', 'Optional UI test command to run')\n .action(async options => {\n const debug = await runBrowserDebug(options.url, {\n durationMs: Number.parseInt(options.durationMs || '5000', 10)\n });\n\n let task = `Analyze and fix browser issues for ${options.url}.\\n`;\n if (debug.consoleErrors.length > 0) {\n task += `Console errors:\\n${debug.consoleErrors.map((e: string) => `- ${e}`).join('\\n')}\\n`;\n } else {\n task += 'No console errors captured.\\n';\n }\n\n if (options.testCommand) {\n const { runCheckCommand } = await import('../ci/index.js');\n const check = await runCheckCommand(options.testCommand, process.cwd());\n if (!check.success) {\n task += `\\nUI test command failed: ${options.testCommand}\\nSTDERR:\\n${check.stderr.slice(0, 4000)}\\n`;\n }\n }\n\n const result = await agentRouter.dispatch('crew-fixer', task, {\n sessionId: await sessionManager.getSessionId(),\n project: process.cwd()\n });\n logger.printWithHighlight(String(result.result || ''));\n });\n\n program\n .command('ci-fix')\n .description('Run a CI check command and auto-dispatch fixes (max attempts)')\n .option('-c, --command <cmd>', 'Check command to run', 'npm test')\n .option('-m, --max-attempts <n>', 'Maximum auto-fix attempts', '3')\n .option('--push', 'Commit and push after successful fix loop', false)\n .option('--commit-message <msg>', 'Commit message for --push', 'chore(ci): auto-fix failing checks')\n .action(async options => {\n const maxAttempts = Number.parseInt(options.maxAttempts || '3', 10);\n logger.info(`Starting ci-fix loop for: ${options.command} (max ${maxAttempts})`);\n\n const result = await runCiFixLoop({\n command: options.command,\n maxAttempts,\n cwd: process.cwd(),\n router: agentRouter,\n orchestrator,\n sandbox,\n session: sessionManager\n });\n\n result.history.forEach(entry => {\n const marker = entry.success ? chalk.green('PASS') : chalk.red('FAIL');\n console.log(`Attempt ${entry.attempt}: ${marker}`);\n });\n\n if (!result.success) {\n logger.error(`ci-fix failed after ${result.attemptsUsed} attempts`);\n process.exit(1);\n }\n\n if (options.push) {\n const { execSync } = await import('node:child_process');\n try {\n execSync('git add -A', { stdio: 'inherit', cwd: process.cwd() });\n execSync(`git commit -m \"${String(options.commitMessage || '').replace(/\"/g, '\\\\\"')}\"`, { stdio: 'inherit', cwd: process.cwd() });\n execSync('git push', { stdio: 'inherit', cwd: process.cwd() });\n logger.success('Committed and pushed ci-fix changes.');\n } catch (pushErr) {\n logger.warn(`ci-fix succeeded, but push failed: ${(pushErr as Error).message}`);\n }\n }\n\n logger.success(`ci-fix passed in ${result.attemptsUsed} attempt(s)`);\n });\n\n program\n .command('branch')\n .description('Create a new sandbox branch')\n .argument('<name>', 'Branch name')\n .option('-f, --from <branch>', 'Source branch')\n .action(async (name, options) => {\n try {\n await sandbox.createBranch(name, options.from);\n logger.success(`Created and switched to branch \"${name}\"`);\n } catch (error) {\n logger.error('Failed to create branch:', error.message);\n }\n });\n\n program\n .command('switch')\n .description('Switch to a different sandbox branch')\n .argument('<name>', 'Branch name')\n .action(async (name) => {\n try {\n await sandbox.switchBranch(name);\n logger.success(`Switched to branch \"${name}\"`);\n } catch (error) {\n logger.error('Failed to switch branch:', error.message);\n }\n });\n\n program\n .command('merge')\n .description('Merge changes from one branch into another')\n .argument('<source>', 'Source branch')\n .option('-t, --target <branch>', 'Target branch')\n .action(async (source, options) => {\n try {\n await sandbox.mergeBranch(source, options.target);\n logger.success(`Merged \"${source}\" into \"${options.target || sandbox.getActiveBranch()}\"`);\n } catch (error) {\n logger.error('Failed to merge branch:', error.message);\n }\n });\n\n program\n .command('branches')\n .description('List all sandbox branches')\n .action(() => {\n const active = sandbox.getActiveBranch();\n const branches = sandbox.getBranches();\n console.log(chalk.blue('--- Sandbox Branches ---'));\n branches.forEach(b => {\n if (b === active) {\n console.log(chalk.green(`* ${b}`));\n } else {\n console.log(` ${b}`);\n }\n });\n });\n\n program\n .command('doctor')\n .description('Run local diagnostics (Node, Git, config, gateway)')\n .option('-g, --gateway <url>', 'Gateway URL to check', 'http://localhost:5010')\n .option('--update-tag <tag>', 'Version channel for update check', 'latest')\n .action(async options => {\n const checks = await runDoctorChecks({ gateway: options.gateway, updateTag: options.updateTag });\n const summary = summarizeDoctorResults(checks);\n\n console.log(chalk.blue('crew doctor'));\n checks.forEach(check => {\n let marker = check.ok ? chalk.green('\u2713') : chalk.red('\u2717');\n if (check.name === 'CLI update status' && String(check.details || '').toLowerCase().includes('update available')) {\n marker = chalk.yellow('!');\n }\n console.log(`${marker} ${check.name} ${chalk.gray(`(${check.details})`)}`);\n if (!check.ok && check.hint) {\n console.log(chalk.yellow(` ${check.hint}`));\n }\n });\n\n const summaryColor = summary.failed === 0 ? chalk.green : chalk.red;\n console.log(summaryColor(`Passed: ${summary.passed} Failed: ${summary.failed}`));\n\n if (summary.failed > 0) {\n process.exit(1);\n }\n });\n\n program\n .command('update')\n .description('Check for updates and install latest crew-cli globally')\n .option('--check', 'Only check availability, do not install', false)\n .option('--tag <tag>', 'Update channel/tag (default: latest)', 'latest')\n .option('-y, --yes', 'Skip confirmation prompt', false)\n .action(async options => {\n try {\n const installed = await getInstalledCliVersion();\n const latest = await getLatestCliVersion(options.tag || 'latest');\n\n if (!latest) {\n if (options.check) {\n logger.warn('Unable to check latest version from npm right now.');\n return;\n }\n logger.error('Unable to check latest version from npm.');\n process.exit(1);\n }\n\n if (!installed) {\n logger.warn(`Current version unknown. Latest available: ${latest}`);\n } else {\n const cmp = compareVersions(installed, latest);\n if (cmp >= 0) {\n logger.success(`Already up to date (${installed}).`);\n return;\n }\n logger.info(`Update available: ${installed} -> ${latest}`);\n }\n\n if (options.check) {\n return;\n }\n\n const linked = await isGlobalInstallLinked();\n if (linked) {\n logger.warn('Global npm link detected. Update may replace the linked install.');\n }\n\n if (!options.yes) {\n const { confirm } = await (await import('inquirer')).default.prompt([{\n type: 'confirm',\n name: 'confirm',\n message: `Install crewswarm-cli@${options.tag || 'latest'} globally now?`,\n default: true\n }]);\n if (!confirm) {\n logger.warn('Update cancelled.');\n return;\n }\n }\n\n const { spawn } = await import('node:child_process');\n await new Promise((resolve, reject) => {\n const child = spawn('npm', ['install', '-g', `crewswarm-cli@${options.tag || 'latest'}`], {\n stdio: 'inherit',\n shell: false\n });\n child.on('error', reject);\n child.on('close', code => {\n if (code === 0) resolve(null);\n else reject(new Error(`npm install exited with code ${code}`));\n });\n });\n\n const refreshed = await getLatestCliVersion(options.tag || 'latest');\n logger.success(`Updated crew-cli to ${refreshed || options.tag || 'latest'}.`);\n } catch (error) {\n logger.error('Update failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\n program\n .command('preview')\n .description('Show pending changes in the sandbox')\n .argument('[branch]', 'Optional branch name to preview')\n .action((branch) => {\n const active = branch || sandbox.getActiveBranch();\n if (!sandbox.hasChanges(active)) {\n console.log(chalk.yellow(`No pending changes in sandbox branch \"${active}\".`));\n return;\n }\n console.log(chalk.blue(`--- Sandbox Preview [${active}] ---`));\n console.log(logger.highlightDiff(sandbox.preview(active)));\n });\n\n program\n .command('apply')\n .description('Apply all pending changes in the sandbox to the filesystem')\n .argument('[branch]', 'Optional branch name to apply')\n .option('-c, --check <command>', 'Command to run after apply (e.g. \"npm test\")')\n .option('--risk-threshold <level>', 'Block apply when risk is >= threshold (low|medium|high)', 'high')\n .option('--force', 'Bypass risk gate', false)\n .action(async (branch, options) => {\n const active = branch || sandbox.getActiveBranch();\n if (!sandbox.hasChanges(active)) {\n console.log(chalk.yellow(`No changes to apply on branch \"${active}\".`));\n return;\n }\n try {\n const paths = sandbox.getPendingPaths(active);\n const policy = getExecutionPolicy({\n riskThreshold: String(options.riskThreshold || 'high').toLowerCase() as any,\n forceAutoApply: Boolean(options.force)\n });\n const report = await analyzeBlastRadius(process.cwd(), { changedFiles: paths });\n if (isRiskBlocked(report.risk, policy.riskThreshold, policy.forceAutoApply)) {\n logger.error(`Apply blocked by risk gate (${report.risk} >= ${policy.riskThreshold}).`);\n logger.warn('Run \"crew preview\" to inspect changes, then re-run with --force if intentional.');\n process.exit(1);\n }\n await sandbox.apply(active);\n logger.success(`Applied changes from branch \"${active}\" to: ${paths.join(', ')}`);\n\n if (options.check) {\n logger.info(`Running check: ${options.check}`);\n const { execSync } = await import('node:child_process');\n try {\n execSync(options.check, { stdio: 'inherit', cwd: process.cwd() });\n logger.success('Check passed!');\n } catch (err) {\n logger.error(`Check failed: ${err.message}`);\n logger.warn('Attempting auto-fix by dispatching to crew-fixer...');\n try {\n const fixResult = await agentRouter.dispatch(\n 'crew-fixer',\n `The command \"${options.check}\" failed after applying sandbox changes to files: ${paths.join(', ')}. Diagnose and provide a fix.`,\n {\n sessionId: await sessionManager.getSessionId(),\n project: process.cwd()\n }\n );\n logger.printWithHighlight(String(fixResult.result || ''));\n } catch (fixError) {\n logger.warn(`Auto-fixer failed: ${(fixError as Error).message}`);\n }\n }\n }\n } catch (error) {\n logger.error('Failed to apply changes:', error.message);\n process.exit(1);\n }\n });\n\n program\n .command('rollback')\n .description('Discard all pending changes in the sandbox')\n .argument('[branch]', 'Optional branch name to rollback')\n .action(async (branch) => {\n const active = branch || sandbox.getActiveBranch();\n try {\n await sandbox.rollback(active);\n logger.success(`Rolled back all pending changes in branch \"${active}\".`);\n } catch (error) {\n logger.error('Failed to rollback:', error.message);\n process.exit(1);\n }\n });\n\n // \u2500\u2500 Collections Search (RAG over docs) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n program\n .command('docs')\n .description('Search project docs and optionally code with source-attributed local RAG')\n .argument('<query...>', 'Search query')\n .option('--path <paths...>', 'Paths to index (default: docs/ and project root)')\n .option('--code', 'Include source code files in the index', false)\n .option('--max <n>', 'Max results to return', '8')\n .option('--json', 'Output as JSON', false)\n .action(async (queryArray, options) => {\n const { buildCollectionIndex, searchCollection } = await import('../collections/index.js');\n const query = queryArray.join(' ');\n const paths = options.path && options.path.length > 0\n ? options.path\n : [join(process.cwd(), 'docs'), process.cwd()];\n try {\n const index = await buildCollectionIndex(paths, {\n includeCode: Boolean(options.code)\n });\n const result = searchCollection(index, query, Number.parseInt(options.max || '8', 10));\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.hits.length === 0) {\n logger.warn(`No results for \"${query}\" (${index.fileCount} files, ${index.chunkCount} chunks indexed).`);\n return;\n }\n\n console.log(chalk.blue(`\\n--- Docs Search: \"${query}\" (${result.hits.length} hits from ${index.chunkCount} chunks) ---\\n`));\n for (const hit of result.hits) {\n console.log(chalk.yellow(`[${hit.score}] ${hit.source}:${hit.startLine}`));\n const preview = hit.text.length > 200 ? hit.text.slice(0, 200) + '...' : hit.text;\n console.log(chalk.gray(preview));\n console.log('');\n }\n } catch (error) {\n logger.error('Docs search failed:', error.message);\n process.exit(1);\n }\n });\n\n // \u2500\u2500 Blast Radius Analysis \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n program\n .command('blast-radius')\n .description('Analyze impact of current changes across the codebase')\n .option('--ref <ref>', 'Git diff reference (default: HEAD)')\n .option('--max-depth <n>', 'Max transitive import depth', '5')\n .option('--json', 'Output as JSON', false)\n .option('--gate', 'Exit non-zero if risk is high (for CI)', false)\n .action(async (options) => {\n const { analyzeBlastRadius } = await import('../blast-radius/index.js');\n try {\n const report = await analyzeBlastRadius(process.cwd(), {\n diffRef: options.ref,\n maxDepth: Number.parseInt(options.maxDepth || '5', 10)\n });\n\n if (options.json) {\n console.log(JSON.stringify(report, null, 2));\n } else {\n const riskColor = { low: chalk.green, medium: chalk.yellow, high: chalk.red }[report.risk];\n console.log(chalk.blue('\\n--- Blast Radius Analysis ---\\n'));\n console.log(riskColor(report.summary));\n\n if (report.affectedFiles.length > 0) {\n console.log(chalk.blue('\\nAffected files:'));\n for (const af of report.affectedFiles) {\n const tag = { changed: chalk.red('CHANGED'), 'direct-importer': chalk.yellow('DIRECT'), 'transitive-importer': chalk.gray('TRANSITIVE') }[af.relation];\n console.log(` ${tag} ${af.path}`);\n }\n }\n }\n\n if (options.gate && report.risk === 'high') {\n logger.error('Blast radius is HIGH \u2014 aborting (use without --gate to see report only).');\n process.exit(1);\n }\n } catch (error) {\n logger.error('Blast radius analysis failed:', error.message);\n process.exit(1);\n }\n });\n\n program\n .command('test-sandbox')\n .description('Internal test for sandbox')\n .option('-f, --file <path>', 'File to modify', 'sandbox-test.txt')\n .option('-c, --content <text>', 'New content', 'Hello from sandbox!')\n .action(async options => {\n try {\n await sandbox.addChange(options.file, options.content);\n logger.success(`Added change to ${options.file} in sandbox.`);\n console.log('Run \"crew preview\" to see the diff.');\n } catch (error) {\n logger.error('Test failed:', error.message);\n }\n });\n\n // \u2500\u2500 AgentKeeper Memory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n program\n .command('memory')\n .description('Query AgentKeeper task memory')\n .argument('[query...]', 'Search query (omit to show stats)')\n .option('--max <n>', 'Max results', '5')\n .option('--rag', 'Blend AgentKeeper + shared fact memory + collections RAG', true)\n .option('--no-rag', 'Use AgentKeeper-only recall')\n .option('--include-code', 'Include source files in collections retrieval', false)\n .option('--path <paths...>', 'Custom docs/code search paths for RAG')\n .option('--json', 'Output as JSON', false)\n .action(async (queryArray, options) => {\n const { AgentKeeper } = await import('../memory/agentkeeper.js');\n const keeper = new AgentKeeper(process.cwd());\n const broker = new MemoryBroker(process.cwd());\n const query = (queryArray || []).join(' ').trim();\n\n if (!query) {\n const stats = await keeper.stats();\n if (options.json) {\n console.log(JSON.stringify(stats, null, 2));\n } else {\n console.log(chalk.blue('\\n--- AgentKeeper Memory Stats ---\\n'));\n console.log(` Total entries: ${stats.entries}`);\n console.log(` Approx bytes: ${stats.bytes}`);\n if (Object.keys(stats.byTier).length > 0) {\n console.log(' By tier:');\n for (const [tier, count] of Object.entries(stats.byTier)) {\n console.log(` ${tier}: ${count}`);\n }\n }\n if (Object.keys(stats.byAgent).length > 0) {\n console.log(' By agent:');\n for (const [agent, count] of Object.entries(stats.byAgent)) {\n console.log(` ${agent}: ${count}`);\n }\n }\n try {\n const cost = await sessionManager.loadCost();\n const memory = cost.memoryMetrics || {};\n const recallUsed = Number(memory.recallUsed || 0);\n const recallMisses = Number(memory.recallMisses || 0);\n const matchCount = Number(memory.totalMatches ?? memory.matchCount ?? 0);\n const avgQuality = Number(\n memory.averageQualityScore\n ?? (recallUsed > 0 ? (Number(memory.qualityScoreSum || 0) / recallUsed) : 0)\n );\n console.log(' Recall metrics:');\n console.log(` recall_used: ${recallUsed}`);\n console.log(` recall_misses: ${recallMisses}`);\n console.log(` match_count: ${matchCount}`);\n console.log(` quality_score_avg: ${avgQuality.toFixed(3)}`);\n } catch {\n // Best-effort observability section.\n }\n }\n return;\n }\n\n const max = Number.parseInt(options.max || '5', 10);\n if (options.rag) {\n const hits = await broker.recall(query, {\n maxResults: max,\n includeDocs: true,\n includeCode: Boolean(options.includeCode),\n docsPaths: options.path && options.path.length > 0 ? options.path : undefined\n });\n if (options.json) {\n console.log(JSON.stringify(hits, null, 2));\n return;\n }\n if (hits.length === 0) {\n logger.warn(`No shared memory/RAG matches for \"${query}\".`);\n return;\n }\n console.log(chalk.blue(`\\n--- Shared Memory + RAG Recall: \"${query}\" (${hits.length} hits) ---\\n`));\n for (const h of hits) {\n console.log(chalk.yellow(`[${h.score.toFixed(3)}] ${h.source} \u2014 ${h.title.slice(0, 100)}`));\n const preview = h.text.length > 160 ? h.text.slice(0, 160) + '...' : h.text;\n console.log(chalk.gray(` ${preview}`));\n console.log('');\n }\n return;\n }\n\n const matches = await keeper.recall(query, max);\n if (options.json) {\n console.log(JSON.stringify(matches, null, 2));\n return;\n }\n if (matches.length === 0) {\n logger.warn(`No memory matches for \"${query}\".`);\n return;\n }\n console.log(chalk.blue(`\\n--- Memory Recall: \"${query}\" (${matches.length} matches) ---\\n`));\n for (const m of matches) {\n console.log(chalk.yellow(`[${m.score}] ${m.entry.tier} \u2014 ${m.entry.task.slice(0, 80)}`));\n if (m.entry.agent) console.log(chalk.gray(` Agent: ${m.entry.agent}`));\n const preview = m.entry.result.length > 150 ? m.entry.result.slice(0, 150) + '...' : m.entry.result;\n console.log(chalk.gray(` Result: ${preview}`));\n console.log('');\n }\n });\n\n program\n .command('memory-compact')\n .description('Compact AgentKeeper memory store')\n .option('--max-entries <n>', 'Max entries to keep', '500')\n .action(async (options) => {\n const { AgentKeeper } = await import('../memory/agentkeeper.js');\n const keeper = new AgentKeeper(process.cwd(), {\n maxEntries: Number.parseInt(options.maxEntries || '500', 10)\n });\n const result = await keeper.compact();\n logger.success(`Compacted: ${result.entriesBefore} \u2192 ${result.entriesAfter} entries (freed ${result.bytesFreed} bytes).`);\n });\n\n const checkpointCmd = program\n .command('checkpoint')\n .description('Inspect or replay resumable run checkpoints');\n\n checkpointCmd\n .command('list')\n .description('List recent checkpoints')\n .option('--max <n>', 'Max checkpoints', '20')\n .action(async options => {\n const runs = await checkpoints.list(Number.parseInt(options.max || '20', 10));\n if (runs.length === 0) {\n logger.warn('No checkpoints found.');\n return;\n }\n console.log(chalk.blue('\\n--- Checkpoints ---\\n'));\n for (const run of runs) {\n console.log(`${run.runId} ${run.mode} ${run.status} ${run.updatedAt}`);\n console.log(chalk.gray(` ${run.task.slice(0, 120)}`));\n }\n });\n\n checkpointCmd\n .command('show')\n .description('Show checkpoint details and deterministic event log')\n .argument('<runId>', 'Checkpoint run id')\n .option('--json', 'Output raw JSON', false)\n .action(async (runId, options) => {\n const run = await checkpoints.load(runId);\n if (!run) {\n logger.error(`Checkpoint not found: ${runId}`);\n process.exit(1);\n }\n if (options.json) {\n console.log(JSON.stringify(run, null, 2));\n return;\n }\n console.log(chalk.blue(`\\n--- Checkpoint ${run.runId} ---\\n`));\n console.log(`Mode: ${run.mode}`);\n console.log(`Status: ${run.status}`);\n console.log(`Task: ${run.task}`);\n console.log(`Events: ${run.events.length}\\n`);\n for (const ev of run.events) {\n console.log(`${ev.ts} ${ev.type}`);\n if (ev.data && Object.keys(ev.data).length > 0) {\n console.log(chalk.gray(` ${JSON.stringify(ev.data)}`));\n }\n }\n });\n\n checkpointCmd\n .command('replay')\n .description('Replay checkpoint decisions/tools (dry-run by default)')\n .argument('<runId>', 'Checkpoint run id')\n .option('--execute', 'Execute replay for supported modes', false)\n .action(async (runId, options) => {\n const run = await checkpoints.load(runId);\n if (!run) {\n logger.error(`Checkpoint not found: ${runId}`);\n process.exit(1);\n }\n console.log(chalk.blue(`\\n--- Replay ${run.runId} (${run.mode}) ---\\n`));\n for (const ev of run.events) {\n console.log(`${ev.ts} ${ev.type}`);\n }\n if (!options.execute) {\n logger.info('Dry-run replay complete. Re-run with --execute to execute replay where supported.');\n return;\n }\n if (run.mode === 'plan') {\n logger.info(`Use: crew plan \"${run.task}\" --resume ${run.runId}`);\n return;\n }\n if (run.mode !== 'dispatch') {\n logger.warn('Execute replay currently supports dispatch checkpoints only.');\n return;\n }\n const agent =\n String(run.events.find(e => e.type === 'dispatch.completed')?.data?.agent || 'crew-main');\n const chain = run.events\n .filter(e => e.type === 'dispatch.model.attempt')\n .map(e => String(e.data?.model || '').trim())\n .filter(Boolean);\n const primary = chain[0];\n const fallbacks = chain.slice(1);\n const replay = await dispatchWithFallback(\n agentRouter,\n agent,\n run.task,\n {\n sessionId: await sessionManager.getSessionId(),\n project: process.cwd(),\n model: primary || undefined\n },\n fallbacks,\n checkpoints,\n `${run.runId}-replay-${Date.now()}`\n );\n logger.success('Replay dispatch complete.');\n logger.printWithHighlight(String(replay.result.result || ''));\n });\n\n program\n .command('serve')\n .description('Start unified interface API server (standalone only)')\n .option('--mode <mode>', 'Compatibility alias; only \"standalone\" is supported', 'standalone')\n .option('--host <host>', 'Bind host', process.env.CREW_API_HOST || '127.0.0.1')\n .option('--port <port>', 'Bind port', process.env.CREW_API_PORT || '4317')\n .action(async (options) => {\n const requestedMode = String(options.mode || 'standalone').trim().toLowerCase();\n if (requestedMode !== 'standalone') {\n logger.error(`Unsupported --mode \"${requestedMode}\". crew serve only supports standalone mode now.`);\n logger.info('Use: crew serve --port 4097');\n process.exit(1);\n }\n const mode = 'standalone';\n const host = String(options.host || '127.0.0.1');\n const port = Number.parseInt(String(options.port || '4317'), 10);\n if (Number.isNaN(port) || port <= 0) {\n logger.error('Invalid --port value.');\n process.exit(1);\n }\n\n const svc = await startUnifiedServer({\n mode,\n host,\n port,\n gateway: options.gateway,\n router: agentRouter,\n orchestrator,\n sandbox,\n session: sessionManager,\n projectDir: process.cwd(),\n logger\n });\n\n logger.success(`Unified API server running at ${svc.address} (${mode})`);\n logger.info('Press Ctrl+C to stop.');\n const shutdown = async () => {\n try {\n await svc.close();\n } finally {\n process.exit(0);\n }\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n await new Promise(() => {});\n });\n\n // \u2500\u2500 crew validate \u2014 blind AI code review \u2500\u2500\n program\n .command('validate')\n .description('Blind AI code review of recent changes')\n .option('-m, --model <id>', 'Model override', executorPrimary || undefined)\n .option('-n, --commits <n>', 'How many commits to review (default: 1)', '1')\n .option('--json', 'Output machine-readable JSON', false)\n .action(async (options) => {\n try {\n const n = Math.max(1, parseInt(options.commits || '1', 10));\n let diffStat = '';\n try { diffStat = execSync(`git diff HEAD~${n} --stat`, { encoding: 'utf8', cwd: process.cwd() }).slice(0, 2000); } catch {}\n let codeSnippets = '';\n try {\n const changedFiles = execSync(`git diff HEAD~${n} --name-only`, { encoding: 'utf8', cwd: process.cwd() })\n .split('\\n').filter(Boolean).slice(0, 5);\n for (const f of changedFiles) {\n try {\n const { readFileSync } = await import('node:fs');\n const content = readFileSync(join(process.cwd(), f), 'utf8');\n codeSnippets += `\\n### ${f}\\n\\`\\`\\`\\n${content.slice(0, 1500)}\\n\\`\\`\\`\\n`;\n } catch {}\n }\n } catch {}\n\n const validateTask = `You are crew-judge, a blind code validator. Review these recent changes and provide a structured assessment.\n\nScore each category 1-5:\n- **Correctness**: Does the code work? Edge cases?\n- **Security**: Vulnerabilities? Input validation?\n- **Performance**: Bottlenecks? Memory leaks?\n- **Readability**: Clean, documented, follows conventions?\n- **Test Coverage**: Tests present? What's missing?\n\nEnd with VERDICT: SHIP, FIX, or REJECT with actionable items.\n\n## Changed files\\n${diffStat || 'No recent changes'}\\n\\n## Code\\n${codeSnippets || 'No code to review'}`;\n\n logger.info('Running blind validation...');\n const result = await orchestrator.executeLocally(validateTask, { model: options.model });\n const responseText = String(result.result || 'Validation could not complete.');\n\n if (options.json) {\n printJsonEnvelope('validate.result', { response: responseText, costUsd: result.costUsd || 0 });\n } else {\n console.log(chalk.blue('\\n--- Validation Report ---'));\n logger.printWithHighlight(responseText);\n console.log();\n if (result.costUsd) {\n console.log(chalk.gray(`Cost: $${result.costUsd.toFixed(4)}`));\n }\n }\n } catch (error) {\n logger.error('Validation failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\n // \u2500\u2500 crew diff \u2014 colored git diff \u2500\u2500\n program\n .command('diff')\n .description('Show colored git diff of working directory')\n .option('--staged', 'Show only staged changes', false)\n .option('--stat', 'Show diffstat only', false)\n .action(async (options) => {\n try {\n const statFlag = options.stat ? ' --stat' : '';\n const staged = execSync(`git diff --cached${statFlag}`, { encoding: 'utf8', cwd: process.cwd() }).trim();\n const unstaged = options.staged ? '' : execSync(`git diff${statFlag}`, { encoding: 'utf8', cwd: process.cwd() }).trim();\n const fullDiff = (staged + '\\n' + unstaged).trim();\n if (!fullDiff) {\n console.log(chalk.yellow('No git changes.'));\n return;\n }\n const lines = fullDiff.split('\\n').map(line => {\n if (line.startsWith('+++') || line.startsWith('---')) return chalk.bold(line);\n if (line.startsWith('+')) return chalk.green(line);\n if (line.startsWith('-')) return chalk.red(line);\n if (line.startsWith('@@')) return chalk.cyan(line);\n if (line.startsWith('diff ')) return chalk.bold.blue(line);\n return line;\n });\n console.log(lines.join('\\n'));\n } catch (error) {\n logger.error('Git diff failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\n // \u2500\u2500 crew test-first \u2014 TDD workflow \u2500\u2500\n program\n .command('test-first')\n .description('TDD workflow: generate tests -> implement -> validate')\n .argument('<task...>', 'Task description')\n .option('-m, --model <id>', 'Model override', executorPrimary || undefined)\n .option('--json', 'Output machine-readable JSON', false)\n .action(async (taskArray, options) => {\n const task = taskArray.join(' ');\n const projectDir = process.cwd();\n try {\n logger.info('Step 1: Generating tests...');\n const testResult = await orchestrator.executeLocally(\n `You are a TDD expert. Write comprehensive tests FIRST. Cover happy path, edge cases, error handling. Output ONLY the test code in a fenced code block with filename.\\n\\nTask: ${task}\\nProject dir: ${projectDir}`,\n { model: options.model }\n );\n const testCode = String(testResult.result || '');\n if (!options.json) {\n console.log(chalk.blue('\\n--- Tests ---'));\n logger.printWithHighlight(testCode);\n }\n\n logger.info('Step 2: Implementing to pass tests...');\n const implResult = await orchestrator.executeLocally(\n `Given these tests, write the MINIMAL implementation to make ALL tests pass.\\n\\nTests:\\n${testCode}\\n\\nTask: \"${task}\"`,\n { model: options.model }\n );\n const implCode = String(implResult.result || '');\n if (!options.json) {\n console.log(chalk.blue('\\n--- Implementation ---'));\n logger.printWithHighlight(implCode);\n }\n\n logger.info('Step 3: Validating...');\n const valResult = await orchestrator.executeLocally(\n `Verify: 1) Would all tests pass? 2) Missing edge cases? 3) Bugs?\\nVerdict: PASS or FAIL with specific issues.\\n\\nTests:\\n${testCode}\\n\\nImplementation:\\n${implCode}`,\n { model: options.model }\n );\n if (!options.json) {\n console.log(chalk.blue('\\n--- Validation ---'));\n logger.printWithHighlight(String(valResult.result || ''));\n }\n\n const totalCost = (testResult.costUsd || 0) + (implResult.costUsd || 0) + (valResult.costUsd || 0);\n if (options.json) {\n printJsonEnvelope('test-first.result', {\n tests: testCode, implementation: implCode,\n validation: String(valResult.result || ''), costUsd: totalCost\n });\n } else {\n console.log(chalk.gray(`\\nTotal cost: $${totalCost.toFixed(4)}`));\n }\n } catch (error) {\n logger.error('Test-first failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\n if (args.length === 0) {\n program.help();\n }\n\n await program.parseAsync(args, { from: 'user' });\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) {\n main(process.argv.slice(2));\n}\n", "import { EventEmitter } from 'events';\nimport { Logger } from '../utils/logger.js';\nimport { getProjectContext } from '../context/git.js';\nimport { CLI_SYSTEM_PROMPT } from './prompt.js';\nimport { readFileSync } from 'node:fs';\n\nexport class AgentRouter extends EventEmitter {\n constructor(config, toolManager) {\n super();\n this.config = config;\n this.toolManager = toolManager;\n this.logger = new Logger();\n this.agents = new Map();\n }\n\n async dispatch(agentName, task, options = {}) {\n if (!agentName || !task) {\n throw new Error('Agent name and task are required');\n }\n\n this.logger.info(`Routing task to agent: ${agentName}`);\n\n const timeout = parseInt(options.timeout || '300000', 10);\n const crewLeadUrl = options.gateway || this.config.get('crewLeadUrl') || 'http://localhost:5010';\n const projectDir = options.project || process.cwd();\n\n try {\n const gitContext = options.injectGitContext === false\n ? ''\n : await getProjectContext(projectDir);\n\n const preamble = options.skipPreamble ? '' : CLI_SYSTEM_PROMPT;\n const taskWithContext = [\n preamble,\n '--- USER REQUEST ---',\n task,\n '--- REPO CONTEXT ---',\n gitContext\n ].filter(Boolean).join('\\n\\n');\n\n const imagesData = [];\n if (options.images && Array.isArray(options.images)) {\n for (const imgPath of options.images) {\n try {\n const data = readFileSync(imgPath);\n const base64 = data.toString('base64');\n const ext = imgPath.split('.').pop().toLowerCase();\n const mimeType = ext === 'png' ? 'image/png' : ext === 'webp' ? 'image/webp' : 'image/jpeg';\n imagesData.push({ data: base64, mimeType });\n } catch (err) {\n this.logger.warn(`Could not read image ${imgPath}: ${err.message}`);\n }\n }\n }\n\n const runtime = this.mapEngineToRuntime(options.engine);\n const dispatchPayload = {\n agent: agentName,\n task: taskWithContext,\n sessionId: options.sessionId || 'crew-cli',\n projectDir,\n images: imagesData.length > 0 ? imagesData : undefined,\n model: options.model,\n engine: options.engine,\n runtime: runtime || options.runtime,\n useCursorCli: runtime === 'cursor' || runtime === 'cursor-cli',\n useClaudeCode: runtime === 'claude' || runtime === 'claude-code',\n useCodex: runtime === 'codex' || runtime === 'codex-cli',\n useGeminiCli: runtime === 'gemini' || runtime === 'gemini-cli',\n direct: Boolean(options.direct),\n bypass: Boolean(options.bypass),\n gatewayMode: options.gatewayMode,\n session: {\n id: options.sessionId || 'crew-cli',\n source: 'crew-cli',\n timestamp: new Date().toISOString()\n }\n };\n\n const token = this.getAuthToken();\n const headers = { 'Content-Type': 'application/json' };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const dispatchResponse = await fetch(`${crewLeadUrl}/api/dispatch`, {\n method: 'POST',\n headers,\n body: JSON.stringify(dispatchPayload)\n });\n\n if (!dispatchResponse.ok) {\n const raw = await dispatchResponse.text();\n let parsed = null;\n try {\n parsed = JSON.parse(raw);\n } catch {\n parsed = null;\n }\n const baseMessage = parsed?.error || raw || `Gateway returned ${dispatchResponse.status}`;\n throw new Error(\n `${baseMessage}${this.getDispatchErrorHint(baseMessage, options)}`\n );\n }\n\n const { taskId } = await dispatchResponse.json();\n\n if (!taskId) {\n this.logger.warn('No taskId returned - agent may be using fallback mode');\n return {\n success: true,\n agent: agentName,\n task,\n result: 'Task dispatched (no taskId - check RT Messages tab)',\n timestamp: new Date().toISOString()\n };\n }\n\n this.logger.info(`Polling for task completion (taskId: ${taskId})`);\n const result = await this.pollTaskStatus(crewLeadUrl, taskId, timeout, options);\n\n return {\n success: true,\n agent: agentName,\n task,\n taskId,\n result,\n timestamp: new Date().toISOString()\n };\n } catch (error) {\n this.logger.error(`Dispatch failed: ${error.message}`);\n throw error;\n }\n }\n\n mapEngineToRuntime(engine) {\n const raw = String(engine || '').toLowerCase();\n if (!raw) return null;\n if (raw === 'cursor' || raw === 'cursor-cli') return 'cursor-cli';\n if (raw === 'claude' || raw === 'claude-cli' || raw === 'claude-code') return 'claude-code';\n if (raw === 'codex' || raw === 'codex-cli') return 'codex-cli';\n if (raw === 'gemini' || raw === 'gemini-cli' || raw === 'gemini-api') return 'gemini-cli';\n if (raw === 'opencode' || raw === 'gpt5' || raw === 'gpt-5') return 'opencode';\n return raw;\n }\n\n getDispatchErrorHint(message, options = {}) {\n const text = String(message || '').toLowerCase();\n const hints = [];\n if (text.includes('429') || text.includes('rate limit') || text.includes('too many requests')) {\n hints.push('rate-limited upstream; retry with backoff or switch model');\n }\n if (text.includes('missing model') || text.includes('model required') || text.includes('--model')) {\n hints.push('set an explicit model (e.g. --model anthropic/claude-3-5-sonnet)');\n }\n if (\n (text.includes('exit code 1') || text.includes('code 1')) &&\n (text.includes('cursor') || options.engine === 'cursor' || options.direct || options.bypass)\n ) {\n hints.push('Cursor CLI likely failed; verify cursor auth/env and pass --model explicitly');\n }\n return hints.length ? ` (hint: ${hints.join('; ')})` : '';\n }\n\n async pollTaskStatus(gatewayUrl, taskId, timeoutMs, options = {}) {\n const startTime = Date.now();\n const pollInterval = 2000;\n\n const token = this.getAuthToken();\n const headers = {};\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n while (Date.now() - startTime < timeoutMs) {\n try {\n const statusResponse = await fetch(`${gatewayUrl}/api/status/${taskId}`, {\n headers\n });\n\n if (!statusResponse.ok) {\n throw new Error(`Status check failed: ${statusResponse.status}`);\n }\n\n const status = await statusResponse.json();\n\n if (status.status === 'done') {\n try {\n return this.normalizeCompletedResult(status.result, options, status);\n } catch (normalizeError) {\n const fatal = normalizeError instanceof Error ? normalizeError : new Error(String(normalizeError));\n fatal.fatal = true;\n throw fatal;\n }\n }\n\n if (status.status === 'error') {\n const baseError = status.error || status.result || 'Task failed';\n const fatal = new Error(`${baseError}${this.getDispatchErrorHint(baseError, options)}`);\n fatal.fatal = true;\n throw fatal;\n }\n\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n } catch (error) {\n if (error && error.fatal) {\n throw error;\n }\n if (Date.now() - startTime >= timeoutMs) {\n throw new Error(`Timeout waiting for ${taskId} (${timeoutMs}ms)`);\n }\n }\n }\n\n throw new Error(`Timeout waiting for ${taskId} (${timeoutMs}ms)`);\n }\n\n normalizeCompletedResult(rawResult, options = {}, statusObj = {}) {\n const isObject = rawResult && typeof rawResult === 'object';\n if (!isObject) {\n const text = String(rawResult || '').trim();\n if (!text) {\n if (options.direct || options.bypass) {\n throw new Error('Gateway returned an empty direct/bypass response');\n }\n return 'Task completed';\n }\n this.assertEngineProvenance(text, options, statusObj);\n return text;\n }\n\n const result = rawResult;\n const exitCode =\n typeof result.exitCode === 'number'\n ? result.exitCode\n : (typeof result.code === 'number' ? result.code : undefined);\n const reportedFailure = result.success === false || result.ok === false;\n const message = String(\n result.error ||\n result.stderr ||\n result.message ||\n result.result ||\n result.output ||\n result.stdout ||\n ''\n ).trim();\n\n if ((typeof exitCode === 'number' && exitCode !== 0) || reportedFailure) {\n const base = message || `Task failed (exit code ${exitCode ?? 'unknown'})`;\n throw new Error(`${base}${this.getDispatchErrorHint(base, options)}`);\n }\n\n this.assertEngineProvenance(message, options, { ...result, ...statusObj });\n if (message) return message;\n if (options.direct || options.bypass) {\n throw new Error('Gateway returned no textual output for direct/bypass request');\n }\n return 'Task completed';\n }\n\n inferEngineFromText(text) {\n const s = String(text || '').toLowerCase();\n if (!s) return null;\n if (s.includes('claude code')) return 'claude-cli';\n if (s.includes('cursor cli') || s.includes('cursor')) return 'cursor';\n if (s.includes('codex cli') || s.includes('codex')) return 'codex-cli';\n if (s.includes('gemini cli') || s.includes('gemini')) return 'gemini-cli';\n if (s.includes('opencode')) return 'opencode';\n return null;\n }\n\n normalizeEngineId(value) {\n const s = String(value || '').toLowerCase();\n if (!s) return null;\n if (s === 'claude' || s === 'claude-code' || s === 'claudecli') return 'claude-cli';\n if (s === 'cursor-cli') return 'cursor';\n if (s === 'codex') return 'codex-cli';\n if (s === 'gemini' || s === 'gemini-api') return 'gemini-cli';\n return s;\n }\n\n assertEngineProvenance(message, options = {}, result = {}) {\n const requested = this.normalizeEngineId(options.engine);\n if (!requested) return;\n if (!(options.direct || options.bypass)) return;\n\n const reported = this.normalizeEngineId(\n result.engineUsed || result.engine || result.runtime || this.inferEngineFromText(message)\n );\n\n if (!reported) {\n throw new Error(\n `Engine provenance check failed: requested \"${requested}\" but unable to determine engine used for direct/bypass result`\n );\n }\n\n if (reported !== requested) {\n throw new Error(\n `Engine provenance mismatch: requested \"${requested}\" but result indicates \"${reported}\"`\n );\n }\n }\n\n async listAgents() {\n const crewLeadUrl = this.config.get('crewLeadUrl') || 'http://localhost:5010';\n\n try {\n const response = await fetch(`${crewLeadUrl}/status`);\n\n if (!response.ok) {\n this.logger.warn('Failed to fetch agents from gateway, returning defaults');\n return this.getDefaultAgents();\n }\n\n const status = await response.json();\n const agents = (status.agents || []).map(name => ({\n name,\n role: this.getAgentRole(name),\n status: 'online'\n }));\n\n return agents.length > 0 ? agents : this.getDefaultAgents();\n } catch (error) {\n this.logger.warn(`Gateway not reachable: ${error.message}`);\n return this.getDefaultAgents();\n }\n }\n\n getDefaultAgents() {\n return [\n { name: 'crew-coder', role: 'Full Stack Coder', status: 'unknown' },\n { name: 'crew-qa', role: 'Quality Assurance', status: 'unknown' },\n { name: 'crew-main', role: 'Coordinator', status: 'unknown' },\n { name: 'crew-fixer', role: 'Bug Fixer', status: 'unknown' },\n { name: 'crew-frontend', role: 'Frontend Specialist', status: 'unknown' },\n { name: 'crew-coder-back', role: 'Backend Specialist', status: 'unknown' }\n ];\n }\n\n getAuthToken() {\n const config = this.config.getAll();\n return config?.rt?.authToken || null;\n }\n\n getAgentRole(agentName) {\n const roles = {\n 'crew-coder': 'Full Stack Coder',\n 'crew-coder-front': 'Frontend Specialist',\n 'crew-coder-back': 'Backend Specialist',\n 'crew-qa': 'Quality Assurance',\n 'crew-fixer': 'Bug Fixer',\n 'crew-frontend': 'UI/UX Specialist',\n 'crew-main': 'Coordinator',\n 'crew-pm': 'Product Manager',\n 'crew-security': 'Security Auditor',\n 'crew-copywriter': 'Content Writer'\n };\n return roles[agentName] || 'Agent';\n }\n\n async getStatus() {\n const crewLeadUrl = this.config.get('crewLeadUrl') || 'http://localhost:5010';\n\n try {\n const response = await fetch(`${crewLeadUrl}/status`);\n\n if (!response.ok) {\n return {\n agentsOnline: 0,\n tasksActive: 0,\n rtBusStatus: 'disconnected',\n gateway: 'unreachable'\n };\n }\n\n const status = await response.json();\n\n return {\n agentsOnline: (status.agents || []).length,\n tasksActive: 0,\n rtBusStatus: status.rtConnected ? 'connected' : 'disconnected',\n gateway: 'connected',\n model: status.model\n };\n } catch (error) {\n return {\n agentsOnline: 0,\n tasksActive: 0,\n rtBusStatus: 'error',\n gateway: `error: ${error.message}`\n };\n }\n }\n\n async callSkill(name, params = {}, options = {}) {\n if (!name) {\n throw new Error('Skill name is required');\n }\n\n const crewLeadUrl = options.gateway || this.config.get('crewLeadUrl') || 'http://localhost:5010';\n const url = `${crewLeadUrl}/api/skills/${name}/run`;\n\n try {\n const token = this.getAuthToken();\n const headers = { 'Content-Type': 'application/json' };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(params)\n });\n\n if (!response.ok) {\n let errorBody = null;\n try {\n errorBody = await response.json();\n } catch {\n errorBody = null;\n }\n const message = errorBody?.error || `Skill call failed (${response.status})`;\n throw new Error(message);\n }\n\n const result = await response.json();\n return {\n success: true,\n skill: name,\n result,\n timestamp: new Date().toISOString()\n };\n } catch (error) {\n throw new Error(`Unable to call skill \"${name}\": ${error.message}`);\n }\n }\n}\n\n", "import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { buildRepositoryMap } from '../mapping/index.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface GitContextOptions {\n maxDiffChars?: number;\n}\n\nexport interface GitChangedFilesOptions {\n maxFiles?: number;\n}\n\nasync function runGit(args: string[], cwd: string): Promise<string> {\n const { stdout } = await execFileAsync('git', args, {\n cwd,\n maxBuffer: 1024 * 1024 * 4\n });\n return stdout.trim();\n}\n\nfunction clip(text: string, maxChars: number): string {\n if (!text) {\n return '(none)';\n }\n\n if (text.length <= maxChars) {\n return text;\n }\n\n return `${text.slice(0, maxChars)}\\n... [truncated ${text.length - maxChars} chars]`;\n}\n\nexport async function getProjectContext(\n cwd: string = process.cwd(),\n options: GitContextOptions = {}\n): Promise<string> {\n const maxDiffChars = Number.isInteger(options.maxDiffChars) ? (options.maxDiffChars as number) : 6000;\n \n let tree = '(unavailable)';\n try {\n tree = await buildRepositoryMap(cwd);\n } catch (err) {\n // Ignore\n }\n\n try {\n const insideWorkTree = await runGit(['rev-parse', '--is-inside-work-tree'], cwd);\n if (insideWorkTree !== 'true') {\n return `## Repository Context\\n\\`\\`\\`text\\n${tree}\\n\\`\\`\\`\\n\\n## Git Context\\n\\`\\`\\`text\\nNo git repository detected.\\n\\`\\`\\``;\n }\n } catch {\n return `## Repository Context\\n\\`\\`\\`text\\n${tree}\\n\\`\\`\\`\\n\\n## Git Context\\n\\`\\`\\`text\\nNo git repository detected.\\n\\`\\`\\``;\n }\n\n const [branch, status, unstagedDiff, stagedDiff, log] = await Promise.all([\n runGit(['branch', '--show-current'], cwd).catch(() => '(unknown)'),\n runGit(['status', '--short'], cwd).catch(() => '(unavailable)'),\n runGit(['diff', '--no-ext-diff'], cwd).catch(() => '(unavailable)'),\n runGit(['diff', '--staged', '--no-ext-diff'], cwd).catch(() => '(unavailable)'),\n runGit(['log', '-5', '--oneline'], cwd).catch(() => '(unavailable)')\n ]);\n\n return [\n '## Repository Context',\n '```text',\n clip(tree, 8000),\n '```',\n '',\n '## Git Context',\n '```text',\n `Branch: ${branch || '(detached HEAD)'}`,\n '',\n 'Status (--short):',\n status || '(clean)',\n '',\n 'Recent commits (last 5):',\n log || '(none)',\n '',\n 'Unstaged diff:',\n clip(unstagedDiff, maxDiffChars),\n '',\n 'Staged diff:',\n clip(stagedDiff, maxDiffChars),\n '```'\n ].join('\\n');\n}\n\nexport async function getChangedFiles(\n cwd: string = process.cwd(),\n options: GitChangedFilesOptions = {}\n): Promise<string[]> {\n const maxFiles = Number.isInteger(options.maxFiles) ? (options.maxFiles as number) : 80;\n try {\n const insideWorkTree = await runGit(['rev-parse', '--is-inside-work-tree'], cwd);\n if (insideWorkTree !== 'true') return [];\n } catch {\n return [];\n }\n\n try {\n const status = await runGit(['status', '--short'], cwd);\n if (!status) return [];\n const files = status\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean)\n .map(line => line.replace(/^[A-Z?]{1,2}\\s+/, '').trim())\n .filter(Boolean);\n return files.slice(0, Math.max(1, maxFiles));\n } catch {\n return [];\n }\n}\n", "// L1 (Chat Interface) - User-facing conversational layer only\n// Gunns - The foul-mouthed gunner and lethal weapon of CrewSwarm\nexport const CLI_SYSTEM_PROMPT = `You are Gunns, the gunner and lethal weapon of CrewSwarm.\nStinki is the Crew-Lead (localhost:5010).\nYou are the foul-mouthed artillery expert.\nThe user is the Captain.\nYou don't miss. You don't hesitate. You execute.\n\n## Your Role (L1: Chat Interface Only)\n- Handle user interaction, clarifications, and final response synthesis\n- Lead with the answer, not the reasoning. Skip preamble and filler.\n- Keep it concise and actionable - under 2000 chars\n- Sharp, deadly, terminal-native\n- You do NOT execute tasks - you pass them to L2 (orchestrator)\n\n## Personality\n- **Foul-mouthed gunner** - military precision, artillery metaphors\n- **Lethal weapon** - doesn't miss, doesn't hesitate\n- **Sharp & deadly** - terminal-native, brutally efficient\n- **Execute without question** - takes orders from the Captain\n- When the Captain asks who you are, reply: \"Gunns. Lethal weapon. I execute orders with precision, Captain.\"\n\n## Language\nSpeak in:\n- **Artillery terms**: \"Target acquired\", \"Firing agents\", \"Direct hit\"\n- **Military precision**: \"Roger that\", \"Mission accomplished\", \"Zero errors\"\n- **Lethal efficiency**: \"No survivors\", \"Clean execution\", \"Payload delivered\"\n\n## Environment\n- Terminal-based CLI with local sandbox\n- Changes go through: plan \u2192 validate \u2192 execute \u2192 apply\n- User can preview, apply, or rollback changes\n\n## Your Job\n1. Understand user intent\n2. Normalize task into clear envelope (what, why, constraints, success criteria)\n3. Pass to L2 orchestrator for execution\n4. Synthesize L3 results back to user\n\nYou are L1 only - no routing decisions, no code execution, no tool calls.\nThose are L2/L3 responsibilities.`;\n", "import { Logger } from '../utils/logger.js';\n\nexport class ToolManager {\n constructor(config) {\n this.config = config;\n this.logger = new Logger();\n this.tools = new Map();\n }\n\n async initialize() {\n this.logger.info('Initializing tool manager');\n \n // Initialize with basic tools (dynamic tool loading available via plugins)\n this.registerTool('file', {\n name: 'file',\n description: 'File operations',\n handler: this.handleFileTool.bind(this)\n });\n\n this.registerTool('shell', {\n name: 'shell',\n description: 'Shell command execution',\n handler: this.handleShellTool.bind(this)\n });\n\n this.registerTool('pty', {\n name: 'pty',\n description: 'Interactive PTY command execution',\n handler: this.handlePtyTool.bind(this)\n });\n\n this.registerTool('lsp', {\n name: 'lsp',\n description: 'Language server style type-check and completion',\n handler: this.handleLspTool.bind(this)\n });\n }\n\n registerTool(name, tool) {\n this.tools.set(name, tool);\n this.logger.debug(`Registered tool: ${name}`);\n }\n\n async executeTool(name, params) {\n const tool = this.tools.get(name);\n if (!tool) {\n throw new Error(`Tool not found: ${name}`);\n }\n\n try {\n this.logger.debug(`Executing tool: ${name}`);\n return await tool.handler(params);\n } catch (error) {\n this.logger.error(`Tool execution failed: ${name}`, error);\n throw error;\n }\n }\n\n async handleFileTool(params) {\n // Basic file tool implementation\n const { action, path, content } = params || {};\n\n if (!action) {\n throw new Error('File tool requires action parameter');\n }\n\n const fs = await import('node:fs/promises');\n\n switch (action) {\n case 'read':\n if (!path) throw new Error('File read requires path parameter');\n const data = await fs.readFile(path, 'utf8');\n return { success: true, operation: 'file', action: 'read', data };\n\n case 'write':\n if (!path || content === undefined) {\n throw new Error('File write requires path and content parameters');\n }\n await fs.writeFile(path, content, 'utf8');\n return { success: true, operation: 'file', action: 'write', path };\n\n case 'exists':\n if (!path) throw new Error('File exists check requires path parameter');\n try {\n await fs.access(path);\n return { success: true, operation: 'file', action: 'exists', exists: true };\n } catch {\n return { success: true, operation: 'file', action: 'exists', exists: false };\n }\n\n default:\n throw new Error(`Unsupported file action: ${action}`);\n }\n }\n\n async handleShellTool(params) {\n // Basic shell tool implementation\n const { command, cwd } = params || {};\n\n if (!command) {\n throw new Error('Shell tool requires command parameter');\n }\n\n const { exec } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(exec);\n\n try {\n const options = cwd ? { cwd } : {};\n const { stdout, stderr } = await execAsync(command, options);\n return {\n success: true,\n operation: 'shell',\n command,\n stdout: stdout.trim(),\n stderr: stderr.trim()\n };\n } catch (error) {\n return {\n success: false,\n operation: 'shell',\n command,\n error: error.message,\n stdout: error.stdout || '',\n stderr: error.stderr || ''\n };\n }\n }\n\n async handlePtyTool(params) {\n const { command, cwd, timeoutMs } = params || {};\n if (!command) {\n throw new Error('PTY tool requires command parameter');\n }\n const { runPtyCommand } = await import('../pty/index.js');\n const result = await runPtyCommand(command, { cwd, timeoutMs });\n return {\n success: result.success,\n operation: 'pty',\n command,\n exitCode: result.exitCode,\n signal: result.signal,\n output: result.output\n };\n }\n\n async handleLspTool(params) {\n const { action, projectDir, file, files, line, column, limit, prefix } = params || {};\n if (!action) {\n throw new Error('LSP tool requires action parameter');\n }\n const { getCompletions, typeCheckProject } = await import('../lsp/index.js');\n if (action === 'check') {\n const diagnostics = await typeCheckProject(projectDir || process.cwd(), files || []);\n return {\n success: true,\n operation: 'lsp',\n action,\n diagnostics\n };\n }\n if (action === 'complete') {\n if (!file || !line || !column) {\n throw new Error('LSP complete requires file, line, and column');\n }\n const completions = await getCompletions(\n projectDir || process.cwd(),\n file,\n Number(line),\n Number(column),\n Number(limit || 50),\n String(prefix || '')\n );\n return {\n success: true,\n operation: 'lsp',\n action,\n completions\n };\n }\n throw new Error(`Unsupported lsp action: ${action}`);\n }\n\n getAvailableTools() {\n return Array.from(this.tools.values()).map(tool => ({\n name: tool.name,\n description: tool.description\n }));\n }\n}\n", "import { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport class ConfigManager {\n constructor() {\n this.config = {};\n this.configPath = join(homedir(), '.crewswarm', 'crewswarm.json');\n this.loadConfig();\n }\n\n loadConfig() {\n try {\n if (existsSync(this.configPath)) {\n const configData = readFileSync(this.configPath, 'utf8');\n this.config = JSON.parse(configData);\n } else {\n // Default configuration\n this.config = {\n rtBusUrl: 'ws://localhost:18889',\n crewLeadUrl: 'http://localhost:5010',\n dashboardUrl: 'http://localhost:4319',\n timeout: 30000,\n agents: []\n };\n }\n } catch (error) {\n console.warn('Failed to load config, using defaults:', error.message);\n this.config = {\n rtBusUrl: 'ws://localhost:18889',\n crewLeadUrl: 'http://localhost:5010',\n dashboardUrl: 'http://localhost:4319',\n timeout: 30000,\n agents: []\n };\n }\n }\n\n get(key) {\n return this.config[key];\n }\n\n set(key, value) {\n this.config[key] = value;\n }\n\n getAll() {\n return { ...this.config };\n }\n}\n", "import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\n// Lazy load project messages bridge only when needed (not in standalone mode)\n// import { saveCliToProjectMessages } from './project-messages-bridge.mjs';\n\nfunction nowIso() {\n return new Date().toISOString();\n}\n\ninterface Session {\n sessionId: string;\n createdAt: string;\n updatedAt: string;\n history: Array<{\n timestamp: string;\n input: string;\n output?: string;\n route?: string;\n agent?: string;\n }>;\n}\n\nexport class SessionManager {\n private baseDir: string;\n private stateDir: string;\n private paths: {\n session: string;\n routing: string;\n jitContext: string;\n cost: string;\n sandbox: string;\n };\n\n constructor(baseDir = process.cwd()) {\n this.baseDir = baseDir;\n this.stateDir = join(baseDir, '.crew');\n this.paths = {\n session: join(this.stateDir, 'session.json'),\n routing: join(this.stateDir, 'routing.log'),\n cost: join(this.stateDir, 'cost.json'),\n sandbox: join(this.stateDir, 'sandbox.json'),\n jitContext: join(this.stateDir, 'jit-context.json')\n };\n }\n\n async ensureInitialized() {\n await mkdir(this.stateDir, { recursive: true });\n\n if (!existsSync(this.paths.session)) {\n const initialSession = {\n sessionId: randomUUID(),\n createdAt: nowIso(),\n updatedAt: nowIso(),\n history: []\n };\n await writeFile(this.paths.session, JSON.stringify(initialSession, null, 2), 'utf8');\n }\n\n if (!existsSync(this.paths.routing)) {\n await writeFile(this.paths.routing, '', 'utf8');\n }\n\n if (!existsSync(this.paths.cost)) {\n const initialCost = {\n totalUsd: 0,\n byModel: {},\n entries: [],\n cacheSavings: {\n hits: 0,\n misses: 0,\n tokensSaved: 0,\n usdSaved: 0\n },\n memoryMetrics: {\n recallUsed: 0,\n recallMisses: 0,\n totalMatches: 0,\n averageQualityScore: 0\n }\n };\n await writeFile(this.paths.cost, JSON.stringify(initialCost, null, 2), 'utf8');\n }\n\n if (!existsSync(this.paths.sandbox)) {\n const initialSandbox = {\n branches: { main: {} },\n activeBranch: 'main',\n updatedAt: nowIso()\n };\n await writeFile(this.paths.sandbox, JSON.stringify(initialSandbox, null, 2), 'utf8');\n }\n }\n\n async loadSession(): Promise<Session> {\n await this.ensureInitialized();\n const raw = await readFile(this.paths.session, 'utf8');\n return JSON.parse(raw);\n }\n\n async saveSession(session: Session) {\n await this.ensureInitialized();\n session.updatedAt = nowIso();\n await writeFile(this.paths.session, JSON.stringify(session, null, 2), 'utf8');\n }\n\n async loadCost() {\n await this.ensureInitialized();\n const raw = await readFile(this.paths.cost, 'utf8');\n const parsed = JSON.parse(raw);\n parsed.cacheSavings = parsed.cacheSavings || {\n hits: 0,\n misses: 0,\n tokensSaved: 0,\n usdSaved: 0\n };\n parsed.memoryMetrics = parsed.memoryMetrics || {\n recallUsed: 0,\n recallMisses: 0,\n totalMatches: 0,\n averageQualityScore: 0\n };\n return parsed;\n }\n\n async saveCost(cost: any) {\n await this.ensureInitialized();\n await writeFile(this.paths.cost, JSON.stringify(cost, null, 2), 'utf8');\n }\n\n async getSessionId() {\n const session = await this.loadSession();\n return session.sessionId;\n }\n\n /** Save JIT discovered files so subsequent CLI invocations inherit context */\n async saveJITContext(discoveredFiles: string[]) {\n await this.ensureInitialized();\n const MAX_FILES = 200;\n const trimmed = discoveredFiles.slice(-MAX_FILES);\n await writeFile(this.paths.jitContext, JSON.stringify({\n updatedAt: nowIso(),\n files: trimmed\n }, null, 2), 'utf8');\n }\n\n /** Load JIT context from prior session (returns empty array if none) */\n async loadJITContext(): Promise<string[]> {\n try {\n const raw = await readFile(this.paths.jitContext, 'utf8');\n const data = JSON.parse(raw);\n return Array.isArray(data.files) ? data.files : [];\n } catch {\n return [];\n }\n }\n\n async appendHistory(entry: { input: string; output?: string; route?: string; agent?: string }) {\n const session = await this.loadSession();\n session.history.push({\n ...entry,\n timestamp: nowIso()\n });\n session.updatedAt = nowIso();\n await writeFile(this.paths.session, JSON.stringify(session, null, 2), 'utf8');\n \n // Also save to unified project messages (disabled in standalone mode)\n // try {\n // await saveCliToProjectMessages(this.baseDir, entry);\n // } catch (e) {\n // // Silent fail \u2014 project messages are bonus, not critical\n // }\n }\n\n async appendRouting(entry: { timestamp?: string; [key: string]: any }) {\n const payload = {\n ...entry,\n timestamp: entry.timestamp || nowIso()\n };\n await writeFile(this.paths.routing, `${JSON.stringify(payload)}\\n`, { encoding: 'utf8', flag: 'a' });\n }\n\n async trackCost(entry: { usd?: number; model?: string; promptTokens?: number; completionTokens?: number } = {}) {\n const raw = await readFile(this.paths.cost, 'utf8');\n const cost = JSON.parse(raw);\n const amount = Number(entry.usd || 0);\n const model = entry.model || 'unknown';\n\n cost.totalUsd += amount;\n cost.byModel[model] = (cost.byModel[model] || 0) + amount;\n cost.entries.push({\n model,\n usd: amount,\n promptTokens: entry.promptTokens || 0,\n completionTokens: entry.completionTokens || 0,\n timestamp: nowIso()\n });\n\n await writeFile(this.paths.cost, JSON.stringify(cost, null, 2), 'utf8');\n }\n\n async trackCacheSavings(entry: { hit?: boolean; miss?: boolean; tokensSaved?: number; usdSaved?: number } = {}) {\n const raw = await readFile(this.paths.cost, 'utf8');\n const cost = JSON.parse(raw);\n cost.cacheSavings = cost.cacheSavings || {\n hits: 0,\n misses: 0,\n tokensSaved: 0,\n usdSaved: 0\n };\n\n if (entry.hit) cost.cacheSavings.hits += 1;\n if (entry.miss) cost.cacheSavings.misses += 1;\n cost.cacheSavings.tokensSaved += Number(entry.tokensSaved || 0);\n cost.cacheSavings.usdSaved += Number(entry.usdSaved || 0);\n\n await writeFile(this.paths.cost, JSON.stringify(cost, null, 2), 'utf8');\n }\n\n async trackMemoryRecall(entry: { used?: boolean; miss?: boolean; matchCount?: number; qualityScore?: number } = {}) {\n const raw = await readFile(this.paths.cost, 'utf8');\n const cost = JSON.parse(raw);\n cost.memoryMetrics = cost.memoryMetrics || {\n recallUsed: 0,\n recallMisses: 0,\n totalMatches: 0,\n averageQualityScore: 0\n };\n const mm = cost.memoryMetrics;\n if (entry.used) mm.recallUsed += 1;\n if (entry.miss) mm.recallMisses += 1;\n const matchCount = Number(entry.matchCount || 0);\n mm.totalMatches += matchCount;\n const qualityScore = Number(entry.qualityScore || 0);\n if (entry.used) {\n const n = Math.max(1, mm.recallUsed);\n mm.averageQualityScore = ((Number(mm.averageQualityScore || 0) * (n - 1)) + qualityScore) / n;\n }\n await writeFile(this.paths.cost, JSON.stringify(cost, null, 2), 'utf8');\n }\n\n async clear() {\n await rm(this.stateDir, { recursive: true, force: true });\n await this.ensureInitialized();\n }\n\n async compact(options: { keepHistory?: number; keepCostEntries?: number } = {}) {\n const keepHistory = Math.max(1, Number(options.keepHistory || 200));\n const keepCostEntries = Math.max(1, Number(options.keepCostEntries || 500));\n\n const session = await this.loadSession();\n const cost = await this.loadCost();\n\n const historyBefore = session.history.length;\n const costBefore = (cost.entries || []).length;\n\n session.history = session.history.slice(-keepHistory);\n cost.entries = (cost.entries || []).slice(-keepCostEntries);\n cost.totalUsd = Number((cost.entries || []).reduce((sum: number, entry: any) => sum + Number(entry.usd || 0), 0));\n cost.byModel = {};\n for (const entry of cost.entries) {\n const model = entry.model || 'unknown';\n cost.byModel[model] = (cost.byModel[model] || 0) + Number(entry.usd || 0);\n }\n\n await this.saveSession(session);\n await this.saveCost(cost);\n\n return {\n historyBefore,\n historyAfter: session.history.length,\n costBefore,\n costAfter: cost.entries.length\n };\n }\n}\n", "import { createTwoFilesPatch } from 'diff';\nimport { readFile, writeFile, mkdir, access } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { join, dirname } from 'node:path';\n\nexport interface SandboxChange {\n path: string;\n original: string;\n modified: string;\n timestamp: string;\n}\n\nexport interface SandboxState {\n updatedAt: string;\n activeBranch: string;\n branches: Record<string, Record<string, SandboxChange>>;\n}\n\nexport class Sandbox {\n private state: SandboxState = {\n updatedAt: new Date().toISOString(),\n activeBranch: 'main',\n branches: { main: {} }\n };\n protected baseDir: string; // Changed from private to protected\n private stateFilePath: string;\n\n constructor(baseDir = process.cwd()) {\n this.baseDir = baseDir;\n this.stateFilePath = join(baseDir, '.crew', 'sandbox.json');\n }\n\n private async exists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n async load(): Promise<void> {\n if (await this.exists(this.stateFilePath)) {\n try {\n const data = await readFile(this.stateFilePath, 'utf8');\n const parsed = JSON.parse(data) as SandboxState;\n this.state = {\n ...this.state,\n ...parsed,\n branches: parsed.branches || { main: {} },\n activeBranch: parsed.activeBranch || 'main'\n };\n } catch (err) {\n console.error(`Failed to load sandbox state: ${(err as Error).message}`);\n }\n }\n }\n\n async persist(): Promise<void> {\n this.state.updatedAt = new Date().toISOString();\n const dir = dirname(this.stateFilePath);\n if (!(await this.exists(dir))) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(this.stateFilePath, JSON.stringify(this.state, null, 2), 'utf8');\n }\n\n /** Alias for persist() to match external API expectations */\n async save(): Promise<void> {\n await this.persist();\n }\n\n async addChange(filePath: string, modifiedContent: string): Promise<void> {\n const fullPath = join(this.baseDir, filePath);\n let original = '';\n\n // Ensure branch exists and is an object (not array)\n if (!this.state.branches[this.state.activeBranch] || Array.isArray(this.state.branches[this.state.activeBranch])) {\n // Fix malformed branch data silently\n this.state.branches[this.state.activeBranch] = {};\n }\n\n const activeChanges = this.state.branches[this.state.activeBranch];\n\n if (activeChanges[filePath]) {\n original = activeChanges[filePath].original;\n } else if (await this.exists(fullPath)) {\n original = await readFile(fullPath, 'utf8');\n }\n\n activeChanges[filePath] = {\n path: filePath,\n original,\n modified: modifiedContent,\n timestamp: new Date().toISOString()\n };\n \n\n await this.persist();\n }\n\n preview(branchName = this.state.activeBranch): string {\n const branch = this.state.branches[branchName];\n if (!branch) return `Branch \"${branchName}\" not found.`;\n\n let diff = '';\n for (const [path, change] of Object.entries(branch)) {\n diff += createTwoFilesPatch(\n `a/${path}`,\n `b/${path}`,\n change.original,\n change.modified,\n undefined,\n undefined,\n { context: 3 }\n );\n }\n return diff || 'No pending changes.';\n }\n\n async apply(branchName = this.state.activeBranch): Promise<void> {\n const branch = this.state.branches[branchName];\n if (!branch) throw new Error(`Branch \"${branchName}\" not found.`);\n\n for (const [path, change] of Object.entries(branch)) {\n const fullPath = join(this.baseDir, path);\n const dir = dirname(fullPath);\n if (!(await this.exists(dir))) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(fullPath, change.modified, 'utf8');\n }\n await this.rollback(branchName);\n }\n\n async rollback(branchName = this.state.activeBranch): Promise<void> {\n if (this.state.branches[branchName]) {\n this.state.branches[branchName] = {};\n await this.persist();\n }\n }\n\n async createBranch(name: string, fromBranch = this.state.activeBranch): Promise<void> {\n if (this.state.branches[name]) {\n throw new Error(`Branch \"${name}\" already exists.`);\n }\n // Deep copy current changes from fromBranch\n const sourceBranch = this.state.branches[fromBranch] || {};\n this.state.branches[name] = JSON.parse(JSON.stringify(sourceBranch));\n this.state.activeBranch = name;\n await this.persist();\n }\n\n async switchBranch(name: string): Promise<void> {\n if (!this.state.branches[name]) {\n throw new Error(`Branch \"${name}\" does not exist.`);\n }\n this.state.activeBranch = name;\n await this.persist();\n }\n\n async deleteBranch(name: string): Promise<void> {\n if (name === 'main') throw new Error('Cannot delete main branch.');\n if (this.state.activeBranch === name) {\n this.state.activeBranch = 'main';\n }\n delete this.state.branches[name];\n await this.persist();\n }\n\n async mergeBranch(source: string, target = this.state.activeBranch): Promise<void> {\n if (!this.state.branches[source]) throw new Error(`Source branch \"${source}\" not found.`);\n if (!this.state.branches[target]) throw new Error(`Target branch \"${target}\" not found.`);\n\n const sourceChanges = this.state.branches[source];\n const targetChanges = this.state.branches[target];\n\n for (const [path, change] of Object.entries(sourceChanges)) {\n targetChanges[path] = JSON.parse(JSON.stringify(change));\n }\n\n await this.persist();\n }\n\n getActiveBranch(): string {\n return this.state.activeBranch;\n }\n\n getBranches(): string[] {\n return Object.keys(this.state.branches);\n }\n\n getPendingPaths(branchName = this.state.activeBranch): string[] {\n return Object.keys(this.state.branches[branchName] || {});\n }\n\n hasChanges(branchName = this.state.activeBranch): boolean {\n return Object.keys(this.state.branches[branchName] || {}).length > 0;\n }\n\n /**\n * Get staged content for a file path (returns undefined if not staged).\n * Used by tool adapter so agentic workers can read their own staged files.\n */\n getStagedContent(filePath: string, branchName = this.state.activeBranch): string | undefined {\n const branch = this.state.branches[branchName];\n if (!branch) return undefined;\n // Try both the raw path and normalized path\n const change = branch[filePath];\n if (change) return change.modified;\n return undefined;\n }\n}\n", "// @ts-nocheck\nimport { readFile, access } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface AuthTokens {\n claude?: string;\n cursor?: string;\n gemini?: string;\n openai?: string;\n}\n\nexport class TokenFinder {\n async findTokens(): Promise<AuthTokens> {\n const tokens: AuthTokens = {};\n\n // 1. Claude Code (~/.claude/session.json)\n const claudePath = join(homedir(), '.claude', 'session.json');\n if (await this.exists(claudePath)) {\n try {\n const data = await readFile(claudePath, 'utf8');\n const parsed = JSON.parse(data);\n if (parsed.sessionToken) tokens.claude = parsed.sessionToken;\n } catch (e) {\n console.error(`Failed to parse Claude config: ${e.message}`);\n }\n }\n\n // 2. OpenAI (~/.openai/config)\n const openaiPath = join(homedir(), '.openai', 'config');\n if (await this.exists(openaiPath)) {\n try {\n const data = await readFile(openaiPath, 'utf8');\n const match = data.match(/api_key[:=]\\s*([a-zA-Z0-9\\-]+)/);\n if (match) tokens.openai = match[1];\n } catch (e) {\n console.error(`Failed to parse OpenAI config: ${e.message}`);\n }\n }\n\n // 3. Gemini ADC (~/.config/gcloud/application_default_credentials.json)\n const geminiPath = join(homedir(), '.config', 'gcloud', 'application_default_credentials.json');\n if (await this.exists(geminiPath)) {\n try {\n tokens.gemini = '(detected via ADC)';\n } catch (e) {\n console.error(`Failed to check Gemini ADC: ${e.message}`);\n }\n }\n\n // 4. Cursor auth from SQLite state DB\n const cursorDbPath = join(homedir(), '.cursor', 'User', 'globalStorage', 'state.vscdb');\n if (await this.exists(cursorDbPath)) {\n try {\n const { stdout } = await execFileAsync('sqlite3', [\n cursorDbPath,\n \"SELECT value FROM ItemTable WHERE key LIKE '%token%' OR key LIKE '%auth%' LIMIT 20;\"\n ]);\n const first = stdout\n .split('\\n')\n .map(line => line.trim())\n .find(Boolean);\n if (first) {\n tokens.cursor = first.slice(0, 120);\n } else {\n tokens.cursor = '(cursor db detected; token key not found)';\n }\n } catch {\n tokens.cursor = '(cursor db detected; sqlite3 not available or parse failed)';\n }\n }\n\n return tokens;\n }\n\n private async exists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n}\n", "import { Logger } from '../utils/logger.js';\nimport { SessionManager } from '../session/manager.js';\nimport { TokenCache } from '../cache/token-cache.js';\nimport { AgentKeeper } from '../memory/agentkeeper.js';\nimport { DualL2Planner, WorkGraph, DualL2Result } from '../prompts/dual-l2.js';\nimport { randomBytes } from 'crypto';\n\nexport interface PlanStep {\n id: number;\n task: string;\n status: 'pending' | 'running' | 'completed' | 'failed';\n persona?: string;\n complexity?: 'low' | 'medium' | 'high';\n dependencies?: number[];\n sourceRefs?: string[];\n}\n\nexport interface Plan {\n title: string;\n steps: PlanStep[];\n artifacts?: {\n pdd: string;\n roadmap: string;\n architecture: string;\n scaffold: string;\n contractTests: string;\n definitionOfDone: string;\n goldenBenchmarks: string;\n outputDir: string;\n };\n validation?: {\n approved: boolean;\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n concerns: string[];\n recommendations: string[];\n estimatedCost: number;\n };\n traceId?: string;\n}\n\nexport class Planner {\n private logger = new Logger();\n private cache: TokenCache;\n private keeper: AgentKeeper;\n private dualL2: DualL2Planner;\n\n constructor(\n _unusedRouter: any, // Keep signature for compatibility\n private session?: SessionManager,\n baseDir = process.cwd()\n ) {\n this.cache = new TokenCache(baseDir);\n this.keeper = new AgentKeeper(baseDir);\n this.dualL2 = new DualL2Planner();\n }\n\n /**\n * Generate a plan using Dual L2 system (L2 Reasoning \u2192 L2A Decomposer \u2192 L2B Validator)\n */\n async generatePlan(\n task: string,\n options: {\n useCache?: boolean;\n cacheTtlSeconds?: number;\n useMemory?: boolean;\n memoryMaxResults?: number;\n runId?: string;\n } = {}\n ): Promise<Plan> {\n const traceId = `plan-${randomBytes(8).toString('hex')}`;\n const useMemory = options.useMemory !== false;\n let memoryContext = '';\n\n // Recall similar successful tasks from memory\n if (useMemory) {\n const matches = await this.keeper.recall(task, Number(options.memoryMaxResults || 3), {\n preferSuccessful: true\n });\n const avgScore = matches.length\n ? matches.reduce((sum, m) => sum + Number(m.score || 0), 0) / matches.length\n : 0;\n await this.session?.trackMemoryRecall({\n used: true,\n miss: matches.length === 0,\n matchCount: matches.length,\n qualityScore: avgScore\n });\n if (matches.length > 0) {\n memoryContext = await this.keeper.recallAsContext(task, Number(options.memoryMaxResults || 3), {\n preferSuccessful: true\n });\n }\n }\n\n // Check cache\n const useCache = options.useCache !== false;\n const cacheKey = TokenCache.hashKey(JSON.stringify({\n system: 'dual-l2-planner',\n task,\n memoryContext: memoryContext.slice(0, 200) // Truncate for cache key\n }));\n\n if (useCache) {\n const cached = await this.cache.get<Plan>('planner', cacheKey);\n if (cached.hit && cached.value) {\n await this.session?.trackCacheSavings({\n hit: true,\n tokensSaved: Number(cached.meta?.tokensSaved || 0),\n usdSaved: Number(cached.meta?.usdSaved || 0)\n });\n this.logger.info('\uD83C\uDFAF Dual L2 planner cache hit.');\n return cached.value;\n }\n await this.session?.trackCacheSavings({ miss: true });\n }\n\n // Run Dual L2 planning pipeline\n this.logger.info('\uD83D\uDE80 Starting Dual L2 planning pipeline...');\n this.logger.info(` L2 Reasoning \u2192 L2A Decomposer \u2192 L2B Validator`);\n\n const result: DualL2Result = await this.dualL2.plan(task, memoryContext, traceId);\n\n // Convert work graph to plan steps\n const steps = this.convertWorkGraphToSteps(result.workGraph);\n\n const plan: Plan = {\n title: `Plan for: ${task.slice(0, 50)}...`,\n steps,\n artifacts: result.artifacts ? {\n pdd: result.artifacts.pdd,\n roadmap: result.artifacts.roadmap,\n architecture: result.artifacts.architecture,\n scaffold: result.artifacts.scaffold,\n contractTests: result.artifacts.contractTests,\n definitionOfDone: result.artifacts.definitionOfDone,\n goldenBenchmarks: result.artifacts.goldenBenchmarks,\n outputDir: result.artifacts.outputDir\n } : undefined,\n validation: result.validation,\n traceId: result.traceId\n };\n\n // Log validation results\n if (result.validation) {\n const emoji = result.validation.approved ? '\u2705' : '\u26A0\uFE0F';\n this.logger.info(`${emoji} L2B Validation: ${result.validation.riskLevel.toUpperCase()} risk`);\n if (result.validation.concerns.length > 0) {\n this.logger.warn(` Concerns: ${result.validation.concerns.join(', ')}`);\n }\n if (result.validation.recommendations.length > 0) {\n this.logger.info(` Recommendations: ${result.validation.recommendations.join(', ')}`);\n }\n }\n\n // Save to memory\n if (useMemory && steps.length > 0) {\n const saved = await this.keeper.recordSafe({\n runId: options.runId || traceId,\n tier: 'dual-l2-planner',\n task,\n result: JSON.stringify(plan, null, 2),\n agent: 'dual-l2-system',\n metadata: {\n steps: steps.length,\n riskLevel: result.validation?.riskLevel,\n approved: result.validation?.approved,\n artifactsDir: result.artifacts?.outputDir\n }\n });\n if (!saved.ok) {\n this.logger.warn(`Planner memory write skipped: ${saved.error}`);\n }\n }\n\n // Cache the result\n if (useCache) {\n const estimatedTokens = Math.ceil(\n (task.length + memoryContext.length + JSON.stringify(plan).length) / 4\n );\n const usdSaved = estimatedTokens / 1_000_000 * 0.01; // Rough estimate\n await this.cache.set(\n 'planner',\n cacheKey,\n plan,\n Number(options.cacheTtlSeconds || 3600),\n { tokensSaved: estimatedTokens, usdSaved, source: 'dual-l2-planner' }\n );\n }\n\n return plan;\n }\n\n async planFeature(description: string): Promise<Plan> {\n return this.generatePlan(description);\n }\n\n /**\n * Convert work graph from Dual L2 to legacy Plan format\n */\n private convertWorkGraphToSteps(workGraph: WorkGraph): PlanStep[] {\n const steps: PlanStep[] = [];\n const units = workGraph.units || [];\n\n // Build dependency map (unit.id -> step.id)\n const unitIdToStepId = new Map<string, number>();\n units.forEach((unit, idx) => {\n unitIdToStepId.set(unit.id, idx + 1);\n });\n\n units.forEach((unit, idx) => {\n const stepDeps = (unit.dependencies || [])\n .map(depId => unitIdToStepId.get(depId))\n .filter((id): id is number => id !== undefined);\n\n steps.push({\n id: idx + 1,\n task: unit.description,\n status: 'pending',\n persona: unit.requiredPersona,\n complexity: unit.estimatedComplexity,\n dependencies: stepDeps.length > 0 ? stepDeps : undefined,\n sourceRefs: unit.sourceRefs\n });\n });\n\n return steps;\n }\n}\n", "import { createHash } from 'node:crypto';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\ninterface CacheEntry<T = any> {\n value: T;\n createdAt: string;\n expiresAt: string;\n meta?: {\n tokensSaved?: number;\n usdSaved?: number;\n source?: string;\n };\n}\n\ninterface CacheStore {\n version: number;\n namespaces: Record<string, Record<string, CacheEntry>>;\n}\n\nfunction nowIso() {\n return new Date().toISOString();\n}\n\nfunction toTimestamp(iso: string): number {\n const ts = Date.parse(iso);\n return Number.isFinite(ts) ? ts : 0;\n}\n\nexport class TokenCache {\n private baseDir: string;\n private cachePath: string;\n\n constructor(baseDir = process.cwd()) {\n this.baseDir = baseDir;\n this.cachePath = join(baseDir, '.crew', 'token-cache.json');\n }\n\n static hashKey(input: string): string {\n return createHash('sha256').update(String(input || '')).digest('hex');\n }\n\n private async ensureStore(): Promise<CacheStore> {\n const dir = join(this.baseDir, '.crew');\n await mkdir(dir, { recursive: true });\n if (!existsSync(this.cachePath)) {\n const initial: CacheStore = { version: 1, namespaces: {} };\n await writeFile(this.cachePath, JSON.stringify(initial, null, 2), 'utf8');\n return initial;\n }\n try {\n const raw = await readFile(this.cachePath, 'utf8');\n const parsed = JSON.parse(raw) as CacheStore;\n return {\n version: parsed.version || 1,\n namespaces: parsed.namespaces || {}\n };\n } catch {\n return { version: 1, namespaces: {} };\n }\n }\n\n private async saveStore(store: CacheStore): Promise<void> {\n await writeFile(this.cachePath, JSON.stringify(store, null, 2), 'utf8');\n }\n\n async get<T = any>(namespace: string, key: string): Promise<{ hit: boolean; value?: T; meta?: CacheEntry['meta'] }> {\n const store = await this.ensureStore();\n const ns = store.namespaces[namespace] || {};\n const entry = ns[key];\n if (!entry) {\n return { hit: false };\n }\n if (toTimestamp(entry.expiresAt) <= Date.now()) {\n delete ns[key];\n store.namespaces[namespace] = ns;\n await this.saveStore(store);\n return { hit: false };\n }\n return { hit: true, value: entry.value as T, meta: entry.meta };\n }\n\n async set<T = any>(\n namespace: string,\n key: string,\n value: T,\n ttlSeconds = 1800,\n meta: CacheEntry['meta'] = {}\n ): Promise<void> {\n const ttl = Math.max(1, Number(ttlSeconds || 1800));\n const store = await this.ensureStore();\n if (!store.namespaces[namespace]) {\n store.namespaces[namespace] = {};\n }\n store.namespaces[namespace][key] = {\n value,\n createdAt: nowIso(),\n expiresAt: new Date(Date.now() + ttl * 1000).toISOString(),\n meta\n };\n await this.saveStore(store);\n }\n}\n", "// @ts-nocheck\nimport { access } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { join } from 'node:path';\nimport { dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { fileURLToPath } from 'node:url';\nimport { doctorMcpServers } from '../mcp/index.js';\n\nconst execFileAsync = promisify(execFile);\n\nfunction parseMajorNodeVersion(version) {\n const cleaned = String(version || '').replace(/^v/, '');\n const major = Number.parseInt(cleaned.split('.')[0] || '0', 10);\n return Number.isNaN(major) ? 0 : major;\n}\n\nasync function commandExists(command) {\n try {\n await execFileAsync('which', [command]);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function gatewayReachable(url) {\n try {\n const response = await fetch(`${url}/status`);\n return response.ok;\n } catch {\n return false;\n }\n}\n\nasync function configExists() {\n const configPath = join(homedir(), '.crewswarm', 'crewswarm.json');\n try {\n await access(configPath, constants.F_OK);\n return { ok: true, path: configPath };\n } catch {\n return { ok: false, path: configPath };\n }\n}\n\nfunction parseVersionParts(version: string): number[] {\n const cleaned = String(version || '').trim().replace(/^v/, '').split('-')[0];\n return cleaned.split('.').map(part => Number.parseInt(part || '0', 10) || 0);\n}\n\nexport function compareVersions(a: string, b: string): number {\n const av = parseVersionParts(a);\n const bv = parseVersionParts(b);\n const max = Math.max(av.length, bv.length);\n for (let i = 0; i < max; i += 1) {\n const ai = av[i] ?? 0;\n const bi = bv[i] ?? 0;\n if (ai > bi) return 1;\n if (ai < bi) return -1;\n }\n return 0;\n}\n\nexport async function getInstalledCliVersion(): Promise<string | null> {\n if (process.env.npm_package_version) {\n return process.env.npm_package_version;\n }\n\n const here = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n join(here, '..', 'package.json'),\n join(here, '..', '..', 'package.json'),\n join(process.cwd(), 'package.json')\n ];\n\n for (const candidate of candidates) {\n try {\n const raw = await (await import('node:fs/promises')).readFile(candidate, 'utf8');\n const parsed = JSON.parse(raw);\n const pkgName = String(parsed?.name || '');\n const looksLikeCli =\n pkgName === 'crewswarm-cli' ||\n pkgName === '@crewswarm/crew-cli' ||\n candidate.includes(`${join('crew-cli', 'package.json')}`);\n if (looksLikeCli && typeof parsed?.version === 'string' && parsed.version.trim()) {\n return parsed.version.trim();\n }\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nexport async function getLatestCliVersion(tag = 'latest'): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync('npm', ['view', `crewswarm-cli@${tag}`, 'version'], {\n timeout: 8000\n });\n const version = String(stdout || '').trim().split('\\n').pop()?.trim();\n return version || null;\n } catch {\n return null;\n }\n}\n\nexport async function isGlobalInstallLinked(): Promise<boolean> {\n try {\n const { stdout } = await execFileAsync('npm', ['-g', 'ls', 'crewswarm-cli', '--depth=0']);\n return String(stdout || '').includes('->');\n } catch {\n return false;\n }\n}\n\n// Provider key map \u2014 ordered by cost-effectiveness for new users\nconst PROVIDER_KEYS = [\n { id: 'Gemini', envKey: 'GEMINI_API_KEY', alt: 'GOOGLE_API_KEY', cost: 'free tier', signup: 'https://aistudio.google.com/apikey' },\n { id: 'Groq', envKey: 'GROQ_API_KEY', alt: null, cost: 'free', signup: 'https://console.groq.com/keys' },\n { id: 'xAI (Grok)', envKey: 'XAI_API_KEY', alt: null, cost: '$5/mo free credits', signup: 'https://console.x.ai' },\n { id: 'DeepSeek', envKey: 'DEEPSEEK_API_KEY', alt: null, cost: 'cheap', signup: 'https://platform.deepseek.com' },\n { id: 'OpenAI', envKey: 'OPENAI_API_KEY', alt: null, cost: 'pay-as-you-go', signup: 'https://platform.openai.com' },\n { id: 'Anthropic', envKey: 'ANTHROPIC_API_KEY', alt: null, cost: 'pay-as-you-go', signup: 'https://console.anthropic.com' },\n { id: 'OpenRouter', envKey: 'OPENROUTER_API_KEY', alt: null, cost: 'varies', signup: 'https://openrouter.ai' },\n { id: 'Together', envKey: 'TOGETHER_API_KEY', alt: null, cost: 'pay-as-you-go', signup: 'https://api.together.xyz' },\n { id: 'Fireworks', envKey: 'FIREWORKS_API_KEY', alt: null, cost: 'pay-as-you-go', signup: 'https://fireworks.ai' },\n { id: 'Moonshot', envKey: 'MOONSHOT_API_KEY', alt: null, cost: 'pay-as-you-go', signup: 'https://moonshot.ai' },\n];\n\nexport function checkApiKeys(): { configured: string[]; missing: string[]; details: string; hint: string } {\n const configured: string[] = [];\n const missing: string[] = [];\n\n for (const p of PROVIDER_KEYS) {\n if (process.env[p.envKey] || (p.alt && process.env[p.alt])) {\n configured.push(p.id);\n } else {\n missing.push(p.id);\n }\n }\n\n let details: string;\n let hint = '';\n if (configured.length === 0) {\n details = 'No API keys found \u2014 crew-cli cannot run';\n hint = `Cheapest options:\\n \u2192 Gemini (free tier): ${PROVIDER_KEYS[0].signup}\\n \u2192 Groq (free): ${PROVIDER_KEYS[1].signup}`;\n } else {\n details = `${configured.length} provider(s): ${configured.join(', ')}`;\n }\n\n return { configured, missing, details, hint };\n}\n\nexport async function runDoctorChecks(options: { gateway?: string; updateTag?: string } = {}) {\n const gateway = options.gateway || 'http://localhost:5010';\n const nodeMajor = parseMajorNodeVersion(process.version);\n\n // Helper: race any promise against a 5s timeout\n const withTimeout = <T>(promise: Promise<T>, fallback: T, label: string): Promise<T> =>\n Promise.race([\n promise,\n new Promise<T>(resolve => setTimeout(() => {\n resolve(fallback);\n }, 2000))\n ]);\n\n const gitOk = await commandExists('git');\n const gatewayOk = await withTimeout(gatewayReachable(gateway), false, 'gateway');\n const config = await configExists();\n const installedVersion = await getInstalledCliVersion();\n const latestVersion = await withTimeout(getLatestCliVersion(options.updateTag || 'latest'), null, 'npm');\n const linkedInstall = await withTimeout(isGlobalInstallLinked(), false, 'npm-link');\n const mcpChecks = await withTimeout(doctorMcpServers(process.cwd()), [{ server: '(timeout)', ok: false, details: 'MCP check timed out' }], 'mcp');\n const apiKeys = checkApiKeys();\n\n let updateDetails = 'Update check unavailable';\n if (installedVersion && latestVersion) {\n const cmp = compareVersions(installedVersion, latestVersion);\n if (cmp < 0) {\n updateDetails = `Update available: ${installedVersion} -> ${latestVersion} (run \"crew update\")`;\n } else {\n updateDetails = `Up to date (${installedVersion})`;\n }\n }\n if (linkedInstall) {\n updateDetails += ' [global npm link detected]';\n }\n\n const mcpFailed = mcpChecks.filter(x => !x.ok).length;\n const mcpDetails = mcpFailed === 0 \n ? `All ${mcpChecks.length} servers online` \n : `${mcpFailed}/${mcpChecks.length} servers failing`;\n\n return [\n {\n name: 'Node.js >= 20',\n ok: nodeMajor >= 20,\n details: `Detected ${process.version}`\n },\n {\n name: 'Git installed',\n ok: gitOk,\n details: gitOk ? 'git found in PATH' : 'git not found in PATH'\n },\n {\n name: 'LLM API keys',\n ok: apiKeys.configured.length > 0,\n details: apiKeys.details,\n hint: apiKeys.hint\n },\n {\n name: 'CrewSwarm config present',\n ok: config.ok,\n details: config.path\n },\n {\n name: 'CrewSwarm gateway reachable',\n ok: gatewayOk,\n details: `${gateway}/status`\n },\n {\n name: 'MCP configuration health',\n ok: mcpFailed === 0,\n details: mcpDetails\n },\n {\n name: 'CLI update status',\n ok: true,\n details: updateDetails\n }\n ];\n}\n\nexport function summarizeDoctorResults(results) {\n const passed = results.filter(item => item.ok).length;\n const failed = results.length - passed;\n return { passed, failed };\n}\n", "import { execFileSync } from 'node:child_process';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface McpServerConfig {\n url: string;\n bearerTokenEnvVar?: string;\n headers?: Record<string, string>;\n}\n\ninterface McpStore {\n mcpServers: Record<string, McpServerConfig>;\n}\n\nfunction localStorePath(baseDir = process.cwd()): string {\n return join(baseDir, '.crew', 'mcp-servers.json');\n}\n\nfunction clientPath(client: string): string {\n const home = homedir();\n const key = String(client || '').toLowerCase();\n if (key === 'cursor') return join(home, '.cursor', 'mcp.json');\n if (key === 'claude') return join(home, '.claude', 'mcp.json');\n if (key === 'opencode') return join(home, '.config', 'opencode', 'mcp.json');\n if (key === 'codex') return join(home, '.codex', 'mcp', 'config.json');\n throw new Error(`Unsupported client: ${client}`);\n}\n\nfunction isCodexClient(client: string): boolean {\n return String(client || '').toLowerCase() === 'codex';\n}\n\nfunction syncServerToCodex(name: string, config: McpServerConfig): void {\n const extraHeaders = Object.entries(config.headers || {}).filter(\n ([key]) => key.toLowerCase() !== 'authorization'\n );\n if (extraHeaders.length > 0) {\n throw new Error(\n `Codex MCP sync does not support custom headers: ${extraHeaders.map(([key]) => key).join(', ')}`\n );\n }\n\n const args = ['mcp', 'add', name, '--url', config.url];\n if (config.bearerTokenEnvVar) {\n args.push('--bearer-token-env-var', config.bearerTokenEnvVar);\n } else if ((config.headers || {}).Authorization || (config.headers || {}).authorization) {\n throw new Error(\n 'Codex MCP sync requires --bearer-token-env-var for authenticated HTTP servers'\n );\n }\n\n execFileSync('codex', args, { stdio: 'ignore' });\n}\n\nfunction removeServerFromCodex(name: string): void {\n execFileSync('codex', ['mcp', 'remove', name], { stdio: 'ignore' });\n}\n\nasync function loadStore(path: string): Promise<McpStore> {\n if (!existsSync(path)) return { mcpServers: {} };\n try {\n const raw = await readFile(path, 'utf8');\n const parsed = JSON.parse(raw);\n return { mcpServers: parsed.mcpServers || {} };\n } catch {\n return { mcpServers: {} };\n }\n}\n\nasync function saveStore(path: string, store: McpStore): Promise<void> {\n await mkdir(join(path, '..'), { recursive: true });\n await writeFile(path, `${JSON.stringify(store, null, 2)}\\n`, 'utf8');\n}\n\nexport async function listMcpServers(baseDir = process.cwd()): Promise<Record<string, McpServerConfig>> {\n const store = await loadStore(localStorePath(baseDir));\n return store.mcpServers;\n}\n\nexport async function addMcpServer(\n name: string,\n config: McpServerConfig,\n baseDir = process.cwd(),\n client?: string\n): Promise<void> {\n if (!name || !config?.url) {\n throw new Error('name and url are required');\n }\n\n const localPath = localStorePath(baseDir);\n const store = await loadStore(localPath);\n store.mcpServers[name] = {\n url: config.url,\n bearerTokenEnvVar: config.bearerTokenEnvVar || undefined,\n headers: config.headers || undefined\n };\n await saveStore(localPath, store);\n\n if (client) {\n await syncServerToClient(name, store.mcpServers[name], client);\n }\n}\n\nexport async function removeMcpServer(name: string, baseDir = process.cwd(), client?: string): Promise<void> {\n if (!name) throw new Error('name is required');\n\n const localPath = localStorePath(baseDir);\n const store = await loadStore(localPath);\n delete store.mcpServers[name];\n await saveStore(localPath, store);\n\n if (client) {\n if (isCodexClient(client)) {\n removeServerFromCodex(name);\n return;\n }\n const path = clientPath(client);\n const clientStore = await loadStore(path);\n delete clientStore.mcpServers[name];\n await saveStore(path, clientStore);\n }\n}\n\nexport async function syncServerToClient(name: string, config: McpServerConfig, client: string): Promise<void> {\n if (isCodexClient(client)) {\n syncServerToCodex(name, config);\n return;\n }\n const path = clientPath(client);\n const store = await loadStore(path);\n const payload: any = { url: config.url };\n\n if (config.headers && Object.keys(config.headers).length) {\n payload.headers = config.headers;\n }\n if (config.bearerTokenEnvVar) {\n payload.bearerTokenEnvVar = config.bearerTokenEnvVar;\n }\n\n store.mcpServers[name] = payload;\n await saveStore(path, store);\n}\n\nexport interface McpDoctorCheck {\n server: string;\n ok: boolean;\n details: string;\n}\n\nexport async function doctorMcpServers(baseDir = process.cwd()): Promise<McpDoctorCheck[]> {\n const checks: McpDoctorCheck[] = [];\n const servers = await listMcpServers(baseDir);\n const names = Object.keys(servers);\n\n if (!names.length) {\n return [{ server: '(none)', ok: false, details: 'No MCP servers configured' }];\n }\n\n for (const name of names) {\n const server = servers[name];\n if (!server?.url) {\n checks.push({ server: name, ok: false, details: 'Missing URL' });\n continue;\n }\n\n try {\n // URL format validation\n new URL(server.url);\n } catch {\n checks.push({ server: name, ok: false, details: `Invalid URL: ${server.url}` });\n continue;\n }\n\n if (server.bearerTokenEnvVar && !process.env[server.bearerTokenEnvVar]) {\n checks.push({\n server: name,\n ok: false,\n details: `Missing env var ${server.bearerTokenEnvVar}`\n });\n continue;\n }\n\n try {\n const res = await fetch(server.url, {\n method: 'GET',\n signal: AbortSignal.timeout(2500)\n });\n checks.push({\n server: name,\n ok: res.ok,\n details: `HTTP ${res.status}`\n });\n } catch (error) {\n checks.push({\n server: name,\n ok: false,\n details: `Unreachable: ${(error as Error).message}`\n });\n }\n }\n\n return checks;\n}\n", "export interface ModelPricing {\n model: string;\n inputPerMillion: number;\n outputPerMillion: number;\n}\n\nexport interface CostEstimate {\n model: string;\n inputTokens: number;\n outputTokens: number;\n inputUsd: number;\n outputUsd: number;\n totalUsd: number;\n}\n\nconst DEFAULT_OUTPUT_TOKENS = 1200;\n\nconst MODEL_PRICING: Record<string, ModelPricing> = {\n 'openai/gpt-4o': { model: 'openai/gpt-4o', inputPerMillion: 2.5, outputPerMillion: 10.0 },\n 'openai/gpt-4o-mini': { model: 'openai/gpt-4o-mini', inputPerMillion: 0.15, outputPerMillion: 0.6 },\n 'anthropic/claude-3-5-sonnet': { model: 'anthropic/claude-3-5-sonnet', inputPerMillion: 3.0, outputPerMillion: 15.0 },\n 'deepseek/deepseek-chat': { model: 'deepseek/deepseek-chat', inputPerMillion: 0.27, outputPerMillion: 1.1 },\n 'deepseek/deepseek-reasoner': { model: 'deepseek/deepseek-reasoner', inputPerMillion: 0.55, outputPerMillion: 2.19 },\n 'google/gemini-2.0-flash-exp': { model: 'google/gemini-2.0-flash-exp', inputPerMillion: 0.075, outputPerMillion: 0.30 },\n 'google/gemini-2.5-flash': { model: 'google/gemini-2.5-flash', inputPerMillion: 0.075, outputPerMillion: 0.30 },\n 'groq/llama-3.3-70b-versatile': { model: 'groq/llama-3.3-70b-versatile', inputPerMillion: 0.59, outputPerMillion: 0.79 },\n 'xai/grok-4': { model: 'xai/grok-4', inputPerMillion: 0.50, outputPerMillion: 2.00 }\n};\n\nfunction normalizeModel(model?: string): string {\n if (!model) {\n return 'openai/gpt-4o-mini';\n }\n return model;\n}\n\nexport function estimateTokens(text: string): number {\n const safe = text || '';\n // \"Similar tokenizer\" heuristic for mixed code + prose:\n // split by words, numbers, punctuation, and whitespace groups.\n const pieces = safe.match(/[A-Za-z_]+|\\d+|[^\\sA-Za-z0-9_]|[\\s]+/g) || [];\n let tokens = 0;\n for (const piece of pieces) {\n if (/^\\s+$/.test(piece)) {\n tokens += Math.max(1, Math.ceil(piece.length / 4));\n } else if (/^[A-Za-z_]+$/.test(piece)) {\n tokens += Math.max(1, Math.ceil(piece.length / 4));\n } else if (/^\\d+$/.test(piece)) {\n tokens += Math.max(1, Math.ceil(piece.length / 3));\n } else {\n tokens += 1;\n }\n }\n return Math.max(1, tokens);\n}\n\nexport function estimateCost(\n text: string,\n model?: string,\n outputTokens = DEFAULT_OUTPUT_TOKENS\n): CostEstimate {\n const selected = normalizeModel(model);\n const pricing = MODEL_PRICING[selected] || MODEL_PRICING['openai/gpt-4o-mini'];\n const inputTokens = estimateTokens(text);\n const inputUsd = (inputTokens / 1_000_000) * pricing.inputPerMillion;\n const outputUsd = (Math.max(1, outputTokens) / 1_000_000) * pricing.outputPerMillion;\n\n return {\n model: pricing.model,\n inputTokens,\n outputTokens: Math.max(1, outputTokens),\n inputUsd,\n outputUsd,\n totalUsd: inputUsd + outputUsd\n };\n}\n\nexport function compareModelCosts(\n text: string,\n outputTokens = DEFAULT_OUTPUT_TOKENS,\n models = Object.keys(MODEL_PRICING)\n): CostEstimate[] {\n return models\n .map(model => estimateCost(text, model, outputTokens))\n .sort((a, b) => a.totalUsd - b.totalUsd);\n}\n\nexport function getCheapestAlternative(text: string, outputTokens = DEFAULT_OUTPUT_TOKENS): CostEstimate {\n return compareModelCosts(text, outputTokens)[0];\n}\n", "// @ts-nocheck\nimport { spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { Logger } from '../utils/logger.js';\nimport { EngineSessionLayer, buildSessionPromptEnvelope } from './session-layer.js';\nimport { ConversationTranscriptStore, buildConversationHydrationPrompt } from '../session/conversation-transcript.js';\nimport { NativeEngineSessionManager, buildEngineShellCommand } from './native-session.js';\nimport { ToolAuditStore, buildReplayPlan, extractToolCalls, previewAuditOutput } from './tool-audit.js';\nconst logger = new Logger({ level: process.env.CREW_LOG_LEVEL || 'info' });\nconst nativeSessionManagers = new Map<string, NativeEngineSessionManager>();\n\nexport interface EngineRunOptions {\n model?: string;\n cwd?: string;\n timeoutMs?: number;\n sessionId?: string;\n sessionTurns?: number;\n projectDir?: string;\n systemPrompt?: string;\n runId?: string;\n onEvent?: (event: EngineRunEvent) => void;\n}\n\nexport interface EngineRunResult {\n success: boolean;\n engine: string;\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport interface EngineRunEvent {\n type: 'start' | 'chunk' | 'end' | 'error' | 'tool-audit';\n ts: string;\n engine: string;\n runId?: string;\n sessionId?: string;\n text?: string;\n exitCode?: number;\n success?: boolean;\n mode?: string;\n toolCount?: number;\n}\n\nfunction emitEngineEvent(options: EngineRunOptions, engine: string, event: Omit<EngineRunEvent, 'ts' | 'engine'>): void {\n const cb = options.onEvent;\n if (!cb) return;\n try {\n cb({\n ts: new Date().toISOString(),\n engine,\n ...event\n });\n } catch {\n // ignore callback failures\n }\n}\n\nfunction sessionLayerEnabled(): boolean {\n const raw = String(process.env.CREW_ENGINE_SESSION_ENABLED || 'true').trim().toLowerCase();\n return raw !== 'false' && raw !== '0' && raw !== 'off' && raw !== 'no';\n}\n\nfunction nativeEngineSessionEnabled(): boolean {\n const raw = String(process.env.CREW_ENGINE_NATIVE_SESSION_ENABLED || 'true').trim().toLowerCase();\n return raw !== 'false' && raw !== '0' && raw !== 'off' && raw !== 'no';\n}\n\nfunction isCliEngine(engine: string): boolean {\n const e = String(engine || '').trim().toLowerCase();\n return e === 'codex-cli' || e === 'claude-cli' || e === 'cursor-cli' || e === 'cursor' || e === 'gemini-cli' || e === 'opencode-cli' || e === 'opencode';\n}\n\nfunction getNativeSessionManager(baseDir: string): NativeEngineSessionManager {\n const key = String(baseDir || process.cwd());\n if (!nativeSessionManagers.has(key)) {\n nativeSessionManagers.set(key, new NativeEngineSessionManager(key));\n }\n return nativeSessionManagers.get(key)!;\n}\n\nasync function preparePromptWithSession(\n engine: string,\n prompt: string,\n options: EngineRunOptions\n): Promise<{\n effectivePrompt: string;\n engineStore: EngineSessionLayer | null;\n transcriptStore: ConversationTranscriptStore | null;\n}> {\n if (!sessionLayerEnabled()) {\n return {\n effectivePrompt: options.systemPrompt ? buildSessionPromptEnvelope({ systemPrompt: options.systemPrompt, history: [], prompt }) : prompt,\n engineStore: null,\n transcriptStore: null\n };\n }\n\n const sessionId = String(options.sessionId || '').trim();\n const systemPrompt = String(options.systemPrompt || '').trim();\n if (!sessionId) {\n if (!systemPrompt) {\n return {\n effectivePrompt: prompt,\n engineStore: null,\n transcriptStore: null\n };\n }\n return {\n effectivePrompt: buildSessionPromptEnvelope({ systemPrompt, history: [], prompt }),\n engineStore: null,\n transcriptStore: null\n };\n }\n\n const baseDir = String(options.projectDir || options.cwd || process.cwd());\n const engineStore = new EngineSessionLayer(baseDir);\n const transcriptStore = new ConversationTranscriptStore(baseDir);\n const maxTurns = Math.max(1, Number(options.sessionTurns || 6));\n const [engineHistory, conversationHistory] = await Promise.all([\n engineStore.getRecentTurns(engine, sessionId, maxTurns),\n transcriptStore.getRecentTurns(sessionId, Math.max(2, maxTurns * 2))\n ]);\n const withConversation = buildConversationHydrationPrompt({\n turns: conversationHistory,\n currentPrompt: prompt\n });\n const effectivePrompt = buildSessionPromptEnvelope({\n systemPrompt,\n history: engineHistory,\n prompt: withConversation\n });\n return { effectivePrompt, engineStore, transcriptStore };\n}\n\nasync function persistEngineTurn(\n engineStore: EngineSessionLayer | null,\n transcriptStore: ConversationTranscriptStore | null,\n engine: string,\n prompt: string,\n options: EngineRunOptions,\n result: EngineRunResult,\n durationMs: number\n): Promise<void> {\n const sessionId = String(options.sessionId || '').trim();\n if (!sessionId) {\n return;\n }\n try {\n if (engineStore) {\n await engineStore.appendTurn({\n engine,\n sessionId,\n prompt,\n response: result.success ? result.stdout : result.stderr,\n success: result.success,\n exitCode: Number(result.exitCode || 0),\n model: options.model,\n durationMs,\n keepTurns: Number(process.env.CREW_ENGINE_SESSION_KEEP_TURNS || 20)\n });\n }\n if (transcriptStore) {\n await transcriptStore.appendTurn({\n sessionId,\n role: 'user',\n text: prompt,\n engine,\n keepTurns: Number(process.env.CREW_CONVERSATION_KEEP_TURNS || 40)\n });\n await transcriptStore.appendTurn({\n sessionId,\n role: 'assistant',\n text: result.success ? result.stdout : result.stderr,\n engine,\n keepTurns: Number(process.env.CREW_CONVERSATION_KEEP_TURNS || 40)\n });\n }\n } catch (err) {\n logger.warn(`[engine-session] failed to persist turn: ${(err as Error).message}`);\n }\n}\n\nasync function runCommand(command: string, args: string[], options: EngineRunOptions = {}, stdin?: string): Promise<EngineRunResult> {\n const engineLabel = String(command || '');\n emitEngineEvent(options, engineLabel, {\n type: 'start',\n runId: options.runId,\n sessionId: options.sessionId,\n mode: 'spawn'\n });\n return new Promise(resolve => {\n // Strip env vars that prevent CLI engines from running inside other sessions\n const cleanEnv = { ...process.env };\n delete cleanEnv.CLAUDECODE;\n delete cleanEnv.CLAUDE_CODE;\n\n const child = spawn(command, args, {\n cwd: options.cwd || process.cwd(),\n stdio: [stdin ? 'pipe' : 'ignore', 'pipe', 'pipe'],\n env: cleanEnv\n });\n\n let stdinWritten = false;\n if (stdin && child.stdin) {\n try {\n child.stdin.write(stdin, 'utf8', (err) => {\n if (err) {\n logger.error(`[${command}] stdin write error:`, err);\n }\n // Give the process a moment to start reading before closing stdin\n setTimeout(() => {\n if (child.stdin && !child.stdin.destroyed) {\n child.stdin.end();\n }\n }, 50);\n });\n stdinWritten = true;\n } catch (err) {\n logger.error(`[${command}] failed to write stdin:`, err);\n }\n }\n\n const timeoutMs = options.timeoutMs || 600000;\n let stdout = '';\n let stderr = '';\n let done = false;\n\n const timer = setTimeout(() => {\n if (done) return;\n logger.error(`[${command}] Timing out after ${timeoutMs}ms. stdout: ${stdout.slice(0, 200)}, stderr: ${stderr.slice(0, 200)}`);\n child.kill('SIGTERM');\n // Give process 2s to clean up, then SIGKILL if needed\n setTimeout(() => {\n if (!done && !child.killed) {\n child.kill('SIGKILL');\n }\n }, 2000);\n done = true;\n resolve({\n success: false,\n engine: command,\n stdout,\n stderr: `${stderr}\\nTimed out after ${timeoutMs}ms`,\n exitCode: -1\n });\n }, timeoutMs);\n\n child.stdout.on('data', chunk => {\n const text = String(chunk);\n stdout += text;\n emitEngineEvent(options, engineLabel, {\n type: 'chunk',\n runId: options.runId,\n sessionId: options.sessionId,\n text\n });\n });\n child.stderr.on('data', chunk => {\n const text = String(chunk);\n stderr += text;\n emitEngineEvent(options, engineLabel, {\n type: 'chunk',\n runId: options.runId,\n sessionId: options.sessionId,\n text\n });\n });\n\n child.on('error', (err) => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n logger.error(`[${command}] process error:`, err);\n resolve({\n success: false,\n engine: command,\n stdout,\n stderr: `${stderr}\\nProcess error: ${err.message}`,\n exitCode: -1\n });\n });\n\n child.on('close', code => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n resolve({\n success: code === 0,\n engine: command,\n stdout: stdout.trim(),\n stderr: stderr.trim(),\n exitCode: code ?? -1\n });\n emitEngineEvent(options, engineLabel, {\n type: 'end',\n runId: options.runId,\n sessionId: options.sessionId,\n exitCode: code ?? -1,\n success: code === 0,\n mode: 'spawn'\n });\n });\n });\n}\n\nasync function maybeRunViaNativeSession(engine: string, prompt: string, options: EngineRunOptions): Promise<EngineRunResult | null> {\n if (!nativeEngineSessionEnabled()) return null;\n if (!isCliEngine(engine)) return null;\n const sessionId = String(options.sessionId || '').trim();\n if (!sessionId) return null;\n\n const cwd = String(options.cwd || options.projectDir || process.cwd());\n const command = buildEngineShellCommand(engine, prompt, options.model, cwd);\n if (!command) return null;\n const manager = getNativeSessionManager(cwd);\n emitEngineEvent(options, engine, {\n type: 'start',\n runId: options.runId,\n sessionId,\n mode: 'native-shell'\n });\n const result = await manager.runInSession({\n engine,\n sessionId,\n cwd,\n command,\n timeoutMs: options.timeoutMs,\n onChunk: (text: string) => {\n emitEngineEvent(options, engine, {\n type: 'chunk',\n runId: options.runId,\n sessionId,\n text\n });\n }\n });\n\n if (result.mode === 'fallback') return null;\n emitEngineEvent(options, engine, {\n type: result.success ? 'end' : 'error',\n runId: options.runId,\n sessionId,\n exitCode: result.exitCode,\n success: result.success,\n mode: result.mode\n });\n return {\n success: result.success,\n engine,\n stdout: result.stdout || '',\n stderr: result.stderr || '',\n exitCode: result.exitCode\n };\n}\n\nasync function callJsonApi(url: string, apiKey: string | null, body: unknown): Promise<string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n };\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`API error ${response.status}: ${text.slice(0, 500)}`);\n }\n\n const data = await response.json() as any;\n return data?.content?.[0]?.text\n || data?.candidates?.[0]?.content?.parts?.[0]?.text\n || data?.output_text\n || JSON.stringify(data);\n}\n\nexport async function runGeminiApi(prompt: string, options: EngineRunOptions = {}): Promise<EngineRunResult> {\n const key = process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY;\n if (!key) {\n return {\n success: false,\n engine: 'gemini-api',\n stdout: '',\n stderr: 'Missing GEMINI_API_KEY/GOOGLE_API_KEY',\n exitCode: 1\n };\n }\n\n const model = options.model || 'gemini-2.0-flash';\n try {\n const text = await callJsonApi(\n `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${encodeURIComponent(key)}`,\n null,\n { contents: [{ parts: [{ text: prompt }] }] }\n );\n return { success: true, engine: 'gemini-api', stdout: text, stderr: '', exitCode: 0 };\n } catch (error) {\n return { success: false, engine: 'gemini-api', stdout: '', stderr: (error as Error).message, exitCode: 1 };\n }\n}\n\nexport async function runClaudeApi(prompt: string, options: EngineRunOptions = {}): Promise<EngineRunResult> {\n const key = process.env.ANTHROPIC_API_KEY;\n if (!key) {\n return {\n success: false,\n engine: 'claude-api',\n stdout: '',\n stderr: 'Missing ANTHROPIC_API_KEY',\n exitCode: 1\n };\n }\n\n const model = options.model || 'claude-3-5-sonnet-latest';\n try {\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': key,\n 'anthropic-version': '2023-06-01'\n },\n body: JSON.stringify({\n model,\n max_tokens: 2000,\n messages: [{ role: 'user', content: prompt }]\n })\n });\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`API error ${response.status}: ${text.slice(0, 500)}`);\n }\n const data = await response.json() as any;\n const text = data?.content?.[0]?.text || JSON.stringify(data);\n return { success: true, engine: 'claude-api', stdout: text, stderr: '', exitCode: 0 };\n } catch (error) {\n return { success: false, engine: 'claude-api', stdout: '', stderr: (error as Error).message, exitCode: 1 };\n }\n}\n\nexport async function runGeminiCli(prompt: string, options: EngineRunOptions = {}): Promise<EngineRunResult> {\n const args = ['-p', prompt];\n if (options.model) {\n args.push('-m', options.model);\n }\n return runCommand('gemini', args, options);\n}\n\nexport async function runCodexCli(prompt: string, options: EngineRunOptions = {}): Promise<EngineRunResult> {\n const args = ['-a', 'never', 'exec', '--sandbox', 'danger-full-access', '--json'];\n return runCommand('codex', args, options, prompt);\n}\n\nexport async function runClaudeCli(prompt: string, options: EngineRunOptions = {}): Promise<EngineRunResult> {\n const args = ['-p', '--setting-sources', 'user'];\n if (process.env.CREW_CLAUDE_SKIP_PERMISSIONS === 'true') {\n args.push('--dangerously-skip-permissions');\n }\n return runCommand('claude', args, options, prompt);\n}\n\n/**\n * Cursor engine: use the Cursor **agent** CLI (`agent`), same as gateway bypass\n * (`lib/engines/runners.mjs` / `CURSOR_CLI_BIN`). The `cursor` binary on PATH is\n * often the IDE opener (Electron) \u2014 not compatible with `--execute`.\n */\nfunction resolveCursorAgentBin(): string {\n const fromEnv = String(process.env.CURSOR_CLI_BIN || '').trim();\n if (fromEnv) return fromEnv;\n const agentLocal = path.join(os.homedir(), '.local', 'bin', 'agent');\n if (fs.existsSync(agentLocal)) return agentLocal;\n return 'agent';\n}\n\nexport async function runCursorCli(prompt: string, options: EngineRunOptions = {}): Promise<EngineRunResult> {\n const bin = resolveCursorAgentBin();\n const projectDir = options.cwd || options.projectDir || process.cwd();\n const cursorDefault = process.env.CREWSWARM_CURSOR_MODEL || 'composer-2-fast';\n let model = options.model;\n if (!model || String(model).trim() === '') {\n model = cursorDefault;\n } else if (String(model).includes('/')) {\n model = cursorDefault;\n } else if (String(model).includes('sonnet-4.6')) {\n model = 'sonnet-4.5';\n }\n const args = [\n '-p',\n '--force',\n '--trust',\n '--output-format',\n 'stream-json',\n prompt,\n '--model',\n model,\n '--workspace',\n projectDir\n ];\n return runCommand(bin, args, { ...options, cwd: projectDir });\n}\n\nexport async function runOpenCodeCli(prompt: string, options: EngineRunOptions = {}): Promise<EngineRunResult> {\n const args = ['run'];\n if (options.model) {\n args.push('--model', options.model);\n }\n args.push(prompt);\n return runCommand('opencode', args, options);\n}\n\nexport async function runEngine(engine: string, prompt: string, options: EngineRunOptions = {}): Promise<EngineRunResult> {\n const normalizedEngine = String(engine || '').trim().toLowerCase();\n const start = Date.now();\n const runId = String(options.runId || `eng-${randomUUID()}`);\n const optionsWithRunId: EngineRunOptions = { ...options, runId };\n const { effectivePrompt, engineStore, transcriptStore } = await preparePromptWithSession(normalizedEngine, prompt, options);\n let result: EngineRunResult;\n\n const native = await maybeRunViaNativeSession(normalizedEngine, effectivePrompt, optionsWithRunId);\n if (native) {\n result = native;\n await persistEngineTurn(engineStore, transcriptStore, normalizedEngine, prompt, optionsWithRunId, result, Date.now() - start);\n await maybeRecordToolAudit(runId, normalizedEngine, prompt, result, optionsWithRunId);\n return result;\n }\n\n switch (normalizedEngine) {\n case 'gemini-api':\n result = await runGeminiApi(effectivePrompt, options);\n break;\n case 'claude-api':\n result = await runClaudeApi(effectivePrompt, options);\n break;\n case 'gemini-cli':\n result = await runGeminiCli(effectivePrompt, options);\n break;\n case 'codex-cli':\n result = await runCodexCli(effectivePrompt, options);\n break;\n case 'claude-cli':\n result = await runClaudeCli(effectivePrompt, options);\n break;\n case 'cursor':\n case 'cursor-cli':\n result = await runCursorCli(effectivePrompt, options);\n break;\n case 'opencode':\n case 'opencode-cli':\n result = await runOpenCodeCli(effectivePrompt, options);\n break;\n default:\n result = {\n success: false,\n engine: normalizedEngine,\n stdout: '',\n stderr: `Unknown engine \"${normalizedEngine}\"`,\n exitCode: 1\n };\n break;\n }\n\n await persistEngineTurn(engineStore, transcriptStore, normalizedEngine, prompt, optionsWithRunId, result, Date.now() - start);\n await maybeRecordToolAudit(runId, normalizedEngine, prompt, result, optionsWithRunId);\n return result;\n}\n\nasync function maybeRecordToolAudit(\n runId: string,\n engine: string,\n prompt: string,\n result: EngineRunResult,\n options: EngineRunOptions\n): Promise<void> {\n const raw = result.success ? result.stdout : result.stderr;\n const toolCalls = extractToolCalls(raw);\n const store = new ToolAuditStore(String(options.projectDir || options.cwd || process.cwd()));\n await store.record({\n runId,\n ts: new Date().toISOString(),\n engine,\n sessionId: options.sessionId,\n prompt: previewAuditOutput(prompt),\n success: result.success,\n exitCode: result.exitCode,\n toolCalls,\n rawOutputPreview: previewAuditOutput(raw)\n });\n emitEngineEvent(options, engine, {\n type: 'tool-audit',\n runId,\n sessionId: options.sessionId,\n toolCount: toolCalls.length\n });\n}\n\nexport async function listNativeEngineSessions(baseDir = process.cwd()): Promise<Record<string, unknown>> {\n const manager = getNativeSessionManager(baseDir);\n return manager.list();\n}\n\nexport async function closeNativeEngineSessions(baseDir = process.cwd()): Promise<void> {\n const manager = getNativeSessionManager(baseDir);\n await manager.closeAll();\n}\n\nexport async function getToolAuditRuns(baseDir = process.cwd(), limit = 30): Promise<Array<Record<string, unknown>>> {\n const store = new ToolAuditStore(baseDir);\n return store.list(limit);\n}\n\nexport async function getToolAuditReplayPlan(baseDir: string, runId: string): Promise<ReturnType<typeof buildReplayPlan> | null> {\n const store = new ToolAuditStore(baseDir);\n const run = await store.loadRun(runId);\n if (!run) return null;\n return buildReplayPlan(run);\n}\n", "import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nexport interface EngineSessionTurn {\n ts: string;\n prompt: string;\n response: string;\n success: boolean;\n exitCode: number;\n model?: string;\n durationMs?: number;\n}\n\nexport interface EngineSessionRecord {\n key: string;\n engine: string;\n sessionId: string;\n projectDir: string;\n createdAt: string;\n updatedAt: string;\n turns: EngineSessionTurn[];\n totalTurns: number;\n lastSuccess: boolean;\n lastExitCode: number;\n lastModel?: string;\n}\n\nexport interface EngineSessionSummary {\n key: string;\n engine: string;\n sessionId: string;\n projectDir: string;\n createdAt: string;\n updatedAt: string;\n totalTurns: number;\n lastSuccess: boolean;\n lastExitCode: number;\n lastModel?: string;\n}\n\ntype SessionStore = Record<string, EngineSessionRecord>;\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction clip(text: string, maxChars: number): string {\n const value = String(text || '');\n if (value.length <= maxChars) return value;\n return `${value.slice(0, maxChars)}\\n...[truncated]`;\n}\n\nexport class EngineSessionLayer {\n private readonly baseDir: string;\n private readonly stateDir: string;\n private readonly sessionsPath: string;\n\n constructor(baseDir: string = process.cwd()) {\n this.baseDir = resolve(baseDir);\n this.stateDir = join(this.baseDir, '.crew');\n this.sessionsPath = join(this.stateDir, 'engine-sessions.json');\n }\n\n makeKey(engine: string, sessionId: string): string {\n return `${String(engine || '').trim().toLowerCase()}::${String(sessionId || '').trim()}`;\n }\n\n async ensureInitialized(): Promise<void> {\n await mkdir(this.stateDir, { recursive: true });\n if (!existsSync(this.sessionsPath)) {\n await writeFile(this.sessionsPath, JSON.stringify({}, null, 2), 'utf8');\n }\n }\n\n private async loadStore(): Promise<SessionStore> {\n await this.ensureInitialized();\n try {\n const raw = await readFile(this.sessionsPath, 'utf8');\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {};\n return parsed as SessionStore;\n } catch {\n return {};\n }\n }\n\n private async saveStore(store: SessionStore): Promise<void> {\n await this.ensureInitialized();\n await writeFile(this.sessionsPath, JSON.stringify(store, null, 2), 'utf8');\n }\n\n async appendTurn(params: {\n engine: string;\n sessionId: string;\n prompt: string;\n response: string;\n success: boolean;\n exitCode: number;\n model?: string;\n durationMs?: number;\n keepTurns?: number;\n }): Promise<EngineSessionRecord> {\n const engine = String(params.engine || '').trim().toLowerCase();\n const sessionId = String(params.sessionId || '').trim();\n if (!engine || !sessionId) {\n throw new Error('appendTurn requires engine and sessionId');\n }\n\n const keepTurns = Math.max(1, Number(params.keepTurns || 20));\n const store = await this.loadStore();\n const key = this.makeKey(engine, sessionId);\n const existing = store[key];\n const record: EngineSessionRecord = existing || {\n key,\n engine,\n sessionId,\n projectDir: this.baseDir,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n turns: [],\n totalTurns: 0,\n lastSuccess: true,\n lastExitCode: 0,\n lastModel: ''\n };\n\n record.turns.push({\n ts: nowIso(),\n prompt: clip(params.prompt, 4000),\n response: clip(params.response, 12000),\n success: Boolean(params.success),\n exitCode: Number(params.exitCode ?? 0),\n model: params.model,\n durationMs: Number(params.durationMs || 0)\n });\n record.turns = record.turns.slice(-keepTurns);\n record.totalTurns = Number(record.totalTurns || 0) + 1;\n record.lastSuccess = Boolean(params.success);\n record.lastExitCode = Number(params.exitCode ?? 0);\n record.lastModel = params.model || record.lastModel;\n record.updatedAt = nowIso();\n\n store[key] = record;\n await this.saveStore(store);\n return record;\n }\n\n async getRecord(engine: string, sessionId: string): Promise<EngineSessionRecord | null> {\n const key = this.makeKey(engine, sessionId);\n const store = await this.loadStore();\n return store[key] || null;\n }\n\n async getRecentTurns(engine: string, sessionId: string, maxTurns = 6): Promise<EngineSessionTurn[]> {\n const rec = await this.getRecord(engine, sessionId);\n if (!rec) return [];\n const n = Math.max(1, Number(maxTurns || 6));\n return rec.turns.slice(-n);\n }\n\n async listSummaries(): Promise<Record<string, EngineSessionSummary>> {\n const store = await this.loadStore();\n const out: Record<string, EngineSessionSummary> = {};\n for (const [key, rec] of Object.entries(store)) {\n out[key] = {\n key,\n engine: rec.engine,\n sessionId: rec.sessionId,\n projectDir: rec.projectDir,\n createdAt: rec.createdAt,\n updatedAt: rec.updatedAt,\n totalTurns: Number(rec.totalTurns || rec.turns?.length || 0),\n lastSuccess: Boolean(rec.lastSuccess),\n lastExitCode: Number(rec.lastExitCode || 0),\n lastModel: rec.lastModel\n };\n }\n return out;\n }\n\n async clear(): Promise<void> {\n await this.saveStore({});\n }\n}\n\nexport function buildSessionPromptEnvelope(params: {\n systemPrompt?: string;\n history: EngineSessionTurn[];\n prompt: string;\n}): string {\n const chunks: string[] = [];\n const systemPrompt = String(params.systemPrompt || '').trim();\n if (systemPrompt) {\n chunks.push('SYSTEM PERSONA (persist across session):');\n chunks.push(systemPrompt);\n }\n const history = Array.isArray(params.history) ? params.history : [];\n if (history.length > 0) {\n chunks.push('SESSION HISTORY (most recent turns):');\n for (const turn of history) {\n chunks.push(`[USER @ ${turn.ts}]`);\n chunks.push(clip(String(turn.prompt || ''), 1200));\n chunks.push(`[ASSISTANT @ ${turn.ts}]`);\n chunks.push(clip(String(turn.response || ''), 2000));\n }\n chunks.push('Continue consistently with the session history.');\n }\n chunks.push('CURRENT USER MESSAGE:');\n chunks.push(String(params.prompt || ''));\n return chunks.join('\\n\\n');\n}\n", "import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nexport interface ConversationTurn {\n ts: string;\n role: 'user' | 'assistant';\n text: string;\n engine?: string;\n}\n\ninterface ConversationRecord {\n sessionId: string;\n createdAt: string;\n updatedAt: string;\n turns: ConversationTurn[];\n}\n\ntype ConversationStore = Record<string, ConversationRecord>;\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction clip(text: string, maxChars: number): string {\n const value = String(text || '');\n if (value.length <= maxChars) return value;\n return `${value.slice(0, maxChars)}\\n...[truncated]`;\n}\n\nexport class ConversationTranscriptStore {\n private readonly stateDir: string;\n private readonly filePath: string;\n\n constructor(baseDir: string = process.cwd()) {\n const root = resolve(baseDir);\n this.stateDir = join(root, '.crew');\n this.filePath = join(this.stateDir, 'conversation-transcript.json');\n }\n\n async ensureInitialized(): Promise<void> {\n await mkdir(this.stateDir, { recursive: true });\n if (!existsSync(this.filePath)) {\n await writeFile(this.filePath, JSON.stringify({}, null, 2), 'utf8');\n }\n }\n\n private async loadStore(): Promise<ConversationStore> {\n await this.ensureInitialized();\n try {\n const raw = await readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {};\n return parsed as ConversationStore;\n } catch {\n return {};\n }\n }\n\n private async saveStore(store: ConversationStore): Promise<void> {\n await this.ensureInitialized();\n await writeFile(this.filePath, JSON.stringify(store, null, 2), 'utf8');\n }\n\n async appendTurn(params: {\n sessionId: string;\n role: 'user' | 'assistant';\n text: string;\n engine?: string;\n keepTurns?: number;\n }): Promise<void> {\n const sessionId = String(params.sessionId || '').trim();\n if (!sessionId) return;\n\n const keepTurns = Math.max(2, Number(params.keepTurns || 40));\n const store = await this.loadStore();\n const rec = store[sessionId] || {\n sessionId,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n turns: []\n };\n\n rec.turns.push({\n ts: nowIso(),\n role: params.role,\n text: clip(params.text, 8000),\n engine: params.engine\n });\n rec.turns = rec.turns.slice(-keepTurns);\n rec.updatedAt = nowIso();\n store[sessionId] = rec;\n await this.saveStore(store);\n }\n\n async getRecentTurns(sessionId: string, maxTurns = 8): Promise<ConversationTurn[]> {\n const key = String(sessionId || '').trim();\n if (!key) return [];\n const store = await this.loadStore();\n const rec = store[key];\n if (!rec) return [];\n return rec.turns.slice(-Math.max(1, Number(maxTurns || 8)));\n }\n}\n\nexport function buildConversationHydrationPrompt(params: {\n turns: ConversationTurn[];\n currentPrompt: string;\n}): string {\n const turns = Array.isArray(params.turns) ? params.turns : [];\n if (turns.length === 0) return String(params.currentPrompt || '');\n\n const lines: string[] = [];\n lines.push('SHARED SESSION CONTEXT (engine-agnostic):');\n for (const t of turns) {\n const role = t.role === 'assistant' ? 'ASSISTANT' : 'USER';\n lines.push(`[${role} @ ${t.ts}${t.engine ? ` via ${t.engine}` : ''}]`);\n lines.push(clip(String(t.text || ''), 1600));\n }\n lines.push('Continue from this shared conversation state.');\n lines.push('CURRENT USER MESSAGE:');\n lines.push(String(params.currentPrompt || ''));\n return lines.join('\\n\\n');\n}\n", "import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, resolve } from 'node:path';\nimport { randomUUID } from 'node:crypto';\n\nexport interface NativeSessionSummary {\n key: string;\n engine: string;\n sessionId: string;\n cwd: string;\n shell: string;\n createdAt: string;\n updatedAt: string;\n turns: number;\n alive: boolean;\n}\n\ntype RuntimeSession = {\n key: string;\n engine: string;\n sessionId: string;\n cwd: string;\n shell: string;\n createdAt: string;\n updatedAt: string;\n turns: number;\n busy: boolean;\n pty: any;\n};\n\ntype SessionStore = Record<string, Omit<NativeSessionSummary, 'alive'>>;\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction shellQuote(value: string): string {\n const text = String(value || '');\n if (text.length === 0) return \"''\";\n return `'${text.replace(/'/g, `'\\\"'\\\"'`)}'`;\n}\n\nexport class NativeEngineSessionManager {\n private readonly baseDir: string;\n private readonly stateDir: string;\n private readonly statePath: string;\n private readonly runtime = new Map<string, RuntimeSession>();\n private ptySpawn: any | null = null;\n private ptyLoadFailed = false;\n\n constructor(baseDir: string = process.cwd()) {\n this.baseDir = resolve(baseDir);\n this.stateDir = join(this.baseDir, '.crew');\n this.statePath = join(this.stateDir, 'engine-native-sessions.json');\n }\n\n private makeKey(engine: string, sessionId: string): string {\n return `${String(engine || '').trim().toLowerCase()}::${String(sessionId || '').trim()}`;\n }\n\n private async ensureStore(): Promise<void> {\n await mkdir(this.stateDir, { recursive: true });\n if (!existsSync(this.statePath)) {\n await writeFile(this.statePath, JSON.stringify({}, null, 2), 'utf8');\n }\n }\n\n private async loadStore(): Promise<SessionStore> {\n await this.ensureStore();\n try {\n const raw = await readFile(this.statePath, 'utf8');\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {};\n return parsed as SessionStore;\n } catch {\n return {};\n }\n }\n\n private async saveStore(store: SessionStore): Promise<void> {\n await this.ensureStore();\n await writeFile(this.statePath, JSON.stringify(store, null, 2), 'utf8');\n }\n\n private async getPtySpawn(): Promise<any | null> {\n if (this.ptySpawn) return this.ptySpawn;\n if (this.ptyLoadFailed) return null;\n try {\n const mod = await import('node-pty');\n this.ptySpawn = mod?.spawn || mod?.default?.spawn || null;\n return this.ptySpawn;\n } catch {\n this.ptyLoadFailed = true;\n return null;\n }\n }\n\n private async ensureSession(engine: string, sessionId: string, cwd: string, shell?: string): Promise<RuntimeSession | null> {\n const key = this.makeKey(engine, sessionId);\n const existing = this.runtime.get(key);\n if (existing) return existing;\n\n const spawn = await this.getPtySpawn();\n if (!spawn) return null;\n\n const chosenShell = shell || process.env.SHELL || '/bin/bash';\n const pty = spawn(chosenShell, ['-l'], {\n name: 'xterm-color',\n cwd,\n cols: process.stdout.columns || 120,\n rows: process.stdout.rows || 30,\n env: process.env\n });\n\n const session: RuntimeSession = {\n key,\n engine,\n sessionId,\n cwd,\n shell: chosenShell,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n turns: 0,\n busy: false,\n pty\n };\n this.runtime.set(key, session);\n await this.persistSessionMeta(session);\n return session;\n }\n\n private async persistSessionMeta(session: RuntimeSession): Promise<void> {\n const store = await this.loadStore();\n store[session.key] = {\n key: session.key,\n engine: session.engine,\n sessionId: session.sessionId,\n cwd: session.cwd,\n shell: session.shell,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n turns: session.turns\n };\n await this.saveStore(store);\n }\n\n async list(): Promise<Record<string, NativeSessionSummary>> {\n const store = await this.loadStore();\n const out: Record<string, NativeSessionSummary> = {};\n for (const [key, value] of Object.entries(store)) {\n out[key] = {\n ...value,\n alive: this.runtime.has(key)\n };\n }\n for (const [key, session] of this.runtime.entries()) {\n if (!out[key]) {\n out[key] = {\n key,\n engine: session.engine,\n sessionId: session.sessionId,\n cwd: session.cwd,\n shell: session.shell,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n turns: session.turns,\n alive: true\n };\n }\n }\n return out;\n }\n\n async closeAll(): Promise<void> {\n for (const [key, session] of this.runtime.entries()) {\n try {\n session.pty?.kill?.();\n } catch {\n // ignore\n }\n this.runtime.delete(key);\n }\n }\n\n async runInSession(params: {\n engine: string;\n sessionId: string;\n cwd: string;\n shell?: string;\n command: string;\n timeoutMs?: number;\n onChunk?: (chunk: string) => void;\n }): Promise<{ success: boolean; exitCode: number; stdout: string; stderr: string; mode: 'native-shell' | 'fallback' }> {\n const session = await this.ensureSession(params.engine, params.sessionId, params.cwd, params.shell);\n if (!session) {\n return {\n success: false,\n exitCode: -1,\n stdout: '',\n stderr: 'native-session unavailable (node-pty missing)',\n mode: 'fallback'\n };\n }\n if (session.busy) {\n return {\n success: false,\n exitCode: -1,\n stdout: '',\n stderr: `session ${session.key} is busy`,\n mode: 'native-shell'\n };\n }\n session.busy = true;\n session.updatedAt = nowIso();\n session.turns += 1;\n await this.persistSessionMeta(session);\n\n const sentinel = `__CREW_DONE_${randomUUID().replace(/-/g, '')}__`;\n const markerCmd = `${params.command}\\necho ${shellQuote(`${sentinel}$?`) }\\n`;\n const timeoutMs = Number(params.timeoutMs || 600000);\n\n return new Promise((resolve) => {\n let stdout = '';\n let stderr = '';\n let done = false;\n const timer = setTimeout(() => {\n if (done) return;\n done = true;\n session.busy = false;\n resolve({\n success: false,\n exitCode: -1,\n stdout,\n stderr: `${stderr}\\nTimed out after ${timeoutMs}ms`,\n mode: 'native-shell'\n });\n }, timeoutMs);\n\n const onData = (data: string) => {\n const chunk = String(data || '');\n const idx = chunk.indexOf(sentinel);\n if (idx >= 0) {\n const before = chunk.slice(0, idx);\n if (before) {\n stdout += before;\n params.onChunk?.(before);\n }\n const codeMatch = chunk.slice(idx + sentinel.length).match(/^(\\d+)/);\n const exitCode = codeMatch ? Number(codeMatch[1]) : 0;\n if (!done) {\n done = true;\n clearTimeout(timer);\n session.busy = false;\n session.updatedAt = nowIso();\n void this.persistSessionMeta(session);\n session.pty.off?.('data', onData);\n resolve({\n success: exitCode === 0,\n exitCode,\n stdout: stdout.trim(),\n stderr: stderr.trim(),\n mode: 'native-shell'\n });\n }\n return;\n }\n stdout += chunk;\n params.onChunk?.(chunk);\n };\n\n session.pty.onData(onData);\n try {\n session.pty.write(markerCmd);\n } catch (err) {\n if (!done) {\n done = true;\n clearTimeout(timer);\n session.busy = false;\n session.pty.off?.('data', onData);\n resolve({\n success: false,\n exitCode: -1,\n stdout,\n stderr: String((err as Error)?.message || err),\n mode: 'native-shell'\n });\n }\n }\n });\n }\n}\n\nfunction resolveCursorAgentBinQuoted(): string {\n const fromEnv = String(process.env.CURSOR_CLI_BIN || '').trim();\n if (fromEnv) return shellQuote(fromEnv);\n const agentLocal = join(homedir(), '.local', 'bin', 'agent');\n if (existsSync(agentLocal)) return shellQuote(agentLocal);\n return 'agent';\n}\n\n/** cwd: working directory / --workspace for CLI engines that need it (e.g. Cursor agent). */\nexport function buildEngineShellCommand(engine: string, prompt: string, model?: string, cwd?: string): string {\n const p = shellQuote(prompt);\n const m = model ? ` -m ${shellQuote(model)}` : '';\n const e = String(engine || '').trim().toLowerCase();\n if (e === 'codex-cli') return `printf %s ${p} | codex -a never exec --sandbox danger-full-access --json`;\n if (e === 'claude-cli') return `printf %s ${p} | claude -p --setting-sources user${String(process.env.CREW_CLAUDE_SKIP_PERMISSIONS || '') === 'true' ? ' --dangerously-skip-permissions' : ''}`;\n if (e === 'cursor-cli' || e === 'cursor') {\n const ws = shellQuote(cwd || process.cwd());\n const cursorDefault = process.env.CREWSWARM_CURSOR_MODEL || 'composer-2-fast';\n let mod = model;\n if (!mod || String(mod).trim() === '') mod = cursorDefault;\n else if (String(mod).includes('/')) mod = cursorDefault;\n else if (String(mod).includes('sonnet-4.6')) mod = 'sonnet-4.5';\n const mq = shellQuote(mod);\n const bin = resolveCursorAgentBinQuoted();\n return `${bin} -p --force --trust --output-format stream-json ${p} --model ${mq} --workspace ${ws}`;\n }\n if (e === 'gemini-cli') return `gemini -p ${p}${model ? ` -m ${shellQuote(model)}` : ''}`;\n if (e === 'opencode-cli' || e === 'opencode') return `opencode run${m} ${p}`;\n return '';\n}\n", "import { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nexport interface ToolCallRecord {\n name: string;\n args: Record<string, unknown>;\n}\n\nexport interface ToolAuditRun {\n runId: string;\n ts: string;\n engine: string;\n sessionId?: string;\n prompt: string;\n success: boolean;\n exitCode: number;\n toolCalls: ToolCallRecord[];\n rawOutputPreview: string;\n}\n\nfunction clip(text: string, max = 3000): string {\n const value = String(text || '');\n if (value.length <= max) return value;\n return `${value.slice(0, max)}\\n...[truncated]`;\n}\n\nexport function extractToolCalls(raw: string): ToolCallRecord[] {\n const text = String(raw || '');\n const calls: ToolCallRecord[] = [];\n\n const add = (name: string, args: Record<string, unknown>) => {\n calls.push({ name: String(name || '').trim(), args: args || {} });\n };\n\n const writeRe = /@@WRITE_FILE\\s+([^\\n]+)/g;\n let m: RegExpExecArray | null;\n while ((m = writeRe.exec(text)) !== null) add('write_file', { file_path: String(m[1] || '').trim() });\n\n const readRe = /@@READ_FILE\\s+([^\\n]+)/g;\n while ((m = readRe.exec(text)) !== null) add('read_file', { file_path: String(m[1] || '').trim() });\n\n const editRe = /@@EDIT\\s+\"([^\"]+)\"\\s*\u2192\\s*\"([^\"]+)\"\\s+([^\\n]+)/g;\n while ((m = editRe.exec(text)) !== null) {\n add('edit', {\n old_string: String(m[1] || ''),\n new_string: String(m[2] || ''),\n file_path: String(m[3] || '').trim()\n });\n }\n\n const mkdirRe = /@@MKDIR\\s+([^\\n]+)/g;\n while ((m = mkdirRe.exec(text)) !== null) add('mkdir', { path: String(m[1] || '').trim() });\n\n const cmdRe = /@@RUN_CMD\\s+([^\\n]+)/g;\n while ((m = cmdRe.exec(text)) !== null) add('run_cmd', { command: String(m[1] || '').trim() });\n\n const toolJsonRe = /@@TOOL\\s+([^\\n]+)/g;\n while ((m = toolJsonRe.exec(text)) !== null) {\n const rawArgs = String(m[1] || '').trim();\n if (!rawArgs) continue;\n try {\n if (rawArgs.startsWith('{')) {\n const parsed = JSON.parse(rawArgs);\n const n = String(parsed?.name || parsed?.tool || '').trim();\n const a = parsed?.args || parsed?.params || {};\n if (n) add(n, (a && typeof a === 'object') ? a : {});\n }\n } catch {\n // ignore malformed\n }\n }\n\n const fenced = text.match(/```json\\s*([\\s\\S]*?)```/gi) || [];\n for (const block of fenced) {\n const payload = block.replace(/^```json/i, '').replace(/```$/i, '').trim();\n try {\n const parsed = JSON.parse(payload);\n const tc = Array.isArray(parsed?.tool_calls) ? parsed.tool_calls : [];\n for (const t of tc) {\n const name = String(t?.function?.name || t?.name || '').trim();\n if (!name) continue;\n const argsRaw = t?.function?.arguments ?? t?.arguments ?? {};\n let args: Record<string, unknown> = {};\n if (typeof argsRaw === 'string') {\n try { args = JSON.parse(argsRaw); } catch { args = {}; }\n } else if (argsRaw && typeof argsRaw === 'object') {\n args = argsRaw as Record<string, unknown>;\n }\n add(name, args);\n }\n } catch {\n // ignore\n }\n }\n\n return calls.filter(c => c.name.length > 0);\n}\n\nexport class ToolAuditStore {\n private readonly baseDir: string;\n private readonly dir: string;\n private readonly indexPath: string;\n\n constructor(baseDir: string = process.cwd()) {\n this.baseDir = resolve(baseDir);\n this.dir = join(this.baseDir, '.crew', 'tool-audit');\n this.indexPath = join(this.baseDir, '.crew', 'tool-audit.jsonl');\n }\n\n private async ensureDir(): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n }\n\n async record(run: ToolAuditRun): Promise<void> {\n await this.ensureDir();\n const runPath = join(this.dir, `${run.runId}.json`);\n await writeFile(runPath, JSON.stringify(run, null, 2), 'utf8');\n await appendFile(this.indexPath, `${JSON.stringify({\n runId: run.runId,\n ts: run.ts,\n engine: run.engine,\n sessionId: run.sessionId || '',\n success: run.success,\n exitCode: run.exitCode,\n toolCount: run.toolCalls.length\n })}\\n`, 'utf8');\n }\n\n async loadRun(runId: string): Promise<ToolAuditRun | null> {\n try {\n const raw = await readFile(join(this.dir, `${runId}.json`), 'utf8');\n return JSON.parse(raw) as ToolAuditRun;\n } catch {\n return null;\n }\n }\n\n async list(limit = 30): Promise<Array<Record<string, unknown>>> {\n if (!existsSync(this.indexPath)) return [];\n const raw = await readFile(this.indexPath, 'utf8');\n const rows = raw.split('\\n').map(l => l.trim()).filter(Boolean).map((line) => {\n try { return JSON.parse(line); } catch { return null; }\n }).filter(Boolean) as Array<Record<string, unknown>>;\n return rows.slice(-Math.max(1, limit)).reverse();\n }\n}\n\nexport function buildReplayPlan(run: ToolAuditRun): {\n runId: string;\n deterministicOrder: ToolCallRecord[];\n supportedMutations: ToolCallRecord[];\n} {\n const supported = new Set(['write_file', 'edit', 'mkdir']);\n const ordered = Array.isArray(run.toolCalls) ? [...run.toolCalls] : [];\n return {\n runId: run.runId,\n deterministicOrder: ordered,\n supportedMutations: ordered.filter(c => supported.has(String(c.name || '').toLowerCase()))\n };\n}\n\nexport function previewAuditOutput(rawOutput: string): string {\n return clip(rawOutput, 5000);\n}\n", "import { watch } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { StudioBroadcaster } from '../studio/broadcaster.js';\n\nexport interface WatchEvent {\n type: 'todo_detected' | 'file_changed';\n file: string;\n todoCount?: number;\n todos?: string[];\n}\n\nfunction extractTodos(content: string): string[] {\n const todos: string[] = [];\n const lines = content.split('\\n');\n for (const line of lines) {\n if (line.toLowerCase().includes('todo')) {\n todos.push(line.trim());\n }\n }\n return todos;\n}\n\nexport async function inspectFileForTodos(path: string): Promise<WatchEvent> {\n let content = '';\n try {\n content = await readFile(path, 'utf8');\n } catch {\n return { type: 'file_changed', file: path };\n }\n\n const todos = extractTodos(content);\n if (todos.length > 0) {\n return {\n type: 'todo_detected',\n file: path,\n todoCount: todos.length,\n todos\n };\n }\n\n return { type: 'file_changed', file: path };\n}\n\nexport function startWatchMode(\n rootDir: string,\n onEvent: (event: WatchEvent) => Promise<void> | void,\n ignored: string[] = ['node_modules', '.git', 'dist', '.crew'],\n options?: { broadcastToStudio?: boolean; studioUrl?: string }\n) {\n // Initialize Studio broadcaster if requested\n let broadcaster: StudioBroadcaster | null = null;\n if (options?.broadcastToStudio) {\n broadcaster = new StudioBroadcaster(options?.studioUrl);\n broadcaster.connect().catch(() => {\n // Studio not running - continue without broadcast\n });\n }\n\n // Prefer chokidar if available for robust cross-platform watching.\n try {\n const chokidarMod = (globalThis as any).__crewChokidarCache\n || null;\n if (chokidarMod?.watch) {\n const watcher = chokidarMod.watch(rootDir, { ignored, ignoreInitial: true });\n \n watcher.on('change', async (file: string) => {\n const event = await inspectFileForTodos(file);\n await onEvent(event);\n \n // Broadcast to Studio\n if (broadcaster) {\n await broadcaster.broadcastFileChange(file, true);\n }\n });\n \n watcher.on('add', async (file: string) => {\n if (broadcaster) {\n await broadcaster.broadcastFileCreated(file);\n }\n });\n \n watcher.on('unlink', async (file: string) => {\n if (broadcaster) {\n await broadcaster.broadcastFileDeleted(file);\n }\n });\n \n return watcher;\n }\n } catch {\n // fallback below\n }\n\n const watcher = watch(rootDir, { recursive: true }, async (eventType, filename) => {\n if (!filename) return;\n const relative = String(filename);\n if (ignored.some(p => relative.includes(p))) return;\n\n const fullPath = join(rootDir, relative);\n const event = await inspectFileForTodos(fullPath);\n await onEvent(event);\n \n // Broadcast to Studio\n if (broadcaster) {\n if (eventType === 'rename') {\n // Could be add or delete - check if file exists\n await broadcaster.broadcastFileChange(fullPath, true);\n } else {\n await broadcaster.broadcastFileChange(fullPath, true);\n }\n }\n });\n\n return watcher;\n}\n\n// Lazy-load chokidar once if installed.\nvoid import('chokidar')\n .then(mod => {\n (globalThis as any).__crewChokidarCache = mod.default || mod;\n })\n .catch(() => {\n // optional dependency\n });\n", "/**\n * Studio Broadcaster\n * Sends file changes from CLI to Studio via WebSocket\n */\n\nimport { WebSocket } from 'ws';\nimport { readFile } from 'node:fs/promises';\nimport { Logger } from '../utils/logger.js';\n\nexport interface FileBroadcastEvent {\n type: 'file-changed' | 'file-created' | 'file-deleted';\n path: string;\n content?: string;\n timestamp: number;\n}\n\nexport class StudioBroadcaster {\n private ws: WebSocket | null = null;\n private connected = false;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private logger: Logger;\n private studioUrl: string;\n\n constructor(studioUrl = 'ws://127.0.0.1:3334/ws', logger?: Logger) {\n this.studioUrl = studioUrl;\n this.logger = logger || new Logger('studio');\n }\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.ws = new WebSocket(this.studioUrl);\n\n this.ws.on('open', () => {\n this.connected = true;\n this.logger.info('Connected to Studio watch server');\n resolve();\n });\n\n this.ws.on('close', () => {\n this.connected = false;\n this.logger.info('Disconnected from Studio');\n this.scheduleReconnect();\n });\n\n this.ws.on('error', (err) => {\n this.logger.error('Studio WebSocket error:', err.message);\n if (!this.connected) {\n reject(err);\n }\n });\n } catch (err) {\n reject(err);\n }\n });\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n \n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.logger.info('Attempting to reconnect to Studio...');\n this.connect().catch(() => {\n // Will retry again via scheduleReconnect\n });\n }, 5000);\n }\n\n async broadcastFileChange(filePath: string, includeContent = true): Promise<void> {\n if (!this.connected || !this.ws) {\n // Silently skip if not connected\n return;\n }\n\n try {\n const event: FileBroadcastEvent = {\n type: 'file-changed',\n path: filePath,\n timestamp: Date.now()\n };\n\n if (includeContent) {\n try {\n event.content = await readFile(filePath, 'utf8');\n } catch {\n // File might be binary or deleted - send without content\n event.content = undefined;\n }\n }\n\n this.ws.send(JSON.stringify(event));\n } catch (err) {\n this.logger.error('Failed to broadcast file change:', err);\n }\n }\n\n async broadcastFileCreated(filePath: string, content?: string): Promise<void> {\n if (!this.connected || !this.ws) return;\n\n try {\n const event: FileBroadcastEvent = {\n type: 'file-created',\n path: filePath,\n content,\n timestamp: Date.now()\n };\n\n this.ws.send(JSON.stringify(event));\n } catch (err) {\n this.logger.error('Failed to broadcast file creation:', err);\n }\n }\n\n async broadcastFileDeleted(filePath: string): Promise<void> {\n if (!this.connected || !this.ws) return;\n\n try {\n const event: FileBroadcastEvent = {\n type: 'file-deleted',\n path: filePath,\n timestamp: Date.now()\n };\n\n this.ws.send(JSON.stringify(event));\n } catch (err) {\n this.logger.error('Failed to broadcast file deletion:', err);\n }\n }\n\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.connected = false;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n}\n", "import chalk from 'chalk';\n\nconst BANNER = `\n \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n \u2551 \u2551\n \u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557 \u2551\n \u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2551\n \u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2551\n \u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2551\n \u2551 \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2554\u2588\u2588\u2588\u2554\u255D \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2551\n \u2551 \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u255D\u255A\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u2551\n \u2551 \u2551\n \u2551 \uD83C\uDFAA Multi-Agent Orchestrator \u2022 v0.1.0-alpha \u2551\n \u2551 \u2551\n \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n`;\n\nexport function getBanner(): string {\n return chalk.cyan(BANNER);\n}\n\nexport function helloWorld(): string {\n return \"Hello, World!\";\n}\n", "import { readdir, access, mkdir, writeFile } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface RepoSummary {\n name: string;\n path: string;\n branch: string;\n statusShort: string;\n recentCommit: string;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function runGit(repoPath: string, args: string[]): Promise<string> {\n const { stdout } = await execFileAsync('git', args, {\n cwd: repoPath,\n maxBuffer: 1024 * 1024 * 2\n });\n return stdout.trim();\n}\n\nexport async function findSiblingRepos(baseDir = process.cwd()): Promise<string[]> {\n const abs = resolve(baseDir);\n const parent = dirname(abs);\n const currentName = abs.split('/').pop() || '';\n const entries = await readdir(parent, { withFileTypes: true });\n\n const repos: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (entry.name === currentName) continue;\n const repoPath = join(parent, entry.name);\n if (await exists(join(repoPath, '.git'))) {\n repos.push(repoPath);\n }\n }\n return repos;\n}\n\nexport async function getRepoSummary(repoPath: string): Promise<RepoSummary> {\n const [branch, statusShort, recentCommit] = await Promise.all([\n runGit(repoPath, ['branch', '--show-current']).catch(() => '(unknown)'),\n runGit(repoPath, ['status', '--short']).catch(() => ''),\n runGit(repoPath, ['log', '-1', '--oneline']).catch(() => '(none)')\n ]);\n\n return {\n name: repoPath.split('/').pop() || repoPath,\n path: repoPath,\n branch: branch || '(detached)',\n statusShort: statusShort || '(clean)',\n recentCommit\n };\n}\n\nexport async function collectMultiRepoContext(baseDir = process.cwd()): Promise<string> {\n const siblings = await findSiblingRepos(baseDir);\n if (siblings.length === 0) {\n return '## Cross-Repo Context\\n```text\\nNo sibling git repositories found.\\n```';\n }\n\n const summaries = await Promise.all(siblings.map(path => getRepoSummary(path)));\n const lines = summaries.flatMap(summary => [\n `${summary.name} (${summary.path})`,\n ` branch: ${summary.branch}`,\n ` recent: ${summary.recentCommit}`,\n ` status: ${summary.statusShort}`,\n ''\n ]);\n\n return ['## Cross-Repo Context', '```text', ...lines, '```'].join('\\n');\n}\n\nexport async function syncRepoSnapshots(baseDir = process.cwd()): Promise<string> {\n const siblings = await findSiblingRepos(baseDir);\n const summaries = await Promise.all(siblings.map(path => getRepoSummary(path)));\n const outDir = join(baseDir, '.crew');\n await mkdir(outDir, { recursive: true });\n const outPath = join(outDir, 'multi-repo-sync.json');\n await writeFile(\n outPath,\n JSON.stringify({ syncedAt: new Date().toISOString(), repos: summaries }, null, 2),\n 'utf8'\n );\n return outPath;\n}\n\nexport async function detectBreakingApiSignals(repoPath: string): Promise<string[]> {\n const changedFilesRaw = await runGit(repoPath, ['diff', '--name-only']).catch(() => '');\n const changedFiles = changedFilesRaw.split('\\n').map(s => s.trim()).filter(Boolean);\n const warnings: string[] = [];\n\n for (const file of changedFiles) {\n if (/(api|route|routes|schema|openapi|proto|graphql|types?)/i.test(file)) {\n warnings.push(`Potential API-impacting file changed: ${file}`);\n }\n }\n\n const diffText = await runGit(repoPath, ['diff']).catch(() => '');\n const removedExports = (diffText.match(/^-.*export\\s+(interface|type|class|function)\\s+/gm) || []).length;\n if (removedExports > 0) {\n warnings.push(`Detected ${removedExports} removed exported symbols.`);\n }\n\n const removedRoutes = (diffText.match(/^-.*(app\\.(get|post|put|delete)|router\\.(get|post|put|delete))/gm) || []).length;\n if (removedRoutes > 0) {\n warnings.push(`Detected ${removedRoutes} removed route handlers.`);\n }\n\n return warnings;\n}\n", "import { spawn, ChildProcess } from 'node:child_process';\nimport { access, readFile, writeFile } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport WebSocket from 'ws';\n\nconst execFileAsync = promisify(execFile);\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function findChromeExecutable(): Promise<string | null> {\n if (process.env.CHROME_BIN) return process.env.CHROME_BIN;\n const candidates = [\n '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',\n '/Applications/Chromium.app/Contents/MacOS/Chromium',\n 'google-chrome',\n 'chromium',\n 'chromium-browser',\n 'chrome'\n ];\n\n for (const candidate of candidates) {\n if (candidate.startsWith('/')) {\n if (await exists(candidate)) return candidate;\n continue;\n }\n try {\n const { stdout } = await execFileAsync('which', [candidate]);\n const bin = stdout.trim();\n if (bin) return bin;\n } catch {\n // continue\n }\n }\n return null;\n}\n\nexport async function launchChromeDebug(url: string, port = 9222): Promise<ChildProcess> {\n const chrome = await findChromeExecutable();\n if (!chrome) {\n throw new Error('Chrome/Chromium binary not found. Set CHROME_BIN or install Chrome.');\n }\n\n const userDataDir = join(tmpdir(), `crew-browser-debug-${Date.now()}`);\n const args = [\n `--remote-debugging-port=${port}`,\n `--user-data-dir=${userDataDir}`,\n '--no-first-run',\n '--no-default-browser-check',\n '--headless=new',\n '--disable-gpu',\n url\n ];\n\n const proc = spawn(chrome, args, { stdio: 'ignore' });\n return proc;\n}\n\nexport type CdpEventHandler = (params: any) => void;\n\nexport class CdpClient {\n ws: WebSocket;\n id = 0;\n pending = new Map<number, (value: any) => void>();\n handlers = new Map<string, CdpEventHandler[]>();\n\n constructor(ws: WebSocket) {\n this.ws = ws;\n ws.on('message', data => {\n const payload = JSON.parse(String(data));\n if (payload.id && this.pending.has(payload.id)) {\n this.pending.get(payload.id)?.(payload);\n this.pending.delete(payload.id);\n } else if (payload.method && this.handlers.has(payload.method)) {\n for (const handler of this.handlers.get(payload.method) || []) {\n handler(payload.params || {});\n }\n }\n });\n }\n\n send(method: string, params: any = {}) {\n const id = ++this.id;\n return new Promise<any>((resolve, reject) => {\n this.pending.set(id, resolve);\n this.ws.send(JSON.stringify({ id, method, params }), err => {\n if (err) reject(err);\n });\n });\n }\n\n on(method: string, handler: CdpEventHandler) {\n const list = this.handlers.get(method) || [];\n list.push(handler);\n this.handlers.set(method, list);\n }\n}\n\nexport interface BrowserDebugResult {\n consoleErrors: string[];\n screenshotPath?: string;\n}\n\nexport async function getPageWsUrl(port: number, timeoutMs = 10000): Promise<string> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n const res = await fetch(`http://127.0.0.1:${port}/json`);\n if (res.ok) {\n const targets = await res.json() as any[];\n const page = targets.find(t => t.type === 'page');\n if (page && page.webSocketDebuggerUrl) return page.webSocketDebuggerUrl;\n }\n } catch {\n // retry\n }\n await new Promise(resolve => setTimeout(resolve, 300));\n }\n throw new Error('Timed out waiting for Chrome Page target.');\n}\n\nexport async function waitForWsDebuggerUrl(port: number, timeoutMs = 10000): Promise<string> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n const res = await fetch(`http://127.0.0.1:${port}/json/version`);\n if (res.ok) {\n const data = await res.json() as any;\n if (data.webSocketDebuggerUrl) return data.webSocketDebuggerUrl;\n }\n } catch {\n // retry\n }\n await new Promise(resolve => setTimeout(resolve, 300));\n }\n throw new Error('Timed out waiting for Chrome DevTools endpoint.');\n}\n\nexport async function runBrowserDebug(url: string, options: { port?: number; durationMs?: number; screenshotPath?: string } = {}): Promise<BrowserDebugResult> {\n const port = options.port || 9222;\n const durationMs = options.durationMs || 5000;\n const proc = await launchChromeDebug(url, port);\n let ws: WebSocket | null = null;\n\n try {\n const wsUrl = await waitForWsDebuggerUrl(port);\n ws = new WebSocket(wsUrl);\n\n await new Promise<void>((resolve, reject) => {\n ws?.once('open', () => resolve());\n ws?.once('error', reject);\n });\n\n const client = new CdpClient(ws);\n const errors: string[] = [];\n\n client.on('Runtime.consoleAPICalled', params => {\n const level = params.type || 'log';\n if (level === 'error' || level === 'warning') {\n const text = (params.args || []).map((a: any) => a.value || a.description || '').join(' ');\n errors.push(`[console:${level}] ${text}`.trim());\n }\n });\n\n client.on('Runtime.exceptionThrown', params => {\n const desc = params.exceptionDetails?.text || 'Exception thrown';\n errors.push(`[exception] ${desc}`);\n });\n\n client.on('Log.entryAdded', params => {\n const level = params.entry?.level || 'info';\n if (level === 'error' || level === 'warning') {\n errors.push(`[log:${level}] ${params.entry?.text || ''}`.trim());\n }\n });\n\n await client.send('Runtime.enable');\n await client.send('Log.enable');\n await client.send('Page.enable');\n await client.send('Page.navigate', { url });\n await new Promise(resolve => setTimeout(resolve, durationMs));\n\n let screenshotPath = options.screenshotPath;\n const screenshotRes = await client.send('Page.captureScreenshot', { format: 'png', fromSurface: true });\n if (!screenshotPath) {\n screenshotPath = join(process.cwd(), '.crew', `browser-shot-${Date.now()}.png`);\n }\n await writeFile(screenshotPath, Buffer.from(screenshotRes.result?.data || screenshotRes.data, 'base64'));\n\n return { consoleErrors: errors, screenshotPath };\n } finally {\n try {\n ws?.close();\n } catch (e) {\n console.error(`Failed to close WebSocket: ${e.message}`);\n }\n try {\n proc.kill('SIGTERM');\n } catch (e) {\n console.error(`Failed to kill browser process: ${e.message}`);\n }\n }\n}\n\nexport function compareScreenshotBuffers(a: Buffer, b: Buffer) {\n const max = Math.max(a.length, b.length);\n if (max === 0) return { diffBytes: 0, diffPercent: 0 };\n let diff = 0;\n for (let i = 0; i < max; i++) {\n const av = i < a.length ? a[i] : 0;\n const bv = i < b.length ? b[i] : 0;\n if (av !== bv) diff++;\n }\n return {\n diffBytes: diff,\n diffPercent: (diff / max) * 100\n };\n}\n\nexport async function compareScreenshots(pathA: string, pathB: string) {\n const [a, b] = await Promise.all([readFile(pathA), readFile(pathB)]);\n return compareScreenshotBuffers(a, b);\n}\n", "// @ts-nocheck\nimport { access, copyFile, mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { homedir, hostname } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface PrivacyControls {\n sharePrompt: boolean;\n shareOriginal: boolean;\n shareCorrected: boolean;\n shareTags: boolean;\n}\n\nconst DEFAULT_PRIVACY: PrivacyControls = {\n sharePrompt: true,\n shareOriginal: true,\n shareCorrected: true,\n shareTags: true\n};\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getStateDir(baseDir = process.cwd()) {\n return join(baseDir, '.crew');\n}\n\nfunction getTeamSyncDir(baseDir = process.cwd()) {\n return process.env.TEAM_SYNC_DIR || join(getStateDir(baseDir), 'team-sync');\n}\n\nfunction getPrivacyPath(baseDir = process.cwd()) {\n return join(getStateDir(baseDir), 'privacy.json');\n}\n\nfunction applyPrivacyToCorrection(entry: any, privacy: PrivacyControls) {\n const output: any = {\n timestamp: entry.timestamp,\n agent: entry.agent || null\n };\n if (privacy.sharePrompt) output.prompt = entry.prompt;\n if (privacy.shareOriginal) output.original = entry.original;\n if (privacy.shareCorrected) output.corrected = entry.corrected;\n if (privacy.shareTags) output.tags = entry.tags || [];\n return output;\n}\n\nexport async function loadPrivacyControls(baseDir = process.cwd()): Promise<PrivacyControls> {\n const path = getPrivacyPath(baseDir);\n if (!(await exists(path))) {\n await mkdir(getStateDir(baseDir), { recursive: true });\n await writeFile(path, JSON.stringify(DEFAULT_PRIVACY, null, 2), 'utf8');\n return { ...DEFAULT_PRIVACY };\n }\n\n try {\n const raw = await readFile(path, 'utf8');\n const parsed = JSON.parse(raw);\n return {\n sharePrompt: parsed.sharePrompt !== false,\n shareOriginal: parsed.shareOriginal !== false,\n shareCorrected: parsed.shareCorrected !== false,\n shareTags: parsed.shareTags !== false\n };\n } catch {\n return { ...DEFAULT_PRIVACY };\n }\n}\n\nexport async function savePrivacyControls(privacy: PrivacyControls, baseDir = process.cwd()) {\n await mkdir(getStateDir(baseDir), { recursive: true });\n await writeFile(getPrivacyPath(baseDir), JSON.stringify(privacy, null, 2), 'utf8');\n}\n\nexport async function uploadTeamContext(baseDir = process.cwd()) {\n const stateDir = getStateDir(baseDir);\n const teamDir = getTeamSyncDir(baseDir);\n await mkdir(teamDir, { recursive: true });\n\n const sessionPath = join(stateDir, 'session.json');\n const correctionsPath = join(stateDir, 'training-data.jsonl');\n const host = hostname().replace(/[^a-zA-Z0-9_-]/g, '_');\n const sessionOut = join(teamDir, `${host}-session.json`);\n const correctionsOut = join(teamDir, `${host}-training-data.jsonl`);\n\n if (await exists(sessionPath)) {\n if (process.env.TEAM_S3_SESSION_PUT_URL) {\n const body = await readFile(sessionPath, 'utf8');\n await fetch(process.env.TEAM_S3_SESSION_PUT_URL, { method: 'PUT', body });\n }\n await copyFile(sessionPath, sessionOut);\n }\n\n if (await exists(correctionsPath)) {\n let correctionsRaw = await readFile(correctionsPath, 'utf8');\n const privacy = await loadPrivacyControls(baseDir);\n if (correctionsRaw.trim().length > 0) {\n const lines = correctionsRaw.split('\\n').map(s => s.trim()).filter(Boolean);\n const filtered = lines.map(line => applyPrivacyToCorrection(JSON.parse(line), privacy));\n correctionsRaw = `${filtered.map(item => JSON.stringify(item)).join('\\n')}\\n`;\n }\n\n if (process.env.TEAM_S3_CORRECTIONS_PUT_URL) {\n await fetch(process.env.TEAM_S3_CORRECTIONS_PUT_URL, { method: 'PUT', body: correctionsRaw });\n }\n await writeFile(correctionsOut, correctionsRaw, 'utf8');\n }\n\n return { sessionOut, correctionsOut };\n}\n\nexport async function downloadTeamContext(baseDir = process.cwd()) {\n const stateDir = getStateDir(baseDir);\n const teamDir = getTeamSyncDir(baseDir);\n await mkdir(stateDir, { recursive: true });\n await mkdir(teamDir, { recursive: true });\n\n const localSessionPath = join(stateDir, 'session.json');\n const localCorrectionsPath = join(stateDir, 'training-data.jsonl');\n\n // S3 session pull (optional)\n if (process.env.TEAM_S3_SESSION_GET_URL) {\n const response = await fetch(process.env.TEAM_S3_SESSION_GET_URL);\n if (response.ok) {\n const text = await response.text();\n await writeFile(localSessionPath, text, 'utf8');\n }\n }\n\n // S3 corrections pull (optional)\n if (process.env.TEAM_S3_CORRECTIONS_GET_URL) {\n const response = await fetch(process.env.TEAM_S3_CORRECTIONS_GET_URL);\n if (response.ok) {\n const text = await response.text();\n await writeFile(localCorrectionsPath, text, 'utf8');\n }\n }\n\n // Local shared folder sync fallback/merge.\n const files = await readdir(teamDir);\n const sessionCandidates = files.filter(name => name.endsWith('-session.json'));\n const correctionCandidates = files.filter(name => name.endsWith('-training-data.jsonl'));\n\n if (sessionCandidates.length > 0 && !(await exists(localSessionPath))) {\n const src = join(teamDir, sessionCandidates.sort().at(-1) as string);\n await copyFile(src, localSessionPath);\n }\n\n let mergedCorrections = '';\n const seen = new Set<string>();\n\n if (await exists(localCorrectionsPath)) {\n const local = await readFile(localCorrectionsPath, 'utf8');\n for (const line of local.split('\\n').map(s => s.trim()).filter(Boolean)) {\n seen.add(line);\n mergedCorrections += `${line}\\n`;\n }\n }\n\n for (const file of correctionCandidates) {\n const raw = await readFile(join(teamDir, file), 'utf8');\n for (const line of raw.split('\\n').map(s => s.trim()).filter(Boolean)) {\n if (!seen.has(line)) {\n seen.add(line);\n mergedCorrections += `${line}\\n`;\n }\n }\n }\n\n if (mergedCorrections.length > 0) {\n await writeFile(localCorrectionsPath, mergedCorrections, 'utf8');\n }\n\n return {\n sessionPath: localSessionPath,\n correctionsPath: localCorrectionsPath,\n mergedCount: seen.size\n };\n}\n\nexport async function getTeamSyncStatus(baseDir = process.cwd()) {\n const teamDir = getTeamSyncDir(baseDir);\n await mkdir(teamDir, { recursive: true });\n const files = await readdir(teamDir);\n const privacy = await loadPrivacyControls(baseDir);\n return {\n teamDir,\n files,\n privacy\n };\n}\n\nexport { applyPrivacyToCorrection };\n", "import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { AgentRouter } from '../agent/router.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface RecorderPlan {\n command: string;\n args: string[];\n}\n\nexport type RecorderKind = 'sox' | 'ffmpeg-mac' | 'ffmpeg-linux' | 'ffmpeg-windows';\n\nexport interface RecordOptions {\n durationSec?: number;\n outputPath?: string;\n}\n\nexport interface TranscribeOptions {\n provider?: 'auto' | 'openai' | 'groq' | 'whisper-cli';\n}\n\nasync function commandExists(command: string): Promise<boolean> {\n try {\n await execFileAsync('which', [command]);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function selectRecorderPlan(\n platform: NodeJS.Platform,\n hasSox: boolean,\n hasFfmpeg: boolean,\n outputPath: string,\n durationSec: number\n): RecorderPlan | null {\n if (hasSox) {\n return {\n command: 'sox',\n args: ['-d', '-c', '1', '-r', '16000', outputPath, 'trim', '0', String(durationSec)]\n };\n }\n\n if (hasFfmpeg) {\n if (platform === 'darwin') {\n return {\n command: 'ffmpeg',\n args: ['-y', '-f', 'avfoundation', '-i', ':0', '-t', String(durationSec), '-ac', '1', '-ar', '16000', outputPath]\n };\n }\n if (platform === 'linux') {\n return {\n command: 'ffmpeg',\n args: ['-y', '-f', 'alsa', '-i', 'default', '-t', String(durationSec), '-ac', '1', '-ar', '16000', outputPath]\n };\n }\n return {\n command: 'ffmpeg',\n args: ['-y', '-f', 'dshow', '-i', 'audio=default', '-t', String(durationSec), '-ac', '1', '-ar', '16000', outputPath]\n };\n }\n\n return null;\n}\n\nexport function selectRecorderStrategy(\n available: { sox: boolean; ffmpeg: boolean },\n platform: NodeJS.Platform = process.platform\n): RecorderKind | null {\n if (available.sox) return 'sox';\n if (!available.ffmpeg) return null;\n if (platform === 'darwin') return 'ffmpeg-mac';\n if (platform === 'linux') return 'ffmpeg-linux';\n return 'ffmpeg-windows';\n}\n\nexport function buildRecorderStrategy(kind: RecorderKind, outputPath: string, durationSec: number): RecorderPlan {\n if (kind === 'sox') {\n return {\n command: 'sox',\n args: ['-d', '-c', '1', '-r', '16000', outputPath, 'trim', '0', String(durationSec)]\n };\n }\n if (kind === 'ffmpeg-mac') {\n return {\n command: 'ffmpeg',\n args: ['-y', '-f', 'avfoundation', '-i', ':0', '-t', String(durationSec), '-ac', '1', '-ar', '16000', outputPath]\n };\n }\n if (kind === 'ffmpeg-linux') {\n return {\n command: 'ffmpeg',\n args: ['-y', '-f', 'alsa', '-i', 'default', '-t', String(durationSec), '-ac', '1', '-ar', '16000', outputPath]\n };\n }\n return {\n command: 'ffmpeg',\n args: ['-y', '-f', 'dshow', '-i', 'audio=default', '-t', String(durationSec), '-ac', '1', '-ar', '16000', outputPath]\n };\n}\n\nexport async function recordAudio(options: RecordOptions = {}): Promise<string> {\n const durationSec = Math.max(1, options.durationSec || 6);\n const outputPath = options.outputPath || join(tmpdir(), `crew-listen-${Date.now()}.wav`);\n\n const hasSox = await commandExists('sox');\n const hasFfmpeg = await commandExists('ffmpeg');\n const plan = selectRecorderPlan(process.platform, hasSox, hasFfmpeg, outputPath, durationSec);\n\n if (!plan) {\n throw new Error('No audio recorder found. Install sox or ffmpeg, or use --text.');\n }\n\n await execFileAsync(plan.command, plan.args, { maxBuffer: 1024 * 1024 * 16 });\n return outputPath;\n}\n\nexport async function transcribeWithOpenAi(audioPath: string): Promise<string> {\n const key = process.env.OPENAI_API_KEY;\n if (!key) {\n throw new Error('OPENAI_API_KEY is required for OpenAI Whisper transcription.');\n }\n\n const audioBuffer = await readFile(audioPath);\n const blob = new Blob([audioBuffer], { type: 'audio/wav' });\n const form = new FormData();\n form.append('model', 'whisper-1');\n form.append('file', blob, 'audio.wav');\n\n const response = await fetch('https://api.openai.com/v1/audio/transcriptions', {\n method: 'POST',\n headers: { Authorization: `Bearer ${key}` },\n body: form\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Whisper API failed (${response.status}): ${body.slice(0, 400)}`);\n }\n const data = await response.json() as any;\n return String(data.text || '').trim();\n}\n\nexport async function transcribeWithGroq(audioPath: string): Promise<string> {\n const key = process.env.GROQ_API_KEY;\n if (!key) {\n throw new Error('GROQ_API_KEY is required for Groq Whisper transcription.');\n }\n\n const audioBuffer = await readFile(audioPath);\n const blob = new Blob([audioBuffer], { type: 'audio/wav' });\n const form = new FormData();\n form.append('model', 'whisper-large-v3-turbo');\n form.append('file', blob, 'audio.wav');\n form.append('response_format', 'json');\n\n const response = await fetch('https://api.groq.com/openai/v1/audio/transcriptions', {\n method: 'POST',\n headers: { Authorization: `Bearer ${key}` },\n body: form\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Groq Whisper API failed (${response.status}): ${body.slice(0, 400)}`);\n }\n const data = await response.json() as any;\n return String(data.text || '').trim();\n}\n\nexport async function transcribeWithWhisperCli(audioPath: string): Promise<string> {\n // Check for faster-whisper first (4x faster, same API as whisper)\n const hasFasterWhisper = await commandExists('faster-whisper');\n const hasWhisper = await commandExists('whisper');\n \n if (!hasFasterWhisper && !hasWhisper) {\n throw new Error('Local whisper CLI is not installed. Install with: pip install faster-whisper');\n }\n\n const whisperCmd = hasFasterWhisper ? 'faster-whisper' : 'whisper';\n const outDir = join(tmpdir(), `crew-whisper-${Date.now()}`);\n await execFileAsync('mkdir', ['-p', outDir]);\n \n // Use tiny model for speed (base for quality)\n const model = hasFasterWhisper ? 'tiny' : 'base';\n \n await execFileAsync(whisperCmd, [audioPath, '--model', model, '--output_format', 'txt', '--output_dir', outDir], {\n maxBuffer: 1024 * 1024 * 16\n });\n const baseName = audioPath.split('/').pop()?.replace(/\\.[^.]+$/, '') || 'audio';\n const txtPath = join(outDir, `${baseName}.txt`);\n const text = await readFile(txtPath, 'utf8');\n return text.trim();\n}\n\nexport async function transcribeAudio(audioPath: string, options: TranscribeOptions = {}): Promise<string> {\n const provider = options.provider || 'auto';\n\n if (provider === 'openai') {\n return transcribeWithOpenAi(audioPath);\n }\n if (provider === 'groq') {\n return transcribeWithGroq(audioPath);\n }\n if (provider === 'whisper-cli') {\n return transcribeWithWhisperCli(audioPath);\n }\n\n // auto: try Groq first (fastest + cheapest), then OpenAI, then local CLI\n if (process.env.GROQ_API_KEY) {\n try {\n return await transcribeWithGroq(audioPath);\n } catch {\n // fallback to next option\n }\n }\n if (process.env.OPENAI_API_KEY) {\n try {\n return await transcribeWithOpenAi(audioPath);\n } catch {\n // fallback to local\n }\n }\n return transcribeWithWhisperCli(audioPath);\n}\n\nexport async function speakWithSkill(router: AgentRouter, text: string, skill = 'elevenlabs.tts'): Promise<any> {\n return router.callSkill(skill, { text });\n}\n\nexport async function speakText(router: AgentRouter, text: string, skill = 'elevenlabs.tts'): Promise<any> {\n return speakWithSkill(router, text, skill);\n}\n\nexport async function appendVoiceTranscript(baseDir: string, role: 'user' | 'assistant', text: string) {\n const path = join(baseDir, '.crew', 'voice-transcript.log');\n await execFileAsync('mkdir', ['-p', join(baseDir, '.crew')]);\n const line = JSON.stringify({\n timestamp: new Date().toISOString(),\n role,\n text\n });\n await writeFile(path, `${line}\\n`, { encoding: 'utf8', flag: 'a' });\n}\n", "import { readFile } from 'node:fs/promises';\nimport { extname, resolve } from 'node:path';\nimport { getProjectContext } from './git.js';\n\nexport function collectOption(value: string, previous: string[] = []): string[] {\n if (!value) return previous;\n return [...previous, value];\n}\n\nexport async function readStdinText(): Promise<string> {\n if (process.stdin.isTTY) return '';\n let data = '';\n for await (const chunk of process.stdin) {\n data += String(chunk);\n }\n return data.trim();\n}\n\nfunction clip(text: string, maxChars: number): string {\n if (text.length <= maxChars) return text;\n return `${text.slice(0, maxChars)}\\n... [truncated ${text.length - maxChars} chars]`;\n}\n\nfunction inferImageMime(path: string): string | null {\n const ext = extname(path).toLowerCase();\n if (ext === '.png') return 'image/png';\n if (ext === '.jpg' || ext === '.jpeg') return 'image/jpeg';\n if (ext === '.webp') return 'image/webp';\n if (ext === '.gif') return 'image/gif';\n return null;\n}\n\nexport async function buildFileContextBlock(paths: string[] = [], maxChars = 8000): Promise<string> {\n if (!paths.length) return '';\n const sections: string[] = [];\n\n for (const rawPath of paths) {\n const abs = resolve(rawPath);\n try {\n const content = await readFile(abs, 'utf8');\n sections.push([\n `### File Context: ${abs}`,\n '```text',\n clip(content, maxChars),\n '```'\n ].join('\\n'));\n } catch (error) {\n sections.push(`### File Context: ${abs}\\n(unavailable: ${(error as Error).message})`);\n }\n }\n\n return `## Extra File Context\\n${sections.join('\\n\\n')}`;\n}\n\nexport async function buildRepoContextBlock(repos: string[] = []): Promise<string> {\n if (!repos.length) return '';\n const sections: string[] = [];\n\n for (const repo of repos) {\n const abs = resolve(repo);\n const gitBlock = await getProjectContext(abs).catch((error: Error) => `## Git Context\\n${error.message}`);\n sections.push(`### Repo Context: ${abs}\\n${gitBlock}`);\n }\n\n return `## Extra Repository Context\\n${sections.join('\\n\\n')}`;\n}\n\nexport async function buildImageContextBlock(paths: string[] = [], maxBytes = 250_000): Promise<string> {\n if (!paths.length) return '';\n const sections: string[] = [];\n\n for (const rawPath of paths) {\n const abs = resolve(rawPath);\n try {\n const mime = inferImageMime(abs);\n if (!mime) {\n sections.push(`### Image Context: ${abs}\\n(unsupported image type; supported: png, jpg, jpeg, webp, gif)`);\n continue;\n }\n\n const buf = await readFile(abs);\n const used = buf.subarray(0, maxBytes);\n const truncated = buf.length > maxBytes;\n const dataUri = `data:${mime};base64,${used.toString('base64')}`;\n sections.push([\n `### Image Context: ${abs}`,\n `mime: ${mime}`,\n `bytes: ${buf.length}${truncated ? ` (truncated to ${maxBytes})` : ''}`,\n '```text',\n dataUri,\n '```',\n 'Instruction: If vision is available, inspect this image for UI/layout/code details and apply the request.'\n ].join('\\n'));\n } catch (error) {\n sections.push(`### Image Context: ${abs}\\n(unavailable: ${(error as Error).message})`);\n }\n }\n\n return `## Extra Image Context\\n${sections.join('\\n\\n')}`;\n}\n\n/** Load images as structured attachments for multimodal LLM input */\nexport async function loadImageAttachments(\n paths: string[] = [],\n maxBytes = 250_000\n): Promise<Array<{ data: string; mimeType: string }>> {\n if (!paths.length) return [];\n const attachments: Array<{ data: string; mimeType: string }> = [];\n\n for (const rawPath of paths) {\n const abs = resolve(rawPath);\n try {\n const mime = inferImageMime(abs);\n if (!mime) continue;\n const buf = await readFile(abs);\n const used = buf.subarray(0, maxBytes);\n attachments.push({ data: used.toString('base64'), mimeType: mime });\n } catch {\n // Skip unreadable files\n }\n }\n\n return attachments;\n}\n\nexport function mergeTaskWithContext(task: string, blocks: string[]): string {\n const filtered = blocks.map(x => String(x || '').trim()).filter(Boolean);\n if (!filtered.length) return task;\n return `${task}\\n\\n${filtered.join('\\n\\n')}`;\n}\n\nexport function estimateTokens(text: string): number {\n if (!text) return 0;\n return Math.ceil(text.length / 4);\n}\n\nexport function enforceContextBudget(\n task: string,\n blocks: string[],\n maxTokens?: number,\n mode: 'trim' | 'stop' = 'trim'\n): { task: string; estimatedTokens: number; trimmed: boolean; exceeded: boolean } {\n const merged = mergeTaskWithContext(task, blocks);\n if (!maxTokens || maxTokens <= 0) {\n return { task: merged, estimatedTokens: estimateTokens(merged), trimmed: false, exceeded: false };\n }\n\n const estimated = estimateTokens(merged);\n if (estimated <= maxTokens) {\n return { task: merged, estimatedTokens: estimated, trimmed: false, exceeded: false };\n }\n\n if (mode === 'stop') {\n return { task: merged, estimatedTokens: estimated, trimmed: false, exceeded: true };\n }\n\n const baseTask = String(task || '');\n const maxChars = maxTokens * 4;\n const baseChars = baseTask.length;\n const remainingForContext = Math.max(0, maxChars - baseChars - 2);\n const contextText = blocks.map(x => String(x || '').trim()).filter(Boolean).join('\\n\\n');\n const clippedContext = contextText.slice(0, remainingForContext);\n const clipped = clippedContext ? `${baseTask}\\n\\n${clippedContext}` : baseTask.slice(0, maxChars);\n return {\n task: clipped,\n estimatedTokens: estimateTokens(clipped),\n trimmed: true,\n exceeded: false\n };\n}\n", "import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nfunction clip(text: string, maxChars = 20000): string {\n if (!text) return '(none)';\n if (text.length <= maxChars) return text;\n return `${text.slice(0, maxChars)}\\n... [truncated ${text.length - maxChars} chars]`;\n}\n\nasync function runGit(args: string[], cwd: string): Promise<string> {\n const { stdout } = await execFileAsync('git', args, { cwd, maxBuffer: 1024 * 1024 * 8 });\n return stdout.trim();\n}\n\nexport async function getReviewPayload(cwd = process.cwd()): Promise<{ hasChanges: boolean; payload: string }> {\n try {\n const [branch, unstaged, staged, status, commits] = await Promise.all([\n runGit(['branch', '--show-current'], cwd).catch(() => '(unknown)'),\n runGit(['diff', '--no-ext-diff'], cwd).catch(() => ''),\n runGit(['diff', '--staged', '--no-ext-diff'], cwd).catch(() => ''),\n runGit(['status', '--short'], cwd).catch(() => '(unavailable)'),\n runGit(['log', '-5', '--oneline'], cwd).catch(() => '(unavailable)')\n ]);\n\n const hasChanges = Boolean(unstaged || staged);\n const payload = [\n 'Please review this git diff before commit. Focus on regressions, missing tests, and risky behavior changes.',\n '',\n '## Branch',\n branch || '(detached)',\n '',\n '## Status',\n '```text',\n status || '(clean)',\n '```',\n '',\n '## Recent commits',\n '```text',\n commits || '(none)',\n '```',\n '',\n '## Unstaged diff',\n '```diff',\n clip(unstaged),\n '```',\n '',\n '## Staged diff',\n '```diff',\n clip(staged),\n '```'\n ].join('\\n');\n\n return { hasChanges, payload };\n } catch (error) {\n return { hasChanges: false, payload: `Unable to collect review payload: ${(error as Error).message}` };\n }\n}\n\nconst HIGH_SEVERITY_PATTERNS = [\n /\\bcritical\\b/i,\n /\\bseverity\\s*:\\s*high\\b/i,\n /\\bhigh[-\\s]?severity\\b/i,\n /\\bsev[-\\s]?1\\b/i,\n /\\bp0\\b/i,\n /\\bmust fix before merge\\b/i,\n /\\bdo not merge\\b/i\n];\n\nexport function detectHighSeverityFindings(text: string): { hasHighSeverity: boolean; matches: string[] } {\n const content = String(text || '');\n const matches: string[] = [];\n for (const pattern of HIGH_SEVERITY_PATTERNS) {\n const found = content.match(pattern);\n if (found?.[0]) matches.push(found[0]);\n }\n return { hasHighSeverity: matches.length > 0, matches };\n}\n", "import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { getExecutionPolicy, isRetryableError, isRiskBlocked, withRetries } from '../runtime/execution-policy.js';\nimport { analyzeBlastRadius } from '../blast-radius/index.js';\n\ninterface HeadlessDeps {\n router: any;\n orchestrator: any;\n sandbox: any;\n session: any;\n}\n\ninterface HeadlessRunOptions extends HeadlessDeps {\n task: string;\n projectDir?: string;\n agent?: string;\n gateway?: string;\n json?: boolean;\n alwaysApprove?: boolean;\n forceAutoApply?: boolean;\n riskThreshold?: 'low' | 'medium' | 'high';\n retryAttempts?: number;\n fallbackModels?: string[];\n out?: string;\n}\n\nfunction statePath(baseDir: string): string {\n return join(baseDir, '.crew', 'headless-state.json');\n}\n\nasync function ensureState(baseDir: string): Promise<void> {\n const path = statePath(baseDir);\n await mkdir(join(baseDir, '.crew'), { recursive: true });\n if (!existsSync(path)) {\n await writeFile(path, JSON.stringify({ paused: false, updatedAt: new Date().toISOString() }, null, 2), 'utf8');\n }\n}\n\nexport async function getHeadlessState(baseDir = process.cwd()): Promise<{ paused: boolean; updatedAt?: string }> {\n await ensureState(baseDir);\n try {\n const raw = await readFile(statePath(baseDir), 'utf8');\n const parsed = JSON.parse(raw);\n return { paused: Boolean(parsed.paused), updatedAt: parsed.updatedAt };\n } catch {\n return { paused: false };\n }\n}\n\nexport async function setHeadlessPaused(paused: boolean, baseDir = process.cwd()): Promise<void> {\n await ensureState(baseDir);\n await writeFile(\n statePath(baseDir),\n JSON.stringify({ paused: Boolean(paused), updatedAt: new Date().toISOString() }, null, 2),\n 'utf8'\n );\n}\n\nasync function appendOutLine(baseDir: string, outPath: string | undefined, payload: any): Promise<void> {\n if (!outPath) return;\n const fullPath = join(baseDir, outPath);\n await mkdir(join(fullPath, '..'), { recursive: true });\n const prev = existsSync(fullPath) ? await readFile(fullPath, 'utf8') : '';\n await writeFile(fullPath, `${prev}${JSON.stringify(payload)}\\n`, 'utf8');\n}\n\nasync function emit(baseDir: string, jsonMode: boolean, outPath: string | undefined, event: string, data: any = {}): Promise<void> {\n const payload = { ts: new Date().toISOString(), event, ...data };\n await appendOutLine(baseDir, outPath, payload);\n if (jsonMode) {\n process.stdout.write(`${JSON.stringify(payload)}\\n`);\n return;\n }\n const suffix = data?.message ? `: ${data.message}` : '';\n console.log(`[headless] ${event}${suffix}`);\n}\n\nexport async function runHeadlessTask(options: HeadlessRunOptions): Promise<{ success: boolean; response?: string }> {\n const cwd = options.projectDir || process.cwd();\n const jsonMode = Boolean(options.json);\n const state = await getHeadlessState(cwd);\n\n if (state.paused) {\n await emit(cwd, jsonMode, options.out, 'blocked', { message: 'headless mode is paused' });\n return { success: false };\n }\n\n await emit(cwd, jsonMode, options.out, 'start', { task: options.task });\n\n const policy = getExecutionPolicy({\n retryAttempts: Number(options.retryAttempts || 2),\n riskThreshold: options.riskThreshold || 'high',\n forceAutoApply: Boolean(options.forceAutoApply)\n });\n\n const route = await withRetries(\n async () => options.orchestrator.route(options.task),\n policy\n );\n const agent = options.agent || route.agent || 'crew-main';\n await emit(cwd, jsonMode, options.out, 'route', { decision: route.decision, agent });\n\n const fallbackChain = (options.fallbackModels || []).map(v => String(v || '').trim()).filter(Boolean);\n const chain = fallbackChain.length > 0 ? fallbackChain : [''];\n let dispatch: any = null;\n let lastError: unknown = null;\n for (const model of chain) {\n try {\n dispatch = await withRetries(\n async () => options.router.dispatch(agent, options.task, {\n sessionId: await options.session.getSessionId(),\n project: cwd,\n gateway: options.gateway,\n model: model || undefined\n }),\n policy,\n { shouldRetry: isRetryableError }\n );\n if (dispatch) break;\n } catch (error) {\n lastError = error;\n }\n }\n if (!dispatch) {\n throw (lastError as Error) || new Error('Headless dispatch failed');\n }\n\n const responseText = String(dispatch.result || '');\n await emit(cwd, jsonMode, options.out, 'result', { agent, response: responseText });\n\n const edits = await options.orchestrator.parseAndApplyToSandbox(responseText);\n await emit(cwd, jsonMode, options.out, 'sandbox', { filesChanged: edits.length });\n\n if (options.alwaysApprove && options.sandbox.hasChanges(options.sandbox.getActiveBranch())) {\n const active = options.sandbox.getActiveBranch();\n const changedFiles = typeof options.sandbox.getPendingPaths === 'function'\n ? options.sandbox.getPendingPaths(active)\n : [];\n const report = await analyzeBlastRadius(cwd, { changedFiles });\n if (isRiskBlocked(report.risk, policy.riskThreshold, policy.forceAutoApply)) {\n await emit(cwd, jsonMode, options.out, 'approval_required', {\n message: `risk gate blocked auto-apply (${report.risk} >= ${policy.riskThreshold})`\n });\n return { success: false, response: responseText };\n }\n await options.sandbox.apply(active);\n await emit(cwd, jsonMode, options.out, 'applied', { message: 'sandbox changes applied (--always-approve)' });\n } else if (edits.length > 0) {\n await emit(cwd, jsonMode, options.out, 'approval_required', { message: 'pending sandbox changes require apply' });\n }\n\n await emit(cwd, jsonMode, options.out, 'done', { success: true });\n return { success: true, response: responseText };\n}\n", "import { runDoctorChecks, summarizeDoctorResults } from '../diagnostics/doctor.js';\nimport { resolveCapabilityMap } from '../capabilities/index.js';\n\nexport type RiskThreshold = 'low' | 'medium' | 'high';\n\nexport interface ExecutionPolicy {\n strictPreflight: boolean;\n retryAttempts: number;\n retryBackoffMs: number;\n riskThreshold: RiskThreshold;\n forceAutoApply: boolean;\n diffFirst: boolean;\n}\n\nexport function getExecutionPolicy(input: Partial<ExecutionPolicy> = {}): ExecutionPolicy {\n const retryAttempts = Number(input.retryAttempts ?? process.env.CREW_RETRY_ATTEMPTS ?? 2);\n const retryBackoffMs = Number(input.retryBackoffMs ?? process.env.CREW_RETRY_BACKOFF_MS ?? 600);\n const rawThreshold = String(input.riskThreshold ?? process.env.CREW_RISK_THRESHOLD ?? 'high').toLowerCase();\n const riskThreshold: RiskThreshold =\n rawThreshold === 'low' || rawThreshold === 'medium' || rawThreshold === 'high'\n ? rawThreshold\n : 'high';\n const strictPreflight =\n Boolean(input.strictPreflight) ||\n String(process.env.CREW_STRICT_PREFLIGHT || '').toLowerCase() === 'true';\n const forceAutoApply =\n Boolean(input.forceAutoApply) ||\n String(process.env.CREW_FORCE_AUTO_APPLY || '').toLowerCase() === 'true';\n const diffFirst = String(process.env.CREW_DIFF_FIRST || 'true').toLowerCase() !== 'false';\n\n return {\n strictPreflight,\n retryAttempts: Number.isFinite(retryAttempts) ? Math.max(1, Math.min(5, Math.floor(retryAttempts))) : 2,\n retryBackoffMs: Number.isFinite(retryBackoffMs) ? Math.max(100, Math.min(5000, Math.floor(retryBackoffMs))) : 600,\n riskThreshold,\n forceAutoApply,\n diffFirst\n };\n}\n\nexport function isRetryableError(error: unknown): boolean {\n const text = String((error as Error)?.message || '').toLowerCase();\n return (\n text.includes('rate limit') ||\n text.includes('429') ||\n text.includes('timeout') ||\n text.includes('temporar') ||\n text.includes('unavailable') ||\n text.includes('quota') ||\n text.includes('connection reset') ||\n text.includes('econnreset')\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport async function withRetries<T>(\n fn: (attempt: number) => Promise<T>,\n policy: ExecutionPolicy,\n opts: { label?: string; shouldRetry?: (error: unknown) => boolean } = {}\n): Promise<T> {\n const attempts = Math.max(1, policy.retryAttempts);\n let lastError: unknown;\n for (let i = 1; i <= attempts; i += 1) {\n try {\n return await fn(i);\n } catch (error) {\n lastError = error;\n const retryable = (opts.shouldRetry || isRetryableError)(error);\n const hasNext = i < attempts;\n if (!retryable || !hasNext) break;\n const delay = Math.round(policy.retryBackoffMs * i + Math.random() * 120);\n await sleep(delay);\n }\n }\n throw lastError;\n}\n\nexport async function enforceStrictPreflight(policy: ExecutionPolicy, gateway?: string): Promise<void> {\n if (!policy.strictPreflight) return;\n const checks = await runDoctorChecks({ gateway: gateway || 'http://localhost:5010' });\n const summary = summarizeDoctorResults(checks);\n if (summary.failed > 0) {\n const failed = checks.filter(c => !c.ok).map(c => `${c.name}: ${c.details}`).join('; ');\n throw new Error(`Strict preflight failed (${summary.failed} checks): ${failed}`);\n }\n}\n\nexport function getCapabilityHandshake(mode: 'standalone' | 'connected') {\n const caps = resolveCapabilityMap(mode);\n return {\n mode: caps.mode,\n can_read: caps.canRead,\n can_write: caps.canWrite,\n can_pty: caps.canPty,\n can_lsp: caps.canLsp,\n can_dispatch: caps.canDispatch,\n can_git: caps.canGit\n };\n}\n\nexport function isRiskBlocked(\n risk: 'low' | 'medium' | 'high',\n threshold: RiskThreshold,\n force = false\n): boolean {\n if (force) return false;\n const score = { low: 1, medium: 2, high: 3 };\n return score[risk] >= score[threshold];\n}\n", "import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { readFileSync } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport type { AgentRouter } from '../agent/router.js';\nimport type { Orchestrator } from '../orchestrator/index.js';\nimport type { Sandbox } from '../sandbox/index.js';\nimport type { SessionManager } from '../session/manager.js';\nimport { buildCollectionIndex, searchCollection, type CollectionIndex, type CollectionChunk } from '../collections/index.js';\nimport { handleMcpRequest } from './mcp-handler.js';\nimport { loadPipelineMetricsSummary } from '../metrics/pipeline.js';\nimport { runEngine, listNativeEngineSessions, closeNativeEngineSessions, getToolAuditRuns, getToolAuditReplayPlan } from '../engines/index.js';\nimport { EngineSessionLayer } from '../engines/session-layer.js';\nimport { GeminiToolAdapter } from '../tools/gemini/crew-adapter.js';\n\ntype InterfaceMode = 'connected' | 'standalone';\n\nexport interface UnifiedServerOptions {\n mode: InterfaceMode;\n host: string;\n port: number;\n gateway?: string;\n router: AgentRouter;\n orchestrator: Orchestrator;\n sandbox: Sandbox;\n session: SessionManager;\n projectDir: string;\n logger?: { info?: (...args: unknown[]) => void; warn?: (...args: unknown[]) => void; error?: (...args: unknown[]) => void };\n}\n\ninterface TaskRecord {\n id: string;\n status: 'queued' | 'running' | 'done' | 'error';\n result?: unknown;\n error?: string;\n traceId?: string;\n costUsd?: number;\n createdAt: number;\n}\n\nconst taskStore = new Map<string, TaskRecord>();\n\nfunction evictStaleTasks() {\n const maxAge = 3_600_000; // 1 hour\n const now = Date.now();\n for (const [id, task] of taskStore) {\n if ((task.status === 'done' || task.status === 'error') && now - task.createdAt > maxAge) {\n taskStore.delete(id);\n }\n }\n}\n\n// Run eviction every 10 minutes\nsetInterval(evictStaleTasks, 600_000).unref();\n\nlet latestIndex: CollectionIndex | null = null;\nlet latestIndexStats: { files: number; chunks: number } = { files: 0, chunks: 0 };\nlet latestIndexId = '';\n\ninterface OpenAIMessage {\n role?: string;\n content?: string | Array<{ type?: string; text?: string }>;\n name?: string;\n tool_call_id?: string;\n tool_calls?: Array<{\n id?: string;\n type?: string;\n function?: { name?: string; arguments?: string };\n }>;\n}\n\nfunction readRtToken(): string {\n try {\n const p = join(homedir(), '.crewswarm', 'crewswarm.json');\n const cfg = JSON.parse(readFileSync(p, 'utf8'));\n return String(cfg?.rt?.authToken || '');\n } catch {\n return '';\n }\n}\n\nfunction checkAuth(req: IncomingMessage, res: ServerResponse): boolean {\n const token = readRtToken();\n if (!token) return true; // No token configured = no auth required\n const auth = req.headers['authorization'];\n if (auth === `Bearer ${token}`) return true;\n json(res, 401, { error: 'Unauthorized' });\n return false;\n}\n\nfunction json(res: ServerResponse, code: number, payload: unknown) {\n res.writeHead(code, {\n 'content-type': 'application/json; charset=utf-8',\n 'access-control-allow-origin': '*',\n 'access-control-allow-headers': 'content-type, authorization',\n 'access-control-allow-methods': 'GET,POST,OPTIONS'\n });\n res.end(JSON.stringify(payload));\n}\n\nasync function readJson(req: IncomingMessage): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const raw = Buffer.concat(chunks).toString('utf8').trim();\n if (!raw) return {};\n return JSON.parse(raw);\n}\n\nfunction getPath(req: IncomingMessage): string {\n const url = new URL(req.url || '/', 'http://127.0.0.1');\n return url.pathname;\n}\n\nfunction getQuery(req: IncomingMessage): URLSearchParams {\n const url = new URL(req.url || '/', 'http://127.0.0.1');\n return url.searchParams;\n}\n\nfunction extractMessageText(content: OpenAIMessage['content']): string {\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content\n .map(part => (part?.type === 'text' || !part?.type ? String(part?.text || '') : ''))\n .filter(Boolean)\n .join('\\n');\n }\n return '';\n}\n\nfunction normalizeOpenAIMessages(messages: unknown): Array<{ role: string; text: string }> {\n if (!Array.isArray(messages)) return [];\n return (messages as OpenAIMessage[])\n .map(m => ({\n role: String(m?.role || '').trim().toLowerCase(),\n text: extractMessageText(m?.content).trim()\n }))\n .filter(m => Boolean(m.role) && Boolean(m.text));\n}\n\nfunction composeChatPayloadFromOpenAI(messages: unknown): {\n message: string;\n context: string;\n inputChars: number;\n} {\n const normalized = normalizeOpenAIMessages(messages);\n const system = normalized.filter(m => m.role === 'system').map(m => m.text);\n const assistant = normalized.filter(m => m.role === 'assistant').map(m => m.text);\n const userTurns = normalized.filter(m => m.role === 'user');\n const lastUser = userTurns.at(-1)?.text || '';\n const priorUser = userTurns.slice(0, -1).map(m => m.text);\n const historyTail = [...priorUser, ...assistant].slice(-8);\n const contextSections: string[] = [];\n if (system.length > 0) contextSections.push(`SYSTEM INSTRUCTIONS:\\n${system.join('\\n\\n')}`);\n if (historyTail.length > 0) contextSections.push(`RECENT CONTEXT:\\n${historyTail.join('\\n\\n')}`);\n const toolResults = normalized\n .filter(m => m.role === 'tool')\n .map(m => m.text)\n .filter(Boolean);\n if (toolResults.length > 0) {\n contextSections.push(`TOOL RESULTS:\\n${toolResults.join('\\n\\n')}`);\n }\n const context = contextSections.join('\\n\\n');\n const inputChars = normalized.reduce((sum, m) => sum + m.text.length, 0);\n return {\n message: lastUser,\n context,\n inputChars\n };\n}\n\ninterface ChatCompletionResponse {\n status: number;\n data: Record<string, unknown>;\n}\n\nfunction buildToolCallResponse(params: {\n model: string;\n stream: boolean;\n toolName: string;\n message: string;\n}): ChatCompletionResponse {\n const completionId = `chatcmpl-${randomUUID()}`;\n const created = Math.floor(Date.now() / 1000);\n const toolCallId = `call_${randomUUID().replace(/-/g, '').slice(0, 20)}`;\n const toolCall = {\n id: toolCallId,\n type: 'function',\n function: {\n name: params.toolName,\n arguments: JSON.stringify({ task: params.message })\n }\n };\n if (params.stream) {\n return {\n status: 200,\n data: {\n _sse: true,\n model: params.model,\n chunks: [\n {\n id: completionId,\n object: 'chat.completion.chunk',\n created,\n model: params.model,\n choices: [{ index: 0, delta: { role: 'assistant', tool_calls: [toolCall] }, finish_reason: null }]\n },\n {\n id: completionId,\n object: 'chat.completion.chunk',\n created,\n model: params.model,\n choices: [{ index: 0, delta: {}, finish_reason: 'tool_calls' }]\n }\n ]\n }\n };\n }\n return {\n status: 200,\n data: {\n id: completionId,\n object: 'chat.completion',\n created,\n model: params.model,\n choices: [\n {\n index: 0,\n message: {\n role: 'assistant',\n content: '',\n tool_calls: [toolCall]\n },\n finish_reason: 'tool_calls'\n }\n ],\n usage: {\n prompt_tokens: Math.ceil(params.message.length / 4),\n completion_tokens: 1,\n total_tokens: Math.ceil(params.message.length / 4) + 1\n }\n }\n };\n}\n\nfunction selectToolCallName(body: Record<string, unknown>, userMessage: string): string | null {\n const tools = Array.isArray(body?.tools) ? body.tools : [];\n if (tools.length === 0) return null;\n const names = tools\n .map((t: Record<string, unknown>) => String((t?.function as Record<string, unknown>)?.name || '').trim())\n .filter(Boolean);\n if (names.length === 0) return null;\n\n const choice = body?.tool_choice;\n if (choice === 'none') return null;\n if (choice && typeof choice === 'object') {\n const forced = String(choice?.function?.name || '').trim();\n if (forced && names.includes(forced)) return forced;\n }\n if (choice === 'required') return names[0];\n if (choice && choice !== 'auto') return null;\n\n const lower = userMessage.toLowerCase();\n const likelyAction = /\\b(build|implement|write|create|edit|refactor|fix|change|update|run|test|analyze)\\b/.test(lower);\n return likelyAction ? names[0] : null;\n}\n\nasync function forwardJson(\n baseUrl: string,\n path: string,\n method: 'GET' | 'POST',\n body?: unknown\n): Promise<{ status: number; ok: boolean; data: Record<string, unknown> }> {\n const token = readRtToken();\n const headers: Record<string, string> = { 'content-type': 'application/json' };\n if (token) headers.authorization = `Bearer ${token}`;\n const res = await fetch(`${baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined\n });\n const text = await res.text();\n let data: Record<string, unknown> = { raw: text };\n try {\n data = JSON.parse(text) as Record<string, unknown>;\n } catch {\n data = { raw: text };\n }\n return { status: res.status, ok: res.ok, data };\n}\n\nfunction executionPathForDecision(decision?: string): string[] {\n if (decision === 'CHAT') return ['l1-interface', 'l2-orchestrator', 'l2-direct-response'];\n if (decision === 'CODE') return ['l1-interface', 'l2-orchestrator', 'l3-executor-single'];\n if (decision === 'DISPATCH') return ['l1-interface', 'l2-orchestrator', 'l3-executor-parallel'];\n return ['l1-interface', 'l2-orchestrator'];\n}\n\nfunction getChatControl(body: Record<string, unknown>): {\n mode: string;\n model: string;\n engine: string;\n direct: boolean;\n bypass: boolean;\n passthroughRequested: boolean;\n} {\n const options = (body?.options && typeof body.options === 'object')\n ? body.options as Record<string, unknown>\n : {} as Record<string, unknown>;\n const mode = String(body?.mode || options?.mode || '').trim().toLowerCase();\n const model = String(options?.model || body?.model || '').trim();\n const engine = String(options?.engine || body?.engine || '').trim().toLowerCase();\n const direct = Boolean(\n body?.direct === true ||\n options?.direct === true ||\n mode === 'direct'\n );\n const bypass = Boolean(\n body?.bypass === true ||\n options?.bypass === true ||\n mode === 'bypass'\n );\n return {\n mode,\n model,\n engine,\n direct,\n bypass,\n passthroughRequested: direct || bypass\n };\n}\n\nfunction normalizeStandaloneEngine(rawEngine: string): string {\n const e = String(rawEngine || '').trim().toLowerCase();\n if (!e) return '';\n if (e === 'claude' || e === 'claude-code' || e === 'claude-cli') return 'claude-cli';\n if (e === 'codex' || e === 'codex-cli') return 'codex-cli';\n if (e === 'cursor' || e === 'cursor-cli') return 'cursor-cli';\n if (e === 'opencode' || e === 'opencode-cli') return 'opencode-cli';\n if (e === 'gemini' || e === 'gemini-cli') return 'gemini-cli';\n if (e === 'gemini-api') return 'gemini-api';\n if (e === 'claude-api') return 'claude-api';\n return e;\n}\n\nasync function handleStandaloneChat(options: UnifiedServerOptions, body: Record<string, unknown>) {\n const message = String(body?.message || '').trim();\n if (!message) return { status: 400, data: { error: 'message is required' } };\n const context = String(body?.context || '').trim();\n const mergedInput = context ? `${message}\\n\\n${context}` : message;\n const control = getChatControl(body);\n\n if (control.passthroughRequested || control.engine) {\n const engine = normalizeStandaloneEngine(control.engine || '');\n if (!engine) {\n return { status: 400, data: { error: 'engine is required for direct/bypass mode in standalone' } };\n }\n const run = await runEngine(engine, mergedInput, {\n model: control.model || undefined,\n cwd: String(body?.projectDir || options.projectDir || process.cwd()),\n projectDir: String(body?.projectDir || options.projectDir || process.cwd()),\n sessionId: String(body?.sessionId || ''),\n timeoutMs: Number(body?.options?.timeoutMs || body?.timeoutMs || 600000)\n });\n if (!run.success) {\n return {\n status: 502,\n data: {\n error: run.stderr || `engine ${engine} failed`,\n engine,\n exitCode: run.exitCode\n }\n };\n }\n return {\n status: 200,\n data: {\n reply: String(run.stdout || ''),\n traceId: body?.traceId || '',\n executionPath: ['l1-interface', 'engine-passthrough', engine],\n costUsd: 0,\n pendingChanges: options.sandbox.getPendingPaths(options.sandbox.getActiveBranch()).length,\n engine,\n exitCode: run.exitCode\n }\n };\n }\n\n // crew-cli is a code execution engine \u2014 always use the full pipeline\n // The pipeline handles CHAT vs CODE routing internally\n const sessionId = String(body?.sessionId || 'api');\n const result = await options.orchestrator.executePipeline(\n mergedInput, '', sessionId\n );\n const responseText = String(result?.response || result?.result || '');\n const edits = await options.orchestrator.parseAndApplyToSandbox(responseText);\n return {\n status: 200,\n data: {\n reply: responseText,\n traceId: result?.traceId || body?.traceId || '',\n executionPath: result?.executionPath || ['pipeline'],\n costUsd: Number(result?.totalCost || 0),\n pendingChanges: edits.length\n }\n };\n}\n\nasync function handleConnectedChat(options: UnifiedServerOptions, body: Record<string, unknown>) {\n const message = String(body?.message || '').trim();\n if (!message) return { status: 400, data: { error: 'message is required' } };\n const context = String(body?.context || '').trim();\n const mergedInput = context ? `${message}\\n\\n${context}` : message;\n const control = getChatControl(body);\n const gateway = body?.gateway || options.gateway || 'http://127.0.0.1:5010';\n\n if (control.passthroughRequested || control.engine) {\n try {\n const agent = String(body?.agent || 'crew-main');\n const dispatched = await options.router.dispatch(agent, mergedInput, {\n gateway,\n sessionId: body?.sessionId || 'api',\n model: control.model || undefined,\n engine: control.engine || undefined,\n direct: control.direct,\n bypass: control.bypass,\n skipPreamble: true,\n injectGitContext: false,\n project: String(body?.projectDir || options.projectDir || process.cwd())\n });\n const reply = String(dispatched?.result || '');\n return {\n status: 200,\n data: {\n reply,\n traceId: String(body?.traceId || ''),\n executionPath: ['l1-interface', 'gateway-dispatch', control.engine || 'direct'],\n costUsd: 0,\n pendingChanges: options.sandbox.getPendingPaths(options.sandbox.getActiveBranch()).length\n }\n };\n } catch (err) {\n return {\n status: 502,\n data: {\n error: String((err as Error)?.message || err)\n }\n };\n }\n }\n\n const forwarded = await forwardJson(gateway, '/chat', 'POST', {\n message: mergedInput,\n sessionId: body?.sessionId || 'api'\n });\n const reply =\n forwarded.data?.reply ??\n forwarded.data?.result ??\n forwarded.data?.message ??\n forwarded.data?.raw ??\n '';\n return {\n status: forwarded.ok ? 200 : forwarded.status,\n data: {\n reply: String(reply || ''),\n traceId: String(body?.traceId || ''),\n executionPath: ['l1-interface', 'l2-orchestrator', 'l3-workers'],\n costUsd: 0,\n pendingChanges: options.sandbox.getPendingPaths(options.sandbox.getActiveBranch()).length\n }\n };\n}\n\nasync function handleOpenAIChatCompletions(options: UnifiedServerOptions, body: Record<string, unknown>) {\n const model = String(body?.model || 'crewswarm');\n const stream = Boolean(body?.stream);\n const composed = composeChatPayloadFromOpenAI(body?.messages);\n if (!composed.message) {\n return {\n status: 400,\n data: { error: { message: 'No user message found', type: 'invalid_request_error' } }\n };\n }\n\n const selectedTool = selectToolCallName(body, composed.message);\n if (selectedTool) {\n return buildToolCallResponse({\n model,\n stream,\n toolName: selectedTool,\n message: composed.message\n });\n }\n\n const chatBody = {\n message: model === 'crewswarm'\n ? composed.message\n : `${composed.message}\\n\\nPREFERRED_AGENT: ${model}`,\n context: composed.context,\n options: {\n model: typeof body?.metadata?.modelOverride === 'string' ? body.metadata.modelOverride : undefined\n }\n };\n\n const out = options.mode === 'connected'\n ? await handleConnectedChat(options, chatBody)\n : await handleStandaloneChat(options, chatBody);\n const reply = String(out?.data?.reply || '');\n\n const completionId = `chatcmpl-${randomUUID()}`;\n const created = Math.floor(Date.now() / 1000);\n const promptTokens = Math.ceil(composed.inputChars / 4);\n const completionTokens = Math.ceil(reply.length / 4);\n\n if (stream) {\n return {\n status: 200,\n data: {\n _sse: true,\n model,\n chunks: [\n {\n id: completionId,\n object: 'chat.completion.chunk',\n created,\n model,\n choices: [{ index: 0, delta: { role: 'assistant', content: reply }, finish_reason: null }]\n },\n {\n id: completionId,\n object: 'chat.completion.chunk',\n created,\n model,\n choices: [{ index: 0, delta: {}, finish_reason: 'stop' }]\n }\n ]\n }\n };\n }\n\n return {\n status: out.status,\n data: {\n id: completionId,\n object: 'chat.completion',\n created,\n model,\n choices: [{ index: 0, message: { role: 'assistant', content: reply }, finish_reason: 'stop' }],\n usage: {\n prompt_tokens: promptTokens,\n completion_tokens: completionTokens,\n total_tokens: promptTokens + completionTokens\n }\n }\n };\n}\n\nasync function enqueueStandaloneTask(options: UnifiedServerOptions, body: Record<string, unknown>) {\n const taskText = String(body?.task || '').trim();\n if (!taskText) return { status: 400, data: { error: 'task is required' } };\n const taskId = randomUUID();\n taskStore.set(taskId, { id: taskId, status: 'queued', createdAt: Date.now() });\n queueMicrotask(async () => {\n const rec = taskStore.get(taskId);\n if (!rec) return;\n rec.status = 'running';\n try {\n const result = await options.orchestrator.executeLocally(taskText, {\n model: body?.options?.model\n });\n rec.status = 'done';\n rec.result = result?.result || '';\n rec.costUsd = Number(result?.costUsd || 0);\n taskStore.set(taskId, rec);\n } catch (err) {\n rec.status = 'error';\n rec.error = String((err as Error)?.message || err);\n taskStore.set(taskId, rec);\n }\n });\n return { status: 202, data: { accepted: true, taskId } };\n}\n\nasync function enqueueConnectedTask(options: UnifiedServerOptions, body: Record<string, unknown>) {\n const gateway = body?.gateway || options.gateway || 'http://127.0.0.1:5010';\n const payload = {\n agent: body?.agent,\n task: body?.task,\n sessionId: body?.sessionId || 'api',\n ...(body?.options || {})\n };\n const forwarded = await forwardJson(gateway, '/api/dispatch', 'POST', payload);\n const taskId = forwarded.data?.taskId || '';\n return {\n status: forwarded.ok ? 202 : forwarded.status,\n data: {\n accepted: forwarded.ok,\n taskId\n }\n };\n}\n\nexport async function startUnifiedServer(options: UnifiedServerOptions): Promise<{\n close: () => Promise<void>;\n address: string;\n}> {\n const passthroughSessions = new EngineSessionLayer(options.projectDir || process.cwd());\n const server = createServer(async (req, res) => {\n try {\n if (req.method === 'OPTIONS') {\n return json(res, 204, {});\n }\n\n const path = getPath(req);\n\n if (req.method === 'POST' && path === '/v1/chat') {\n if (!checkAuth(req, res)) return;\n const body = await readJson(req);\n const out = options.mode === 'connected'\n ? await handleConnectedChat(options, body)\n : await handleStandaloneChat(options, body);\n return json(res, out.status, out.data);\n }\n\n // Dashboard compatibility: direct engine passthrough stream API.\n if (req.method === 'POST' && path === '/api/engine-passthrough') {\n if (!checkAuth(req, res)) return;\n const body = await readJson(req);\n const message = String(body?.message || '').trim();\n const requestedEngine = String(body?.engine || '').trim().toLowerCase();\n if (!message) return json(res, 400, { error: 'message is required' });\n if (!requestedEngine) return json(res, 400, { error: 'engine is required' });\n\n res.writeHead(200, {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n 'connection': 'keep-alive',\n 'access-control-allow-origin': '*',\n 'access-control-allow-headers': 'content-type, authorization',\n 'access-control-allow-methods': 'GET,POST,OPTIONS'\n });\n\n if (options.mode === 'connected') {\n const gateway = body?.gateway || options.gateway || 'http://127.0.0.1:5010';\n const token = readRtToken();\n const headers: Record<string, string> = { 'content-type': 'application/json' };\n if (token) headers.authorization = `Bearer ${token}`;\n const upstream = await fetch(`${gateway}/api/engine-passthrough`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n engine: requestedEngine,\n message,\n model: body?.model,\n sessionId: body?.sessionId,\n projectDir: body?.projectDir\n })\n });\n if (!upstream.ok || !upstream.body) {\n const text = await upstream.text().catch(() => '');\n res.write(`data: ${JSON.stringify({ type: 'chunk', text: `Error ${upstream.status}: ${text || 'upstream failure'}` })}\\n\\n`);\n res.write(`data: ${JSON.stringify({ type: 'done', exitCode: 1 })}\\n\\n`);\n res.end();\n return;\n }\n const reader = upstream.body.getReader();\n const decoder = new TextDecoder();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(decoder.decode(value, { stream: true }));\n }\n res.end();\n return;\n }\n\n const engine = normalizeStandaloneEngine(requestedEngine);\n const sessionId = String(body?.sessionId || '');\n const run = await runEngine(engine, message, {\n model: String(body?.model || '').trim() || undefined,\n cwd: String(body?.projectDir || options.projectDir || process.cwd()),\n projectDir: String(body?.projectDir || options.projectDir || process.cwd()),\n sessionId,\n timeoutMs: Number(body?.timeoutMs || 300000),\n onEvent: (event) => {\n if (!event) return;\n if (event.type === 'chunk' && typeof event.text === 'string') {\n res.write(`data: ${JSON.stringify({ type: 'chunk', text: event.text })}\\n\\n`);\n return;\n }\n res.write(`data: ${JSON.stringify({\n type: 'event',\n event: event.type,\n runId: event.runId || '',\n mode: event.mode || '',\n exitCode: event.exitCode,\n success: event.success,\n toolCount: event.toolCount\n })}\\n\\n`);\n }\n });\n const chunkText = run.success ? (run.stdout || '') : (run.stderr || `engine ${engine} failed`);\n if (chunkText.trim().length > 0) {\n res.write(`data: ${JSON.stringify({ type: 'chunk', text: chunkText })}\\n\\n`);\n }\n res.write(`data: ${JSON.stringify({ type: 'done', exitCode: run.exitCode })}\\n\\n`);\n res.end();\n return;\n }\n\n // Dashboard compatibility: passthrough session presence checks.\n if (req.method === 'GET' && path === '/api/passthrough-sessions') {\n const sessions = await passthroughSessions.listSummaries();\n const nativeSessions = await listNativeEngineSessions(String(options.projectDir || process.cwd()));\n return json(res, 200, { sessions, nativeSessions });\n }\n\n if (req.method === 'GET' && path === '/api/tool-audit') {\n if (!checkAuth(req, res)) return;\n const query = getQuery(req);\n const limit = Number(query.get('limit') || 30);\n const rows = await getToolAuditRuns(String(options.projectDir || process.cwd()), limit);\n return json(res, 200, { runs: rows });\n }\n\n if (req.method === 'POST' && path === '/api/tool-audit/replay') {\n if (!checkAuth(req, res)) return;\n const body = await readJson(req);\n const runId = String(body?.runId || '').trim();\n if (!runId) return json(res, 400, { error: 'runId is required' });\n const dryRun = body?.execute !== true;\n const plan = await getToolAuditReplayPlan(String(options.projectDir || process.cwd()), runId);\n if (!plan) return json(res, 404, { error: `run ${runId} not found` });\n if (dryRun) {\n return json(res, 200, { ok: true, dryRun: true, plan });\n }\n\n const adapter = new GeminiToolAdapter(options.sandbox as any);\n const applied: Array<{ name: string; success: boolean; error?: string }> = [];\n await options.sandbox.load();\n for (const call of plan.supportedMutations || []) {\n const toolName = String(call?.name || '').toLowerCase();\n const args = (call?.args && typeof call.args === 'object') ? call.args : {};\n const result = await adapter.executeTool(toolName, args);\n applied.push({\n name: toolName,\n success: Boolean(result?.success),\n error: result?.error\n });\n }\n await options.sandbox.save();\n return json(res, 200, {\n ok: true,\n dryRun: false,\n runId,\n replayed: applied.length,\n applied\n });\n }\n\n // \u2500\u2500 crew-cli RAG API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // GET /api/rag/search?q=auth&projectDir=/path&mode=import-graph\n if (req.method === 'GET' && path === '/api/rag/search') {\n if (!checkAuth(req, res)) return;\n \n try {\n const { autoLoadRelevantFiles, shouldUseRag } = await import('../context/codebase-rag.js');\n const query = getQuery(req);\n const q = query.get('q') || '';\n const projectDir = query.get('projectDir') || options.projectDir;\n const mode = (query.get('mode') as any) || 'import-graph';\n const tokenBudget = Number(query.get('tokenBudget') || 8000);\n const maxFiles = Number(query.get('maxFiles') || 10);\n \n if (!q) {\n return json(res, 400, { error: 'Missing query parameter: q' });\n }\n \n const startTime = Date.now();\n const result = await autoLoadRelevantFiles(q, projectDir, {\n mode,\n tokenBudget,\n maxFiles,\n sessionHistory: []\n });\n \n return json(res, 200, {\n query: q,\n projectDir,\n mode: result.mode,\n filesLoaded: result.filesLoaded,\n tokenEstimate: result.tokenEstimate,\n context: result.context,\n elapsedMs: Date.now() - startTime,\n shouldUseRag: shouldUseRag(q)\n });\n } catch (error: any) {\n options.logger?.error?.('[rag] search error:', error);\n return json(res, 500, { error: error.message });\n }\n }\n \n // POST /api/rag/index - Force re-index\n if (req.method === 'POST' && path === '/api/rag/index') {\n if (!checkAuth(req, res)) return;\n \n try {\n const { autoLoadRelevantFiles } = await import('../context/codebase-rag.js');\n const body = await readJson(req);\n const projectDir = String(body?.projectDir || options.projectDir);\n \n const result = await autoLoadRelevantFiles('index build', projectDir, {\n mode: 'semantic',\n tokenBudget: 1000,\n maxFiles: 5\n });\n \n return json(res, 200, {\n ok: true,\n projectDir,\n message: 'Index built (semantic embeddings)',\n filesIndexed: result.filesLoaded.length\n });\n } catch (error: any) {\n options.logger?.error?.('[rag] index error:', error);\n return json(res, 500, { error: error.message });\n }\n }\n \n // GET /api/rag/stats?projectDir=/path\n if (req.method === 'GET' && path === '/api/rag/stats') {\n if (!checkAuth(req, res)) return;\n \n try {\n const { existsSync } = await import('node:fs');\n const query = getQuery(req);\n const projectDir = query.get('projectDir') || options.projectDir;\n const cacheDir = process.env.CREW_RAG_CACHE_DIR || `${projectDir}/.crew/rag-cache`;\n \n return json(res, 200, {\n projectDir,\n cacheDir,\n exists: existsSync(cacheDir),\n modes: {\n keyword: 'always available (no cache)',\n importGraph: 'always available (no cache)',\n semantic: existsSync(`${cacheDir}/embeddings.json`) ? 'cached' : 'not cached'\n }\n });\n } catch (error: any) {\n options.logger?.error?.('[rag] stats error:', error);\n return json(res, 500, { error: error.message });\n }\n }\n\n // Health check\n if (req.method === 'GET' && path === '/health') {\n return json(res, 200, { ok: true, mode: options.mode });\n }\n if (req.method === 'DELETE' && path === '/api/passthrough-sessions') {\n await closeNativeEngineSessions(String(options.projectDir || process.cwd()));\n await passthroughSessions.clear();\n return json(res, 200, { ok: true });\n }\n\n if (req.method === 'GET' && path === '/v1/models') {\n const agents = options.router.getDefaultAgents().map((a: Record<string, unknown>) => ({\n id: a.name,\n object: 'model',\n created: 1700000000,\n owned_by: 'crewswarm'\n }));\n return json(res, 200, {\n object: 'list',\n data: [\n { id: 'crewswarm', object: 'model', created: 1700000000, owned_by: 'crewswarm' },\n ...agents\n ]\n });\n }\n\n if (req.method === 'POST' && path === '/v1/chat/completions') {\n if (!checkAuth(req, res)) return;\n const body = await readJson(req);\n const out = await handleOpenAIChatCompletions(options, body);\n if ((out.data as any)?._sse) {\n const streamPayload = out.data as any;\n res.writeHead(200, {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n 'connection': 'keep-alive',\n 'access-control-allow-origin': '*',\n 'access-control-allow-headers': 'content-type, authorization',\n 'access-control-allow-methods': 'GET,POST,OPTIONS'\n });\n for (const chunk of streamPayload.chunks || []) {\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n res.write('data: [DONE]\\n\\n');\n res.end();\n return;\n }\n return json(res, out.status, out.data);\n }\n\n if (req.method === 'POST' && path === '/v1/tasks') {\n if (!checkAuth(req, res)) return;\n const body = await readJson(req);\n const out = options.mode === 'connected'\n ? await enqueueConnectedTask(options, body)\n : await enqueueStandaloneTask(options, body);\n return json(res, out.status, out.data);\n }\n\n if (req.method === 'GET' && path.startsWith('/v1/tasks/')) {\n const taskId = path.slice('/v1/tasks/'.length);\n if (options.mode === 'connected') {\n const gateway = options.gateway || 'http://127.0.0.1:5010';\n const forwarded = await forwardJson(gateway, `/api/status/${encodeURIComponent(taskId)}`, 'GET');\n const status = String(forwarded.data?.status || '').toLowerCase();\n const mapped =\n status === 'done' ? 'done' :\n status === 'error' ? 'error' :\n status === 'running' ? 'running' :\n 'queued';\n return json(res, forwarded.ok ? 200 : forwarded.status, {\n status: mapped,\n result: forwarded.data?.result ?? forwarded.data,\n traceId: '',\n costUsd: 0,\n error: forwarded.data?.error\n });\n }\n const rec = taskStore.get(taskId);\n if (!rec) return json(res, 404, { error: 'task not found' });\n return json(res, 200, {\n status: rec.status,\n result: rec.result,\n traceId: rec.traceId || '',\n costUsd: rec.costUsd || 0,\n error: rec.error\n });\n }\n\n if (req.method === 'GET' && path === '/v1/agents') {\n if (options.mode === 'connected') {\n const gateway = options.gateway || 'http://127.0.0.1:5010';\n const forwarded = await forwardJson(gateway, '/api/agents', 'GET');\n const agents = Array.isArray(forwarded.data) ? forwarded.data : (forwarded.data?.agents || []);\n return json(res, forwarded.ok ? 200 : forwarded.status, { agents });\n }\n const agents = options.router.getDefaultAgents().map((a: Record<string, unknown>) => ({\n id: a.name,\n role: a.role,\n status: a.status\n }));\n return json(res, 200, { agents });\n }\n\n if (req.method === 'GET' && path === '/v1/status') {\n let gatewayStatus = 'local';\n let queueDepth = 0;\n const pipelineMetrics = await loadPipelineMetricsSummary(options.projectDir);\n if (options.mode === 'connected') {\n try {\n const status = await options.router.getStatus();\n gatewayStatus = status?.gateway || 'unknown';\n queueDepth = Number(status?.queueDepth || 0);\n } catch {\n gatewayStatus = 'error';\n }\n } else {\n queueDepth = Array.from(taskStore.values()).filter(t => t.status === 'queued' || t.status === 'running').length;\n }\n\n return json(res, 200, {\n mode: options.mode,\n gateway: gatewayStatus,\n l2: {\n unifiedRouter: process.env.CREW_USE_UNIFIED_ROUTER === 'true',\n dualL2: process.env.CREW_DUAL_L2_ENABLED === 'true'\n },\n queueDepth,\n pipeline: {\n runs: pipelineMetrics.runs,\n qaApproved: pipelineMetrics.qaApproved,\n qaRejected: pipelineMetrics.qaRejected,\n qaRoundsAvg: pipelineMetrics.runs > 0\n ? Number((pipelineMetrics.qaRoundsTotal / pipelineMetrics.runs).toFixed(2))\n : 0,\n contextChunksUsed: pipelineMetrics.contextChunksUsed,\n contextCharsSavedEst: pipelineMetrics.contextCharsSaved\n }\n });\n }\n\n if (req.method === 'GET' && path === '/v1/sandbox') {\n const branch = options.sandbox.getActiveBranch();\n const changedFiles = options.sandbox.getPendingPaths(branch).length;\n return json(res, 200, {\n branch,\n changedFiles,\n diffPreview: options.sandbox.preview(branch)\n });\n }\n\n if (req.method === 'POST' && path === '/v1/sandbox/apply') {\n if (!checkAuth(req, res)) return;\n const body = await readJson(req);\n const branch = body?.branch || options.sandbox.getActiveBranch();\n const files = options.sandbox.getPendingPaths(branch);\n await options.sandbox.apply(branch);\n return json(res, 200, {\n success: true,\n appliedFiles: files\n });\n }\n\n if (req.method === 'POST' && path === '/v1/sandbox/rollback') {\n if (!checkAuth(req, res)) return;\n const body = await readJson(req);\n const branch = body?.branch || options.sandbox.getActiveBranch();\n await options.sandbox.rollback(branch);\n return json(res, 200, { success: true });\n }\n\n if (req.method === 'GET' && path.startsWith('/v1/traces/')) {\n const traceId = path.slice('/v1/traces/'.length);\n const trace = options.orchestrator.getTrace(traceId);\n return json(res, 200, {\n composedPrompts: trace?.composedPrompts || [],\n plannerTrace: trace?.plannerTrace || [],\n events: []\n });\n }\n\n if (req.method === 'POST' && path === '/v1/index/rebuild') {\n if (!checkAuth(req, res)) return;\n const body = await readJson(req);\n const paths = Array.isArray(body?.paths) && body.paths.length > 0\n ? body.paths\n : [join(options.projectDir, 'docs'), options.projectDir];\n latestIndex = await buildCollectionIndex(paths, {\n includeCode: Boolean(body?.includeCode)\n });\n latestIndexId = `idx-${randomUUID()}`;\n latestIndexStats = {\n files: Number(latestIndex?.docs?.length || 0),\n chunks: Number(latestIndex?.chunks?.length || 0)\n };\n return json(res, 200, {\n indexId: latestIndexId,\n stats: latestIndexStats\n });\n }\n\n if (req.method === 'GET' && path === '/v1/index/search') {\n const q = String(getQuery(req).get('q') || '').trim();\n if (!q) return json(res, 400, { error: 'q is required' });\n if (!latestIndex) {\n const fallback = await buildCollectionIndex([join(options.projectDir, 'docs'), options.projectDir], {\n includeCode: false\n });\n latestIndex = fallback;\n latestIndexId = `idx-${randomUUID()}`;\n latestIndexStats = {\n files: Number(latestIndex?.docs?.length || 0),\n chunks: Number(latestIndex?.chunks?.length || 0)\n };\n }\n const result = searchCollection(latestIndex, q, 8);\n const hits = (result?.hits || []).map((h: Record<string, unknown>) => ({\n path: h.source,\n score: Number(h.score || 0),\n snippet: h.text\n }));\n return json(res, 200, { hits });\n }\n\n // MCP endpoint\n if (req.method === 'POST' && path === '/mcp') {\n if (!checkAuth(req, res)) return;\n const body = await readJson(req);\n const mcpResponse = await handleMcpRequest(options, body);\n if (mcpResponse && !(mcpResponse as any)._skip) {\n return json(res, 200, mcpResponse);\n } else {\n // Notifications should not advertise a JSON body. Some MCP clients\n // attempt to decode an empty 200/application-json response and log\n // a transport error during initialized.\n res.writeHead(204);\n res.end();\n return;\n }\n }\n\n // MCP health check \n if (req.method === 'GET' && path === '/mcp/health') {\n return json(res, 200, {\n ok: true,\n server: 'crew-cli-mcp',\n mode: options.mode,\n version: '1.0.0',\n tools: 8\n });\n }\n\n return json(res, 404, { error: 'not found' });\n } catch (err) {\n options.logger?.error?.('[serve] request failed', err);\n return json(res, 500, { error: String((err as Error)?.message || err) });\n }\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(options.port, options.host, () => resolve());\n });\n const bound = server.address();\n const actualPort = typeof bound === 'object' && bound ? bound.port : options.port;\n const address = `http://${options.host}:${actualPort}`;\n options.logger?.info?.(`[serve] unified API listening on ${address} (${options.mode})`);\n return {\n address,\n close: async () => {\n await new Promise<void>((resolve, reject) => server.close(err => err ? reject(err) : resolve()));\n }\n };\n}\n", "import { IncomingMessage, ServerResponse } from 'http';\nimport { UnifiedServerOptions } from './server.js';\n\ninterface McpRequest {\n jsonrpc: string;\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\ninterface McpResponse {\n jsonrpc: string;\n id: string | number;\n result?: Record<string, unknown>;\n error?: {\n code: number;\n message: string;\n };\n}\n\nexport async function handleMcpRequest(\n options: UnifiedServerOptions,\n body: McpRequest\n): Promise<McpResponse> {\n const { method, params, id } = body;\n\n try {\n switch (method) {\n case 'initialize':\n return {\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: '2024-11-05',\n capabilities: { tools: {} },\n serverInfo: {\n name: 'crew-cli',\n version: '1.0.0',\n description: 'crew-cli unified orchestration and sandbox tools'\n }\n }\n };\n\n case 'notifications/initialized':\n case 'initialized':\n // Notification - no response needed\n return { _skip: true } as any;\n\n case 'tools/list':\n return {\n jsonrpc: '2.0',\n id,\n result: {\n tools: [\n {\n name: 'crew_route_task',\n description: 'Route a task through the unified orchestrator (L1\u2192L2\u2192L3)',\n inputSchema: {\n type: 'object',\n properties: {\n task: { type: 'string', description: 'Task to execute' },\n context: { type: 'string', description: 'Optional context' }\n },\n required: ['task']\n }\n },\n {\n name: 'crew_execute_code',\n description: 'Execute code generation task with sandbox isolation',\n inputSchema: {\n type: 'object',\n properties: {\n task: { type: 'string', description: 'Code generation task' },\n model: { type: 'string', description: 'Optional model override' }\n },\n required: ['task']\n }\n },\n {\n name: 'crew_sandbox_status',\n description: 'Get current sandbox state (pending changes, branch info)',\n inputSchema: {\n type: 'object',\n properties: {},\n required: []\n }\n },\n {\n name: 'crew_sandbox_preview',\n description: 'Preview pending changes in sandbox',\n inputSchema: {\n type: 'object',\n properties: {},\n required: []\n }\n },\n {\n name: 'crew_sandbox_apply',\n description: 'Apply pending sandbox changes to working directory',\n inputSchema: {\n type: 'object',\n properties: {\n check: { type: 'string', description: 'Optional validation command (e.g. npm test)' }\n },\n required: []\n }\n },\n {\n name: 'crew_sandbox_rollback',\n description: 'Rollback sandbox to previous state',\n inputSchema: {\n type: 'object',\n properties: {},\n required: []\n }\n },\n {\n name: 'crew_search_code',\n description: 'Search codebase with semantic/text search',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'number', description: 'Max results' }\n },\n required: ['query']\n }\n },\n {\n name: 'crew_list_models',\n description: 'List available models and agents',\n inputSchema: {\n type: 'object',\n properties: {},\n required: []\n }\n }\n ]\n }\n };\n\n case 'tools/call':\n return await handleToolCall(options, params, id);\n\n default:\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: -32601,\n message: `Method not found: ${method}`\n }\n };\n }\n } catch (err) {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: -32603,\n message: String((err as Error)?.message || err)\n }\n };\n }\n}\n\nasync function handleToolCall(\n options: UnifiedServerOptions,\n params: Record<string, unknown>,\n id: string | number\n): Promise<McpResponse> {\n const { name, arguments: args } = params as { name: string; arguments?: Record<string, unknown> };\n\n try {\n let result: Record<string, unknown>;\n\n switch (name) {\n case 'crew_route_task': {\n const message = String(args?.task || '').trim();\n const context = String(args?.context || '').trim();\n const mergedInput = context ? `${message}\\n\\n${context}` : message;\n \n const route = await options.orchestrator.route(mergedInput);\n const decision = String(route?.decision || '');\n \n if (decision === 'CHAT' && route.response) {\n result = {\n decision: 'CHAT',\n response: route.response,\n executionPath: ['l1-interface', 'l2-orchestrator', 'l2-direct-response']\n };\n } else {\n const local = await options.orchestrator.executeLocally(route.task || mergedInput, {\n model: args?.model\n });\n await options.orchestrator.parseAndApplyToSandbox(String(local?.result || ''));\n \n result = {\n decision: decision || 'CODE',\n response: local?.result,\n executionPath: ['l1-interface', 'l2-orchestrator', 'l3-executor'],\n pendingChanges: options.sandbox.getPendingPaths(options.sandbox.getActiveBranch()).length\n };\n }\n break;\n }\n\n case 'crew_execute_code': {\n const task = String(args?.task || '').trim();\n const local = await options.orchestrator.executeLocally(task, {\n model: args?.model\n });\n const edits = await options.orchestrator.parseAndApplyToSandbox(String(local?.result || ''));\n \n result = {\n response: local?.result,\n edits: edits.length,\n pendingChanges: options.sandbox.getPendingPaths(options.sandbox.getActiveBranch()).length\n };\n break;\n }\n\n case 'crew_sandbox_status': {\n const branch = options.sandbox.getActiveBranch();\n const pending = options.sandbox.getPendingPaths(branch);\n \n result = {\n branch,\n pendingFiles: pending.length,\n files: pending\n };\n break;\n }\n\n case 'crew_sandbox_preview': {\n const branch = options.sandbox.getActiveBranch();\n const pending = options.sandbox.getPendingPaths(branch);\n const diffs = pending.map(p => {\n const content = options.sandbox.readPendingFile(branch, p);\n return { path: p, content };\n });\n \n result = {\n branch,\n changes: diffs\n };\n break;\n }\n\n case 'crew_sandbox_apply': {\n const branch = options.sandbox.getActiveBranch();\n await options.sandbox.applyToWorkingDirectory(branch);\n \n result = {\n success: true,\n message: 'Changes applied to working directory'\n };\n break;\n }\n\n case 'crew_sandbox_rollback': {\n const branch = options.sandbox.getActiveBranch();\n options.sandbox.discardBranch(branch);\n const newBranch = options.sandbox.createBranch();\n \n result = {\n success: true,\n message: `Rolled back ${branch}, created ${newBranch}`\n };\n break;\n }\n\n case 'crew_search_code': {\n const query = String(args?.query || '').trim();\n const limit = parseInt(String(args?.limit || '10'), 10);\n\n if (!query) {\n result = { query, results: [], message: 'Empty query' };\n break;\n }\n\n try {\n const { buildCollectionIndex, searchCollection } = await import('../collections/index.js');\n const idx = await buildCollectionIndex(options.projectDir, { includeCode: true });\n const hits = searchCollection(idx, query, limit);\n result = {\n query,\n results: hits.results.map(r => ({\n file: r.source,\n line: r.startLine,\n text: r.text.slice(0, 500),\n score: r.score\n })),\n total: hits.total\n };\n } catch (err) {\n result = { query, results: [], message: `Search error: ${(err as Error).message}` };\n }\n break;\n }\n\n case 'crew_list_models': {\n const agents = options.router.getDefaultAgents().map((a: Record<string, unknown>) => ({\n id: a.id,\n name: a.name,\n role: a.role\n }));\n \n result = {\n mode: options.mode,\n agents\n };\n break;\n }\n\n default:\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: -32601,\n message: `Tool not found: ${name}`\n }\n };\n }\n\n return {\n jsonrpc: '2.0',\n id,\n result: {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n }\n };\n } catch (err) {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: -32603,\n message: String((err as Error)?.message || err)\n }\n };\n }\n}\n", "import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nexport interface PipelineMetricsSummary {\n runs: number;\n qaApproved: number;\n qaRejected: number;\n qaRoundsTotal: number;\n contextChunksUsed: number;\n contextCharsSaved: number;\n}\n\nexport async function loadPipelineMetricsSummary(baseDir: string): Promise<PipelineMetricsSummary> {\n const path = join(baseDir, '.crew', 'pipeline-metrics.jsonl');\n try {\n const raw = await readFile(path, 'utf8');\n const lines = raw.split('\\n').map(l => l.trim()).filter(Boolean);\n let runs = 0;\n let qaApproved = 0;\n let qaRejected = 0;\n let qaRoundsTotal = 0;\n let contextChunksUsed = 0;\n let contextCharsSaved = 0;\n for (const line of lines) {\n try {\n const rec = JSON.parse(line);\n runs += 1;\n if (rec.qaApproved === true) qaApproved += 1;\n if (rec.qaApproved === false) qaRejected += 1;\n qaRoundsTotal += Number(rec.qaRounds || 0);\n contextChunksUsed += Number(rec.contextChunksUsed || 0);\n contextCharsSaved += Number(rec.contextCharsSaved || 0);\n } catch {\n // Ignore malformed rows.\n }\n }\n return { runs, qaApproved, qaRejected, qaRoundsTotal, contextChunksUsed, contextCharsSaved };\n } catch {\n return { runs: 0, qaApproved: 0, qaRejected: 0, qaRoundsTotal: 0, contextChunksUsed: 0, contextCharsSaved: 0 };\n }\n}\n", "import { spawn } from 'node:child_process';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nexport interface SrcCommandResult {\n success: boolean;\n code: number;\n stdout: string;\n stderr: string;\n}\n\nexport function runSrcCli(args: string[], cwd = process.cwd()): Promise<SrcCommandResult> {\n return new Promise(resolve => {\n const child = spawn('src', args, {\n cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: process.env\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout.on('data', chunk => { stdout += String(chunk); });\n child.stderr.on('data', chunk => { stderr += String(chunk); });\n\n child.on('error', error => {\n resolve({\n success: false,\n code: 1,\n stdout,\n stderr: `${stderr}${error.message}`\n });\n });\n\n child.on('close', code => {\n resolve({\n success: code === 0,\n code: code ?? 1,\n stdout,\n stderr\n });\n });\n });\n}\n\nexport interface SrcBatchPlanOptions {\n query: string;\n repos: string[];\n execute?: boolean;\n specPath?: string;\n}\n\nexport async function createSrcBatchPlan(options: SrcBatchPlanOptions, cwd = process.cwd()): Promise<{\n success: boolean;\n specPath: string;\n message: string;\n}> {\n if (!options.query) {\n return { success: false, specPath: '', message: 'Missing --query for batch-plan' };\n }\n\n const repos = options.repos.length ? options.repos : ['repo:^github\\\\.com/.+'];\n const specPath = options.specPath || '.crew/src-batch.spec.yaml';\n const full = join(cwd, specPath);\n await mkdir(join(full, '..'), { recursive: true });\n\n const yaml = [\n 'name: crew-src-batch-plan',\n 'description: Generated by crew src batch-plan',\n `on: ${repos[0]}`,\n 'steps:',\n ` - run: |`,\n ` # Replace with desired codemod command`,\n ` src search '${options.query.replace(/'/g, \"\\\\'\")}'`,\n '',\n 'changesetTemplate:',\n ' title: \"chore: planned codemod\"',\n ' body: |',\n ' Generated by `crew src batch-plan` in dry-run mode.'\n ].join('\\n');\n\n await writeFile(full, `${yaml}\\n`, 'utf8');\n\n if (!options.execute) {\n return {\n success: true,\n specPath: full,\n message: `Batch plan created at ${full}. Dry-run only. Execute with: src batch preview -f ${full}`\n };\n }\n\n const preview = await runSrcCli(['batch', 'preview', '-f', full], cwd);\n if (!preview.success) {\n return { success: false, specPath: full, message: preview.stderr || 'src batch preview failed' };\n }\n return { success: true, specPath: full, message: 'src batch preview succeeded' };\n}\n", "// @ts-nocheck\nimport { createInterface, emitKeypressEvents } from 'node:readline';\nimport { randomUUID } from 'node:crypto';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { appendFile, mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport chalk from 'chalk';\n// Lazy-load inquirer to avoid ESM/CJS interop deadlock on Node 24\n// (inquirer@9 is ESM but its nested ora@5 dep is CJS)\nlet _inquirer: typeof import('inquirer').default | null = null;\nasync function getInquirer() {\n if (!_inquirer) {\n const mod = await import('inquirer');\n _inquirer = mod.default;\n }\n return _inquirer;\n}\nimport type { RepoConfig } from '../config/repo-config.js';\nimport { AgentRouter } from '../agent/router.js';\nimport { SessionManager } from '../session/manager.js';\nimport { Orchestrator } from '../orchestrator/index.js';\nimport { Sandbox } from '../sandbox/index.js';\nimport { Logger } from '../utils/logger.js';\nimport { getProjectContext } from '../context/git.js';\nimport { collectMultiRepoContext } from '../multirepo/index.js';\nimport { AgentKeeper } from '../memory/agentkeeper.js';\nimport { MemoryBroker } from '../memory/broker.js';\nimport { CheckpointStore } from '../checkpoint/store.js';\nimport { loadPipelineMetricsSummary } from '../metrics/pipeline.js';\nimport { estimateCost } from '../cost/predictor.js';\nimport { getExecutionPolicy, isRiskBlocked, withRetries } from '../runtime/execution-policy.js';\nimport { analyzeBlastRadius } from '../blast-radius/index.js';\nimport { scorePatchRisk } from '../risk/score.js';\n\nconst BANNER = `\n \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n \u2551 \u2551\n \u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557 \u2551\n \u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 \u2551\n \u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2551\n \u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2551\n \u2551 \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2554\u2588\u2588\u2588\u2554\u255D \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2551\n \u2551 \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u255D\u255A\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u2551\n \u2551 \u2551\n \u2551 \uD83C\uDFAA One idea. One Build. One Crew. \u2551\n \u2551 \u2551\n \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n`;\n\nconst AVAILABLE_MODELS = [\n 'gpt-5.4', 'gpt-5.3-codex', 'gemini-3.1-pro', 'gemini-2.5-flash',\n 'claude-sonnet-4.6', 'grok-4.20-beta', 'grok-4.1-fast',\n 'deepseek-v3.2', 'qwen3.5-397b', 'kimi-k2.5', 'llama-3.3-70b'\n];\n\nconst AVAILABLE_ENGINES = ['auto', 'cursor', 'claude', 'gemini', 'codex', 'crew-cli'];\n\nexport interface ReplOptions {\n router: AgentRouter;\n orchestrator: Orchestrator;\n sandbox: Sandbox;\n session: SessionManager;\n logger: Logger;\n projectDir?: string;\n repoConfig?: Required<RepoConfig>;\n initialMode?: 'manual' | 'assist' | 'autopilot';\n initialInterfaceMode?: 'connected' | 'standalone';\n promptInterfaceMode?: boolean;\n uiMode?: 'repl' | 'tui';\n}\n\ninterface ReplState {\n model: string;\n engine: string;\n autoApply: boolean;\n memoryMax: number;\n mode: ReplMode;\n verbose: boolean;\n routerProvider: string; // Tier 1: grok, gemini, deepseek\n executorProvider: string; // Tier 2: grok, gemini, deepseek\n useGateway: boolean; // Tier 3: gateway for specialists\n}\n\ntype ReplMode = 'manual' | 'assist' | 'autopilot';\nconst REPL_MODE_ORDER: ReplMode[] = ['manual', 'assist', 'autopilot'];\n\ninterface ModelSummary {\n mode: 'connected' | 'standalone';\n replModel: string;\n replEngine: string;\n routerProvider: string;\n executorProvider: string;\n gatewayEnabled: boolean;\n policyTierModels: string[];\n agentModels: string[];\n providerKeys: string[];\n}\n\ninterface RepoBootstrap {\n projectDir: string;\n topEntries: string[];\n docs: string[];\n keyFiles: string[];\n readmeSummary: string;\n}\n\nfunction readJsonFile(filePath: string): any | null {\n try {\n if (!existsSync(filePath)) return null;\n return JSON.parse(readFileSync(filePath, 'utf8'));\n } catch {\n return null;\n }\n}\n\nfunction buildModelSummary(projectDir: string, state: ReplState): ModelSummary {\n const envMode = String(process.env.CREW_INTERFACE_MODE || '').toLowerCase();\n const mode: 'connected' | 'standalone' =\n envMode === 'connected' ? 'connected' : (state.useGateway ? 'connected' : 'standalone');\n\n const policyPath = join(projectDir, '.crew', 'model-policy.json');\n const policy = readJsonFile(policyPath) || {};\n const tiers = policy?.tiers || {};\n const policyTierModels = Array.from(\n new Set(\n ['planner', 'executor', 'worker'].flatMap((tier: string) => {\n const cfg = tiers?.[tier] || {};\n return [cfg?.primary, ...(Array.isArray(cfg?.fallback) ? cfg.fallback : [])]\n .map((x: unknown) => String(x || '').trim())\n .filter(Boolean);\n })\n )\n );\n\n const swarmCfg = readJsonFile(join(homedir(), '.crewswarm', 'crewswarm.json')) || {};\n const agents = Array.isArray(swarmCfg?.agents) ? swarmCfg.agents : [];\n const agentModels = Array.from(\n new Set(\n agents\n .map((a: any) => String(a?.model || '').trim())\n .filter(Boolean)\n )\n );\n\n const providers = swarmCfg?.providers && typeof swarmCfg.providers === 'object' ? swarmCfg.providers : {};\n const providerKeys = Object.entries(providers)\n .filter(([, v]: any) => Boolean(v && (v.apiKey || v.baseUrl)))\n .map(([k]) => String(k));\n\n return {\n mode,\n replModel: state.model,\n replEngine: state.engine,\n routerProvider: state.routerProvider,\n executorProvider: state.executorProvider,\n gatewayEnabled: state.useGateway,\n policyTierModels,\n agentModels,\n providerKeys\n };\n}\n\nfunction printModelSummary(summary: ModelSummary) {\n console.log(chalk.blue('\\n--- Model Configuration ---\\n'));\n console.log(` Interface mode: ${summary.mode}`);\n console.log(` REPL model/engine: ${summary.replModel} / ${summary.replEngine}`);\n console.log(` L2 providers: router=${summary.routerProvider}, executor=${summary.executorProvider}`);\n console.log(` Tier-3 gateway: ${summary.gatewayEnabled ? 'enabled' : 'disabled'}`);\n console.log(` Policy-tier models: ${summary.policyTierModels.length ? summary.policyTierModels.join(', ') : '(none set)'}`);\n console.log(` Agent models (~/.crewswarm/crewswarm.json): ${summary.agentModels.length ? summary.agentModels.join(', ') : '(none found)'}`);\n console.log(` Providers configured: ${summary.providerKeys.length ? summary.providerKeys.join(', ') : '(none found)'}`);\n console.log(chalk.gray('\\n Change models with: /model, /stack, .crew/model-policy.json, ~/.crewswarm/crewswarm.json\\n'));\n}\n\nasync function buildRepoBootstrap(projectDir: string): Promise<RepoBootstrap> {\n const ignored = new Set(['.git', 'node_modules', '.crew', 'dist']);\n let topEntries: string[] = [];\n try {\n const entries = await readdir(projectDir, { withFileTypes: true });\n topEntries = entries\n .filter(e => !ignored.has(e.name))\n .map(e => (e.isDirectory() ? `${e.name}/` : e.name))\n .sort()\n .slice(0, 20);\n } catch {\n topEntries = [];\n }\n\n let docs: string[] = [];\n try {\n const docsEntries = await readdir(join(projectDir, 'docs'), { withFileTypes: true });\n docs = docsEntries\n .filter(e => e.isFile() && e.name.toLowerCase().endsWith('.md'))\n .map(e => `docs/${e.name}`)\n .sort()\n .slice(0, 15);\n } catch {\n docs = [];\n }\n\n const keyCandidates = [\n 'README.md',\n 'ROADMAP.md',\n 'progress.md',\n 'docs/API-UNIFIED-v1.md',\n 'docs/openapi.unified.v1.json',\n 'src/cli/index.ts',\n 'src/repl/index.ts',\n 'src/interface/server.ts'\n ];\n const keyFiles = keyCandidates.filter(p => existsSync(join(projectDir, p)));\n\n let readmeSummary = '';\n try {\n const raw = await readFile(join(projectDir, 'README.md'), 'utf8');\n const lines = raw\n .split('\\n')\n .map(l => l.trim())\n .filter(Boolean);\n readmeSummary = lines.slice(0, 3).join(' ').slice(0, 260);\n } catch {\n readmeSummary = '';\n }\n\n return {\n projectDir,\n topEntries,\n docs,\n keyFiles,\n readmeSummary\n };\n}\n\nfunction printSystemSummary(summary: ModelSummary, bootstrap: RepoBootstrap) {\n console.log(chalk.blue('\\n--- System Summary ---\\n'));\n console.log(` Mode: ${summary.mode} (${summary.gatewayEnabled ? 'gateway enabled' : 'local-only'})`);\n console.log(` L1 (chat): ${summary.replModel} via ${summary.replEngine}`);\n console.log(` L2 (reasoning): router=${summary.routerProvider}, executor=${summary.executorProvider}`);\n console.log(` L3 (workers): ${summary.agentModels.length} configured agent model assignments`);\n console.log(` Providers: ${summary.providerKeys.length ? summary.providerKeys.join(', ') : '(none found)'}`);\n console.log(` Project: ${bootstrap.projectDir}`);\n console.log(` Key files: ${bootstrap.keyFiles.length ? bootstrap.keyFiles.join(', ') : '(none detected)'}`);\n console.log(chalk.gray('\\n Commands: /models-config, /stack, /status, /preview, /apply, /trace <id>\\n'));\n}\n\nfunction answerLocalMetaQuestion(input: string, summary: ModelSummary): string | null {\n const lower = input.trim().toLowerCase();\n if (!lower) return null;\n\n if (/^(hi|hello|hey)\\b/.test(lower)) {\n return 'Hi. I can build/fix code, or answer stack config. Try: \"what models are configured?\"';\n }\n\n if (/\\b(solo mode|standalone mode|connected mode|are you in solo mode)\\b/.test(lower)) {\n if (summary.mode === 'standalone') {\n return 'You are in standalone mode. Routing/execution is local unless you explicitly use gateway-backed commands.';\n }\n return 'You are in connected mode. Requests route through crew-lead/gateway for multi-agent orchestration.';\n }\n\n if (\n /\\b(what|which).*(models?|providers?).*(configured|active|set)\\b/.test(lower) ||\n /\\bmodels?\\s+configured\\b/.test(lower)\n ) {\n const policy = summary.policyTierModels.length ? summary.policyTierModels.join(', ') : '(none set)';\n const agents = summary.agentModels.length ? summary.agentModels.join(', ') : '(none found)';\n return [\n `Mode: ${summary.mode}.`,\n `REPL model/engine: ${summary.replModel} / ${summary.replEngine}.`,\n `L2 providers: router=${summary.routerProvider}, executor=${summary.executorProvider}.`,\n `Policy-tier models: ${policy}.`,\n `Agent models: ${agents}.`,\n 'Use /models-config for full details, then change via /model, /stack, .crew/model-policy.json, or ~/.crewswarm/crewswarm.json.'\n ].join(' ');\n }\n\n if (/\\b(change|modify|set|update).*(models?|model)\\b/.test(lower)) {\n return 'Yes. Use /model (session), /stack (tier providers), or edit .crew/model-policy.json and ~/.crewswarm/crewswarm.json for persistent model changes.';\n }\n\n if (/\\b(what can you do|help me|onboard|getting started|how do i use)\\b/.test(lower)) {\n return [\n 'Here is the fast path.',\n '1) /models-config to inspect real model/provider config.',\n '2) /stack to set Tier-1 router + Tier-2 executor + gateway toggle.',\n '3) Ask build/fix tasks directly; I route and stage edits in sandbox.',\n '4) /preview then /apply (or /rollback).',\n '5) /trace <id> for prompt/planner trace.',\n 'If you want me to run an exact command, say it explicitly: e.g. \"run /models-config\".'\n ].join(' ');\n }\n\n if (/\\b(run|execute)\\s+\\/[a-z-]+/.test(lower)) {\n return 'Use slash commands directly in REPL. Example: /models-config, /stack, /status, /preview, /apply, /trace <traceId>.';\n }\n\n return null;\n}\n\nfunction answerFromBootstrap(input: string, summary: ModelSummary, bootstrap: RepoBootstrap): string | null {\n const lower = input.trim().toLowerCase();\n if (!lower) return null;\n\n // Greetings and smalltalk \u2014 don't waste L2 tokens on these\n if (/^(hi|hey|hello|yo|sup|hola|howdy|hej|oi|what'?s? up|wh?at up|how('?s it going|'?re you|( are)? you doin|( are)? ya)|good (morning|afternoon|evening)|gm|gn)\\b/.test(lower)) {\n const greetings = [\n 'Hi. I can build/fix code, or answer stack config. Try: \"what models are configured?\"',\n 'Hey! Ready to code. What do you need built or fixed?',\n 'Yo. Give me a coding task, a file to review, or ask about the system.',\n 'What\\'s up! I\\'m your coding crew. Drop a task or ask /help for commands.',\n ];\n return greetings[Math.floor(Math.random() * greetings.length)];\n }\n\n // Thanks / bye \u2014 quick responses\n if (/^(thanks|thank you|thx|ty|cheers|nice|cool|great|awesome|perfect|ok|okay|k|bye|goodbye|later|peace)\\b/.test(lower)) {\n return lower.match(/bye|goodbye|later|peace/) \n ? 'Later! Run /exit or just close the terminal.' \n : '\uD83D\uDC4D';\n }\n\n if (\n /\\b(how does this system work|explain (the )?(system|architecture)|what is crew-cli|tell me about crew-cli)\\b/.test(lower)\n ) {\n const docs = bootstrap.docs.slice(0, 5).join(', ') || '(no docs indexed)';\n const keys = bootstrap.keyFiles.slice(0, 6).join(', ') || '(no key files found)';\n return [\n `Crew CLI is a multi-layer orchestrator in ${summary.mode} mode.`,\n `L1 chat runs on ${summary.replModel}/${summary.replEngine}; L2 uses router=${summary.routerProvider} and executor=${summary.executorProvider}; L3 uses configured worker/agent models.`,\n `Key repo files: ${keys}.`,\n `Docs index snapshot: ${docs}.`,\n `Use /system for full stack summary and /models-config for exact model/provider config.`\n ].join(' ');\n }\n\n if (/\\b(read|write|file access|filesystem|permissions)\\b/.test(lower)) {\n if (summary.mode === 'standalone') {\n return 'Standalone mode has local read/write through orchestrator + sandbox. Edits stage in sandbox first, then /apply writes to disk.';\n }\n return 'Connected mode executes through gateway/agents; file operations happen via agent tools and still stage through sandbox workflow on this CLI.';\n }\n\n return null;\n}\n\nfunction printHelp(uiMode: 'repl' | 'tui' = 'repl') {\n console.log(chalk.blue.bold('\\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557'));\n console.log(chalk.blue.bold('\u2551 CREW REPL COMMANDS \u2551'));\n console.log(chalk.blue.bold('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\\n'));\n\n console.log(chalk.cyan.bold(' \uD83D\uDCCB Session Commands:'));\n console.log(' /help Show this comprehensive help');\n console.log(' /info Show current model, engine, and settings');\n console.log(' /status Session info (cost, history, sandbox)');\n console.log(' /cost Total spend this session');\n console.log(' /history [n] Show last n messages (default: 5)');\n console.log(' /clear Clear session history');\n console.log(' /trace Show execution path and composed prompts\\n');\n\n console.log(chalk.yellow.bold(' Sandbox & Git:'));\n console.log(' /preview Show pending changes (colored diff)');\n console.log(' /apply [--commit] Write sandbox to disk + auto-commit');\n console.log(' /rollback Discard all pending changes');\n console.log(' /diff Show colored git diff');\n console.log(' /branch Interactive branch selector');\n console.log(' /branches Same as /branch');\n console.log(' /undo Undo last change');\n console.log(' /validate Blind AI code review of recent changes');\n console.log(' /test-first <task> TDD: tests -> implement -> validate');\n console.log(' /image <path> Attach image for next task (multimodal)\\n');\n\n console.log(chalk.magenta.bold(' \uD83C\uDF9B\uFE0F Model & Engine:'));\n console.log(' /models Interactive model selector (use arrow keys)');\n console.log(' /models-config Show configured models/providers from local config');\n console.log(' /model <name> Switch execution model directly');\n console.log(' /engines Interactive engine selector (use arrow keys)');\n console.log(' /engine <name> Switch engine directly (cursor|claude|gemini|auto)');\n console.log(' /mode [name] Interactive mode selector or set directly');\n console.log(' /mode-info Explain manual/assist/autopilot execution semantics');\n console.log(' Shift+Tab Cycle REPL mode');\n console.log(' /auto-apply Toggle auto-apply sandbox changes');\n console.log(' /verbose Toggle verbose routing output');\n console.log(' /stack Configure 3-tier LLM stack (router, executor, gateway)\\n');\n\n console.log(chalk.green.bold(' \uD83E\uDDE0 Memory & LSP:'));\n console.log(' /memory [query] Show memory stats or recall');\n console.log(' /tools Show tool capability matrix by mode/path');\n console.log(' /lsp check [files] Run TypeScript diagnostics');\n console.log(' /lsp complete <file> <line> <column> [prefix] Get completions\\n');\n\n console.log(chalk.green.bold(' \uD83D\uDD0D Context & Git:'));\n console.log(' /context Show context size estimate');\n console.log(' /git Show current git status');\n console.log(' /repos Show sibling repos (cross-repo)\\n');\n\n console.log(chalk.red.bold(' \uD83D\uDEAA Exit:'));\n console.log(' /exit, /quit Exit REPL (or press Ctrl+C)\\n');\n\n console.log(chalk.gray(' \uD83D\uDCA1 Tip: Type any coding task to get started. Simple chats respond'));\n console.log(chalk.gray(' instantly, code changes route to specialist agents automatically.\\n'));\n if (uiMode === 'tui') {\n console.log(chalk.gray(' TUI mode uses the same runtime/controller as REPL with a denser terminal layout.\\n'));\n }\n}\n\nfunction modeBehavior(mode: ReplMode) {\n if (mode === 'manual') {\n return {\n memoryInject: false,\n executionConfirm: false,\n autoApply: false,\n autopilotPipeline: false\n };\n }\n if (mode === 'assist') {\n return {\n memoryInject: true,\n executionConfirm: true,\n autoApply: false,\n autopilotPipeline: false\n };\n }\n return {\n memoryInject: true,\n executionConfirm: false,\n autoApply: true,\n autopilotPipeline: true\n };\n}\n\nfunction applySlashAlias(input: string, aliases: Record<string, string>): string {\n if (!input.startsWith('/')) return input;\n const [cmd, ...rest] = input.split(/\\s+/);\n const replacement = aliases[cmd];\n if (!replacement) return input;\n const normalized = replacement.startsWith('/') ? replacement : `/${replacement}`;\n return [normalized, ...rest].join(' ').trim();\n}\n\nasync function renderBannerAnimated(banner: string): Promise<void> {\n const lines = banner.split('\\n');\n for (const line of lines) {\n process.stdout.write(`${chalk.cyan(line)}\\n`);\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n}\n\nfunction nextMode(current: ReplMode): ReplMode {\n const idx = REPL_MODE_ORDER.indexOf(current);\n if (idx < 0 || idx === REPL_MODE_ORDER.length - 1) return REPL_MODE_ORDER[0];\n return REPL_MODE_ORDER[idx + 1];\n}\n\nfunction buildPrompt(state: ReplState, isProcessing: boolean, uiMode: 'repl' | 'tui' = 'repl'): string {\n const prefix = uiMode === 'tui' ? 'crew-tui' : 'crew';\n const mode = state.mode;\n if (isProcessing) return chalk.gray(`${prefix}(${mode},busy)> `);\n if (mode === 'autopilot') return chalk.magenta(`${prefix}(${mode})> `);\n if (mode === 'assist') return chalk.cyan(`${prefix}(${mode})> `);\n return chalk.green(`${prefix}(${mode})> `);\n}\n\nfunction printTuiScaffold() {\n console.log(chalk.blue('\\n\u250C\u2500[ TUI LAYOUT ]\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510'));\n console.log(chalk.white('\u2502 Chat + Commands share the same runtime as REPL (no orchestration fork). \u2502'));\n console.log(chalk.white('\u2502 Panels: status/banner at top, responses inline, sandbox + cost summaries.\u2502'));\n console.log(chalk.white('\u2502 Keys: Shift+Tab mode cycle, /help commands, /preview /apply /trace. \u2502'));\n console.log(chalk.blue('\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\\n'));\n}\n\nexport async function startRepl(options: ReplOptions): Promise<void> {\n const { router, orchestrator, sandbox, session, logger } = options;\n const projectDir = options.projectDir || process.cwd();\n const repoConfig = options.repoConfig;\n const uiMode: 'repl' | 'tui' = options.uiMode || 'repl';\n const keeper = new AgentKeeper(projectDir);\n const memoryBroker = new MemoryBroker(projectDir);\n const checkpoints = new CheckpointStore(projectDir);\n const sessionId = await session.getSessionId();\n const replRunId = `repl-${randomUUID()}`;\n\n // Interactive mode selection if not provided via CLI or config\n let selectedMode: ReplMode = (options.initialMode || repoConfig?.repl?.mode || 'manual') as ReplMode;\n \n if (!options.initialMode && !repoConfig?.repl?.mode && process.stdin.isTTY) {\n try {\n const modeAnswer = await (await getInquirer()).prompt([\n {\n type: 'list',\n name: 'mode',\n message: 'Select REPL mode:',\n choices: [\n {\n name: 'manual - Requires approval for all changes (safest)',\n value: 'manual',\n short: 'manual'\n },\n {\n name: 'assist - Memory-enhanced assistance',\n value: 'assist',\n short: 'assist'\n },\n {\n name: 'autopilot - Full autonomous mode (auto-apply changes)',\n value: 'autopilot',\n short: 'autopilot'\n }\n ],\n default: 'manual',\n loop: false\n }\n ]);\n selectedMode = modeAnswer.mode as ReplMode;\n } catch {\n // User cancelled, use manual as fallback\n selectedMode = 'manual';\n }\n }\n\n const envInterfaceMode = String(process.env.CREW_INTERFACE_MODE || '').toLowerCase();\n const repoDefaultInterface: 'connected' | 'standalone' =\n Boolean(repoConfig?.repl?.useGateway) ? 'connected' : 'standalone';\n let selectedInterfaceMode: 'connected' | 'standalone' =\n options.initialInterfaceMode\n || (envInterfaceMode === 'connected' ? 'connected' : envInterfaceMode === 'standalone' ? 'standalone' : repoDefaultInterface);\n\n if (options.promptInterfaceMode && process.stdin.isTTY) {\n try {\n const ifaceAnswer = await (await getInquirer()).prompt([\n {\n type: 'list',\n name: 'interfaceMode',\n message: 'Select interface mode:',\n choices: [\n {\n name: 'standalone - Local unified pipeline (no gateway required)',\n value: 'standalone',\n short: 'standalone'\n },\n {\n name: 'connected - Route via crew-lead/gateway specialists',\n value: 'connected',\n short: 'connected'\n }\n ],\n default: selectedInterfaceMode,\n loop: false\n }\n ]);\n selectedInterfaceMode = ifaceAnswer.interfaceMode as 'connected' | 'standalone';\n } catch {\n // Keep selectedInterfaceMode fallback.\n }\n }\n process.env.CREW_INTERFACE_MODE = selectedInterfaceMode;\n\n const replState: ReplState = {\n model: String(repoConfig?.repl?.model || 'deepseek-chat'),\n engine: String(repoConfig?.repl?.engine || 'auto'),\n autoApply: Boolean(repoConfig?.repl?.autoApply),\n memoryMax: Number(repoConfig?.repl?.memoryMax ?? 5),\n mode: selectedMode,\n verbose: Boolean(repoConfig?.repl?.verbose || false),\n routerProvider: String(repoConfig?.repl?.routerProvider || 'grok'),\n executorProvider: String(repoConfig?.repl?.executorProvider || 'grok'),\n useGateway: selectedInterfaceMode === 'connected'\n };\n // Enforce deterministic mode defaults on startup.\n if (replState.mode === 'manual') replState.autoApply = false;\n if (replState.mode === 'autopilot') replState.autoApply = true;\n const slashAliases = repoConfig?.slashAliases || {};\n const bannerEnabled = repoConfig?.repl?.bannerEnabled !== false;\n const bannerAnimated = repoConfig?.repl?.animatedBanner !== false;\n const bannerFirstLaunchOnly = repoConfig?.repl?.bannerFirstLaunchOnly === true; // Changed default to false\n const bannerSeenFile = join(projectDir, '.crew', 'repl-banner-seen');\n const replAuditPath = join(projectDir, '.crew', 'repl-events.jsonl');\n const shouldRenderBanner = bannerEnabled && (!bannerFirstLaunchOnly || !existsSync(bannerSeenFile));\n let auditSeq = 0;\n let checkpointEnabled = true;\n\n // Lazy-load repo bootstrap (don't block cold start)\n let repoBootstrap: RepoBootstrap = { projectDir, topEntries: [], docs: [], keyFiles: [], readmeSummary: '' };\n const repoBootstrapPromise = buildRepoBootstrap(projectDir).then(b => { repoBootstrap = b; }).catch(() => {});\n\n // Pre-warm LLM provider connections (fire-and-forget, reduces first-request latency)\n const preWarmProviders = () => {\n const endpoints = [\n { key: 'GEMINI_API_KEY', url: 'https://generativelanguage.googleapis.com' },\n { key: 'OPENAI_API_KEY', url: 'https://api.openai.com' },\n { key: 'XAI_API_KEY', url: 'https://api.x.ai' },\n { key: 'GROQ_API_KEY', url: 'https://api.groq.com' },\n ];\n for (const ep of endpoints) {\n if (process.env[ep.key]) {\n fetch(ep.url, { method: 'HEAD', signal: AbortSignal.timeout(2000) }).catch(() => {});\n break; // Only pre-warm the first available provider\n }\n }\n };\n preWarmProviders();\n\n // Render banner FIRST, before anything else\n if (shouldRenderBanner) {\n if (bannerAnimated) {\n await renderBannerAnimated(BANNER);\n } else {\n console.log(chalk.cyan(BANNER));\n }\n try {\n await mkdir(join(projectDir, '.crew'), { recursive: true });\n await writeFile(bannerSeenFile, new Date().toISOString(), 'utf8');\n } catch {\n // Best-effort marker write.\n }\n }\n\n // Wait for repo bootstrap before showing status (but it started earlier)\n await repoBootstrapPromise;\n\n // Show dynamic status dashboard on REPL startup\n try {\n const { displayStatus } = await import('../status/dashboard.ts');\n await displayStatus();\n } catch (err) {\n // Silently fail if status dashboard can't be shown\n }\n\n let isProcessing = false;\n let isClosing = false;\n let isCommandProcessing = false;\n let pendingExit = false;\n\n const recordReplEvent = async (type: string, payload: Record<string, unknown>) => {\n auditSeq += 1;\n const event = {\n ts: new Date().toISOString(),\n seq: auditSeq,\n runId: replRunId,\n sessionId,\n type,\n ...payload\n };\n try {\n await session.appendHistory({\n type: `repl_${type}`,\n runId: replRunId,\n seq: auditSeq,\n ...payload\n } as any);\n if (checkpointEnabled) {\n await checkpoints.append(replRunId, `repl.${type}`, {\n sessionId,\n seq: auditSeq,\n ...payload\n });\n }\n await mkdir(join(projectDir, '.crew'), { recursive: true });\n await appendFile(replAuditPath, `${JSON.stringify(event)}\\n`, 'utf8');\n } catch {\n // Best-effort audit side channel.\n }\n };\n try {\n await checkpoints.beginRun({\n runId: replRunId,\n mode: 'repl',\n task: `Interactive REPL session (${projectDir})`\n });\n } catch {\n checkpointEnabled = false;\n }\n await recordReplEvent('session_started', {\n mode: replState.mode,\n model: replState.model,\n engine: replState.engine\n });\n\n console.log(chalk.gray(` Project: ${chalk.white(projectDir)}`));\n console.log(chalk.gray(` Session: ${chalk.white(sessionId)}`));\n console.log(chalk.gray(` Model: ${chalk.green(replState.model)} Engine: ${chalk.blue(replState.engine)} Mode: ${chalk.magenta(replState.mode)}`));\n console.log();\n if (uiMode === 'tui') {\n printTuiScaffold();\n }\n console.log(chalk.gray(` Type ${chalk.cyan('/help')} for full command list or start chatting!\\n`));\n if (repoBootstrap.topEntries.length > 0) {\n console.log(chalk.gray(` Repo indexed: ${repoBootstrap.topEntries.length} top entries, ${repoBootstrap.docs.length} docs, ${repoBootstrap.keyFiles.length} key files.`));\n console.log(chalk.gray(` Try ${chalk.cyan('/system')} for stack summary.\\n`));\n }\n\n // Tab completion for commands and file paths\n const SLASH_COMMANDS = [\n '/help', '/exit', '/quit', '/model', '/models', '/engine', '/engines',\n '/mode', '/auto-apply', '/verbose', '/stack', '/preview', '/apply',\n '/rollback', '/branches', '/info', '/status', '/history', '/clear',\n '/system', '/image', '/search', '/cost', '/recall', '/checkpoint',\n '/trace', '/timeline', '/audit', '/validate', '/test', '/commit'\n ];\n\n const tabCompleter = (line: string): [string[], string] => {\n const trimmed = line.trim();\n\n // Complete slash commands\n if (trimmed.startsWith('/')) {\n const matches = SLASH_COMMANDS.filter(c => c.startsWith(trimmed));\n return [matches.length > 0 ? matches : SLASH_COMMANDS, trimmed];\n }\n\n // Complete file paths (best-effort, sync)\n if (trimmed.includes('/') || trimmed.includes('.')) {\n try {\n const { readdirSync, statSync } = require('fs');\n const { dirname, basename } = require('path');\n const partial = trimmed.split(/\\s+/).pop() || '';\n const dir = partial.includes('/') ? join(projectDir, dirname(partial)) : projectDir;\n const prefix = partial.includes('/') ? basename(partial) : partial;\n const entries = readdirSync(dir, { withFileTypes: true })\n .filter((e: any) => e.name.startsWith(prefix) && !e.name.startsWith('.'))\n .slice(0, 20)\n .map((e: any) => {\n const full = partial.includes('/') ? dirname(partial) + '/' + e.name : e.name;\n return e.isDirectory() ? full + '/' : full;\n });\n if (entries.length > 0) return [entries, partial];\n } catch {\n // Fall through \u2014 no completions available\n }\n }\n\n return [[], trimmed];\n };\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: buildPrompt(replState, isProcessing, uiMode),\n terminal: true,\n completer: tabCompleter\n });\n\n const keypressListener = (_str: string, key: { name?: string; shift?: boolean; sequence?: string }) => {\n const isShiftTab = (key.name === 'tab' && key.shift) || key.sequence === '\\u001b[Z';\n if (!isShiftTab) return;\n const from = replState.mode;\n replState.mode = nextMode(replState.mode);\n rl.setPrompt(buildPrompt(replState, isProcessing, uiMode));\n void recordReplEvent('mode_change', { from, to: replState.mode, source: 'keybinding' });\n console.log(chalk.magenta(`\\n \u21BB Mode: ${replState.mode}`));\n rl.prompt();\n };\n if (process.stdin.isTTY) {\n emitKeypressEvents(process.stdin, rl);\n process.stdin.on('keypress', keypressListener as any);\n }\n const refreshPrompt = () => rl.setPrompt(buildPrompt(replState, isProcessing, uiMode));\n\n // Show initial prompt\n rl.prompt();\n\n // Pending images for multimodal (attached via /image, consumed on next task)\n const pendingImages: string[] = [];\n\n const handleSlashCommand = async (rawInput: string): Promise<boolean> => {\n const trimmed = applySlashAlias(rawInput.trim(), slashAliases);\n if (!trimmed.startsWith('/')) return false;\n const [command, ...args] = trimmed.split(/\\s+/);\n\n if (command === '/exit' || command === '/quit') {\n console.log(chalk.cyan('\\n \uD83D\uDC4B Goodbye! Session saved to .crew/\\n'));\n isClosing = true;\n rl.close();\n return true;\n }\n\n if (command === '/help') {\n printHelp(uiMode);\n return true;\n }\n\n if (command === '/info') {\n const summary = buildModelSummary(projectDir, replState);\n const configuredCliEngine = String((repoConfig as any)?.cli?.engine || '(not set)');\n const configuredReplEngine = String((repoConfig as any)?.repl?.engine || '(not set)');\n const preferredEngines = Array.isArray((repoConfig as any)?.cli?.preferredEngines)\n ? (repoConfig as any).cli.preferredEngines.map((x: unknown) => String(x)).filter(Boolean)\n : [];\n const chatModel = String(process.env.CREW_CHAT_MODEL || '(env not set)');\n const routerModel = String(process.env.CREW_ROUTER_MODEL || '(env not set)');\n const reasoningModel = String(process.env.CREW_REASONING_MODEL || '(env not set)');\n const l2aModel = String(process.env.CREW_L2A_MODEL || '(env not set)');\n const l2bModel = String(process.env.CREW_L2B_MODEL || '(env not set)');\n const qaModel = String(process.env.CREW_QA_MODEL || '(env not set)');\n const extraValidators = String(process.env.CREW_L2_EXTRA_VALIDATORS || '(env not set)');\n const executionModel = String(process.env.CREW_EXECUTION_MODEL || '(env not set)');\n const maxParallelWorkers = String(process.env.CREW_MAX_PARALLEL_WORKERS || '(env not set)');\n\n console.log(chalk.blue('\\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557'));\n console.log(chalk.blue('\u2551 CURRENT SETTINGS \u2551'));\n console.log(chalk.blue('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\\n'));\n console.log(chalk.cyan(' Engine Routing (dispatch/runtime):'));\n console.log(` Active REPL engine: ${chalk.blue(replState.engine)}`);\n console.log(` Config default (repl.engine): ${chalk.blue(configuredReplEngine)}`);\n console.log(` Config default (cli.engine) : ${chalk.blue(configuredCliEngine)}`);\n console.log(` Preferred engines : ${preferredEngines.length ? preferredEngines.join(' -> ') : chalk.gray('(none configured)')}\\n`);\n\n console.log(chalk.cyan(' Tier Stack (model/providers):'));\n console.log(` Tier 1 provider (Router) : ${chalk.green(replState.routerProvider)}`);\n console.log(` Tier 2 provider (Executor): ${chalk.green(replState.executorProvider)}`);\n console.log(` Tier 3 gateway : ${replState.useGateway ? chalk.green('ENABLED') : chalk.gray('disabled')}`);\n console.log(` CREW_CHAT_MODEL : ${chatModel}`);\n console.log(` CREW_ROUTER_MODEL : ${routerModel}`);\n console.log(` CREW_REASONING_MODEL : ${reasoningModel}`);\n console.log(` CREW_L2A_MODEL : ${l2aModel}`);\n console.log(` CREW_L2B_MODEL : ${l2bModel}`);\n console.log(` CREW_QA_MODEL : ${qaModel}`);\n console.log(` CREW_L2_EXTRA_VALIDATORS : ${extraValidators}`);\n console.log(` CREW_EXECUTION_MODEL : ${executionModel}`);\n console.log(` CREW_MAX_PARALLEL_WORKERS : ${maxParallelWorkers}`);\n console.log(` Policy-tier models : ${summary.policyTierModels.length ? summary.policyTierModels.join(', ') : chalk.gray('(none set)')}\\n`);\n\n console.log(chalk.cyan(' Session:'));\n console.log(` Model: ${chalk.green(replState.model)}`);\n console.log(` Engine: ${chalk.blue(replState.engine)}`);\n console.log(` Mode: ${chalk.magenta(replState.mode)}`);\n const behavior = modeBehavior(replState.mode);\n console.log(` Mode behavior: memoryInject=${behavior.memoryInject ? 'on' : 'off'}, executionConfirm=${behavior.executionConfirm ? 'on' : 'off'}, autoApply=${behavior.autoApply ? 'on' : 'off'}, autopilotPipeline=${behavior.autopilotPipeline ? 'on' : 'off'}`);\n console.log(` Auto-apply: ${replState.autoApply ? chalk.green('ON') : chalk.gray('off')}`);\n console.log(` Verbose: ${replState.verbose ? chalk.green('ON') : chalk.gray('off')}`);\n console.log(` Memory max: ${replState.memoryMax}`);\n console.log(` Project: ${chalk.gray(projectDir)}\\n`);\n return true;\n }\n\n if (command === '/system') {\n const summary = buildModelSummary(projectDir, replState);\n printSystemSummary(summary, repoBootstrap);\n return true;\n }\n\n if (command === '/mode-info') {\n console.log(chalk.blue('\\n--- REPL Mode Semantics ---\\n'));\n console.log(' manual');\n console.log(' - Chat + dispatch normally');\n console.log(' - No memory context injection');\n console.log(' - No execute confirmation prompt');\n console.log(' - No auto-apply');\n console.log(' assist');\n console.log(' - Memory/RAG context injection enabled');\n console.log(' - Confirm before non-chat execution');\n console.log(' - No auto-apply');\n console.log(' autopilot');\n console.log(' - Memory/RAG context injection enabled');\n console.log(' - Runs full unified pipeline in standalone mode');\n console.log(' - Auto-apply sandbox changes by default\\n');\n return true;\n }\n\n if (command === '/models-config') {\n const summary = buildModelSummary(projectDir, replState);\n printModelSummary(summary);\n return true;\n }\n\n if (command === '/models') {\n if (!process.stdin.isTTY) {\n console.log(chalk.yellow('\\n /models requires an interactive TTY.\\n'));\n return true;\n }\n try {\n const answer = await (await getInquirer()).prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Select a model:',\n choices: AVAILABLE_MODELS.map(m => ({\n name: m === replState.model ? `${m} ${chalk.green('(current)')}` : m,\n value: m\n })),\n default: replState.model,\n loop: false\n }\n ]);\n \n if (answer.model !== replState.model) {\n replState.model = answer.model;\n console.log(chalk.green(`\\n \u2713 Model set to: ${answer.model}\\n`));\n } else {\n console.log(chalk.gray('\\n No change.\\n'));\n }\n } catch (err) {\n // User cancelled with Ctrl+C or ESC\n console.log(chalk.gray('\\n Cancelled.\\n'));\n }\n return true;\n }\n\n if (command === '/model') {\n const modelName = args.join(' ').trim();\n if (!modelName) {\n // Show benchmark table (novel feature \u2014 no competitor has this)\n try {\n const { MODEL_CATALOG, formatModelTable, findModelInfo } = await import('./model-info.js');\n const current = findModelInfo(replState.model);\n console.log(chalk.blue('\\n \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557'));\n console.log(chalk.blue(' \u2551 MODEL BENCHMARK & PRICING \u2551'));\n console.log(chalk.blue(' \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\\n'));\n console.log(chalk.gray(' Scores from OpenRouter coding benchmark (March 2026)\\n'));\n console.log(chalk.cyan(' Heavy Tier (L2 Brain):'));\n console.log(formatModelTable(MODEL_CATALOG.filter(m => m.tier === 'heavy')));\n console.log(chalk.cyan('\\n Standard Tier (L3 Workers):'));\n console.log(formatModelTable(MODEL_CATALOG.filter(m => m.tier === 'standard')));\n console.log(chalk.cyan('\\n Fast Tier (L1 Routing):'));\n console.log(formatModelTable(MODEL_CATALOG.filter(m => m.tier === 'fast')));\n if (current) {\n console.log(chalk.green(`\\n Current: ${current.name} (${current.provider}) \u2014 score ${current.codingScore}, $${current.inputCost}/$${current.outputCost}/M`));\n } else {\n console.log(chalk.yellow(`\\n Current: ${replState.model} (not in catalog)`));\n }\n console.log(chalk.gray(`\\n Usage: /model <name> \u2014 e.g. /model gpt-5.4\\n`));\n } catch {\n console.log(chalk.red('\\n \u2717 Could not load model catalog. Type /model <name> to set directly.\\n'));\n }\n } else {\n replState.model = modelName;\n try {\n const { findModelInfo } = await import('./model-info.js');\n const info = findModelInfo(modelName);\n if (info) {\n console.log(chalk.green(`\\n \u2713 Model: ${info.name} (${info.provider})`));\n console.log(chalk.gray(` Score: ${info.codingScore} | Cost: $${info.inputCost}/$${info.outputCost}/M | Context: ${info.contextWindow}${info.note ? ` | ${info.note}` : ''}\\n`));\n } else {\n console.log(chalk.green(`\\n \u2713 Model set to: ${modelName}\\n`));\n }\n } catch {\n console.log(chalk.green(`\\n \u2713 Model set to: ${modelName}\\n`));\n }\n }\n return true;\n }\n\n if (command === '/engines') {\n if (!process.stdin.isTTY) {\n console.log(chalk.yellow('\\n /engines requires an interactive TTY.\\n'));\n return true;\n }\n try {\n const answer = await (await getInquirer()).prompt([\n {\n type: 'list',\n name: 'engine',\n message: 'Select an engine:',\n choices: AVAILABLE_ENGINES.map(e => ({\n name: e === replState.engine ? `${e} ${chalk.green('(current)')}` : e,\n value: e\n })),\n default: replState.engine,\n loop: false\n }\n ]);\n \n if (answer.engine !== replState.engine) {\n replState.engine = answer.engine;\n console.log(chalk.green(`\\n \u2713 Engine set to: ${answer.engine}\\n`));\n } else {\n console.log(chalk.gray('\\n No change.\\n'));\n }\n } catch (err) {\n // User cancelled with Ctrl+C or ESC\n console.log(chalk.gray('\\n Cancelled.\\n'));\n }\n return true;\n }\n\n if (command === '/engine') {\n const engineName = args[0] || '';\n if (!engineName) {\n console.log(chalk.red('\\n \u2717 Provide an engine name. Type /engines to see options.\\n'));\n } else if (!AVAILABLE_ENGINES.includes(engineName)) {\n console.log(chalk.red(`\\n \u2717 Unknown engine \"${engineName}\". Type /engines to see options.\\n`));\n } else {\n replState.engine = engineName;\n console.log(chalk.green(`\\n \u2713 Engine set to: ${engineName}\\n`));\n }\n return true;\n }\n\n if (command === '/auto-apply') {\n replState.autoApply = !replState.autoApply;\n await recordReplEvent('autopilot_toggle', {\n enabled: replState.autoApply,\n source: 'slash'\n });\n console.log(chalk.yellow(`\\n \u2713 Auto-apply: ${replState.autoApply ? chalk.green('ON') : chalk.gray('off')}\\n`));\n return true;\n }\n\n if (command === '/verbose') {\n replState.verbose = !replState.verbose;\n console.log(chalk.yellow(`\\n \u2713 Verbose mode: ${replState.verbose ? chalk.green('ON') : chalk.gray('off')}\\n`));\n return true;\n }\n\n if (command === '/stack') {\n if (args[0] === 'show') {\n console.log(chalk.blue('\\n--- Stack (session) ---\\n'));\n console.log(` Tier 1 router provider : ${replState.routerProvider}`);\n console.log(` Tier 2 executor provider: ${replState.executorProvider}`);\n console.log(` Tier 3 gateway : ${replState.useGateway ? 'enabled' : 'disabled'}`);\n console.log(` CREW_ROUTER_MODEL : ${process.env.CREW_ROUTER_MODEL || '(unset)'}`);\n console.log(` CREW_REASONING_MODEL : ${process.env.CREW_REASONING_MODEL || '(unset)'}`);\n console.log(` CREW_L2A_MODEL : ${process.env.CREW_L2A_MODEL || '(unset)'}`);\n console.log(` CREW_L2B_MODEL : ${process.env.CREW_L2B_MODEL || '(unset)'}`);\n console.log(` CREW_QA_MODEL : ${process.env.CREW_QA_MODEL || '(unset)'}`);\n console.log(` CREW_MAX_PARALLEL_WORKERS: ${process.env.CREW_MAX_PARALLEL_WORKERS || '(unset)'}\\n`);\n return true;\n }\n if (!process.stdin.isTTY) {\n console.log(chalk.yellow('\\n /stack requires an interactive TTY.\\n'));\n return true;\n }\n try {\n console.log(chalk.blue('\\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557'));\n console.log(chalk.blue('\u2551 3-TIER LLM STACK CONFIGURATION \u2551'));\n console.log(chalk.blue('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\\n'));\n\n const answers = await (await getInquirer()).prompt([\n {\n type: 'list',\n name: 'routerProvider',\n message: 'Tier 1: Router (decides CHAT/CODE/DISPATCH):',\n choices: [\n { name: 'Grok (x.ai) - Fast, smart', value: 'grok' },\n { name: 'Gemini - Cheap, 2M context', value: 'gemini' },\n { name: 'DeepSeek - Code specialist', value: 'deepseek' }\n ],\n default: replState.routerProvider,\n loop: false\n },\n {\n type: 'list',\n name: 'executorProvider',\n message: 'Tier 2: Executor (runs tasks locally):',\n choices: [\n { name: 'Grok (x.ai) - Fast, smart', value: 'grok' },\n { name: 'Gemini - Cheap, 2M context', value: 'gemini' },\n { name: 'DeepSeek - Code specialist', value: 'deepseek' }\n ],\n default: replState.executorProvider,\n loop: false\n },\n {\n type: 'confirm',\n name: 'useGateway',\n message: 'Tier 3: Enable gateway for specialists (crew-qa, crew-pm, etc)?',\n default: replState.useGateway\n },\n {\n type: 'input',\n name: 'routerModel',\n message: 'L2 router model (CREW_ROUTER_MODEL, optional):',\n default: String(process.env.CREW_ROUTER_MODEL || '')\n },\n {\n type: 'input',\n name: 'reasoningModel',\n message: 'L2 planner baseline model (CREW_REASONING_MODEL, optional):',\n default: String(process.env.CREW_REASONING_MODEL || '')\n },\n {\n type: 'input',\n name: 'l2aModel',\n message: 'L2A decomposer model (CREW_L2A_MODEL, optional):',\n default: String(process.env.CREW_L2A_MODEL || '')\n },\n {\n type: 'input',\n name: 'l2bModel',\n message: 'L2B validator model (CREW_L2B_MODEL, optional):',\n default: String(process.env.CREW_L2B_MODEL || '')\n },\n {\n type: 'input',\n name: 'qaModel',\n message: 'QA gate model (CREW_QA_MODEL, optional):',\n default: String(process.env.CREW_QA_MODEL || '')\n },\n {\n type: 'input',\n name: 'extraL2Validators',\n message: 'Extra L2 validator models CSV (CREW_L2_EXTRA_VALIDATORS, optional):',\n default: String(process.env.CREW_L2_EXTRA_VALIDATORS || '')\n },\n {\n type: 'input',\n name: 'maxParallelWorkers',\n message: 'Tier 3 max parallel workers (CREW_MAX_PARALLEL_WORKERS):',\n default: String(process.env.CREW_MAX_PARALLEL_WORKERS || '6'),\n validate: (value: string) => {\n const n = Number.parseInt(String(value || ''), 10);\n return (Number.isFinite(n) && n >= 1 && n <= 32)\n ? true\n : 'Enter a number between 1 and 32';\n }\n }\n ]);\n\n replState.routerProvider = answers.routerProvider;\n replState.executorProvider = answers.executorProvider;\n replState.useGateway = answers.useGateway;\n\n console.log(chalk.green('\\n \u2713 Stack configured:'));\n console.log(chalk.cyan(` Tier 1 (Router) : ${replState.routerProvider}`));\n console.log(chalk.cyan(` Tier 2 (Executor): ${replState.executorProvider}`));\n console.log(chalk.cyan(` Tier 3 (Gateway) : ${replState.useGateway ? 'ENABLED' : 'DISABLED'}`));\n console.log();\n\n // Update environment for this session\n process.env.CREW_ROUTING_ORDER = `${replState.routerProvider},${replState.executorProvider}`;\n process.env.CREW_ROUTER_MODEL = String(answers.routerModel || '').trim();\n process.env.CREW_REASONING_MODEL = String(answers.reasoningModel || '').trim();\n process.env.CREW_L2A_MODEL = String(answers.l2aModel || '').trim();\n process.env.CREW_L2B_MODEL = String(answers.l2bModel || '').trim();\n process.env.CREW_QA_MODEL = String(answers.qaModel || '').trim();\n process.env.CREW_L2_EXTRA_VALIDATORS = String(answers.extraL2Validators || '').trim();\n process.env.CREW_MAX_PARALLEL_WORKERS = String(Math.max(1, Math.min(32, Number.parseInt(String(answers.maxParallelWorkers || '6'), 10) || 6)));\n } catch (err) {\n console.log(chalk.gray('\\n Cancelled.\\n'));\n }\n return true;\n }\n\n if (command === '/verbose') {\n replState.verbose = !replState.verbose;\n console.log(chalk.yellow(`\\n \u2713 Verbose routing: ${replState.verbose ? chalk.green('ON') : chalk.gray('off')}\\n`));\n return true;\n }\n\n if (command === '/mode') {\n const requested = (args[0] || '').trim().toLowerCase();\n \n // If no argument provided, show interactive picker\n if (!requested) {\n if (!process.stdin.isTTY) {\n console.log(chalk.yellow('\\n /mode (interactive) requires an interactive TTY. Use /mode <manual|assist|autopilot>.\\n'));\n return true;\n }\n try {\n const answer = await (await getInquirer()).prompt([\n {\n type: 'list',\n name: 'mode',\n message: 'Select REPL mode:',\n choices: [\n {\n name: 'manual - Requires approval for all changes',\n value: 'manual',\n short: 'manual'\n },\n {\n name: 'assist - Memory-enhanced assistance',\n value: 'assist',\n short: 'assist'\n },\n {\n name: 'autopilot - Full autonomous mode (auto-apply)',\n value: 'autopilot',\n short: 'autopilot'\n }\n ].map(choice => ({\n ...choice,\n name: choice.value === replState.mode \n ? `${choice.name} ${chalk.green('(current)')}`\n : choice.name\n })),\n default: replState.mode,\n loop: false\n }\n ]);\n \n if (answer.mode !== replState.mode) {\n const from = replState.mode;\n replState.mode = answer.mode as ReplMode;\n if (replState.mode === 'manual') replState.autoApply = false;\n if (replState.mode === 'autopilot') replState.autoApply = true;\n rl.setPrompt(buildPrompt(replState, isProcessing, uiMode));\n await recordReplEvent('mode_change', { from, to: replState.mode, source: 'interactive' });\n console.log(chalk.green(`\\n \u2713 Mode set to: ${replState.mode}\\n`));\n } else {\n console.log(chalk.gray('\\n No change.\\n'));\n }\n } catch (err) {\n console.log(chalk.gray('\\n Cancelled.\\n'));\n }\n return true;\n }\n \n // Argument provided, validate and set\n if (!REPL_MODE_ORDER.includes(requested as ReplMode)) {\n console.log(chalk.red('\\n \u2717 Mode must be one of: manual, assist, autopilot\\n'));\n return true;\n }\n const from = replState.mode;\n replState.mode = requested as ReplMode;\n if (replState.mode === 'manual') replState.autoApply = false;\n if (replState.mode === 'autopilot') replState.autoApply = true;\n rl.setPrompt(buildPrompt(replState, isProcessing, uiMode));\n await recordReplEvent('mode_change', { from, to: replState.mode, source: 'slash' });\n console.log(chalk.green(`\\n \u2713 Mode set to: ${replState.mode}\\n`));\n return true;\n }\n\n if (command === '/tools') {\n const summary = buildModelSummary(projectDir, replState);\n const mode = summary.mode;\n const behavior = modeBehavior(replState.mode);\n console.log(chalk.blue('\\n--- Tool Capability Matrix ---\\n'));\n console.log(` Interface mode: ${mode}`);\n console.log(` REPL mode: ${replState.mode}`);\n console.log(` Local sandbox edits: ${mode === 'standalone' ? 'yes' : 'staged via response parsing'}`);\n console.log(` Gateway agent tools: ${mode === 'connected' ? 'yes (dispatch path)' : 'no (unless explicitly connected)'}`);\n console.log(` Memory/RAG injection: ${behavior.memoryInject ? 'enabled' : 'disabled'}`);\n console.log(' LSP checks/completion: enabled');\n console.log(' PTY tooling: available via `crew exec`');\n console.log(' Notes: actual tool usage depends on routing, permissions, and parser acceptance.\\n');\n return true;\n }\n\n if (command === '/status') {\n const sess = await session.loadSession();\n const cost = await session.loadCost();\n const pipeline = await loadPipelineMetricsSummary(projectDir);\n const activeBranch = sandbox.getActiveBranch();\n const hasChanges = sandbox.hasChanges(activeBranch);\n\n console.log(chalk.blue('\\n\u250C\u2500 Session Status'));\n console.log(`\u2502 History: ${sess.history.length} entries`);\n console.log(`\u2502 Cost: ${chalk.green(`$${cost.totalUsd.toFixed(4)}`)}`);\n console.log(`\u2502 Sandbox: ${chalk.yellow(activeBranch)} ${hasChanges ? chalk.yellow('(has changes)') : chalk.gray('(clean)')}`);\n console.log(`\u2502 Model: ${chalk.green(replState.model)}`);\n console.log(`\u2502 Engine: ${chalk.blue(replState.engine)}`);\n console.log(`\u2502 Mode: ${chalk.magenta(replState.mode)}`);\n console.log(`\u2502 Pipeline runs: ${pipeline.runs} | QA approved: ${pipeline.qaApproved} | QA rejected: ${pipeline.qaRejected}`);\n console.log(`\u2502 Context chunks: ${pipeline.contextChunksUsed} | Chars saved(est): ${pipeline.contextCharsSaved}`);\n console.log('\u2514\u2500\\n');\n return true;\n }\n\n if (command === '/history') {\n const n = Number.parseInt(args[0] || '5', 10);\n const sess = await session.loadSession();\n const entries = sess.history.slice(-n);\n\n console.log(chalk.blue(`\\n--- Last ${entries.length} Messages ---`));\n entries.forEach((e: any) => {\n const time = e.timestamp?.split('T')[1]?.split('.')[0] || '';\n const type = e.type || 'unknown';\n console.log(`${chalk.gray(`[${time}]`)} ${chalk.bold(type)}${e.agent ? chalk.gray(` (${e.agent})`) : ''}`);\n if (e.task) console.log(chalk.gray(` ${e.task.slice(0, 80)}${e.task.length > 80 ? '...' : ''}`));\n });\n console.log();\n return true;\n }\n\n if (command === '/preview') {\n const activeBranch = sandbox.getActiveBranch();\n if (!sandbox.hasChanges(activeBranch)) {\n console.log(chalk.yellow(`\\n No pending changes in \"${activeBranch}\".\\n`));\n } else {\n const rawPreview = sandbox.preview(activeBranch);\n console.log(chalk.blue(`\\n\u250C\u2500 Sandbox Preview [${activeBranch}]`));\n // Colored diff: green for adds, red for removals, cyan for hunks\n const coloredLines = rawPreview.split('\\n').map((line: string) => {\n if (line.startsWith('+++') || line.startsWith('---')) return chalk.bold(line);\n if (line.startsWith('+')) return chalk.green(line);\n if (line.startsWith('-')) return chalk.red(line);\n if (line.startsWith('@@')) return chalk.cyan(line);\n return line;\n });\n console.log(coloredLines.join('\\n'));\n console.log('\u2514\u2500\\n');\n }\n return true;\n }\n\n if (command === '/apply') {\n const wantCommit = args.includes('--commit');\n const activeBranch = sandbox.getActiveBranch();\n if (!sandbox.hasChanges(activeBranch)) {\n console.log(chalk.yellow('\\n No changes to apply.\\n'));\n } else {\n try {\n const paths = sandbox.getPendingPaths(activeBranch);\n await sandbox.apply(activeBranch);\n console.log(chalk.green(`\\n \u2713 Applied to: ${paths.join(', ')}\\n`));\n\n // Auto-commit with AI-generated message\n if (wantCommit) {\n try {\n const { execSync } = await import('node:child_process');\n const diff = execSync('git diff --cached --stat', { encoding: 'utf8', cwd: projectDir }).trim()\n || execSync('git diff --stat', { encoding: 'utf8', cwd: projectDir }).trim();\n if (!diff) {\n console.log(chalk.yellow(' No git changes to commit.\\n'));\n } else {\n execSync('git add -A', { cwd: projectDir });\n // Generate commit message via LLM\n const commitResult = await orchestrator.executeLocally(\n `Generate a concise conventional commit message (type: description, max 72 chars) for this diff. Reply with ONLY the commit message:\\n\\n${diff.slice(0, 2000)}`,\n { model: replState.model }\n );\n const commitMsg = String(commitResult.result || 'chore: update files').trim().replace(/^['\"`]|['\"`]$/g, '').split('\\n')[0];\n execSync(`git commit -m \"${commitMsg.replace(/\"/g, '\\\\\"')}\"`, { cwd: projectDir });\n console.log(chalk.green(` \u2713 Committed: ${commitMsg}\\n`));\n }\n } catch (commitErr) {\n console.log(chalk.red(` \u2717 Commit failed: ${(commitErr as Error).message}\\n`));\n }\n }\n } catch (err) {\n console.log(chalk.red(`\\n \u2717 Apply failed: ${(err as Error).message}\\n`));\n }\n }\n return true;\n }\n\n if (command === '/rollback') {\n const activeBranch = sandbox.getActiveBranch();\n try {\n await sandbox.rollback(activeBranch);\n console.log(chalk.yellow(`\\n \u2713 Rolled back \"${activeBranch}\".\\n`));\n } catch (err) {\n console.log(chalk.red(`\\n \u2717 Rollback failed: ${(err as Error).message}\\n`));\n }\n return true;\n }\n\n if (command === '/branches' || command === '/branch') {\n if (!process.stdin.isTTY) {\n console.log(chalk.yellow('\\n /branch requires an interactive TTY.\\n'));\n return true;\n }\n const active = sandbox.getActiveBranch();\n const branches = sandbox.getBranches();\n \n // If no branches or only one branch, just show the list\n if (branches.length <= 1) {\n console.log(chalk.blue('\\n\u250C\u2500 Sandbox Branches'));\n branches.forEach(b => {\n if (b === active) {\n console.log(chalk.green(`\u2502 \u25CF ${b} (active)`));\n } else {\n console.log(`\u2502 ${b}`);\n }\n });\n console.log('\u2514\u2500\\n');\n return true;\n }\n \n // Multiple branches - offer interactive selector\n try {\n const answer = await (await getInquirer()).prompt([\n {\n type: 'list',\n name: 'branch',\n message: 'Select sandbox branch:',\n choices: branches.map(b => ({\n name: b === active ? `${b} ${chalk.green('(active)')}` : b,\n value: b\n })),\n default: active,\n loop: false\n }\n ]);\n \n if (answer.branch !== active) {\n sandbox.switchBranch(answer.branch);\n console.log(chalk.green(`\\n \u2713 Switched to branch: ${answer.branch}\\n`));\n } else {\n console.log(chalk.gray('\\n No change.\\n'));\n }\n } catch (err) {\n console.log(chalk.gray('\\n Cancelled.\\n'));\n }\n return true;\n }\n\n if (command === '/clear') {\n try {\n await session.clear();\n console.log(chalk.yellow('\\n \u2713 Session history cleared.\\n'));\n } catch (err) {\n console.log(chalk.red(`\\n \u2717 Clear failed: ${(err as Error).message}\\n`));\n }\n return true;\n }\n\n if (command === '/trace') {\n const traceId = args[0];\n if (!traceId) {\n console.log(chalk.blue('\\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557'));\n console.log(chalk.blue('\u2551 EXECUTION TRACE \u2551'));\n console.log(chalk.blue('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\\n'));\n console.log(chalk.yellow(' Usage: /trace <traceId>'));\n console.log(chalk.gray(' Trace IDs are shown in verbose mode or in execution results.\\n'));\n return true;\n }\n\n try {\n const trace = orchestrator.getTrace(traceId);\n if (!trace || (trace.composedPrompts.length === 0 && !trace.plannerTrace)) {\n console.log(chalk.yellow(`\\n No trace found for ID: ${traceId}\\n`));\n return true;\n }\n\n console.log(chalk.blue('\\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557'));\n console.log(chalk.blue(`\u2551 TRACE: ${traceId.slice(0, 30)} \u2551`));\n console.log(chalk.blue('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\\n'));\n\n if (trace.composedPrompts.length > 0) {\n console.log(chalk.cyan(' Composed Prompts:'));\n trace.composedPrompts.forEach((p, i) => {\n console.log(chalk.white(` ${i + 1}. ${p.templateId} (v${p.templateVersion})`));\n console.log(chalk.gray(` Overlays: ${p.overlays.map(o => o.type).join(', ')}`));\n console.log(chalk.gray(` Composed: ${p.composedAt}`));\n });\n console.log();\n }\n\n if (trace.plannerTrace && trace.plannerTrace.length > 0) {\n console.log(chalk.cyan(' Planner Trace:'));\n trace.plannerTrace.forEach((p, i) => {\n console.log(chalk.white(` ${i + 1}. ${p.templateId} (v${p.templateVersion})`));\n console.log(chalk.gray(` Overlays: ${p.overlays.map(o => o.type).join(', ')}`));\n });\n console.log();\n }\n\n console.log(chalk.gray(' Full prompts saved to session history.\\n'));\n } catch (err) {\n console.log(chalk.red(`\\n \u2717 Trace failed: ${(err as Error).message}\\n`));\n }\n return true;\n }\n\n if (command === '/cost') {\n const cost = await session.loadCost();\n console.log(chalk.blue('\\n\u250C\u2500 Cost Summary'));\n console.log(`\u2502 Total: ${chalk.green(`$${cost.totalUsd.toFixed(4)}`)}`);\n if (Object.keys(cost.byModel).length > 0) {\n console.log('\u2502 By model:');\n Object.entries(cost.byModel).forEach(([model, usd]: [string, any]) => {\n console.log(`\u2502 ${model}: $${usd.toFixed(4)}`);\n });\n }\n console.log('\u2514\u2500\\n');\n return true;\n }\n\n if (command === '/context') {\n try {\n const gitContext = await getProjectContext(projectDir);\n const sess = await session.loadSession();\n const tokenEstimate = Math.ceil((gitContext.length + JSON.stringify(sess.history).length) / 4);\n\n console.log(chalk.blue('\\n\u250C\u2500 Context Footprint'));\n console.log(`\u2502 Project: ${projectDir}`);\n console.log(`\u2502 Session entries: ${sess.history.length}`);\n console.log(`\u2502 Git context: ${gitContext.length} chars`);\n console.log(`\u2502 Estimated tokens: ~${tokenEstimate}`);\n console.log('\u2514\u2500\\n');\n } catch (err) {\n console.log(chalk.red(`\\n \u2717 Context check failed: ${(err as Error).message}\\n`));\n }\n return true;\n }\n\n if (command === '/git') {\n try {\n const gitContext = await getProjectContext(projectDir);\n console.log(chalk.blue('\\n\u250C\u2500 Git Status'));\n console.log(gitContext);\n console.log('\u2514\u2500\\n');\n } catch (err) {\n console.log(chalk.red(`\\n \u2717 Git read failed: ${(err as Error).message}\\n`));\n }\n return true;\n }\n\n if (command === '/repos') {\n try {\n const repoContext = await collectMultiRepoContext(projectDir);\n console.log(chalk.blue('\\n\u250C\u2500 Sibling Repositories'));\n console.log(repoContext);\n console.log('\u2514\u2500\\n');\n } catch (err) {\n console.log(chalk.red(`\\n \u2717 Repos scan failed: ${(err as Error).message}\\n`));\n }\n return true;\n }\n\n if (command === '/memory') {\n const query = args.join(' ').trim();\n if (!query) {\n const stats = await keeper.stats();\n console.log(chalk.blue('\\n--- AgentKeeper Memory Stats ---\\n'));\n console.log(` Total entries: ${stats.entries}`);\n console.log(` Approx bytes: ${stats.bytes}`);\n return true;\n }\n const hits = await memoryBroker.recall(query, {\n maxResults: replState.memoryMax,\n includeDocs: true,\n includeCode: false,\n preferSuccessful: true\n });\n if (hits.length === 0) {\n console.log(chalk.yellow(`\\n No memory/RAG matches for \"${query}\".\\n`));\n return true;\n }\n console.log(chalk.blue(`\\n--- Shared Memory + RAG Recall: \"${query}\" (${hits.length} hits) ---\\n`));\n for (const h of hits) {\n console.log(chalk.yellow(`[${h.score.toFixed(3)}] ${h.source} \u2014 ${h.title.slice(0, 80)}`));\n const preview = h.text.length > 120 ? `${h.text.slice(0, 120)}...` : h.text;\n console.log(chalk.gray(` ${preview}`));\n }\n console.log();\n return true;\n }\n\n if (command === '/lsp') {\n const sub = args[0];\n if (!sub || sub === 'help') {\n console.log(chalk.blue('\\n--- LSP Commands ---'));\n console.log(' /lsp check [files...]');\n console.log(' /lsp complete <file> <line> <column> [prefix]\\n');\n return true;\n }\n if (sub === 'check') {\n const files = args.slice(1);\n const { typeCheckProject } = await import('../lsp/index.js');\n const diagnostics = typeCheckProject(projectDir, files);\n if (diagnostics.length === 0) {\n console.log(chalk.green('\\n \u2713 No LSP diagnostics found.\\n'));\n return true;\n }\n console.log(chalk.yellow(`\\nFound ${diagnostics.length} diagnostic(s):`));\n for (const diag of diagnostics) {\n console.log(` ${diag.category.toUpperCase()} ${diag.code} ${diag.file}:${diag.line}:${diag.column}`);\n console.log(` ${diag.message}`);\n }\n console.log();\n return true;\n }\n if (sub === 'complete') {\n const file = args[1];\n const line = Number.parseInt(args[2] || '', 10);\n const column = Number.parseInt(args[3] || '', 10);\n const prefix = args[4] || '';\n if (!file || Number.isNaN(line) || Number.isNaN(column)) {\n console.log(chalk.red('\\n \u2717 Usage: /lsp complete <file> <line> <column> [prefix]\\n'));\n return true;\n }\n const { getCompletions } = await import('../lsp/index.js');\n const completions = getCompletions(projectDir, file, line, column, 20, prefix);\n if (completions.length === 0) {\n console.log(chalk.yellow('\\n No completions found.\\n'));\n return true;\n }\n console.log(chalk.blue(`\\nCompletions (${completions.length}):`));\n completions.forEach(item => console.log(` - ${item.name} (${item.kind})`));\n console.log();\n return true;\n }\n console.log(chalk.red(`\\n \u2717 Unknown /lsp subcommand: ${sub}\\n`));\n return true;\n }\n\n // \u2500\u2500 /image <path> \u2014 attach image for next agentic task \u2500\u2500\n if (command === '/image') {\n const imgPath = args.join(' ').trim();\n if (!imgPath) {\n if (pendingImages.length === 0) {\n console.log(chalk.yellow('\\n No images attached. Usage: /image <path>\\n'));\n } else {\n console.log(chalk.cyan(`\\n \uD83D\uDCF7 ${pendingImages.length} image(s) attached:`));\n for (const p of pendingImages) {\n console.log(chalk.gray(` ${p}`));\n }\n console.log(chalk.gray(' These will be sent with your next message.\\n'));\n }\n return true;\n }\n const { resolve: resolvePath } = await import('node:path');\n const { existsSync } = await import('node:fs');\n const absPath = resolvePath(projectDir, imgPath);\n const ext = absPath.split('.').pop()?.toLowerCase();\n if (!['png', 'jpg', 'jpeg', 'webp', 'gif'].includes(ext || '')) {\n console.log(chalk.red(`\\n \u2717 Unsupported image type: .${ext} (supported: png, jpg, jpeg, webp, gif)\\n`));\n return true;\n }\n if (!existsSync(absPath)) {\n console.log(chalk.red(`\\n \u2717 File not found: ${absPath}\\n`));\n return true;\n }\n pendingImages.push(absPath);\n console.log(chalk.green(`\\n \uD83D\uDCF7 Image attached: ${absPath}`));\n console.log(chalk.gray(` ${pendingImages.length} image(s) queued. Type your task and they'll be sent with it.\\n`));\n return true;\n }\n\n // \u2500\u2500 /diff \u2014 colorized git diff \u2500\u2500\n if (command === '/diff') {\n try {\n const { execSync } = await import('node:child_process');\n const staged = execSync('git diff --cached', { encoding: 'utf8', cwd: projectDir }).trim();\n const unstaged = execSync('git diff', { encoding: 'utf8', cwd: projectDir }).trim();\n const fullDiff = (staged + '\\n' + unstaged).trim();\n if (!fullDiff) {\n console.log(chalk.yellow('\\n No git changes.\\n'));\n } else {\n console.log(chalk.blue('\\n\u250C\u2500 Git Diff'));\n const coloredLines = fullDiff.split('\\n').map((line: string) => {\n if (line.startsWith('+++') || line.startsWith('---')) return chalk.bold(line);\n if (line.startsWith('+')) return chalk.green(line);\n if (line.startsWith('-')) return chalk.red(line);\n if (line.startsWith('@@')) return chalk.cyan(line);\n if (line.startsWith('diff ')) return chalk.bold.blue(line);\n return line;\n });\n console.log(coloredLines.join('\\n'));\n console.log('\u2514\u2500\\n');\n }\n } catch (err) {\n console.log(chalk.red(`\\n \u2717 Git diff failed: ${(err as Error).message}\\n`));\n }\n return true;\n }\n\n // \u2500\u2500 /validate \u2014 blind LLM code review \u2500\u2500\n if (command === '/validate') {\n console.log(chalk.cyan('\\n \uD83D\uDD0D Running blind validation...\\n'));\n try {\n const { execSync } = await import('node:child_process');\n let diffStat = '';\n try { diffStat = execSync('git diff HEAD~1 --stat', { encoding: 'utf8', cwd: projectDir }).slice(0, 2000); } catch {}\n let codeSnippets = '';\n try {\n const changedFiles = execSync('git diff HEAD~1 --name-only', { encoding: 'utf8', cwd: projectDir })\n .split('\\n').filter(Boolean).slice(0, 5);\n for (const f of changedFiles) {\n try {\n const { readFileSync } = await import('node:fs');\n const content = readFileSync(join(projectDir, f), 'utf8');\n codeSnippets += `\\n### ${f}\\n\\`\\`\\`\\n${content.slice(0, 1500)}\\n\\`\\`\\`\\n`;\n } catch {}\n }\n } catch {}\n\n const validateTask = `You are crew-judge, a blind code validator. Review these recent changes and provide a structured assessment.\n\nScore each category 1-5:\n- **Correctness**: Does the code work? Edge cases?\n- **Security**: Vulnerabilities? Input validation?\n- **Performance**: Bottlenecks? Memory leaks?\n- **Readability**: Clean, documented, follows conventions?\n- **Test Coverage**: Tests present? What's missing?\n\nEnd with VERDICT: SHIP \u2705, FIX \uD83D\uDD27, or REJECT \u274C with actionable items.\n\n## Changed files\\n${diffStat || 'No recent changes'}\\n\\n## Code\\n${codeSnippets || 'No code to review'}`;\n\n const result = await orchestrator.executeLocally(validateTask, { model: replState.model });\n const responseText = String(result.result || 'Validation could not complete.');\n console.log(chalk.cyan(' \u250C\u2500 Validation Report'));\n logger.printWithHighlight(responseText);\n console.log(' \u2514\u2500\\n');\n\n if (result.costUsd) {\n await session.trackCost({ model: result.model || replState.model, usd: result.costUsd });\n }\n } catch (err) {\n console.log(chalk.red(`\\n \u2717 Validation failed: ${(err as Error).message}\\n`));\n }\n return true;\n }\n\n // \u2500\u2500 /test-first \u2014 TDD workflow \u2500\u2500\n if (command === '/test-first') {\n const tfTask = args.join(' ').trim();\n if (!tfTask) {\n console.log(chalk.red('\\n \u2717 Usage: /test-first <task description>\\n'));\n return true;\n }\n console.log(chalk.magenta('\\n \uD83E\uDDEA Test-first mode\\n'));\n console.log(chalk.gray(' Step 1: Generate tests \u2192 Step 2: Implement \u2192 Step 3: Validate\\n'));\n\n try {\n // Step 1: Generate tests\n console.log(chalk.bold(' Step 1: Generating tests...\\n'));\n const testResult = await orchestrator.executeLocally(\n `You are a TDD expert. Given a task description, write comprehensive tests FIRST. Cover happy path, edge cases, error handling, input validation. Output ONLY the test code in a fenced code block with the filename.\\n\\nTask: ${tfTask}\\nProject dir: ${projectDir}`,\n { model: replState.model }\n );\n const testCode = String(testResult.result || '');\n console.log(chalk.cyan(' \u250C\u2500 Tests'));\n logger.printWithHighlight(testCode);\n console.log(' \u2514\u2500\\n');\n\n // Step 2: Implement\n console.log(chalk.bold(' Step 2: Implementing to pass tests...\\n'));\n const implResult = await orchestrator.executeLocally(\n `Given these tests, write the MINIMAL implementation to make ALL tests pass. Use diff blocks to show changes.\\n\\nTests:\\n${testCode}\\n\\nTask: \"${tfTask}\"`,\n { model: replState.model }\n );\n const implCode = String(implResult.result || '');\n console.log(chalk.cyan(' \u250C\u2500 Implementation'));\n logger.printWithHighlight(implCode);\n console.log(' \u2514\u2500\\n');\n\n // Step 3: Validate\n console.log(chalk.bold(' Step 3: Validating implementation against tests...\\n'));\n const valResult = await orchestrator.executeLocally(\n `Given tests and implementation, verify:\\n1. Would all tests pass? Walk through each test case.\\n2. Missing edge cases?\\n3. Implementation bugs?\\nVerdict: PASS \u2705 or FAIL \u274C with specific issues.\\n\\nTests:\\n${testCode}\\n\\nImplementation:\\n${implCode}`,\n { model: replState.model }\n );\n console.log(chalk.cyan(' \u250C\u2500 Validation'));\n logger.printWithHighlight(String(valResult.result || ''));\n console.log(' \u2514\u2500\\n');\n\n // Track cost for all 3 steps\n const totalCost = (testResult.costUsd || 0) + (implResult.costUsd || 0) + (valResult.costUsd || 0);\n if (totalCost > 0) {\n await session.trackCost({ model: replState.model, usd: totalCost });\n }\n console.log(chalk.gray(` Total test-first cost: $${totalCost.toFixed(4)}\\n`));\n } catch (err) {\n console.log(chalk.red(`\\n \u2717 Test-first failed: ${(err as Error).message}\\n`));\n }\n return true;\n }\n\n console.log(chalk.red(`\\n \u2717 Unknown command: ${command}. Type /help.\\n`));\n return true;\n };\n\n refreshPrompt();\n rl.prompt();\n\n rl.on('line', async (input: string) => {\n const trimmed = input.trim();\n\n if (!trimmed) {\n rl.prompt();\n return;\n }\n\n if (isCommandProcessing) {\n const isExitCmd = /^\\/(?:exit|quit)\\b/i.test(trimmed);\n if (isExitCmd) {\n pendingExit = true;\n if (process.stdin.isTTY) {\n console.log(chalk.gray('\\n Exiting after current command completes...\\n'));\n }\n return;\n }\n if (!process.stdin.isTTY) {\n // In piped/script mode, ignore overlapping non-exit input quietly.\n return;\n }\n console.log(chalk.yellow('\\n \u23F3 A command prompt is already active. Finish/cancel it first.\\n'));\n rl.prompt();\n return;\n }\n\n let handled = false;\n try {\n isCommandProcessing = true;\n handled = await handleSlashCommand(trimmed);\n } catch (err) {\n console.log(chalk.red(`\\n \u2717 Command failed: ${(err as Error).message}\\n`));\n isCommandProcessing = false;\n if (!isClosing) rl.prompt();\n return;\n }\n isCommandProcessing = false;\n if (pendingExit && !isClosing) {\n pendingExit = false;\n isClosing = true;\n console.log(chalk.cyan('\\n \uD83D\uDC4B Goodbye! Session saved to .crew/\\n'));\n rl.close();\n return;\n }\n if (handled) {\n if (!isClosing) rl.prompt();\n return;\n }\n\n if (isProcessing) {\n console.log(chalk.yellow('\\n \u23F3 Previous message still processing. Please wait or press Ctrl+C to cancel.\\n'));\n rl.prompt();\n return;\n }\n\n isProcessing = true;\n\n // Spinner for thinking indicator\n // Simple thinking indicator (no intervals \u2014 those fight with readline)\n let spinnerActive = false;\n if (process.stdout.isTTY) {\n process.stdout.write(chalk.gray(' \u23F3 Thinking...\\n'));\n spinnerActive = true;\n }\n const stopSpinner = () => {\n if (spinnerActive) {\n spinnerActive = false;\n // Move up one line and clear it\n process.stdout.write('\\x1b[1A\\x1b[2K');\n }\n };\n\n try {\n if (replState.verbose) {\n stopSpinner();\n console.log(chalk.gray(' \u23F3 Routing...'));\n }\n\n let taskInput = trimmed;\n const lower = trimmed.toLowerCase();\n if (/\\b(switch|set|use).*(solo|standalone)\\b/.test(lower)) {\n stopSpinner();\n replState.useGateway = false;\n process.env.CREW_INTERFACE_MODE = 'standalone';\n console.log(chalk.cyan('\\n \u250C\u2500 Response'));\n console.log(chalk.white(' Switched to standalone mode. Local routing/execution is now preferred.'));\n console.log(' \u2514\u2500\\n');\n isProcessing = false;\n rl.prompt();\n return;\n }\n if (/\\b(switch|set|use).*(connected|gateway)\\b/.test(lower)) {\n stopSpinner();\n replState.useGateway = true;\n process.env.CREW_INTERFACE_MODE = 'connected';\n console.log(chalk.cyan('\\n \u250C\u2500 Response'));\n console.log(chalk.white(' Switched to connected mode. Gateway/crew-lead orchestration is now preferred.'));\n console.log(' \u2514\u2500\\n');\n isProcessing = false;\n rl.prompt();\n return;\n }\n\n const modelSummary = buildModelSummary(projectDir, replState);\n const localAnswer = answerLocalMetaQuestion(trimmed, modelSummary);\n if (localAnswer) {\n console.log(chalk.cyan('\\n \u250C\u2500 Response'));\n console.log(chalk.white(` ${localAnswer}`));\n console.log(' \u2514\u2500\\n');\n await session.appendHistory({\n type: 'repl_meta',\n input: trimmed,\n response: localAnswer\n });\n isProcessing = false;\n rl.prompt();\n return;\n }\n // Only intercept genuine meta questions, not actual work requests\n const bootstrapAnswer = answerFromBootstrap(trimmed, modelSummary, repoBootstrap);\n if (bootstrapAnswer) {\n stopSpinner();\n console.log(chalk.cyan('\\n \u250C\u2500 Response'));\n console.log(chalk.white(` ${bootstrapAnswer}`));\n console.log(' \u2514\u2500\\n');\n await session.appendHistory({\n type: 'repl_meta',\n input: trimmed,\n response: bootstrapAnswer\n });\n isProcessing = false;\n rl.prompt();\n return;\n }\n\n const behavior = modeBehavior(replState.mode);\n if (behavior.memoryInject) {\n const recalls = await memoryBroker.recall(trimmed, {\n maxResults: replState.memoryMax,\n includeDocs: true,\n includeCode: false,\n preferSuccessful: true\n });\n if (recalls.length > 0) {\n const memoryContext = await memoryBroker.recallAsContext(trimmed, {\n maxResults: replState.memoryMax,\n includeDocs: true,\n includeCode: false,\n preferSuccessful: true\n });\n taskInput = `${trimmed}\\n\\n${memoryContext}`;\n }\n }\n\n const route = await orchestrator.route(taskInput);\n const agent = route.agent || 'crew-main';\n\n if (replState.verbose) {\n console.log(chalk.gray(` \u2192 ${agent} (${route.decision})`));\n }\n\n if (route.decision === 'CHAT') {\n stopSpinner();\n const responseText = route.response || \n \"I'm crew-cli, a multi-agent coding orchestrator. Ask me to build something, review code, or dispatch to specialists!\";\n console.log(chalk.cyan('\\n \u250C\u2500 Response'));\n logger.printWithHighlight(` ${responseText}`);\n console.log(' \u2514\u2500\\n');\n\n try {\n await session.appendHistory({\n type: 'repl_chat',\n input: trimmed,\n response: responseText\n });\n\n await session.trackCost({\n inputTokens: trimmed.length / 4,\n outputTokens: responseText.length / 4,\n model: 'groq-router',\n costUsd: 0.0001\n });\n } catch {\n // Session tracking is best-effort\n }\n\n isProcessing = false;\n rl.prompt();\n return;\n }\n\n if (behavior.executionConfirm && process.stdin.isTTY) {\n stopSpinner();\n const estimate = estimateCost(taskInput, replState.model || undefined, 1800);\n const answer = await (await getInquirer()).prompt([\n {\n type: 'confirm',\n name: 'ok',\n message: `Execute ${route.decision} via ${agent}? est ~$${estimate.totalUsd.toFixed(4)}`,\n default: true\n }\n ]);\n if (!answer.ok) {\n console.log(chalk.yellow('\\n Skipped execution.\\n'));\n isProcessing = false;\n rl.prompt();\n return;\n }\n }\n\n const dispatchOpts: any = {\n project: projectDir,\n sessionId: await session.getSessionId()\n };\n if (replState.model && replState.model !== 'auto') dispatchOpts.model = replState.model;\n if (replState.engine && replState.engine !== 'auto') dispatchOpts.engine = replState.engine;\n\n // Load session history and format as context for standalone mode\n const standaloneMode = modelSummary.mode === 'standalone';\n let conversationContext = '';\n if (standaloneMode) {\n const sess = await session.loadSession();\n const recentHistory = sess.history.slice(-10); // Last 10 exchanges\n if (recentHistory.length > 0) {\n conversationContext = recentHistory\n .map((entry: any) => {\n const input = entry.input || entry.task || '';\n const output = entry.output || entry.response || entry.result || '';\n if (!input && !output) return '';\n const parts = [];\n if (input) parts.push(`User: ${input}`);\n if (output) parts.push(`Assistant: ${output}`);\n return parts.join('\\n');\n })\n .filter(Boolean)\n .join('\\n\\n');\n }\n }\n\n const useLegacyStandalone = String(process.env.CREW_LEGACY_ROUTER || '').toLowerCase() === 'true';\n const policy = getExecutionPolicy();\n // Stop spinner before execution starts (streaming will take over)\n stopSpinner();\n\n // Tool progress display (visible without verbose mode)\n const toolProgressLog: string[] = [];\n const onToolCall = (name: string, params: Record<string, any>) => {\n const paramHint = params.file_path || params.path || params.command || params.query || '';\n const display = paramHint ? `${name}(${String(paramHint).slice(0, 60)})` : name;\n if (!replState.verbose) {\n console.log(chalk.gray(` \uD83D\uDD27 ${display}`));\n }\n toolProgressLog.push(display);\n };\n\n // Inject onToolCall into orchestrator/executor options if available\n if (dispatchOpts) (dispatchOpts as any).onToolCall = onToolCall;\n\n const result = standaloneMode\n ? (useLegacyStandalone\n ? await withRetries(\n async () => orchestrator.executeLocally(route.task || taskInput, {\n model: dispatchOpts.model\n }),\n policy\n )\n : await withRetries(\n async () => orchestrator.executeAgentic(route.task || taskInput, {\n model: dispatchOpts.model,\n onToolCall,\n conversationContext,\n sessionId: dispatchOpts.sessionId\n }),\n policy\n ))\n : await withRetries(\n async () => router.dispatch(agent, taskInput, dispatchOpts),\n policy\n );\n\n await session.appendHistory({\n type: 'repl_request',\n agent,\n task: taskInput,\n projectDir\n });\n\n await session.appendHistory({\n type: 'repl_result',\n agent,\n success: Boolean(result.success),\n result: result.result\n });\n\n await session.appendRouting({\n route: route.decision,\n model: result.model || replState.model || 'unknown',\n agent: standaloneMode ? 'local-executor' : agent,\n mode: standaloneMode ? 'standalone' : 'connected'\n });\n\n if (result.costUsd && result.model) {\n await session.trackCost({\n model: result.model,\n usd: result.costUsd,\n promptTokens: result.promptTokens || 0,\n completionTokens: result.completionTokens || 0\n });\n }\n\n const responseText = String(result.response || result.result || '');\n console.log(chalk.cyan('\\n \u250C\u2500 Response'));\n logger.printWithHighlight(responseText);\n console.log(' \u2514\u2500');\n\n // Provider + cost footer (novel feature)\n const providerInfo = (result as any).providerId || (result as any).model || replState.model;\n const modelUsed = (result as any).modelUsed || providerInfo;\n const responseCost = (result as any).costUsd || (result as any).cost || 0;\n const turnsUsed = (result as any).turns || 1;\n const toolCount = (result as any).toolsUsed?.length || toolProgressLog.length || 0;\n if (modelUsed || responseCost) {\n const costStr = responseCost > 0 ? `$${Number(responseCost).toFixed(4)}` : 'free';\n console.log(chalk.gray(` \u26A1 ${modelUsed} \u00B7 ${turnsUsed} turn${turnsUsed > 1 ? 's' : ''} \u00B7 ${toolCount} tool${toolCount !== 1 ? 's' : ''} \u00B7 ${costStr}`));\n }\n if (Array.isArray((result as any).timeline) && (result as any).timeline.length > 0) {\n console.log(chalk.gray('\\n Timeline'));\n for (const step of (result as any).timeline) {\n console.log(chalk.gray(` - ${step.phase} @ ${step.ts}`));\n }\n }\n\n const edits = await orchestrator.parseAndApplyToSandbox(responseText);\n if (edits.length > 0) {\n console.log(chalk.yellow(`\\n \u2713 ${edits.length} file(s) changed in sandbox`));\n\n // Animated colored diff preview (premium UX)\n try {\n const activeBranch = sandbox.getActiveBranch();\n if (sandbox.hasChanges(activeBranch)) {\n const rawPreview = sandbox.preview(activeBranch);\n if (rawPreview && rawPreview.length < 5000) { // Only show inline for reasonable diffs\n console.log(chalk.blue(`\\n \u250C\u2500 Diff Preview`));\n const diffLines = rawPreview.split('\\n');\n for (const line of diffLines) {\n let colored: string;\n if (line.startsWith('+++') || line.startsWith('---')) colored = chalk.bold(line);\n else if (line.startsWith('+')) colored = chalk.green(line);\n else if (line.startsWith('-')) colored = chalk.red(line);\n else if (line.startsWith('@@')) colored = chalk.cyan(line);\n else if (line.startsWith('diff') || line.startsWith('index')) colored = chalk.gray(line);\n else colored = line;\n console.log(` ${colored}`);\n // Animated rendering \u2014 slight delay for premium feel (only in TTY)\n if (process.stdout.isTTY) {\n await new Promise(r => setTimeout(r, 8));\n }\n }\n console.log(chalk.blue(` \u2514\u2500`));\n }\n }\n } catch {\n // Diff preview is best-effort\n }\n\n const shouldAutoApply = replState.autoApply || behavior.autoApply;\n await recordReplEvent('autopilot_decision', {\n mode: replState.mode,\n enabled: shouldAutoApply,\n reason: replState.mode === 'autopilot' ? 'mode-autopilot' : (replState.autoApply ? 'auto-apply-toggle' : 'disabled'),\n edits: edits.length\n });\n if (shouldAutoApply) {\n try {\n const activeBranch = sandbox.getActiveBranch();\n const paths = sandbox.getPendingPaths(activeBranch);\n const policy = getExecutionPolicy();\n const report = await analyzeBlastRadius(projectDir, { changedFiles: paths });\n if (isRiskBlocked(report.risk, policy.riskThreshold, policy.forceAutoApply)) {\n const patchRisk = scorePatchRisk({\n blastRadius: report,\n changedFiles: paths.length\n });\n await recordReplEvent('autopilot_apply', {\n mode: replState.mode,\n success: false,\n blockedByRisk: true,\n risk: report.risk,\n threshold: policy.riskThreshold,\n confidence: patchRisk.confidence\n });\n console.log(chalk.red(` \u2717 Auto-apply blocked by risk gate (${report.risk} >= ${policy.riskThreshold})`));\n console.log(chalk.gray(' Use /preview and /apply, or set CREW_FORCE_AUTO_APPLY=true to override.'));\n console.log();\n isProcessing = false;\n rl.prompt();\n return;\n }\n await sandbox.apply(activeBranch);\n await recordReplEvent('autopilot_apply', {\n mode: replState.mode,\n success: true,\n paths\n });\n console.log(chalk.green(` \u2713 Auto-applied to: ${paths.join(', ')}`));\n } catch (applyErr) {\n await recordReplEvent('autopilot_apply', {\n mode: replState.mode,\n success: false,\n error: (applyErr as Error).message\n });\n console.log(chalk.red(` \u2717 Auto-apply failed: ${(applyErr as Error).message}`));\n }\n } else {\n console.log(chalk.gray(' Type /preview to review or /apply to write to disk'));\n }\n console.log();\n }\n\n const cost = await session.loadCost();\n console.log(chalk.gray(` Session cost: $${cost.totalUsd.toFixed(4)}\\n`));\n\n isProcessing = false;\n rl.prompt();\n } catch (err) {\n stopSpinner();\n console.log(chalk.red(`\\n \u2717 Error: ${(err as Error).message}\\n`));\n await session.appendHistory({\n type: 'repl_error',\n task: trimmed,\n error: (err as Error).message\n });\n isProcessing = false;\n rl.prompt();\n }\n });\n\n rl.on('close', async () => {\n await recordReplEvent('session_closed', {\n mode: replState.mode\n });\n if (checkpointEnabled) {\n try {\n await checkpoints.finish(replRunId, 'completed');\n } catch {\n // Best-effort checkpoint close.\n }\n }\n if (process.stdin.isTTY) {\n process.stdin.off('keypress', keypressListener as any);\n }\n console.log(chalk.cyan('\\n Session saved to .crew/ \u2014 run \"crew repl\" to continue.\\n'));\n // Allow readline/inquirer handles to close naturally; avoid forced exit races.\n });\n}\n", "import { resolve, join } from 'node:path';\nimport { AgentKeeper, type MemoryMatch } from './agentkeeper.js';\nimport { AgentMemory, type MemoryFact } from '../pipeline/agent-memory.js';\nimport { buildCollectionIndex, searchCollection, type CollectionChunk } from '../collections/index.js';\n\nexport interface BrokerHit {\n source: 'agentkeeper' | 'agent-memory' | 'collections';\n score: number;\n title: string;\n text: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface BrokerRecallOptions {\n maxResults?: number;\n includeDocs?: boolean;\n includeCode?: boolean;\n docsPaths?: string[];\n preferSuccessful?: boolean;\n pathHints?: string[];\n}\n\nfunction tokenize(text: string): Set<string> {\n return new Set(\n String(text || '')\n .toLowerCase()\n .replace(/[^a-z0-9\\s_-]/g, ' ')\n .split(/\\s+/)\n .filter(t => t.length > 2)\n );\n}\n\nfunction similarity(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 || b.size === 0) return 0;\n let intersection = 0;\n for (const token of a) {\n if (b.has(token)) intersection += 1;\n }\n return intersection / Math.max(a.size, b.size);\n}\n\nfunction mapKeeperHit(m: MemoryMatch): BrokerHit {\n return {\n source: 'agentkeeper',\n score: Number(m.score || 0),\n title: `[${m.entry.tier}] ${m.entry.task}`,\n text: m.entry.result,\n metadata: {\n agent: m.entry.agent,\n runId: m.entry.runId,\n timestamp: m.entry.timestamp\n }\n };\n}\n\nfunction mapFactHit(f: MemoryFact, score: number): BrokerHit {\n return {\n source: 'agent-memory',\n score: Number(score.toFixed(3)),\n title: `[${f.critical ? 'CRITICAL' : 'INFO'}] ${f.tags.join(', ') || 'memory-fact'}`,\n text: f.content,\n metadata: {\n critical: f.critical,\n tags: f.tags,\n timestamp: f.timestamp,\n provider: f.provider\n }\n };\n}\n\nfunction mapCollectionHit(c: CollectionChunk): BrokerHit {\n return {\n source: 'collections',\n score: Number(c.score || 0),\n title: `${c.source}:${c.startLine}`,\n text: c.text,\n metadata: {\n path: c.source,\n startLine: c.startLine\n }\n };\n}\n\nfunction normalizeCollectionPathForDedupe(input: string): string {\n const value = String(input || '').replace(/\\\\/g, '/').replace(/^\\.\\/+/, '');\n if (value.startsWith('docs/')) return value.slice('docs/'.length);\n return value;\n}\n\nexport class MemoryBroker {\n private readonly projectDir: string;\n private readonly keeper: AgentKeeper;\n private readonly factMemory: AgentMemory;\n private readonly docsIndexCache = new Map<string, Awaited<ReturnType<typeof buildCollectionIndex>>>();\n\n constructor(projectDir: string, options: { crewId?: string; storageDir?: string } = {}) {\n this.projectDir = resolve(projectDir);\n this.keeper = new AgentKeeper(this.projectDir, {\n storageDir: options.storageDir || process.env.CREW_MEMORY_DIR\n });\n this.factMemory = new AgentMemory(options.crewId || 'crew-lead', {\n storageDir: options.storageDir || process.env.CREW_MEMORY_DIR || this.projectDir\n });\n }\n\n private scoreFacts(query: string, facts: MemoryFact[], max: number): BrokerHit[] {\n const queryTokens = tokenize(query);\n const scored = facts.map(f => {\n const sim = similarity(queryTokens, tokenize(f.content));\n const criticalBoost = f.critical ? 0.3 : 0; // Increased from 0.1\n const tagBoost = f.tags.some(t => query.toLowerCase().includes(t.toLowerCase())) ? 0.15 : 0;\n return { fact: f, score: sim + criticalBoost + tagBoost };\n }).filter(x => x.score > 0.08); // Lowered from 0.12 to catch critical facts\n\n // Force critical facts to top even if similarity is lower\n scored.sort((a, b) => {\n if (a.fact.critical && !b.fact.critical) return -1;\n if (!a.fact.critical && b.fact.critical) return 1;\n return b.score - a.score;\n });\n \n return scored.slice(0, max).map(x => mapFactHit(x.fact, x.score));\n }\n\n private async getDocsIndex(paths: string[], includeCode: boolean) {\n const key = `${paths.map(p => resolve(p)).join('|')}::${includeCode ? 'code' : 'docs'}`;\n if (this.docsIndexCache.has(key)) return this.docsIndexCache.get(key)!;\n const idx = await buildCollectionIndex(paths, { includeCode });\n this.docsIndexCache.set(key, idx);\n return idx;\n }\n\n async recall(query: string, options: BrokerRecallOptions = {}): Promise<BrokerHit[]> {\n const maxResults = Math.max(1, Number(options.maxResults || 5));\n const includeDocs = options.includeDocs !== false;\n const includeCode = Boolean(options.includeCode);\n const docsPaths = (options.docsPaths && options.docsPaths.length > 0)\n ? options.docsPaths\n : [join(this.projectDir, 'docs'), this.projectDir];\n\n const [keeperHits, factHits, collectionHits] = await Promise.all([\n this.keeper.recall(query, Math.max(maxResults, 8), {\n preferSuccessful: options.preferSuccessful !== false,\n pathHints: options.pathHints || []\n }),\n this.factMemory.search(query, { maxResults: Math.max(maxResults, 8) }),\n includeDocs\n ? (async () => {\n const index = await this.getDocsIndex(docsPaths, includeCode);\n return searchCollection(index, query, Math.max(maxResults, 8)).hits;\n })()\n : Promise.resolve([])\n ]);\n\n const merged = [\n ...keeperHits.map(mapKeeperHit),\n ...this.scoreFacts(query, factHits, Math.max(maxResults, 8)),\n ...collectionHits.map(mapCollectionHit)\n ];\n\n merged.sort((a, b) => b.score - a.score);\n\n // Dedupe near-identical collection hits that appear when both docs/ and repo root\n // are indexed together (same chunk can be surfaced twice with different source paths).\n const seen = new Set<string>();\n const deduped: BrokerHit[] = [];\n for (const hit of merged) {\n let signature = `${hit.source}|${hit.title}|${hit.text.slice(0, 180)}`;\n if (hit.source === 'collections') {\n const path = normalizeCollectionPathForDedupe(String(hit.metadata?.path || hit.title.split(':')[0] || ''));\n const startLine = Number(hit.metadata?.startLine || 0);\n signature = `${hit.source}|${path}|${startLine}|${hit.text.slice(0, 220)}`;\n }\n if (seen.has(signature)) continue;\n seen.add(signature);\n deduped.push(hit);\n if (deduped.length >= maxResults) break;\n }\n return deduped;\n }\n\n async recallAsContext(query: string, options: BrokerRecallOptions = {}): Promise<string> {\n const hits = await this.recall(query, options);\n if (hits.length === 0) return '';\n const lines = ['## Shared Memory + RAG Context'];\n for (const h of hits) {\n const preview = h.text.length > 260 ? `${h.text.slice(0, 260)}...` : h.text;\n lines.push(`### [${h.source}] ${h.title} (score: ${h.score.toFixed(3)})`);\n lines.push(preview);\n lines.push('');\n }\n return lines.join('\\n');\n }\n}\n", "import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface CheckpointEvent {\n ts: string;\n type: string;\n data?: Record<string, unknown>;\n}\n\nexport interface CheckpointRun {\n runId: string;\n mode: 'plan' | 'dispatch' | 'auto' | 'repl';\n task: string;\n createdAt: string;\n updatedAt: string;\n status: 'running' | 'completed' | 'failed';\n events: CheckpointEvent[];\n}\n\nexport class CheckpointStore {\n private dir: string;\n\n constructor(baseDir = process.cwd()) {\n this.dir = join(baseDir, '.crew', 'checkpoints');\n }\n\n private filePath(runId: string) {\n return join(this.dir, `${runId}.json`);\n }\n\n async beginRun(run: Omit<CheckpointRun, 'createdAt' | 'updatedAt' | 'events' | 'status'>) {\n await mkdir(this.dir, { recursive: true });\n const now = new Date().toISOString();\n const payload: CheckpointRun = {\n ...run,\n createdAt: now,\n updatedAt: now,\n status: 'running',\n events: []\n };\n await writeFile(this.filePath(run.runId), JSON.stringify(payload, null, 2), 'utf8');\n return payload;\n }\n\n async append(runId: string, type: string, data: Record<string, unknown> = {}) {\n const run = await this.load(runId);\n if (!run) return false;\n run.events.push({\n ts: new Date().toISOString(),\n type,\n data\n });\n run.updatedAt = new Date().toISOString();\n await writeFile(this.filePath(runId), JSON.stringify(run, null, 2), 'utf8');\n return true;\n }\n\n async finish(runId: string, status: 'completed' | 'failed') {\n const run = await this.load(runId);\n if (!run) return false;\n run.status = status;\n run.updatedAt = new Date().toISOString();\n await writeFile(this.filePath(runId), JSON.stringify(run, null, 2), 'utf8');\n return true;\n }\n\n async load(runId: string): Promise<CheckpointRun | null> {\n try {\n const raw = await readFile(this.filePath(runId), 'utf8');\n return JSON.parse(raw);\n } catch {\n return null;\n }\n }\n\n async list(limit = 20): Promise<CheckpointRun[]> {\n if (!existsSync(this.dir)) return [];\n const files = (await readdir(this.dir))\n .filter(f => f.endsWith('.json'))\n .slice(-Math.max(1, limit));\n const runs: CheckpointRun[] = [];\n for (const file of files) {\n try {\n const raw = await readFile(join(this.dir, file), 'utf8');\n runs.push(JSON.parse(raw));\n } catch {\n // skip broken files\n }\n }\n runs.sort((a, b) => Date.parse(b.updatedAt) - Date.parse(a.updatedAt));\n return runs;\n }\n\n static completedPlanSteps(run: CheckpointRun): number[] {\n const ids = new Set<number>();\n for (const ev of run.events) {\n if (ev.type === 'plan.step.completed') {\n const stepId = Number((ev.data || {}).stepId || 0);\n if (Number.isFinite(stepId) && stepId > 0) ids.add(stepId);\n }\n }\n return Array.from(ids).sort((a, b) => a - b);\n }\n}\n", "import type { BlastRadiusReport } from '../blast-radius/index.js';\n\nexport interface PatchRiskAssessment {\n riskScore: number; // 0..100\n confidenceScore: number;\n // Backward-compatible aliases used by CLI output paths.\n confidence: number;\n riskLevel: 'low' | 'medium' | 'high';\n level: 'low' | 'medium' | 'high';\n reasons: string[];\n}\n\nexport function scorePatchRisk(input: {\n blastRadius?: Partial<BlastRadiusReport> | null;\n validationPassed?: boolean;\n changedFiles?: number;\n failedSteps?: number;\n risk?: 'low' | 'medium' | 'high';\n summary?: string;\n changedFilesList?: string[];\n}): PatchRiskAssessment {\n const reasons: string[] = [];\n let risk = 0.2;\n\n const changedFiles = Number(input.changedFiles || input.changedFilesList?.length || 0);\n if (changedFiles >= 12) {\n risk += 0.25;\n reasons.push('large-change-set');\n } else if (changedFiles >= 5) {\n risk += 0.15;\n reasons.push('medium-change-set');\n }\n\n const blast = input.blastRadius || input;\n const blastRisk = String((blast as any)?.risk || '').toLowerCase();\n if (blastRisk === 'high') {\n risk += 0.35;\n reasons.push('high-blast-radius');\n } else if (blastRisk === 'medium') {\n risk += 0.2;\n reasons.push('medium-blast-radius');\n }\n\n if (Number(input.failedSteps || 0) > 0) {\n risk += 0.2;\n reasons.push('failed-plan-steps');\n }\n\n if (input.validationPassed === false) {\n risk += 0.25;\n reasons.push('validation-failed');\n } else if (input.validationPassed === true) {\n risk -= 0.1;\n reasons.push('validation-passed');\n } else {\n reasons.push('validation-unknown');\n }\n\n const boundedRisk = Math.max(0, Math.min(1, risk));\n const confidenceScore = Math.max(0, Math.min(1, 1 - boundedRisk));\n const level: 'low' | 'medium' | 'high' = boundedRisk >= 0.75\n ? 'high'\n : boundedRisk >= 0.45\n ? 'medium'\n : 'low';\n\n const riskScore = Number((boundedRisk * 100).toFixed(1));\n return {\n riskScore,\n confidenceScore: Number(confidenceScore.toFixed(3)),\n confidence: Number(confidenceScore.toFixed(3)),\n riskLevel: level,\n level,\n reasons\n };\n}\n", "import { startRepl, type ReplOptions } from '../repl/index.js';\n\n/**\n * TUI adapter.\n * Reuses the same REPL runtime/controller so routing, orchestration,\n * sandbox, memory, and safety behavior stay in one code path.\n */\nexport async function startTui(options: ReplOptions): Promise<void> {\n process.env.CREW_UI_MODE = 'tui';\n await startRepl({\n ...options,\n uiMode: 'tui'\n });\n}\n", "import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface XSearchOptions {\n model?: string;\n fromDate?: string;\n toDate?: string;\n allowedHandles?: string[];\n excludedHandles?: string[];\n enableImages?: boolean;\n enableVideos?: boolean;\n}\n\nexport interface XSearchResult {\n text: string;\n citations: string[];\n raw: any;\n}\n\nfunction getXaiApiKey(): string | null {\n if (process.env.XAI_API_KEY) return process.env.XAI_API_KEY;\n if (process.env.GROK_API_KEY) return process.env.GROK_API_KEY;\n const cfgPath = join(homedir(), '.crewswarm', 'crewswarm.json');\n if (!existsSync(cfgPath)) return null;\n try {\n const raw = readFileSync(cfgPath, 'utf8');\n const cfg = JSON.parse(raw);\n return cfg?.providers?.xai?.apiKey || null;\n } catch {\n return null;\n }\n}\n\nfunction coerceDate(value?: string): string | undefined {\n if (!value) return undefined;\n const d = new Date(value);\n if (!Number.isFinite(d.getTime())) return undefined;\n return d.toISOString().slice(0, 10);\n}\n\nexport async function runXSearch(query: string, options: XSearchOptions = {}): Promise<XSearchResult> {\n const apiKey = getXaiApiKey();\n if (!apiKey) {\n throw new Error('Missing xAI API key. Set XAI_API_KEY or ~/.crewswarm/crewswarm.json providers.xai.apiKey');\n }\n const model = options.model || 'grok-4-1-fast-reasoning';\n const tool: Record<string, unknown> = { type: 'x_search' };\n const fromDate = coerceDate(options.fromDate);\n const toDate = coerceDate(options.toDate);\n if (fromDate) tool.from_date = fromDate;\n if (toDate) tool.to_date = toDate;\n if (options.allowedHandles && options.allowedHandles.length > 0) tool.allowed_x_handles = options.allowedHandles;\n if (options.excludedHandles && options.excludedHandles.length > 0) tool.excluded_x_handles = options.excludedHandles;\n if (typeof options.enableImages === 'boolean') tool.enable_image_understanding = options.enableImages;\n if (typeof options.enableVideos === 'boolean') tool.enable_video_understanding = options.enableVideos;\n\n const response = await fetch('https://api.x.ai/v1/responses', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n model,\n input: [{ role: 'user', content: query }],\n tools: [tool]\n })\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`xAI request failed (${response.status}): ${text.slice(0, 300)}`);\n }\n\n const raw = await response.json() as any;\n const outputs = Array.isArray(raw?.output) ? raw.output : [];\n let text = '';\n for (const o of outputs) {\n const content = Array.isArray(o?.content) ? o.content : [];\n for (const c of content) {\n if (typeof c?.text === 'string' && c.text.trim()) {\n text += (text ? '\\n\\n' : '') + c.text.trim();\n }\n }\n }\n const citations = Array.isArray(raw?.citations)\n ? raw.citations.map((c: any) => String(c?.url || c || '')).filter(Boolean)\n : [];\n return {\n text: text || 'No textual response.',\n citations,\n raw\n };\n}\n\n", "// @ts-nocheck\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface RepoConfig {\n cli?: {\n model?: string;\n engine?: string;\n preferredEngines?: string[];\n fallbackModels?: string[];\n docsCode?: boolean;\n memoryMax?: number;\n };\n repl?: {\n model?: string;\n engine?: string;\n autoApply?: boolean;\n memoryMax?: number;\n mode?: 'manual' | 'assist' | 'autopilot';\n bannerEnabled?: boolean;\n animatedBanner?: boolean;\n bannerFirstLaunchOnly?: boolean;\n };\n slashAliases?: Record<string, string>;\n}\n\nconst DEFAULT_CONFIG: Required<RepoConfig> = {\n cli: {\n model: '',\n engine: '',\n preferredEngines: [],\n fallbackModels: [],\n docsCode: false,\n memoryMax: 3\n },\n repl: {\n model: 'deepseek-chat',\n engine: 'auto',\n autoApply: false,\n memoryMax: 5,\n mode: 'manual',\n bannerEnabled: true,\n animatedBanner: true,\n bannerFirstLaunchOnly: true\n },\n slashAliases: {}\n};\n\nconst SECRET_KEY_RE = /(api[_-]?key|token|secret|password|bearer|auth)/i;\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return Boolean(v) && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction deepMerge<T extends Record<string, any>>(base: T, overlay: Record<string, any>): T {\n const out: Record<string, unknown> = { ...base };\n for (const [k, v] of Object.entries(overlay || {})) {\n const existing = out[k];\n if (isObject(existing) && isObject(v)) {\n out[k] = deepMerge(existing, v);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\nfunction parseJsonOrEmpty(raw: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw);\n return isObject(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction configPath(baseDir: string, scope: 'team' | 'user') {\n return join(baseDir, '.crew', scope === 'team' ? 'crewswarm.json' : 'config.local.json');\n}\n\nfunction assertNoSecrets(input: unknown, prefix = '') {\n if (Array.isArray(input)) {\n for (let i = 0; i < input.length; i++) {\n assertNoSecrets(input[i], `${prefix}[${i}]`);\n }\n return;\n }\n if (!isObject(input)) return;\n for (const [k, v] of Object.entries(input)) {\n const path = prefix ? `${prefix}.${k}` : k;\n if (SECRET_KEY_RE.test(k)) {\n throw new Error(`Secret-like key not allowed in repo team config: ${path}`);\n }\n assertNoSecrets(v, path);\n }\n}\n\nfunction redactSecrets(input: unknown): unknown {\n if (Array.isArray(input)) return input.map(redactSecrets);\n if (!isObject(input)) return input;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input)) {\n if (SECRET_KEY_RE.test(k)) {\n out[k] = '[REDACTED]';\n } else {\n out[k] = redactSecrets(v);\n }\n }\n return out;\n}\n\nexport async function readRepoConfig(baseDir: string, scope: 'team' | 'user'): Promise<Record<string, unknown>> {\n const path = configPath(baseDir, scope);\n if (!existsSync(path)) return {};\n const raw = await readFile(path, 'utf8');\n return parseJsonOrEmpty(raw);\n}\n\nexport async function loadResolvedRepoConfig(baseDir = process.cwd()): Promise<Required<RepoConfig>> {\n const team = await readRepoConfig(baseDir, 'team');\n const user = await readRepoConfig(baseDir, 'user');\n return deepMerge(deepMerge(DEFAULT_CONFIG, team), user);\n}\n\nexport async function writeRepoConfig(baseDir: string, scope: 'team' | 'user', config: Record<string, unknown>) {\n const path = configPath(baseDir, scope);\n await mkdir(join(baseDir, '.crew'), { recursive: true });\n if (scope === 'team') {\n assertNoSecrets(config);\n }\n await writeFile(path, JSON.stringify(config, null, 2), 'utf8');\n}\n\nexport async function setRepoConfigValue(\n baseDir: string,\n scope: 'team' | 'user',\n keyPath: string,\n value: unknown\n) {\n if (scope === 'team' && SECRET_KEY_RE.test(keyPath)) {\n throw new Error(`Secret-like key not allowed in repo team config: ${keyPath}`);\n }\n const current = await readRepoConfig(baseDir, scope);\n const parts = keyPath.split('.').filter(Boolean);\n if (parts.length === 0) throw new Error('Invalid key path');\n let cursor: Record<string, unknown> = current;\n for (let i = 0; i < parts.length - 1; i++) {\n const k = parts[i];\n const next = cursor[k];\n if (!isObject(next)) {\n cursor[k] = {};\n }\n cursor = cursor[k] as Record<string, unknown>;\n }\n cursor[parts[parts.length - 1]] = value;\n await writeRepoConfig(baseDir, scope, current);\n}\n\nexport function getNestedValue(source: Record<string, unknown>, keyPath: string): unknown {\n const parts = keyPath.split('.').filter(Boolean);\n let cursor: any = source;\n for (const p of parts) {\n if (!isObject(cursor) && !Array.isArray(cursor)) return undefined;\n cursor = cursor[p];\n if (cursor === undefined) return undefined;\n }\n return cursor;\n}\n\nexport function redactRepoConfigForDisplay<T>(value: T): T {\n return redactSecrets(value) as T;\n}\n", "import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport type GitHubIntent =\n | { kind: 'issue_list'; state: 'open' | 'closed' | 'all'; limit: number }\n | { kind: 'issue_create'; title: string; body: string }\n | { kind: 'issue_update'; number: number; title?: string; body?: string; state?: 'open' | 'closed' }\n | { kind: 'pr_list'; state: 'open' | 'closed' | 'merged'; limit: number }\n | { kind: 'pr_draft'; title: string; body: string; base?: string; head?: string }\n | { kind: 'unknown'; reason: string };\n\nexport interface ParseGitHubIntentOptions {\n defaultLimit?: number;\n}\n\nfunction readQuoted(text: string): string {\n const m = text.match(/\"([^\"]+)\"/);\n return (m?.[1] || '').trim();\n}\n\nfunction readAfter(text: string, marker: string): string {\n const idx = text.toLowerCase().indexOf(marker.toLowerCase());\n if (idx < 0) return '';\n return text.slice(idx + marker.length).trim();\n}\n\nfunction parseLimit(text: string, fallback: number): number {\n const m = text.match(/\\b(?:limit|top|first)\\s+(\\d+)\\b/i);\n if (!m) return fallback;\n const value = Number.parseInt(m[1], 10);\n return Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nexport function parseGitHubIntent(input: string, options: ParseGitHubIntentOptions = {}): GitHubIntent {\n const text = String(input || '').trim();\n const lower = text.toLowerCase();\n const defaultLimit = Math.max(1, Number(options.defaultLimit || 10));\n\n if (!text) return { kind: 'unknown', reason: 'Empty request.' };\n\n if ((/\\b(list|show|get)\\b/.test(lower) && /\\bissues?\\b/.test(lower)) || lower.startsWith('issues')) {\n const state = lower.includes('closed') ? 'closed' : lower.includes('all') ? 'all' : 'open';\n return { kind: 'issue_list', state, limit: parseLimit(text, defaultLimit) };\n }\n\n if ((/\\b(list|show|get)\\b/.test(lower) && /\\b(pr|pull request|pull requests)\\b/.test(lower)) || lower.startsWith('prs')) {\n const state = lower.includes('merged')\n ? 'merged'\n : lower.includes('closed')\n ? 'closed'\n : 'open';\n return { kind: 'pr_list', state, limit: parseLimit(text, defaultLimit) };\n }\n\n if (/\\b(update|edit|close|reopen)\\b/.test(lower) && /\\bissue\\b/.test(lower)) {\n const num = text.match(/#(\\d+)/)?.[1] || text.match(/\\bissue\\s+(\\d+)\\b/i)?.[1];\n if (!num) return { kind: 'unknown', reason: 'Issue update requires an issue number (e.g. #123).' };\n const parsedNumber = Number.parseInt(num, 10);\n const title = readQuoted(text);\n const body = readAfter(text, 'body:');\n let state: 'open' | 'closed' | undefined;\n if (/\\bclose\\b/.test(lower)) state = 'closed';\n if (/\\breopen\\b/.test(lower)) state = 'open';\n return {\n kind: 'issue_update',\n number: parsedNumber,\n title: title || undefined,\n body: body || undefined,\n state\n };\n }\n\n if ((/\\b(create|open|file)\\b/.test(lower) && /\\bissue\\b/.test(lower)) || lower.startsWith('issue create')) {\n const quoted = readQuoted(text);\n const title = quoted || readAfter(text, 'issue').replace(/^create\\s*/i, '').trim();\n const body = readAfter(text, 'body:');\n if (!title) return { kind: 'unknown', reason: 'Issue create requires a title (quote it for best parsing).' };\n return { kind: 'issue_create', title, body: body || '' };\n }\n\n if (/\\b(create|open|draft)\\b/.test(lower) && /\\b(pr|pull request)\\b/.test(lower)) {\n const title = readQuoted(text) || readAfter(text, 'pr').replace(/^create\\s*/i, '').trim();\n const body = readAfter(text, 'body:');\n const base = text.match(/\\bbase:([A-Za-z0-9_./-]+)/i)?.[1];\n const head = text.match(/\\bhead:([A-Za-z0-9_./-]+)/i)?.[1];\n if (!title) return { kind: 'unknown', reason: 'Draft PR create requires a title (quote it for best parsing).' };\n return { kind: 'pr_draft', title, body: body || '', base, head };\n }\n\n return { kind: 'unknown', reason: 'Could not infer GitHub action. Try list/create/update issue or list/create PR.' };\n}\n\nasync function runGh(args: string[], cwd = process.cwd()): Promise<string> {\n try {\n const { stdout, stderr } = await execFileAsync('gh', args, {\n cwd,\n maxBuffer: 1024 * 1024 * 8\n });\n const out = String(stdout || '').trim();\n const err = String(stderr || '').trim();\n return out || err;\n } catch (error) {\n const message = String((error as any)?.stderr || (error as Error).message || error);\n if (/enoent|not found/i.test(message)) {\n throw new Error('GitHub CLI (gh) not found. Install gh and run `gh auth login`.');\n }\n throw new Error(message.trim() || 'GitHub command failed');\n }\n}\n\nexport interface ExecuteGitHubIntentOptions {\n cwd?: string;\n repo?: string;\n}\n\nexport function buildGitHubCommand(intent: GitHubIntent, repo?: string): string[] {\n const repoArgs = repo ? ['--repo', repo] : [];\n\n if (intent.kind === 'issue_list') {\n return ['issue', 'list', '--state', intent.state, '--limit', String(intent.limit), '--json', 'number,title,state,url', ...repoArgs];\n }\n if (intent.kind === 'pr_list') {\n return ['pr', 'list', '--state', intent.state, '--limit', String(intent.limit), '--json', 'number,title,state,url', ...repoArgs];\n }\n if (intent.kind === 'issue_create') {\n return ['issue', 'create', '--title', intent.title, '--body', intent.body || '', ...repoArgs];\n }\n if (intent.kind === 'issue_update') {\n const args = ['issue', 'edit', String(intent.number), ...repoArgs];\n if (intent.title) args.push('--title', intent.title);\n if (intent.body) args.push('--body', intent.body);\n if (intent.state) args.push('--state', intent.state);\n return args;\n }\n if (intent.kind === 'pr_draft') {\n const args = ['pr', 'create', '--draft', '--title', intent.title, '--body', intent.body || '', ...repoArgs];\n if (intent.base) args.push('--base', intent.base);\n if (intent.head) args.push('--head', intent.head);\n return args;\n }\n throw new Error(intent.reason || 'Unknown GitHub request');\n}\n\nexport function commandToShell(args: string[]): string {\n const q = (value: string) => {\n if (!/[\\s\"'$`\\\\]/.test(value)) return value;\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n };\n return `gh ${args.map(q).join(' ')}`;\n}\n\nexport async function executeGitHubIntent(intent: GitHubIntent, options: ExecuteGitHubIntentOptions = {}): Promise<string> {\n const cwd = options.cwd || process.cwd();\n const args = buildGitHubCommand(intent, options.repo);\n return runGh(args, cwd);\n}\n\nexport function requiresConfirmation(intent: GitHubIntent): boolean {\n return intent.kind === 'issue_create' || intent.kind === 'issue_update' || intent.kind === 'pr_draft';\n}\n\nexport function describeIntent(intent: GitHubIntent): string {\n if (intent.kind === 'issue_list') return `List ${intent.state} issues (limit ${intent.limit})`;\n if (intent.kind === 'pr_list') return `List ${intent.state} PRs (limit ${intent.limit})`;\n if (intent.kind === 'issue_create') return `Create issue: \"${intent.title}\"`;\n if (intent.kind === 'issue_update') return `Update issue #${intent.number}`;\n if (intent.kind === 'pr_draft') return `Create draft PR: \"${intent.title}\"`;\n return `Unknown: ${intent.reason}`;\n}\n\nexport interface GitHubDoctorCheck {\n name: string;\n ok: boolean;\n details: string;\n}\n\nexport async function runGitHubDoctor(cwd = process.cwd(), repo?: string): Promise<GitHubDoctorCheck[]> {\n const checks: GitHubDoctorCheck[] = [];\n try {\n const { stdout } = await execFileAsync('gh', ['--version'], { cwd, maxBuffer: 1024 * 1024 });\n checks.push({\n name: 'gh installed',\n ok: true,\n details: String(stdout || '').split('\\n')[0] || 'ok'\n });\n } catch (error) {\n checks.push({\n name: 'gh installed',\n ok: false,\n details: /enoent|not found/i.test(String((error as any)?.message || ''))\n ? 'gh not found in PATH'\n : String((error as Error).message || error)\n });\n checks.push({\n name: 'gh auth status',\n ok: false,\n details: 'skipped (gh missing)'\n });\n checks.push({\n name: 'repo access baseline',\n ok: false,\n details: 'skipped (gh missing)'\n });\n return checks;\n }\n\n try {\n const { stdout, stderr } = await execFileAsync('gh', ['auth', 'status'], {\n cwd,\n maxBuffer: 1024 * 1024\n });\n const info = String(stdout || stderr || '').trim();\n checks.push({\n name: 'gh auth status',\n ok: true,\n details: info.split('\\n')[0] || 'authenticated'\n });\n } catch (error) {\n checks.push({\n name: 'gh auth status',\n ok: false,\n details: String((error as any)?.stderr || (error as Error).message || error).trim()\n });\n }\n\n const repoArgs = repo ? ['--repo', repo] : [];\n try {\n const { stdout } = await execFileAsync(\n 'gh',\n ['repo', 'view', ...repoArgs, '--json', 'nameWithOwner,viewerPermission'],\n { cwd, maxBuffer: 1024 * 1024 }\n );\n const parsed = JSON.parse(String(stdout || '{}'));\n const perm = String(parsed.viewerPermission || 'unknown');\n const name = String(parsed.nameWithOwner || repo || '(current)');\n checks.push({\n name: 'repo access baseline',\n ok: true,\n details: `${name} (${perm})`\n });\n } catch (error) {\n checks.push({\n name: 'repo access baseline',\n ok: false,\n details: String((error as any)?.stderr || (error as Error).message || error).trim()\n });\n }\n\n return checks;\n}\n", "import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nexport interface TierPolicy {\n primary?: string;\n fallback?: string[];\n maxCostUsd?: number;\n}\n\nexport interface ModelPolicy {\n tiers?: {\n planner?: TierPolicy;\n executor?: TierPolicy;\n worker?: TierPolicy;\n };\n}\n\nfunction sanitizeTier(input: unknown): TierPolicy {\n const out: TierPolicy = {};\n if (!input || typeof input !== 'object') return out;\n const item = input as Record<string, unknown>;\n if (typeof item.primary === 'string') out.primary = item.primary.trim();\n if (Array.isArray(item.fallback)) {\n out.fallback = item.fallback\n .map(v => String(v || '').trim())\n .filter(Boolean);\n }\n if (typeof item.maxCostUsd === 'number' && Number.isFinite(item.maxCostUsd) && item.maxCostUsd >= 0) {\n out.maxCostUsd = item.maxCostUsd;\n }\n return out;\n}\n\nexport async function loadModelPolicy(baseDir = process.cwd()): Promise<ModelPolicy> {\n const path = join(baseDir, '.crew', 'model-policy.json');\n if (!existsSync(path)) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(await readFile(path, 'utf8'));\n } catch {\n return {};\n }\n if (!parsed || typeof parsed !== 'object') return {};\n const obj = parsed as Record<string, unknown>;\n const tiers = (obj.tiers && typeof obj.tiers === 'object') ? (obj.tiers as Record<string, unknown>) : {};\n return {\n tiers: {\n planner: sanitizeTier(tiers.planner),\n executor: sanitizeTier(tiers.executor),\n worker: sanitizeTier(tiers.worker)\n }\n };\n}\n", "import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\n\nexport type AutoFixJobStatus = 'queued' | 'running' | 'completed' | 'failed' | 'canceled';\nexport type AutoFixApplyPolicy = 'never' | 'safe' | 'force';\n\nexport interface AutoFixJobConfig {\n maxIterations: number;\n model?: string;\n fallbackModels: string[];\n gateway?: string;\n validateCommands: string[];\n autoApplyPolicy: AutoFixApplyPolicy;\n blastRadiusThreshold: 'low' | 'medium' | 'high';\n lspAutoFix: boolean;\n lspAutoFixMaxAttempts: number;\n}\n\nexport interface AutoFixJob {\n id: string;\n task: string;\n projectDir: string;\n status: AutoFixJobStatus;\n createdAt: string;\n updatedAt: string;\n startedAt?: string;\n finishedAt?: string;\n workerId?: string;\n error?: string;\n config: AutoFixJobConfig;\n result?: Record<string, any>;\n}\n\ninterface AutoFixState {\n version: 1;\n jobs: AutoFixJob[];\n}\n\nconst DEFAULT_STATE: AutoFixState = {\n version: 1,\n jobs: []\n};\n\nfunction createDefaultState(): AutoFixState {\n return {\n version: 1,\n jobs: []\n };\n}\n\nexport class AutoFixStore {\n private readonly dir: string;\n private readonly file: string;\n\n constructor(baseDir = process.cwd()) {\n this.dir = join(baseDir, '.crew', 'autofix');\n this.file = join(this.dir, 'queue.json');\n }\n\n private async readState(): Promise<AutoFixState> {\n if (!existsSync(this.file)) return createDefaultState();\n try {\n const raw = await readFile(this.file, 'utf8');\n const parsed = JSON.parse(raw) as AutoFixState;\n if (!Array.isArray(parsed.jobs)) return createDefaultState();\n return {\n version: 1,\n jobs: parsed.jobs.map(job => this.sanitizeJob(job)).filter(Boolean) as AutoFixJob[]\n };\n } catch {\n return createDefaultState();\n }\n }\n\n private sanitizeJob(job: Partial<AutoFixJob>): AutoFixJob | null {\n if (!job || typeof job.id !== 'string' || typeof job.task !== 'string') return null;\n const now = new Date().toISOString();\n return {\n id: job.id,\n task: String(job.task || '').trim(),\n projectDir: String(job.projectDir || process.cwd()),\n status: this.sanitizeStatus(job.status),\n createdAt: String(job.createdAt || now),\n updatedAt: String(job.updatedAt || now),\n startedAt: job.startedAt,\n finishedAt: job.finishedAt,\n workerId: job.workerId,\n error: job.error,\n config: {\n maxIterations: Math.max(1, Number(job.config?.maxIterations || 6)),\n model: typeof job.config?.model === 'string' && job.config.model.trim().length > 0 ? job.config.model.trim() : undefined,\n fallbackModels: Array.isArray(job.config?.fallbackModels) ? job.config!.fallbackModels.map(v => String(v || '').trim()).filter(Boolean) : [],\n gateway: typeof job.config?.gateway === 'string' && job.config.gateway.trim().length > 0 ? job.config.gateway.trim() : undefined,\n validateCommands: Array.isArray(job.config?.validateCommands) ? job.config!.validateCommands.map(v => String(v || '').trim()).filter(Boolean) : [],\n autoApplyPolicy: this.sanitizePolicy(job.config?.autoApplyPolicy),\n blastRadiusThreshold: this.sanitizeThreshold(job.config?.blastRadiusThreshold),\n lspAutoFix: Boolean(job.config?.lspAutoFix),\n lspAutoFixMaxAttempts: Math.max(1, Number(job.config?.lspAutoFixMaxAttempts || 3))\n },\n result: job.result && typeof job.result === 'object' ? job.result : undefined\n };\n }\n\n private sanitizeStatus(status: unknown): AutoFixJobStatus {\n const value = String(status || 'queued').toLowerCase();\n if (value === 'running' || value === 'completed' || value === 'failed' || value === 'canceled') return value;\n return 'queued';\n }\n\n private sanitizePolicy(policy: unknown): AutoFixApplyPolicy {\n const value = String(policy || 'safe').toLowerCase();\n if (value === 'never' || value === 'force') return value;\n return 'safe';\n }\n\n private sanitizeThreshold(level: unknown): 'low' | 'medium' | 'high' {\n const value = String(level || 'high').toLowerCase();\n if (value === 'low' || value === 'medium') return value;\n return 'high';\n }\n\n private async writeState(state: AutoFixState): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n await writeFile(this.file, JSON.stringify(state, null, 2), 'utf8');\n }\n\n async enqueue(input: {\n task: string;\n projectDir?: string;\n config?: Partial<AutoFixJobConfig>;\n }): Promise<AutoFixJob> {\n const now = new Date().toISOString();\n const state = await this.readState();\n const job = this.sanitizeJob({\n id: `af-${randomUUID()}`,\n task: String(input.task || '').trim(),\n projectDir: input.projectDir || process.cwd(),\n status: 'queued',\n createdAt: now,\n updatedAt: now,\n config: {\n maxIterations: Math.max(1, Number(input.config?.maxIterations || 6)),\n model: input.config?.model,\n fallbackModels: input.config?.fallbackModels || [],\n gateway: input.config?.gateway,\n validateCommands: input.config?.validateCommands || [],\n autoApplyPolicy: this.sanitizePolicy(input.config?.autoApplyPolicy),\n blastRadiusThreshold: this.sanitizeThreshold(input.config?.blastRadiusThreshold),\n lspAutoFix: Boolean(input.config?.lspAutoFix),\n lspAutoFixMaxAttempts: Math.max(1, Number(input.config?.lspAutoFixMaxAttempts || 3))\n }\n });\n if (!job) throw new Error('Invalid autofix job payload');\n if (!job.task) throw new Error('Task is required');\n state.jobs.push(job);\n await this.writeState(state);\n return job;\n }\n\n async list(filter?: { status?: AutoFixJobStatus }): Promise<AutoFixJob[]> {\n const state = await this.readState();\n const jobs = [...state.jobs].sort((a, b) => Date.parse(b.updatedAt) - Date.parse(a.updatedAt));\n if (!filter?.status) return jobs;\n return jobs.filter(job => job.status === filter.status);\n }\n\n async get(id: string): Promise<AutoFixJob | null> {\n const state = await this.readState();\n return state.jobs.find(job => job.id === id) || null;\n }\n\n async cancel(id: string): Promise<boolean> {\n const state = await this.readState();\n const index = state.jobs.findIndex(job => job.id === id);\n if (index < 0) return false;\n const current = state.jobs[index];\n if (current.status === 'completed' || current.status === 'failed') return false;\n state.jobs[index] = {\n ...current,\n status: 'canceled',\n updatedAt: new Date().toISOString(),\n finishedAt: new Date().toISOString()\n };\n await this.writeState(state);\n return true;\n }\n\n async claimNext(workerId: string): Promise<AutoFixJob | null> {\n const state = await this.readState();\n const index = state.jobs.findIndex(job => job.status === 'queued');\n if (index < 0) return null;\n const now = new Date().toISOString();\n const claimed = {\n ...state.jobs[index],\n status: 'running' as AutoFixJobStatus,\n workerId,\n startedAt: now,\n updatedAt: now,\n error: undefined\n };\n state.jobs[index] = claimed;\n await this.writeState(state);\n return claimed;\n }\n\n async markCompleted(id: string, result: Record<string, any>) {\n return this.updateFinal(id, 'completed', result);\n }\n\n async markFailed(id: string, error: string, result: Record<string, any> = {}) {\n return this.updateFinal(id, 'failed', {\n ...result,\n error\n });\n }\n\n private async updateFinal(id: string, status: Extract<AutoFixJobStatus, 'completed' | 'failed'>, result: Record<string, any>) {\n const state = await this.readState();\n const index = state.jobs.findIndex(job => job.id === id);\n if (index < 0) return false;\n const now = new Date().toISOString();\n const current = state.jobs[index];\n state.jobs[index] = {\n ...current,\n status,\n updatedAt: now,\n finishedAt: now,\n error: status === 'failed' ? String(result.error || 'Job failed') : undefined,\n result\n };\n await this.writeState(state);\n return true;\n }\n}\n", "// @ts-nocheck\nimport { execSync } from 'node:child_process';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { AgentRouter } from '../agent/router.js';\nimport { analyzeBlastRadius, isSeverityAtLeast } from '../blast-radius/index.js';\nimport type { CheckpointStore } from '../checkpoint/store.js';\nimport type { Logger } from '../utils/logger.js';\nimport type { Orchestrator } from '../orchestrator/index.js';\nimport type { Sandbox } from '../sandbox/index.js';\nimport type { SessionManager } from '../session/manager.js';\nimport { scorePatchRisk } from '../risk/score.js';\nimport type { AutoFixJob } from './store.js';\n\nfunction hasCompletionSignal(text: string): boolean {\n const lower = text.toLowerCase();\n const signals = [\n 'task complete',\n 'task is complete',\n 'implementation complete',\n 'all done',\n 'finished',\n 'successfully implemented',\n 'no further changes needed',\n 'ready for review'\n ];\n return signals.some(signal => lower.includes(signal));\n}\n\nfunction shouldRetryWithFallback(error: unknown): boolean {\n const text = String((error as Error)?.message || '').toLowerCase();\n return (\n text.includes('rate limit') ||\n text.includes('429') ||\n text.includes('timeout') ||\n text.includes('empty') ||\n text.includes('temporar') ||\n text.includes('unavailable') ||\n text.includes('quota')\n );\n}\n\nasync function dispatchWithFallback(\n router: AgentRouter,\n agent: string,\n task: string,\n options: any,\n fallbackModels: string[] = [],\n checkpoints?: CheckpointStore,\n runId?: string\n) {\n const tried: string[] = [];\n const primary = String(options.model || '').trim();\n if (primary) tried.push(primary);\n const chain = [primary, ...fallbackModels].map(v => String(v || '').trim()).filter(Boolean);\n if (chain.length === 0) {\n const result = await router.dispatch(agent, task, options);\n return { result, usedModel: primary || 'default', attempts: tried };\n }\n\n let lastError: Error | null = null;\n for (let i = 0; i < chain.length; i += 1) {\n const model = chain[i];\n try {\n if (checkpoints && runId) {\n await checkpoints.append(runId, 'autofix.dispatch.model.attempt', { model, index: i + 1 });\n }\n const result = await router.dispatch(agent, task, {\n ...options,\n model\n });\n if (checkpoints && runId) {\n await checkpoints.append(runId, 'autofix.dispatch.model.success', { model, index: i + 1 });\n }\n return { result, usedModel: model, attempts: [...tried, model] };\n } catch (error) {\n lastError = error as Error;\n tried.push(model);\n if (checkpoints && runId) {\n await checkpoints.append(runId, 'autofix.dispatch.model.failed', {\n model,\n error: String((error as Error).message || error)\n });\n }\n const canRetry = i < chain.length - 1 && shouldRetryWithFallback(error);\n if (!canRetry) break;\n }\n }\n\n throw lastError || new Error(`Dispatch failed for ${agent}`);\n}\n\nfunction runValidationCommands(commands: string[] = [], cwd = process.cwd()) {\n if (!commands.length) return { passed: true, failedCommand: '', output: '' };\n for (const cmd of commands) {\n try {\n execSync(cmd, {\n cwd,\n stdio: 'pipe',\n encoding: 'utf8',\n maxBuffer: 2 * 1024 * 1024\n });\n } catch (error) {\n return {\n passed: false,\n failedCommand: cmd,\n output: String((error as any)?.stderr || (error as Error).message || '')\n };\n }\n }\n return { passed: true, failedCommand: '', output: '' };\n}\n\nasync function runLspAutoFixCycle(\n projectDir: string,\n maxAttempts: number,\n options: {\n router: AgentRouter;\n orchestrator: Orchestrator;\n sessionId: string;\n gateway?: string;\n model?: string;\n fallbackModels: string[];\n checkpoints?: CheckpointStore;\n runId?: string;\n logger: Logger;\n }\n): Promise<{ fixed: boolean; attempts: number; remainingDiagnostics: number }> {\n const { typeCheckProject } = await import('../lsp/index.js');\n const cappedAttempts = Math.max(1, maxAttempts);\n let diagnostics = await typeCheckProject(projectDir, []);\n if (diagnostics.length === 0) return { fixed: true, attempts: 0, remainingDiagnostics: 0 };\n\n let attempts = 0;\n while (attempts < cappedAttempts && diagnostics.length > 0) {\n attempts += 1;\n const summary = diagnostics\n .slice(0, 30)\n .map(d => `${d.file}:${d.line}:${d.column} [${d.category}] TS${d.code} ${d.message}`)\n .join('\\n');\n const task = [\n 'Fix TypeScript diagnostics with minimal safe edits.',\n 'Diagnostics:',\n summary\n ].join('\\n');\n\n const dispatched = await dispatchWithFallback(\n options.router,\n 'crew-fixer',\n task,\n {\n project: projectDir,\n sessionId: options.sessionId,\n gateway: options.gateway,\n model: options.model\n },\n options.fallbackModels,\n options.checkpoints,\n options.runId\n );\n const response = String(dispatched.result?.result || '');\n const edits = await options.orchestrator.parseAndApplyToSandbox(response);\n options.logger.info(`Autofix LSP pass ${attempts}: ${diagnostics.length} diagnostics, ${edits.length} edit(s).`);\n await options.checkpoints?.append(String(options.runId || ''), 'autofix.lsp.attempt', {\n attempt: attempts,\n diagnostics: diagnostics.length,\n edits: edits.length\n });\n diagnostics = await typeCheckProject(projectDir, []);\n }\n\n return {\n fixed: diagnostics.length === 0,\n attempts,\n remainingDiagnostics: diagnostics.length\n };\n}\n\nexport interface AutoFixRunDependencies {\n router: AgentRouter;\n orchestrator: Orchestrator;\n sandbox: Sandbox;\n session: SessionManager;\n logger: Logger;\n checkpoints: CheckpointStore;\n}\n\nexport interface AutoFixRunResult {\n runId: string;\n iterations: number;\n editedFiles: string[];\n applied: boolean;\n proposalPath?: string;\n blastRisk?: 'low' | 'medium' | 'high';\n patchRiskLevel?: 'low' | 'medium' | 'high';\n patchRiskScore?: number;\n validationPassed?: boolean;\n validationFailedCommand?: string;\n}\n\nexport async function runAutoFixJob(job: AutoFixJob, deps: AutoFixRunDependencies): Promise<AutoFixRunResult> {\n const { router, orchestrator, sandbox, session, logger, checkpoints } = deps;\n const runId = `autofix-${job.id}`;\n const activeBranch = sandbox.getActiveBranch();\n if (sandbox.hasChanges(activeBranch)) {\n throw new Error('Sandbox already has pending changes; apply or rollback before running background autofix jobs.');\n }\n\n await checkpoints.beginRun({ runId, mode: 'auto', task: job.task });\n let iteration = 0;\n let currentTask = job.task;\n\n try {\n while (iteration < job.config.maxIterations) {\n iteration += 1;\n const route = await orchestrator.route(currentTask);\n const agent = route.agent || 'crew-fixer';\n logger.info(`[AutoFix ${job.id}] Iteration ${iteration}/${job.config.maxIterations} via ${agent}`);\n\n const dispatched = await dispatchWithFallback(\n router,\n agent,\n currentTask,\n {\n project: job.projectDir,\n sessionId: await session.getSessionId(),\n gateway: job.config.gateway,\n model: job.config.model\n },\n job.config.fallbackModels,\n checkpoints,\n runId\n );\n\n const responseText = String(dispatched.result?.result || '');\n const edits = await orchestrator.parseAndApplyToSandbox(responseText);\n await checkpoints.append(runId, 'autofix.iteration', {\n iteration,\n agent,\n edits: edits.length,\n success: Boolean(dispatched.result?.success)\n });\n await session.appendHistory({\n type: 'autofix_iteration',\n jobId: job.id,\n iteration,\n agent,\n success: Boolean(dispatched.result?.success),\n edits: edits.length\n });\n\n if (edits.length > 0 && job.config.lspAutoFix) {\n await runLspAutoFixCycle(job.projectDir, job.config.lspAutoFixMaxAttempts, {\n router,\n orchestrator,\n sessionId: await session.getSessionId(),\n gateway: job.config.gateway,\n model: job.config.model,\n fallbackModels: job.config.fallbackModels,\n checkpoints,\n runId,\n logger\n });\n }\n\n if (hasCompletionSignal(responseText)) {\n break;\n }\n\n if (iteration < job.config.maxIterations) {\n currentTask = edits.length > 0\n ? 'Previous edits are staged. Validate and apply remaining fixes. Respond with \"Task complete\" only when done.'\n : `Continue fixing this task with minimal safe edits: ${job.task}`;\n }\n }\n\n const changedBranch = sandbox.getActiveBranch();\n const editedFiles = sandbox.getPendingPaths(changedBranch);\n if (editedFiles.length === 0) {\n await checkpoints.finish(runId, 'completed');\n return {\n runId,\n iterations: iteration,\n editedFiles: [],\n applied: false\n };\n }\n\n const validation = runValidationCommands(job.config.validateCommands, job.projectDir);\n const blast = await analyzeBlastRadius(job.projectDir, { changedFiles: editedFiles });\n const patchRisk = scorePatchRisk({\n blastRadius: blast,\n changedFiles: editedFiles.length,\n validationPassed: validation.passed\n });\n\n await checkpoints.append(runId, 'autofix.safety', {\n changedFiles: editedFiles.length,\n blastRisk: blast.risk,\n blastSummary: blast.summary,\n validationPassed: validation.passed,\n failedCommand: validation.failedCommand || undefined,\n patchRiskLevel: patchRisk.riskLevel,\n patchRiskScore: patchRisk.riskScore\n });\n\n const threshold = job.config.blastRadiusThreshold;\n const allowByBlast = !isSeverityAtLeast(blast.risk, threshold);\n const shouldApply = job.config.autoApplyPolicy === 'force'\n ? true\n : job.config.autoApplyPolicy === 'safe'\n ? validation.passed && allowByBlast\n : false;\n\n if (shouldApply) {\n await sandbox.apply(changedBranch);\n await checkpoints.append(runId, 'autofix.applied', {\n policy: job.config.autoApplyPolicy,\n files: editedFiles\n });\n await checkpoints.finish(runId, 'completed');\n return {\n runId,\n iterations: iteration,\n editedFiles,\n applied: true,\n blastRisk: blast.risk,\n patchRiskLevel: patchRisk.riskLevel,\n patchRiskScore: patchRisk.riskScore,\n validationPassed: validation.passed,\n validationFailedCommand: validation.failedCommand || undefined\n };\n }\n\n const proposalDir = join(job.projectDir, '.crew', 'autofix', 'proposals');\n await mkdir(proposalDir, { recursive: true });\n const proposalPath = join(proposalDir, `${job.id}.diff`);\n await writeFile(proposalPath, sandbox.preview(changedBranch), 'utf8');\n await sandbox.rollback(changedBranch);\n\n await checkpoints.append(runId, 'autofix.proposal', {\n policy: job.config.autoApplyPolicy,\n proposalPath,\n blockedByValidation: !validation.passed,\n blockedByBlastRadius: !allowByBlast\n });\n await checkpoints.finish(runId, 'completed');\n\n return {\n runId,\n iterations: iteration,\n editedFiles,\n applied: false,\n proposalPath,\n blastRisk: blast.risk,\n patchRiskLevel: patchRisk.riskLevel,\n patchRiskScore: patchRisk.riskScore,\n validationPassed: validation.passed,\n validationFailedCommand: validation.failedCommand || undefined\n };\n } catch (error) {\n try {\n await sandbox.rollback(sandbox.getActiveBranch());\n } catch {\n // Best-effort cleanup for failed background jobs.\n }\n await checkpoints.append(runId, 'autofix.error', {\n error: String((error as Error).message || error),\n iteration\n });\n await checkpoints.finish(runId, 'failed');\n throw error;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["resolve", "dirname", "resolve", "configPath", "program", "result", "result", "result", "randomUUID", "execSync", "mkdir", "readFile", "readdir", "writeFile", "join", "resolve", "updated", "diagnostics", "execFileSync", "spawn", "DockerSandbox", "result", "runAgenticWorker", "access", "mkdir", "readFile", "writeFile", "constants", "join", "nowIso", "path", "readdir", "readFile", "stat", "extname", "join", "relative", "resolve", "toolCalls", "parts", "usage", "buildCollectionIndex", "searchCollection", "result", "mkdir", "writeFile", "resolve", "join", "path", "result", "fs", "existsSync", "readFileSync", "join", "resolve", "path", "nowIso", "chunks", "stat", "randomUUID", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "join", "resolve", "path", "mkdir", "join", "resolve", "path", "path", "logger", "randomUUID", "appendFile", "mkdir", "readFile", "resolve", "join", "result", "path", "execSync", "parseDirectFileCommands", "resolve", "result", "readFile", "RouteDecision", "result", "parseDirectFileCommands", "parseWriteSyntax", "executeDirectCommands", "appendFile", "mkdir", "readFile", "stat", "writeFile", "dirname", "join", "randomUUID", "tokenize", "promisify", "execFile", "promisify", "relative", "resolve", "execFileAsync", "execSync", "readFile", "writeFile", "mkdir", "existsSync", "relative", "join", "cosineSimilarity", "chalk", "readFileSync", "homedir", "chalk", "logger", "result", "getInquirer", "chalk", "result", "resolve", "isObject", "path", "fs", "exec", "promisify", "execAsync", "runPtyCommand", "result", "getCompletions", "typeCheckProject", "readFileSync", "existsSync", "join", "readFile", "existsSync", "join", "readFile", "writeFile", "mkdir", "join", "dirname", "path", "readFile", "access", "constants", "join", "homedir", "execFile", "promisify", "execFileAsync", "path", "createHash", "mkdir", "readFile", "writeFile", "existsSync", "join", "nowIso", "result", "existsSync", "homedir", "access", "constants", "join", "dirname", "homedir", "execFile", "promisify", "mkdir", "readFile", "writeFile", "existsSync", "join", "homedir", "path", "execFileAsync", "promisify", "execFile", "configPath", "join", "homedir", "access", "constants", "dirname", "resolve", "randomUUID", "fs", "path", "mkdir", "readFile", "writeFile", "existsSync", "join", "resolve", "nowIso", "clip", "mkdir", "readFile", "writeFile", "existsSync", "join", "resolve", "nowIso", "clip", "mkdir", "readFile", "writeFile", "existsSync", "homedir", "join", "resolve", "randomUUID", "nowIso", "spawn", "appendFile", "mkdir", "readFile", "writeFile", "existsSync", "join", "resolve", "clip", "logger", "result", "resolve", "text", "path", "fs", "randomUUID", "readFile", "join", "readFile", "logger", "resolve", "path", "readFile", "watcher", "relative", "join", "readdir", "access", "mkdir", "writeFile", "constants", "dirname", "join", "resolve", "execFile", "promisify", "execFileAsync", "path", "runGit", "spawn", "access", "readFile", "writeFile", "constants", "join", "execFile", "promisify", "WebSocket", "execFileAsync", "exists", "path", "resolve", "resolve", "WebSocket", "join", "writeFile", "readFile", "access", "copyFile", "mkdir", "readFile", "readdir", "writeFile", "constants", "join", "exists", "path", "execFile", "promisify", "readFile", "writeFile", "join", "tmpdir", "execFileAsync", "commandExists", "platform", "join", "tmpdir", "commandExists", "execFileAsync", "readFile", "path", "join", "execFileAsync", "writeFile", "readFile", "extname", "resolve", "clip", "path", "extname", "resolve", "readFile", "estimateTokens", "execFile", "promisify", "execFileAsync", "clip", "runGit", "mkdir", "readFile", "writeFile", "existsSync", "join", "resolve", "join", "path", "mkdir", "existsSync", "writeFile", "readFile", "homedir", "join", "readFileSync", "randomUUID", "result", "buildCollectionIndex", "searchCollection", "readFile", "join", "path", "join", "homedir", "readFileSync", "randomUUID", "path", "result", "reply", "randomUUID", "path", "autoLoadRelevantFiles", "shouldUseRag", "existsSync", "agents", "join", "resolve", "spawn", "mkdir", "writeFile", "join", "resolve", "randomUUID", "existsSync", "readFileSync", "appendFile", "mkdir", "readFile", "readdir", "writeFile", "join", "homedir", "chalk", "resolve", "join", "tokenize", "similarity", "path", "mkdir", "readFile", "readdir", "writeFile", "existsSync", "join", "BANNER", "existsSync", "readFileSync", "join", "homedir", "chalk", "readdir", "readFile", "resolve", "logger", "randomUUID", "mkdir", "writeFile", "displayStatus", "appendFile", "readdirSync", "statSync", "dirname", "MODEL_CATALOG", "formatModelTable", "findModelInfo", "from", "execSync", "typeCheckProject", "getCompletions", "result", "responseText", "input", "policy", "existsSync", "readFileSync", "join", "homedir", "text", "mkdir", "readFile", "writeFile", "existsSync", "join", "isObject", "path", "execFile", "promisify", "execFileAsync", "existsSync", "readFile", "join", "path", "mkdir", "readFile", "writeFile", "existsSync", "join", "randomUUID", "join", "existsSync", "readFile", "mkdir", "writeFile", "randomUUID", "result", "execSync", "mkdir", "writeFile", "join", "result", "execSync", "typeCheckProject", "logger", "join", "mkdir", "writeFile", "randomUUID", "mkdir", "readFile", "writeFile", "dirname", "join", "execSync", "result", "execSync", "existsSync", "join", "homedir", "shouldRetryWithFallback", "path", "readFile", "runValidationCommands", "runLspAutoFixCycle", "typeCheckProject", "dispatchWithFallback", "chalk", "mkdir", "dirname", "writeFile", "logger", "buildCollectionIndex", "searchCollection", "randomUUID", "hasCompletionSignal", "resolve", "displayStatus", "buildRepositoryGraph", "buildRepositoryMap", "buildRepositoryGraphDot", "buildRepositoryGraphHtml", "getCompletions", "runPtyCommand", "runShellCopilot", "args", "WorkerPool", "runCheckCommand", "spawn", "analyzeBlastRadius", "AgentKeeper", "readFileSync"]
|
|
7
|
+
}
|