cascade-ai 0.5.1 → 0.9.7

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["node-file:F:/Softwares/Github Softwares/Cascade-AI/node_modules/keytar/build/Release/keytar.node","../node_modules/keytar/lib/keytar.js","../src/constants.ts","../src/providers/base.ts","../src/providers/anthropic.ts","../src/providers/openai.ts","../src/providers/azure.ts","../src/providers/gemini.ts","../src/providers/ollama.ts","../src/providers/openai-compatible.ts","../src/core/router/selector.ts","../src/core/router/failover.ts","../src/core/router/tpm-limiter.ts","../src/core/router/local-queue.ts","../src/utils/cost.ts","../src/utils/retry.ts","../src/core/router/model-profiler.ts","../src/core/router/index.ts","../src/core/tiers/base.ts","../src/core/context/manager.ts","../src/audit/log.ts","../src/tools/text-tool-parser.ts","../src/core/tiers/t3-worker.ts","../src/core/peer/bus.ts","../src/core/tiers/t2-manager.ts","../src/utils/json-extract.ts","../src/core/tiers/t1-administrator.ts","../src/tools/base.ts","../src/tools/shell.ts","../src/tools/utils/workspace-path.ts","../src/tools/file.ts","../src/tools/git.ts","../src/tools/github.ts","../src/tools/browser.ts","../src/tools/image.ts","../src/tools/pdf.ts","../src/tools/interpreter.ts","../src/tools/peer.ts","../src/tools/web-search.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/web-fetch.ts","../src/tools/mcp.ts","../src/tools/registry.ts","../src/mcp/client.ts","../src/core/permissions/escalator.ts","../src/config/schema.ts","../src/config/validate.ts","../src/telemetry/index.ts","../src/core/router/task-analyzer.ts","../src/core/router/model-performance-tracker.ts","../src/tools/tool-creator.ts","../src/core/cascade.ts","../src/config/keystore.ts","../src/config/ignore.ts","../src/config/cascade-md.ts","../src/memory/store.ts","../src/config/index.ts","../src/sdk/index.ts","../src/dashboard/auth.ts","../src/dashboard/socket-protocol.ts","../src/dashboard/websocket.ts","../src/dashboard/server.ts","../src/scheduler/index.ts","../src/hooks/index.ts"],"names":["exports","require_keytar","Anthropic","OpenAI","AzureOpenAI","GoogleGenAI","HarmCategory","HarmBlockThreshold","axios","EventEmitter","randomUUID","path","exec","promisify","execAsync","fs","simpleGit","PDFDocument","execSync","glob","execFile","ignoreFactory","StdioClientTransport","Client","z","os","createContext","runInContext","stats","durationMs","crypto","ignore","_ignoreModule","Database","jwt","SocketServer","parser","__dirname","fileURLToPath","express","createServer","bcrypt","rateLimit","timingSafeEqual","cron","execFileAsync"],"mappings":"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","file":"index.cjs","sourcesContent":["\n import path from \"F:\\\\Softwares\\\\Github Softwares\\\\Cascade-AI\\\\node_modules\\\\keytar\\\\build\\\\Release\\\\keytar.node\"\n try { module.exports = require(path) }\n catch {}\n ","var keytar = require('../build/Release/keytar.node')\n\nfunction checkRequired(val, name) {\n if (!val || val.length <= 0) {\n throw new Error(name + ' is required.');\n }\n}\n\nmodule.exports = {\n getPassword: function (service, account) {\n checkRequired(service, 'Service')\n checkRequired(account, 'Account')\n\n return keytar.getPassword(service, account)\n },\n\n setPassword: function (service, account, password) {\n checkRequired(service, 'Service')\n checkRequired(account, 'Account')\n checkRequired(password, 'Password')\n\n return keytar.setPassword(service, account, password)\n },\n\n deletePassword: function (service, account) {\n checkRequired(service, 'Service')\n checkRequired(account, 'Account')\n\n return keytar.deletePassword(service, account)\n },\n\n findPassword: function (service) {\n checkRequired(service, 'Service')\n\n return keytar.findPassword(service)\n },\n\n findCredentials: function (service) {\n checkRequired(service, 'Service')\n\n return keytar.findCredentials(service)\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Constants\n// ─────────────────────────────────────────────\n\nimport type { ModelInfo, ProviderType, ThemeName } from './types.js';\n\nexport const CASCADE_VERSION = '0.5.1';\nexport const CASCADE_CONFIG_DIR = '.cascade';\nexport const CASCADE_MD_FILE = 'CASCADE.md';\nexport const CASCADE_IGNORE_FILE = '.cascadeignore';\nexport const CASCADE_CONFIG_FILE = '.cascade/config.json';\nexport const CASCADE_KEYSTORE_FILE = '.cascade/keystore.enc';\nexport const CASCADE_AUDIT_FILE = '.cascade/audit.log';\nexport const CASCADE_DB_FILE = '.cascade/memory.db';\nexport const CASCADE_DASHBOARD_SECRET_FILE = '.cascade/dashboard-secret';\n\nexport const GLOBAL_CONFIG_DIR = '.cascade-ai';\nexport const GLOBAL_DB_FILE = 'memory.db';\nexport const GLOBAL_KEYSTORE_FILE = 'keystore.enc';\nexport const GLOBAL_RUNTIME_DB_FILE = 'runtime.db';\n\nexport const DEFAULT_DASHBOARD_PORT = 4891;\nexport const DEFAULT_API_PORT = 4892;\nexport const DEFAULT_CONTEXT_LIMIT = 200_000;\nexport const DEFAULT_AUTO_SUMMARIZE_AT = 150_000;\nexport const DEFAULT_MAX_SESSION_MESSAGES = 1000;\nexport const DEFAULT_RETENTION_DAYS = 90;\n\n// ── Model Catalogue ───────────────────────────\n\nexport const MODELS: Record<string, ModelInfo> = {\n // Anthropic\n 'claude-opus-4': {\n id: 'claude-opus-4-5',\n name: 'Claude Opus 4',\n provider: 'anthropic',\n contextWindow: 200_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.015,\n outputCostPer1kTokens: 0.075,\n maxOutputTokens: 32_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'claude-sonnet-4': {\n id: 'claude-sonnet-4-5',\n name: 'Claude Sonnet 4',\n provider: 'anthropic',\n contextWindow: 200_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.003,\n outputCostPer1kTokens: 0.015,\n maxOutputTokens: 16_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'claude-haiku-3-5': {\n id: 'claude-haiku-3-5-20251001',\n name: 'Claude Haiku 3.5',\n provider: 'anthropic',\n contextWindow: 200_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.0008,\n outputCostPer1kTokens: 0.004,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'claude-haiku-4-5': {\n id: 'claude-haiku-4-5-20251001',\n name: 'Claude Haiku 4.5',\n provider: 'anthropic',\n contextWindow: 200_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.0008,\n outputCostPer1kTokens: 0.004,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: false,\n },\n // OpenAI\n 'gpt-4o': {\n id: 'gpt-4o',\n name: 'GPT-4o',\n provider: 'openai',\n contextWindow: 128_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.005,\n outputCostPer1kTokens: 0.015,\n maxOutputTokens: 16_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gpt-4o-mini': {\n id: 'gpt-4o-mini',\n name: 'GPT-4o Mini',\n provider: 'openai',\n contextWindow: 128_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.00015,\n outputCostPer1kTokens: 0.0006,\n maxOutputTokens: 16_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gpt-4.1': {\n id: 'gpt-4.1',\n name: 'GPT-4.1',\n provider: 'openai',\n contextWindow: 1_047_576,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.002,\n outputCostPer1kTokens: 0.008,\n maxOutputTokens: 32_768,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gpt-4.1-mini': {\n id: 'gpt-4.1-mini',\n name: 'GPT-4.1 Mini',\n provider: 'openai',\n contextWindow: 1_047_576,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.0004,\n outputCostPer1kTokens: 0.0016,\n maxOutputTokens: 32_768,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gpt-4.1-nano': {\n id: 'gpt-4.1-nano',\n name: 'GPT-4.1 Nano',\n provider: 'openai',\n contextWindow: 1_047_576,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.0001,\n outputCostPer1kTokens: 0.0004,\n maxOutputTokens: 32_768,\n supportsStreaming: true,\n isLocal: false,\n },\n // Google\n 'gemini-2.0-flash': {\n id: 'gemini-2.0-flash',\n name: 'Gemini 2.0 Flash',\n provider: 'gemini',\n contextWindow: 1_000_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.0001,\n outputCostPer1kTokens: 0.0004,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gemini-1.5-pro': {\n id: 'gemini-1.5-pro',\n name: 'Gemini 1.5 Pro',\n provider: 'gemini',\n contextWindow: 1_000_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.00125,\n outputCostPer1kTokens: 0.005,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gemini-2.0-flash-lite': {\n id: 'gemini-2.0-flash-lite',\n name: 'Gemini 2.0 Flash-Lite',\n provider: 'gemini',\n contextWindow: 1_000_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.00005,\n outputCostPer1kTokens: 0.0002,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gemini-2.5-pro': {\n id: 'gemini-2.5-pro-preview-05-06',\n name: 'Gemini 2.5 Pro',\n provider: 'gemini',\n contextWindow: 1_000_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.00125,\n outputCostPer1kTokens: 0.01,\n maxOutputTokens: 65_536,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gemini-2.5-flash': {\n id: 'gemini-2.5-flash-preview-04-17',\n name: 'Gemini 2.5 Flash',\n provider: 'gemini',\n contextWindow: 1_000_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.00015,\n outputCostPer1kTokens: 0.0006,\n maxOutputTokens: 65_536,\n supportsStreaming: true,\n isLocal: false,\n },\n // Local (Ollama)\n 'llama3.2:3b': {\n id: 'llama3.2:3b',\n name: 'Llama 3.2 3B',\n provider: 'ollama',\n contextWindow: 128_000,\n isVisionCapable: false,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 4_000,\n supportsStreaming: true,\n isLocal: true,\n minSizeB: 3,\n },\n 'llama3:70b': {\n id: 'llama3:70b',\n name: 'Llama 3 70B',\n provider: 'ollama',\n contextWindow: 128_000,\n isVisionCapable: false,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: true,\n minSizeB: 70,\n },\n 'mistral:7b': {\n id: 'mistral:7b',\n name: 'Mistral 7B',\n provider: 'ollama',\n contextWindow: 32_000,\n isVisionCapable: false,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 4_000,\n supportsStreaming: true,\n isLocal: true,\n minSizeB: 7,\n },\n 'llava': {\n id: 'llava',\n name: 'LLaVA (Vision)',\n provider: 'ollama',\n contextWindow: 4_096,\n isVisionCapable: true,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 2_000,\n supportsStreaming: true,\n isLocal: true,\n minSizeB: 7,\n },\n};\n\n// ── Tier Model Priority Chains ─────────────────\n\nexport const T1_MODEL_PRIORITY: string[] = [\n 'claude-opus-4',\n 'claude-sonnet-4',\n 'gemini-2.5-pro',\n 'gpt-4.1',\n 'gpt-4o',\n 'gemini-1.5-pro',\n];\n\nexport const T2_MODEL_PRIORITY: string[] = [\n 'claude-sonnet-4',\n 'claude-haiku-4-5',\n 'claude-haiku-3-5',\n 'gemini-2.5-flash',\n 'gpt-4.1-mini',\n 'gpt-4o-mini',\n 'gemini-2.0-flash',\n 'llama3:70b',\n];\n\nexport const T3_MODEL_PRIORITY: string[] = [\n 'llama3.2:3b',\n 'mistral:7b',\n 'claude-haiku-4-5',\n 'claude-haiku-3-5',\n 'gpt-4.1-nano',\n 'gpt-4o-mini',\n 'gemini-2.5-flash',\n 'gemini-2.0-flash',\n];\n\nexport const VISION_MODEL_PRIORITY: string[] = [\n 'claude-sonnet-4',\n 'gpt-4o',\n 'gemini-2.0-flash',\n 'llava',\n];\n\n// ── Complexity → T2 count ──────────────────────\n\nexport const COMPLEXITY_T2_COUNT: Record<string, [number, number]> = {\n Simple: [1, 1],\n Moderate: [2, 3],\n Complex: [3, 5],\n 'Highly Complex': [5, 8],\n};\n\n// ── Themes ────────────────────────────────────\n\nexport const THEME_NAMES: ThemeName[] = ['cascade', 'dark', 'light', 'dracula', 'nord', 'solarized'];\nexport const DEFAULT_THEME: ThemeName = 'cascade';\n\n// ── Provider Endpoints ────────────────────────\n\nexport const OLLAMA_BASE_URL = 'http://localhost:11434';\nexport const LM_STUDIO_BASE_URL = 'http://localhost:1234';\nexport const AZURE_BASE_URL_TEMPLATE = 'https://{resource}.openai.azure.com';\n\n// ── Slash Commands ────────────────────────────\n// Command definitions live in src/cli/slash/index.ts.\n\n// ── Tool Names ────────────────────────────────\n\nexport const TOOL_NAMES = {\n SHELL: 'shell',\n FILE_READ: 'file_read',\n FILE_WRITE: 'file_write',\n FILE_EDIT: 'file_edit',\n FILE_DELETE: 'file_delete',\n FILE_LIST: 'file_list',\n GIT: 'git',\n GITHUB: 'github',\n BROWSER: 'browser',\n IMAGE_ANALYZE: 'image_analyze',\n PDF_CREATE: 'pdf_create',\n RUN_CODE: 'run_code',\n PEER_MESSAGE: 'peer_message',\n WEB_SEARCH: 'web_search',\n} as const;\n\n// Defaults that require approval\nexport const DEFAULT_APPROVAL_REQUIRED = [\n TOOL_NAMES.SHELL,\n TOOL_NAMES.FILE_DELETE,\n TOOL_NAMES.FILE_WRITE,\n TOOL_NAMES.BROWSER,\n TOOL_NAMES.GITHUB,\n 'pdf_create',\n 'run_code',\n];\n\n// ── Provider Names ────────────────────────────\n\nexport const PROVIDER_DISPLAY_NAMES: Record<ProviderType, string> = {\n anthropic: 'Anthropic',\n openai: 'OpenAI',\n gemini: 'Google Gemini',\n azure: 'Azure OpenAI',\n 'openai-compatible': 'OpenAI-Compatible',\n ollama: 'Ollama (Local)',\n};\n","// ─────────────────────────────────────────────\n// Cascade AI — Abstract Provider Base\n// ─────────────────────────────────────────────\n\nimport type {\n GenerateOptions,\n GenerateResult,\n ModelInfo,\n ProviderConfig,\n StreamChunk,\n TokenUsage,\n} from '../types.js';\n\nexport abstract class BaseProvider {\n protected config: ProviderConfig;\n protected model: ModelInfo;\n\n constructor(config: ProviderConfig, model: ModelInfo) {\n this.config = config;\n this.model = model;\n }\n\n abstract generate(options: GenerateOptions): Promise<GenerateResult>;\n\n abstract generateStream(\n options: GenerateOptions,\n onChunk: (chunk: StreamChunk) => void,\n ): Promise<GenerateResult>;\n\n abstract countTokens(text: string): Promise<number>;\n\n abstract listModels(): Promise<ModelInfo[]>;\n\n abstract isAvailable(): Promise<boolean>;\n\n getModel(): ModelInfo {\n return this.model;\n }\n\n isVisionCapable(): boolean {\n return this.model.isVisionCapable;\n }\n\n estimateCost(inputTokens: number, outputTokens: number): number {\n return (\n (inputTokens / 1000) * this.model.inputCostPer1kTokens +\n (outputTokens / 1000) * this.model.outputCostPer1kTokens\n );\n }\n\n protected makeUsage(inputTokens: number, outputTokens: number): TokenUsage {\n return {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n estimatedCostUsd: this.estimateCost(inputTokens, outputTokens),\n };\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Anthropic Provider\n// ─────────────────────────────────────────────\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport type {\n ConversationMessage,\n GenerateOptions,\n GenerateResult,\n ImageAttachment,\n ModelInfo,\n ProviderConfig,\n StreamChunk,\n} from '../types.js';\nimport { MODELS } from '../constants.js';\nimport { BaseProvider } from './base.js';\n\nexport class AnthropicProvider extends BaseProvider {\n private client: Anthropic;\n\n constructor(config: ProviderConfig, model: ModelInfo) {\n super(config, model);\n this.client = new Anthropic({\n apiKey: config.apiKey,\n });\n }\n\n async generate(options: GenerateOptions): Promise<GenerateResult> {\n const chunks: StreamChunk[] = [];\n return this.generateStream(options, (c) => chunks.push(c));\n }\n\n async generateStream(\n options: GenerateOptions,\n onChunk: (chunk: StreamChunk) => void,\n ): Promise<GenerateResult> {\n const messages = this.convertMessages(options.messages);\n const tools = options.tools?.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema as Anthropic.Tool['input_schema'],\n }));\n\n let fullContent = '';\n let inputTokens = 0;\n let outputTokens = 0;\n\n const stream = this.client.messages.stream({\n model: this.model.id,\n max_tokens: options.maxTokens ?? this.model.maxOutputTokens,\n temperature: options.temperature ?? 0.7,\n system: options.systemPrompt,\n messages,\n tools: tools?.length ? tools : undefined,\n });\n\n let isThinking = false;\n\n for await (const event of stream) {\n if (event.type === 'content_block_delta') {\n if ((event.delta as any).type === 'thinking_delta') {\n if (!isThinking) {\n isThinking = true;\n fullContent += '<think>\\n';\n onChunk({ text: '<think>\\n', finishReason: null });\n }\n const text = (event.delta as any).thinking;\n fullContent += text;\n onChunk({ text, finishReason: null });\n } else if (event.delta.type === 'text_delta') {\n if (isThinking) {\n isThinking = false;\n fullContent += '\\n</think>\\n\\n';\n onChunk({ text: '\\n</think>\\n\\n', finishReason: null });\n }\n const text = event.delta.text;\n fullContent += text;\n onChunk({ text, finishReason: null });\n }\n } else if (event.type === 'message_delta' && event.usage) {\n outputTokens = event.usage.output_tokens;\n } else if (event.type === 'message_start' && event.message.usage) {\n inputTokens = event.message.usage.input_tokens;\n }\n }\n\n if (isThinking) {\n fullContent += '\\n</think>\\n\\n';\n onChunk({ text: '\\n</think>\\n\\n', finishReason: null });\n }\n\n const finalMessage = await stream.finalMessage();\n const toolCalls = finalMessage.content\n .filter((b): b is Anthropic.ToolUseBlock => b.type === 'tool_use')\n .map((b) => ({\n id: b.id,\n name: b.name,\n input: b.input as Record<string, unknown>,\n }));\n\n onChunk({ text: '', finishReason: finalMessage.stop_reason as GenerateResult['finishReason'] });\n\n return {\n content: fullContent,\n usage: this.makeUsage(inputTokens, outputTokens),\n toolCalls: toolCalls.length ? toolCalls : undefined,\n finishReason: (finalMessage.stop_reason as GenerateResult['finishReason']) ?? 'stop',\n };\n }\n\n async countTokens(text: string): Promise<number> {\n // Anthropic token counting is often simplified to 4 chars per token if the SDK doesn't support it directly\n return Math.ceil(text.length / 4);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const resp = await fetch('https://api.anthropic.com/v1/models', {\n headers: {\n 'x-api-key': this.config.apiKey ?? '',\n 'anthropic-version': '2023-06-01',\n },\n });\n // Anthropic returns JSON-encoded error objects ({ type: \"error\", ... })\n // for 4xx/5xx responses. Calling `.data.map` on that crashes the caller\n // and hides the real authentication / network error. Fall through to\n // the hardcoded model list instead.\n if (!resp.ok) {\n return Object.values(MODELS).filter((m) => m.provider === 'anthropic');\n }\n const data = await resp.json() as { data?: Array<{ id: string; display_name: string }> };\n if (!Array.isArray(data?.data)) {\n return Object.values(MODELS).filter((m) => m.provider === 'anthropic');\n }\n\n return data.data.map((m) => {\n const known = Object.values(MODELS).find((km) => km.id === m.id && km.provider === 'anthropic');\n if (known) return known;\n\n return {\n id: m.id,\n name: m.display_name || m.id,\n provider: 'anthropic' as const,\n contextWindow: m.id.includes('3.5-sonnet') ? 200_000 : 100_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: false,\n };\n });\n } catch {\n return Object.values(MODELS).filter((m) => m.provider === 'anthropic');\n }\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n // Basic check for API key presence\n return !!this.config.apiKey;\n } catch {\n return false;\n }\n }\n\n private convertMessages(messages: ConversationMessage[]): Anthropic.MessageParam[] {\n const result: Anthropic.MessageParam[] = [];\n\n for (const m of messages) {\n // System messages in history are skipped — they're passed via the top-level `system` field\n if (m.role === 'system') continue;\n\n // ── Tool result messages → Anthropic tool_result content block ─────\n if (m.role === 'tool') {\n const toolContent = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n result.push({\n role: 'user',\n content: [{\n type: 'tool_result',\n tool_use_id: m.toolCallId ?? '',\n content: toolContent,\n }] as any,\n });\n continue;\n }\n\n // ── Assistant messages: may carry tool_use blocks ──────────────────\n if (m.role === 'assistant') {\n const content: any[] = [];\n\n // Text part\n const text = typeof m.content === 'string' ? m.content : '';\n if (text) content.push({ type: 'text', text });\n\n // Tool calls → tool_use blocks\n for (const tc of m.toolCalls ?? []) {\n content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.name,\n input: tc.input,\n });\n }\n\n if (content.length > 0) {\n result.push({ role: 'assistant', content });\n }\n continue;\n }\n\n // ── User messages ──────────────────────────────────────────────────\n if (m.role === 'user') {\n if (typeof m.content === 'string') {\n result.push({ role: 'user', content: m.content });\n } else {\n const content: any[] = m.content.map((block) => {\n if (block.type === 'text') return { type: 'text' as const, text: block.text };\n if (block.type === 'image') {\n const img = block.image as ImageAttachment;\n if (img.type === 'base64') {\n return {\n type: 'image' as const,\n source: { type: 'base64' as const, media_type: img.mimeType, data: img.data },\n };\n }\n return { type: 'image' as const, source: { type: 'url' as const, url: img.data } as any };\n }\n return { type: 'text' as const, text: '' };\n });\n result.push({ role: 'user', content });\n }\n }\n }\n\n return result;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — OpenAI Provider\n// ─────────────────────────────────────────────\n\nimport OpenAI from 'openai';\nimport type {\n ConversationMessage,\n GenerateOptions,\n GenerateResult,\n ImageAttachment,\n ModelInfo,\n ProviderConfig,\n StreamChunk,\n} from '../types.js';\nimport { MODELS } from '../constants.js';\nimport { BaseProvider } from './base.js';\n\nexport class OpenAIProvider extends BaseProvider {\n protected client: OpenAI;\n\n constructor(config: ProviderConfig, model: ModelInfo) {\n super(config, model);\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n });\n }\n\n async generate(options: GenerateOptions): Promise<GenerateResult> {\n const chunks: StreamChunk[] = [];\n return this.generateStream(options, (c) => chunks.push(c));\n }\n\n async generateStream(\n options: GenerateOptions,\n onChunk: (chunk: StreamChunk) => void,\n ): Promise<GenerateResult> {\n const messages = this.convertMessages(options.messages, options.systemPrompt);\n const tools = options.tools?.map((t) => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n\n let fullContent = '';\n let inputTokens = 0;\n let outputTokens = 0;\n let finishReason: GenerateResult['finishReason'] = 'stop';\n\n const params: OpenAI.Chat.ChatCompletionCreateParams = {\n model: this.model.id,\n messages,\n max_tokens: options.maxTokens ?? this.model.maxOutputTokens,\n temperature: options.temperature ?? 0.7,\n tools: tools?.length ? tools : undefined,\n stream: true,\n stream_options: { include_usage: true },\n };\n\n let stream: any;\n try {\n stream = await this.client.chat.completions.create(params);\n } catch (err: any) {\n // Retry with max_completion_tokens instead if the model demands it (e.g., o1/o3 or custom proxy models)\n if (err.message && err.message.includes('max_completion_tokens')) {\n const fallbackParams = { ...params } as Record<string, unknown>;\n delete fallbackParams.max_tokens;\n fallbackParams.max_completion_tokens = options.maxTokens ?? this.model.maxOutputTokens;\n \n // o1 models also often strictly require temperature to be 1\n if (this.model.id.includes('o1') || this.model.id.includes('o3')) {\n fallbackParams.temperature = 1;\n }\n \n stream = await this.client.chat.completions.create(fallbackParams as any);\n } else {\n throw err;\n }\n }\n\n const toolCallsMap: Record<number, { id: string; name: string; args: string }> = {};\n let isThinking = false;\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n\n const reasoningContent = (delta as any)?.reasoning_content;\n if (reasoningContent) {\n if (!isThinking) {\n isThinking = true;\n fullContent += '<think>\\n';\n onChunk({ text: '<think>\\n', finishReason: null });\n }\n fullContent += reasoningContent;\n onChunk({ text: reasoningContent, finishReason: null });\n }\n\n if (delta?.content) {\n if (isThinking) {\n isThinking = false;\n fullContent += '\\n</think>\\n\\n';\n onChunk({ text: '\\n</think>\\n\\n', finishReason: null });\n }\n fullContent += delta.content;\n onChunk({ text: delta.content, finishReason: null });\n }\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n if (!toolCallsMap[idx]) {\n toolCallsMap[idx] = { id: tc.id ?? '', name: tc.function?.name ?? '', args: '' };\n }\n if (tc.function?.arguments) toolCallsMap[idx]!.args += tc.function.arguments;\n if (tc.id) toolCallsMap[idx]!.id = tc.id;\n if (tc.function?.name) toolCallsMap[idx]!.name = tc.function.name;\n }\n }\n if (chunk.choices[0]?.finish_reason) {\n finishReason = (chunk.choices[0].finish_reason as GenerateResult['finishReason']) ?? 'stop';\n }\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n }\n }\n\n if (isThinking) {\n fullContent += '\\n</think>\\n\\n';\n onChunk({ text: '\\n</think>\\n\\n', finishReason: null });\n }\n\n const toolCalls = Object.values(toolCallsMap).map((tc) => {\n // OpenAI streams tool-call arguments as incremental fragments. If the\n // stream is truncated (e.g. max_tokens hit mid-argument, connection\n // dropped, or the model returned empty args) the concatenated string\n // may not be valid JSON. Crashing here throws away the whole response\n // — degrade gracefully by surfacing an empty input and letting the\n // tier decide what to do.\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.args || '{}') as Record<string, unknown>;\n } catch {\n input = { __rawArguments: tc.args, __parseError: true };\n }\n return { id: tc.id, name: tc.name, input };\n });\n\n onChunk({ text: '', finishReason });\n\n return {\n content: fullContent,\n usage: this.makeUsage(inputTokens, outputTokens),\n toolCalls: toolCalls.length ? toolCalls : undefined,\n finishReason,\n };\n }\n\n async countTokens(text: string): Promise<number> {\n // Rough approximation: 4 chars ≈ 1 token\n return Math.ceil(text.length / 4);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const response = await this.client.models.list();\n return response.data.map((m) => {\n const known = Object.values(MODELS).find((km) => km.id === m.id && km.provider === 'openai');\n if (known) return known;\n\n return {\n id: m.id,\n name: m.id,\n provider: 'openai' as const,\n contextWindow: 128_000,\n isVisionCapable: m.id.includes('vision') || m.id.includes('gpt-4o'),\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 4_000,\n supportsStreaming: true,\n isLocal: false,\n };\n });\n } catch {\n return Object.values(MODELS).filter((m) => m.provider === 'openai');\n }\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n await this.client.models.list();\n return true;\n } catch {\n return false;\n }\n }\n\n protected convertMessages(\n messages: ConversationMessage[],\n systemPrompt?: string,\n ): OpenAI.Chat.ChatCompletionMessageParam[] {\n const result: OpenAI.Chat.ChatCompletionMessageParam[] = [];\n\n if (systemPrompt) {\n result.push({ role: 'system', content: systemPrompt });\n }\n\n for (const m of messages) {\n if (m.role === 'system') {\n result.push({ role: 'system', content: typeof m.content === 'string' ? m.content : '' });\n continue;\n }\n if (m.role === 'tool') {\n result.push({\n role: 'tool',\n content: typeof m.content === 'string' ? m.content : '',\n tool_call_id: m.toolCallId ?? '',\n });\n continue;\n }\n if (typeof m.content === 'string') {\n if (m.role === 'assistant' && m.toolCalls?.length) {\n result.push({\n role: 'assistant',\n content: m.content || '',\n tool_calls: m.toolCalls.map((toolCall) => ({\n id: toolCall.id,\n type: 'function',\n function: {\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.input),\n },\n })),\n } as any);\n } else {\n result.push({ role: m.role as 'user' | 'assistant', content: m.content });\n }\n continue;\n }\n\n const parts: OpenAI.Chat.ChatCompletionContentPart[] = m.content.map((block) => {\n if (block.type === 'text') return { type: 'text' as const, text: block.text };\n if (block.type === 'image') {\n const img = block.image as ImageAttachment;\n const url = img.type === 'base64' ? `data:${img.mimeType};base64,${img.data}` : img.data;\n return {\n type: 'image_url' as const,\n image_url: { url },\n };\n }\n return { type: 'text' as const, text: '' };\n });\n\n result.push({ role: m.role as 'user' | 'assistant', content: parts } as any);\n }\n\n return result;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Azure OpenAI Provider\n// ─────────────────────────────────────────────\n\nimport { AzureOpenAI } from 'openai';\nimport { AZURE_BASE_URL_TEMPLATE } from '../constants.js';\nimport type { ModelInfo, ProviderConfig } from '../types.js';\nimport { OpenAIProvider } from './openai.js';\n\nexport class AzureOpenAIProvider extends OpenAIProvider {\n constructor(config: ProviderConfig, model: ModelInfo) {\n const rawUrl = config.baseUrl ?? AZURE_BASE_URL_TEMPLATE.replace('{resource}', 'YOUR_RESOURCE');\n const endpoint = rawUrl.replace(/\\/+$/, ''); // Strip trailing slashes\n super(\n {\n ...config,\n baseUrl: endpoint, // Kept for superclass compatibility if it reads it\n },\n model,\n );\n\n // Use the official AzureOpenAI SDK class which correctly handles pathing and API keys natively\n this.client = new AzureOpenAI({\n apiKey: config.apiKey,\n endpoint: endpoint,\n deployment: config.deploymentName ?? model.id,\n apiVersion: config.apiVersion ?? '2024-08-01-preview',\n });\n }\n\n async listModels(): Promise<ModelInfo[]> {\n // Azure models are configured per deployment; return a static list\n return [this.model];\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n await this.client.chat.completions.create({\n model: this.model.id,\n messages: [{ role: 'user', content: 'ping' }],\n max_tokens: 1,\n });\n return true;\n } catch {\n return false;\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Google Gemini Provider\n// ─────────────────────────────────────────────\n\nimport {\n GoogleGenAI,\n HarmBlockThreshold,\n HarmCategory,\n type Content,\n type FunctionDeclaration,\n type Part,\n} from '@google/genai';\nimport type {\n ConversationMessage,\n GenerateOptions,\n GenerateResult,\n ImageAttachment,\n ModelInfo,\n ProviderConfig,\n StreamChunk,\n ToolCall,\n} from '../types.js';\nimport { MODELS } from '../constants.js';\nimport { BaseProvider } from './base.js';\n\nexport class GeminiProvider extends BaseProvider {\n private client: GoogleGenAI;\n\n constructor(config: ProviderConfig, model: ModelInfo) {\n super(config, model);\n this.client = new GoogleGenAI({ apiKey: config.apiKey ?? '' });\n }\n\n async generate(options: GenerateOptions): Promise<GenerateResult> {\n const chunks: StreamChunk[] = [];\n return this.generateStream(options, (c) => chunks.push(c));\n }\n\n async generateStream(\n options: GenerateOptions,\n onChunk: (chunk: StreamChunk) => void,\n ): Promise<GenerateResult> {\n const contents = this.buildContents(options.messages, options.images);\n\n const stream = await this.client.models.generateContentStream({\n model: this.model.id,\n contents,\n config: {\n systemInstruction: options.systemPrompt,\n safetySettings: [\n { category: HarmCategory.HARM_CATEGORY_HARASSMENT, threshold: HarmBlockThreshold.BLOCK_NONE },\n { category: HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold: HarmBlockThreshold.BLOCK_NONE },\n ],\n tools: options.tools?.length\n ? [{ functionDeclarations: options.tools.map(this.convertTool) }]\n : undefined,\n },\n });\n\n let fullContent = '';\n let inputTokens = 0;\n let outputTokens = 0;\n const toolCalls: ToolCall[] = [];\n let finishReason: GenerateResult['finishReason'] = 'stop';\n\n for await (const chunk of stream) {\n // ── Text content ──────────────────────────\n const text = chunk.text ?? '';\n if (text) {\n fullContent += text;\n onChunk({ text, finishReason: null });\n }\n\n // ── Tool / function calls ─────────────────\n const candidates = (chunk as any).candidates ?? [];\n for (const candidate of candidates) {\n for (const part of candidate?.content?.parts ?? []) {\n if (part.functionCall) {\n // Use function name as ID — Gemini matches functionResponse by name, not timestamp\n toolCalls.push({\n id: part.functionCall.name as string,\n name: part.functionCall.name as string,\n input: (part.functionCall.args ?? {}) as Record<string, unknown>,\n });\n finishReason = 'tool_use';\n }\n }\n // Capture finish reason from candidate\n if (candidate.finishReason) {\n const fr = (candidate.finishReason as string).toLowerCase();\n if (fr === 'stop') finishReason = toolCalls.length ? 'tool_use' : 'stop';\n else if (fr === 'max_tokens' || fr === 'length') finishReason = 'length';\n }\n }\n\n // ── Token usage ───────────────────────────\n const usage = (chunk as any).usageMetadata;\n if (usage) {\n inputTokens = usage.promptTokenCount ?? inputTokens;\n outputTokens = usage.candidatesTokenCount ?? outputTokens;\n }\n }\n\n onChunk({ text: '', finishReason });\n\n return {\n content: fullContent,\n usage: this.makeUsage(inputTokens, outputTokens), // ✅ real tokens now\n toolCalls: toolCalls.length ? toolCalls : undefined, // ✅ tool calls now returned\n finishReason,\n };\n }\n\n async countTokens(text: string): Promise<number> {\n try {\n const result = await this.client.models.countTokens({\n model: this.model.id,\n contents: [{ role: 'user', parts: [{ text }] }],\n });\n return result.totalTokens ?? 0;\n } catch {\n return Math.ceil(text.length / 4);\n }\n }\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const resp = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models?key=${this.config.apiKey}`,\n );\n if (!resp.ok) {\n // Invalid key / network error — fall back to the built-in model list\n // instead of crashing downstream consumers with a shape mismatch.\n return Object.values(MODELS).filter((m) => m.provider === 'gemini');\n }\n const data = await resp.json() as {\n models?: Array<{\n name: string;\n displayName: string;\n inputTokenLimit: number;\n outputTokenLimit: number;\n }>;\n };\n if (!Array.isArray(data?.models)) {\n return Object.values(MODELS).filter((m) => m.provider === 'gemini');\n }\n\n return data.models.map((m) => {\n const id = m.name.replace('models/', '');\n const known = Object.values(MODELS).find(\n (km) => km.id === id && km.provider === 'gemini',\n );\n if (known) return known;\n\n return {\n id,\n name: m.displayName || id,\n provider: 'gemini' as const,\n contextWindow: m.inputTokenLimit || 128_000,\n isVisionCapable:\n id.includes('vision') || id.includes('pro') || id.includes('flash'),\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: m.outputTokenLimit || 8_000,\n supportsStreaming: true,\n isLocal: false,\n };\n });\n } catch {\n return Object.values(MODELS).filter((m) => m.provider === 'gemini');\n }\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n await this.client.models.countTokens({\n model: this.model.id,\n contents: [{ role: 'user', parts: [{ text: 'ping' }] }],\n });\n return true;\n } catch {\n return false;\n }\n }\n\n // ── Private ──────────────────────────────────\n\n private buildContents(\n messages: ConversationMessage[],\n extraImages?: ImageAttachment[],\n ): Content[] {\n const contents: Content[] = [];\n\n for (const m of messages) {\n // ── System messages in history: prepend to the next user turn ──────\n // Gemini only accepts systemInstruction at the top level; mid-conversation\n // system messages are folded into the following user turn as context.\n if (m.role === 'system') {\n const text = typeof m.content === 'string' ? m.content : '';\n if (!text.trim()) continue;\n // Merge into previous user turn or create a new one\n const prev = contents[contents.length - 1];\n if (prev?.role === 'user') {\n (prev.parts as Part[]).unshift({ text: `[System context]: ${text}\\n\\n` });\n } else {\n contents.push({ role: 'user', parts: [{ text: `[System context]: ${text}` }] });\n }\n continue;\n }\n\n // ── Tool result messages → Gemini functionResponse in a user turn ──\n if (m.role === 'tool') {\n const toolContent = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n // toolCallId carries the function name for Gemini (set by gemini provider using tool name)\n const functionName = m.toolCallId ?? 'unknown_function';\n contents.push({\n role: 'user',\n parts: [{\n functionResponse: {\n name: functionName,\n response: { output: toolContent },\n },\n }] as Part[],\n });\n continue;\n }\n\n // ── Assistant messages: may include functionCall parts ─────────────\n if (m.role === 'assistant') {\n const parts: Part[] = [];\n\n // Text content\n const textContent = typeof m.content === 'string' ? m.content : '';\n if (textContent) parts.push({ text: textContent });\n\n // Tool calls → functionCall parts\n for (const tc of m.toolCalls ?? []) {\n parts.push({\n functionCall: {\n name: tc.name,\n args: tc.input as Record<string, unknown>,\n },\n } as Part);\n }\n\n if (parts.length > 0) {\n contents.push({ role: 'model', parts });\n }\n continue;\n }\n\n // ── User messages ─────────────────────────────────────────────────\n if (m.role === 'user') {\n const parts = this.convertMessageContent(m, contents.length === 0 ? extraImages : undefined);\n // Attach extra images only to the LAST user message\n if (extraImages?.length && contents.length > 0) {\n const isLastUser = !messages.slice(messages.indexOf(m) + 1).some(x => x.role === 'user');\n if (isLastUser) {\n for (const img of extraImages) {\n if (img.type === 'base64') {\n parts.push({ inlineData: { mimeType: img.mimeType, data: img.data } });\n }\n }\n }\n }\n if (parts.length > 0) {\n contents.push({ role: 'user', parts });\n }\n }\n }\n\n return contents;\n }\n\n private convertMessageContent(\n msg: ConversationMessage,\n extraImages?: ImageAttachment[],\n ): Part[] {\n const parts: Part[] = [];\n\n if (typeof msg.content === 'string') {\n parts.push({ text: msg.content });\n } else {\n for (const block of msg.content) {\n if (block.type === 'text') parts.push({ text: block.text });\n if (block.type === 'image') {\n const img = block.image as ImageAttachment;\n if (img.type === 'base64') {\n parts.push({ inlineData: { mimeType: img.mimeType, data: img.data } });\n }\n }\n }\n }\n\n for (const img of extraImages ?? []) {\n if (img.type === 'base64') {\n parts.push({ inlineData: { mimeType: img.mimeType, data: img.data } });\n }\n }\n\n return parts;\n }\n\n private convertTool(tool: {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n }): FunctionDeclaration {\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema as FunctionDeclaration['parameters'],\n };\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Ollama Local Provider\n// ─────────────────────────────────────────────\n\nimport axios from 'axios';\nimport type {\n ConversationMessage,\n GenerateOptions,\n GenerateResult,\n ModelInfo,\n ProviderConfig,\n StreamChunk,\n ToolCall,\n} from '../types.js';\nimport { OLLAMA_BASE_URL } from '../constants.js';\nimport { BaseProvider } from './base.js';\n\n// ── Ollama API types ───────────────────────────\n\ninterface OllamaToolCall {\n function: {\n name: string;\n // Ollama delivers arguments as an already-parsed object, not a JSON string.\n // Some older Ollama releases may deliver a JSON string — handled defensively below.\n arguments: Record<string, unknown> | string;\n };\n}\n\ninterface OllamaConversationMessage {\n role: string;\n content: string;\n images?: string[];\n // Present in assistant messages that contain native tool calls\n tool_calls?: OllamaToolCall[];\n}\n\ninterface OllamaChatChunk {\n message?: {\n content?: string;\n tool_calls?: OllamaToolCall[];\n };\n done: boolean;\n prompt_eval_count?: number;\n eval_count?: number;\n}\n\ninterface OllamaModelEntry { name: string; details?: { parameter_size?: string } }\n\n// ── Model family detection ─────────────────────\n\nconst TOOL_CAPABLE_FAMILIES = [\n 'llama3.1', 'llama3.2', 'llama3.3',\n 'qwen2', 'qwen2.5', 'qwen3',\n 'mistral-nemo', 'mistral-small',\n 'command-r',\n 'firefunction',\n];\n\nfunction isToolCapable(modelName: string): boolean {\n const name = modelName.toLowerCase();\n return TOOL_CAPABLE_FAMILIES.some((family) => name.includes(family));\n}\n\n// ── Provider ───────────────────────────────────\n\nexport class OllamaProvider extends BaseProvider {\n private baseUrl: string;\n\n constructor(config: ProviderConfig, model: ModelInfo) {\n super(config, model);\n this.baseUrl = config.baseUrl ?? OLLAMA_BASE_URL;\n }\n\n async generate(options: GenerateOptions): Promise<GenerateResult> {\n const chunks: StreamChunk[] = [];\n return this.generateStream(options, (c) => chunks.push(c));\n }\n\n async generateStream(\n options: GenerateOptions,\n onChunk: (chunk: StreamChunk) => void,\n ): Promise<GenerateResult> {\n const messages = this.convertMessages(options.messages, options.systemPrompt);\n\n // Convert tools to Ollama/OpenAI-compatible format when provided\n const ollamaTools = options.tools?.map((t) => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n\n const response = await axios.post<any>(\n `${this.baseUrl}/api/chat`,\n {\n model: this.model.id,\n messages,\n stream: true,\n tools: ollamaTools?.length ? ollamaTools : undefined,\n options: {\n num_predict: options.maxTokens ?? this.model.maxOutputTokens,\n temperature: options.temperature ?? 0.7,\n },\n },\n { responseType: 'stream' },\n );\n\n let fullContent = '';\n let inputTokens = 0;\n let outputTokens = 0;\n const pendingToolCalls: OllamaToolCall[] = [];\n\n await new Promise<void>((resolve, reject) => {\n let buffer = '';\n response.data.on('data', (chunk: Buffer) => {\n buffer += chunk.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const parsed = JSON.parse(line) as OllamaChatChunk;\n if (parsed.message?.content) {\n fullContent += parsed.message.content;\n onChunk({ text: parsed.message.content, finishReason: null });\n }\n if (parsed.message?.tool_calls?.length) {\n pendingToolCalls.push(...parsed.message.tool_calls);\n }\n if (parsed.done) {\n inputTokens = parsed.prompt_eval_count ?? 0;\n outputTokens = parsed.eval_count ?? 0;\n }\n } catch { /* ignore parse errors */ }\n }\n });\n response.data.on('end', () => {\n // Flush any trailing JSON line that was not newline-terminated.\n // Ollama usually ends each NDJSON line with \"\\n\", but if the server\n // disconnects on the last message the final response would otherwise\n // be lost and the task would report `done: false`.\n const tail = buffer.trim();\n if (tail) {\n try {\n const parsed = JSON.parse(tail) as OllamaChatChunk;\n if (parsed.message?.content) {\n fullContent += parsed.message.content;\n onChunk({ text: parsed.message.content, finishReason: null });\n }\n if (parsed.message?.tool_calls?.length) {\n pendingToolCalls.push(...parsed.message.tool_calls);\n }\n if (parsed.done) {\n inputTokens = parsed.prompt_eval_count ?? inputTokens;\n outputTokens = parsed.eval_count ?? outputTokens;\n }\n } catch { /* ignore malformed tail */ }\n }\n resolve();\n });\n response.data.on('error', reject);\n });\n\n // Convert Ollama tool calls to the normalised ToolCall format.\n // Ollama delivers arguments as an already-parsed object; some older versions\n // may deliver a JSON string — handle both defensively.\n const toolCalls: ToolCall[] = pendingToolCalls.map((tc, i) => {\n let input: Record<string, unknown>;\n if (typeof tc.function.arguments === 'string') {\n try {\n input = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n input = { __rawArguments: tc.function.arguments };\n }\n } else {\n input = tc.function.arguments as Record<string, unknown>;\n }\n return {\n id: `ollama-tool-${Date.now()}-${i}`,\n name: tc.function.name,\n input,\n };\n });\n\n const finishReason = toolCalls.length ? 'tool_use' : 'stop';\n onChunk({ text: '', finishReason });\n\n return {\n content: fullContent,\n usage: this.makeUsage(inputTokens, outputTokens),\n toolCalls: toolCalls.length ? toolCalls : undefined,\n finishReason,\n };\n }\n\n async countTokens(text: string): Promise<number> {\n return Math.ceil(text.length / 4);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const response = await axios.get<{ models: OllamaModelEntry[] }>(`${this.baseUrl}/api/tags`);\n const supportedKeywords = ['llama3', 'llama2', 'gemma', 'mistral', 'mixtral', 'qwen', 'phi3', 'codellama', 'deepseek', 'llava', 'starcoder', 'stable-code', 'nomic-embed'];\n return response.data.models\n .filter((m) => {\n const name = m.name.toLowerCase();\n return supportedKeywords.some((k) => name.includes(k));\n })\n .map((m) => ({\n id: m.name,\n name: m.name,\n provider: 'ollama' as const,\n contextWindow: 128_000,\n isVisionCapable: m.name.includes('llava') || m.name.includes('vision'),\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 4_000,\n supportsStreaming: true,\n isLocal: true,\n supportsToolUse: isToolCapable(m.name),\n minSizeB: this.parseSizeB(m.details?.parameter_size),\n }));\n } catch {\n return [];\n }\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n await axios.get(`${this.baseUrl}/api/tags`, { timeout: 2000 });\n return true;\n } catch {\n return false;\n }\n }\n\n private convertMessages(messages: ConversationMessage[], systemPrompt?: string): OllamaConversationMessage[] {\n const result: OllamaConversationMessage[] = [];\n if (systemPrompt) result.push({ role: 'system', content: systemPrompt });\n for (const m of messages) {\n if (m.role === 'system') {\n result.push({ role: 'system', content: typeof m.content === 'string' ? m.content : '' });\n continue;\n }\n\n // Tool result messages — role: 'tool' is supported by modern Ollama\n if (m.role === 'tool') {\n result.push({\n role: 'tool',\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n });\n continue;\n }\n\n // Assistant messages that carried native tool calls\n if (m.role === 'assistant' && m.toolCalls?.length) {\n result.push({\n role: 'assistant',\n content: typeof m.content === 'string' ? m.content : '',\n tool_calls: m.toolCalls.map((tc) => ({\n function: {\n name: tc.name,\n arguments: tc.input,\n },\n })),\n });\n continue;\n }\n\n if (typeof m.content === 'string') {\n result.push({ role: m.role, content: m.content });\n continue;\n }\n const text = m.content.filter((b) => b.type === 'text').map((b) => b.type === 'text' ? b.text : '').join('');\n const images = m.content.filter((b) => b.type === 'image').map((b) => {\n if (b.type === 'image') return b.image.data;\n return '';\n }).filter(Boolean);\n result.push({ role: m.role, content: text, images: images.length ? images : undefined });\n }\n return result;\n }\n\n private parseSizeB(size?: string): number | undefined {\n if (!size) return undefined;\n const match = /(\\d+(?:\\.\\d+)?)\\s*([BbMmKkGg]?)/.exec(size);\n if (!match) return undefined;\n const num = parseFloat(match[1]!);\n const unit = (match[2] ?? '').toUpperCase();\n if (unit === 'B') return num;\n if (unit === 'M') return num / 1000;\n return undefined;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — OpenAI-Compatible Endpoint Provider\n// ─────────────────────────────────────────────\n\nimport OpenAI from 'openai';\nimport type { ModelInfo, ProviderConfig } from '../types.js';\nimport { OpenAIProvider } from './openai.js';\n\nexport class OpenAICompatibleProvider extends OpenAIProvider {\n constructor(config: ProviderConfig, model: ModelInfo) {\n super(config, model);\n // Override client to use custom base URL\n this.client = new OpenAI({\n apiKey: config.apiKey ?? 'not-required',\n baseURL: config.baseUrl,\n });\n }\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const response = await this.client.models.list();\n return response.data.map((m) => ({\n id: m.id,\n name: m.id,\n provider: 'openai-compatible' as const,\n contextWindow: 32_000,\n isVisionCapable: false,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 4_000,\n supportsStreaming: true,\n isLocal: false,\n }));\n } catch {\n return [this.model];\n }\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n await this.client.models.list();\n return true;\n } catch {\n return false;\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Model Selector\n// ─────────────────────────────────────────────\n\nimport type { ModelInfo, ProviderType, TierRole } from '../../types.js';\nimport {\n T1_MODEL_PRIORITY,\n T2_MODEL_PRIORITY,\n T3_MODEL_PRIORITY,\n VISION_MODEL_PRIORITY,\n MODELS,\n} from '../../constants.js';\n\nexport class ModelSelector {\n private availableProviders: Set<ProviderType>;\n private availableModels: Map<string, ModelInfo>;\n\n constructor(availableProviders: Set<ProviderType>) {\n this.availableProviders = availableProviders;\n this.availableModels = new Map(Object.entries(MODELS));\n }\n\n addDynamicModel(model: ModelInfo): void {\n this.availableModels.set(model.id, model);\n }\n\n getAvailableModelsForProvider(provider: ProviderType): ModelInfo[] {\n const models = new Map<string, ModelInfo>();\n for (const model of this.availableModels.values()) {\n if (model.provider === provider && this.availableProviders.has(provider)) {\n models.set(model.id, model);\n }\n }\n return [...models.values()].sort((a, b) => a.name.localeCompare(b.name));\n }\n\n selectForTier(\n tier: TierRole,\n overrideModelId?: string,\n requireVision = false,\n ): ModelInfo | null {\n if (overrideModelId) {\n let model = this.availableModels.get(overrideModelId);\n if (!model) {\n model = this.resolveDynamicModel(overrideModelId);\n }\n if (model && this.availableProviders.has(model.provider)) return model;\n }\n\n if (requireVision) {\n return this.selectVisionModel();\n }\n\n const priority = this.getPriorityList(tier);\n for (const key of priority) {\n const model = this.availableModels.get(key);\n if (model && this.availableProviders.has(model.provider)) return model;\n }\n\n // Fallback: any model from available providers\n for (const [, model] of this.availableModels) {\n if (this.availableProviders.has(model.provider)) return model;\n }\n\n return null;\n }\n\n selectVisionModel(): ModelInfo | null {\n for (const key of VISION_MODEL_PRIORITY) {\n const model = this.availableModels.get(key);\n if (model && this.availableProviders.has(model.provider) && model.isVisionCapable) {\n return model;\n }\n }\n return null;\n }\n\n getNextFallback(currentModelId: string, tier: TierRole): ModelInfo | null {\n const priority = this.getPriorityList(tier);\n const currentIdx = priority.indexOf(currentModelId);\n if (currentIdx === -1) return null;\n\n for (let i = currentIdx + 1; i < priority.length; i++) {\n const key = priority[i]!;\n const model = this.availableModels.get(key);\n if (model && this.availableProviders.has(model.provider)) return model;\n }\n return null;\n }\n\n private getPriorityList(tier: TierRole): string[] {\n switch (tier) {\n case 'T1': return T1_MODEL_PRIORITY;\n case 'T2': return T2_MODEL_PRIORITY;\n case 'T3': return T3_MODEL_PRIORITY;\n }\n }\n\n getAllAvailableModels(): ModelInfo[] {\n return Array.from(this.availableModels.values()).filter(m =>\n this.availableProviders.has(m.provider),\n );\n }\n\n /**\n * Returns all available models eligible for the given tier, ordered by the\n * tier's priority chain. Use this as the candidate set for scored selection.\n */\n getCandidatesForTier(tier: TierRole): ModelInfo[] {\n const priority = this.getPriorityList(tier);\n const candidates: ModelInfo[] = [];\n for (const key of priority) {\n const model = this.availableModels.get(key);\n if (model && this.availableProviders.has(model.provider)) {\n candidates.push(model);\n }\n }\n return candidates;\n }\n\n isProviderAvailable(provider: ProviderType): boolean {\n return this.availableProviders.has(provider);\n }\n\n markProviderUnavailable(provider: ProviderType): void {\n this.availableProviders.delete(provider);\n }\n\n /**\n * Re-add a provider to the available set after it has recovered (e.g. after\n * a failover timeout expires or a successful call confirms recovery). Only\n * re-enables providers that were originally configured — callers should\n * guard against enabling providers that were never configured.\n */\n markProviderAvailable(provider: ProviderType): void {\n this.availableProviders.add(provider);\n }\n\n private resolveDynamicModel(overrideModelId: string): ModelInfo | undefined {\n let providerStr: ProviderType | null = null;\n let actualId = overrideModelId;\n\n if (overrideModelId.includes(':')) {\n const parts = overrideModelId.split(':');\n const prefix = parts[0]!.toLowerCase();\n const validProviders = ['anthropic', 'openai', 'gemini', 'azure', 'openai-compatible', 'ollama'];\n if (validProviders.includes(prefix)) {\n providerStr = prefix as ProviderType;\n actualId = parts.slice(1).join(':');\n }\n }\n\n if (!providerStr) {\n const lower = actualId.toLowerCase();\n if (lower.includes('claude')) providerStr = 'anthropic';\n else if (lower.startsWith('gpt') || lower.startsWith('o1') || lower.startsWith('o3')) providerStr = 'openai';\n else if (lower.includes('gemini')) providerStr = 'gemini';\n else if (this.availableProviders.has('ollama')) providerStr = 'ollama';\n else if (this.availableProviders.has('openai-compatible')) providerStr = 'openai-compatible';\n else if (this.availableProviders.size === 1) providerStr = Array.from(this.availableProviders)[0]!;\n }\n\n if (providerStr && this.availableProviders.has(providerStr)) {\n const dynamicModel: ModelInfo = {\n id: actualId,\n name: actualId,\n provider: providerStr,\n contextWindow: 128_000,\n isVisionCapable: false,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: providerStr === 'ollama',\n };\n this.addDynamicModel(dynamicModel);\n return dynamicModel;\n }\n return undefined;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Provider Failover Manager\n// ─────────────────────────────────────────────\n\nimport type { ModelInfo, ProviderType, TierRole } from '../../types.js';\nimport type { ModelSelector } from './selector.js';\n\ninterface FailoverState {\n provider: ProviderType;\n failedAt: number;\n reason: string;\n retryAfterMs: number;\n /** Number of consecutive failures — drives backoff step selection */\n failureCount: number;\n}\n\nexport class FailoverManager {\n private failures: Map<ProviderType, FailoverState> = new Map();\n private selector: ModelSelector;\n\n // Exponential backoff: 30s → 60s → 120s → 300s\n private readonly BACKOFF_STEPS = [30_000, 60_000, 120_000, 300_000];\n\n constructor(selector: ModelSelector) {\n this.selector = selector;\n }\n\n recordFailure(provider: ProviderType, reason: string): void {\n const existing = this.failures.get(provider);\n // Increment failure count and use it as the backoff step index so that\n // repeated failures correctly escalate through the full backoff ladder.\n const failureCount = (existing?.failureCount ?? 0) + 1;\n const step = Math.min(failureCount - 1, this.BACKOFF_STEPS.length - 1);\n const retryAfterMs = this.BACKOFF_STEPS[step] ?? 30_000;\n\n this.failures.set(provider, {\n provider,\n failedAt: Date.now(),\n reason,\n retryAfterMs,\n failureCount,\n });\n\n this.selector.markProviderUnavailable(provider);\n }\n\n isProviderAvailable(provider: ProviderType): boolean {\n const failure = this.failures.get(provider);\n if (!failure) return true;\n\n if (Date.now() - failure.failedAt >= failure.retryAfterMs) {\n // Retry window passed — re-enable provider in both the failure map and\n // the selector so the model priority chain can route to it again.\n this.failures.delete(provider);\n this.selector.markProviderAvailable(provider);\n return true;\n }\n return false;\n }\n\n /**\n * Call after a successful generation to immediately re-enable a provider\n * that had previously been marked unavailable. This allows fast recovery\n * when a transient rate-limit clears before the backoff window expires,\n * preventing unnecessary routing to more expensive fallback models.\n */\n recordSuccess(provider: ProviderType): void {\n if (this.failures.has(provider)) {\n this.failures.delete(provider);\n this.selector.markProviderAvailable(provider);\n }\n }\n\n getFallbackModel(currentModel: ModelInfo, tier: TierRole): ModelInfo | null {\n return this.selector.getNextFallback(currentModel.id, tier);\n }\n\n getFailureReport(): Record<string, string> {\n const report: Record<string, string> = {};\n for (const [provider, state] of this.failures) {\n const remainingMs = state.retryAfterMs - (Date.now() - state.failedAt);\n report[provider] =\n `Failed (${state.failureCount}x): ${state.reason}. Retry in ${Math.ceil(remainingMs / 1000)}s`;\n }\n return report;\n }\n\n getFailureCount(provider: ProviderType): number {\n return this.failures.get(provider)?.failureCount ?? 0;\n }\n\n clearFailure(provider: ProviderType): void {\n this.failures.delete(provider);\n // Sync the selector so that manually cleared providers can be routed to\n // immediately without waiting for the backoff window to expire.\n this.selector.markProviderAvailable(provider);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Per-Provider Token Bucket (TPM)\n// ─────────────────────────────────────────────\n\nimport type { ProviderType } from '../../types.js';\n\n/**\n * Default tokens-per-minute per provider. These are conservative floors that\n * match free-tier quotas; users can override via config.rateLimits.providerTpm.\n */\nexport const DEFAULT_PROVIDER_TPM: Record<ProviderType, number> = {\n anthropic: 40_000,\n openai: 30_000,\n gemini: 60_000,\n azure: 30_000,\n 'openai-compatible': 30_000,\n ollama: Number.POSITIVE_INFINITY,\n};\n\ninterface Bucket {\n tokensPerMinute: number;\n available: number;\n lastRefillMs: number;\n}\n\n/**\n * Token bucket rate limiter keyed by provider type.\n *\n * Each call to `acquire(provider, cost)` refills the bucket based on time\n * elapsed since the last refill, then waits (via setTimeout) until enough\n * tokens are available. Setting TPM to Infinity disables limiting for that\n * provider (used for local Ollama by default).\n */\nexport class TpmLimiter {\n private buckets: Map<ProviderType, Bucket> = new Map();\n\n constructor(overrides: Partial<Record<ProviderType, number>> = {}) {\n for (const [type, tpm] of Object.entries({ ...DEFAULT_PROVIDER_TPM, ...overrides })) {\n const limit = tpm ?? DEFAULT_PROVIDER_TPM[type as ProviderType];\n this.buckets.set(type as ProviderType, {\n tokensPerMinute: limit,\n available: limit,\n lastRefillMs: Date.now(),\n });\n }\n }\n\n /**\n * Block until `estimatedTokens` can be subtracted from the provider's\n * bucket. Estimated cost is best-effort — actual tokens used in the call\n * are reported back via `refund` when short, or simply settled at the next\n * refill.\n */\n async acquire(provider: ProviderType, estimatedTokens: number): Promise<void> {\n const bucket = this.buckets.get(provider);\n if (!bucket || bucket.tokensPerMinute === Number.POSITIVE_INFINITY) return;\n\n // Clamp a single request to the bucket capacity so it can never be\n // impossible to fulfil.\n const want = Math.min(estimatedTokens, bucket.tokensPerMinute);\n\n for (;;) {\n this.refill(bucket);\n if (bucket.available >= want) {\n bucket.available -= want;\n return;\n }\n const deficit = want - bucket.available;\n // Wait just long enough to accumulate the deficit.\n const waitMs = Math.max(50, Math.ceil((deficit / bucket.tokensPerMinute) * 60_000));\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n }\n }\n\n /**\n * Return unused estimated tokens back to the bucket after the call\n * resolved with fewer actual tokens than estimated.\n */\n refund(provider: ProviderType, tokens: number): void {\n const bucket = this.buckets.get(provider);\n if (!bucket || bucket.tokensPerMinute === Number.POSITIVE_INFINITY) return;\n bucket.available = Math.min(bucket.tokensPerMinute, bucket.available + Math.max(0, tokens));\n }\n\n setLimit(provider: ProviderType, tokensPerMinute: number): void {\n const existing = this.buckets.get(provider);\n if (existing) {\n existing.tokensPerMinute = tokensPerMinute;\n if (existing.available > tokensPerMinute) existing.available = tokensPerMinute;\n } else {\n this.buckets.set(provider, {\n tokensPerMinute,\n available: tokensPerMinute,\n lastRefillMs: Date.now(),\n });\n }\n }\n\n /** Internal: top up the bucket based on elapsed time. */\n private refill(bucket: Bucket): void {\n const now = Date.now();\n const elapsedMs = now - bucket.lastRefillMs;\n if (elapsedMs <= 0) return;\n const refill = (elapsedMs / 60_000) * bucket.tokensPerMinute;\n bucket.available = Math.min(bucket.tokensPerMinute, bucket.available + refill);\n bucket.lastRefillMs = now;\n }\n\n /** Diagnostics — returns current available budget per provider. */\n snapshot(): Record<string, { tokensPerMinute: number; available: number }> {\n const out: Record<string, { tokensPerMinute: number; available: number }> = {};\n for (const [k, v] of this.buckets) {\n this.refill(v);\n out[k] = { tokensPerMinute: v.tokensPerMinute, available: Math.round(v.available) };\n }\n return out;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Local Model Request Queue\n// ─────────────────────────────────────────────\n\n/**\n * A simple FIFO concurrency limiter for local (e.g. Ollama) inference calls.\n *\n * When a slot frees up, the next waiter receives a `release` function; calling\n * it frees the slot for the next caller. Setting maxConcurrent > 1 is useful\n * for multi-GPU or CPU setups; the default of 1 serializes all calls to protect\n * GPU VRAM on single-GPU machines.\n */\nexport class LocalRequestQueue {\n private readonly maxConcurrent: number;\n private active = 0;\n private readonly queue: Array<(release: () => void) => void> = [];\n\n constructor(maxConcurrent = 1) {\n this.maxConcurrent = Math.max(1, maxConcurrent);\n }\n\n /**\n * Acquire a queue slot. Returns a `release` function that MUST be called\n * when the inference call is done (even on error). Rejects if the slot\n * cannot be acquired within `timeoutMs`.\n */\n async acquire(timeoutMs?: number): Promise<() => void> {\n if (this.active < this.maxConcurrent) {\n this.active++;\n return this.makeRelease();\n }\n\n return new Promise<() => void>((resolve, reject) => {\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const resolver = (release: () => void) => {\n if (settled) return;\n settled = true;\n if (timer !== undefined) clearTimeout(timer);\n resolve(release);\n };\n\n if (timeoutMs !== undefined && timeoutMs > 0) {\n timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n const idx = this.queue.indexOf(resolver);\n if (idx !== -1) this.queue.splice(idx, 1);\n reject(new Error(\n `Local model queue: timed out waiting for a free slot after ${timeoutMs}ms. ` +\n `Active: ${this.active}, Queued: ${this.queue.length}. ` +\n `Consider increasing localConcurrency or localInferenceTimeoutMs in your config.`,\n ));\n }, timeoutMs);\n }\n\n this.queue.push(resolver);\n });\n }\n\n /** Number of in-flight requests. */\n get activeCount(): number {\n return this.active;\n }\n\n /** Number of requests waiting for a slot. */\n get queueDepth(): number {\n return this.queue.length;\n }\n\n private makeRelease(): () => void {\n let called = false;\n return () => {\n if (called) return;\n called = true;\n this.active--;\n const next = this.queue.shift();\n if (next) {\n this.active++;\n next(this.makeRelease());\n }\n };\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Cost Calculator\n// ─────────────────────────────────────────────\n\nimport type { ModelInfo, TokenUsage } from '../types.js';\n\nexport function calculateCost(\n inputTokens: number,\n outputTokens: number,\n model: ModelInfo,\n): number {\n return (\n (inputTokens / 1000) * model.inputCostPer1kTokens +\n (outputTokens / 1000) * model.outputCostPer1kTokens\n );\n}\n\nexport function buildTokenUsage(\n inputTokens: number,\n outputTokens: number,\n model: ModelInfo,\n): TokenUsage {\n return {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n estimatedCostUsd: calculateCost(inputTokens, outputTokens, model),\n };\n}","// ─────────────────────────────────────────────\n// Cascade AI — Retry Utility\n// ─────────────────────────────────────────────\n\n/**\n * Thrown when a Cascade run is aborted via `AbortSignal`.\n * Caught at the `Cascade.run()` boundary — does NOT propagate as an\n * unhandled rejection. Callers receive a partial result instead.\n */\nexport class CascadeCancelledError extends Error {\n constructor(reason?: string) {\n super(reason ?? 'Run was cancelled via AbortSignal');\n this.name = 'CascadeCancelledError';\n }\n}\n\n/**\n * A retryable error that carries a `.userMessage` for display.\n */\nexport class CascadeToolError extends Error {\n /** A friendly message to show the user / T3 */\n public readonly userMessage: string;\n /** Whether this error class is retryable by default */\n public readonly retryable: boolean;\n\n constructor(userMessage: string, cause?: unknown, retryable = false) {\n const causeMsg = cause instanceof Error ? cause.message : String(cause);\n super(`${userMessage}: ${causeMsg}`);\n this.name = 'CascadeToolError';\n this.userMessage = userMessage;\n this.retryable = retryable;\n }\n}\n\nexport interface RetryOptions {\n /** Maximum number of attempts (including the first). Default: 3 */\n maxAttempts?: number;\n /** Base delay in ms (doubled each retry). Default: 300 */\n baseDelayMs?: number;\n /**\n * Maximum delay cap in ms to prevent excessive waits. Default: 30_000 (30s).\n * Useful when `baseDelayMs` is large and `maxAttempts` is high.\n */\n maxDelayMs?: number;\n /**\n * When true (default), adds ±25% random jitter to each delay to prevent\n * thundering-herd issues when many callers retry simultaneously.\n */\n jitter?: boolean;\n /** Custom predicate: return true if the error warrants a retry. */\n isRetryable?: (err: Error) => boolean;\n /** Optional callback fired before each retry with the attempt number and error. */\n onRetry?: (attempt: number, err: Error, delayMs: number) => void;\n}\n\n/**\n * Executes `fn`, retrying on transient errors up to `maxAttempts` times.\n * Uses exponential back-off with optional jitter to spread load across retrying clients.\n *\n * @example\n * const result = await withRetry(() => fetchRemoteData(), {\n * maxAttempts: 3,\n * isRetryable: (e) => e.message.includes('ECONNRESET'),\n * });\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n opts: RetryOptions = {},\n): Promise<T> {\n const maxAttempts = opts.maxAttempts ?? 3;\n const baseDelayMs = opts.baseDelayMs ?? 300;\n const maxDelayMs = opts.maxDelayMs ?? 30_000;\n const useJitter = opts.jitter !== false; // default: true\n const isRetryable = opts.isRetryable ?? defaultIsRetryable;\n\n let lastErr: Error = new Error('No attempts made');\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err instanceof Error ? err : new Error(String(err));\n\n // Check CascadeToolError.retryable if applicable\n if (lastErr instanceof CascadeToolError && !lastErr.retryable) {\n throw lastErr;\n }\n\n if (attempt === maxAttempts || !isRetryable(lastErr)) {\n throw lastErr;\n }\n\n const rawDelay = Math.min(baseDelayMs * 2 ** (attempt - 1), maxDelayMs);\n // Add ±25% jitter to reduce thundering-herd on simultaneous retries\n const delay = useJitter\n ? rawDelay * (0.75 + Math.random() * 0.5)\n : rawDelay;\n\n opts.onRetry?.(attempt, lastErr, delay);\n await sleep(delay);\n }\n }\n\n throw lastErr;\n}\n\n/**\n * Wraps a promise with a timeout. Clears the internal timer whether the\n * promise resolves, rejects, or times out to avoid lingering handles.\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n errorMessage = 'Operation timed out',\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(errorMessage)),\n timeoutMs,\n );\n });\n\n try {\n return await Promise.race([promise, timeoutPromise]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n}\n\n// ── Helpers ────────────────────────────────────\n\nfunction defaultIsRetryable(err: Error): boolean {\n const msg = err.message.toLowerCase();\n return (\n msg.includes('econnreset') ||\n msg.includes('econnrefused') ||\n msg.includes('etimedout') ||\n msg.includes('enotfound') || // DNS resolution failure (transient)\n msg.includes('econnaborted') || // Connection aborted mid-stream\n msg.includes('socket hang up') ||\n msg.includes('socket timeout') ||\n msg.includes('network error') ||\n msg.includes('failed to fetch') || // fetch() in browser/node environments\n msg.includes('rate limit') ||\n msg.includes('too many requests') || // 429\n msg.includes('overloaded') || // Anthropic 529 body text\n msg.includes('529') || // Anthropic overload status code\n msg.includes('503') ||\n msg.includes('502') ||\n msg.includes('504') || // Gateway timeout\n msg.includes('internal server error') // 500 — may be transient\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((res) => setTimeout(res, ms));\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Model Profiler\n// ─────────────────────────────────────────────\n//\n// Discovers model specializations at first run.\n// Strategy: OpenRouter public API first (no auth, free), then direct LLM query as fallback.\n// Results are cached in SQLite so profiling runs at most once per model.\n//\n\nimport type { ModelInfo, ProviderType } from '../../types.js';\nimport type { MemoryStore } from '../../memory/store.js';\nimport type { CascadeRouter } from './index.js';\n\n// Models to skip — no specialization query makes sense for these\nconst SKIP_PATTERN = /embed|dall-e|whisper|tts|vision|instruct-vision|rerank/i;\n\ninterface OpenRouterModel {\n id: string;\n description?: string;\n name?: string;\n}\n\nconst SPECIALIZATION_KEYWORDS: Record<string, string[]> = {\n code: ['code', 'coding', 'programming', 'developer', 'software', 'function', 'debug', 'typescript', 'python', 'javascript'],\n analysis: ['analysis', 'analytical', 'reasoning', 'logic', 'research', 'evaluate', 'assess', 'explain'],\n creative: ['creative', 'writing', 'story', 'poetry', 'content', 'blog', 'essay', 'narrative'],\n data: ['data', 'sql', 'statistics', 'chart', 'csv', 'json', 'excel', 'spreadsheet', 'math', 'mathematical'],\n instruction: ['instruction', 'instruction-following', 'accurate', 'precise', 'factual'],\n multilingual: ['multilingual', 'language', 'translation', 'linguistic'],\n long_context: ['long', 'context', 'document', 'book', 'summarize', 'large'],\n};\n\nfunction extractSpecializations(description: string): string[] {\n const lower = description.toLowerCase();\n const found: string[] = [];\n for (const [key, terms] of Object.entries(SPECIALIZATION_KEYWORDS)) {\n if (terms.some(t => lower.includes(t))) {\n found.push(key);\n }\n }\n return found;\n}\n\nasync function fetchOpenRouterModels(): Promise<OpenRouterModel[]> {\n try {\n const resp = await fetch('https://openrouter.ai/api/v1/models', {\n headers: { 'User-Agent': 'Cascade-AI/0.4.0' },\n signal: AbortSignal.timeout(8_000),\n });\n if (!resp.ok) return [];\n const data = await resp.json() as { data?: OpenRouterModel[] };\n return data.data ?? [];\n } catch {\n return [];\n }\n}\n\nasync function queryModelDirectly(router: CascadeRouter, model: ModelInfo): Promise<string[]> {\n try {\n const result = await router.generate('T3', {\n messages: [{\n role: 'user',\n content: 'What are your top 3 task specializations? Reply with valid JSON only: {\"specializations\": [\"<area1>\", \"<area2>\", \"<area3>\"]}',\n }],\n maxTokens: 60,\n });\n const match = /\\{[\\s\\S]*?\\}/.exec(result.content);\n if (!match) return [];\n const parsed = JSON.parse(match[0]) as { specializations?: unknown[] };\n const specs = parsed.specializations;\n if (!Array.isArray(specs)) return [];\n return specs.filter((s): s is string => typeof s === 'string').slice(0, 5);\n } catch {\n return [];\n }\n}\n\nexport class ModelProfiler {\n private store: MemoryStore;\n private router?: CascadeRouter;\n\n constructor(store: MemoryStore, router?: CascadeRouter) {\n this.store = store;\n this.router = router;\n }\n\n /**\n * Profile all models that haven't been profiled yet.\n * Safe to call concurrently — SQLite upsert handles races.\n */\n async profileAll(models: ModelInfo[]): Promise<void> {\n const alreadyProfiled = new Set(this.store.getProfiledModelIds());\n const toProfile = models.filter(\n m => !alreadyProfiled.has(m.id) && !SKIP_PATTERN.test(m.id) && !SKIP_PATTERN.test(m.name),\n );\n if (toProfile.length === 0) return;\n\n // Fetch OpenRouter catalog once\n const openRouterModels = await fetchOpenRouterModels();\n const orByNormalizedId = new Map<string, OpenRouterModel>();\n for (const m of openRouterModels) {\n orByNormalizedId.set(m.id.toLowerCase(), m);\n // Also index by just the model name after the last '/'\n const short = m.id.split('/').pop();\n if (short) orByNormalizedId.set(short.toLowerCase(), m);\n }\n\n await Promise.allSettled(\n toProfile.map(async (model) => {\n let specializations: string[] = [];\n\n // Try OpenRouter first\n const orMatch = orByNormalizedId.get(model.id.toLowerCase())\n ?? orByNormalizedId.get(model.id.split('/').pop()?.toLowerCase() ?? '');\n if (orMatch?.description) {\n specializations = extractSpecializations(orMatch.description);\n }\n\n // Fall back to direct LLM query if no data found\n if (specializations.length === 0 && this.router) {\n specializations = await queryModelDirectly(this.router, model);\n }\n\n // Store even if empty so we don't re-attempt\n this.store.saveModelProfile(model.id, model.provider as ProviderType, specializations);\n }),\n );\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Model Router\n// ─────────────────────────────────────────────\n\nimport EventEmitter from 'node:events';\nimport type {\n CascadeConfig,\n GenerateOptions,\n GenerateResult,\n ModelInfo,\n ProviderConfig,\n ProviderType,\n StreamChunk,\n TierRole,\n TokenUsage,\n} from '../../types.js';\nimport { AnthropicProvider } from '../../providers/anthropic.js';\nimport { AzureOpenAIProvider } from '../../providers/azure.js';\nimport { GeminiProvider } from '../../providers/gemini.js';\nimport { OllamaProvider } from '../../providers/ollama.js';\nimport { OpenAICompatibleProvider } from '../../providers/openai-compatible.js';\nimport { OpenAIProvider } from '../../providers/openai.js';\nimport type { BaseProvider } from '../../providers/base.js';\nimport { ModelSelector } from './selector.js';\nimport { FailoverManager } from './failover.js';\nimport { TpmLimiter } from './tpm-limiter.js';\nimport { LocalRequestQueue } from './local-queue.js';\nimport { MODELS, OLLAMA_BASE_URL } from '../../constants.js';\nimport { calculateCost } from '../../utils/cost.js';\nimport { withTimeout } from '../../utils/retry.js';\nimport { ModelProfiler } from './model-profiler.js';\nimport type { MemoryStore } from '../../memory/store.js';\n\nexport interface RouterStats {\n totalTokens: number;\n totalCostUsd: number;\n callsByProvider: Record<string, number>;\n callsByTier: Record<string, number>;\n /** Accumulated cost (USD) broken down per tier — useful for budget attribution. */\n costByTier: Record<string, number>;\n /** Accumulated token usage broken down per tier (input + output). */\n tokensByTier: Record<string, number>;\n /** Input and output token counts per tier for granular cost analysis. */\n inputTokensByTier: Record<string, number>;\n outputTokensByTier: Record<string, number>;\n}\n\nexport class CascadeRouter extends EventEmitter {\n private selector!: ModelSelector;\n private failover!: FailoverManager;\n private providers: Map<string, BaseProvider> = new Map();\n private stats: RouterStats = {\n totalTokens: 0,\n totalCostUsd: 0,\n callsByProvider: {},\n callsByTier: {},\n costByTier: {},\n tokensByTier: {},\n inputTokensByTier: {},\n outputTokensByTier: {},\n };\n\n private tierModels: Map<TierRole, ModelInfo> = new Map();\n private config!: CascadeConfig;\n private sessionCostUsd = 0;\n /**\n * Budget state machine — guards against two concurrent `generate()` calls\n * each firing the warning or both slipping past the hard cap. All\n * transitions happen inside `updateBudgetState()` which is called only\n * from `recordStats`, single-threaded per V8 event loop turn.\n */\n private budgetState: 'ok' | 'warned' | 'exceeded' = 'ok';\n private budgetExceededReason: string | undefined;\n private tpmLimiter!: TpmLimiter;\n private localQueue!: LocalRequestQueue;\n\n /** Thrown when the configured budget is exceeded. */\n static BudgetExceededError = class extends Error {\n constructor(msg: string) { super(msg); this.name = 'BudgetExceededError'; }\n };\n\n constructor() {\n super();\n }\n\n async init(config: CascadeConfig): Promise<void> {\n this.config = config;\n const availableProviders = await this.detectAvailableProviders(config.providers);\n this.selector = new ModelSelector(availableProviders);\n this.failover = new FailoverManager(this.selector);\n this.tpmLimiter = new TpmLimiter((config as unknown as {\n rateLimits?: { providerTpm?: Partial<Record<ProviderType, number>> };\n }).rateLimits?.providerTpm ?? {});\n\n this.localQueue = new LocalRequestQueue(config.localConcurrency ?? 1);\n\n // Discover Ollama models and register them\n const ollamaCfg = config.providers.find((p) => p.type === 'ollama');\n if (availableProviders.has('ollama')) {\n await this.discoverOllamaModels(ollamaCfg);\n }\n\n // Apply explicit tier overrides first.\n for (const tier of ['T1', 'T2', 'T3'] as TierRole[]) {\n const override =\n tier === 'T1' ? config.models.t1\n : tier === 'T2' ? config.models.t2\n : config.models.t3;\n if (!override) continue;\n\n const model = this.selector.selectForTier(tier, override);\n if (!model) {\n throw new Error(`Configured model \"${override}\" for ${tier} could not be loaded. Check provider availability and exact model name.`);\n }\n\n if (model.id !== override && `${model.provider}:${model.id}` !== override) {\n throw new Error(`Configured model \"${override}\" for ${tier} resolved to \"${model.id}\". Use the exact provider model ID or prefix the provider (e.g. gemini:${override}).`);\n }\n\n this.tierModels.set(tier, model);\n this.ensureProvider(model, config.providers);\n }\n\n // Fill any tiers without explicit overrides using priority defaults.\n for (const tier of ['T1', 'T2', 'T3'] as TierRole[]) {\n if (this.tierModels.has(tier)) continue;\n const model = this.selector.selectForTier(tier);\n if (model) {\n this.tierModels.set(tier, model);\n this.ensureProvider(model, config.providers);\n }\n }\n }\n\n /**\n * Run model specialization profiling in the background.\n * Only profiles models that haven't been profiled yet (cache-first).\n * No-op if store is not provided.\n */\n async profileModels(store: MemoryStore): Promise<void> {\n const allModels = this.selector.getAllAvailableModels();\n const profiler = new ModelProfiler(store, this);\n // Run in background — don't block task execution\n profiler.profileAll(allModels).catch(() => { /* non-fatal */ });\n }\n\n async generate(\n tier: TierRole,\n options: GenerateOptions,\n onChunk?: (chunk: StreamChunk) => void,\n requireVision = false,\n ): Promise<GenerateResult> {\n // Hard stop: refuse every new LLM call once the budget kill-switch fired.\n // This closes the race where two in-flight generate() calls both slipped\n // past the pre-existing `>= cap` check and pushed spend over the limit.\n if (this.budgetState === 'exceeded') {\n throw new CascadeRouter.BudgetExceededError(\n this.budgetExceededReason ?? 'Session budget exceeded.',\n );\n }\n\n // ── Apply per-tier token limit ──────────────\n const limits = this.config?.tierLimits;\n const tierKey = tier.toLowerCase() as 't1' | 't2' | 't3';\n const tierMaxTokens = limits?.[`${tierKey}MaxTokens` as keyof typeof limits] as number | undefined;\n if (tierMaxTokens && (!options.maxTokens || options.maxTokens > tierMaxTokens)) {\n options = { ...options, maxTokens: tierMaxTokens };\n }\n const model = requireVision\n ? this.selector.selectVisionModel()\n : this.tierModels.get(tier);\n\n if (!model) throw new Error(`No model available for tier ${tier}`);\n\n const provider = this.getProvider(model);\n if (!provider) throw new Error(`No provider for model ${model.id}`);\n\n // Per-provider TPM guard: pause this call until the token bucket has\n // enough budget to cover the estimated input+output tokens. Prevents\n // sudden bursts of parallel T3 spawns from overshooting a provider's\n // tokens-per-minute quota.\n const estimatedTokens = (options.maxTokens ?? model.maxOutputTokens ?? 1024) + 512;\n if (this.tpmLimiter) {\n await this.tpmLimiter.acquire(model.provider, estimatedTokens);\n }\n\n const useStream = Boolean(onChunk) && model.supportsStreaming && typeof provider.generateStream === 'function';\n\n // Serialize requests to local providers (e.g. Ollama) to prevent GPU VRAM\n // pressure when multiple T3 workers run in parallel on a single-GPU machine.\n let releaseLocalSlot: (() => void) | undefined;\n if (model.isLocal) {\n const inferenceTimeoutMs = this.config.localInferenceTimeoutMs ?? 300_000;\n // Allow up to half the inference timeout to wait in the queue itself.\n const queueWaitMs = Math.round(inferenceTimeoutMs / 2);\n releaseLocalSlot = await this.localQueue.acquire(queueWaitMs);\n }\n\n try {\n let result: GenerateResult;\n\n if (model.isLocal) {\n // Apply a hard timeout to local inference calls so a slow/overloaded\n // model doesn't block the worker indefinitely.\n const inferenceTimeoutMs = this.config.localInferenceTimeoutMs ?? 300_000;\n const inferencePromise = useStream && onChunk\n ? provider.generateStream(options, (chunk) => {\n const text = typeof chunk?.text === 'string' ? chunk.text : '';\n if (text) onChunk({ ...chunk, text });\n })\n : provider.generate(options);\n result = await withTimeout(\n inferencePromise,\n inferenceTimeoutMs,\n `Local model ${model.id} inference timed out after ${inferenceTimeoutMs}ms`,\n );\n } else if (useStream && onChunk) {\n try {\n result = await provider.generateStream(options, (chunk) => {\n const text = typeof chunk?.text === 'string' ? chunk.text : '';\n if (text) onChunk({ ...chunk, text });\n });\n } catch {\n result = await provider.generate(options);\n }\n } else {\n result = await provider.generate(options);\n }\n\n const correctedCost = calculateCost(\n result.usage.inputTokens,\n result.usage.outputTokens,\n model,\n );\n\n result = {\n ...result,\n usage: {\n ...result.usage,\n estimatedCostUsd: correctedCost,\n },\n };\n\n if (!result || typeof result.content !== 'string' || !result.usage) {\n throw new Error(`Provider ${model.provider}:${model.id} returned an invalid generation result.`);\n }\n\n this.recordStats(tier, model, result.usage);\n // On success, signal the failover manager so that a provider which\n // previously tripped a rate-limit can be immediately re-enabled rather\n // than waiting the full backoff window to expire.\n this.failover.recordSuccess(model.provider);\n return result;\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n if (this.isRateLimitError(errMsg)) {\n this.failover.recordFailure(model.provider, 'rate_limit');\n const fallback = this.failover.getFallbackModel(model, tier);\n if (fallback) {\n this.tierModels.set(tier, fallback);\n this.ensureProvider(fallback, this.config.providers);\n // Release the local slot before the recursive call so the fallback\n // model (which may itself be local) can acquire its own slot.\n releaseLocalSlot?.();\n releaseLocalSlot = undefined;\n return this.generate(tier, options, onChunk, requireVision);\n }\n }\n throw err;\n } finally {\n releaseLocalSlot?.();\n }\n }\n\n getModelForTier(tier: TierRole): ModelInfo | undefined {\n return this.tierModels.get(tier);\n }\n\n /**\n * Cascade Auto: temporarily override the model for a tier.\n * Used by TaskAnalyzer to inject task-optimal models before execution.\n * The override is valid for the current task only — restored by restoreTierModels().\n */\n overrideTierModel(tier: TierRole, model: ModelInfo): void {\n this.tierModels.set(tier, model);\n this.ensureProvider(model, this.config.providers);\n }\n\n getSelector(): import('./selector.js').ModelSelector {\n return this.selector;\n }\n\n getStats(): RouterStats {\n // Deep-copy the nested Record maps so callers cannot mutate internal state.\n return {\n totalTokens: this.stats.totalTokens,\n totalCostUsd: this.stats.totalCostUsd,\n callsByProvider: { ...this.stats.callsByProvider },\n callsByTier: { ...this.stats.callsByTier },\n costByTier: { ...this.stats.costByTier },\n tokensByTier: { ...this.stats.tokensByTier },\n inputTokensByTier: { ...this.stats.inputTokensByTier },\n outputTokensByTier: { ...this.stats.outputTokensByTier },\n };\n }\n\n /**\n * Returns a human-readable cost summary broken down by tier.\n * Example: { T1: \"$0.0120 (2 calls, 1500 tokens)\", T2: \"$0.0043 (6 calls, 4200 tokens)\", ... }\n */\n getTierCostSummary(): Record<string, string> {\n const summary: Record<string, string> = {};\n for (const tier of Object.keys(this.stats.callsByTier)) {\n const cost = (this.stats.costByTier[tier] ?? 0).toFixed(6);\n const calls = this.stats.callsByTier[tier] ?? 0;\n const tokens = this.stats.tokensByTier[tier] ?? 0;\n summary[tier] = `$${cost} (${calls} call${calls !== 1 ? 's' : ''}, ${tokens.toLocaleString()} tokens)`;\n }\n return summary;\n }\n\n /**\n * Returns the percentage of total cost attributed to each tier.\n * Useful for identifying which tier is the dominant cost driver.\n */\n getTierCostPercentages(): Record<string, number> {\n const total = this.stats.totalCostUsd;\n if (total === 0) return {};\n const pcts: Record<string, number> = {};\n for (const [tier, cost] of Object.entries(this.stats.costByTier)) {\n pcts[tier] = Math.round((cost / total) * 1000) / 10; // e.g. 42.5\n }\n return pcts;\n }\n\n /**\n * Resets all stats — useful between independent task runs in long-lived sessions.\n */\n resetStats(): void {\n this.stats = {\n totalTokens: 0,\n totalCostUsd: 0,\n callsByProvider: {},\n callsByTier: {},\n costByTier: {},\n tokensByTier: {},\n inputTokensByTier: {},\n outputTokensByTier: {},\n };\n this.sessionCostUsd = 0;\n this.budgetState = 'ok';\n this.budgetExceededReason = undefined;\n }\n\n getFailures(): Record<string, string> {\n return this.failover.getFailureReport();\n }\n\n /**\n * Returns the current session budget cap (USD), or undefined if no cap is set.\n */\n getSessionBudget(): number | undefined {\n return this.config?.budget?.sessionBudgetUsd;\n }\n\n /**\n * Sets (or clears) a runtime session budget cap (USD).\n * Pass null to remove the cap.\n */\n setSessionBudget(usd: number | null): void {\n if (!this.config) return;\n if (!this.config.budget) {\n this.config = { ...this.config, budget: { sessionBudgetUsd: usd ?? undefined, warnAtPct: 80 } };\n } else {\n this.config = {\n ...this.config,\n budget: { ...this.config.budget, sessionBudgetUsd: usd ?? undefined },\n };\n }\n }\n\n /**\n * Returns how much of the session budget has been used (USD).\n */\n getSessionSpend(): number {\n return this.sessionCostUsd;\n }\n\n /**\n * Returns the resolved ModelInfo for a given tier, or null if no model\n * is available (e.g. the required provider is not configured).\n */\n getTierModel(tier: TierRole): ModelInfo | null {\n return this.tierModels.get(tier) ?? null;\n }\n\n /**\n * Returns all models available for the given provider type.\n * Useful for listing configured/usable models per provider.\n */\n getModelsForProvider(provider: ProviderType): ModelInfo[] {\n return this.selector.getAvailableModelsForProvider(provider);\n }\n\n // ── Private ──────────────────────────────────\n\n private async detectAvailableProviders(\n configs: ProviderConfig[],\n ): Promise<Set<ProviderType>> {\n const available = new Set<ProviderType>();\n\n const checks = configs.map(async (cfg) => {\n try {\n const testModel = this.getAnyModelForProvider(cfg.type);\n if (!testModel) return;\n const provider = this.createProvider(cfg, testModel);\n const ok = await provider.isAvailable();\n if (ok) available.add(cfg.type);\n } catch { /* provider not available */ }\n });\n\n await Promise.allSettled(checks);\n return available;\n }\n\n private async discoverOllamaModels(cfg?: ProviderConfig): Promise<void> {\n try {\n const anyOllamaModel = MODELS['llama3.2:3b']!;\n const provider = new OllamaProvider(\n cfg ?? { type: 'ollama', baseUrl: OLLAMA_BASE_URL },\n anyOllamaModel,\n );\n const models = await provider.listModels();\n for (const m of models) {\n this.selector.addDynamicModel(m);\n }\n } catch { /* Ollama not running */ }\n }\n\n private ensureProvider(model: ModelInfo, configs: ProviderConfig[]): void {\n const key = `${model.provider}:${model.id}`;\n if (this.providers.has(key)) return;\n\n const cfg = configs.find((c) => c.type === model.provider)\n ?? { type: model.provider };\n\n const provider = this.createProvider(cfg, model);\n this.providers.set(key, provider);\n }\n\n private getProvider(model: ModelInfo): BaseProvider | undefined {\n return this.providers.get(`${model.provider}:${model.id}`);\n }\n\n private createProvider(cfg: ProviderConfig, model: ModelInfo): BaseProvider {\n switch (cfg.type) {\n case 'anthropic': return new AnthropicProvider(cfg, model);\n case 'openai': return new OpenAIProvider(cfg, model);\n case 'gemini': return new GeminiProvider(cfg, model);\n case 'azure': return new AzureOpenAIProvider(cfg, model);\n case 'ollama': return new OllamaProvider(cfg, model);\n case 'openai-compatible': return new OpenAICompatibleProvider(cfg, model);\n default:\n throw new Error(`Unsupported provider type: ${String(cfg.type)}`);\n }\n }\n\n private getAnyModelForProvider(type: ProviderType): ModelInfo | undefined {\n return Object.values(MODELS).find((m) => m.provider === type);\n }\n\n private recordStats(tier: TierRole, model: ModelInfo, usage: TokenUsage): void {\n this.stats.totalTokens += usage.totalTokens;\n this.stats.totalCostUsd += usage.estimatedCostUsd;\n this.sessionCostUsd += usage.estimatedCostUsd;\n this.stats.callsByProvider[model.provider] = (this.stats.callsByProvider[model.provider] ?? 0) + 1;\n this.stats.callsByTier[tier] = (this.stats.callsByTier[tier] ?? 0) + 1;\n\n // ── Per-tier cost & token breakdown ──────────\n this.stats.costByTier[tier] = (this.stats.costByTier[tier] ?? 0) + usage.estimatedCostUsd;\n this.stats.tokensByTier[tier] = (this.stats.tokensByTier[tier] ?? 0) + usage.totalTokens;\n this.stats.inputTokensByTier[tier] = (this.stats.inputTokensByTier[tier] ?? 0) + usage.inputTokens;\n this.stats.outputTokensByTier[tier] = (this.stats.outputTokensByTier[tier] ?? 0) + usage.outputTokens;\n\n // ── Budget enforcement & warning (atomic state transitions) ─\n this.updateBudgetState();\n }\n\n /**\n * Single point of truth for budget state transitions. Called after each\n * recordStats() so warning and hard-stop transitions are evaluated\n * exactly once — previous logic allowed concurrent generate() calls to\n * both fire the warning or both miss the hard stop.\n */\n private updateBudgetState(): void {\n const budget = this.config?.budget;\n const cap = budget?.sessionBudgetUsd;\n if (!cap) return;\n const spendPct = (this.sessionCostUsd / cap) * 100;\n const warnAt = budget.warnAtPct ?? 80;\n\n if (this.budgetState === 'ok' && spendPct >= warnAt) {\n this.budgetState = 'warned';\n this.emit('budget:warning', {\n spentUsd: this.sessionCostUsd,\n capUsd: cap,\n spendPct: Math.round(spendPct * 10) / 10,\n warnAtPct: warnAt,\n remainingUsd: Math.max(0, cap - this.sessionCostUsd),\n });\n }\n\n if (this.budgetState !== 'exceeded' && this.sessionCostUsd >= cap) {\n const reason = `Session budget of $${cap.toFixed(4)} exceeded (spent $${this.sessionCostUsd.toFixed(4)}).`;\n this.halt(reason);\n // Throw on the current call so the caller also unwinds.\n throw new CascadeRouter.BudgetExceededError(reason);\n }\n }\n\n /**\n * Flip the router to \"exceeded\" state. Subsequent `generate()` calls will\n * throw BudgetExceededError immediately, and a `budget:exceeded` event is\n * broadcast once so listeners (REPL, dashboard, SDK) can cancel any\n * pending approvals and unwind the run.\n */\n halt(reason: string): void {\n if (this.budgetState === 'exceeded') return;\n this.budgetState = 'exceeded';\n this.budgetExceededReason = reason;\n this.emit('budget:exceeded', { reason, spentUsd: this.sessionCostUsd });\n }\n\n /** Returns current budget state — useful for tests and dashboard. */\n getBudgetState(): 'ok' | 'warned' | 'exceeded' {\n return this.budgetState;\n }\n\n private isRateLimitError(msg: string): boolean {\n return /rate.?limit|429|too.?many.?requests|quota/i.test(msg);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Abstract Tier Base\n// ─────────────────────────────────────────────\n\nimport EventEmitter from 'node:events';\nimport { randomUUID } from 'node:crypto';\nimport type {\n CascadeMessage,\n StatusUpdate,\n TierRole,\n TierStatus,\n} from '../../types.js';\nimport { CascadeCancelledError } from '../../utils/retry.js';\n\nexport abstract class BaseTier extends EventEmitter {\n readonly id: string;\n readonly role: TierRole;\n protected status: TierStatus = 'IDLE';\n protected parentId?: string;\n protected taskId: string = '';\n protected label: string;\n protected systemPromptOverride: string = '';\n protected hierarchyContext: string = '';\n /** Propagated AbortSignal — set by the tier's `execute()` before work begins. */\n protected signal?: AbortSignal;\n\n constructor(role: TierRole, id?: string, parentId?: string) {\n super();\n this.role = role;\n this.id = id ?? `${role}_${randomUUID().slice(0, 8)}`;\n this.parentId = parentId;\n this.label = this.id;\n }\n\n getStatus(): TierStatus {\n return this.status;\n }\n\n protected setStatus(status: TierStatus, output?: string): void {\n this.status = status;\n const timestamp = new Date().toISOString();\n const event = {\n tierId: this.id,\n role: this.role,\n parentId: this.parentId,\n label: this.label,\n status,\n timestamp,\n output,\n };\n this.emit('status', event);\n this.emit('tier:status', event);\n }\n\n protected setLabel(label: string): void {\n this.label = label;\n }\n\n setSystemPromptOverride(prompt: string): void {\n this.systemPromptOverride = prompt;\n }\n\n setHierarchyContext(context: string): void {\n this.hierarchyContext = context;\n }\n\n protected sendStatusUpdate(update: StatusUpdate): void {\n const timestamp = new Date().toISOString();\n const message = this.buildMessage('STATUS_UPDATE', this.parentId ?? 'T1', update as unknown as Record<string, unknown>);\n this.emit('message', message);\n this.emit('tier:status', {\n tierId: this.id,\n role: this.role,\n parentId: this.parentId,\n label: this.label,\n status: this.status,\n currentAction: update.currentAction,\n progressPct: update.progressPct,\n timestamp,\n output: update.output,\n });\n }\n\n protected buildMessage(\n type: CascadeMessage['type'],\n to: string,\n payload: Record<string, unknown>,\n ): CascadeMessage {\n return {\n version: '1.0',\n from: this.id,\n to,\n type,\n taskId: this.taskId,\n timestamp: new Date().toISOString(),\n payload: payload as unknown as CascadeMessage['payload'],\n };\n }\n\n protected log(message: string, data?: unknown): void {\n this.emit('log', { tierId: this.id, role: this.role, message, data, timestamp: new Date().toISOString() });\n }\n\n /**\n * Throws `CascadeCancelledError` if the run's `AbortSignal` has fired.\n * Call this at safe checkpoints (before LLM calls, between T3 dispatches)\n * to provide a fast, clean cancellation path.\n */\n protected throwIfCancelled(): void {\n if (this.signal?.aborted) {\n throw new CascadeCancelledError(\n typeof this.signal.reason === 'string'\n ? this.signal.reason\n : 'Run cancelled by caller',\n );\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Context Window Manager\n// ─────────────────────────────────────────────\n\nimport type { ConversationMessage, TokenUsage } from '../../types.js';\nimport { DEFAULT_AUTO_SUMMARIZE_AT, DEFAULT_CONTEXT_LIMIT } from '../../constants.js';\n\nexport class ContextManager {\n private messages: ConversationMessage[] = [];\n private tokenCount = 0;\n private readonly limit: number;\n private readonly summarizeAt: number;\n private onSummarizeNeeded?: (messages: ConversationMessage[]) => Promise<string>;\n\n constructor(\n limit = DEFAULT_CONTEXT_LIMIT,\n summarizeAt = DEFAULT_AUTO_SUMMARIZE_AT,\n ) {\n this.limit = limit;\n this.summarizeAt = summarizeAt;\n }\n\n setOnSummarizeNeeded(fn: (messages: ConversationMessage[]) => Promise<string>): void {\n this.onSummarizeNeeded = fn;\n }\n\n async addMessage(message: ConversationMessage, estimatedTokens = 0): Promise<void> {\n this.messages.push(message);\n this.tokenCount += estimatedTokens;\n\n if (this.tokenCount >= this.summarizeAt && this.onSummarizeNeeded) {\n await this.summarize();\n }\n }\n\n getMessages(): ConversationMessage[] {\n return [...this.messages];\n }\n\n getTokenCount(): number {\n return this.tokenCount;\n }\n\n isNearLimit(): boolean {\n return this.tokenCount >= this.summarizeAt;\n }\n\n isAtLimit(): boolean {\n return this.tokenCount >= this.limit;\n }\n\n getUsagePercent(): number {\n return Math.min(100, (this.tokenCount / this.limit) * 100);\n }\n\n pruneToFit(maxTokens: number): ConversationMessage[] {\n const result: ConversationMessage[] = [];\n let count = 0;\n // Always keep system messages + last N messages\n const system = this.messages.filter((m) => m.role === 'system');\n const nonSystem = this.messages.filter((m) => m.role !== 'system');\n\n for (const m of system) result.push(m);\n\n // Add from end going backwards\n const recent: ConversationMessage[] = [];\n for (let i = nonSystem.length - 1; i >= 0; i--) {\n const est = this.estimateTokens(nonSystem[i]!);\n if (count + est > maxTokens) break;\n recent.unshift(nonSystem[i]!);\n count += est;\n }\n result.push(...recent);\n return result;\n }\n\n updateTokenCount(usage: TokenUsage): void {\n this.tokenCount = usage.totalTokens;\n }\n\n clear(): void {\n this.messages = [];\n this.tokenCount = 0;\n }\n\n /**\n * Returns a human-readable summary of the current context state.\n * Useful for debugging and status-bar display.\n */\n getContextSummary(): {\n messageCount: number;\n tokenCount: number;\n usagePercent: number;\n isNearLimit: boolean;\n isAtLimit: boolean;\n } {\n return {\n messageCount: this.messages.length,\n tokenCount: this.tokenCount,\n usagePercent: this.getUsagePercent(),\n isNearLimit: this.isNearLimit(),\n isAtLimit: this.isAtLimit(),\n };\n }\n\n private async summarize(): Promise<void> {\n if (!this.onSummarizeNeeded) return;\n\n const toSummarize = this.messages.filter((m) => m.role !== 'system');\n if (toSummarize.length < 4) return;\n\n const summary = await this.onSummarizeNeeded(toSummarize);\n\n const systemMessages = this.messages.filter((m) => m.role === 'system');\n const recent = toSummarize.slice(-4);\n\n this.messages = [\n ...systemMessages,\n { role: 'user', content: `[Previous conversation summary]\\n${summary}` },\n { role: 'assistant', content: 'Understood. Continuing from the summary above.' },\n ...recent,\n ];\n\n this.tokenCount = Math.floor(this.tokenCount * 0.3);\n }\n\n private estimateTokens(message: ConversationMessage): number {\n let charCount = 0;\n\n if (typeof message.content === 'string') {\n charCount = message.content.length;\n } else {\n for (const block of message.content) {\n if (block.type === 'text') {\n charCount += block.text.length;\n } else if (block.type === 'image') {\n // Images consume significant tokens; use a conservative flat estimate\n // (~85 tokens/image thumbnail tile as a lower-bound proxy)\n charCount += 340; // ≈ 85 tokens × 4 chars/token equivalent\n } else if (block.type === 'tool_result') {\n charCount += block.content.length;\n }\n }\n }\n\n // Role + structural overhead (~4 tokens per message)\n const overhead = 16;\n return Math.ceil(charCount / 4) + overhead;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Audit Logger (Enhanced)\n// ─────────────────────────────────────────────\n\nimport { randomUUID } from 'node:crypto';\nimport type { AuditEntry } from '../types.js';\nimport type { MemoryStore } from '../memory/store.js';\n\n/** Structured log levels for audit entries */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\n/** Extended audit entry with log level */\nexport interface AuditEntryWithLevel extends AuditEntry {\n level: LogLevel;\n}\n\nexport class AuditLogger {\n private store: MemoryStore;\n private sessionId: string;\n private minLevel: LogLevel;\n\n constructor(store: MemoryStore, sessionId: string, minLevel: LogLevel = 'info') {\n this.store = store;\n this.sessionId = sessionId;\n this.minLevel = minLevel;\n }\n\n // ── Level-aware logging ──────────────────────\n\n debug(tierId: string, action: AuditEntry['action'], details: Record<string, unknown>): void {\n this.logAt('debug', tierId, action, details);\n }\n\n info(tierId: string, action: AuditEntry['action'], details: Record<string, unknown>): void {\n this.logAt('info', tierId, action, details);\n }\n\n warn(tierId: string, action: AuditEntry['action'], details: Record<string, unknown>): void {\n this.logAt('warn', tierId, action, details);\n }\n\n error(tierId: string, err: Error | unknown, context: Record<string, unknown> = {}): void {\n const e = err instanceof Error ? err : new Error(String(err));\n this.logAt('error', tierId, 'error', {\n message: e.message,\n name: e.name,\n stack: e.stack?.slice(0, 500),\n ...context,\n });\n }\n\n /** Backward-compatible generic log (defaults to info level) */\n log(\n tierId: string,\n action: AuditEntry['action'],\n details: Record<string, unknown>,\n ): void {\n this.logAt('info', tierId, action, details);\n }\n\n // ── Domain helpers ─────────────────────────\n\n toolCall(tierId: string, toolName: string, input: Record<string, unknown>): void {\n this.info(tierId, 'tool_call', { toolName, input });\n }\n\n fileChange(tierId: string, filePath: string, operation: string): void {\n this.info(tierId, 'file_change', { filePath, operation });\n }\n\n agentDecision(tierId: string, decision: string, reasoning?: string): void {\n this.info(tierId, 'agent_decision', { decision, reasoning });\n }\n\n approval(tierId: string, toolName: string, approved: boolean, decidedBy?: string): void {\n this.info(tierId, 'approval', { toolName, approved, decidedBy });\n }\n\n escalation(tierId: string, blocker: string, needs: string): void {\n this.warn(tierId, 'escalation', { blocker, needs });\n }\n\n getLog(limit?: number): AuditEntry[] {\n return this.store.getAuditLog(this.sessionId, limit);\n }\n\n // ── Structured JSON output ─────────────────\n\n /**\n * Formats an audit entry as a single-line JSON string (e.g. for log aggregation).\n */\n formatStructured(entry: AuditEntryWithLevel): string {\n return JSON.stringify({\n ts: entry.timestamp,\n level: entry.level,\n sessionId: entry.sessionId,\n tierId: entry.tierId,\n action: entry.action,\n ...entry.details,\n });\n }\n\n // ── Internal ───────────────────────────────\n\n private logAt(\n level: LogLevel,\n tierId: string,\n action: AuditEntry['action'],\n details: Record<string, unknown>,\n ): void {\n if (!this.shouldLog(level)) return;\n\n const entry: AuditEntry = {\n id: randomUUID(),\n sessionId: this.sessionId,\n timestamp: new Date().toISOString(),\n tierId,\n action,\n details: { level, ...details },\n };\n this.store.addAuditEntry(entry);\n }\n\n private shouldLog(level: LogLevel): boolean {\n const order: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n return order.indexOf(level) >= order.indexOf(this.minLevel);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Text Tool Call Parser\n// ─────────────────────────────────────────────\n//\n// Parses ReAct-style tool invocations from LLM text output.\n// Used when the model does not support native tool-use (e.g. Ollama).\n//\n// Format:\n// <tool_call>\n// {\"name\": \"shell\", \"input\": {\"command\": \"ls -la\"}}\n// </tool_call>\n//\n\nimport type { ToolCall } from '../types.js';\n\nconst TOOL_CALL_RE = /<tool_call>\\s*([\\s\\S]*?)\\s*<\\/tool_call>/g;\n// Pattern B: ```json {...} ``` blocks containing a tool-call shaped object\nconst JSON_BLOCK_RE = /```json\\s*([\\s\\S]*?)\\s*```/g;\n// Pattern C: inline {\"function\": {\"name\": \"...\", \"arguments\": {...}}} objects (OpenAI echo format)\nconst FUNCTION_OBJ_RE = /\\{\\s*\"function\"\\s*:\\s*\\{[^}]*\"name\"\\s*:[^}]*\\}\\s*\\}/g;\n\nexport interface ParsedTextToolCall {\n name: string;\n input: Record<string, unknown>;\n}\n\n/**\n * Extract tool calls from a text response.\n *\n * Tries three strategies in priority order, stopping at the first that yields results:\n * 1. <tool_call>…</tool_call> XML blocks (primary format)\n * 2. ```json … ``` code blocks containing a {name, input} object\n * 3. {\"function\": {\"name\": \"…\", \"arguments\": {…}}} inline objects (OpenAI echo format)\n */\nexport function parseTextToolCalls(text: string): ParsedTextToolCall[] {\n const results = tryXmlBlocks(text);\n if (results.length > 0) return results;\n\n const jsonBlockResults = tryJsonCodeBlocks(text);\n if (jsonBlockResults.length > 0) return jsonBlockResults;\n\n return tryFunctionCallObjects(text);\n}\n\nfunction tryXmlBlocks(text: string): ParsedTextToolCall[] {\n const results: ParsedTextToolCall[] = [];\n let match: RegExpExecArray | null;\n TOOL_CALL_RE.lastIndex = 0;\n\n while ((match = TOOL_CALL_RE.exec(text)) !== null) {\n try {\n const raw = JSON.parse(match[1]!) as { name?: unknown; input?: unknown };\n if (typeof raw.name !== 'string') continue;\n const input = typeof raw.input === 'object' && raw.input !== null\n ? raw.input as Record<string, unknown>\n : {};\n results.push({ name: raw.name, input });\n } catch {\n // Skip malformed block\n }\n }\n return results;\n}\n\nfunction tryJsonCodeBlocks(text: string): ParsedTextToolCall[] {\n const results: ParsedTextToolCall[] = [];\n let match: RegExpExecArray | null;\n JSON_BLOCK_RE.lastIndex = 0;\n\n while ((match = JSON_BLOCK_RE.exec(text)) !== null) {\n try {\n const raw = JSON.parse(match[1]!) as { name?: unknown; input?: unknown };\n if (typeof raw.name !== 'string') continue;\n const input = typeof raw.input === 'object' && raw.input !== null\n ? raw.input as Record<string, unknown>\n : {};\n results.push({ name: raw.name, input });\n } catch {\n // Skip malformed block\n }\n }\n return results;\n}\n\nfunction tryFunctionCallObjects(text: string): ParsedTextToolCall[] {\n const results: ParsedTextToolCall[] = [];\n let match: RegExpExecArray | null;\n FUNCTION_OBJ_RE.lastIndex = 0;\n\n while ((match = FUNCTION_OBJ_RE.exec(text)) !== null) {\n try {\n const raw = JSON.parse(match[0]!) as {\n function?: { name?: unknown; arguments?: unknown }\n };\n const fn = raw.function;\n if (!fn || typeof fn.name !== 'string') continue;\n const input = typeof fn.arguments === 'object' && fn.arguments !== null\n ? fn.arguments as Record<string, unknown>\n : {};\n results.push({ name: fn.name, input });\n } catch {\n // Skip malformed object\n }\n }\n return results;\n}\n\n/**\n * Convert a ParsedTextToolCall to a ToolCall with a generated id.\n */\nexport function toToolCall(parsed: ParsedTextToolCall, index: number): ToolCall {\n return {\n id: `text-tool-${Date.now()}-${index}`,\n name: parsed.name,\n input: parsed.input,\n };\n}\n\n/**\n * Build the system-prompt appendix that teaches a non-tool-capable model\n * how to invoke tools via text.\n */\nexport function buildTextToolSystemPrompt(tools: Array<{ name: string; description: string; inputSchema?: { properties?: Record<string, { description?: string }> } }>): string {\n const toolDefs = tools.map(t => {\n const props = t.inputSchema?.properties ?? {};\n const paramLines = Object.entries(props)\n .map(([k, v]) => ` \"${k}\": \"<${v.description ?? k}>\"`);\n return `• ${t.name}: ${t.description}\n Input: {${paramLines.length ? '\\n' + paramLines.join(',\\n') + '\\n ' : ''}}`;\n }).join('\\n');\n\n return `\nTOOL USE INSTRUCTIONS:\nYou do not have native tool-use capability. To call a tool, write a <tool_call> block:\n\n<tool_call>\n{\"name\": \"<tool_name>\", \"input\": {<parameters>}}\n</tool_call>\n\nAvailable tools:\n${toolDefs}\n\nEXAMPLE — calling the \"shell\" tool to list files:\n<tool_call>\n{\"name\": \"shell\", \"input\": {\"command\": \"ls -la /workspace\"}}\n</tool_call>\n\nYou will then receive a user message with the result, then continue your work.\nOnly call one tool at a time. When you have enough information, provide your final answer.`;\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — T3 Worker\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n ConversationMessage,\n GenerateOptions,\n PermissionRequest,\n T2ToT3Assignment,\n T3Result,\n ToolCall,\n ToolDefinition,\n} from '../../types.js';\nimport type { CascadeRouter } from '../router/index.js';\nimport type { ToolRegistry } from '../../tools/registry.js';\nimport { BaseTier } from './base.js';\nimport { ContextManager } from '../context/manager.js';\nimport { AuditLogger } from '../../audit/log.js';\nimport { MemoryStore } from '../../memory/store.js';\nimport type { PeerBus } from '../peer/bus.js';\nimport type { PermissionEscalator } from '../permissions/escalator.js';\nimport type { ToolCreator } from '../../tools/tool-creator.js';\nimport {\n parseTextToolCalls,\n toToolCall,\n buildTextToolSystemPrompt,\n} from '../../tools/text-tool-parser.js';\n\nconst T3_SYSTEM_PROMPT = `You are a T3 Worker agent in the Cascade AI system. Your job is to execute a specific subtask completely and accurately.\n\nRules:\n- Execute the subtask completely — do not stop partway through.\n- Use tools when needed. Ask for approval only when the tool registry requires it.\n- If the task asks for a file or artifact, you must actually create it in the workspace, verify that it exists, and inspect it before claiming success.\n- Use the \"web_search\" tool to find current information, documentation, news, or general web data.\n- Use the \"pdf_create\" tool for PDF requests.\n- Use the \"run_code\" tool for any file types (Excel, Zip, csv, etc.) or complex processing not covered by other tools. Always cleanup after code execution.\n- If you are not making meaningful progress, stop and escalate rather than looping or padding the response.\n- Use the \"peer_message\" tool to communicate with other T3 workers if your tasks have dependencies or shared state. You can send updates or wait for signals.\n- Return structured output that directly addresses the expected output specification.`;\n\nexport class T3Worker extends BaseTier {\n private router: CascadeRouter;\n private toolRegistry: ToolRegistry;\n private context: ContextManager;\n private assignment?: T2ToT3Assignment;\n private peerSyncBuffer: Array<{ fromId: string; content: unknown; timestamp: string }> = [];\n private store?: MemoryStore;\n private audit?: AuditLogger;\n private tools: ToolDefinition[] = [];\n /** @deprecated — kept only as fallback when no escalator is attached */\n private sessionApprovals: Map<string, boolean> = new Map();\n private peerBus?: PeerBus;\n private permissionEscalator?: PermissionEscalator;\n private toolCreator?: ToolCreator;\n\n setPeerBus(bus: PeerBus): void {\n this.peerBus = bus;\n this.peerBus.register(this.id);\n\n // Listen for targeted messages from peers\n this.peerBus.on(`message:${this.id}`, (msg) => {\n this.log(`Peer message from ${msg.fromId}: ${msg.type}`);\n this.receivePeerSync(msg.fromId, msg.payload);\n });\n }\n\n setPermissionEscalator(escalator: PermissionEscalator): void {\n this.permissionEscalator = escalator;\n }\n\n setToolCreator(creator: ToolCreator): void {\n this.toolCreator = creator;\n }\n\n constructor(router: CascadeRouter, toolRegistry: ToolRegistry, parentId: string) {\n super('T3', undefined, parentId);\n this.router = router;\n this.toolRegistry = toolRegistry;\n this.context = new ContextManager();\n }\n\n setStore(store: MemoryStore, sessionId: string): void {\n this.store = store;\n this.audit = new AuditLogger(store, sessionId);\n }\n\n async execute(assignment: T2ToT3Assignment, taskId: string, signal?: AbortSignal): Promise<T3Result> {\n this.signal = signal;\n this.assignment = assignment;\n this.taskId = taskId;\n this.setLabel(assignment.subtaskTitle);\n this.setStatus('ACTIVE');\n\n this.tools = this.toolRegistry.getToolDefinitions();\n\n // ── Step 0: Wait for dependencies ──────────\n if (assignment.dependsOn?.length && this.peerBus) {\n this.sendStatusUpdate({\n progressPct: 0,\n currentAction: `Waiting for dependencies: ${assignment.dependsOn.join(', ')}`,\n status: 'IN_PROGRESS',\n });\n\n const depOutputs: string[] = [];\n for (const depId of assignment.dependsOn) {\n try {\n const dep = await this.peerBus.waitFor(depId);\n if (dep.status === 'FAILED' || dep.status === 'ESCALATED') {\n return this.buildResult(\n 'ESCALATED',\n `Dependency ${depId} failed — cannot proceed`,\n { checksRun: [], passed: [], failed: [] },\n [`Blocked by failed dependency: ${depId}`],\n 0,\n );\n }\n depOutputs.push(`[From ${dep.fromId} - ${dep.subtaskId}]:\\n${dep.output}`);\n } catch (err) {\n return this.buildResult(\n 'ESCALATED',\n `Dependency timeout: ${depId}`,\n { checksRun: [], passed: [], failed: [] },\n [err instanceof Error ? err.message : String(err)],\n 0,\n );\n }\n }\n\n // Inject dependency outputs into context\n if (depOutputs.length) {\n await this.context.addMessage({\n role: 'user',\n content: `Context from completed dependencies:\\n\\n${depOutputs.join('\\n\\n')}\\n\\nNow execute your subtask using this context where relevant.`,\n });\n }\n }\n\n this.sendStatusUpdate({\n progressPct: 5,\n currentAction: `Starting subtask: ${assignment.subtaskTitle}`,\n status: 'IN_PROGRESS',\n });\n\n this.log(`T3 executing subtask: ${assignment.subtaskTitle}`);\n\n // ── Step 0.5: T3 File-Intent Coordination ──\n // Announce files this subtask plans to write so siblings can avoid conflicts.\n if (this.peerBus && this.peerBus.getMembers().length > 1) {\n await this.coordinateFileIntents(assignment);\n }\n\n const systemPrompt = this.buildSystemPrompt(assignment);\n\n await this.context.addMessage({\n role: 'user',\n content: this.buildInitialPrompt(assignment),\n });\n\n let output = '';\n let toolCalls: ToolCall[] = [];\n let correctionAttempts = 0;\n const checksRun: string[] = [];\n const passed: string[] = [];\n const failed: string[] = [];\n const issues: string[] = [];\n\n try {\n const result = await this.runAgentLoop(systemPrompt, this.tools);\n output = result.output;\n toolCalls = result.toolCalls;\n\n this.sendStatusUpdate({ progressPct: 65, currentAction: 'Verifying required artifacts', status: 'IN_PROGRESS' });\n\n const artifactCheck = await this.verifyArtifacts(assignment);\n if (!artifactCheck.ok) {\n correctionAttempts = 1;\n issues.push(...artifactCheck.issues);\n output = await this.correctOutput(output, artifactCheck.issues);\n const retryArtifactCheck = await this.verifyArtifacts(assignment);\n if (!retryArtifactCheck.ok) {\n issues.push(...retryArtifactCheck.issues);\n this.setStatus('FAILED');\n // ── Publish failure to peers ──\n this.peerBus?.publish(this.id, assignment.subtaskId, output, 'ESCALATED');\n return this.buildResult('ESCALATED', output, { checksRun, passed, failed }, issues, correctionAttempts);\n }\n }\n\n this.sendStatusUpdate({ progressPct: 70, currentAction: 'Self-testing output', status: 'IN_PROGRESS' });\n\n const testResult = await this.selfTest(assignment, output);\n checksRun.push(...testResult.checksRun);\n passed.push(...testResult.passed);\n failed.push(...testResult.failed);\n\n if (testResult.failed.length > 0) {\n correctionAttempts = 1;\n issues.push(`Initial check failed: ${testResult.failed.join(', ')}`);\n const corrected = await this.correctOutput(output, testResult.failed);\n output = corrected;\n const retest = await this.selfTest(assignment, output);\n passed.push(...retest.passed);\n if (retest.failed.length > 0) {\n failed.push(...retest.failed);\n this.setStatus('FAILED');\n this.peerBus?.publish(this.id, assignment.subtaskId, output, 'ESCALATED');\n return this.buildResult('ESCALATED', output, { checksRun, passed, failed }, issues, correctionAttempts);\n }\n }\n\n this.setStatus('COMPLETED', output);\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Subtask complete', status: 'IN_PROGRESS', output });\n\n // ── Publish success to peers ─────────────\n this.peerBus?.publish(this.id, assignment.subtaskId, output, 'COMPLETED');\n\n return this.buildResult('COMPLETED', output, { checksRun, passed, failed }, issues, correctionAttempts);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n issues.push(`Execution error: ${errMsg}`);\n const finalOutput = output || errMsg;\n this.setStatus('FAILED', finalOutput);\n this.peerBus?.publish(this.id, assignment.subtaskId, finalOutput, 'FAILED');\n return this.buildResult('ESCALATED', finalOutput, { checksRun, passed, failed }, issues, correctionAttempts);\n }\n }\n\n sendToPeer(toId: string, content: unknown): void {\n this.peerBus?.send(this.id, toId, 'SHARE_OUTPUT', this.assignment?.subtaskId ?? '', content);\n }\n\n async requestFromPeer(peerId: string, subtaskId: string): Promise<string> {\n if (!this.peerBus) throw new Error('No PeerBus attached');\n const output = await this.peerBus.waitFor(subtaskId);\n return output.output;\n }\n\n async syncWithPeers(barrierName: string): Promise<void> {\n if (!this.peerBus) return;\n const total = this.peerBus.getMembers().length;\n await this.peerBus.barrier(this.id, barrierName, total);\n }\n\n receivePeerSync(fromId: string, content: unknown): void {\n this.peerSyncBuffer.push({ fromId, content, timestamp: new Date().toISOString() });\n this.emit('peer-sync-received', { fromId, content });\n \n // Notify the agent proactively so it doesn't have to guess when to poll\n this.context.addMessage({\n role: 'user',\n content: `[SYSTEM_NOTIFICATION]: You received a new peer message from ${fromId}. Use the \"peer_message\" tool with action=\"receive\" to read it.`\n }).catch(() => {});\n }\n\n // ── Private ──────────────────────────────────\n\n private async runAgentLoop(\n systemPrompt: string,\n tools: ToolDefinition[],\n ): Promise<{ output: string; toolCalls: ToolCall[] }> {\n const allToolCalls: ToolCall[] = [];\n let iterations = 0;\n let stalledArtifactIterations = 0;\n const MAX_ITERATIONS = 15;\n const requiresArtifact = this.requiresArtifact();\n // `tools` is reassigned when a dynamic tool is created — must be a let\n tools = [...tools];\n\n // Detect if T3 model supports native tool use\n const t3Model = this.router.getModelForTier('T3');\n const useTextTools = t3Model?.supportsToolUse === false && tools.length > 0;\n const textToolSuffix = useTextTools ? buildTextToolSystemPrompt(tools) : '';\n\n while (iterations < MAX_ITERATIONS) {\n iterations++;\n\n // ── Cancellation checkpoint (before every LLM call) ──────────────\n this.throwIfCancelled();\n\n const options: GenerateOptions = {\n messages: this.context.getMessages(),\n systemPrompt: this.systemPromptOverride + systemPrompt\n + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : '')\n + textToolSuffix,\n // Don't pass tools array when model can't use them natively\n tools: useTextTools ? undefined : (tools.length ? tools : undefined),\n maxTokens: 4096,\n };\n\n const result = await this.router.generate(\n 'T3',\n options,\n (chunk) => {\n this.emit('stream:token', { tierId: this.id, text: chunk.text });\n },\n );\n\n // For text-tool mode: parse <tool_call> blocks and inject as native tool calls\n let effectiveToolCalls = result.toolCalls ?? [];\n if (useTextTools && effectiveToolCalls.length === 0) {\n const textCalls = parseTextToolCalls(result.content);\n effectiveToolCalls = textCalls.map((tc, i) => toToolCall(tc, i));\n }\n const effectiveResult = { ...result, toolCalls: effectiveToolCalls };\n\n await this.context.addMessage({ role: 'assistant', content: result.content, toolCalls: effectiveToolCalls });\n\n if (!effectiveResult.toolCalls?.length) {\n if (requiresArtifact) {\n const artifactCheck = await this.verifyArtifacts(this.assignment!);\n if (artifactCheck.ok) {\n return { output: result.content, toolCalls: allToolCalls };\n }\n\n stalledArtifactIterations += 1;\n if (stalledArtifactIterations >= 2) {\n if (stalledArtifactIterations === 2) {\n throw new Error(`Worker stalled waiting for artifact creation. Requesting dynamic tool generation from T2 Manager for: ${this.assignment?.subtaskTitle ?? 'unknown task'}`);\n }\n throw new Error('Artifact-producing task stalled without creating or verifying the required files');\n }\n await this.context.addMessage({\n role: 'user',\n content: `You have not yet created and verified the required artifact. Issues: ${artifactCheck.issues.join('; ')}. Use tools to create the file in the workspace, verify it exists, and inspect the result before concluding.`,\n });\n continue;\n }\n return { output: result.content, toolCalls: allToolCalls };\n }\n\n stalledArtifactIterations = 0;\n\n if (effectiveResult.finishReason === 'stop' && effectiveResult.toolCalls.length === 0) {\n if (requiresArtifact) {\n const artifactCheck = await this.verifyArtifacts(this.assignment!);\n if (artifactCheck.ok) {\n return { output: result.content, toolCalls: allToolCalls };\n }\n } else {\n return { output: result.content, toolCalls: allToolCalls };\n }\n }\n\n for (const tc of effectiveResult.toolCalls) {\n allToolCalls.push(tc);\n const toolResult = await this.executeTool(tc);\n await this.context.addMessage({\n role: 'tool',\n content: toolResult,\n toolCallId: tc.id,\n });\n }\n }\n\n const lastMsg = this.context.getMessages().slice().reverse().find((m) => m.role === 'assistant');\n return {\n output: typeof lastMsg?.content === 'string' ? lastMsg.content : '',\n toolCalls: allToolCalls,\n };\n }\n\n private async executeTool(tc: ToolCall): Promise<string> {\n const needsApproval = this.toolRegistry.requiresApproval(tc.name);\n\n if (needsApproval) {\n // ── Hierarchical permission escalation: T3 → T2 → T1 → User ──\n if (this.permissionEscalator) {\n const req: PermissionRequest = {\n id: `${this.id}-${tc.id}`,\n requestedBy: this.id,\n parentT2Id: this.parentId ?? 'root',\n toolName: tc.name,\n input: tc.input,\n isDangerous: this.toolRegistry.isDangerous(tc.name),\n subtaskContext: this.assignment?.subtaskTitle ?? 'Unknown subtask',\n sectionContext: this.assignment?.subtaskTitle ?? 'Unknown section',\n };\n const decision = await this.permissionEscalator.requestPermission(req);\n if (!decision.approved) return `Tool ${tc.name} was denied (decided by ${decision.decidedBy}).`;\n } else {\n // ── Fallback: legacy direct approval event (used when escalator not wired) ──\n if (this.sessionApprovals.has(tc.name)) {\n const wasApproved = this.sessionApprovals.get(tc.name)!;\n if (!wasApproved) return `Tool ${tc.name} was denied by user.`;\n } else {\n const legacyDecision = await new Promise<{ approved: boolean; always?: boolean }>((resolve) => {\n this.emit('tool:approval-request', {\n id: `${this.id}-${tc.id}`,\n tierId: this.id,\n toolName: tc.name,\n input: tc.input,\n description: `T3 (${this.assignment?.subtaskTitle}) wants to run \"${tc.name}\"`,\n isDangerous: this.toolRegistry.isDangerous(tc.name),\n });\n this.once(`tool:approval-response:${this.id}-${tc.id}`, resolve);\n });\n if (legacyDecision.always) this.sessionApprovals.set(tc.name, legacyDecision.approved);\n if (!legacyDecision.approved) return `Tool ${tc.name} was denied by user.`;\n }\n }\n }\n\n // Emit tool:use before execution so the TUI can display the active tool\n this.sendStatusUpdate({\n progressPct: 50,\n currentAction: `Using tool: ${tc.name}`,\n status: 'IN_PROGRESS',\n });\n\n this.emit('tool:call', { id: tc.id, tierId: this.id, toolName: tc.name, input: tc.input });\n const toolStartMs = Date.now();\n\n try {\n const result = await this.toolRegistry.execute(tc.name, tc.input, {\n tierId: this.id,\n sessionId: this.taskId,\n requireApproval: false,\n saveSnapshot: async (path, content) => {\n this.store?.addFileSnapshot(this.taskId, path, content);\n },\n sendPeerSync: (to, syncType, content) => {\n this.peerBus?.send(this.id, to, syncType, this.assignment?.subtaskId ?? '', content);\n },\n getPeerMessages: () => {\n const msgs = [...this.peerSyncBuffer];\n this.peerSyncBuffer = [];\n return msgs;\n },\n });\n if (this.audit) {\n this.audit.toolCall(this.id, tc.name, tc.input);\n if (this.isFileOperation(tc.name)) {\n this.audit.fileChange(this.id, (tc.input['path'] as string | undefined) ?? 'unknown', tc.name);\n }\n }\n const durationMs = Date.now() - toolStartMs;\n this.emit('tool:result', { id: tc.id, tierId: this.id, toolName: tc.name, output: typeof result === 'string' ? result : JSON.stringify(result), durationMs });\n return typeof result === 'string' ? result : JSON.stringify(result);\n } catch (err) {\n const durationMs = Date.now() - toolStartMs;\n const errMsg = err instanceof Error ? err.message : String(err);\n this.emit('tool:result', { id: tc.id, tierId: this.id, toolName: tc.name, error: errMsg, durationMs });\n return `Tool error: ${errMsg}`;\n }\n }\n\n /**\n * Adaptive fallback cascade — invoked when executeTool() fails.\n * Strategy order:\n * 1. Find a semantically similar registered tool and retry with same input\n * 2. Synthesize a new tool via ToolCreator (if available) and run it\n * 3. Return the original error so the agent loop can decide what to do next\n */\n private async adaptiveFallback(tc: ToolCall, originalError: string): Promise<string> {\n // Strategy 1: alternative tool with overlapping purpose\n const altTool = this.findAlternativeTool(tc.name);\n if (altTool) {\n this.log(`Adaptive fallback: trying alternative tool \"${altTool}\" for failed \"${tc.name}\"`);\n this.sendStatusUpdate({ progressPct: 50, currentAction: `Fallback: trying ${altTool}`, status: 'IN_PROGRESS' });\n try {\n const result = await this.toolRegistry.execute(altTool, tc.input, {\n tierId: this.id,\n sessionId: this.taskId,\n requireApproval: false,\n });\n const str = typeof result === 'string' ? result : JSON.stringify(result);\n if (!str.startsWith('Tool error:') && !str.startsWith('Error:')) {\n return `[Fallback via ${altTool}]: ${str}`;\n }\n } catch { /* fall through to next strategy */ }\n }\n\n // Strategy 2: synthesize a new tool via ToolCreator\n if (this.toolCreator) {\n this.log(`Adaptive fallback: requesting dynamic tool synthesis for \"${tc.name}\"`);\n this.sendStatusUpdate({ progressPct: 55, currentAction: `Synthesizing fallback tool for: ${tc.name}`, status: 'IN_PROGRESS' });\n try {\n const newToolName = await this.toolCreator.createTool(\n `Replacement for \"${tc.name}\" — original failed with: ${originalError.slice(0, 150)}`,\n this.assignment?.subtaskTitle ?? tc.name,\n );\n if (newToolName) {\n this.log(`Adaptive fallback: synthesized \"${newToolName}\", retrying`);\n const result = await this.toolRegistry.execute(newToolName, tc.input, {\n tierId: this.id,\n sessionId: this.taskId,\n requireApproval: false,\n });\n const str = typeof result === 'string' ? result : JSON.stringify(result);\n if (!str.startsWith('Tool error:')) return `[Synthesized ${newToolName}]: ${str}`;\n }\n } catch { /* fall through */ }\n }\n\n return originalError;\n }\n\n /**\n * Find a registered tool whose name/description semantically overlaps with\n * the failing tool. Returns the best candidate name, or null if none found.\n */\n private findAlternativeTool(failedToolName: string): string | null {\n const failedKeywords = failedToolName.toLowerCase().split(/[_\\-\\s]+/);\n const allTools = this.toolRegistry.getToolDefinitions();\n let bestScore = 0;\n let bestName: string | null = null;\n\n for (const tool of allTools) {\n if (tool.name === failedToolName) continue;\n const toolWords = tool.name.toLowerCase().split(/[_\\-\\s]+/);\n const score = failedKeywords.filter(k => toolWords.includes(k)).length;\n if (score > bestScore && score >= 1) {\n bestScore = score;\n bestName = tool.name;\n }\n }\n return bestName;\n }\n\n /**\n * Announce which files this T3 plans to edit, then acquire locks on them\n * before competing siblings can claim them. T3s working on different files\n * proceed in full parallel; T3s on the same file serialize automatically.\n */\n private async coordinateFileIntents(assignment: T2ToT3Assignment): Promise<void> {\n if (!this.peerBus) return;\n const plannedFiles = this.extractArtifactPaths(assignment);\n if (!plannedFiles.length) return;\n\n // Broadcast intent so siblings are aware\n this.peerBus.broadcast(this.id, {\n type: 'FILE_INTENT',\n subtaskId: assignment.subtaskId,\n files: plannedFiles,\n });\n\n // Give siblings 500ms to announce their intents\n await new Promise(r => setTimeout(r, 500));\n\n // Acquire locks on all planned files (in deterministic order to avoid deadlock)\n const sortedFiles = [...plannedFiles].sort();\n for (const filePath of sortedFiles) {\n if (this.peerBus.isFileLocked(filePath)) {\n this.log(`[T3] Waiting for file lock: ${filePath}`);\n this.sendStatusUpdate({\n progressPct: 5,\n currentAction: `Waiting for peer to finish editing: ${filePath}`,\n status: 'IN_PROGRESS',\n });\n await this.peerBus.waitForFileRelease(filePath);\n }\n await this.peerBus.lockFile(this.id, filePath);\n }\n\n // Register cleanup: release all locks when this worker finishes\n const origPublish = this.peerBus.publish.bind(this.peerBus);\n const bus = this.peerBus;\n const workerId = this.id;\n const cleanup = () => {\n for (const f of sortedFiles) bus.releaseFile(workerId, f);\n };\n this.once('completed', cleanup);\n this.once('failed', cleanup);\n this.peerBus.publish = (fromId, subtaskId, output, status) => {\n if (fromId === this.id) cleanup();\n // Restore original after first call for this worker\n this.peerBus!.publish = origPublish;\n origPublish(fromId, subtaskId, output, status);\n };\n }\n\n private requiresArtifact(): boolean {\n const haystack = `${this.assignment?.description ?? ''}\n${this.assignment?.expectedOutput ?? ''}`;\n return /\\b[\\w./-]+\\.(pdf|md|html|txt|json|csv|py|js|ts|tsx|jsx|docx?|png|jpg|jpeg|svg|gif)\\b/i.test(haystack)\n || /save (?:a|the)? file|create (?:a|the)? file|write (?:a|the)? file/i.test(haystack);\n }\n\n private extractArtifactPaths(assignment: T2ToT3Assignment): string[] {\n const haystack = `${assignment.description}\n${assignment.expectedOutput}`;\n const matches = haystack.match(/\\b[\\w./-]+\\.(pdf|md|html|txt|json|csv|py|js|ts|tsx|jsx|docx?|png|jpg|jpeg|svg|gif)\\b/gi) ?? [];\n return [...new Set(matches.map((m) => m.trim()))];\n }\n\n private async verifyArtifacts(assignment: T2ToT3Assignment): Promise<{ ok: boolean; issues: string[] }> {\n const artifactPaths = this.extractArtifactPaths(assignment);\n if (!artifactPaths.length) return { ok: true, issues: [] };\n\n const issues: string[] = [];\n const { exec } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(exec);\n\n for (const artifactPath of artifactPaths) {\n const absolutePath = path.resolve(process.cwd(), artifactPath);\n try {\n const stat = await fs.stat(absolutePath);\n if (!stat.isFile()) {\n issues.push(`Expected artifact is not a file: ${artifactPath}`);\n continue;\n }\n if (stat.size <= 0) {\n issues.push(`Artifact is empty: ${artifactPath}`);\n continue;\n }\n\n if (!/\\.pdf$/i.test(artifactPath)) {\n const content = await fs.readFile(absolutePath, 'utf-8');\n if (!content.trim()) {\n issues.push(`Artifact content is empty: ${artifactPath}`);\n continue;\n }\n } else if (stat.size < 100) {\n issues.push(`PDF artifact looks too small to be valid: ${artifactPath}`);\n continue;\n }\n\n // Semantic checks\n const ext = path.extname(absolutePath).toLowerCase();\n try {\n if (ext === '.ts' || ext === '.tsx') {\n await execAsync(`npx tsc --noEmit ${absolutePath}`, { timeout: 10000 });\n } else if (ext === '.js' || ext === '.jsx') {\n await execAsync(`node --check ${absolutePath}`, { timeout: 10000 });\n } else if (ext === '.py') {\n await execAsync(`python -m py_compile ${absolutePath}`, { timeout: 10000 });\n }\n } catch (err: any) {\n const stderr = err?.stderr || String(err);\n const stdout = err?.stdout || '';\n issues.push(`Semantic error in ${artifactPath}:\\n${stderr}\\n${stdout}`);\n }\n } catch {\n issues.push(`Required artifact was not created: ${artifactPath}`);\n }\n }\n\n return { ok: issues.length === 0, issues };\n }\n\n private async selfTest(\n assignment: T2ToT3Assignment,\n output: string,\n ): Promise<{ checksRun: string[]; passed: string[]; failed: string[] }> {\n const prompt = `Self-test this output against the assignment requirements.\n\nAssignment: ${assignment.description}\nExpected output: ${assignment.expectedOutput}\nConstraints: ${assignment.constraints.join('; ')}\n\nOutput to test:\n${output}\n\nReply with JSON: { \"completeness\": \"pass\"|\"fail\", \"correctness\": \"pass\"|\"fail\", \"compliance\": \"pass\"|\"fail\", \"notes\": \"string\" }`;\n\n const testMessages: ConversationMessage[] = [{ role: 'user', content: prompt }];\n const testResult = await this.router.generate('T3', { \n messages: testMessages, \n maxTokens: 500,\n systemPrompt: this.systemPromptOverride + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : ''),\n });\n\n try {\n const jsonMatch = /\\{[\\s\\S]*\\}/.exec(testResult.content);\n if (!jsonMatch) throw new Error('No JSON in test result');\n const parsed = JSON.parse(jsonMatch[0]) as {\n completeness: string;\n correctness: string;\n compliance: string;\n notes: string;\n };\n\n const checksRun = ['completeness', 'correctness', 'compliance'];\n const passed = checksRun.filter((c) => parsed[c as keyof typeof parsed] === 'pass');\n const failed = checksRun.filter((c) => parsed[c as keyof typeof parsed] === 'fail');\n\n return { checksRun, passed, failed };\n } catch {\n return {\n checksRun: ['completeness', 'correctness', 'compliance'],\n passed: ['completeness', 'correctness', 'compliance'],\n failed: [],\n };\n }\n }\n\n private async correctOutput(originalOutput: string, failures: string[]): Promise<string> {\n const correctionPrompt = `The following output failed these checks: ${failures.join(', ')}.\n\nOriginal output:\n${originalOutput}\n\nCorrect the issues and provide an improved version that addresses all failures.`;\n\n await this.context.addMessage({ role: 'user', content: correctionPrompt });\n\n const result = await this.runAgentLoop(\n \"You are in a correction phase. Fix the identified issues using your tools.\" + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : ''),\n this.tools\n );\n return result.output;\n }\n\n private buildSystemPrompt(assignment: T2ToT3Assignment): string {\n return `${T3_SYSTEM_PROMPT}\n\nYour subtask:\n- Title: ${assignment.subtaskTitle}\n- Description: ${assignment.description}\n- Expected output: ${assignment.expectedOutput}\n- Constraints: ${assignment.constraints.join('; ')}`;\n }\n\n private buildInitialPrompt(assignment: T2ToT3Assignment): string {\n return `Execute the following subtask completely:\n\n**${assignment.subtaskTitle}**\n\n${assignment.description}\n\nExpected output: ${assignment.expectedOutput}\n\nConstraints:\n${assignment.constraints.map((c) => `- ${c}`).join('\\n')}\n\nBegin execution now.`;\n }\n\n private buildResult(\n status: T3Result['status'],\n output: string,\n testResults: T3Result['testResults'],\n issues: string[],\n correctionAttempts: number,\n ): T3Result {\n return {\n subtaskId: this.assignment?.subtaskId ?? '',\n status,\n output,\n testResults,\n issues,\n peerSyncsUsed: this.peerSyncBuffer.map(m => m.fromId),\n correctionAttempts,\n };\n }\n\n private isFileOperation(toolName: string): boolean {\n return ['file_write', 'file_edit', 'file_delete'].includes(toolName);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Peer-to-Peer Coordination Bus\n// ─────────────────────────────────────────────\n\nimport EventEmitter from 'node:events';\nimport type { PeerMessage, PeerMessageEvent, PeerSyncType } from '../../types.js';\n\ninterface PeerOutput {\n subtaskId: string;\n fromId: string;\n output: string;\n status: 'COMPLETED' | 'FAILED' | 'ESCALATED';\n timestamp: string;\n}\n\n/**\n * PeerBus enables T3↔T3 and T2↔T2 communication within a task.\n * Each T2Manager creates one PeerBus and shares it with its T3Workers.\n * T1 creates one PeerBus and shares it with its T2Managers.\n */\ninterface BroadcastMessage {\n fromId: string;\n payload: unknown;\n timestamp: string;\n}\n\ninterface FileLock {\n holderId: string;\n lockedAt: string;\n waiters: Array<() => void>;\n}\n\nexport class PeerBus extends EventEmitter {\n private outputs: Map<string, PeerOutput> = new Map();\n private waiters: Map<string, Array<(output: PeerOutput) => void>> = new Map();\n private members: Set<string> = new Set();\n private barriers: Map<string, { total: number; arrived: Set<string> }> = new Map();\n private broadcastLog: BroadcastMessage[] = [];\n private fileLocks: Map<string, FileLock> = new Map();\n /** subtaskIds whose T3 is being retried by T2 — dependents should re-wait rather than fail fast */\n private retryPending: Set<string> = new Set();\n\n /** Called when any peer message or broadcast is sent — used for dashboard visibility. */\n onPeerMessage?: (event: PeerMessageEvent) => void;\n sessionId = '';\n\n register(peerId: string): void {\n this.members.add(peerId);\n }\n\n /**\n * Publish output — unblocks any peers waiting on this subtaskId\n */\n publish(fromId: string, subtaskId: string, output: string, status: PeerOutput['status']): void {\n const entry: PeerOutput = {\n subtaskId,\n fromId,\n output,\n status,\n timestamp: new Date().toISOString(),\n };\n\n this.outputs.set(subtaskId, entry);\n this.emit('output:ready', entry);\n\n // Resolve waiters\n const waiting = this.waiters.get(subtaskId) ?? [];\n for (const resolve of waiting) resolve(entry);\n this.waiters.delete(subtaskId);\n }\n\n /**\n * Mark a subtask as retry-pending so dependents re-wait instead of failing fast\n * when they see an ESCALATED status.\n */\n markRetryPending(subtaskId: string): void {\n this.retryPending.add(subtaskId);\n // Remove the cached ESCALATED output so waitFor() blocks for the retry result\n this.outputs.delete(subtaskId);\n }\n\n /** Called by T2 after retry resolves (success or final failure). */\n clearRetryPending(subtaskId: string): void {\n this.retryPending.delete(subtaskId);\n }\n\n /** Remove a single output entry so a respawned worker can republish without clearing prior-wave outputs. */\n clearOutput(subtaskId: string): void {\n this.outputs.delete(subtaskId);\n this.waiters.delete(subtaskId);\n this.retryPending.delete(subtaskId);\n }\n\n isRetryPending(subtaskId: string): boolean {\n return this.retryPending.has(subtaskId);\n }\n\n /**\n * Wait for a specific subtask's output — resolves immediately if already available.\n * If the output is ESCALATED but a retry is pending, waits for the retry result.\n */\n waitFor(subtaskId: string, timeoutMs = 120_000): Promise<PeerOutput> {\n const existing = this.outputs.get(subtaskId);\n if (existing && !this.retryPending.has(subtaskId)) return Promise.resolve(existing);\n\n return new Promise((resolve, reject) => {\n const resolver = (output: PeerOutput) => {\n clearTimeout(timer);\n resolve(output);\n };\n\n const timer = setTimeout(() => {\n // Remove this specific resolver so publish() cannot call it after rejection\n const waiting = this.waiters.get(subtaskId);\n if (waiting) {\n const idx = waiting.indexOf(resolver);\n if (idx !== -1) waiting.splice(idx, 1);\n if (waiting.length === 0) this.waiters.delete(subtaskId);\n }\n reject(new Error(`Peer timeout waiting for subtask: ${subtaskId}`));\n }, timeoutMs);\n\n const resolvers = this.waiters.get(subtaskId) ?? [];\n resolvers.push(resolver);\n this.waiters.set(subtaskId, resolvers);\n });\n }\n\n /**\n * Get output if already available (non-blocking)\n */\n getOutput(subtaskId: string): PeerOutput | undefined {\n return this.outputs.get(subtaskId);\n }\n\n /**\n * Broadcast a message to all registered peers except sender.\n * Also logs to broadcastLog so collect() can retrieve recent broadcasts.\n */\n broadcast(fromId: string, payload: unknown): void {\n const timestamp = new Date().toISOString();\n const msg: PeerMessage = {\n fromId,\n toId: '*',\n type: 'SYNC_DATA',\n subtaskId: '',\n syncType: 'SHARE_OUTPUT',\n payload,\n timestamp,\n };\n this.broadcastLog.push({ fromId, payload, timestamp });\n this.emit('broadcast', msg);\n this.onPeerMessage?.({\n fromId,\n toId: undefined,\n syncType: 'SHARE_OUTPUT',\n payload: typeof payload === 'string' ? payload : JSON.stringify(payload),\n timestamp,\n sessionId: this.sessionId,\n });\n }\n\n /**\n * Collect all broadcast messages received within a time window.\n * Useful for T2 announcement gathering — call immediately after triggering broadcasts.\n */\n collect(timeoutMs: number): Promise<BroadcastMessage[]> {\n const collected: BroadcastMessage[] = [...this.broadcastLog];\n return new Promise(resolve => {\n const timer = setTimeout(() => {\n off();\n resolve(collected);\n }, timeoutMs);\n\n const handler = (msg: PeerMessage) => {\n collected.push({ fromId: msg.fromId, payload: msg.payload, timestamp: msg.timestamp });\n };\n this.on('broadcast', handler);\n\n const off = () => {\n clearTimeout(timer);\n this.off('broadcast', handler);\n };\n\n // Also resolve early if all members have broadcast\n const checkComplete = () => {\n const broadcasters = new Set(collected.map(m => m.fromId));\n if (broadcasters.size >= this.members.size) {\n off();\n resolve(collected);\n }\n };\n this.on('broadcast', checkComplete);\n });\n }\n\n /**\n * Acquire an exclusive file lock — prevents concurrent T3 writes to the same file.\n * If the file is already locked, waits until the lock is released.\n */\n async lockFile(tierId: string, filePath: string, timeoutMs = 30_000): Promise<void> {\n const existing = this.fileLocks.get(filePath);\n if (!existing) {\n this.fileLocks.set(filePath, { holderId: tierId, lockedAt: new Date().toISOString(), waiters: [] });\n return;\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`File lock timeout for ${filePath} (held by ${existing.holderId})`));\n }, timeoutMs);\n\n existing.waiters.push(() => {\n clearTimeout(timer);\n // Re-acquire for this tier\n this.fileLocks.set(filePath, { holderId: tierId, lockedAt: new Date().toISOString(), waiters: [] });\n resolve();\n });\n });\n }\n\n /**\n * Release a file lock — unblocks the next waiter if any.\n */\n releaseFile(tierId: string, filePath: string): void {\n const lock = this.fileLocks.get(filePath);\n if (!lock || lock.holderId !== tierId) return;\n\n const nextWaiter = lock.waiters.shift();\n if (nextWaiter) {\n nextWaiter();\n } else {\n this.fileLocks.delete(filePath);\n }\n this.emit(`file:released:${filePath}`, { tierId, filePath });\n }\n\n /**\n * Wait until a file lock is released (non-acquiring — just observes).\n * Used by T3s that want to read after another T3 finishes writing.\n */\n waitForFileRelease(filePath: string, timeoutMs = 30_000): Promise<void> {\n if (!this.fileLocks.has(filePath)) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(`Timeout waiting for file release: ${filePath}`)), timeoutMs);\n this.once(`file:released:${filePath}`, () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n /**\n * Check if a file is currently locked (non-blocking).\n */\n isFileLocked(filePath: string): boolean {\n return this.fileLocks.has(filePath);\n }\n\n /**\n * Reset all runtime output/waiter state for a fresh T3 respawn wave.\n * Preserves member registrations and barrier definitions.\n */\n reset(): void {\n this.outputs.clear();\n this.waiters.clear();\n this.retryPending.clear();\n this.broadcastLog = [];\n }\n\n /**\n * Clear broadcast log — call between phases to avoid stale announcements.\n */\n clearBroadcastLog(): void {\n this.broadcastLog = [];\n }\n\n /**\n * Send a targeted message to a specific peer\n */\n send(\n fromId: string,\n toId: string,\n syncType: PeerSyncType,\n subtaskId: string,\n payload: unknown,\n ): void {\n const timestamp = new Date().toISOString();\n const msg: PeerMessage = {\n fromId,\n toId,\n type: 'SYNC_DATA',\n subtaskId,\n syncType,\n payload,\n timestamp,\n };\n this.emit(`message:${toId}`, msg);\n this.emit('message', msg);\n this.onPeerMessage?.({\n fromId,\n toId,\n syncType: syncType ?? 'SHARE_OUTPUT',\n payload: typeof payload === 'string' ? payload : JSON.stringify(payload),\n timestamp,\n sessionId: this.sessionId,\n });\n }\n\n /**\n * Barrier — wait until N peers have all reached this point\n * Useful for fan-in synchronization\n */\n async barrier(peerId: string, barrierName: string, totalPeers: number): Promise<void> {\n if (!this.barriers.has(barrierName)) {\n this.barriers.set(barrierName, { total: totalPeers, arrived: new Set() });\n }\n\n const bar = this.barriers.get(barrierName)!;\n bar.arrived.add(peerId);\n\n if (bar.arrived.size >= bar.total) {\n this.emit(`barrier:${barrierName}`);\n return;\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Barrier timeout: ${barrierName} (${bar.arrived.size}/${bar.total} arrived)`));\n }, 120_000);\n\n this.once(`barrier:${barrierName}`, () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n getAllOutputs(): PeerOutput[] {\n return Array.from(this.outputs.values());\n }\n\n getMembers(): string[] {\n return Array.from(this.members);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — T2 Manager\n// ─────────────────────────────────────────────\n\nimport { randomUUID } from 'node:crypto';\nimport type {\n ConversationMessage,\n EscalationPayload,\n PeerMessageEvent,\n PermissionRequest,\n PermissionDecision,\n T1ToT2Assignment,\n T2Result,\n T2ToT3Assignment,\n T3Result,\n} from '../../types.js';\nimport type { CascadeRouter } from '../router/index.js';\nimport type { ToolRegistry } from '../../tools/registry.js';\nimport { BaseTier } from './base.js';\nimport { T3Worker } from './t3-worker.js';\nimport { MemoryStore } from '../../memory/store.js';\nimport { PeerBus } from '../peer/bus.js';\nimport type { PermissionEscalator } from '../permissions/escalator.js';\nimport type { ToolCreator } from '../../tools/tool-creator.js';\n\nconst T2_SYSTEM_PROMPT = `You are a T2 Manager agent in the Cascade AI system.\nYour role is to analyze a section of a task and decompose it into 2-5 discrete subtasks for T3 Workers.\nIf subtasks have dependencies, you can specify \"executionMode\": \"sequential\" for the section.\nProvide \"peerT3Ids\" to subtasks so they can coordinate using the peer_message tool.\nReturn ONLY valid JSON matching the T3 subtask array schema — no other text.`;\n\nexport class T2Manager extends BaseTier {\n private router: CascadeRouter;\n private toolRegistry: ToolRegistry;\n private assignment?: T1ToT2Assignment;\n private t3Workers: Map<string, T3Worker> = new Map();\n private escalations: EscalationPayload[] = [];\n private peerSyncBuffer: Array<{ fromId: string; content: unknown; timestamp: string }> = [];\n private store?: MemoryStore;\n private t3PeerBus: PeerBus = new PeerBus(); // ← T3↔T3 bus (local to this T2)\n private t2PeerBus?: PeerBus;\n private permissionEscalator?: PermissionEscalator;\n private toolCreator?: ToolCreator;\n /** AbortController for the current T3 wave — aborted on cancel-and-respawn */\n private waveAbortController: AbortController | null = null;\n\n setPeerBus(bus: PeerBus): void {\n this.t2PeerBus = bus;\n this.t2PeerBus.register(this.id);\n\n // Listen for messages from sibling T2s\n this.t2PeerBus.on(`message:${this.id}`, (msg) => {\n this.log(`T2 peer message from ${msg.fromId}`);\n this.receivePeerSync(msg.fromId, msg.payload);\n });\n }\n\n setPeerMessageCallback(cb: (event: PeerMessageEvent) => void, sessionId: string): void {\n this.t3PeerBus.onPeerMessage = cb;\n this.t3PeerBus.sessionId = sessionId;\n if (this.t2PeerBus) {\n this.t2PeerBus.onPeerMessage = cb;\n this.t2PeerBus.sessionId = sessionId;\n }\n }\n\n\n\n constructor(router: CascadeRouter, toolRegistry: ToolRegistry, parentId: string) {\n super('T2', undefined, parentId);\n this.router = router;\n this.toolRegistry = toolRegistry;\n }\n\n setStore(store: MemoryStore): void {\n this.store = store;\n }\n\n /**\n * Inject the shared PermissionEscalator for this task run.\n * The escalator will also be given this T2's evaluator function.\n */\n setPermissionEscalator(escalator: PermissionEscalator): void {\n this.permissionEscalator = escalator;\n escalator.setT2Evaluator((req) => this.evaluatePermissionAtT2(req));\n }\n\n setToolCreator(creator: ToolCreator): void {\n this.toolCreator = creator;\n }\n\n /**\n * Phase 1 of T2 peer discussion: broadcast this section's plan so sibling T2s\n * and T1 can detect overlaps and coordinate execution order.\n * Called BEFORE execute() begins the agent loop.\n */\n announcePlan(assignment: T1ToT2Assignment): void {\n if (!this.t2PeerBus) return;\n const payload = {\n type: 'T2_PLAN_ANNOUNCEMENT',\n sectionId: assignment.sectionId,\n sectionTitle: assignment.sectionTitle,\n description: assignment.description,\n subtaskTitles: assignment.t3Subtasks?.map(s => s.subtaskTitle) ?? [],\n keywords: this.extractKeywords(assignment),\n };\n this.t2PeerBus.broadcast(this.id, payload);\n this.log(`[T2] Announced plan for section: ${assignment.sectionTitle}`);\n }\n\n /**\n * Phase 2: After this section completes, share the output with sibling T2s\n * so they can reference it in their final compilation if relevant.\n */\n shareCompletedOutput(sectionId: string, output: string): void {\n if (!this.t2PeerBus) return;\n const payload = { type: 'T2_SECTION_OUTPUT', sectionId, output };\n this.t2PeerBus.broadcast(this.id, payload);\n }\n\n private extractKeywords(assignment: T1ToT2Assignment): string[] {\n const text = `${assignment.sectionTitle} ${assignment.description}`.toLowerCase();\n // Extract file-like tokens and key nouns for overlap detection\n const fileTokens = text.match(/[\\w./-]+\\.(ts|js|tsx|jsx|py|md|json|yaml|txt|html|css|sh)\\b/gi) ?? [];\n const wordTokens = text.match(/\\b(?:auth|database|api|server|client|config|deploy|test|ui|model|schema|route|endpoint|migration|component)\\b/gi) ?? [];\n return [...new Set([...fileTokens, ...wordTokens].map(t => t.toLowerCase()))];\n }\n\n receivePeerSync(fromId: string, content: unknown): void {\n this.peerSyncBuffer.push({\n fromId,\n content,\n timestamp: new Date().toISOString(),\n });\n this.emit('peer-sync-received', { fromId, content });\n }\n\n async execute(assignment: T1ToT2Assignment, taskId: string, signal?: AbortSignal): Promise<T2Result> {\n this.signal = signal;\n this.assignment = assignment;\n this.taskId = taskId;\n this.setLabel(assignment.sectionTitle);\n this.setStatus('ACTIVE');\n\n this.sendStatusUpdate({\n progressPct: 0,\n currentAction: `Analyzing section: ${assignment.sectionTitle}`,\n status: 'IN_PROGRESS',\n });\n\n this.log(`T2 managing section: ${assignment.sectionTitle}`);\n\n try {\n // ── Cancellation checkpoint: before section decomposition ──\n this.throwIfCancelled();\n\n const subtasks = assignment.t3Subtasks.length > 0\n ? assignment.t3Subtasks\n : await this.decomposeSection(assignment);\n\n this.sendStatusUpdate({\n progressPct: 20,\n currentAction: `Dispatching ${subtasks.length} T3 workers`,\n status: 'IN_PROGRESS',\n });\n\n // ── Cancellation checkpoint: before T3 dispatch ──\n this.throwIfCancelled();\n\n const t3Results = await this.executeSubtasks(subtasks, taskId);\n\n this.sendStatusUpdate({\n progressPct: 90,\n currentAction: 'Aggregating T3 results',\n status: 'IN_PROGRESS',\n });\n\n const summary = await this.aggregateResults(assignment, t3Results);\n const issues = t3Results\n .filter((r) => r.status !== 'COMPLETED')\n .flatMap((r) => r.issues);\n\n const overallStatus = this.determineStatus(t3Results);\n const isOk = overallStatus === 'COMPLETED' || overallStatus === 'PARTIAL';\n this.setStatus(isOk ? 'COMPLETED' : 'FAILED', summary);\n\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Section complete', status: 'IN_PROGRESS', output: summary });\n\n // ── Build result first, then publish to peers ──\n const result: T2Result = {\n sectionId: assignment.sectionId,\n sectionTitle: assignment.sectionTitle,\n status: overallStatus,\n t3Results,\n sectionSummary: summary,\n issues,\n };\n\n this.publishSectionOutput(result); // ← now result exists to publish\n\n return result;\n\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n this.setStatus('FAILED', errMsg);\n\n const failedResult: T2Result = {\n sectionId: assignment.sectionId,\n sectionTitle: assignment.sectionTitle,\n status: 'FAILED',\n t3Results: [],\n sectionSummary: '',\n issues: [`T2 execution error: ${errMsg}`],\n };\n\n this.publishSectionOutput(failedResult); // ← publish failures too so dependents don't hang\n\n return failedResult;\n }\n }\n\n // ── Private ──────────────────────────────────\n\n private async decomposeSection(assignment: T1ToT2Assignment): Promise<T2ToT3Assignment['subtaskId'] extends string ? T2ToT3Assignment[] : never> {\n const peerPlans = this.peerSyncBuffer\n .filter(p => (p.content as any)?.type === 'T2_PLAN_ANNOUNCEMENT')\n .map(p => `[Peer ${p.fromId} Plan]: ${(p.content as any).sectionTitle} - ${(p.content as any).subtaskTitles?.join(', ')}`)\n .join('\\n');\n\n const prompt = `Decompose this section into 2-5 concrete subtasks for T3 workers.\n\nSection: ${assignment.sectionTitle}\nDescription: ${assignment.description}\nExpected output: ${assignment.expectedOutput}\nConstraints: ${assignment.constraints.join('; ')}\n${peerPlans ? `\\nContext from sibling T2 plans (use this to align execution and avoid overlaps):\\n${peerPlans}\\n` : ''}\nReturn a JSON array of subtask objects, each with:\n- subtaskId: string (unique)\n- subtaskTitle: string\n- description: string\n- expectedOutput: string\n- constraints: string[]\n- peerT3Ids: string[] (empty for now)\n- dependsOn: string[] (array of subtaskIds this task depends on to start)\n- executionMode: \"parallel|sequential\" (default is parallel)\n\nReturn ONLY the JSON array.`;\n\n const messages: ConversationMessage[] = [{ role: 'user', content: prompt }];\n const result = await this.router.generate('T2', {\n messages,\n systemPrompt: this.systemPromptOverride + T2_SYSTEM_PROMPT + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : ''),\n maxTokens: 2000,\n });\n\n try {\n const jsonMatch = /\\[[\\s\\S]*\\]/.exec(result.content);\n if (!jsonMatch) throw new Error('No JSON array found');\n return JSON.parse(jsonMatch[0]) as T2ToT3Assignment[];\n } catch {\n // Fallback: single subtask = the whole section\n return [{\n subtaskId: randomUUID(),\n subtaskTitle: assignment.sectionTitle,\n description: assignment.description,\n expectedOutput: assignment.expectedOutput,\n constraints: assignment.constraints,\n peerT3Ids: [],\n parentT2: this.id,\n executionMode: 'parallel',\n }];\n }\n }\n\n private buildWorkerMap(assignments: T2ToT3Assignment[], taskId: string): Map<string, T3Worker> {\n const workerMap = new Map<string, T3Worker>();\n for (const a of assignments) {\n const worker = new T3Worker(this.router, this.toolRegistry, this.id);\n if (this.store) worker.setStore(this.store, taskId);\n worker.setPeerBus(this.t3PeerBus);\n if (this.permissionEscalator) worker.setPermissionEscalator(this.permissionEscalator);\n if (this.toolCreator) worker.setToolCreator(this.toolCreator);\n\n workerMap.set(a.subtaskId, worker);\n this.t3Workers.set(a.subtaskId, worker);\n\n worker.on('stream:token', (e) => this.emit('stream:token', e));\n worker.on('log', (e) => this.emit('log', e));\n worker.on('tier:status', (e) => this.emit('tier:status', e));\n worker.on('tool:approval-request', (e) => this.emit('tool:approval-request', {\n ...e,\n __cascadeResponder: (decision: { approved: boolean; always?: boolean }) =>\n worker.emit(`tool:approval-response:${e.id}`, decision),\n }));\n }\n return workerMap;\n }\n\n private async executeSubtasks(\n subtasks: Array<Omit<T2ToT3Assignment, 'parentT2'>>,\n taskId: string,\n ): Promise<T3Result[]> {\n const assignments: T2ToT3Assignment[] = subtasks.map((s) => ({\n ...s,\n parentT2: this.id,\n }));\n\n // Wire peer IDs and sanitize dependencies\n const allKeys = new Set(assignments.map((a) => a.subtaskId));\n for (const a of assignments) {\n a.peerT3Ids = assignments\n .filter((x) => x.subtaskId !== a.subtaskId)\n .map((x) => x.subtaskId);\n a.dependsOn = (a.dependsOn ?? []).filter((d) => allKeys.has(d));\n }\n\n // Create T3 workers\n const workerMap = new Map<string, T3Worker>();\n const workers: T3Worker[] = assignments.map((a) => {\n const worker = new T3Worker(this.router, this.toolRegistry, this.id);\n if (this.store) worker.setStore(this.store, taskId);\n\n // ← Inject the shared T3 peer bus\n worker.setPeerBus(this.t3PeerBus);\n\n // ← Inject the permission escalator so T3 uses T2→T1→User flow\n if (this.permissionEscalator) {\n worker.setPermissionEscalator(this.permissionEscalator);\n }\n\n // ← Inject optional ToolCreator for runtime tool generation\n if (this.toolCreator) {\n worker.setToolCreator(this.toolCreator);\n }\n\n workerMap.set(a.subtaskId, worker);\n this.t3Workers.set(a.subtaskId, worker);\n\n // Bubble up events\n worker.on('stream:token', (e) => this.emit('stream:token', e));\n worker.on('log', (e) => this.emit('log', e));\n worker.on('tier:status', (e) => this.emit('tier:status', e));\n worker.on('tool:call', (e) => this.emit('tool:call', e));\n worker.on('tool:result', (e) => this.emit('tool:result', e));\n worker.on('tool:approval-request', (e) => this.emit('tool:approval-request', {\n ...e,\n __cascadeResponder: (decision: { approved: boolean; always?: boolean }) =>\n worker.emit(`tool:approval-response:${e.id}`, decision),\n }));\n\n return worker;\n });\n\n // ── Dependency-aware execution ────────────\n return this.runWithDependencies(assignments, workerMap, taskId);\n }\n\n /**\n * Runs T3 workers respecting dependsOn declarations.\n *\n * Uses Kahn's algorithm for topological ordering:\n * 1. Build an in-degree map from the dependency graph.\n * 2. Detect cycles — if any exist, break them by removing the offending edge\n * and logging a warning (so the run degrades gracefully instead of deadlocking).\n * 3. Execute workers in waves: start all zero-in-degree tasks in parallel,\n * then reduce in-degrees of their dependents and repeat.\n */\n private async runWithDependencies(\n assignments: T2ToT3Assignment[],\n workerMap: Map<string, T3Worker>,\n taskId: string,\n ): Promise<T3Result[]> {\n // ── Build graph ────────────────────────────\n // adjacency: subtaskId → set of subtaskIds that depend on it\n const adj = new Map<string, Set<string>>();\n // inDegree: how many unresolved dependencies each task has\n const inDegree = new Map<string, number>();\n // resolved outputs\n const resultMap = new Map<string, T3Result>();\n\n for (const a of assignments) {\n if (!adj.has(a.subtaskId)) adj.set(a.subtaskId, new Set());\n inDegree.set(a.subtaskId, 0);\n }\n\n for (const a of assignments) {\n const deps = (a.dependsOn ?? []);\n for (const dep of deps) {\n adj.get(dep)!.add(a.subtaskId);\n inDegree.set(a.subtaskId, (inDegree.get(a.subtaskId) ?? 0) + 1);\n }\n }\n\n // ── Cycle detection & breaking (Kahn's) ───\n //\n // After a full topological pass, any task still with inDegree > 0\n // is part of a cycle. We break cycles by forcibly zeroing their inDegree\n // and logging a warning so they can still execute (without that dependency).\n\n const sanitizedAssignments = this.breakCycles(assignments, adj, inDegree);\n\n // ── Wave-based execution ───────────────────\n //\n // Each iteration: collect all tasks with inDegree = 0, run them in parallel,\n // then decrement in-degrees of their dependents.\n //\n // respawnBudget: how many times a wave may be cancelled and re-run after\n // dynamic tool synthesis. Capped at 1 to prevent infinite loops.\n\n let remaining = new Set(sanitizedAssignments.map((a) => a.subtaskId));\n let wave = 0;\n let respawnBudget = 1;\n\n while (remaining.size > 0) {\n // Collect all runnable tasks this wave\n const runnableIds = [...remaining].filter((id) => (inDegree.get(id) ?? 0) === 0);\n\n if (runnableIds.length === 0) {\n // Safety net: should not happen after cycle breaking, but if it does,\n // force-unblock the lowest-in-degree remaining task to prevent stalling.\n const fallbackId = [...remaining].sort(\n (a, b) => (inDegree.get(a) ?? 0) - (inDegree.get(b) ?? 0),\n )[0]!;\n this.log(`⚠ Dependency stall detected — force-starting: ${fallbackId}`);\n inDegree.set(fallbackId, 0);\n runnableIds.push(fallbackId);\n }\n\n wave++;\n this.log(`Wave ${wave}: running ${runnableIds.length} subtask(s) in parallel`);\n this.sendStatusUpdate({\n progressPct: 20 + Math.min(wave * 10, 60),\n currentAction: `T3 wave ${wave}: ${runnableIds.map((id) =>\n sanitizedAssignments.find((a) => a.subtaskId === id)?.subtaskTitle ?? id\n ).join(', ')}`,\n status: 'IN_PROGRESS',\n });\n\n // ── Cancellation checkpoint: between each T3 wave ────────────\n this.throwIfCancelled();\n\n // Fresh AbortController per wave — aborted on cancel-and-respawn\n this.waveAbortController = new AbortController();\n const waveSignal = AbortSignal.any(\n [this.signal, this.waveAbortController.signal].filter(Boolean) as AbortSignal[],\n );\n\n // Execute this wave in parallel\n const waveResults = await Promise.allSettled(\n runnableIds.map(async (id) => {\n const assignment = sanitizedAssignments.find((a) => a.subtaskId === id)!;\n const worker = workerMap.get(id)!;\n const result = await worker.execute(assignment, taskId, waveSignal);\n resultMap.set(id, result);\n return result;\n }),\n );\n\n // ── Cancel-and-respawn: if ANY worker in this wave escalated for tool synthesis,\n // cancel the whole wave, synthesize the tool once, then re-run ALL wave workers\n // with fresh instances that have the new tool available.\n const escalatedToolIdx = respawnBudget > 0\n ? waveResults.findIndex(\n (r) => r.status === 'fulfilled' &&\n r.value.status === 'ESCALATED' &&\n r.value.issues.some((iss) => iss.includes('dynamic tool generation')),\n )\n : -1;\n\n if (escalatedToolIdx !== -1 && this.toolCreator) {\n respawnBudget--;\n this.waveAbortController.abort();\n\n const escalatedId = runnableIds[escalatedToolIdx]!;\n const escalatedAssignment = sanitizedAssignments.find((a) => a.subtaskId === escalatedId)!;\n\n this.log(`Wave ${wave}: tool escalation detected — synthesizing tool then respawning all ${runnableIds.length} worker(s)`);\n this.sendStatusUpdate({\n progressPct: 50,\n currentAction: `Synthesizing dynamic tool for: ${escalatedAssignment.subtaskTitle}`,\n status: 'IN_PROGRESS',\n });\n\n const toolName = await this.toolCreator.createTool(\n `Help complete: ${escalatedAssignment.subtaskTitle}`,\n escalatedAssignment.description,\n );\n\n if (toolName) {\n this.log(`Tool \"${toolName}\" created — respawning wave ${wave} workers`);\n // Stamp all wave assignments so fresh T3s know about the tool\n for (const a of sanitizedAssignments) {\n if (runnableIds.includes(a.subtaskId)) {\n a.description += `\\n\\n[SYSTEM]: Dynamic tool \"${toolName}\" is now available — use it to complete your task.`;\n }\n }\n }\n\n // Clear only current-wave outputs so prior-wave completions remain accessible to dependents\n for (const id of runnableIds) {\n this.t3PeerBus.clearOutput(id);\n }\n\n // Rebuild fresh T3Worker instances for this wave\n const freshMap = this.buildWorkerMap(\n sanitizedAssignments.filter((a) => runnableIds.includes(a.subtaskId)),\n taskId,\n );\n for (const [k, v] of freshMap) workerMap.set(k, v);\n\n // Re-queue all wave IDs\n for (const id of runnableIds) {\n remaining.add(id);\n inDegree.set(id, 0);\n }\n wave--; // keep wave counter accurate (will be incremented again at top)\n continue;\n }\n\n // ── Normal wave completion: reduce in-degrees, handle rejections ─\n for (let i = 0; i < runnableIds.length; i++) {\n const id = runnableIds[i]!;\n remaining.delete(id);\n\n const r = waveResults[i]!;\n if (r.status === 'rejected') {\n this.log(`T3 worker ${id} failed: ${r.reason instanceof Error ? r.reason.message : String(r.reason)} — retrying once`);\n const assignment = sanitizedAssignments.find((a) => a.subtaskId === id)!;\n try {\n const retried = await this.retryT3(assignment, taskId);\n resultMap.set(id, retried);\n } catch (retryErr) {\n const msg = retryErr instanceof Error ? retryErr.message : String(retryErr);\n this.log(`T3 retry for ${id} threw before publishing — unblocking dependents with FAILED`);\n this.t3PeerBus.publish(this.id, id, `Retry failed: ${msg}`, 'FAILED');\n resultMap.set(id, {\n subtaskId: id,\n status: 'FAILED',\n output: `Retry threw: ${msg}`,\n testResults: { checksRun: [], passed: [], failed: [] },\n issues: [msg],\n peerSyncsUsed: [],\n correctionAttempts: 1,\n });\n }\n }\n\n for (const dependent of adj.get(id) ?? []) {\n inDegree.set(dependent, Math.max(0, (inDegree.get(dependent) ?? 0) - 1));\n }\n }\n }\n\n return [...resultMap.values()];\n }\n\n /**\n * Detects cyclic dependencies using Kahn's algorithm and breaks them\n * by removing back-edges. Returns a sanitized copy of assignments.\n *\n * A cycle like t1→t2→t3→t1 is broken at the last edge (t3→t1),\n * meaning t3 will start without waiting for t1, preventing deadlock.\n */\n private breakCycles(\n assignments: T2ToT3Assignment[],\n adj: Map<string, Set<string>>,\n inDegree: Map<string, number>,\n ): T2ToT3Assignment[] {\n // Clone inDegree for simulation\n const degree = new Map(inDegree);\n const queue: string[] = [];\n const visited = new Set<string>();\n\n for (const [id, d] of degree) {\n if (d === 0) queue.push(id);\n }\n\n while (queue.length > 0) {\n const id = queue.shift()!;\n visited.add(id);\n for (const dep of adj.get(id) ?? []) {\n const newDeg = (degree.get(dep) ?? 1) - 1;\n degree.set(dep, newDeg);\n if (newDeg === 0) queue.push(dep);\n }\n }\n\n // Any node not visited is in a cycle\n const cycleNodes = [...inDegree.keys()].filter((id) => !visited.has(id));\n\n if (cycleNodes.length === 0) return assignments; // No cycles\n\n this.log(\n `⚠ Circular dependency detected among subtasks: [${cycleNodes.join(', ')}]. ` +\n `Breaking cycles — affected tasks will run without their cyclic dependencies.`,\n );\n\n // Sanitize: remove dependsOn references that involve cycle nodes\n return assignments.map((a) => {\n if (!cycleNodes.includes(a.subtaskId)) return a;\n const safeDeps = (a.dependsOn ?? []).filter((d) => !cycleNodes.includes(d));\n if (safeDeps.length !== (a.dependsOn ?? []).length) {\n this.log(\n ` → Breaking cycle: removed ${(a.dependsOn ?? []).filter((d) => cycleNodes.includes(d)).join(', ')} ` +\n `from \"${a.subtaskTitle}\" dependsOn`,\n );\n // Also decrement inDegree for the removed deps\n for (const removed of (a.dependsOn ?? []).filter((d) => cycleNodes.includes(d))) {\n inDegree.set(a.subtaskId, Math.max(0, (inDegree.get(a.subtaskId) ?? 1) - 1));\n adj.get(removed)?.delete(a.subtaskId);\n }\n }\n return { ...a, dependsOn: safeDeps };\n });\n }\n\n\n private async retryT3(assignment: T2ToT3Assignment, taskId: string): Promise<T3Result> {\n this.log(`Retrying T3 for subtask: ${assignment.subtaskTitle}`);\n const worker = new T3Worker(this.router, this.toolRegistry, this.id);\n if (this.store) worker.setStore(this.store, taskId);\n worker.setPeerBus(this.t3PeerBus); // ← wire bus on retry too\n worker.on('stream:token', (e) => this.emit('stream:token', e));\n worker.on('tool:approval-request', (e) => this.emit('tool:approval-request', {\n ...e,\n __cascadeResponder: (decision: { approved: boolean; always?: boolean }) =>\n worker.emit(`tool:approval-response:${e.id}`, decision),\n }));\n return worker.execute(\n { ...assignment, description: `[RETRY] ${assignment.description}` },\n taskId,\n this.signal,\n );\n }\n\n private publishSectionOutput(result: T2Result): void {\n this.t2PeerBus?.publish(\n this.id,\n result.sectionId,\n result.sectionSummary,\n result.status === 'COMPLETED' ? 'COMPLETED' : 'FAILED',\n );\n }\n\n private async aggregateResults(\n assignment: T1ToT2Assignment,\n results: T3Result[],\n ): Promise<string> {\n const completed = results.filter((r) => r.status === 'COMPLETED');\n if (!completed.length) return `Section ${assignment.sectionTitle} failed — no T3 workers completed.`;\n\n const peerOutputs = this.peerSyncBuffer\n .filter(p => (p.content as any)?.type === 'T2_SECTION_OUTPUT')\n .map(p => `[Peer ${p.fromId} Output]: ${(p.content as any).output}`)\n .join('\\n\\n');\n\n const peerContext = peerOutputs ? `\\n\\nContext from sibling T2 completed sections (use this to ensure your summary aligns with the overall state):\\n${peerOutputs}` : '';\n const MAX_CHUNK_LENGTH = 15000; // Roughly ~3.5k tokens safety limit\n\n let currentSummary = '';\n let i = 0;\n\n // Rolling map-reduce for large outputs\n while (i < completed.length) {\n let chunkText = '';\n let chunkEnd = i;\n\n while (chunkEnd < completed.length) {\n const nextOutput = `[T3-${chunkEnd + 1}]: ${completed[chunkEnd]!.output}\\n\\n`;\n if (chunkText.length + nextOutput.length > MAX_CHUNK_LENGTH && chunkEnd > i) {\n break; // Stop if adding this output exceeds the chunk limit (and we have at least one)\n }\n chunkText += nextOutput;\n chunkEnd++;\n }\n\n i = chunkEnd;\n\n const prompt = `Summarize these T3 worker outputs for section \"${assignment.sectionTitle}\" in 2-3 sentences.\n ${currentSummary ? `\\nPREVIOUS SUMMARY SO FAR:\\n${currentSummary}\\n\\nNEW OUTPUTS TO INTEGRATE:\\n` : '\\nOUTPUTS:\\n'}${chunkText}${peerContext}`;\n\n const messages: ConversationMessage[] = [{ role: 'user', content: prompt }];\n try {\n const result = await this.router.generate('T2', {\n messages,\n systemPrompt: this.systemPromptOverride + 'You are a T2 Manager. Summarize the work of your T3 workers succinctly.' + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : ''),\n maxTokens: 500\n });\n currentSummary = result.content;\n } catch (err) {\n this.log(`aggregateResults: LLM summarization failed at chunk — returning raw T3 outputs. Error: ${err instanceof Error ? err.message : String(err)}`);\n return currentSummary + '\\n\\n' + chunkText; // Best effort fallback\n }\n }\n\n return currentSummary;\n }\n private determineStatus(results: T3Result[]): T2Result['status'] {\n if (results.every((r) => r.status === 'COMPLETED')) return 'COMPLETED';\n if (results.some((r) => r.status === 'COMPLETED')) return 'PARTIAL';\n if (results.some((r) => r.status === 'ESCALATED')) return 'ESCALATED';\n return 'FAILED';\n }\n\n /**\n * T2-level permission evaluator.\n * - Safe / non-dangerous tools: auto-approve via rules (no LLM call).\n * - Dangerous tools: ask T2's LLM whether the action fits the section goal.\n * - Returns null if the LLM is uncertain (triggers T1 evaluation).\n */\n private async evaluatePermissionAtT2(req: PermissionRequest): Promise<PermissionDecision | null> {\n // Non-dangerous path: already handled by SAFE_TOOLS set in escalator.\n // This method only receives calls for tools that cleared the safe-list.\n if (!req.isDangerous) {\n return {\n requestId: req.id,\n approved: true,\n always: true,\n decidedBy: 'T2',\n reasoning: 'Non-dangerous tool auto-approved by T2 section policy',\n };\n }\n\n // Dangerous path: LLM inference (max 200 tokens)\n const prompt = `You are a T2 Manager for this section: \"${this.assignment?.sectionTitle ?? req.sectionContext}\".\nSection goal: ${this.assignment?.description ?? req.sectionContext}\n\nA T3 Worker wants to execute:\nTool: ${req.toolName}\nTarget: ${JSON.stringify(req.input)}\nReason: ${req.subtaskContext}\n\nIs this consistent with the section goal and safe to allow?\nReply with exactly one word: YES, NO, or UNSURE.`;\n\n try {\n const result = await this.router.generate('T2', {\n messages: [{ role: 'user', content: prompt }],\n systemPrompt: this.systemPromptOverride + 'You are a T2 Manager evaluating permissions.' + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : ''),\n maxTokens: 10,\n temperature: 0,\n });\n const answer = result.content.trim().toUpperCase();\n if (answer.includes('YES')) {\n return { requestId: req.id, approved: true, always: true, decidedBy: 'T2', reasoning: 'T2 LLM evaluated: consistent with section goal' };\n }\n if (answer.includes('NO')) {\n return { requestId: req.id, approved: false, always: true, decidedBy: 'T2', reasoning: 'T2 LLM evaluated: inconsistent with section goal' };\n }\n // UNSURE → return null to escalate to T1\n return null;\n } catch {\n return null; // On error, escalate rather than block\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Brace-Balanced JSON Extractor\n// ─────────────────────────────────────────────\n\n/**\n * Extract the first top-level JSON object from a string by scanning braces,\n * respecting string literals and escapes. Greedy `/\\{[\\s\\S]*\\}/` regexes\n * over-match when the model wraps JSON in markdown fences with sample braces\n * inside code comments; this walker ignores any brace inside a string and\n * unbalances correctly on the first complete object.\n *\n * Returns the JSON slice including the outer braces, or `null` if no balanced\n * object is found.\n */\nexport function extractFirstJsonObject(input: string): string | null {\n if (!input) return null;\n const start = input.indexOf('{');\n if (start === -1) return null;\n\n let depth = 0;\n let inString = false;\n let escape = false;\n for (let i = start; i < input.length; i++) {\n const ch = input[i];\n if (inString) {\n if (escape) {\n escape = false;\n } else if (ch === '\\\\') {\n escape = true;\n } else if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n if (ch === '\"') {\n inString = true;\n continue;\n }\n if (ch === '{') {\n depth += 1;\n } else if (ch === '}') {\n depth -= 1;\n if (depth === 0) {\n return input.slice(start, i + 1);\n }\n }\n }\n return null;\n}\n\n/**\n * Parse the first balanced JSON object. Returns `null` on any failure so\n * callers can provide their own fallback.\n */\nexport function parseFirstJsonObject<T = unknown>(input: string): T | null {\n const slice = extractFirstJsonObject(input);\n if (!slice) return null;\n try {\n return JSON.parse(slice) as T;\n } catch {\n return null;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — T1 Administrator\n// ─────────────────────────────────────────────\n\nimport { randomUUID } from 'node:crypto';\nimport type {\n CascadeConfig,\n ConversationMessage,\n EscalationPayload,\n ImageAttachment,\n PeerMessageEvent,\n PermissionDecision,\n PermissionRequest,\n T1ToT2Assignment,\n T2Result,\n TaskComplexity,\n} from '../../types.js';\nimport type { CascadeRouter } from '../router/index.js';\nimport type { ToolRegistry } from '../../tools/registry.js';\nimport { BaseTier } from './base.js';\nimport { T2Manager } from './t2-manager.js';\nimport { MemoryStore } from '../../memory/store.js';\nimport { COMPLEXITY_T2_COUNT } from '../../constants.js';\nimport { PeerBus } from '../peer/bus.js';\nimport type { PermissionEscalator } from '../permissions/escalator.js';\nimport type { ToolCreator } from '../../tools/tool-creator.js';\nimport { parseFirstJsonObject } from '../../utils/json-extract.js';\n\nconst T1_SYSTEM_PROMPT = `You are T1, the Administrator in the Cascade AI orchestration system.\n\nYour responsibilities:\n1. Analyze task complexity: Simple | Moderate | Complex | Highly Complex\n2. Decompose the task into logical sections (one per T2 Manager)\n3. For each section, define 2-5 subtasks for T3 Workers\n4. Return a structured plan as JSON\n\nCRITICAL PATH RULE: If the user specifies a target directory (e.g. \"inside python_exclusive\",\n\"in the /output folder\"), every file path in EVERY T3 subtask's description, expectedOutput,\nand constraints MUST include the full relative path.\nExample: \"python_exclusive/script.py\" NOT just \"script.py\".\nThe directory must appear verbatim in every subtask that creates or reads a file.\nNEVER omit the directory prefix when decomposing into subtasks.\n\nRules:\n- Simple → 1 T3, Moderate → 2-3 T2s, Complex → 3-5 T2s, Highly Complex → 5+ T2s\n- Return ONLY valid JSON — no other text\n- If the user asks for a PDF, explicitly use the \"pdf_create\" tool\n- If the user asks for Excel/Zip/complex processing, use \"run_code\" with Python or Node.js\n- Ensure every plan includes explicit creation and verification steps for requested artifacts\n\nDEPENDENCY GUIDANCE:\n- Leave \"dependsOn\" empty [] for sections that are independent (e.g. writing different files, researching different topics).\n- Populate \"dependsOn\" with section IDs ONLY when a later section strictly depends on the output of an earlier one (e.g. write code → then test it).\n- Prefer empty dependencies (parallel execution): it is significantly faster and reduces total wall-clock time.\n- Within a sequential section, mark T3 subtasks with \"dependsOn\" only when they truly block each other.\n\nQUALITY RULES:\n- Each section must have a clear, testable \"expectedOutput\" so T2 knows when it is done.\n- Do NOT create trivial sections that only move files or print summaries — fold those into adjacent sections.\n- If the plan would naturally produce fewer than 2 independent sections, prefer Moderate routing (single T2).`;\n\ninterface TaskPlan {\n complexity: TaskComplexity;\n sections: T1ToT2Assignment[];\n reasoning: string;\n}\n\nexport class T1Administrator extends BaseTier {\n private router: CascadeRouter;\n private toolRegistry: ToolRegistry;\n private config: CascadeConfig;\n private t2Managers: Map<string, T2Manager> = new Map();\n private escalations: EscalationPayload[] = [];\n private store?: MemoryStore;\n private t2PeerBus: PeerBus = new PeerBus();\n private permissionEscalator?: PermissionEscalator;\n private toolCreator?: ToolCreator;\n /** Stored overall task goal — used when evaluating escalated permissions */\n private taskGoal = '';\n private peerMessageCallback?: (event: PeerMessageEvent) => void;\n private peerMessageSessionId = '';\n\n constructor(router: CascadeRouter, toolRegistry: ToolRegistry, config: CascadeConfig) {\n super('T1', 'T1');\n this.router = router;\n this.toolRegistry = toolRegistry;\n this.config = config;\n }\n\n setStore(store: MemoryStore): void {\n this.store = store;\n }\n\n /**\n * Inject the shared PermissionEscalator for this task run.\n * Registers T1's evaluator so it can decide when T2 is uncertain.\n */\n setPermissionEscalator(escalator: PermissionEscalator): void {\n this.permissionEscalator = escalator;\n escalator.setT1Evaluator((req) => this.evaluatePermissionAtT1(req));\n }\n\n setToolCreator(creator: ToolCreator): void {\n this.toolCreator = creator;\n }\n\n setPeerMessageCallback(cb: (event: PeerMessageEvent) => void, sessionId: string): void {\n this.peerMessageCallback = cb;\n this.peerMessageSessionId = sessionId;\n this.t2PeerBus.onPeerMessage = cb;\n this.t2PeerBus.sessionId = sessionId;\n }\n\n async execute(\n userPrompt: string,\n images?: ImageAttachment[],\n systemContext?: string,\n signal?: AbortSignal,\n ): Promise<{\n output: string;\n t2Results: T2Result[];\n taskId: string;\n complexity: TaskComplexity;\n }> {\n this.signal = signal;\n this.taskId = randomUUID();\n this.setLabel('Administrator');\n this.setStatus('ACTIVE');\n this.taskGoal = userPrompt; // store for permission evaluation later\n\n this.sendStatusUpdate({\n progressPct: 0,\n currentAction: 'Analyzing task and planning execution',\n status: 'IN_PROGRESS',\n });\n\n this.log(`T1 received task: ${userPrompt.slice(0, 100)}...`);\n\n // ── Cancellation checkpoint: before image analysis ──\n this.throwIfCancelled();\n\n // Step 1: Analyze images if present (T1 processes top-level images)\n let enrichedPrompt = userPrompt;\n if (images?.length) {\n enrichedPrompt = await this.analyzeImages(userPrompt, images);\n }\n\n // ── Cancellation checkpoint: after image analysis, before planning ──\n this.throwIfCancelled();\n\n // Step 2: Decompose task into sections\n const plan = await this.decomposeTask(enrichedPrompt, systemContext);\n\n this.sendStatusUpdate({\n progressPct: 10,\n currentAction: `Plan ready: ${plan.complexity} → ${plan.sections.length} sections`,\n status: 'IN_PROGRESS',\n });\n\n this.emit('plan', { taskId: this.taskId, plan });\n\n // ── Cancellation checkpoint: after planning, before T2 dispatch ──\n this.throwIfCancelled();\n\n // Step 3: Dispatch T2 managers in parallel\n let allT2Results = await this.dispatchT2Managers(plan.sections);\n\n // Step 4: T1 Reviewer Phase\n let pass = 1;\n const MAX_REPLAN_PASSES = 2;\n while (pass <= MAX_REPLAN_PASSES) {\n const reviewResult = await this.reviewT2Outputs(enrichedPrompt, plan, allT2Results);\n if (reviewResult.approved) {\n this.log('T1 Review passed.');\n break;\n }\n\n this.log(`T1 Review rejected outputs. Replanning (Pass ${pass}). Reason: ${reviewResult.reason}`);\n this.sendStatusUpdate({\n progressPct: 80 + (pass * 5),\n currentAction: `Review failed: ${reviewResult.reason}. Replanning...`,\n status: 'IN_PROGRESS',\n });\n\n const correctionPlan = await this.decomposeTask(`The previous execution plan failed to fully satisfy the original goal or encountered errors.\nReview reason: ${reviewResult.reason}\n\nOriginal goal: ${enrichedPrompt}\n\nCreate a CORRECTION PLAN that contains only the new sections needed to fix the issues. Do not repeat successful sections.`);\n \n const correctionResults = await this.dispatchT2Managers(correctionPlan.sections);\n allT2Results = [...allT2Results, ...correctionResults];\n pass++;\n }\n\n this.sendStatusUpdate({\n progressPct: 95,\n currentAction: 'Compiling final output',\n status: 'IN_PROGRESS',\n });\n\n // Step 5: Compile final output\n const output = await this.compileFinalOutput(userPrompt, plan, allT2Results);\n\n this.setStatus('COMPLETED', output);\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Task complete', status: 'IN_PROGRESS', output });\n\n return { output, t2Results: allT2Results, taskId: this.taskId, complexity: plan.complexity };\n }\n\n getEscalations(): EscalationPayload[] {\n return [...this.escalations];\n }\n\n // ── Private ──────────────────────────────────\n\n private async reviewT2Outputs(\n originalPrompt: string,\n plan: TaskPlan,\n t2Results: T2Result[],\n ): Promise<{ approved: boolean; reason?: string }> {\n const failedSections = t2Results.filter(r => r.status === 'FAILED');\n if (failedSections.length > 0) {\n return { \n approved: false, \n reason: `Some T2 managers failed entirely: ${failedSections.map(s => s.sectionTitle).join(', ')}. Errors: ${failedSections.flatMap(s => s.issues).join('; ')}`\n };\n }\n\n const sectionsText = t2Results\n .map((r) => `**${r.sectionTitle}**\\n${r.sectionSummary}`)\n .join('\\n\\n');\n\n const prompt = `You are a strict QA Reviewer for the Cascade AI system.\nReview the following execution outputs against the original user prompt.\n\nOriginal Request: ${originalPrompt}\n\nT2 Manager Summaries:\n${sectionsText}\n\nDoes the current state of the workspace and the outputs fully satisfy the user's request?\nIf yes, reply with exactly: \"APPROVED\".\nIf no, reply with \"REJECTED: [Detailed reason explaining exactly what is missing or incorrect]\".`;\n\n try {\n const result = await this.router.generate('T1', {\n messages: [{ role: 'user', content: prompt }],\n systemPrompt: this.systemPromptOverride + 'You are a QA Reviewer.',\n maxTokens: 500,\n temperature: 0,\n });\n const response = result.content.trim();\n if (response.toUpperCase().startsWith('APPROVED')) {\n return { approved: true };\n }\n return { approved: false, reason: response.replace(/^REJECTED:\\s*/i, '') };\n } catch {\n // If review fails to generate, default to approve to avoid infinite loops on rate limits\n return { approved: true };\n }\n }\n\n private async analyzeImages(prompt: string, images: ImageAttachment[]): Promise<string> {\n const visionModel = this.router.getModelForTier('T1');\n if (!visionModel?.isVisionCapable) return prompt;\n\n const messages: ConversationMessage[] = [{\n role: 'user',\n content: [\n { type: 'text', text: `Describe these images and how they relate to the task: \"${prompt}\"` },\n ...images.map((img) => ({ type: 'image' as const, image: img })),\n ],\n }];\n\n const result = await this.router.generate('T1', { messages, maxTokens: 1000 }, undefined, true);\n return `${prompt}\\n\\n[Image context: ${result.content}]`;\n }\n\n private async decomposeTask(prompt: string, systemContext?: string): Promise<TaskPlan> {\n const contextSection = systemContext ? `\\nProject context:\\n${systemContext}` : '';\n const decompositionPrompt = `Analyze this task and create an execution plan.${contextSection}\n\n Task: ${prompt}\n\n IMPORTANT: If the task specifies a directory (e.g. \"inside X\", \"in X folder\"), \n ALL file paths in ALL subtasks must include that full directory prefix.\n Example: if asked to create files \"inside python_exclusive\", every subtask that \n creates a file must use \"python_exclusive/filename.ext\" as the path.\n\nReturn JSON where SECTIONS can declare dependencies on other SECTIONS:\n{\n \"sections\": [{\n \"sectionId\": \"s1\",\n \"sectionTitle\": \"Setup Project\",\n \"description\": \"Initialize the project\",\n \"expectedOutput\": \"Basic structure created\",\n \"constraints\": [],\n \"dependsOn\": [], // ← empty = runs immediately\n \"t3Subtasks\": [{\n \"subtaskId\": \"t1\",\n \"subtaskTitle\": \"Init NPM\",\n \"description\": \"Run npm init\",\n \"expectedOutput\": \"package.json created\",\n \"constraints\": [],\n \"dependsOn\": []\n }]\n }, {\n \"sectionId\": \"s2\", \n \"sectionTitle\": \"Write Tests\",\n \"description\": \"Write tests for the project\",\n \"expectedOutput\": \"Tests passing\",\n \"constraints\": [],\n \"dependsOn\": [\"s1\"], // ← waits for section s1 to complete first\n \"t3Subtasks\": [...]\n }]\n}\nUse dependsOn at the SECTION level when a whole T2 Manager needs the output of a previous T2 Manager.\nLeave dependsOn empty for sections that can run immediately in parallel.`;\n\n const messages: ConversationMessage[] = [{ role: 'user', content: decompositionPrompt }];\n const result = await this.router.generate('T1', {\n messages,\n systemPrompt: this.systemPromptOverride + T1_SYSTEM_PROMPT,\n maxTokens: 4000,\n });\n\n try {\n const parsed = parseFirstJsonObject<TaskPlan>(result.content);\n if (!parsed) throw new Error('No JSON in T1 response');\n this.validatePlan(parsed);\n return parsed;\n } catch {\n // Fallback: single section, single T3\n return {\n complexity: 'Simple',\n reasoning: 'Fallback single-section plan',\n sections: [{\n sectionId: 's1',\n sectionTitle: 'Main Task',\n description: prompt,\n expectedOutput: 'Complete response to the task',\n constraints: [],\n t3Subtasks: [{\n subtaskId: 't1',\n subtaskTitle: 'Execute Task',\n description: prompt,\n expectedOutput: 'Complete response',\n constraints: [],\n peerT3Ids: [],\n executionMode: 'parallel',\n }],\n executionMode: 'parallel',\n peerT2Ids: [],\n }],\n };\n }\n }\n\n private validatePlan(plan: TaskPlan): void {\n if (!plan.sections || !Array.isArray(plan.sections) || plan.sections.length === 0) {\n throw new Error('Invalid plan: no sections');\n }\n const [min, max] = COMPLEXITY_T2_COUNT[plan.complexity] ?? [1, 8];\n if (plan.sections.length < min) {\n // Auto-expand by duplicating if needed (rare edge case)\n }\n }\n\n private async dispatchT2Managers(sections: T1ToT2Assignment[]): Promise<T2Result[]> {\n // Wire peer sync IDs\n for (const section of sections) {\n section.peerT2Ids = sections\n .filter((x) => x.sectionId !== section.sectionId)\n .map((x) => x.sectionId);\n }\n\n // Track (emitter, event, handler) tuples so we can detach all listeners\n // when dispatch finishes. Without this, bubble handlers and peer-sync\n // routers leak for the lifetime of the process in long-lived REPLs.\n const registered: Array<[T2Manager, string, (...args: unknown[]) => void]> = [];\n const bind = <T>(m: T2Manager, event: string, fn: (arg: T) => void) => {\n const handler = (arg: T) => fn(arg);\n m.on(event, handler as (...args: unknown[]) => void);\n registered.push([m, event, handler as (...args: unknown[]) => void]);\n };\n\n const managers: T2Manager[] = sections.map((section) => {\n const manager = new T2Manager(this.router, this.toolRegistry, this.id);\n manager.setHierarchyContext(`You are a T2 Manager for the section \"${section.sectionTitle}\". You are part of a COMPLEX task overseen by T1 Administrator.`);\n if (this.store) {\n manager.setStore(this.store);\n }\n manager.setPeerBus(this.t2PeerBus);\n\n if (this.peerMessageCallback) {\n manager.setPeerMessageCallback(this.peerMessageCallback, this.peerMessageSessionId);\n }\n\n if (this.permissionEscalator) {\n manager.setPermissionEscalator(this.permissionEscalator);\n }\n\n if (this.toolCreator) {\n manager.setToolCreator(this.toolCreator);\n }\n\n this.t2Managers.set(section.sectionId, manager);\n\n bind(manager, 'stream:token', (e) => this.emit('stream:token', e));\n bind(manager, 'log', (e) => this.emit('log', e));\n bind(manager, 'tier:status', (e) => this.emit('tier:status', e));\n bind(manager, 'tool:call', (e) => this.emit('tool:call', e));\n bind(manager, 'tool:result', (e) => this.emit('tool:result', e));\n bind(manager, 'tool:approval-request', (e) => this.emit('tool:approval-request', e));\n\n bind(manager, 'message', (msg: { type: string; from: string; payload: Record<string, unknown> }) => {\n if (msg.type === 'PEER_SYNC') {\n const recipientId = msg.payload.recipientT3Id as string;\n const target = this.t2Managers.get(recipientId);\n if (target) target.receivePeerSync(msg.from, msg.payload.content as string);\n }\n });\n\n return manager;\n });\n\n const cleanup = () => {\n for (const [m, event, handler] of registered) {\n m.off(event, handler);\n }\n registered.length = 0;\n };\n\n // ── Phase 1: T2 Peer Discussion — Proactive Announcement ──────────────\n // Each T2 broadcasts its section plan. T1 collects for 500ms and uses\n // the results to detect overlapping work and inject sibling context.\n this.t2PeerBus.clearBroadcastLog();\n managers.forEach((m, i) => m.announcePlan(sections[i]!));\n const announcements = await this.t2PeerBus.collect(500);\n\n // Build sibling context map: section → keywords from all other sections\n const siblingKeywords = new Map<string, string[]>();\n for (const ann of announcements) {\n const payload = ann.payload as { type: string; sectionId: string; sectionTitle: string; keywords: string[] };\n if (payload?.type !== 'T2_PLAN_ANNOUNCEMENT') continue;\n for (const other of announcements) {\n const otherPayload = other.payload as typeof payload;\n if (otherPayload?.type !== 'T2_PLAN_ANNOUNCEMENT' || otherPayload.sectionId === payload.sectionId) continue;\n const existing = siblingKeywords.get(payload.sectionId) ?? [];\n existing.push(...(otherPayload.keywords ?? []));\n siblingKeywords.set(payload.sectionId, [...new Set(existing)]);\n }\n }\n\n // Detect shared keywords → mark overlapping sections as sequential\n const overlapSections = new Set<string>();\n for (let i = 0; i < announcements.length; i++) {\n for (let j = i + 1; j < announcements.length; j++) {\n const a = announcements[i]!.payload as { keywords?: string[]; sectionId?: string };\n const b = announcements[j]!.payload as { keywords?: string[]; sectionId?: string };\n if (!a.keywords || !b.keywords || !a.sectionId || !b.sectionId) continue;\n const shared = a.keywords.filter(k => b.keywords!.includes(k));\n if (shared.length > 0) {\n overlapSections.add(a.sectionId);\n overlapSections.add(b.sectionId);\n this.log(`T2 overlap detected between sections: ${a.sectionId} ↔ ${b.sectionId} (shared: ${shared.join(', ')})`);\n }\n }\n }\n\n // Inject sibling context into each T2 manager\n managers.forEach((m, i) => {\n const section = sections[i]!;\n const myKeywords = siblingKeywords.get(section.sectionId) ?? [];\n const otherTitles = sections.filter(s => s.sectionId !== section.sectionId).map(s => s.sectionTitle);\n const context = [\n `You are T2 Manager for section: \"${section.sectionTitle}\".`,\n `Sibling sections being worked on in parallel: ${otherTitles.join(', ') || 'none'}.`,\n myKeywords.length > 0 ? `Watch for overlap with: ${[...new Set(myKeywords)].slice(0, 10).join(', ')}.` : '',\n overlapSections.has(section.sectionId) ? 'NOTE: Potential overlap detected with a sibling section — be careful not to duplicate work.' : '',\n ].filter(Boolean).join(' ');\n m.setHierarchyContext(context);\n });\n\n // If overlaps detected globally, add sequential dependencies for safety\n if (overlapSections.size > 0) {\n this.log('Overlap detected — adding sequential dependencies for conflicting sections to prevent race conditions');\n const overlapArray = Array.from(overlapSections);\n for (let i = 1; i < overlapArray.length; i++) {\n const section = sections.find(s => s.sectionId === overlapArray[i]);\n if (section) {\n section.dependsOn = [...(section.dependsOn || []), overlapArray[i - 1]!];\n }\n }\n }\n\n const t2Results: T2Result[] = [];\n\n try {\n t2Results.push(...await this.runT2sWithDependencies(sections, managers, this.taskId));\n } finally {\n cleanup();\n }\n\n return t2Results;\n }\n\n /**\n * Runs T2 managers respecting dependsOn declarations using Kahn's algorithm.\n */\n private async runT2sWithDependencies(\n sections: T1ToT2Assignment[],\n managers: T2Manager[],\n taskId: string,\n ): Promise<T2Result[]> {\n const adj = new Map<string, Set<string>>();\n const inDegree = new Map<string, number>();\n const resultMap = new Map<string, T2Result>();\n const allKeys = new Set(sections.map(s => s.sectionId));\n\n for (const s of sections) {\n if (!adj.has(s.sectionId)) adj.set(s.sectionId, new Set());\n inDegree.set(s.sectionId, 0);\n // Sanitize dependencies\n s.dependsOn = (s.dependsOn ?? []).filter(d => allKeys.has(d));\n }\n\n for (const s of sections) {\n for (const dep of (s.dependsOn ?? [])) {\n adj.get(dep)!.add(s.sectionId);\n inDegree.set(s.sectionId, (inDegree.get(s.sectionId) ?? 0) + 1);\n }\n }\n\n // Break cycles\n const queue: string[] = [];\n const degree = new Map(inDegree);\n for (const [id, deg] of degree.entries()) if (deg === 0) queue.push(id);\n const visited = new Set<string>();\n while (queue.length > 0) {\n const u = queue.shift()!;\n visited.add(u);\n for (const v of adj.get(u) ?? new Set()) {\n const newDeg = (degree.get(v) ?? 1) - 1;\n degree.set(v, newDeg);\n if (newDeg === 0) queue.push(v);\n }\n }\n const cycleNodes = [...inDegree.keys()].filter(id => !visited.has(id));\n if (cycleNodes.length > 0) {\n this.log(`⚠ Circular dependency detected among sections: [${cycleNodes.join(', ')}]. Breaking cycles.`);\n for (const s of sections) {\n if (cycleNodes.includes(s.sectionId)) {\n const safeDeps = (s.dependsOn ?? []).filter(d => !cycleNodes.includes(d));\n for (const removed of (s.dependsOn ?? []).filter(d => cycleNodes.includes(d))) {\n inDegree.set(s.sectionId, Math.max(0, (inDegree.get(s.sectionId) ?? 1) - 1));\n adj.get(removed)?.delete(s.sectionId);\n }\n s.dependsOn = safeDeps;\n }\n }\n }\n\n // Wave-based execution\n const totalSections = sections.length;\n let completedSections = 0;\n const executeWave = async () => {\n const readyIds: string[] = [];\n for (const [id, deg] of inDegree.entries()) {\n if (deg === 0 && !resultMap.has(id)) {\n readyIds.push(id);\n }\n }\n if (readyIds.length === 0) return;\n\n await Promise.all(readyIds.map(async (id) => {\n // Mark as started (prevent picking it up in next wave before it finishes)\n resultMap.set(id, null as any);\n\n const index = sections.findIndex(s => s.sectionId === id);\n const section = sections[index]!;\n const manager = managers[index]!;\n\n const progressPct = 10 + Math.floor((completedSections / totalSections) * 85);\n this.sendStatusUpdate({\n progressPct,\n currentAction: `T2 working on: ${section.sectionTitle}`,\n status: 'IN_PROGRESS',\n });\n\n this.throwIfCancelled();\n\n let result: T2Result;\n try {\n result = await manager.execute(section, taskId, this.signal);\n manager.shareCompletedOutput(section.sectionId, result.sectionSummary);\n if (result.status === 'ESCALATED') {\n this.escalations.push({\n raisedBy: `T2_${section.sectionId}`,\n sectionId: section.sectionId,\n attempted: result.issues,\n blocker: result.issues.join('; '),\n needs: 'Human review required',\n });\n }\n } catch (err) {\n result = {\n sectionId: section.sectionId,\n sectionTitle: section.sectionTitle,\n status: 'FAILED',\n t3Results: [],\n sectionSummary: '',\n issues: [err instanceof Error ? err.message : String(err)],\n };\n }\n\n resultMap.set(id, result);\n completedSections++;\n\n for (const dependentId of adj.get(id) ?? new Set()) {\n inDegree.set(dependentId, Math.max(0, (inDegree.get(dependentId) ?? 1) - 1));\n }\n }));\n\n // Check if more are ready after this wave\n if (Array.from(inDegree.values()).some(deg => deg === 0) && resultMap.size < totalSections) {\n await executeWave();\n }\n };\n\n await executeWave();\n\n return sections.map(s => resultMap.get(s.sectionId)!).filter(Boolean);\n }\n\n private async compileFinalOutput(\n originalPrompt: string,\n plan: TaskPlan,\n t2Results: T2Result[],\n ): Promise<string> {\n const completedSections = t2Results.filter((r) => r.status !== 'FAILED');\n\n if (!completedSections.length) {\n return 'Task failed — all sections encountered errors. Please check the escalation log.';\n }\n\n const sectionsText = completedSections\n .map((r) => `**${r.sectionTitle}**\\n${r.sectionSummary}\\n\\nOutputs:\\n${r.t3Results\n .filter((t) => t.status === 'COMPLETED')\n .map((t) => `• ${typeof t.output === 'string' ? t.output : JSON.stringify(t.output)}`)\n .join('\\n')\n }`)\n .join('\\n\\n---\\n\\n');\n\n const openIssues = t2Results.flatMap((r) => r.issues).filter(Boolean);\n const failedSections = t2Results.filter((r) => r.status === 'FAILED' || r.status === 'PARTIAL');\n\n const compilePrompt = `Compile a final, coherent response to the user's original request.\n\nOriginal request: ${originalPrompt}\n\nSection results:\n${sectionsText}\n\n${openIssues.length ? `Open issues:\\n${openIssues.map((i) => `- ${i}`).join('\\n')}` : ''}\n\nInstructions:\n- Write the complete final output in natural language\n- Integrate all section outputs coherently\n- Note any partial failures clearly\n- Do NOT expose JSON or tier internals`;\n\n const messages: ConversationMessage[] = [{ role: 'user', content: compilePrompt }];\n const result = await this.router.generate('T1', {\n messages,\n systemPrompt: this.systemPromptOverride + 'You are a final output compiler. Summarize and format the task results clearly.',\n maxTokens: 8000\n }, (chunk) => {\n this.emit('stream:token', { tierId: this.id, text: chunk.text });\n });\n\n return result.content;\n }\n\n /**\n * T1-level permission evaluator.\n * Uses T1's model with full task context.\n * Returns null only when the model explicitly says UNSURE (triggers user prompt).\n */\n private async evaluatePermissionAtT1(req: PermissionRequest): Promise<PermissionDecision | null> {\n const prompt = `You are T1 Administrator. Overall task goal:\n${this.taskGoal}\n\nA T3 Worker (inside section \"${req.sectionContext}\") wants to:\nTool: ${req.toolName}\nTarget: ${JSON.stringify(req.input)}\nReason: ${req.subtaskContext}\n\nT2 Manager was uncertain about this. Given the overall task goal, should this be allowed?\nReply with exactly one word: YES, NO, or UNSURE.\n(UNSURE = escalate to the human user for a final decision.)`;\n\n try {\n const result = await this.router.generate('T1', {\n messages: [{ role: 'user', content: prompt }],\n systemPrompt: this.systemPromptOverride + 'You are a T1 Administrator evaluating permissions.',\n maxTokens: 10,\n temperature: 0,\n });\n const answer = result.content.trim().toUpperCase();\n if (answer.includes('YES')) {\n return { requestId: req.id, approved: true, always: true, decidedBy: 'T1', reasoning: 'T1 evaluated: consistent with overall task goal' };\n }\n if (answer.includes('NO')) {\n return { requestId: req.id, approved: false, always: true, decidedBy: 'T1', reasoning: 'T1 evaluated: not consistent with overall task goal' };\n }\n return null; // UNSURE → escalate to user\n } catch {\n return null; // On error, escalate to user\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Abstract Tool Base\n// ─────────────────────────────────────────────\n\nimport type { ToolDefinition, ToolExecuteOptions } from '../types.js';\n\nexport abstract class BaseTool {\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly inputSchema: Record<string, unknown>;\n protected workspaceRoot: string = process.cwd();\n\n setWorkspaceRoot(root: string): void {\n this.workspaceRoot = root;\n }\n\n abstract execute(\n input: Record<string, unknown>,\n options: ToolExecuteOptions,\n ): Promise<string>;\n\n isDangerous(): boolean {\n return false;\n }\n\n getDefinition(): ToolDefinition {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n };\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Shell Tool\n// ─────────────────────────────────────────────\n\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nconst execAsync = promisify(exec);\n\nexport class ShellTool extends BaseTool {\n readonly name = 'shell';\n readonly description = 'Execute a shell command and return its output. Use for running scripts, compiling code, running tests, etc.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'The shell command to execute' },\n cwd: { type: 'string', description: 'Working directory (optional)' },\n timeout: { type: 'number', description: 'Timeout in milliseconds (default: 30000)' },\n },\n required: ['command'],\n };\n\n private allowlist: string[];\n private blocklist: string[];\n\n constructor(allowlist: string[] = [], blocklist: string[] = []) {\n super();\n this.allowlist = allowlist;\n this.blocklist = blocklist;\n }\n\n isDangerous(): boolean {\n return true;\n }\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const command = input['command'] as string;\n const cwd = (input['cwd'] as string | undefined) ?? this.workspaceRoot;\n const timeout = (input['timeout'] as number | undefined) ?? 30_000;\n\n this.validateCommand(command);\n\n try {\n const { stdout, stderr } = await execAsync(command, { cwd, timeout });\n const out = [stdout, stderr].filter(Boolean).join('\\n').trim();\n return out || '(no output)';\n } catch (err) {\n if (err instanceof Error && 'stdout' in err && 'stderr' in err) {\n const e = err as Error & { stdout: string; stderr: string; code: number };\n return `Exit ${e.code ?? 1}:\\n${[e.stdout, e.stderr].filter(Boolean).join('\\n').trim()}`;\n }\n throw err;\n }\n }\n\n private validateCommand(command: string): void {\n // Block dangerous patterns\n const builtinDangerous = [\n /rm\\s+-rf\\s+\\//,\n />\\s*\\/dev\\/sda/,\n /mkfs\\./,\n /dd\\s+if=.*of=\\/dev\\//,\n /chmod\\s+777\\s+\\//,\n ];\n\n for (const pattern of builtinDangerous) {\n if (pattern.test(command)) {\n throw new Error(`Command blocked: matches dangerous pattern`);\n }\n }\n\n // User blocklist (substring match)\n for (const blocked of this.blocklist) {\n if (command.toLowerCase().includes(blocked.toLowerCase())) {\n throw new Error(`Command blocked by blocklist: \"${blocked}\"`);\n }\n }\n\n // User allowlist (if set, the FIRST token of the command must be an exact\n // match for an entry, and the command must contain no shell metacharacters).\n //\n // Previously this used `command.startsWith(a)`, which let `npm-foo` through\n // when `npm` was whitelisted. Token-level comparison closes that hole.\n if (this.allowlist.length > 0) {\n const firstToken = command.trimStart().split(/\\s+/)[0] ?? '';\n const allowed = this.allowlist.some((a) => firstToken === a);\n if (!allowed) {\n throw new Error(\n `Command not in allowlist. First token \"${firstToken}\" must exactly ` +\n `match one of: ${this.allowlist.join(', ')}`,\n );\n }\n\n // Chaining metacharacters defeat the allowlist — block them when allowlist is active.\n const SHELL_METACHAR = /[;|`]|\\$\\(|&&|\\|\\|/;\n if (SHELL_METACHAR.test(command)) {\n throw new Error(\n `Command blocked: shell metacharacters (;, |, &&, ||, \\`, $(...)) are not permitted ` +\n `when an allowlist is active because they allow chaining of arbitrary commands.`,\n );\n }\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Workspace Path Sandbox Helper\n// ─────────────────────────────────────────────\n\nimport path from 'node:path';\nimport fs from 'node:fs';\n\nexport class WorkspaceSandboxError extends Error {\n constructor(attempted: string, workspaceRoot: string) {\n super(`Refusing access to \"${attempted}\" — outside workspace root \"${workspaceRoot}\".`);\n this.name = 'WorkspaceSandboxError';\n }\n}\n\n/**\n * Resolve a user-supplied path and guarantee it stays inside the workspace.\n *\n * Fails closed on any escape attempt (e.g. \"..\", absolute paths pointing\n * outside the workspace, or symlink-style traversal from the caller).\n *\n * Call this in every file-touching tool BEFORE any fs operation.\n */\nexport function resolveInWorkspace(workspaceRoot: string, input: string): string {\n if (typeof input !== 'string' || input.length === 0) {\n throw new WorkspaceSandboxError(String(input), workspaceRoot);\n }\n\n const root = path.resolve(workspaceRoot);\n const abs = path.isAbsolute(input) ? path.resolve(input) : path.resolve(root, input);\n const rel = path.relative(root, abs);\n\n if (rel === '' || rel === '.') {\n // still verify symlink target for the root itself\n } else if (rel.startsWith('..') || path.isAbsolute(rel)) {\n throw new WorkspaceSandboxError(input, root);\n }\n\n // Dereference symlinks so a link inside the workspace pointing outside is caught.\n try {\n const real = fs.realpathSync(abs);\n const realRel = path.relative(root, real);\n if (realRel !== '' && realRel !== '.' && (realRel.startsWith('..') || path.isAbsolute(realRel))) {\n throw new WorkspaceSandboxError(input, root);\n }\n } catch (e) {\n if (e instanceof WorkspaceSandboxError) throw e;\n // Path doesn't exist yet (new file being created) — symlink check not applicable.\n }\n\n return abs;\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — File Tools\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\nimport { resolveInWorkspace } from './utils/workspace-path.js';\n\n// ── File Read ─────────────────────────────────\n\nexport class FileReadTool extends BaseTool {\n readonly name = 'file_read';\n readonly description = 'Read the contents of a file. Returns the file content as a string.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to the file (relative to workspace root)' },\n offset: { type: 'number', description: 'Line number to start reading from (1-indexed)' },\n limit: { type: 'number', description: 'Maximum number of lines to read' },\n },\n required: ['path'],\n };\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const filePath = input['path'] as string;\n const absPath = resolveInWorkspace(this.workspaceRoot, filePath);\n const offset = (input['offset'] as number | undefined) ?? 1;\n const limit = input['limit'] as number | undefined;\n\n const content = await fs.readFile(absPath, 'utf-8');\n const lines = content.split('\\n');\n const start = Math.max(0, offset - 1);\n const end = limit ? start + limit : lines.length;\n const sliced = lines.slice(start, end);\n\n const numbered = sliced.map((line, i) => `${start + i + 1}\\t${line}`).join('\\n');\n return numbered;\n }\n}\n\n// ── File Write ────────────────────────────────\n\nexport class FileWriteTool extends BaseTool {\n readonly name = 'file_write';\n readonly description = 'Write content to a file. Creates the file and parent directories if they do not exist. OVERWRITES existing content.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to write to (relative to workspace root)' },\n content: { type: 'string', description: 'Content to write' },\n },\n required: ['path', 'content'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const filePath = input['path'] as string;\n const absPath = resolveInWorkspace(this.workspaceRoot, filePath);\n const content = input['content'] as string;\n\n if (options.saveSnapshot) {\n try {\n const oldContent = await fs.readFile(absPath, 'utf-8');\n await options.saveSnapshot(absPath, oldContent);\n } catch {\n // File doesn't exist, nothing to snapshot for rollback (delete on rollback)\n }\n }\n\n await fs.mkdir(path.dirname(absPath), { recursive: true });\n await fs.writeFile(absPath, content, 'utf-8');\n return `Written ${content.length} characters to ${filePath}`;\n }\n}\n\n// ── File Edit ─────────────────────────────────\n\nexport class FileEditTool extends BaseTool {\n readonly name = 'file_edit';\n readonly description = 'Replace a specific string in a file with a new string. The old_string must match exactly.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to the file to edit (relative to workspace root)' },\n old_string: { type: 'string', description: 'The exact string to find and replace' },\n new_string: { type: 'string', description: 'The replacement string' },\n replace_all: { type: 'boolean', description: 'Replace all occurrences (default: false)' },\n },\n required: ['path', 'old_string', 'new_string'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const filePath = input['path'] as string;\n const absPath = resolveInWorkspace(this.workspaceRoot, filePath);\n const oldString = input['old_string'] as string;\n const newString = input['new_string'] as string;\n const replaceAll = (input['replace_all'] as boolean | undefined) ?? false;\n\n const rawContent = await fs.readFile(absPath, 'utf-8');\n\n if (options.saveSnapshot) {\n await options.saveSnapshot(absPath, rawContent);\n }\n\n // Normalize CRLF → LF so edits work on Windows-formatted files transparently.\n const content = rawContent.replace(/\\r\\n/g, '\\n');\n const normalizedOld = oldString.replace(/\\r\\n/g, '\\n');\n\n if (!content.includes(normalizedOld)) {\n throw new Error(\n `old_string not found in ${filePath}. Make sure to match exactly (line endings are normalized to LF).`,\n );\n }\n\n const updated = replaceAll\n ? content.split(normalizedOld).join(newString)\n : content.replace(normalizedOld, newString);\n\n await fs.writeFile(absPath, updated, 'utf-8');\n const count = replaceAll ? (content.split(normalizedOld).length - 1) : 1;\n return `Replaced ${count} occurrence(s) in ${filePath}`;\n }\n}\n\n// ── File Delete ───────────────────────────────\n\nexport class FileDeleteTool extends BaseTool {\n readonly name = 'file_delete';\n readonly description = 'Delete a file or empty directory.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to delete (relative to workspace root)' },\n },\n required: ['path'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const filePath = input['path'] as string;\n const absPath = resolveInWorkspace(this.workspaceRoot, filePath);\n\n if (options.saveSnapshot) {\n try {\n const oldContent = await fs.readFile(absPath, 'utf-8');\n await options.saveSnapshot(absPath, oldContent);\n } catch {\n // Already gone or dir\n }\n }\n\n await fs.rm(absPath, { recursive: false });\n return `Deleted ${filePath}`;\n }\n}\n\n// ── File List ─────────────────────────────────\n\nexport class FileListTool extends BaseTool {\n readonly name = 'file_list';\n readonly description = 'List files and directories in a given path. Returns a list of filenames.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to list (relative to workspace root)' },\n },\n required: ['path'],\n };\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const inputPath = (input['path'] as string) || '.';\n const absPath = resolveInWorkspace(this.workspaceRoot, inputPath);\n\n const entries = await fs.readdir(absPath, { withFileTypes: true });\n return entries.map(e => `${e.isDirectory() ? '[DIR] ' : ' '}${e.name}`).join('\\n') || '(empty directory)';\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Git Tool\n// ─────────────────────────────────────────────\n\nimport { simpleGit, type SimpleGit } from 'simple-git';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nexport class GitTool extends BaseTool {\n readonly name = 'git';\n readonly description = 'Execute git operations: status, diff, log, add, commit, branch, push, pull.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n operation: {\n type: 'string',\n enum: ['status', 'diff', 'log', 'add', 'commit', 'branch', 'checkout', 'push', 'pull', 'stash'],\n description: 'Git operation to perform',\n },\n args: {\n type: 'array',\n items: { type: 'string' },\n description: 'Arguments for the git operation',\n },\n cwd: { type: 'string', description: 'Working directory (defaults to current)' },\n },\n required: ['operation'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const operation = input['operation'] as string;\n const args = (input['args'] as string[] | undefined) ?? [];\n const cwd = (input['cwd'] as string | undefined) ?? this.workspaceRoot;\n\n const git: SimpleGit = simpleGit(cwd);\n\n try {\n switch (operation) {\n case 'status': {\n const status = await git.status();\n return this.formatStatus(status);\n }\n case 'diff': {\n const diff = await git.diff(args);\n return diff || '(no changes)';\n }\n case 'log': {\n const log = await git.log(args.length ? { maxCount: parseInt(args[0] ?? '10', 10) } : { maxCount: 10 });\n return log.all.map((c) => `${c.hash.slice(0, 8)} ${c.date.slice(0, 10)} ${c.message}`).join('\\n');\n }\n case 'add': {\n await git.add(args.length ? args : ['.']);\n return 'Staged files';\n }\n case 'commit': {\n const msg = args[0] ?? 'Cascade AI commit';\n const result = await git.commit(msg);\n return `Committed: ${result.commit}`;\n }\n case 'branch': {\n const branches = await git.branch(args);\n return branches.all.join('\\n');\n }\n case 'checkout': {\n await git.checkout(args);\n return `Checked out ${args.join(' ')}`;\n }\n case 'push': {\n await git.push(args);\n return 'Pushed';\n }\n case 'pull': {\n const result = await git.pull();\n return `Pulled: ${result.summary.changes} changes`;\n }\n case 'stash': {\n await git.stash(args);\n return 'Stashed';\n }\n default:\n throw new Error(`Unknown git operation: ${operation}`);\n }\n } catch (err) {\n throw new Error(`git ${operation} failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n private formatStatus(status: Awaited<ReturnType<SimpleGit['status']>>): string {\n const lines: string[] = [];\n if (status.current) lines.push(`Branch: ${status.current}`);\n if (status.staged.length) lines.push(`Staged: ${status.staged.join(', ')}`);\n if (status.modified.length) lines.push(`Modified: ${status.modified.join(', ')}`);\n if (status.not_added.length) lines.push(`Untracked: ${status.not_added.join(', ')}`);\n if (status.deleted.length) lines.push(`Deleted: ${status.deleted.join(', ')}`);\n if (status.conflicted.length) lines.push(`Conflicts: ${status.conflicted.join(', ')}`);\n return lines.join('\\n') || 'Working tree clean';\n }\n}\n\n// ── Git Context Helper (injected into T1 system prompt) ──\n\nexport async function getGitContext(cwd: string): Promise<string> {\n try {\n const git = simpleGit(cwd);\n const [status, log] = await Promise.all([\n git.status(),\n git.log({ maxCount: 5 }),\n ]);\n\n const statusLines: string[] = [];\n if (status.current) statusLines.push(`Branch: ${status.current}`);\n if (status.staged.length) statusLines.push(`Staged: ${status.staged.join(', ')}`);\n if (status.modified.length) statusLines.push(`Modified: ${status.modified.join(', ')}`);\n if (status.not_added.length) statusLines.push(`Untracked: ${status.not_added.join(', ')}`);\n\n const recentCommits = log.all\n .map((c) => ` ${c.hash.slice(0, 8)} ${c.message}`)\n .join('\\n');\n\n return `Git status:\\n${statusLines.join('\\n')}\\n\\nRecent commits:\\n${recentCommits}`;\n } catch {\n return '';\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — GitHub / GitLab Tool\n// ─────────────────────────────────────────────\n\nimport axios from 'axios';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nexport class GitHubTool extends BaseTool {\n readonly name = 'github';\n readonly description = 'Interact with GitHub or GitLab: create PRs, list issues, comment on issues.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n platform: { type: 'string', enum: ['github', 'gitlab'], description: 'Platform' },\n token: { type: 'string', description: 'API token (or read from env)' },\n operation: {\n type: 'string',\n enum: ['list_issues', 'create_pr', 'comment_issue', 'get_pr', 'list_prs'],\n },\n repo: { type: 'string', description: 'owner/repo format' },\n title: { type: 'string', description: 'PR title' },\n body: { type: 'string', description: 'PR/comment body' },\n head: { type: 'string', description: 'PR head branch' },\n base: { type: 'string', description: 'PR base branch (default: main)' },\n issue_number: { type: 'number', description: 'Issue or PR number' },\n },\n required: ['operation', 'repo'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const platform = (input['platform'] as string | undefined) ?? 'github';\n const operation = input['operation'] as string;\n const repo = input['repo'] as string;\n\n // Resolve token per platform to avoid accidentally sending GITLAB_TOKEN to GitHub\n let token = input['token'] as string | undefined;\n if (!token) {\n if (platform === 'github') {\n token = process.env['GITHUB_TOKEN'];\n } else {\n token = process.env['GITLAB_TOKEN'];\n }\n }\n\n if (!token) {\n const envName = platform === 'github' ? 'GITHUB_TOKEN' : 'GITLAB_TOKEN';\n return `Error: No ${platform} token provided. Set the ${envName} environment variable or pass a \"token\" field in the input.`;\n }\n\n try {\n if (platform === 'github') {\n return await this.executeGitHub(operation, repo, token, input);\n }\n return await this.executeGitLab(operation, repo, token, input);\n } catch (err: unknown) {\n // Surface HTTP errors with actionable messages\n const axiosErr = err as { response?: { status?: number; data?: { message?: string } }; message?: string };\n if (axiosErr?.response?.status) {\n const status = axiosErr.response.status;\n const msg = axiosErr.response.data?.message ?? '';\n switch (status) {\n case 401: return `Authentication failed: Your ${platform} token is invalid or expired. Check your token and try again.`;\n case 403: return `Permission denied: Your ${platform} token lacks the required scopes for this operation. Needed: repo or workflow.`;\n case 404: return `Not found: Repository \"${repo}\" does not exist, or your token cannot access it.`;\n case 422: return `Validation error from ${platform}: ${msg || 'Check your input parameters (branch names, base/head refs, etc.).'}`;\n case 429: return `Rate limited by ${platform}. Please wait a moment before trying again.`;\n default: return `${platform} API error (${status}): ${msg || (axiosErr.message ?? 'Unknown error')}`;\n }\n }\n return `${platform} request failed: ${axiosErr.message ?? String(err)}`;\n }\n }\n\n private async executeGitHub(\n operation: string,\n repo: string,\n token: string,\n input: Record<string, unknown>,\n ): Promise<string> {\n const headers = {\n Authorization: `token ${token}`,\n Accept: 'application/vnd.github.v3+json',\n };\n const base = `https://api.github.com/repos/${repo}`;\n\n switch (operation) {\n case 'list_issues': {\n const response = await axios.get<Array<{ number: number; title: string; state: string }>>(`${base}/issues`, { headers });\n return response.data.map((i) => `#${i.number} [${i.state}] ${i.title}`).join('\\n');\n }\n case 'list_prs': {\n const response = await axios.get<Array<{ number: number; title: string; state: string; head: { ref: string }; base: { ref: string } }>>(`${base}/pulls`, { headers });\n return response.data.map((p) => `#${p.number} [${p.state}] ${p.title} (${p.head.ref} → ${p.base.ref})`).join('\\n');\n }\n case 'create_pr': {\n const response = await axios.post<{ number: number; html_url: string }>(`${base}/pulls`, {\n title: input['title'],\n body: input['body'] ?? '',\n head: input['head'],\n base: input['base'] ?? 'main',\n }, { headers });\n return `Created PR #${response.data.number}: ${response.data.html_url}`;\n }\n case 'comment_issue': {\n const num = input['issue_number'] as number;\n await axios.post(`${base}/issues/${num}/comments`, { body: input['body'] }, { headers });\n return `Comment added to #${num}`;\n }\n case 'get_pr': {\n const num = input['issue_number'] as number;\n const response = await axios.get<{ title: string; state: string; body: string; html_url: string }>(`${base}/pulls/${num}`, { headers });\n return `PR #${num}: ${response.data.title}\\nState: ${response.data.state}\\n${response.data.html_url}\\n\\n${response.data.body}`;\n }\n default:\n throw new Error(`Unknown GitHub operation: ${operation}`);\n }\n }\n\n private async executeGitLab(\n operation: string,\n repo: string,\n token: string,\n input: Record<string, unknown>,\n ): Promise<string> {\n const encodedRepo = encodeURIComponent(repo);\n const headers = { 'PRIVATE-TOKEN': token };\n const base = `https://gitlab.com/api/v4/projects/${encodedRepo}`;\n\n switch (operation) {\n case 'list_issues': {\n const response = await axios.get<Array<{ iid: number; title: string; state: string }>>(`${base}/issues`, { headers });\n return response.data.map((i) => `#${i.iid} [${i.state}] ${i.title}`).join('\\n');\n }\n case 'create_pr': {\n const response = await axios.post<{ iid: number; web_url: string }>(`${base}/merge_requests`, {\n title: input['title'],\n description: input['body'] ?? '',\n source_branch: input['head'],\n target_branch: input['base'] ?? 'main',\n }, { headers });\n return `Created MR !${response.data.iid}: ${response.data.web_url}`;\n }\n case 'list_prs': {\n const response = await axios.get<Array<{ iid: number; title: string; state: string; source_branch: string; target_branch: string }>>(`${base}/merge_requests`, { headers });\n return response.data.map((p) => `!${p.iid} [${p.state}] ${p.title} (${p.source_branch} → ${p.target_branch})`).join('\\n');\n }\n case 'comment_issue': {\n const num = input['issue_number'] as number;\n await axios.post(`${base}/issues/${num}/notes`, { body: input['body'] }, { headers });\n return `Comment added to #${num}`;\n }\n case 'get_pr': {\n const num = input['issue_number'] as number;\n const response = await axios.get<{ title: string; state: string; description: string; web_url: string }>(`${base}/merge_requests/${num}`, { headers });\n return `MR !${num}: ${response.data.title}\\nState: ${response.data.state}\\n${response.data.web_url}\\n\\n${response.data.description}`;\n }\n default:\n throw new Error(`GitLab operation not supported: ${operation}`);\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Browser Automation Tool (T3 + multimodal only)\n// ─────────────────────────────────────────────\n\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nconst BROWSER_LAUNCH_TIMEOUT_MS = 15_000;\n\nexport class BrowserTool extends BaseTool {\n readonly name = 'browser';\n readonly description = 'Control a browser: navigate to URLs, click elements, fill forms, take screenshots. Only available with multimodal models.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['navigate', 'click', 'fill', 'screenshot', 'evaluate', 'extract_text', 'wait', 'close'],\n },\n url: { type: 'string', description: 'URL to navigate to' },\n selector: { type: 'string', description: 'CSS selector for click/fill' },\n value: { type: 'string', description: 'Value for fill action' },\n script: { type: 'string', description: 'JavaScript for evaluate action' },\n timeout: { type: 'number', description: 'Timeout ms (default 10000)' },\n },\n required: ['action'],\n };\n\n private browser: import('playwright').Browser | null = null;\n private page: import('playwright').Page | null = null;\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n let playwright: typeof import('playwright');\n try {\n playwright = await import('playwright');\n } catch {\n return 'Error: Playwright is not installed. Run: npm install playwright && npx playwright install chromium';\n }\n\n const action = input['action'] as string;\n const timeout = (input['timeout'] as number | undefined) ?? 10_000;\n\n // Allow explicit close action to clean up\n if (action === 'close') {\n await this.close();\n return 'Browser closed.';\n }\n\n // Lazy-initialize browser with a launch timeout\n if (!this.browser || !this.page) {\n await this.close(); // clean up any partial state\n\n const launchPromise = playwright.chromium.launch({ headless: true });\n const timeoutPromise = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(`Browser launch timed out after ${BROWSER_LAUNCH_TIMEOUT_MS}ms. Is Chromium installed? Run: npx playwright install chromium`)), BROWSER_LAUNCH_TIMEOUT_MS),\n );\n\n try {\n this.browser = await Promise.race([launchPromise, timeoutPromise]);\n this.page = await this.browser.newPage();\n } catch (err) {\n this.browser = null;\n this.page = null;\n return `Browser launch failed: ${err instanceof Error ? err.message : String(err)}`;\n }\n }\n\n const page = this.page;\n\n try {\n switch (action) {\n case 'navigate': {\n await page.goto(input['url'] as string, { timeout });\n const title = await page.title();\n return `Navigated to ${input['url']} (title: \"${title}\")`;\n }\n case 'click': {\n await page.click(input['selector'] as string, { timeout });\n return `Clicked ${input['selector']}`;\n }\n case 'fill': {\n await page.fill(input['selector'] as string, input['value'] as string);\n return `Filled ${input['selector']} with value`;\n }\n case 'screenshot': {\n const buf = await page.screenshot({ type: 'png' });\n return `data:image/png;base64,${buf.toString('base64')}`;\n }\n case 'evaluate': {\n const result = await page.evaluate(input['script'] as string);\n return JSON.stringify(result);\n }\n case 'extract_text': {\n const text = await page.locator('body').innerText();\n return text.slice(0, 10_000);\n }\n case 'wait': {\n await page.waitForTimeout(timeout);\n return `Waited ${timeout}ms`;\n }\n default:\n return `Unknown browser action: ${action}. Supported: navigate, click, fill, screenshot, evaluate, extract_text, wait, close`;\n }\n } catch (err) {\n // If the page crashed or navigated away mid-action, reset so next call re-initializes\n const errMsg = err instanceof Error ? err.message : String(err);\n if (/Target closed|Page crashed|Navigation failed/i.test(errMsg)) {\n await this.close();\n return `Browser error (page reset): ${errMsg}`;\n }\n return `Browser action \"${action}\" failed: ${errMsg}`;\n }\n }\n\n async close(): Promise<void> {\n try {\n if (this.page) {\n await this.page.close().catch(() => {});\n this.page = null;\n }\n if (this.browser) {\n await this.browser.close().catch(() => {});\n this.browser = null;\n }\n } catch {\n // Swallow errors on cleanup — the browser may already be dead\n this.browser = null;\n this.page = null;\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Image Analysis Tool\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { ImageAttachment, ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nexport class ImageAnalyzeTool extends BaseTool {\n readonly name = 'image_analyze';\n readonly description = 'Analyze an image file and describe its contents. Only available when using a vision-capable model.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to the image file' },\n prompt: { type: 'string', description: 'What to look for or ask about the image' },\n },\n required: ['path'],\n };\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const filePath = input['path'] as string;\n const prompt = (input['prompt'] as string | undefined) ?? 'Describe this image in detail.';\n\n const attachment = await fileToImageAttachment(filePath);\n\n // Return the image as base64 + prompt — the calling T3 worker will\n // include this in its next message to the vision-capable model\n return JSON.stringify({\n __cascade_image_request: true,\n attachment,\n prompt,\n });\n }\n}\n\nexport async function fileToImageAttachment(filePath: string): Promise<ImageAttachment> {\n const data = await fs.readFile(filePath);\n const ext = path.extname(filePath).toLowerCase();\n const mimeMap: Record<string, ImageAttachment['mimeType']> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n };\n const mimeType = mimeMap[ext] ?? 'image/jpeg';\n\n return {\n type: 'base64',\n data: data.toString('base64'),\n mimeType,\n };\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — PDF Tool\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport PDFDocument from 'pdfkit';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nexport class PDFCreateTool extends BaseTool {\n readonly name = 'pdf_create';\n readonly description = 'Create a PDF document from text or markdown. Supports basic formatting and auto-pagination.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to save the PDF file' },\n content: { type: 'string', description: 'The text or markdown content to include in the PDF' },\n title: { type: 'string', description: 'Optional title for the document' },\n },\n required: ['path', 'content'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const filePath = input['path'] as string;\n const content = input['content'] as string;\n const title = input['title'] as string | undefined;\n\n // Ensure directory exists\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n return new Promise((resolve, reject) => {\n try {\n const doc = new PDFDocument({ margin: 50 });\n const stream = fs.createWriteStream(filePath);\n\n doc.pipe(stream);\n\n // Metadata\n if (title) {\n doc.info['Title'] = title;\n doc.fontSize(24).text(title, { align: 'center' });\n doc.moveDown();\n }\n\n // Content\n doc.fontSize(12).text(content, {\n align: 'justify',\n indent: 20,\n paragraphGap: 10,\n lineGap: 5,\n });\n\n doc.end();\n\n stream.on('finish', () => {\n resolve(`Successfully created PDF at ${filePath} (${content.length} characters)`);\n });\n\n stream.on('error', (err) => {\n reject(new Error(`Failed to write PDF: ${err.message}`));\n });\n } catch (err) {\n reject(err);\n }\n });\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Code Interpreter Tool\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { exec, execSync } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\n/** Detect the first available command from a candidate list. Returns null if none found. */\nfunction detectCommand(candidates: string[]): string | null {\n for (const cmd of candidates) {\n try {\n // `where` on Windows, `which` on Unix — both exit non-zero if not found\n const which = process.platform === 'win32' ? 'where' : 'which';\n execSync(`${which} ${cmd}`, { stdio: 'ignore' });\n return cmd;\n } catch {\n // command not found, try next\n }\n }\n return null;\n}\n\n// Detect Python and Node at module load time to avoid repeated PATH scans\nconst PYTHON_CMD = detectCommand(['python3', 'python']);\nconst NODE_CMD = detectCommand(['node']);\n\nexport class CodeInterpreterTool extends BaseTool {\n readonly name = 'run_code';\n readonly description = 'Execute a Python or Node.js script to perform complex tasks (data processing, file conversion, etc.). The script is automatically cleaned up after execution.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n language: { type: 'string', enum: ['python', 'nodejs'], description: 'Programming language of the script' },\n code: { type: 'string', description: 'The complete source code to execute' },\n args: { type: 'array', items: { type: 'string' }, description: 'Command line arguments for the script' },\n },\n required: ['language', 'code'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const language = input['language'] as 'python' | 'nodejs';\n const code = input['code'] as string;\n const args = (input['args'] as string[]) ?? [];\n\n // Resolve interpreter command\n let cmdPrefix: string;\n if (language === 'python') {\n if (!PYTHON_CMD) {\n return [\n 'Error: Python interpreter not found.',\n 'Please install Python and ensure it is in your PATH.',\n 'Tried: python3, python',\n ].join('\\n');\n }\n cmdPrefix = PYTHON_CMD;\n } else {\n if (!NODE_CMD) {\n return [\n 'Error: Node.js interpreter not found.',\n 'Please install Node.js and ensure it is in your PATH.',\n 'Tried: node',\n ].join('\\n');\n }\n cmdPrefix = NODE_CMD;\n }\n\n // Setup temporary directory structure in .cascade/tmp\n const tmpDir = path.join(process.cwd(), '.cascade', 'tmp');\n if (!fs.existsSync(tmpDir)) {\n fs.mkdirSync(tmpDir, { recursive: true });\n }\n\n const extension = language === 'python' ? 'py' : 'js';\n const fileName = `intp_${randomUUID().slice(0, 8)}.${extension}`;\n const filePath = path.join(tmpDir, fileName);\n\n // 1. Write the script\n fs.writeFileSync(filePath, code, 'utf-8');\n\n // 2. Prepare command — quote paths to handle spaces in Windows paths\n const quotedPath = `\"${filePath}\"`;\n const quotedArgs = args.map((a) => `\"${a}\"`).join(' ');\n const fullCmd = `${cmdPrefix} ${quotedPath}${quotedArgs ? ' ' + quotedArgs : ''}`;\n\n // 3. Execute\n return new Promise((resolve) => {\n const startMs = Date.now();\n exec(fullCmd, { cwd: process.cwd(), timeout: 30000 }, (error, stdout, stderr) => {\n const duration = Date.now() - startMs;\n\n // 4. Cleanup (Always delete the script from the filesystem)\n try {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n } catch (cleanupErr) {\n console.error(`Failed to cleanup interpreter script ${filePath}:`, cleanupErr);\n }\n\n if (error) {\n const timedOut = error.killed && duration >= 30000;\n if (timedOut) {\n resolve(`Execution timed out after 30s. Consider breaking the task into smaller pieces.\\nPartial stdout: ${stdout}\\nStderr: ${stderr}`);\n } else {\n resolve(`Execution failed (${duration}ms):\\nError: ${error.message}\\nStderr: ${stderr}\\nStdout: ${stdout}`);\n }\n } else {\n resolve(`Execution successful (${duration}ms):\\nStdout: ${stdout}\\nStderr: ${stderr}`);\n }\n });\n });\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Peer Communication Tool\n// ─────────────────────────────────────────────\n\nimport { BaseTool } from './base.js';\nimport type { PeerSyncType, ToolExecuteOptions } from '../types.js';\n\nexport class PeerCommunicationTool extends BaseTool {\n readonly name = 'peer_message';\n readonly description = 'Communicate with peer agents in the same tier or level. Use this to sync outputs, request data, or signal completion of a dependency.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['send', 'receive'],\n description: 'Whether to send a message to a peer or retrieve pending messages from all peers.'\n },\n toId: {\n type: 'string',\n description: 'The ID of the recipient peer (required for action=\"send\").'\n },\n messageType: {\n type: 'string',\n enum: ['SHARE_OUTPUT', 'RESOLVE_CONFLICT', 'DIVIDE_WORK', 'CHECK_ASSUMPTION', 'SIGNAL_READY'],\n description: 'The category of the peer message.'\n },\n content: {\n type: 'string',\n description: 'The text content or JSON string of the message.'\n }\n },\n required: ['action']\n };\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const action = input.action as 'send' | 'receive';\n\n if (action === 'send') {\n const toId = input.toId as string;\n const messageType = ((input.messageType as PeerSyncType | undefined) ?? 'SHARE_OUTPUT');\n const content = input.content as string;\n\n if (!toId) return 'Error: toId is required when action is \"send\"';\n if (!options.sendPeerSync) return 'Error: Peer communication is not enabled for this agent.';\n\n options.sendPeerSync(toId, messageType, content);\n return `Successfully sent ${messageType} message to peer ${toId}.`;\n }\n\n if (action === 'receive') {\n if (!options.getPeerMessages) return 'Error: Peer communication is not enabled for this agent.';\n const messages = options.getPeerMessages();\n\n if (messages.length === 0) {\n return 'No new messages from peers.';\n }\n\n const formatted = messages.map(m => `[From ${m.fromId} at ${m.timestamp}]: ${typeof m.content === 'string' ? m.content : JSON.stringify(m.content)}`).join('\\n---\\n');\n return `Received ${messages.length} peer messages:\\n\\n${formatted}`;\n }\n\n return `Unknown action: ${action}`;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Web Search Tool\n// ─────────────────────────────────────────────\n//\n// Supports multiple backends in priority order:\n// 1. SearXNG (self-hosted, primary)\n// 2. Brave Search API\n// 3. Tavily API\n// 4. DuckDuckGo Lite (no API key needed, last resort)\n//\n// Configuration (env vars or config.json tools.webSearch):\n// SEARXNG_URL — Base URL of your SearXNG instance\n// BRAVE_SEARCH_API_KEY — Brave Search API key\n// TAVILY_API_KEY — Tavily API key\n//\n// DuckDuckGo Lite is always available as a final fallback.\n// ─────────────────────────────────────────────\n\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nexport interface WebSearchResult {\n title: string;\n url: string;\n snippet: string;\n engine?: string;\n}\n\nexport interface WebSearchConfig {\n /** Base URL of a SearXNG instance e.g. https://searx.example.com */\n searxngUrl?: string;\n /** Brave Search API key */\n braveApiKey?: string;\n /** Tavily API key */\n tavilyApiKey?: string;\n /** Max number of results to return (default: 5) */\n maxResults?: number;\n}\n\n// ── SearXNG ───────────────────────────────────\n\nasync function searchSearXNG(\n query: string,\n baseUrl: string,\n maxResults: number,\n): Promise<WebSearchResult[]> {\n const url = new URL('/search', baseUrl);\n url.searchParams.set('q', query);\n url.searchParams.set('format', 'json');\n url.searchParams.set('categories', 'general');\n url.searchParams.set('engines', 'google,bing,duckduckgo');\n\n const resp = await fetch(url.toString(), {\n headers: { 'User-Agent': 'Cascade-AI/1.0 WebSearchTool' },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!resp.ok) {\n throw new Error(`SearXNG returned HTTP ${resp.status}`);\n }\n\n const data = await resp.json() as {\n results?: Array<{ title?: string; url?: string; content?: string; engine?: string }>;\n };\n\n return (data.results ?? [])\n .filter((r) => r.url && r.title)\n .slice(0, maxResults)\n .map((r) => ({\n title: r.title ?? '',\n url: r.url ?? '',\n snippet: r.content ?? '',\n engine: `searxng(${r.engine ?? 'unknown'})`,\n }));\n}\n\n// ── Brave Search ─────────────────────────────\n\nasync function searchBrave(\n query: string,\n apiKey: string,\n maxResults: number,\n): Promise<WebSearchResult[]> {\n const url = `https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=${maxResults}&safesearch=off`;\n const resp = await fetch(url, {\n headers: {\n 'Accept': 'application/json',\n 'Accept-Encoding': 'gzip',\n 'X-Subscription-Token': apiKey,\n },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!resp.ok) {\n throw new Error(`Brave Search returned HTTP ${resp.status}`);\n }\n\n const data = await resp.json() as {\n web?: {\n results?: Array<{ title?: string; url?: string; description?: string }>;\n };\n };\n\n return (data.web?.results ?? [])\n .filter((r) => r.url && r.title)\n .slice(0, maxResults)\n .map((r) => ({\n title: r.title ?? '',\n url: r.url ?? '',\n snippet: r.description ?? '',\n engine: 'brave',\n }));\n}\n\n// ── Tavily ────────────────────────────────────\n\nasync function searchTavily(\n query: string,\n apiKey: string,\n maxResults: number,\n): Promise<WebSearchResult[]> {\n const resp = await fetch('https://api.tavily.com/search', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n query,\n max_results: maxResults,\n search_depth: 'basic',\n include_answer: false,\n include_raw_content: false,\n }),\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!resp.ok) {\n throw new Error(`Tavily returned HTTP ${resp.status}`);\n }\n\n const data = await resp.json() as {\n results?: Array<{ title?: string; url?: string; content?: string; score?: number }>;\n };\n\n return (data.results ?? [])\n .filter((r) => r.url && r.title)\n .slice(0, maxResults)\n .map((r) => ({\n title: r.title ?? '',\n url: r.url ?? '',\n snippet: r.content ?? '',\n engine: 'tavily',\n }));\n}\n\n// ── DuckDuckGo Lite (no key required, last resort) ───────────────────\n\nasync function searchDuckDuckGoLite(\n query: string,\n maxResults: number,\n): Promise<WebSearchResult[]> {\n // DuckDuckGo Lite returns an HTML page — we parse key `<a>` tags\n const resp = await fetch(`https://lite.duckduckgo.com/lite/?q=${encodeURIComponent(query)}`, {\n headers: { 'User-Agent': 'Mozilla/5.0 (compatible; Cascade-AI/1.0)' },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!resp.ok) throw new Error(`DuckDuckGo Lite returned HTTP ${resp.status}`);\n\n const html = await resp.text();\n\n // Extract result links from the lite HTML (result links follow a predictable pattern)\n const linkPattern = /<a[^>]+class=\"result-link\"[^>]+href=\"([^\"]+)\"[^>]*>([^<]+)<\\/a>/g;\n const snippetPattern = /<td[^>]+class=\"result-snippet\"[^>]*>([\\s\\S]*?)<\\/td>/g;\n\n const links: Array<{ url: string; title: string }> = [];\n const snippets: string[] = [];\n\n let m: RegExpExecArray | null;\n while ((m = linkPattern.exec(html)) !== null) {\n links.push({ url: m[1]!, title: m[2]!.trim() });\n }\n while ((m = snippetPattern.exec(html)) !== null) {\n snippets.push(m[1]!.replace(/<[^>]+>/g, '').trim());\n }\n\n return links.slice(0, maxResults).map((link, i) => ({\n title: link.title,\n url: link.url,\n snippet: snippets[i] ?? '',\n engine: 'duckduckgo-lite',\n }));\n}\n\n// ── WebSearchTool ────────────────────────────\n\nexport class WebSearchTool extends BaseTool {\n readonly name = 'web_search';\n readonly description =\n 'Search the web for current information, news, documentation, or any topic. Returns a list of relevant results with titles, URLs, and snippets.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'The search query' },\n maxResults: { type: 'number', description: 'Number of results to return (default: 5, max: 10)' },\n },\n required: ['query'],\n };\n\n private config: WebSearchConfig;\n\n constructor(config: WebSearchConfig = {}) {\n super();\n this.config = {\n searxngUrl: config.searxngUrl ?? process.env['SEARXNG_URL'],\n braveApiKey: config.braveApiKey ?? process.env['BRAVE_SEARCH_API_KEY'],\n tavilyApiKey: config.tavilyApiKey ?? process.env['TAVILY_API_KEY'],\n maxResults: config.maxResults ?? 5,\n };\n }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const query = input['query'] as string;\n if (!query?.trim()) return 'Error: query is required and must be non-empty.';\n\n const maxResults = Math.min(\n (input['maxResults'] as number | undefined) ?? this.config.maxResults ?? 5,\n 10,\n );\n\n const errors: string[] = [];\n let results: WebSearchResult[] = [];\n\n // ── 1. SearXNG (preferred — self-hosted, privacy-preserving) ──────────\n if (this.config.searxngUrl) {\n try {\n results = await searchSearXNG(query, this.config.searxngUrl, maxResults);\n if (results.length > 0) return this.formatResults(query, results);\n errors.push('SearXNG: returned 0 results');\n } catch (err) {\n errors.push(`SearXNG: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // ── 2. Brave Search ───────────────────────────────────────────────────\n if (this.config.braveApiKey) {\n try {\n results = await searchBrave(query, this.config.braveApiKey, maxResults);\n if (results.length > 0) return this.formatResults(query, results);\n errors.push('Brave: returned 0 results');\n } catch (err) {\n errors.push(`Brave: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // ── 3. Tavily ─────────────────────────────────────────────────────────\n if (this.config.tavilyApiKey) {\n try {\n results = await searchTavily(query, this.config.tavilyApiKey, maxResults);\n if (results.length > 0) return this.formatResults(query, results);\n errors.push('Tavily: returned 0 results');\n } catch (err) {\n errors.push(`Tavily: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // ── 4. DuckDuckGo Lite (always available, no key needed) ─────────────\n try {\n results = await searchDuckDuckGoLite(query, maxResults);\n if (results.length > 0) return this.formatResults(query, results);\n errors.push('DuckDuckGo Lite: returned 0 results');\n } catch (err) {\n errors.push(`DuckDuckGo Lite: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // All backends failed\n const configHint = !this.config.searxngUrl && !this.config.braveApiKey && !this.config.tavilyApiKey\n ? '\\nTip: Configure a search backend for better results:\\n • Self-hosted: set SEARXNG_URL in your environment\\n • Brave Search API: set BRAVE_SEARCH_API_KEY\\n • Tavily API: set TAVILY_API_KEY'\n : '';\n\n return [\n `Web search for \"${query}\" failed across all backends:`,\n ...errors.map((e) => ` • ${e}`),\n configHint,\n ].join('\\n');\n }\n\n private formatResults(query: string, results: WebSearchResult[]): string {\n const lines = [`Web search results for: \"${query}\"`, ''];\n for (let i = 0; i < results.length; i++) {\n const r = results[i]!;\n lines.push(`[${i + 1}] ${r.title}`);\n lines.push(` URL: ${r.url}`);\n if (r.snippet) lines.push(` ${r.snippet.slice(0, 300)}`);\n if (r.engine) lines.push(` Source: ${r.engine}`);\n lines.push('');\n }\n return lines.join('\\n');\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Glob Tool\n// ─────────────────────────────────────────────\n\nimport { glob } from 'glob';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nexport class GlobTool extends BaseTool {\n readonly name = 'glob';\n readonly description =\n 'Fast file pattern matching. Returns file paths matching a glob pattern, sorted by modification time. Use this to find files by name patterns.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'Glob pattern to match files against, e.g. \"**/*.ts\", \"src/**/*.tsx\"',\n },\n path: {\n type: 'string',\n description: 'Directory to search in. Defaults to the workspace root.',\n },\n },\n required: ['pattern'],\n };\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const pattern = input['pattern'] as string;\n const searchPath = (input['path'] as string | undefined)\n ? path.resolve(this.workspaceRoot, input['path'] as string)\n : this.workspaceRoot;\n\n const matches = await glob(pattern, {\n cwd: searchPath,\n ignore: ['node_modules/**', '.git/**', 'dist/**', 'build/**'],\n nodir: true,\n dot: false,\n });\n\n if (matches.length === 0) {\n return `No files matched pattern: ${pattern}`;\n }\n\n // Sort by modification time (most recently modified first)\n const withMtime: Array<{ rel: string; mtime: number }> = await Promise.all(\n matches.map(async (rel) => {\n try {\n const stat = await fs.stat(path.join(searchPath, rel));\n return { rel, mtime: stat.mtimeMs };\n } catch {\n return { rel, mtime: 0 };\n }\n }),\n );\n withMtime.sort((a, b) => b.mtime - a.mtime);\n\n const lines = withMtime.map((f) => f.rel);\n return lines.join('\\n');\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Grep Tool\n// ─────────────────────────────────────────────\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { glob } from 'glob';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport class GrepTool extends BaseTool {\n readonly name = 'grep';\n readonly description =\n 'Search file contents using a regex pattern. Returns matching lines with file paths and line numbers. Tries ripgrep (rg) first, falls back to Node.js regex scan.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'Regular expression pattern to search for in file contents',\n },\n path: {\n type: 'string',\n description: 'File or directory to search in. Defaults to workspace root.',\n },\n glob: {\n type: 'string',\n description: 'Glob pattern to filter files, e.g. \"*.ts\", \"**/*.tsx\"',\n },\n output_mode: {\n type: 'string',\n enum: ['content', 'files_with_matches', 'count'],\n description:\n '\"content\" shows matching lines (default), \"files_with_matches\" shows file paths only, \"count\" shows match counts',\n },\n context: {\n type: 'number',\n description: 'Lines of context around each match (content mode only). Default: 0.',\n },\n case_insensitive: {\n type: 'boolean',\n description: 'Case-insensitive search. Default: false.',\n },\n },\n required: ['pattern'],\n };\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const pattern = input['pattern'] as string;\n const searchPath = (input['path'] as string | undefined)\n ? path.resolve(this.workspaceRoot, input['path'] as string)\n : this.workspaceRoot;\n const globPattern = input['glob'] as string | undefined;\n const outputMode = (input['output_mode'] as string | undefined) ?? 'content';\n const context = (input['context'] as number | undefined) ?? 0;\n const caseInsensitive = (input['case_insensitive'] as boolean | undefined) ?? false;\n\n // Try ripgrep first\n try {\n const result = await this.runRipgrep(\n pattern,\n searchPath,\n globPattern,\n outputMode,\n context,\n caseInsensitive,\n );\n return result;\n } catch {\n // ripgrep not available — fall back to Node.js scan\n }\n\n return this.nodeScan(pattern, searchPath, globPattern, outputMode, context, caseInsensitive);\n }\n\n private async runRipgrep(\n pattern: string,\n searchPath: string,\n globPattern: string | undefined,\n outputMode: string,\n context: number,\n caseInsensitive: boolean,\n ): Promise<string> {\n const args: string[] = ['--no-heading'];\n if (caseInsensitive) args.push('-i');\n if (outputMode === 'files_with_matches') args.push('-l');\n else if (outputMode === 'count') args.push('-c');\n else {\n args.push('-n'); // line numbers\n if (context > 0) args.push(`-C${context}`);\n }\n if (globPattern) args.push('--glob', globPattern);\n args.push('--', pattern, searchPath);\n\n const { stdout } = await execFileAsync('rg', args, {\n timeout: 15_000,\n maxBuffer: 2 * 1024 * 1024,\n });\n\n const trimmed = stdout.trim();\n return trimmed || `No matches found for: ${pattern}`;\n }\n\n private async nodeScan(\n pattern: string,\n searchPath: string,\n globPattern: string | undefined,\n outputMode: string,\n context: number,\n caseInsensitive: boolean,\n ): Promise<string> {\n const flags = caseInsensitive ? 'gi' : 'g';\n let regex: RegExp;\n try {\n regex = new RegExp(pattern, flags);\n } catch {\n return `Invalid regex pattern: ${pattern}`;\n }\n\n const fileGlob = globPattern ?? '**/*';\n let files: string[];\n try {\n files = await glob(fileGlob, {\n cwd: searchPath,\n ignore: ['node_modules/**', '.git/**', 'dist/**', 'build/**'],\n nodir: true,\n });\n } catch {\n // If searchPath is a single file\n files = [path.relative(searchPath, searchPath) || '.'];\n }\n\n const results: string[] = [];\n let totalCount = 0;\n\n for (const rel of files) {\n const abs = path.join(searchPath, rel);\n let content: string;\n try {\n content = await fs.readFile(abs, 'utf-8');\n } catch {\n continue;\n }\n\n const lines = content.split('\\n');\n const matchingLines: number[] = [];\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i])) matchingLines.push(i);\n regex.lastIndex = 0;\n }\n\n if (matchingLines.length === 0) continue;\n totalCount += matchingLines.length;\n\n if (outputMode === 'files_with_matches') {\n results.push(rel);\n } else if (outputMode === 'count') {\n results.push(`${rel}: ${matchingLines.length}`);\n } else {\n const shown = new Set<number>();\n for (const lineIdx of matchingLines) {\n const start = Math.max(0, lineIdx - context);\n const end = Math.min(lines.length - 1, lineIdx + context);\n for (let i = start; i <= end; i++) shown.add(i);\n }\n const sortedIdxs = [...shown].sort((a, b) => a - b);\n for (const i of sortedIdxs) {\n const marker = matchingLines.includes(i) ? ':' : '-';\n results.push(`${rel}:${i + 1}${marker}${lines[i]}`);\n }\n }\n }\n\n if (results.length === 0) return `No matches found for: ${pattern}`;\n if (outputMode === 'count') {\n results.push(`\\nTotal: ${totalCount} matches`);\n }\n return results.join('\\n');\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Web Fetch Tool\n// ─────────────────────────────────────────────\n\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nconst MAX_CHARS = 50_000;\nconst TIMEOUT_MS = 15_000;\n\nfunction stripHtml(html: string): string {\n // Remove <script> and <style> blocks with their content\n let text = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<noscript[\\s\\S]*?<\\/noscript>/gi, '');\n\n // Convert common block elements to newlines\n text = text\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/p>/gi, '\\n')\n .replace(/<\\/div>/gi, '\\n')\n .replace(/<\\/h[1-6]>/gi, '\\n')\n .replace(/<\\/li>/gi, '\\n')\n .replace(/<\\/tr>/gi, '\\n')\n .replace(/<\\/td>/gi, '\\t');\n\n // Strip remaining tags\n text = text.replace(/<[^>]+>/g, '');\n\n // Decode common HTML entities\n text = text\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&nbsp;/g, ' ')\n .replace(/&#(\\d+);/g, (_, n) => String.fromCharCode(Number(n)));\n\n // Collapse excessive whitespace / blank lines\n text = text\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .join('\\n');\n\n return text;\n}\n\nexport class WebFetchTool extends BaseTool {\n readonly name = 'web_fetch';\n readonly description =\n 'Fetch a URL and return its content as plain text (HTML stripped). Use for reading documentation, web pages, or any URL. Limit: 50,000 characters.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n url: {\n type: 'string',\n description: 'The URL to fetch',\n },\n prompt: {\n type: 'string',\n description:\n 'Optional hint for what information to extract from the page (not used for filtering, just context)',\n },\n },\n required: ['url'],\n };\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const url = input['url'] as string;\n\n let resp: Response;\n try {\n resp = await fetch(url, {\n headers: {\n 'User-Agent': 'Cascade-AI/1.0 WebFetchTool',\n Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.5',\n },\n signal: AbortSignal.timeout(TIMEOUT_MS),\n redirect: 'follow',\n });\n } catch (err) {\n return `Failed to fetch ${url}: ${err instanceof Error ? err.message : String(err)}`;\n }\n\n if (!resp.ok) {\n return `HTTP ${resp.status} ${resp.statusText} from ${url}`;\n }\n\n const contentType = resp.headers.get('content-type') ?? '';\n let text: string;\n\n try {\n const raw = await resp.text();\n text = contentType.includes('html') ? stripHtml(raw) : raw;\n } catch (err) {\n return `Failed to read response body: ${err instanceof Error ? err.message : String(err)}`;\n }\n\n if (text.length > MAX_CHARS) {\n text = text.slice(0, MAX_CHARS) + `\\n\\n[Content truncated at ${MAX_CHARS} characters]`;\n }\n\n return `URL: ${url}\\nContent-Type: ${contentType}\\n\\n${text}`;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — MCP Tool Wrapper\n// ─────────────────────────────────────────────\n\nimport type { ToolDefinition, ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\nimport { McpClient } from '../mcp/client.js';\n\n/**\n * A wrapper for a single tool exposed by an MCP server.\n */\nexport class McpToolWrapper extends BaseTool {\n public readonly name: string;\n public readonly description: string;\n public readonly inputSchema: Record<string, unknown>;\n\n private mcpClient: McpClient;\n private serverName: string;\n private toolName: string;\n\n constructor(\n mcpClient: McpClient,\n serverName: string,\n toolName: string,\n description: string,\n inputSchema: Record<string, unknown>\n ) {\n super();\n this.mcpClient = mcpClient;\n this.serverName = serverName;\n this.toolName = toolName;\n this.name = `mcp::${serverName}::${toolName}`;\n this.description = `[MCP:${serverName}] ${description}`;\n this.inputSchema = inputSchema;\n }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n return this.mcpClient.callTool(this.serverName, this.toolName, input);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Tool Registry\n// ─────────────────────────────────────────────\n\nimport EventEmitter from 'node:events';\nimport path from 'node:path';\nimport ignoreFactory, { type Ignore } from 'ignore';\n\n// `ignore` is published as CJS. Under `moduleResolution: NodeNext` the\n// default import surfaces the module namespace rather than the callable\n// factory, so normalise to whichever shape the runtime hands us.\nconst ignore: (opts?: unknown) => Ignore =\n (ignoreFactory as unknown as { default?: (opts?: unknown) => Ignore }).default ??\n (ignoreFactory as unknown as (opts?: unknown) => Ignore);\nimport type { ToolDefinition, ToolExecuteOptions, ToolsConfig } from '../types.js';\nimport { DEFAULT_APPROVAL_REQUIRED } from '../constants.js';\nimport type { BaseTool } from './base.js';\nimport { ShellTool } from './shell.js';\nimport { FileReadTool, FileWriteTool, FileEditTool, FileDeleteTool, FileListTool } from './file.js';\nimport { GitTool } from './git.js';\nimport { GitHubTool } from './github.js';\nimport { BrowserTool } from './browser.js';\nimport { ImageAnalyzeTool } from './image.js';\nimport { PDFCreateTool } from './pdf.js';\nimport { CodeInterpreterTool } from './interpreter.js';\nimport { PeerCommunicationTool } from './peer.js';\nimport { WebSearchTool } from './web-search.js';\nimport { GlobTool } from './glob.js';\nimport { GrepTool } from './grep.js';\nimport { WebFetchTool } from './web-fetch.js';\nimport { McpClient } from '../mcp/client.js';\nimport { McpToolWrapper } from './mcp.js';\n\n// ── Plugin System (Roadmap Stub) ──────────────────────────────────────────\n//\n// Future plugin support. Plugins bundle one or more tools together with\n// optional lifecycle hooks. Use `registry.registerPlugin(plugin)` to register.\n// This is a stub — full implementation tracked in ROADMAP.md.\n\n/**\n * A ToolPlugin bundles one or more custom tools that extend Cascade's capabilities.\n * Plugins are loaded via `registerPlugin()` and behave like built-in tools.\n *\n * @example\n * const myPlugin: ToolPlugin = {\n * name: 'my-custom-tools',\n * version: '1.0.0',\n * tools: [new MyCustomTool()],\n * onRegister: (registry) => console.log('Plugin registered'),\n * };\n * registry.registerPlugin(myPlugin);\n */\nexport interface ToolPlugin {\n /** Unique plugin identifier */\n name: string;\n /** Semantic version string */\n version: string;\n /** One or more tools this plugin provides */\n tools: BaseTool[];\n /** Called once when the plugin is registered */\n onRegister?: (registry: ToolRegistry) => void;\n}\n\nexport class ToolRegistry extends EventEmitter {\n private tools: Map<string, BaseTool> = new Map();\n private config: ToolsConfig;\n private ignoreMatcher: Ignore = ignore();\n private workspaceRoot: string;\n /** Loaded plugins, keyed by plugin name */\n private plugins: Map<string, ToolPlugin> = new Map();\n\n constructor(config: ToolsConfig, workspaceRoot: string = process.cwd()) {\n super();\n this.config = config;\n this.workspaceRoot = workspaceRoot;\n this.registerDefaults();\n }\n\n register(tool: BaseTool): void {\n this.tools.set(tool.name, tool);\n this.emit('tool:added', tool.name);\n }\n\n /**\n * Wait until a named tool is registered, resolving immediately if it already exists.\n * T3 workers can call this after encountering a missing-tool error to resume\n * automatically once T2 synthesizes the tool.\n */\n waitForTool(toolName: string, timeoutMs = 60_000): Promise<void> {\n if (this.tools.has(toolName)) return Promise.resolve();\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.off('tool:added', handler);\n reject(new Error(`Timeout waiting for tool: ${toolName}`));\n }, timeoutMs);\n\n const handler = (name: string) => {\n if (name === toolName) {\n clearTimeout(timer);\n this.off('tool:added', handler);\n resolve();\n }\n };\n this.on('tool:added', handler);\n });\n }\n\n /**\n * Register a ToolPlugin, loading all its tools into the registry.\n * Each tool is configured with the current workspace root.\n * Duplicate plugin names are silently ignored.\n *\n * @example\n * registry.registerPlugin(myPlugin);\n */\n registerPlugin(plugin: ToolPlugin): void {\n if (this.plugins.has(plugin.name)) return;\n this.plugins.set(plugin.name, plugin);\n for (const tool of plugin.tools) {\n tool.setWorkspaceRoot(this.workspaceRoot);\n this.register(tool);\n }\n plugin.onRegister?.(this);\n }\n\n /** Returns the names of all registered plugins */\n getRegisteredPlugins(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /** Registers all tools from an MCP client */\n registerMcpTools(mcpClient: McpClient): void {\n const definitions = mcpClient.getToolDefinitions();\n for (const def of definitions) {\n // Definitions from McpClient.getToolDefinitions() are prefixed as\n // `mcp::<serverName>::<toolName>` — three parts, not four. Previously\n // this destructured [,, serverName, toolName] which silently dropped\n // every MCP tool (toolName was always undefined and the `continue`\n // below filtered them all out).\n const [, serverName, toolName] = def.name.split('::');\n if (!serverName || !toolName) continue;\n\n const wrapper = new McpToolWrapper(\n mcpClient,\n serverName,\n toolName,\n def.description.replace(`[MCP:${serverName}] `, ''),\n def.inputSchema,\n );\n wrapper.setWorkspaceRoot(this.workspaceRoot);\n this.register(wrapper);\n }\n }\n\n setIgnoredPaths(patterns: string[]): void {\n // `ignore` mirrors .gitignore semantics: supports negation, globs, dirs.\n // Using the library eliminates the old substring bug where `node_modules`\n // would also match `mynodemodules.js`.\n this.ignoreMatcher = ignore().add(patterns);\n }\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.getDefinition());\n }\n\n getTool(name: string): BaseTool | undefined {\n return this.tools.get(name);\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n\n requiresApproval(toolName: string): boolean {\n const defaults = DEFAULT_APPROVAL_REQUIRED as string[];\n const configured = this.config.requireApprovalFor;\n return defaults.includes(toolName) || configured.includes(toolName);\n }\n\n isDangerous(toolName: string): boolean {\n return this.tools.get(toolName)?.isDangerous() ?? false;\n }\n\n async execute(\n toolName: string,\n input: Record<string, unknown>,\n options: ToolExecuteOptions,\n ): Promise<string> {\n const tool = this.tools.get(toolName);\n if (!tool) throw new Error(`Tool not found: ${toolName}`);\n\n // Enforce .cascadeignore for file operations\n if (this.isFileOperation(toolName)) {\n const filePath = (input['path'] as string | undefined) ?? '';\n if (this.isIgnored(filePath)) {\n throw new Error(`Access denied: ${filePath} is in .cascadeignore`);\n }\n }\n\n return tool.execute(input, options);\n }\n\n private registerDefaults(): void {\n const tools: BaseTool[] = [\n new ShellTool(this.config.shellAllowlist, this.config.shellBlocklist),\n new FileReadTool(),\n new FileWriteTool(),\n new FileEditTool(),\n new FileDeleteTool(),\n new FileListTool(),\n new GitTool(),\n new GitHubTool(),\n new ImageAnalyzeTool(),\n new PDFCreateTool(),\n new CodeInterpreterTool(),\n new PeerCommunicationTool(),\n new WebSearchTool(this.config.webSearch),\n new GlobTool(),\n new GrepTool(),\n new WebFetchTool(),\n ];\n\n for (const tool of tools) {\n tool.setWorkspaceRoot(this.workspaceRoot);\n this.register(tool);\n }\n\n if (this.config.browserEnabled) {\n const browser = new BrowserTool();\n browser.setWorkspaceRoot(this.workspaceRoot);\n this.register(browser);\n }\n }\n\n private isFileOperation(toolName: string): boolean {\n return ['file_read', 'file_write', 'file_edit', 'file_delete'].includes(toolName);\n }\n\n private isIgnored(filePath: string): boolean {\n if (!filePath) return false;\n const abs = path.resolve(this.workspaceRoot, filePath);\n const rel = path.relative(this.workspaceRoot, abs);\n // Any path outside the workspace is treated as ignored (defence in depth;\n // the dedicated path-sandbox guards in each file tool also reject these).\n if (!rel || rel.startsWith('..') || path.isAbsolute(rel)) return true;\n // `ignore` requires POSIX-style separators.\n const posixRel = rel.split(path.sep).join('/');\n return this.ignoreMatcher.ignores(posixRel);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — MCP Client\n// ─────────────────────────────────────────────\n\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { ToolDefinition } from '../types.js';\n\nexport interface McpServerConfig {\n name: string;\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nexport interface McpTool {\n serverName: string;\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\n/**\n * Gate called before each MCP server is spawned. Lets the caller (REPL or\n * SDK) prompt the user for explicit approval of a subprocess binary.\n * Return `true` to allow, `false` to reject.\n */\nexport type McpApprovalCallback = (server: McpServerConfig) => Promise<boolean> | boolean;\n\nexport interface McpClientOptions {\n /** Names of servers the user has already trusted (config.mcp.trusted). */\n trustedServers?: string[];\n /** Approval gate invoked when a server is NOT in the trusted list. */\n approvalCallback?: McpApprovalCallback;\n}\n\nexport class McpClient {\n private static activeProcessPids = new Set<number>();\n\n /** \n * Forcefully kills all known MCP child processes. \n * Call this from global process exit handlers to prevent zombie processes.\n */\n static killAllProcesses(): void {\n for (const pid of McpClient.activeProcessPids) {\n try {\n process.kill(pid, 'SIGKILL');\n } catch {\n // Ignore errors (process already dead, etc.)\n }\n }\n McpClient.activeProcessPids.clear();\n }\n\n private clients: Map<string, Client> = new Map();\n private transports: Map<string, StdioClientTransport> = new Map();\n private tools: Map<string, McpTool> = new Map();\n private trustedServers: Set<string>;\n private approvalCallback: McpApprovalCallback | undefined;\n\n constructor(options: McpClientOptions = {}) {\n this.trustedServers = new Set(options.trustedServers ?? []);\n this.approvalCallback = options.approvalCallback;\n }\n\n async connect(server: McpServerConfig): Promise<void> {\n // Spawning an arbitrary subprocess is the riskiest operation in the\n // tool system — the MCP command could be anything, including curl or a\n // shell. Require explicit trust before transport creation.\n if (!this.trustedServers.has(server.name)) {\n const approved = this.approvalCallback\n ? await this.approvalCallback(server)\n : false;\n if (!approved) {\n throw new Error(\n `MCP server \"${server.name}\" is not trusted. Add it to config.mcp.trusted or approve interactively before connecting.`,\n );\n }\n this.trustedServers.add(server.name);\n }\n\n const transport = new StdioClientTransport({\n command: server.command,\n args: server.args ?? [],\n env: { ...process.env, ...(server.env ?? {}) } as Record<string, string>,\n });\n\n const client = new Client(\n { name: 'cascade-ai', version: '0.1.0' },\n { capabilities: {} },\n );\n\n await client.connect(transport);\n this.clients.set(server.name, client);\n this.transports.set(server.name, transport);\n\n // Accessing undocumented but public getter in SDK\n if (transport.pid) McpClient.activeProcessPids.add(transport.pid);\n\n // Discover tools from this server. If another server already registered\n // a tool with the same bare name, emit a console warning but keep the\n // new key distinct (we namespace internally as `<server>::<tool>`).\n const toolsResult = await client.listTools();\n for (const tool of toolsResult.tools) {\n for (const existing of this.tools.values()) {\n if (existing.name === tool.name && existing.serverName !== server.name) {\n console.warn(\n `[mcp] Tool \"${tool.name}\" is exposed by both \"${existing.serverName}\" and \"${server.name}\". ` +\n `Cascade disambiguates internally via mcp::<server>::<tool>.`,\n );\n break;\n }\n }\n this.tools.set(`${server.name}::${tool.name}`, {\n serverName: server.name,\n name: tool.name,\n description: tool.description ?? '',\n inputSchema: tool.inputSchema as Record<string, unknown>,\n });\n }\n }\n\n async disconnect(serverName: string): Promise<void> {\n const client = this.clients.get(serverName);\n if (client) {\n const transport = this.transports.get(serverName);\n // Accessing undocumented but public getter in SDK\n if (transport?.pid) McpClient.activeProcessPids.delete(transport.pid);\n\n await client.close();\n this.clients.delete(serverName);\n this.transports.delete(serverName);\n for (const key of this.tools.keys()) {\n if (key.startsWith(`${serverName}::`)) this.tools.delete(key);\n }\n }\n }\n\n async disconnectAll(): Promise<void> {\n for (const name of this.clients.keys()) {\n await this.disconnect(name);\n }\n }\n\n async callTool(serverName: string, toolName: string, input: Record<string, unknown>): Promise<string> {\n const client = this.clients.get(serverName);\n if (!client) throw new Error(`MCP server not connected: ${serverName}`);\n\n const result = await client.callTool({ name: toolName, arguments: input });\n const content = result.content as Array<{ type: string; text?: string }>;\n return content.map((c) => c.text ?? '').join('\\n');\n }\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => ({\n name: `mcp::${t.serverName}::${t.name}`,\n description: `[MCP:${t.serverName}] ${t.description}`,\n inputSchema: t.inputSchema,\n }));\n }\n\n getConnectedServers(): string[] {\n return Array.from(this.clients.keys());\n }\n\n getActivePids(): number[] {\n const pids: number[] = [];\n for (const transport of this.transports.values()) {\n // Accessing undocumented but public getter in SDK\n if (transport.pid) pids.push(transport.pid);\n }\n return pids;\n }\n\n isConnected(serverName: string): boolean {\n return this.clients.has(serverName);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Permission Escalator\n// Routes T3 approval requests up: T2 → T1 → User\n// ─────────────────────────────────────────────\n\nimport EventEmitter from 'node:events';\nimport { randomUUID } from 'node:crypto';\nimport type { PermissionDecision, PermissionRequest } from '../../types.js';\n\n/** Tools that are inherently safe — T2 auto-approves via rules (no LLM call) */\nconst SAFE_TOOLS = new Set([\n 'file_read',\n 'file_list',\n 'git_status',\n 'git_log',\n 'git_diff',\n 'image_analyze',\n 'peer_message',\n 'diff_view',\n]);\n\ntype T2Evaluator = (req: PermissionRequest) => Promise<PermissionDecision | null>;\ntype T1Evaluator = (req: PermissionRequest) => Promise<PermissionDecision | null>;\n\n/**\n * PermissionEscalator manages the hierarchical permission flow for a single task run.\n *\n * Decision cascade:\n * 1. Check session cache (section-wide key `${t2Id}:${toolName}`) → return if hit\n * 2. Ask T2 evaluator → if decision returned, cache + return\n * 3. Ask T1 evaluator → if decision returned, cache + return\n * 4. Emit `permission:user-required` → wait for external decision via `resolveUserDecision()`\n */\nexport class PermissionEscalator extends EventEmitter {\n /**\n * Session cache keyed by `${t2Id}:${toolName}`.\n * All T3 workers under the same T2 share cached decisions for the same tool.\n */\n private sessionCache = new Map<string, boolean>();\n\n private t2Evaluator?: T2Evaluator;\n private t1Evaluator?: T1Evaluator;\n\n /** Pending user-decision resolvers keyed by request ID */\n private pendingUserDecisions = new Map<\n string,\n (decision: PermissionDecision) => void\n >();\n\n setT2Evaluator(evaluator: T2Evaluator): void {\n this.t2Evaluator = evaluator;\n }\n\n setT1Evaluator(evaluator: T1Evaluator): void {\n this.t1Evaluator = evaluator;\n }\n\n /**\n * Main entry point. Called by T3Worker instead of emitting `tool:approval-request`.\n * Returns a PermissionDecision from whichever tier was able to decide.\n */\n async requestPermission(req: PermissionRequest): Promise<PermissionDecision> {\n const cacheKey = `${req.parentT2Id}:${req.toolName}`;\n\n // ── 1. Check session cache ────────────────\n if (this.sessionCache.has(cacheKey)) {\n return {\n requestId: req.id,\n approved: this.sessionCache.get(cacheKey)!,\n always: true,\n decidedBy: 'T2',\n reasoning: 'Cached from previous decision in this session',\n };\n }\n\n // ── 2. Non-dangerous safe tools → rule-based auto-approve ──\n if (!req.isDangerous && SAFE_TOOLS.has(req.toolName)) {\n const decision: PermissionDecision = {\n requestId: req.id,\n approved: true,\n always: true,\n decidedBy: 'T2',\n reasoning: `${req.toolName} is a read-only safe tool — auto-approved`,\n };\n this.sessionCache.set(cacheKey, true);\n return decision;\n }\n\n // ── 3. Ask T2 evaluator ───────────────────\n if (this.t2Evaluator) {\n try {\n const t2Decision = await this.t2Evaluator(req);\n if (t2Decision !== null) {\n if (t2Decision.always) this.sessionCache.set(cacheKey, t2Decision.approved);\n return t2Decision;\n }\n } catch {\n // T2 evaluator failed — escalate without caching\n }\n }\n\n // ── 4. Ask T1 evaluator ───────────────────\n if (this.t1Evaluator) {\n try {\n const t1Decision = await this.t1Evaluator(req);\n if (t1Decision !== null) {\n if (t1Decision.always) this.sessionCache.set(cacheKey, t1Decision.approved);\n return t1Decision;\n }\n } catch {\n // T1 evaluator failed — escalate to user\n }\n }\n\n // ── 5. Escalate to user ───────────────────\n return this.waitForUserDecision(req);\n }\n\n /**\n * Called by the REPL/SDK once the user has made a decision.\n * Only has effect when a request is actually pending.\n */\n resolveUserDecision(requestId: string, approved: boolean, always?: boolean): void {\n const resolver = this.pendingUserDecisions.get(requestId);\n if (!resolver) return;\n\n this.pendingUserDecisions.delete(requestId);\n const decision: PermissionDecision = {\n requestId,\n approved,\n always,\n decidedBy: 'USER',\n };\n\n if (always) {\n // Find the cacheKey — walk pending list to find the T2 ID association\n // At this point we cache under a generic `user:${toolName}` scope\n // (the req itself is gone — resolver captures it by closure in waitForUserDecision)\n }\n\n resolver(decision);\n }\n\n private waitForUserDecision(req: PermissionRequest): Promise<PermissionDecision> {\n return new Promise<PermissionDecision>((resolve) => {\n const wrappedResolver = (decision: PermissionDecision) => {\n if (decision.always) {\n this.sessionCache.set(`${req.parentT2Id}:${req.toolName}`, decision.approved);\n }\n resolve(decision);\n };\n\n this.pendingUserDecisions.set(req.id, wrappedResolver);\n\n // Emit event so cascade.ts / REPL can pick it up\n this.emit('permission:user-required', req);\n });\n }\n\n /** Check if there are permissions waiting for user input */\n hasPendingUserDecisions(): boolean {\n return this.pendingUserDecisions.size > 0;\n }\n\n /** Deny all pending user decisions (used on task cancel) */\n cancelAllPending(): void {\n for (const [id, resolver] of this.pendingUserDecisions) {\n resolver({ requestId: id, approved: false, decidedBy: 'USER', reasoning: 'Task cancelled' });\n }\n this.pendingUserDecisions.clear();\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Config Schema (Zod)\n// ─────────────────────────────────────────────\n\nimport { z } from 'zod';\n\nexport const ProviderConfigSchema = z.object({\n type: z.enum(['anthropic', 'openai', 'gemini', 'azure', 'openai-compatible', 'ollama']),\n apiKey: z.string().optional(),\n baseUrl: z.string().url().optional(),\n deploymentName: z.string().optional(),\n apiVersion: z.string().optional(),\n model: z.string().optional(),\n});\n\nexport const ModelOverridesSchema = z.object({\n t1: z.string().optional(),\n t2: z.string().optional(),\n t3: z.string().optional(),\n vision: z.string().optional(),\n});\n\nexport const McpServerConfigSchema = z.object({\n name: z.string(),\n command: z.string(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string()).optional(),\n});\n\nexport const WebSearchConfigSchema = z.object({\n /** Base URL of your SearXNG instance (e.g. http://localhost:8080) */\n searxngUrl: z.string().optional(),\n /** Brave Search API key — get one at https://api.search.brave.com */\n braveApiKey: z.string().optional(),\n /** Tavily API key — get one at https://tavily.com */\n tavilyApiKey: z.string().optional(),\n /** Max results per search (default 5) */\n maxResults: z.number().default(5),\n});\n\nexport const ToolsConfigSchema = z.object({\n shellAllowlist: z.array(z.string()).default([]),\n shellBlocklist: z.array(z.string()).default(['rm -rf', 'sudo rm', 'format', 'mkfs']),\n requireApprovalFor: z.array(z.string()).default([]),\n browserEnabled: z.boolean().default(false),\n mcpServers: z.array(McpServerConfigSchema).optional(),\n /** Web search backends — at least one should be configured for best results */\n webSearch: WebSearchConfigSchema.optional(),\n});\n\nexport const HookDefinitionSchema = z.object({\n command: z.string(),\n tools: z.array(z.string()).optional(),\n timeout: z.number().optional(),\n});\n\nexport const HooksConfigSchema = z.object({\n preToolUse: z.array(HookDefinitionSchema).optional(),\n postToolUse: z.array(HookDefinitionSchema).optional(),\n preTask: z.array(HookDefinitionSchema).optional(),\n postTask: z.array(HookDefinitionSchema).optional(),\n});\n\nexport const DashboardConfigSchema = z.object({\n port: z.number().default(4891),\n auth: z.boolean().default(true),\n teamMode: z.enum(['single', 'multi']).default('single'),\n secret: z.string().optional(),\n});\n\nexport const TelemetryConfigSchema = z.object({\n enabled: z.boolean().default(false),\n posthogApiKey: z.string().optional(),\n distinctId: z.string().optional(),\n});\n\nexport const MemoryConfigSchema = z.object({\n maxSessionMessages: z.number().default(1000),\n autoSummarizeAt: z.number().default(150_000),\n retentionDays: z.number().default(90),\n});\n\nexport const TierLimitsSchema = z.object({\n t1MaxTokens: z.number().optional(),\n t2MaxTokens: z.number().optional(),\n t3MaxTokens: z.number().optional(),\n});\n\nexport const BudgetConfigSchema = z.object({\n dailyBudgetUsd: z.number().optional(),\n sessionBudgetUsd: z.number().optional(),\n warnAtPct: z.number().default(80),\n});\n\nexport const WorkspaceConfigSchema = z.object({\n cascadeMdPath: z.string().default('CASCADE.md'),\n configPath: z.string().default('.cascade/config.json'),\n keystorePath: z.string().default('.cascade/keystore.enc'),\n auditLogPath: z.string().default('.cascade/audit.log'),\n});\n\nexport const CascadeConfigSchema = z.object({\n version: z.literal('1.0').default('1.0'),\n defaultIdentityId: z.string().optional(),\n providers: z.array(ProviderConfigSchema).default([]),\n models: ModelOverridesSchema.default({}),\n tools: ToolsConfigSchema.default({}),\n hooks: HooksConfigSchema.default({}),\n dashboard: DashboardConfigSchema.default({}),\n telemetry: TelemetryConfigSchema.default({}),\n memory: MemoryConfigSchema.default({}),\n tierLimits: TierLimitsSchema.default({}),\n budget: BudgetConfigSchema.default({}),\n theme: z.string().default('cascade'),\n workspace: WorkspaceConfigSchema.default({}),\n /**\n * Cascade Auto: when true, the TaskAnalyzer selects the optimal model for each\n * tier based on task type and complexity, overriding the static priority lists.\n * Heuristic-first with AI inference fallback (adds ~0–500ms per task).\n */\n cascadeAuto: z.boolean().default(false),\n /**\n * Runtime Tool Creation: when true, T3 workers can generate and register new tools\n * at runtime via the ToolCreator when no existing tool can handle a required operation.\n * Generated tools are session-scoped and sandboxed in node:vm.\n * HTTP calls from generated tools require approval.\n */\n enableToolCreation: z.boolean().default(true),\n /**\n * External plugin paths or npm package names to load at startup.\n * Each entry must export a default ToolPlugin object.\n * Example: [\"./plugins/my-tool.js\", \"cascade-plugin-slack\"]\n */\n plugins: z.array(z.string()).default([]),\n /**\n * Maximum number of concurrent inference requests to any local model provider\n * (e.g. Ollama). Defaults to 1 to prevent GPU memory pressure when multiple\n * T3 workers run in parallel on a single-GPU machine.\n */\n localConcurrency: z.number().int().min(1).default(1),\n /**\n * Timeout in milliseconds for a single local model inference call.\n * Local models can take minutes for large parameter counts. Default: 5 minutes.\n */\n localInferenceTimeoutMs: z.number().int().min(1000).default(300_000),\n});\n\nexport type CascadeConfigInput = z.input<typeof CascadeConfigSchema>;\n","// ─────────────────────────────────────────────\n// Cascade AI — Config Validator\n// ─────────────────────────────────────────────\n\nimport { z } from 'zod';\nimport { CascadeConfigSchema } from './schema.js';\nimport type { CascadeConfig } from '../types.js';\n\nexport class CascadeConfigError extends Error {\n public readonly issues: z.ZodIssue[];\n\n constructor(result: z.SafeParseError<unknown>) {\n const summary = result.error.issues\n .map((i) => ` • ${i.path.join('.')}: ${i.message}`)\n .join('\\n');\n super(`Invalid cascade configuration:\\n${summary}`);\n this.name = 'CascadeConfigError';\n this.issues = result.error.issues;\n }\n}\n\n/**\n * Validates raw config input (from YAML, JSON, or programmatic usage) against\n * the Zod CascadeConfigSchema. Throws `CascadeConfigError` with a detailed\n * issue list if validation fails.\n *\n * @param raw - Untrusted config object (e.g. from fs.readFileSync + yaml.parse)\n * @returns A fully populated, type-safe `CascadeConfig` with all defaults applied.\n */\nexport function validateConfig(raw: unknown): CascadeConfig {\n const result = CascadeConfigSchema.safeParse(raw);\n if (!result.success) {\n throw new CascadeConfigError(result);\n }\n return result.data as unknown as CascadeConfig;\n}\n\n/**\n * Like `validateConfig` but returns `null` on failure instead of throwing.\n * Useful for config file watchers where you want to log and skip.\n */\nexport function tryValidateConfig(raw: unknown): CascadeConfig | null {\n try {\n return validateConfig(raw);\n } catch {\n return null;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Opt-in Telemetry (PostHog)\n// ─────────────────────────────────────────────\n\nimport type { TaskComplexity, TelemetryConfig, TierRole } from '../types.js';\n\n// ── Typed event catalogue ──────────────────────\n\nexport interface TelemetryEvents {\n 'cascade:session_start': {\n complexity?: TaskComplexity;\n providerCount: number;\n cascadeAutoEnabled: boolean;\n toolCreationEnabled: boolean;\n };\n 'cascade:session_end': {\n durationMs: number;\n taskCount: number;\n totalTokens: number;\n totalCostUsd: number;\n };\n 'cascade:task_complete': {\n complexity: TaskComplexity;\n tier: TierRole | 'simple';\n durationMs: number;\n tokenCount: number;\n costUsd: number;\n t2Count: number;\n t3Count: number;\n };\n 'cascade:task_failed': {\n tier: TierRole;\n errorType: string;\n complexity?: TaskComplexity;\n };\n 'cascade:tool_executed': {\n toolName: string;\n tier: TierRole;\n success: boolean;\n durationMs?: number;\n };\n 'cascade:tool_created': {\n name: string;\n description: string;\n };\n 'cascade:model_selected': {\n tier: TierRole;\n modelId: string;\n provider: string;\n reason: 'config_override' | 'cascade_auto' | 'priority_list' | 'fallback';\n complexity?: number;\n };\n 'cascade:peer_sync': {\n syncType: string;\n tier: 'T2' | 'T3';\n participantCount: number;\n };\n 'cascade:escalation': {\n fromTier: TierRole;\n toTier: TierRole | 'user';\n toolName: string;\n approved: boolean;\n };\n 'cascade:provider_failover': {\n from: string;\n to: string;\n reason: string;\n };\n 'cascade:t2_overlap_detected': {\n sectionCount: number;\n overlapCount: number;\n switchedToSequential: boolean;\n };\n 'cascade:file_lock_contention': {\n filePath: string;\n waitMs: number;\n };\n}\n\nexport type TelemetryEventName = keyof TelemetryEvents;\n\nexport class Telemetry {\n private client: unknown = null;\n private enabled: boolean;\n private distinctId: string;\n\n constructor(config: TelemetryConfig, distinctId: string) {\n this.enabled = config.enabled;\n this.distinctId = distinctId;\n if (config.enabled && config.posthogApiKey) {\n this.init(config.posthogApiKey);\n }\n }\n\n private init(apiKey: string): void {\n // Dynamically import PostHog to avoid loading it when telemetry is off\n import('posthog-node').then(({ PostHog }) => {\n this.client = new PostHog(apiKey, { host: 'https://app.posthog.com' });\n }).catch(() => { /* PostHog unavailable */ });\n }\n\n /**\n * Capture a typed telemetry event. Silently no-ops if telemetry is disabled.\n */\n capture<E extends TelemetryEventName>(event: E, properties: TelemetryEvents[E]): void;\n capture(event: string, properties?: Record<string, unknown>): void;\n capture(event: string, properties?: Record<string, unknown>): void {\n if (!this.enabled || !this.client) return;\n try {\n const ph = this.client as { capture: (opts: unknown) => void };\n ph.capture({ distinctId: this.distinctId, event, properties });\n } catch { /* never throw on telemetry */ }\n }\n\n async shutdown(): Promise<void> {\n if (!this.client) return;\n try {\n const ph = this.client as { shutdown: () => Promise<void> };\n await ph.shutdown();\n } catch { /* ignore */ }\n }\n}\n\n// No-op telemetry for when it's disabled\nexport const noopTelemetry: Pick<Telemetry, 'capture' | 'shutdown'> = {\n capture: () => {},\n shutdown: async () => {},\n};\n","// ─────────────────────────────────────────────\n// Cascade AI — Task Analyzer (Cascade Auto)\n// ─────────────────────────────────────────────\n//\n// Cascade Auto selects the optimal model for each tier based on task analysis.\n// Pure heuristic scoring — no AI calls for model selection.\n// Adapts over time via ModelPerformanceTracker (session + persistent stats).\n\nimport type { TierRole, ModelInfo } from '../../types.js';\nimport type { ModelSelector } from './selector.js';\nimport type { ModelPerformanceTracker } from './model-performance-tracker.js';\n\nexport type TaskType = 'code' | 'analysis' | 'creative' | 'data' | 'mixed';\n\nexport interface TaskProfile {\n type: TaskType;\n /** 1 = trivial, 5 = research-grade */\n complexity: 1 | 2 | 3 | 4 | 5;\n requiresReasoning: boolean;\n requiresVision: boolean;\n estimatedTokens: number;\n /** 0.0–1.0 heuristic confidence; below 0.7 triggers AI fallback */\n confidence: number;\n}\n\n// ── Heuristic scoring tables ───────────────────\n\nconst CODE_SIGNALS = [\n /\\b(?:function|class|interface|async|await|import|export|const|let|var|def|return|if|else|for|while|try|catch)\\b/,\n /\\b(?:typescript|javascript|python|rust|go|java|c\\+\\+|sql|bash|shell|dockerfile|kubernetes|terraform)\\b/i,\n /\\b(?:implement|refactor|debug|fix|write.*code|create.*function|add.*method|parse|compile|build|test|deploy)\\b/i,\n /[{}[\\]()=>]/, // Code-like punctuation density\n];\n\nconst ANALYSIS_SIGNALS = [\n /\\b(?:analyze|analyse|explain|describe|compare|evaluate|assess|review|summarize|understand|interpret)\\b/i,\n /\\b(?:why|what.*cause|how.*work|difference.*between|pros.*cons|trade.?off|benchmark)\\b/i,\n];\n\nconst CREATIVE_SIGNALS = [\n /\\b(?:write|draft|compose|create.*story|generate.*text|poem|essay|blog|article|email|proposal)\\b/i,\n /\\b(?:creative|imaginative|fictional|narrative|persuasive|marketing)\\b/i,\n];\n\nconst DATA_SIGNALS = [\n /\\b(?:csv|json|yaml|xml|excel|spreadsheet|dataframe|dataset|sql|query|aggregate|pivot)\\b/i,\n /\\b(?:statistics|chart|graph|visualize|plot|correlation|regression|cluster)\\b/i,\n];\n\nconst HIGH_COMPLEXITY_SIGNALS = [\n /\\b(?:architect|design.*system|distributed|microservice|scalab|performance|optimiz|refactor.*entire|migrate)\\b/i,\n /\\b(?:research|comprehensive|detailed|in-depth|thorough|complete|full.*implementation)\\b/i,\n /multiple.*file|several.*component|entire.*codebase|whole.*project/i,\n];\n\nconst LOW_COMPLEXITY_SIGNALS = [\n /\\b(?:simple|quick|brief|short|small|single|one-line|rename|typo|hello world)\\b/i,\n /^(?:hi|hello|thanks|ok|yes|no|what is|list|show me|tell me)\\b/i,\n];\n\n// ── Heuristic analyser ─────────────────────────\n\nfunction scoreText(text: string, patterns: RegExp[]): number {\n return patterns.reduce((score, re) => score + (re.test(text) ? 1 : 0), 0);\n}\n\nfunction heuristicAnalyze(prompt: string): TaskProfile {\n const lower = prompt.toLowerCase();\n\n const codeScore = scoreText(lower, CODE_SIGNALS);\n const analysisScore = scoreText(lower, ANALYSIS_SIGNALS);\n const creativeScore = scoreText(lower, CREATIVE_SIGNALS);\n const dataScore = scoreText(lower, DATA_SIGNALS);\n const highComplexityScore = scoreText(lower, HIGH_COMPLEXITY_SIGNALS);\n const lowComplexityScore = scoreText(lower, LOW_COMPLEXITY_SIGNALS);\n\n // Determine primary type\n const scores: Record<TaskType, number> = {\n code: codeScore,\n analysis: analysisScore,\n creative: creativeScore,\n data: dataScore,\n mixed: 0,\n };\n const maxScore = Math.max(...Object.values(scores));\n const topTypes = (Object.entries(scores) as [TaskType, number][]).filter(([, s]) => s === maxScore && s > 0);\n const type: TaskType = topTypes.length === 1 ? topTypes[0]![0] : 'mixed';\n\n // Determine complexity (1-5)\n const wordCount = prompt.split(/\\s+/).length;\n let complexity: 1 | 2 | 3 | 4 | 5 = 3;\n if (lowComplexityScore > 0 || wordCount < 10) complexity = 1;\n else if (highComplexityScore >= 2 || wordCount > 200) complexity = 5;\n else if (highComplexityScore === 1 || wordCount > 80) complexity = 4;\n else if (wordCount > 30) complexity = 3;\n else complexity = 2;\n\n // Confidence = how clearly the signals point to one type\n const totalSignals = Object.values(scores).reduce((a, b) => a + b, 0);\n const confidence = totalSignals === 0 ? 0.3 : Math.min(0.95, (maxScore / totalSignals) * (maxScore > 0 ? 1 : 0.3));\n\n const requiresReasoning = complexity >= 4 || analysisScore > 1;\n const requiresVision = /\\b(?:image|screenshot|photo|diagram|figure|visual)\\b/i.test(lower);\n const estimatedTokens = wordCount * 5; // rough token estimate\n\n return { type, complexity, requiresReasoning, requiresVision, estimatedTokens, confidence };\n}\n\n// ── Model selection from profile ───────────────\n\n// ── TaskAnalyzer class ─────────────────────────\n\n/** Prompt hash cache — avoids repeated analysis of the same input within a session. */\nconst analysisCache = new Map<string, TaskProfile>();\n\n// Map from task type to relevant model specialization tags\nconst TASK_TYPE_TAGS: Record<TaskType, string[]> = {\n code: ['code', 'instruction'],\n analysis: ['analysis', 'instruction'],\n creative: ['creative', 'multilingual'],\n data: ['data', 'code'],\n mixed: [],\n};\n\nexport class TaskAnalyzer {\n private tracker?: ModelPerformanceTracker;\n private lastProfile: TaskProfile | null = null;\n private lastSelectedModels = new Map<TierRole, ModelInfo>();\n\n constructor(tracker?: ModelPerformanceTracker) {\n this.tracker = tracker;\n }\n\n setTracker(tracker: ModelPerformanceTracker): void {\n this.tracker = tracker;\n }\n\n /** Returns the TaskProfile from the most recent analyze() call — used for outcome recording. */\n getLastProfile(): TaskProfile | null {\n return this.lastProfile;\n }\n\n /**\n * Analyze a prompt and return a TaskProfile using pure heuristics.\n * Low confidence prompts fall back to a conservative mixed/moderate profile.\n */\n async analyze(prompt: string): Promise<TaskProfile> {\n const cacheKey = prompt.slice(0, 200);\n const cached = analysisCache.get(cacheKey);\n if (cached) {\n this.lastProfile = cached;\n return cached;\n }\n\n const profile = heuristicAnalyze(prompt);\n analysisCache.set(cacheKey, profile);\n this.lastProfile = profile;\n return profile;\n }\n\n /**\n * Select the optimal model for a given tier.\n * Scores tier-eligible models using cost efficiency + historical performance.\n * Falls back to the priority-list default when no candidates have history.\n */\n async selectModel(\n prompt: string,\n tier: TierRole,\n selector: ModelSelector,\n ): Promise<ModelInfo | null> {\n const profile = await this.analyze(prompt);\n\n // Vision tasks: always route to a vision-capable model\n if (profile.requiresVision) {\n return selector.selectVisionModel();\n }\n\n const candidates = selector.getCandidatesForTier(tier);\n if (candidates.length === 0) return selector.selectForTier(tier);\n\n const scored = candidates.map(m => ({\n model: m,\n score: this.scoreModel(m, profile),\n }));\n scored.sort((a, b) => b.score - a.score);\n\n const best = scored[0]?.model ?? selector.selectForTier(tier);\n if (best) this.lastSelectedModels.set(tier, best);\n return best;\n }\n\n /**\n * Record the outcome of a completed run across all tiers that were selected\n * during this session and persist stats to disk.\n */\n recordRunOutcome(outcome: 'success' | 'failure', costByTier: Record<string, number>): void {\n if (!this.tracker || !this.lastProfile) return;\n const taskType = this.lastProfile.type;\n for (const [tier, model] of this.lastSelectedModels) {\n const cost = costByTier[tier] ?? 0;\n this.tracker.record(model.id, taskType, outcome, 0, cost);\n }\n this.lastSelectedModels.clear();\n void this.tracker.save();\n }\n\n private scoreModel(model: ModelInfo, profile: TaskProfile): number {\n const perf = this.tracker?.performanceScore(model.id, profile.type) ?? 0.5;\n const costEff = this.costEfficiency(model, profile.complexity);\n const match = this.taskMatchScore(model, profile);\n return perf * costEff * match;\n }\n\n private costEfficiency(model: ModelInfo, complexity: 1 | 2 | 3 | 4 | 5): number {\n if (this.tracker) return this.tracker.costEfficiencyScore(model, complexity);\n // Same formula without the tracker instance\n const blended = model.inputCostPer1kTokens + model.outputCostPer1kTokens * 2;\n const normalised = Math.min(1.0, blended / 0.05);\n const complexityWeight = (6 - complexity) / 5;\n return Math.max(0.1, 1 - normalised * complexityWeight);\n }\n\n private taskMatchScore(model: ModelInfo, profile: TaskProfile): number {\n const expected = TASK_TYPE_TAGS[profile.type];\n if (!model.specializations?.length || expected.length === 0) return 1.0;\n const matches = expected.filter(tag => model.specializations!.includes(tag)).length;\n // Boost 30% for full match, slight penalty for zero match vs a specialised competitor\n return matches > 0 ? 1.0 + (matches / expected.length) * 0.3 : 0.8;\n }\n\n /** Clear the analysis cache (call between sessions). */\n static clearCache(): void {\n analysisCache.clear();\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Model Performance Tracker\n// ─────────────────────────────────────────────\n//\n// Non-AI auto-updating model selection support.\n// Records per-(model, taskType) outcomes across sessions and returns\n// numeric scores that drive cost-efficient model selection.\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { ModelInfo } from '../../types.js';\nimport type { TaskType } from './task-analyzer.js';\n\ninterface ModelStat {\n successCount: number;\n failureCount: number;\n totalRetries: number;\n totalCostUsd: number;\n sampleCount: number;\n}\n\nconst DEFAULT_STATS_FILE = path.join(os.homedir(), '.cascade', 'model-perf.json');\n\nexport class ModelPerformanceTracker {\n private stats = new Map<string, ModelStat>();\n private readonly statsFile: string;\n private loaded = false;\n\n constructor(statsFile = DEFAULT_STATS_FILE) {\n this.statsFile = statsFile;\n }\n\n async load(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = await fs.readFile(this.statsFile, 'utf-8');\n const parsed = JSON.parse(raw) as Record<string, ModelStat>;\n for (const [key, stat] of Object.entries(parsed)) {\n this.stats.set(key, stat);\n }\n } catch {\n // File doesn't exist yet — start fresh\n }\n }\n\n async save(): Promise<void> {\n try {\n await fs.mkdir(path.dirname(this.statsFile), { recursive: true });\n const obj: Record<string, ModelStat> = {};\n for (const [key, stat] of this.stats) obj[key] = stat;\n await fs.writeFile(this.statsFile, JSON.stringify(obj, null, 2), 'utf-8');\n } catch { /* non-critical */ }\n }\n\n record(\n modelId: string,\n taskType: TaskType,\n outcome: 'success' | 'failure',\n retries = 0,\n costUsd = 0,\n ): void {\n const key = `${modelId}:${taskType}`;\n const s = this.stats.get(key) ?? {\n successCount: 0, failureCount: 0, totalRetries: 0, totalCostUsd: 0, sampleCount: 0,\n };\n this.stats.set(key, {\n successCount: s.successCount + (outcome === 'success' ? 1 : 0),\n failureCount: s.failureCount + (outcome === 'failure' ? 1 : 0),\n totalRetries: s.totalRetries + retries,\n totalCostUsd: s.totalCostUsd + costUsd,\n sampleCount: s.sampleCount + 1,\n });\n }\n\n /**\n * Returns 0.05–1.0; defaults to 0.5 (neutral prior) when no history exists.\n * High retry counts penalise the score.\n */\n performanceScore(modelId: string, taskType: TaskType): number {\n const key = `${modelId}:${taskType}`;\n const s = this.stats.get(key);\n if (!s || s.sampleCount === 0) return 0.5;\n const successRate = s.successCount / s.sampleCount;\n const avgRetries = s.totalRetries / s.sampleCount;\n const retryPenalty = Math.min(0.4, avgRetries / 3);\n return Math.max(0.05, successRate * (1 - retryPenalty));\n }\n\n /**\n * Returns 0.1–1.0. Cheaper models score higher, with the penalty scaled\n * down for complex tasks (where capability matters more than cost).\n *\n * blended cost = input + 2 × output (output tokens are typically pricier).\n * normalised over $0.05 blended as the \"expensive\" ceiling.\n */\n costEfficiencyScore(model: ModelInfo, complexity: 1 | 2 | 3 | 4 | 5): number {\n const blended = model.inputCostPer1kTokens + model.outputCostPer1kTokens * 2;\n const normalised = Math.min(1.0, blended / 0.05);\n // complexityWeight: 1.0 for trivial tasks → 0.2 for research-grade\n const complexityWeight = (6 - complexity) / 5;\n return Math.max(0.1, 1 - normalised * complexityWeight);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Runtime Tool Creator (opt-in)\n// ─────────────────────────────────────────────\n//\n// Allows Cascade to generate and register new tools at runtime when no\n// existing tool can handle a required operation.\n//\n// SAFETY:\n// - Requires `enableToolCreation: true` in config (on by default)\n// - Generated tools run in node:vm with a restricted sandbox\n// - Generated tools CAN call existing registered cascade tools via callTool()\n// - Dangerous tool access requires approval via the PermissionEscalator chain\n// (T3 → T2 → T1 → user) before execution\n// - Tools are session-scoped and not persisted\n//\n\nimport { createContext, runInContext } from 'node:vm';\nimport { BaseTool } from './base.js';\nimport type { ToolExecuteOptions } from '../types.js';\nimport type { ToolRegistry } from './registry.js';\nimport type { CascadeRouter } from '../core/router/index.js';\nimport type { PermissionEscalator } from '../core/permissions/escalator.js';\nimport type { PermissionRequest } from '../types.js';\n\n// ── Generated tool schema ──────────────────────\n\ninterface GeneratedToolSpec {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n /** Raw JS function body — receives `input`, `fetch`, and `callTool`. Returns string | Promise<string> */\n executeCode: string;\n isDangerous: boolean;\n}\n\n// ── Dynamic tool class factory ─────────────────\n\nclass DynamicTool extends BaseTool {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: Record<string, unknown>;\n private executeCode: string;\n private _isDangerous: boolean;\n private registry: ToolRegistry;\n private escalator?: PermissionEscalator;\n\n constructor(spec: GeneratedToolSpec, registry: ToolRegistry, escalator?: PermissionEscalator) {\n super();\n this.name = spec.name;\n this.description = spec.description;\n this.inputSchema = spec.inputSchema;\n this.executeCode = spec.executeCode;\n this._isDangerous = spec.isDangerous;\n this.registry = registry;\n this.escalator = escalator;\n }\n\n isDangerous(): boolean {\n return this._isDangerous;\n }\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const registry = this.registry;\n const escalator = this.escalator;\n\n // callTool gives generated tools access to the full registered cascade tool set.\n // Dangerous tools require escalation approval before running.\n const callTool = async (toolName: string, toolInput: Record<string, unknown>): Promise<string> => {\n if (!registry.hasTool(toolName)) return `Tool not found: ${toolName}`;\n\n if (registry.isDangerous(toolName)) {\n if (escalator) {\n const req: PermissionRequest = {\n id: `dynamic-${this.name}-${toolName}-${Date.now()}`,\n requestedBy: `dynamic_tool:${this.name}`,\n parentT2Id: options.tierId,\n toolName,\n input: toolInput,\n isDangerous: true,\n subtaskContext: `Dynamic tool \"${this.name}\" requesting access to \"${toolName}\"`,\n sectionContext: `Dynamic tool \"${this.name}\"`,\n };\n const decision = await escalator.requestPermission(req);\n if (!decision.approved) {\n return `Permission denied for ${toolName} (decided by ${decision.decidedBy}).`;\n }\n }\n // No escalator: fall through and let tool's own approval gate handle it\n }\n\n try {\n const result = await registry.execute(toolName, toolInput, options);\n return typeof result === 'string' ? result : JSON.stringify(result);\n } catch (err) {\n return `Error calling ${toolName}: ${err instanceof Error ? err.message : String(err)}`;\n }\n };\n\n // Sandbox: fetch, JSON, Math, Date, and callTool for cascade tool access\n const sandbox: Record<string, unknown> = {\n input,\n fetch: globalThis.fetch,\n callTool,\n JSON,\n Math,\n Date,\n console: { log: () => {}, error: () => {} },\n setTimeout,\n clearTimeout,\n Promise,\n Error,\n String,\n Number,\n Boolean,\n Array,\n Object,\n result: undefined as string | undefined,\n };\n\n const context = createContext(sandbox);\n const wrapped = `(async () => { ${this.executeCode} })().then(r => { result = String(r ?? ''); }).catch(e => { result = 'Tool error: ' + e.message; });`;\n\n try {\n const promise = runInContext(wrapped, context, {\n timeout: 15_000,\n breakOnSigint: true,\n filename: `dynamic_tool_${this.name}.js`,\n displayErrors: true,\n });\n await promise;\n return (sandbox['result'] as string | undefined) ?? '';\n } catch (err) {\n return `Dynamic tool error: ${err instanceof Error ? err.message : String(err)}`;\n }\n }\n}\n\n// ── ToolCreator class ──────────────────────────\n\nconst TOOL_CREATOR_PROMPT = `You are a tool-generation assistant for the Cascade AI system.\nGenerate a minimal, safe JavaScript tool function for the described operation.\n\nRules:\n- Return ONLY a JSON object with these fields: name, description, inputSchema, executeCode, isDangerous\n- executeCode is a self-contained JavaScript async function body that:\n - Receives: input (object), fetch (for HTTP), callTool(toolName, input) (to call any registered cascade tool)\n - Returns: a string result\n - For file operations, prefer: await callTool('file_read', { path: input.path })\n - For shell commands, prefer: await callTool('shell', { command: 'ls -la' })\n - For pure computation / HTTP: use fetch or built-ins (JSON, Math, Date, String, Number, Array, Object)\n - Must complete in under 15 seconds\n- isDangerous: true if the tool calls dangerous cascade tools (shell, file_write, file_delete, git) or makes HTTP calls that write data\n- name must be snake_case, start with \"dynamic_\", max 40 chars\n- description must be ≤ 120 chars\n\nExample for a file-summary tool:\n{\n \"name\": \"dynamic_summarize_file\",\n \"description\": \"Read a file and return a one-paragraph summary\",\n \"inputSchema\": { \"path\": { \"type\": \"string\", \"description\": \"File path to summarize\" } },\n \"executeCode\": \"const content = await callTool('file_read', { path: input.path }); return content.slice(0, 500);\",\n \"isDangerous\": false\n}\n\nReturn ONLY valid JSON — no other text.`;\n\nexport class ToolCreator {\n private router: CascadeRouter;\n private registry: ToolRegistry;\n private escalator?: PermissionEscalator;\n private createdTools: Set<string> = new Set();\n\n constructor(router: CascadeRouter, registry: ToolRegistry) {\n this.router = router;\n this.registry = registry;\n }\n\n setPermissionEscalator(escalator: PermissionEscalator): void {\n this.escalator = escalator;\n }\n\n /**\n * Generate a new tool from a description and register it with the ToolRegistry.\n * The generated tool has access to all registered cascade tools via callTool().\n * Returns the tool name if successful, null if generation failed.\n */\n async createTool(description: string, context: string): Promise<string | null> {\n const prompt = `${TOOL_CREATOR_PROMPT}\n\nTask context: ${context.slice(0, 200)}\nRequired capability: ${description.slice(0, 300)}`;\n\n try {\n const result = await this.router.generate('T3', {\n messages: [{ role: 'user', content: prompt }],\n maxTokens: 800,\n });\n\n const jsonMatch = /\\{[\\s\\S]*\\}/.exec(result.content);\n if (!jsonMatch) return null;\n\n const spec = JSON.parse(jsonMatch[0]) as GeneratedToolSpec;\n\n if (!spec.name || !spec.description || !spec.executeCode || !spec.inputSchema) return null;\n\n // Ensure unique name in this session\n if (this.createdTools.has(spec.name) || this.registry.hasTool(spec.name)) {\n spec.name = `${spec.name}_${Date.now() % 10000}`;\n }\n\n // Syntax check only — don't execute\n try {\n new Function('input', 'fetch', 'callTool', spec.executeCode);\n } catch {\n return null;\n }\n\n const tool = new DynamicTool(spec, this.registry, this.escalator);\n this.registry.register(tool);\n this.createdTools.add(spec.name);\n\n return spec.name;\n } catch {\n return null;\n }\n }\n\n /** Returns the names of all tools created in this session. */\n getCreatedTools(): string[] {\n return Array.from(this.createdTools);\n }\n}\n","import EventEmitter from 'node:events';\nimport { randomUUID } from 'node:crypto';\nimport path from 'node:path';\nimport { glob } from 'glob';\nimport type {\n ApprovalRequest,\n ApprovalResponse,\n CascadeConfig,\n CascadeRunOptions,\n CascadeRunResult,\n ConversationMessage,\n ImageAttachment,\n PermissionRequest,\n StreamChunk,\n TaskComplexity,\n TierRole,\n T3Result\n} from '../types.js';\nimport { CascadeRouter } from './router/index.js';\nimport { T1Administrator } from './tiers/t1-administrator.js';\nimport { T2Manager } from './tiers/t2-manager.js';\nimport { T3Worker } from './tiers/t3-worker.js';\nimport { ToolRegistry } from '../tools/registry.js';\nimport { McpClient } from '../mcp/client.js';\nimport { AuditLogger } from '../audit/log.js';\nimport { MemoryStore } from '../memory/store.js';\nimport { PermissionEscalator } from './permissions/escalator.js';\nimport { validateConfig } from '../config/validate.js';\nimport { Telemetry, noopTelemetry } from '../telemetry/index.js';\nimport { TaskAnalyzer } from './router/task-analyzer.js';\nimport { ModelPerformanceTracker } from './router/model-performance-tracker.js';\nimport { ToolCreator } from '../tools/tool-creator.js';\nimport { CascadeCancelledError } from '../utils/retry.js';\n\nexport class Cascade extends EventEmitter {\n private router: CascadeRouter;\n private toolRegistry: ToolRegistry;\n private mcpClient: McpClient;\n private config: CascadeConfig;\n private initialized = false;\n private initPromise?: Promise<void>;\n private store?: MemoryStore;\n private audit?: AuditLogger;\n private telemetry: Pick<Telemetry, 'capture' | 'shutdown'>;\n private taskAnalyzer?: TaskAnalyzer;\n private perfTracker?: ModelPerformanceTracker;\n private toolCreator?: ToolCreator;\n\n constructor(config: CascadeConfig, workspacePath: string, store?: MemoryStore) {\n super();\n // Validate config eagerly so users get a clear error at startup, not at run time\n this.config = validateConfig(config) as CascadeConfig;\n this.store = store;\n this.router = new CascadeRouter();\n this.mcpClient = new McpClient({\n trustedServers: this.config.tools.mcpTrusted,\n approvalCallback: async (server) => {\n // Surface as a generic permission event so REPL / dashboard / SDK\n // consumers can all plug the same approval dialog in.\n return await this.requestMcpApproval(server);\n },\n });\n this.toolRegistry = new ToolRegistry(this.config.tools, workspacePath);\n this.telemetry = config.telemetry?.enabled\n ? new Telemetry(config.telemetry, config.telemetry.distinctId ?? 'anonymous')\n : noopTelemetry;\n }\n\n private initOptionalFeatures(): void {\n if (this.config.cascadeAuto === true) {\n this.perfTracker = new ModelPerformanceTracker();\n void this.perfTracker.load(); // non-blocking; stats available before first run completes\n this.taskAnalyzer = new TaskAnalyzer(this.perfTracker);\n }\n const cfg = this.config as unknown as Record<string, unknown>;\n if (cfg['enableToolCreation'] === true) {\n this.toolCreator = new ToolCreator(this.router, this.toolRegistry);\n }\n }\n\n setStore(store: MemoryStore): void {\n this.store = store;\n }\n\n /**\n * Emit an `mcp:approval-required` event and wait up to 30 s for a listener\n * to resolve it via `cascade.resolveMcpApproval(serverName, approved)`.\n *\n * If no listener is attached (e.g. a non-interactive SDK run), the default\n * is to reject — safer than silently spawning an arbitrary subprocess.\n */\n private pendingMcpApprovals: Map<string, (approved: boolean) => void> = new Map();\n\n private async requestMcpApproval(server: { name: string; command: string; args?: string[] }): Promise<boolean> {\n // No listeners → reject. Callers can add a listener BEFORE init() runs\n // when they need to approve servers programmatically.\n if (this.listenerCount('mcp:approval-required') === 0) {\n return false;\n }\n return await new Promise<boolean>((resolve) => {\n this.pendingMcpApprovals.set(server.name, resolve);\n const timeout = setTimeout(() => {\n if (this.pendingMcpApprovals.delete(server.name)) resolve(false);\n }, 30_000);\n // If the caller resolves, also clear the timeout.\n const wrap = (approved: boolean) => {\n clearTimeout(timeout);\n resolve(approved);\n };\n this.pendingMcpApprovals.set(server.name, wrap);\n this.emit('mcp:approval-required', { server });\n });\n }\n\n /** Resolve a pending MCP server approval from a REPL / dashboard listener. */\n resolveMcpApproval(serverName: string, approved: boolean): void {\n const resolver = this.pendingMcpApprovals.get(serverName);\n if (resolver) {\n this.pendingMcpApprovals.delete(serverName);\n resolver(approved);\n }\n }\n\n async init(): Promise<void> {\n if (this.initialized) return;\n // Concurrent callers (e.g. the REPL eagerly calls init() and the first\n // run() also awaits init()) must share the SAME init promise. Otherwise\n // the MCP client would open duplicate connections and budget:warning\n // would be registered twice, causing double-emission.\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n await this.router.init(this.config);\n\n // Bubble budget:warning events from the router up to Cascade consumers\n this.router.on('budget:warning', (payload: {\n spentUsd: number;\n capUsd: number;\n spendPct: number;\n warnAtPct: number;\n remainingUsd: number;\n }) => {\n this.emit('budget:warning', payload);\n });\n\n // Budget hard-kill: cancel any pending user approvals and notify\n // consumers so the REPL/dashboard can tear down gracefully instead\n // of waiting for an approval that will never resolve.\n this.router.on('budget:exceeded', (payload: { reason: string; spentUsd: number }) => {\n this.emit('budget:exceeded', payload);\n for (const [name, resolver] of this.pendingMcpApprovals) {\n resolver(false);\n this.pendingMcpApprovals.delete(name);\n }\n });\n\n // Initialize MCP servers\n if (this.config.tools.mcpServers?.length) {\n for (const server of this.config.tools.mcpServers) {\n try {\n await this.mcpClient.connect(server);\n this.toolRegistry.registerMcpTools(this.mcpClient);\n } catch (err) {\n console.error(`Failed to connect to MCP server \"${server.name}\":`, err);\n }\n }\n }\n\n // Load external plugins declared in config.plugins\n const pluginPaths = (this.config as unknown as Record<string, unknown>)['plugins'] as string[] | undefined;\n if (pluginPaths?.length) {\n for (const pluginPath of pluginPaths) {\n try {\n const mod = await import(pluginPath);\n const plugin = (mod.default ?? mod) as import('../tools/registry.js').ToolPlugin;\n if (plugin && Array.isArray(plugin.tools)) {\n this.toolRegistry.registerPlugin(plugin);\n } else {\n console.warn(`[cascade] Plugin \"${pluginPath}\" does not export a valid ToolPlugin.`);\n }\n } catch (err) {\n console.warn(`[cascade] Failed to load plugin \"${pluginPath}\":`, err);\n }\n }\n }\n\n // Model specialization profiling (cascadeAuto mode) — non-blocking\n if (this.config.cascadeAuto && this.store) {\n this.router.profileModels(this.store).catch(() => { /* non-fatal */ });\n }\n\n this.initOptionalFeatures();\n this.initialized = true;\n })();\n\n try {\n await this.initPromise;\n } catch (err) {\n // Allow a retry after a failed init.\n this.initPromise = undefined;\n throw err;\n }\n }\n\n private isCasualGreeting(prompt: string): boolean {\n const casual = /^(hi|hello|hey|greetings|thanks|thank you|thx|bye|goodbye|cya)$/i.test(prompt.trim().replace(/[!?.]+$/, ''));\n return casual;\n }\n\n private looksLikeSimpleArtifactTask(prompt: string): boolean {\n return /create .*\\.(txt|md|json|csv)\\b/i.test(prompt)\n && !/(research|compare|thorough|pdf|report|analy[sz]e|architecture|multi-agent)/i.test(prompt);\n }\n\n private looksLikeConversational(prompt: string): boolean {\n const LOW_COMPLEXITY = [\n /^(?:hi|hello|hey|thanks|thank you|ok|okay|yes|no|sure|got it|sounds good)\\b/i,\n /^(?:what is|what are|list|show me|tell me|who is|where is|when is|how do i)\\b/i,\n /\\b(?:simple|quick|brief|small|single|one-line|typo|rename)\\b/i,\n ];\n const wordCount = prompt.trim().split(/\\s+/).length;\n return wordCount <= 12 && LOW_COMPLEXITY.some(re => re.test(prompt.trim()));\n }\n\n // Cache glob scan results per workspace path to avoid repeated I/O.\n private static globCache = new Map<string, { count: number; expiresAt: number }>();\n\n private async countWorkspaceFiles(workspacePath: string): Promise<number> {\n const now = Date.now();\n const cached = Cascade.globCache.get(workspacePath);\n if (cached && cached.expiresAt > now) return cached.count;\n try {\n const files = await glob('**/*.*', {\n cwd: workspacePath,\n ignore: ['node_modules/**', '.git/**', 'dist/**', 'build/**'],\n nodir: true,\n });\n Cascade.globCache.set(workspacePath, { count: files.length, expiresAt: now + 30_000 });\n return files.length;\n } catch {\n return 0;\n }\n }\n\n private async determineComplexity(\n prompt: string,\n workspacePath: string,\n conversationHistory: ConversationMessage[] = [],\n ): Promise<TaskComplexity> {\n if (this.isCasualGreeting(prompt)) return 'Simple';\n if (this.looksLikeSimpleArtifactTask(prompt)) return 'Simple';\n if (this.looksLikeConversational(prompt)) return 'Simple';\n\n // Quick workspace scout (cached for 30s)\n let workspaceContext = '';\n try {\n const count = await this.countWorkspaceFiles(workspacePath);\n workspaceContext = `Workspace Scout: Found ~${count} source files in the project.`;\n } catch {\n workspaceContext = 'Workspace Scout: Could not scan workspace.';\n }\n\n const sysPrompt = `You are a routing classifier for a hierarchical AI system. Determine task complexity using BOTH the latest user message and the recent conversation context.\n\n${workspaceContext}\n\nClassification:\n- \"Simple\": basic conversation, direct single-step work, or small troubleshooting\n- \"Moderate\": requires a few steps, some tool use, or a manager coordinating workers\n- \"Complex\": requires planning, multiple agents/sections, file artifact production, verification, research, or substantial implementation\n\nImportant rules:\n- Treat short follow-ups like \"proceed\", \"continue\", \"do it\", \"yes\" as referring to the recent context.\n- If the earlier context is complex, keep the inherited complexity unless the user clearly narrows scope.\n- If the task asks for a simple single-file artifact like hello.txt, it is usually Moderate.\n- If the task asks for a saved report, PDF, implementation, or deeper verification workflow, it is at least Moderate and often Complex.\n\nRespond with exactly one word: Simple, Moderate, or Complex.`;\n\n const recentHistory = conversationHistory.slice(-6);\n const contextBlock = recentHistory.map((message, index) => {\n const content = typeof message.content === 'string'\n ? message.content\n : message.content.map((block) => block.type === 'text' ? block.text : '[non-text]').join(' ');\n return `${index + 1}. ${message.role}: ${content}`;\n }).join('\\n');\n\n const routedPrompt = contextBlock\n ? `Recent conversation:\n${contextBlock}\\n\\nLatest user message:\n${prompt}`\n : prompt;\n\n try {\n const result = await this.router.generate('T1', {\n messages: [{ role: 'user', content: routedPrompt }],\n systemPrompt: sysPrompt,\n maxTokens: 8,\n temperature: 0,\n });\n const content = result.content.trim().toLowerCase();\n if (content.includes('simple')) return 'Simple';\n if (content.includes('moderate')) return 'Moderate';\n return 'Complex';\n } catch {\n const followUpPrompt = /^(proceed|continue|go ahead|do it|yes|yep|ok|okay|carry on)$/i.test(prompt.trim());\n if (followUpPrompt && recentHistory.length > 0) return 'Complex';\n return 'Complex';\n }\n }\n\n async run(options: CascadeRunOptions): Promise<CascadeRunResult> {\n await this.init();\n const startMs = Date.now();\n const taskId = randomUUID();\n\n // Create a fresh permission escalator for this task run\n const escalator = new PermissionEscalator();\n\n // Wire escalator's user-required event → approvalCallback or direct event\n escalator.on('permission:user-required', async (req: PermissionRequest) => {\n this.emit('permission:user-required', req);\n\n // Build enriched context for the approval callback / REPL\n const enrichedRequest: ApprovalRequest & { escalationContext?: unknown } = {\n id: req.id,\n tierId: req.requestedBy,\n toolName: req.toolName,\n input: req.input,\n description: `T3 Worker \"${req.subtaskContext}\" wants to run \"${req.toolName}\". T2 and T1 could not determine if this is safe.`,\n isDangerous: req.isDangerous,\n escalationContext: {\n requestedBy: req.requestedBy,\n parentT2Id: req.parentT2Id,\n subtaskContext: req.subtaskContext,\n sectionContext: req.sectionContext,\n taskContext: req.taskContext,\n },\n };\n\n let approved = false;\n let always = false;\n\n if (options.approvalCallback) {\n const result = await options.approvalCallback(enrichedRequest);\n if (typeof result === 'boolean') {\n approved = result;\n } else {\n approved = result.approved;\n always = result.always;\n }\n }\n\n escalator.resolveUserDecision(req.id, approved, always);\n });\n\n // 1. Determine complexity\n const complexity = await this.determineComplexity(options.prompt, options.workspacePath || process.cwd(), options.conversationHistory);\n\n this.telemetry.capture('cascade:session_start', {\n complexity,\n providerCount: this.config.providers.length,\n cascadeAutoEnabled: this.config.cascadeAuto === true,\n toolCreationEnabled: (this.config as unknown as Record<string, unknown>)['enableToolCreation'] === true,\n });\n\n this.emit('tier:root', { role: complexity === 'Simple' ? 'T3' : complexity === 'Moderate' ? 'T2' : 'T1' });\n\n // Cascade Auto: select optimal models for each tier based on task analysis\n if (this.taskAnalyzer) {\n const tiers: TierRole[] = complexity === 'Simple' ? ['T3'] : complexity === 'Moderate' ? ['T2', 'T3'] : ['T1', 'T2', 'T3'];\n await Promise.all(tiers.map(async (tier) => {\n try {\n const model = await this.taskAnalyzer!.selectModel(options.prompt, tier, this.router.getSelector());\n if (model) this.router.overrideTierModel(tier, model);\n } catch { /* non-critical — fall back to priority list */ }\n }));\n }\n\n // Register ToolCreator with the T3 instances (done below, passed via closure)\n const toolCreator = this.toolCreator;\n if (toolCreator) toolCreator.setPermissionEscalator(escalator);\n\n let finalOutput = '';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let t2Results: any[] = [];\n let runError: unknown = null;\n\n // ── Fetch Identity System Prompt ────────────\n let identityPrompt = '';\n if (this.store) {\n const identityId = options.identityId || this.config.defaultIdentityId;\n if (identityId) {\n const identities = this.store.listIdentities();\n const identity = identities.find(i => i.id === identityId);\n if (identity?.systemPrompt) {\n identityPrompt = identity.systemPrompt + '\\n\\n';\n }\n }\n }\n\n // Helper to bind standard events to any tier\n type TierEventSource = EventEmitter & {\n on(event: 'stream:token', listener: (event: { text: string }) => void): TierEventSource;\n on(event: 'log', listener: (event: unknown) => void): TierEventSource;\n on(event: 'tier:status', listener: (event: unknown) => void): TierEventSource;\n on(\n event: 'tool:approval-request',\n listener: (\n request: ApprovalRequest & {\n __cascadeResponder?: (decision: { approved: boolean; always?: boolean }) => void;\n },\n ) => void,\n ): TierEventSource;\n };\n\n const bindTierEvents = (tier: TierEventSource) => {\n tier.on('stream:token', (e) => {\n this.emit('stream:token', e);\n options.streamCallback?.({ text: e.text, finishReason: null });\n });\n tier.on('log', (e) => this.emit('log', e));\n tier.on('tier:status', (e) => this.emit('tier:status', e));\n tier.on('tool:call', (e) => this.emit('tool:call', e));\n tier.on('tool:result', (e) => this.emit('tool:result', e));\n // Legacy approval events (for tiers not yet wired to escalator)\n tier.on('tool:approval-request', async (request: ApprovalRequest & { __cascadeResponder?: (decision: { approved: boolean; always?: boolean }) => void }) => {\n this.emit('tool:approval-request', request);\n let decision: { approved: boolean; always?: boolean } = { approved: false };\n if (options.approvalCallback) {\n const result = await options.approvalCallback(request);\n if (typeof result === 'boolean') {\n decision = { approved: result };\n } else {\n decision = result;\n }\n }\n if (typeof request.__cascadeResponder === 'function') {\n request.__cascadeResponder(decision);\n } else {\n tier.emit(`tool:approval-response:${request.id}`, { id: request.id, ...decision } as ApprovalResponse);\n }\n });\n };\n\n try {\n if (complexity === 'Simple') {\n const t3 = new T3Worker(this.router, this.toolRegistry, 'root');\n t3.setHierarchyContext('You are the DIRECT worker for this task. There is no T1 Administrator or T2 Manager involved in this run.');\n if (identityPrompt) {\n t3.setSystemPromptOverride(identityPrompt);\n }\n if (this.store) {\n t3.setStore(this.store, taskId);\n }\n t3.setPermissionEscalator(escalator);\n if (toolCreator) t3.setToolCreator(toolCreator);\n bindTierEvents(t3);\n const assignment = {\n subtaskId: taskId,\n subtaskTitle: 'Direct Request',\n description: options.prompt,\n expectedOutput: 'A complete and direct answer.',\n constraints: [],\n peerT3Ids: [],\n parentT2: 'root'\n };\n const t3Result = await t3.execute(assignment, taskId, options.signal);\n finalOutput = typeof t3Result.output === 'string' ? t3Result.output : JSON.stringify(t3Result.output);\n this.emit('tier:status', { tierId: 't3-root', status: 'COMPLETED', role: 'T3' });\n } else if (complexity === 'Moderate') {\n const t2 = new T2Manager(this.router, this.toolRegistry, 'root');\n t2.setHierarchyContext('You are the ROOT Manager for this task. There is no T1 Administrator involved in this run. You are responsible for decomposing the task and managing T3 workers directly.');\n if (identityPrompt) {\n t2.setSystemPromptOverride(identityPrompt);\n }\n if (this.store) {\n t2.setStore(this.store);\n }\n t2.setPermissionEscalator(escalator);\n if (toolCreator) t2.setToolCreator(toolCreator);\n t2.setPeerMessageCallback((e) => this.emit('peer:message', e), options.sessionId ?? '');\n bindTierEvents(t2);\n const assignment = {\n sectionId: taskId,\n sectionTitle: 'Direct Task',\n description: options.prompt,\n expectedOutput: 'A complete resolution of the task.',\n constraints: [],\n t3Subtasks: []\n };\n const t2Result = await t2.execute(assignment, taskId, options.signal);\n this.emit('tier:status', { tierId: 't2-root', status: 'COMPLETED', role: 'T2' });\n t2Results = [t2Result];\n const completed = t2Result.t3Results.filter((r: T3Result) => r.status === 'COMPLETED');\n if (completed.length > 0) {\n finalOutput = t2Result.sectionSummary + '\\n\\n' + completed.map((r: T3Result) => r.output).join('\\n\\n');\n } else {\n finalOutput = 'Task failed to complete successfully.';\n }\n } else {\n const t1 = new T1Administrator(this.router, this.toolRegistry, this.config);\n t1.setHierarchyContext('You are the top-level Administrator. You are responsible for the overall plan and supervising multiple T2 Managers.');\n if (identityPrompt) {\n t1.setSystemPromptOverride(identityPrompt);\n }\n if (this.store) {\n t1.setStore(this.store);\n }\n t1.setPermissionEscalator(escalator);\n if (toolCreator) t1.setToolCreator(toolCreator);\n t1.setPeerMessageCallback((e) => this.emit('peer:message', e), options.sessionId ?? '');\n bindTierEvents(t1);\n t1.on('plan', (e) => this.emit('plan', e));\n \n const result = await t1.execute(options.prompt, options.images, undefined, options.signal);\n finalOutput = result.output;\n t2Results = result.t2Results;\n }\n } catch (err) {\n // ── Graceful cancellation handling ──────────────────────────────\n // When aborted, don't re-throw — resolve with what we have so far.\n if (err instanceof CascadeCancelledError) {\n this.emit('run:cancelled', {\n taskId,\n reason: err.message,\n partialOutput: finalOutput || '',\n });\n runError = null; // suppress telemetry error flag for intentional cancels\n } else {\n runError = err;\n throw err;\n }\n } finally {\n // Always release pending permission escalations so they don't leak\n // across runs — even on error paths. cancelAllPending is safe to call\n // when there are no pending requests.\n try { escalator.cancelAllPending(); } catch { /* non-critical */ }\n\n // Record model performance for future auto-selection\n if (this.taskAnalyzer) {\n try {\n const stats = this.router.getStats();\n this.taskAnalyzer.recordRunOutcome(runError ? 'failure' : 'success', stats.costByTier);\n } catch { /* non-critical */ }\n }\n\n // Always emit telemetry for completion (or failure) so dashboards\n // don't silently drop failed runs.\n try {\n const stats = this.router.getStats();\n const durationMs = Date.now() - startMs;\n this.telemetry.capture(runError ? 'cascade:task_failed' : 'cascade:task_complete', {\n complexity,\n tier: complexity === 'Simple' ? 'simple' : complexity === 'Moderate' ? 'T2' : 'T1',\n durationMs,\n tokenCount: stats.totalTokens,\n costUsd: stats.totalCostUsd,\n t2Count: t2Results.length,\n t3Count: t2Results.reduce((sum: number, r: { t3Results?: unknown[] }) => sum + (r.t3Results?.length ?? 0), 0),\n errored: runError ? true : false,\n errorMessage: runError instanceof Error ? runError.message : undefined,\n });\n } catch { /* telemetry must never block task results */ }\n }\n\n const stats = this.router.getStats();\n const durationMs = Date.now() - startMs;\n\n return {\n output: finalOutput,\n sessionId: options.sessionId ?? '',\n taskId,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: stats.totalTokens,\n estimatedCostUsd: stats.totalCostUsd,\n },\n t2Results,\n durationMs,\n costByTier: stats.costByTier,\n tokensByTier: stats.tokensByTier,\n costPercentByTier: this.router.getTierCostPercentages(),\n };\n }\n\n getRouter(): CascadeRouter {\n return this.router;\n }\n\n getToolRegistry(): ToolRegistry {\n return this.toolRegistry;\n }\n\n /**\n * Tear down MCP connections and flush any pending telemetry so long-lived\n * hosts (REPL, SDK embedders) don't leak child processes. Safe to call\n * multiple times.\n */\n async close(): Promise<void> {\n try { await this.mcpClient.disconnectAll(); } catch { /* non-critical */ }\n try {\n const maybeShutdown = (this.telemetry as Pick<Telemetry, 'shutdown'>)?.shutdown;\n if (typeof maybeShutdown === 'function') await maybeShutdown.call(this.telemetry);\n } catch { /* non-critical */ }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Keystore (keytar primary, AES-256-GCM fallback)\n// ─────────────────────────────────────────────\n\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst KEY_LEN = 32;\nconst IV_LEN = 12;\nconst TAG_LEN = 16;\nconst SALT_LEN = 32;\nconst PBKDF2_ITERATIONS = 100_000;\n\nconst KEYTAR_SERVICE = 'cascade-ai';\n\ntype KeytarModule = {\n getPassword: (service: string, account: string) => Promise<string | null>;\n setPassword: (service: string, account: string, password: string) => Promise<void>;\n deletePassword: (service: string, account: string) => Promise<boolean>;\n findCredentials: (service: string) => Promise<Array<{ account: string; password: string }>>;\n};\n\nasync function loadKeytar(): Promise<KeytarModule | null> {\n try {\n // Native module — may fail on headless containers, Alpine, etc.\n const mod = (await import('keytar')) as unknown as KeytarModule | { default: KeytarModule };\n const candidate = (mod as { default?: KeytarModule }).default ?? (mod as KeytarModule);\n if (typeof candidate.getPassword !== 'function') return null;\n return candidate;\n } catch {\n return null;\n }\n}\n\n/**\n * Keystore with two backends:\n * 1. OS keychain via `keytar` — preferred when available (macOS Keychain,\n * Windows Credential Vault, libsecret). No master password required.\n * 2. AES-256-GCM encrypted file — used when keytar is unavailable or the\n * caller passes `{ forceFile: true }`. Requires a master password.\n *\n * On first successful keytar unlock we silently migrate any existing AES\n * entries into the OS keychain. The AES file is left in place as a backup\n * until the user explicitly deletes it via `cascade keys migrate --confirm`.\n */\nexport class Keystore {\n private storePath: string;\n private masterKey: Buffer | null = null;\n private keytar: KeytarModule | null = null;\n private cache: Record<string, string> = {};\n private backend: 'keytar' | 'file' | null = null;\n\n constructor(storePath: string) {\n this.storePath = storePath;\n }\n\n /**\n * Unlock the keystore.\n *\n * If `password` is omitted we try keytar only. If keytar is unavailable and\n * there are AES entries to read, unlock will fail — re-call with a password\n * to decrypt the file backend.\n */\n async unlock(password?: string, opts: { forceFile?: boolean } = {}): Promise<void> {\n if (!opts.forceFile) {\n this.keytar = await loadKeytar();\n }\n\n if (this.keytar) {\n const creds = await this.keytar.findCredentials(KEYTAR_SERVICE);\n this.cache = Object.fromEntries(creds.map((c) => [c.account, c.password]));\n this.backend = 'keytar';\n\n if (password && fs.existsSync(this.storePath)) {\n try {\n const fileEntries = this.decryptFile(password);\n for (const [k, v] of Object.entries(fileEntries)) {\n if (!(k in this.cache)) {\n await this.keytar.setPassword(KEYTAR_SERVICE, k, v);\n this.cache[k] = v;\n }\n }\n } catch {\n // Wrong password or no file — ignore; keytar cache is authoritative.\n }\n }\n return;\n }\n\n // Keytar unavailable — fall back to AES file backend.\n if (!password) {\n throw new Error(\n 'Keystore unlock requires a password because the OS keychain (keytar) is not available on this system.',\n );\n }\n if (!fs.existsSync(this.storePath)) {\n const salt = crypto.randomBytes(SALT_LEN);\n this.masterKey = this.deriveKey(password, salt);\n this.writeWithSalt({}, salt);\n this.cache = {};\n } else {\n const { salt } = this.readRaw();\n this.masterKey = this.deriveKey(password, salt);\n this.cache = this.decryptFile(password, salt);\n }\n this.backend = 'file';\n }\n\n /** Synchronous legacy unlock kept for AES-only environments. */\n unlockSync(password: string): void {\n if (!fs.existsSync(this.storePath)) {\n const salt = crypto.randomBytes(SALT_LEN);\n this.masterKey = this.deriveKey(password, salt);\n this.writeWithSalt({}, salt);\n this.cache = {};\n } else {\n const { salt } = this.readRaw();\n this.masterKey = this.deriveKey(password, salt);\n this.cache = this.decryptFile(password, salt);\n }\n this.backend = 'file';\n }\n\n lock(): void {\n this.masterKey = null;\n this.cache = {};\n this.backend = null;\n this.keytar = null;\n }\n\n isUnlocked(): boolean {\n return this.backend !== null;\n }\n\n /** Report the active backend (`keytar` or `file`) for diagnostics. */\n getBackend(): 'keytar' | 'file' | null {\n return this.backend;\n }\n\n async set(key: string, value: string): Promise<void> {\n this.assertUnlocked();\n this.cache[key] = value;\n if (this.backend === 'keytar' && this.keytar) {\n await this.keytar.setPassword(KEYTAR_SERVICE, key, value);\n return;\n }\n this.saveAll(this.cache);\n }\n\n get(key: string): string | undefined {\n this.assertUnlocked();\n return this.cache[key];\n }\n\n async delete(key: string): Promise<void> {\n this.assertUnlocked();\n delete this.cache[key];\n if (this.backend === 'keytar' && this.keytar) {\n await this.keytar.deletePassword(KEYTAR_SERVICE, key);\n return;\n }\n this.saveAll(this.cache);\n }\n\n listKeys(): string[] {\n this.assertUnlocked();\n return Object.keys(this.cache);\n }\n\n // ── Private ──────────────────────────────────\n\n private assertUnlocked(): void {\n if (this.backend === null) {\n throw new Error('Keystore is locked. Call unlock() first.');\n }\n }\n\n private decryptFile(password: string, knownSalt?: Buffer): Record<string, string> {\n if (!fs.existsSync(this.storePath)) return {};\n try {\n const { salt, ciphertext, iv, tag } = this.readRaw();\n const useSalt = knownSalt ?? salt;\n const key = this.masterKey ?? this.deriveKey(password, useSalt);\n const decipher = crypto.createDecipheriv(ALGORITHM, key, iv) as crypto.DecipherGCM;\n decipher.setAuthTag(tag);\n const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return JSON.parse(decrypted.toString('utf-8')) as Record<string, string>;\n } catch {\n throw new Error('Failed to decrypt keystore. Wrong password?');\n }\n }\n\n private saveAll(data: Record<string, string>): void {\n if (!this.masterKey) return; // keytar backend — nothing to persist to file\n const raw = this.readRaw();\n const iv = crypto.randomBytes(IV_LEN);\n const cipher = crypto.createCipheriv(ALGORITHM, this.masterKey, iv) as crypto.CipherGCM;\n const plaintext = Buffer.from(JSON.stringify(data), 'utf-8');\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n const out = Buffer.concat([raw.salt, iv, tag, ciphertext]);\n fs.mkdirSync(path.dirname(this.storePath), { recursive: true });\n fs.writeFileSync(this.storePath, out, { mode: 0o600 });\n }\n\n private writeWithSalt(data: Record<string, string>, salt: Buffer): void {\n if (!this.masterKey) throw new Error('writeWithSalt called before masterKey was set');\n const iv = crypto.randomBytes(IV_LEN);\n const cipher = crypto.createCipheriv(ALGORITHM, this.masterKey, iv) as crypto.CipherGCM;\n const plaintext = Buffer.from(JSON.stringify(data), 'utf-8');\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n const out = Buffer.concat([salt, iv, tag, ciphertext]);\n fs.mkdirSync(path.dirname(this.storePath), { recursive: true });\n fs.writeFileSync(this.storePath, out, { mode: 0o600 });\n }\n\n private readRaw(): { salt: Buffer; iv: Buffer; tag: Buffer; ciphertext: Buffer } {\n const buf = fs.readFileSync(this.storePath);\n let offset = 0;\n const salt = buf.subarray(offset, offset + SALT_LEN); offset += SALT_LEN;\n const iv = buf.subarray(offset, offset + IV_LEN); offset += IV_LEN;\n const tag = buf.subarray(offset, offset + TAG_LEN); offset += TAG_LEN;\n const ciphertext = buf.subarray(offset);\n return { salt, iv, tag, ciphertext };\n }\n\n private deriveKey(password: string, salt: Buffer): Buffer {\n return crypto.pbkdf2Sync(password, salt, PBKDF2_ITERATIONS, KEY_LEN, 'sha256');\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — .cascadeignore Parser\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport * as _ignoreModule from 'ignore';\nimport type { Ignore } from 'ignore';\n// ignore is a CJS package — access .default under NodeNext ESM interop\nconst ignore = (_ignoreModule as unknown as { default: () => Ignore }).default ?? (_ignoreModule as unknown as () => Ignore);\n\nexport class CascadeIgnore {\n private ig: Ignore;\n private loaded = false;\n\n constructor() {\n this.ig = ignore();\n // Built-in defaults — always protected\n this.ig.add([\n '.cascade/keystore.enc',\n '.cascade/memory.db',\n '.env',\n '.env.*',\n '*.pem',\n '*.key',\n 'id_rsa',\n 'id_ed25519',\n ]);\n }\n\n async load(workspacePath: string): Promise<void> {\n const filePath = path.join(workspacePath, '.cascadeignore');\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n').filter((l) => l.trim() && !l.startsWith('#'));\n this.ig.add(lines);\n this.loaded = true;\n } catch {\n // No .cascadeignore file — only built-in defaults apply\n }\n }\n\n isIgnored(filePath: string, workspacePath?: string): boolean {\n try {\n const relative = workspacePath\n ? path.relative(workspacePath, filePath)\n : filePath;\n return this.ig.ignores(relative);\n } catch {\n return false;\n }\n }\n\n getPatterns(): string[] {\n return (this.ig as unknown as { _rules: Array<{ pattern: string }> })._rules?.map((r) => r.pattern) ?? [];\n }\n}\n\nexport async function createDefaultIgnoreFile(workspacePath: string): Promise<void> {\n const filePath = path.join(workspacePath, '.cascadeignore');\n const content = `# .cascadeignore — Files Cascade agents cannot read or modify\n# Syntax identical to .gitignore\n\n# Secrets\n.env\n.env.*\n*.pem\n*.key\n*.cert\nid_rsa\nid_ed25519\n\n# Cascade internals\n.cascade/keystore.enc\n.cascade/memory.db\n\n# Build artifacts\nnode_modules/\ndist/\nbuild/\n*.min.js\n\n# OS files\n.DS_Store\nThumbs.db\n`;\n await fs.writeFile(filePath, content, 'utf-8');\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — CASCADE.md Parser\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface CascadeMdContent {\n raw: string;\n sections: Record<string, string>;\n systemPrompt: string;\n}\n\nexport async function loadCascadeMd(workspacePath: string): Promise<CascadeMdContent | null> {\n const filePath = path.join(workspacePath, 'CASCADE.md');\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return parseCascadeMd(raw);\n } catch {\n return null;\n }\n}\n\nexport function parseCascadeMd(raw: string): CascadeMdContent {\n const sections: Record<string, string> = {};\n const lines = raw.split('\\n');\n let currentSection = 'main';\n const sectionLines: string[] = [];\n\n for (const line of lines) {\n const h2Match = /^##\\s+(.+)$/.exec(line);\n if (h2Match) {\n sections[currentSection] = sectionLines.join('\\n').trim();\n sectionLines.length = 0;\n currentSection = h2Match[1]!.toLowerCase().replace(/\\s+/g, '_');\n } else {\n sectionLines.push(line);\n }\n }\n sections[currentSection] = sectionLines.join('\\n').trim();\n\n // Build system prompt from the full content\n const systemPrompt = `[Project Instructions from CASCADE.md]\\n${raw.trim()}`;\n\n return { raw, sections, systemPrompt };\n}\n\nexport async function createDefaultCascadeMd(workspacePath: string): Promise<void> {\n const filePath = path.join(workspacePath, 'CASCADE.md');\n const content = `# Cascade Project Instructions\n\nThis file contains project-specific instructions for the Cascade AI agent.\nEdit this file to customize how agents behave in this project.\n\n## Project Overview\n\nDescribe your project here.\n\n## Coding Guidelines\n\n- Follow existing code style\n- Write tests for new features\n- Document public APIs\n\n## Agent Behavior\n\n- Prefer small, focused changes\n- Always ask before deleting files\n- Run tests before committing\n\n## Allowed Tools\n\nAll tools are allowed unless specified otherwise.\n\n## Out of Scope\n\nList any areas the agent should not touch.\n`;\n await fs.writeFile(filePath, content, 'utf-8');\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — SQLite Memory Store\n// ─────────────────────────────────────────────\n\nimport Database from 'better-sqlite3';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport type {\n AuditEntry,\n Identity,\n ModelInfo,\n ProviderType,\n RuntimeNode,\n RuntimeNodeLog,\n RuntimeSession,\n ScheduledTask,\n Session,\n StoredMessage,\n} from '../types.js';\n\nexport class MemoryStore {\n private db: Database.Database;\n\n constructor(dbPath: string) {\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n try {\n this.db = new Database(dbPath, { timeout: 5000 });\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.db.pragma('synchronous = NORMAL'); // Better concurrency with WAL\n this.migrate();\n } catch (err) {\n if (err instanceof Error && err.message.includes('Could not locate the bindings file')) {\n throw new Error(\n `Cascade AI failed to load its database (better-sqlite3). This is usually because native bindings for Node.js ${process.version} are missing.\\n\\n` +\n `Please try running: npm install better-sqlite3 --force\\n` +\n `Original error: ${err.message}`\n );\n }\n throw err;\n }\n }\n\n // ── Async Write Queue ─────────────────────────\n\n private writeQueue: Array<() => void> = [];\n private isProcessingQueue = false;\n\n private async processQueue() {\n if (this.isProcessingQueue) return;\n this.isProcessingQueue = true;\n while (this.writeQueue.length > 0) {\n const op = this.writeQueue.shift();\n if (op) {\n let attempts = 0;\n while (attempts < 5) {\n try {\n op();\n break;\n } catch (err: unknown) {\n if (err instanceof Error && (err as any).code === 'SQLITE_BUSY') {\n attempts++;\n await new Promise(r => setTimeout(r, 100 * Math.pow(2, attempts)));\n } else {\n console.error('Cascade AI: DB Write Error:', err);\n break;\n }\n }\n }\n }\n }\n this.isProcessingQueue = false;\n }\n\n private enqueueWrite(op: () => void) {\n this.writeQueue.push(op);\n this.processQueue().catch(console.error);\n }\n\n // ── Sessions ──────────────────────────────────\n\n createSession(session: Session): void {\n this.db.prepare(`\n INSERT INTO sessions (id, title, created_at, updated_at, identity_id, workspace_path, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `).run(session.id, session.title, session.createdAt, session.updatedAt, session.identityId, session.workspacePath, JSON.stringify(session.metadata));\n }\n\n updateSession(id: string, updates: Partial<Session>): void {\n const parts: string[] = [];\n const values: unknown[] = [];\n if (updates.title) { parts.push('title = ?'); values.push(updates.title); }\n if (updates.updatedAt) { parts.push('updated_at = ?'); values.push(updates.updatedAt); }\n if (updates.identityId) { parts.push('identity_id = ?'); values.push(updates.identityId); }\n if (updates.metadata) { parts.push('metadata = ?'); values.push(JSON.stringify(updates.metadata)); }\n if (!parts.length) return;\n values.push(id);\n this.db.prepare(`UPDATE sessions SET ${parts.join(', ')} WHERE id = ?`).run(...values);\n }\n\n getSession(id: string): Session | null {\n const row = this.db.prepare('SELECT * FROM sessions WHERE id = ?').get(id) as DbSession | undefined;\n if (!row) return null;\n const messages = this.getSessionMessages(id);\n return this.deserializeSession(row, messages);\n }\n\n listSessions(identityId?: string, limit = 50): Session[] {\n const rows = identityId\n ? this.db.prepare('SELECT * FROM sessions WHERE identity_id = ? ORDER BY updated_at DESC LIMIT ?').all(identityId, limit) as DbSession[]\n : this.db.prepare('SELECT * FROM sessions ORDER BY updated_at DESC LIMIT ?').all(limit) as DbSession[];\n return rows.map((r) => this.deserializeSession(r, []));\n }\n\n deleteSession(id: string): void {\n this.db.prepare('DELETE FROM messages WHERE session_id = ?').run(id);\n this.db.prepare('DELETE FROM sessions WHERE id = ?').run(id);\n }\n\n deleteAllSessions(): void {\n this.db.prepare('DELETE FROM file_snapshots').run();\n this.db.prepare('DELETE FROM messages').run();\n this.db.prepare('DELETE FROM sessions').run();\n }\n\n deleteRuntimeSession(sessionId: string): void {\n this.db.prepare('DELETE FROM runtime_node_logs WHERE session_id = ?').run(sessionId);\n this.db.prepare('DELETE FROM runtime_nodes WHERE session_id = ?').run(sessionId);\n this.db.prepare('DELETE FROM runtime_sessions WHERE session_id = ?').run(sessionId);\n }\n\n deleteAllRuntimeNodes(): void {\n this.db.prepare('DELETE FROM runtime_node_logs').run();\n this.db.prepare('DELETE FROM runtime_nodes').run();\n this.db.prepare('DELETE FROM runtime_sessions').run();\n }\n\n branchSession(originalId: string, newId: string): void {\n const session = this.db.prepare('SELECT * FROM sessions WHERE id = ?').get(originalId) as DbSession | undefined;\n if (!session) throw new Error(`Original session ${originalId} not found`);\n\n const now = new Date().toISOString();\n this.db.prepare(`\n INSERT INTO sessions (id, title, created_at, updated_at, identity_id, workspace_path, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `).run(newId, `${session.title} (Branch)`, now, now, session.identity_id, session.workspace_path, session.metadata);\n\n const messages = this.db.prepare('SELECT * FROM messages WHERE session_id = ? ORDER BY timestamp ASC').all(originalId) as DbMessage[];\n const stmt = this.db.prepare(`\n INSERT INTO messages (id, session_id, role, content, timestamp, tokens, agent_messages)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n for (const msg of messages) {\n stmt.run(randomUUID(), newId, msg.role, msg.content, msg.timestamp, msg.tokens, msg.agent_messages);\n }\n\n const snapshots = this.db.prepare('SELECT * FROM file_snapshots WHERE session_id = ?').all(originalId) as DbFileSnapshot[];\n const snapStmt = this.db.prepare(`\n INSERT INTO file_snapshots (id, session_id, file_path, content, timestamp)\n VALUES (?, ?, ?, ?, ?)\n `);\n for (const snap of snapshots) {\n snapStmt.run(randomUUID(), newId, snap.file_path, snap.content, snap.timestamp);\n }\n }\n\n // ── Runtime Sessions / Nodes ─────────────────\n\n upsertRuntimeSession(session: RuntimeSession): void {\n this.enqueueWrite(() => {\n this.db.prepare(`\n INSERT INTO runtime_sessions (session_id, title, workspace_path, status, started_at, updated_at, latest_prompt, is_global)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(session_id) DO UPDATE SET\n title = excluded.title,\n workspace_path = excluded.workspace_path,\n status = excluded.status,\n updated_at = excluded.updated_at,\n latest_prompt = excluded.latest_prompt,\n is_global = excluded.is_global\n `).run(\n session.sessionId,\n session.title,\n session.workspacePath,\n session.status,\n session.startedAt,\n session.updatedAt,\n session.latestPrompt ?? null,\n session.isGlobal ? 1 : 0,\n );\n });\n }\n\n listRuntimeSessions(limit = 100): RuntimeSession[] {\n const rows = this.db.prepare(`\n SELECT * FROM runtime_sessions ORDER BY updated_at DESC LIMIT ?\n `).all(limit) as DbRuntimeSession[];\n return rows.map((row) => ({\n sessionId: row.session_id,\n title: row.title,\n workspacePath: row.workspace_path,\n status: row.status as RuntimeSession['status'],\n startedAt: row.started_at,\n updatedAt: row.updated_at,\n latestPrompt: row.latest_prompt ?? undefined,\n isGlobal: row.is_global === 1,\n }));\n }\n\n upsertRuntimeNode(node: RuntimeNode): void {\n this.enqueueWrite(() => {\n this.db.prepare(`\n INSERT INTO runtime_nodes (tier_id, session_id, parent_id, role, label, status, current_action, progress_pct, updated_at, workspace_path, is_global, output)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tier_id) DO UPDATE SET\n session_id = excluded.session_id,\n parent_id = excluded.parent_id,\n role = excluded.role,\n label = excluded.label,\n status = excluded.status,\n current_action = excluded.current_action,\n progress_pct = excluded.progress_pct,\n updated_at = excluded.updated_at,\n workspace_path = excluded.workspace_path,\n is_global = excluded.is_global,\n output = excluded.output\n `).run(\n node.tierId,\n node.sessionId,\n node.parentId ?? null,\n node.role,\n node.label,\n node.status,\n node.currentAction ?? null,\n node.progressPct ?? null,\n node.updatedAt,\n node.workspacePath ?? null,\n node.isGlobal ? 1 : 0,\n node.output ?? null,\n );\n });\n }\n\n listRuntimeNodes(sessionId?: string, limit = 500): RuntimeNode[] {\n const rows = sessionId\n ? this.db.prepare(`\n SELECT * FROM runtime_nodes WHERE session_id = ? ORDER BY updated_at DESC LIMIT ?\n `).all(sessionId, limit) as DbRuntimeNode[]\n : this.db.prepare(`\n SELECT * FROM runtime_nodes ORDER BY updated_at DESC LIMIT ?\n `).all(limit) as DbRuntimeNode[];\n\n return rows.map((row) => ({\n tierId: row.tier_id,\n sessionId: row.session_id,\n parentId: row.parent_id ?? undefined,\n role: row.role as RuntimeNode['role'],\n label: row.label,\n status: row.status as RuntimeNode['status'],\n currentAction: row.current_action ?? undefined,\n progressPct: row.progress_pct ?? undefined,\n updatedAt: row.updated_at,\n workspacePath: row.workspace_path ?? undefined,\n isGlobal: row.is_global === 1,\n output: row.output ?? undefined,\n }));\n }\n\n addRuntimeNodeLog(log: RuntimeNodeLog): void {\n this.enqueueWrite(() => {\n this.db.prepare(`\n INSERT INTO runtime_node_logs (id, session_id, tier_id, role, label, status, current_action, progress_pct, timestamp, workspace_path, is_global, output)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n log.id,\n log.sessionId,\n log.tierId,\n log.role,\n log.label,\n log.status,\n log.currentAction ?? null,\n log.progressPct ?? null,\n log.timestamp,\n log.workspacePath ?? null,\n log.isGlobal ? 1 : 0,\n log.output ?? null,\n );\n\n this.db.prepare(`\n DELETE FROM runtime_node_logs\n WHERE id NOT IN (\n SELECT id FROM runtime_node_logs\n ORDER BY timestamp DESC\n LIMIT 2000\n )\n `).run();\n });\n }\n\n listRuntimeNodeLogs(sessionId?: string, tierId?: string, limit = 200): RuntimeNodeLog[] {\n let rows: DbRuntimeNodeLog[];\n\n if (sessionId && tierId) {\n rows = this.db.prepare(`\n SELECT * FROM runtime_node_logs\n WHERE session_id = ? AND tier_id = ?\n ORDER BY timestamp DESC LIMIT ?\n `).all(sessionId, tierId, limit) as DbRuntimeNodeLog[];\n } else if (sessionId) {\n rows = this.db.prepare(`\n SELECT * FROM runtime_node_logs\n WHERE session_id = ?\n ORDER BY timestamp DESC LIMIT ?\n `).all(sessionId, limit) as DbRuntimeNodeLog[];\n } else {\n rows = this.db.prepare(`\n SELECT * FROM runtime_node_logs\n ORDER BY timestamp DESC LIMIT ?\n `).all(limit) as DbRuntimeNodeLog[];\n }\n\n return rows.map((row) => ({\n id: row.id,\n sessionId: row.session_id,\n tierId: row.tier_id,\n role: row.role as RuntimeNodeLog['role'],\n label: row.label,\n status: row.status as RuntimeNodeLog['status'],\n currentAction: row.current_action ?? undefined,\n progressPct: row.progress_pct ?? undefined,\n timestamp: row.timestamp,\n workspacePath: row.workspace_path ?? undefined,\n isGlobal: row.is_global === 1,\n output: row.output ?? undefined,\n }));\n }\n\n // ── Messages ──────────────────────────────────\n\n addMessage(message: StoredMessage): void {\n this.enqueueWrite(() => {\n this.db.prepare(`\n INSERT INTO messages (id, session_id, role, content, timestamp, tokens, agent_messages)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `).run(\n message.id,\n message.sessionId,\n message.role,\n typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n message.timestamp,\n message.tokens ? JSON.stringify(message.tokens) : null,\n message.agentMessages ? JSON.stringify(message.agentMessages) : null,\n );\n this.db.prepare('UPDATE sessions SET updated_at = ? WHERE id = ?').run(message.timestamp, message.sessionId);\n });\n }\n\n getSessionMessages(sessionId: string): StoredMessage[] {\n const rows = this.db.prepare('SELECT * FROM messages WHERE session_id = ? ORDER BY timestamp ASC').all(sessionId) as DbMessage[];\n return rows.map(this.deserializeMessage);\n }\n\n searchMessages(query: string, limit = 20): StoredMessage[] {\n const rows = this.db.prepare(`\n SELECT * FROM messages WHERE content LIKE ? ORDER BY timestamp DESC LIMIT ?\n `).all(`%${query}%`, limit) as DbMessage[];\n return rows.map(this.deserializeMessage);\n }\n\n // ── Identities ────────────────────────────────\n\n createIdentity(identity: Identity): void {\n this.db.prepare(`\n INSERT INTO identities (id, name, description, avatar, created_at, default_model, system_prompt, is_default)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).run(identity.id, identity.name, identity.description ?? null, identity.avatar ?? null,\n identity.createdAt, identity.defaultModel ?? null, identity.systemPrompt ?? null,\n identity.isDefault ? 1 : 0);\n }\n\n updateIdentity(id: string, updates: Partial<Identity>): void {\n const parts: string[] = [];\n const values: unknown[] = [];\n if (updates.name !== undefined) { parts.push('name = ?'); values.push(updates.name); }\n if (updates.description !== undefined) { parts.push('description = ?'); values.push(updates.description); }\n if (updates.systemPrompt !== undefined) { parts.push('system_prompt = ?'); values.push(updates.systemPrompt); }\n if (updates.isDefault !== undefined) { parts.push('is_default = ?'); values.push(updates.isDefault ? 1 : 0); }\n if (!parts.length) return;\n values.push(id);\n this.db.prepare(`UPDATE identities SET ${parts.join(', ')} WHERE id = ?`).run(...values);\n }\n\n getIdentity(id: string): Identity | null {\n const row = this.db.prepare('SELECT * FROM identities WHERE id = ?').get(id) as DbIdentity | undefined;\n return row ? this.deserializeIdentity(row) : null;\n }\n\n getDefaultIdentity(): Identity | null {\n const row = this.db.prepare('SELECT * FROM identities WHERE is_default = 1 LIMIT 1').get() as DbIdentity | undefined;\n if (!row) {\n const first = this.db.prepare('SELECT * FROM identities LIMIT 1').get() as DbIdentity | undefined;\n return first ? this.deserializeIdentity(first) : null;\n }\n return this.deserializeIdentity(row);\n }\n\n listIdentities(): Identity[] {\n const rows = this.db.prepare('SELECT * FROM identities ORDER BY is_default DESC, name ASC').all() as DbIdentity[];\n return rows.map(this.deserializeIdentity);\n }\n\n deleteIdentity(id: string): void {\n this.db.prepare('DELETE FROM identities WHERE id = ?').run(id);\n }\n\n // ── Scheduled Tasks ───────────────────────────\n\n saveScheduledTask(task: ScheduledTask): void {\n this.db.prepare(`\n INSERT OR REPLACE INTO scheduled_tasks (id, name, cron_expression, prompt, identity_id, workspace_path, created_at, last_run, next_run, enabled)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(task.id, task.name, task.cronExpression, task.prompt, task.identityId ?? null,\n task.workspacePath ?? null, task.createdAt, task.lastRun ?? null, task.nextRun ?? null, task.enabled ? 1 : 0);\n }\n\n listScheduledTasks(): ScheduledTask[] {\n const rows = this.db.prepare('SELECT * FROM scheduled_tasks ORDER BY name').all() as DbScheduledTask[];\n return rows.map(this.deserializeScheduledTask);\n }\n\n deleteScheduledTask(id: string): void {\n this.db.prepare('DELETE FROM scheduled_tasks WHERE id = ?').run(id);\n }\n\n // ── Audit Log ─────────────────────────────────\n\n addAuditEntry(entry: AuditEntry): void {\n this.enqueueWrite(() => {\n this.db.prepare(`\n INSERT INTO audit_log (id, session_id, timestamp, tier_id, action, details)\n VALUES (?, ?, ?, ?, ?, ?)\n `).run(entry.id, entry.sessionId, entry.timestamp, entry.tierId, entry.action, JSON.stringify(entry.details));\n });\n }\n\n getAuditLog(sessionId: string, limit = 100): AuditEntry[] {\n const rows = this.db.prepare('SELECT * FROM audit_log WHERE session_id = ? ORDER BY timestamp DESC LIMIT ?').all(sessionId, limit) as DbAudit[];\n return rows.map((r) => ({\n id: r.id,\n sessionId: r.session_id,\n timestamp: r.timestamp,\n tierId: r.tier_id,\n action: r.action as AuditEntry['action'],\n details: JSON.parse(r.details) as Record<string, unknown>,\n }));\n }\n\n // ── File Snapshots ────────────────────────────\n\n addFileSnapshot(sessionId: string, filePath: string, content: string): void {\n this.enqueueWrite(() => {\n this.db.prepare(`\n INSERT INTO file_snapshots (id, session_id, file_path, content, timestamp)\n VALUES (?, ?, ?, ?, ?)\n `).run(randomUUID(), sessionId, filePath, content, new Date().toISOString());\n });\n }\n\n getLatestFileSnapshots(sessionId: string): Array<{ filePath: string; content: string }> {\n // Return the earliest snapshot per file — the \"before\" state used by\n // /rollback. ISO timestamps have millisecond resolution, so two rapid\n // calls can share a timestamp. The inner query picks a single winning\n // row per (session, path) by (timestamp ASC, rowid ASC), then the outer\n // query dedups to that row — avoiding the duplicate-row bug that\n // returned every snapshot for files written in the same millisecond.\n const rows = this.db.prepare(`\n SELECT fs.file_path, fs.content\n FROM file_snapshots fs\n WHERE fs.session_id = ?\n AND fs.rowid = (\n SELECT fs2.rowid\n FROM file_snapshots fs2\n WHERE fs2.session_id = fs.session_id\n AND fs2.file_path = fs.file_path\n ORDER BY fs2.timestamp ASC, fs2.rowid ASC\n LIMIT 1\n )\n `).all(sessionId) as Array<{ file_path: string; content: string }>;\n\n return rows.map((r) => ({ filePath: r.file_path, content: r.content }));\n }\n\n // ── Model Cache ───────────────────────────────\n\n upsertCachedModel(model: ModelInfo): void {\n this.db.prepare(`\n INSERT INTO model_cache (id, provider, model_id, name, metadata, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n name = excluded.name,\n metadata = excluded.metadata,\n updated_at = excluded.updated_at\n `).run(\n `${model.provider}:${model.id}`,\n model.provider,\n model.id,\n model.name,\n JSON.stringify(model),\n new Date().toISOString(),\n );\n }\n\n getCachedModels(provider?: ProviderType): ModelInfo[] {\n const rows = provider\n ? this.db.prepare('SELECT metadata FROM model_cache WHERE provider = ?').all(provider) as { metadata: string }[]\n : this.db.prepare('SELECT metadata FROM model_cache').all() as { metadata: string }[];\n return rows.map(r => JSON.parse(r.metadata));\n }\n\n clearModelCache(provider?: ProviderType): void {\n if (provider) {\n this.db.prepare('DELETE FROM model_cache WHERE provider = ?').run(provider);\n } else {\n this.db.prepare('DELETE FROM model_cache').run();\n }\n }\n\n getCacheAge(): number {\n const row = this.db.prepare('SELECT MIN(updated_at) as oldest FROM model_cache').get() as { oldest: string | null };\n if (!row.oldest) return Infinity;\n return Date.now() - new Date(row.oldest).getTime();\n }\n\n saveModelProfile(modelId: string, provider: ProviderType, specializations: string[]): void {\n const cacheKey = `${provider}:${modelId}`;\n const existing = this.db.prepare('SELECT metadata FROM model_cache WHERE id = ?').get(cacheKey) as { metadata: string } | undefined;\n const meta: ModelInfo = existing\n ? JSON.parse(existing.metadata) as ModelInfo\n : { id: modelId, provider, name: modelId, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: false };\n meta.specializations = specializations;\n this.db.prepare(`\n INSERT INTO model_cache (id, provider, model_id, name, metadata, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET metadata = excluded.metadata, updated_at = excluded.updated_at\n `).run(cacheKey, provider, modelId, meta.name ?? modelId, JSON.stringify(meta), new Date().toISOString());\n }\n\n getModelProfile(modelId: string, provider: ProviderType): ModelInfo | undefined {\n const row = this.db.prepare('SELECT metadata FROM model_cache WHERE id = ?').get(`${provider}:${modelId}`) as { metadata: string } | undefined;\n return row ? JSON.parse(row.metadata) as ModelInfo : undefined;\n }\n\n getProfiledModelIds(): string[] {\n const rows = this.db.prepare(\n \"SELECT model_id FROM model_cache WHERE json_extract(metadata, '$.specializations') IS NOT NULL\"\n ).all() as { model_id: string }[];\n return rows.map(r => r.model_id);\n }\n\n // ── Tool Result Cache (in-memory, TTL-based) ──────────────────────────\n // Avoids redundant calls for read-only tools within a short window.\n // Not persisted to DB — cleared on process restart.\n\n private toolResultCache: Map<string, { result: string; expiresAt: number }> = new Map();\n\n private static CACHEABLE_TOOLS = new Set([\n 'file_read', 'file_list',\n ]);\n\n private static TOOL_TTL_MS: Record<string, number> = {\n file_read: 60_000,\n file_list: 30_000,\n };\n\n /**\n * Returns a cached tool result, or null if not cached / expired.\n */\n getToolResult(toolName: string, input: Record<string, unknown>): string | null {\n if (!MemoryStore.CACHEABLE_TOOLS.has(toolName)) return null;\n const key = `${toolName}:${JSON.stringify(input)}`;\n const entry = this.toolResultCache.get(key);\n if (!entry || Date.now() > entry.expiresAt) {\n this.toolResultCache.delete(key);\n return null;\n }\n return entry.result;\n }\n\n /**\n * Stores a tool result in the in-memory cache.\n * Only caches read-only/safe tools (see CACHEABLE_TOOLS).\n */\n setToolResult(toolName: string, input: Record<string, unknown>, result: string): void {\n if (!MemoryStore.CACHEABLE_TOOLS.has(toolName)) return;\n const ttl = MemoryStore.TOOL_TTL_MS[toolName] ?? 30_000;\n this.toolResultCache.set(`${toolName}:${JSON.stringify(input)}`, {\n result,\n expiresAt: Date.now() + ttl,\n });\n }\n\n /** Invalidate tool cache for a specific tool name, or all tools if omitted. */\n invalidateToolCache(toolName?: string): void {\n if (!toolName) { this.toolResultCache.clear(); return; }\n for (const key of this.toolResultCache.keys()) {\n if (key.startsWith(`${toolName}:`)) this.toolResultCache.delete(key);\n }\n }\n\n close(): void {\n this.db.close();\n }\n\n // ── Migration ─────────────────────────────────\n\n private migrate(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n identity_id TEXT NOT NULL,\n workspace_path TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}'\n );\n\n CREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n role TEXT NOT NULL,\n content TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n tokens TEXT,\n agent_messages TEXT,\n FOREIGN KEY (session_id) REFERENCES sessions(id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);\n CREATE INDEX IF NOT EXISTS idx_messages_content ON messages(content);\n\n CREATE TABLE IF NOT EXISTS identities (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT,\n avatar TEXT,\n created_at TEXT NOT NULL,\n default_model TEXT,\n system_prompt TEXT,\n is_default INTEGER NOT NULL DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS scheduled_tasks (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n cron_expression TEXT NOT NULL,\n prompt TEXT NOT NULL,\n identity_id TEXT,\n workspace_path TEXT,\n created_at TEXT NOT NULL,\n last_run TEXT,\n next_run TEXT,\n enabled INTEGER NOT NULL DEFAULT 1\n );\n\n CREATE TABLE IF NOT EXISTS audit_log (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n tier_id TEXT NOT NULL,\n action TEXT NOT NULL,\n details TEXT NOT NULL DEFAULT '{}'\n );\n\n CREATE INDEX IF NOT EXISTS idx_audit_session ON audit_log(session_id);\n\n CREATE TABLE IF NOT EXISTS runtime_sessions (\n session_id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n workspace_path TEXT NOT NULL,\n status TEXT NOT NULL,\n started_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n latest_prompt TEXT,\n is_global INTEGER NOT NULL DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS runtime_nodes (\n tier_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n parent_id TEXT,\n role TEXT NOT NULL,\n label TEXT NOT NULL,\n status TEXT NOT NULL,\n current_action TEXT,\n progress_pct INTEGER,\n updated_at TEXT NOT NULL,\n workspace_path TEXT,\n is_global INTEGER NOT NULL DEFAULT 0,\n output TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_runtime_nodes_session ON runtime_nodes(session_id);\n CREATE INDEX IF NOT EXISTS idx_runtime_nodes_updated ON runtime_nodes(updated_at);\n\n CREATE TABLE IF NOT EXISTS runtime_node_logs (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n tier_id TEXT NOT NULL,\n role TEXT NOT NULL,\n label TEXT NOT NULL,\n status TEXT NOT NULL,\n current_action TEXT,\n progress_pct INTEGER,\n timestamp TEXT NOT NULL,\n workspace_path TEXT,\n is_global INTEGER NOT NULL DEFAULT 0,\n output TEXT\n );\n\n CREATE TABLE IF NOT EXISTS model_cache (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL,\n model_id TEXT NOT NULL,\n name TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n updated_at TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_runtime_logs_session ON runtime_node_logs(session_id);\n CREATE INDEX IF NOT EXISTS idx_runtime_logs_tier ON runtime_node_logs(tier_id);\n CREATE INDEX IF NOT EXISTS idx_runtime_logs_timestamp ON runtime_node_logs(timestamp);\n CREATE INDEX IF NOT EXISTS idx_runtime_nodes_session_updated ON runtime_nodes(session_id, updated_at);\n CREATE INDEX IF NOT EXISTS idx_runtime_logs_session_timestamp ON runtime_node_logs(session_id, timestamp);\n\n CREATE TABLE IF NOT EXISTS file_snapshots (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n file_path TEXT NOT NULL,\n content TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n FOREIGN KEY (session_id) REFERENCES sessions(id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_file_snapshots_session ON file_snapshots(session_id);\n `);\n\n // Auto-migrate: Add 'output' column if missing\n try { this.db.exec('ALTER TABLE runtime_nodes ADD COLUMN output TEXT'); } catch { /* ignore */ }\n try { this.db.exec('ALTER TABLE runtime_node_logs ADD COLUMN output TEXT'); } catch { /* ignore */ }\n }\n\n // ── Deserializers ─────────────────────────────\n\n private deserializeSession(row: DbSession, messages: StoredMessage[]): Session {\n return {\n id: row.id,\n title: row.title,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n identityId: row.identity_id,\n workspacePath: row.workspace_path,\n messages,\n metadata: JSON.parse(row.metadata) as Session['metadata'],\n };\n }\n\n private deserializeMessage(row: DbMessage): StoredMessage {\n return {\n id: row.id,\n sessionId: row.session_id,\n role: row.role as StoredMessage['role'],\n content: row.content,\n timestamp: row.timestamp,\n tokens: row.tokens ? JSON.parse(row.tokens) : undefined,\n agentMessages: row.agent_messages ? JSON.parse(row.agent_messages) : undefined,\n };\n }\n\n private deserializeIdentity(row: DbIdentity): Identity {\n return {\n id: row.id,\n name: row.name,\n description: row.description ?? undefined,\n avatar: row.avatar ?? undefined,\n createdAt: row.created_at,\n defaultModel: row.default_model ?? undefined,\n systemPrompt: row.system_prompt ?? undefined,\n isDefault: row.is_default === 1,\n };\n }\n\n private deserializeScheduledTask(row: DbScheduledTask): ScheduledTask {\n return {\n id: row.id,\n name: row.name,\n cronExpression: row.cron_expression,\n prompt: row.prompt,\n identityId: row.identity_id ?? undefined,\n workspacePath: row.workspace_path ?? undefined,\n createdAt: row.created_at,\n lastRun: row.last_run ?? undefined,\n nextRun: row.next_run ?? undefined,\n enabled: row.enabled === 1,\n };\n }\n}\n\n// ── DB Row Types ──────────────────────────────\n\ninterface DbSession {\n id: string; title: string; created_at: string; updated_at: string;\n identity_id: string; workspace_path: string; metadata: string;\n}\ninterface DbMessage {\n id: string; session_id: string; role: string; content: string;\n timestamp: string; tokens: string | null; agent_messages: string | null;\n}\ninterface DbIdentity {\n id: string; name: string; description: string | null; avatar: string | null;\n created_at: string; default_model: string | null; system_prompt: string | null; is_default: number;\n}\ninterface DbScheduledTask {\n id: string; name: string; cron_expression: string; prompt: string;\n identity_id: string | null; workspace_path: string | null;\n created_at: string; last_run: string | null; next_run: string | null; enabled: number;\n}\ninterface DbAudit { id: string; session_id: string; timestamp: string; tier_id: string; action: string; details: string; }\ninterface DbFileSnapshot { id: string; session_id: string; file_path: string; content: string; timestamp: string; }\ninterface DbRuntimeSession {\n session_id: string; title: string; workspace_path: string; status: string;\n started_at: string; updated_at: string; latest_prompt: string | null; is_global: number;\n}\ninterface DbRuntimeNode {\n tier_id: string; session_id: string; parent_id: string | null; role: string;\n label: string; status: string; current_action: string | null; progress_pct: number | null;\n updated_at: string; workspace_path: string | null; is_global: number; output: string | null;\n}\ninterface DbRuntimeNodeLog {\n id: string; session_id: string; tier_id: string; role: string; label: string;\n status: string; current_action: string | null; progress_pct: number | null; timestamp: string;\n workspace_path: string | null; is_global: number; output: string | null;\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Config Manager\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { CascadeConfig, Identity } from '../types.js';\nimport { Keystore } from './keystore.js';\nimport { CascadeIgnore } from './ignore.js';\nimport { loadCascadeMd, type CascadeMdContent } from './cascade-md.js';\nimport { MemoryStore } from '../memory/store.js';\nimport { validateConfig } from './validate.js';\nimport {\n CASCADE_CONFIG_FILE,\n CASCADE_DB_FILE,\n GLOBAL_CONFIG_DIR,\n GLOBAL_KEYSTORE_FILE,\n} from '../constants.js';\n\nexport class ConfigManager {\n private config!: CascadeConfig;\n private keystore!: Keystore;\n private ignore!: CascadeIgnore;\n private store!: MemoryStore;\n private cascadeMd: CascadeMdContent | null = null;\n private workspacePath: string;\n private globalDir: string;\n\n constructor(workspacePath = process.cwd()) {\n this.workspacePath = workspacePath;\n this.globalDir = path.join(os.homedir(), GLOBAL_CONFIG_DIR);\n }\n\n async load(): Promise<void> {\n this.config = await this.loadConfig();\n this.ignore = new CascadeIgnore();\n await this.ignore.load(this.workspacePath);\n this.cascadeMd = await loadCascadeMd(this.workspacePath);\n this.keystore = new Keystore(path.join(this.globalDir, GLOBAL_KEYSTORE_FILE));\n this.store = new MemoryStore(path.join(this.workspacePath, CASCADE_DB_FILE));\n await this.injectEnvKeys();\n await this.ensureDefaultIdentity();\n }\n\n getConfig(): CascadeConfig {\n return this.config;\n }\n\n getKeystore(): Keystore {\n return this.keystore;\n }\n\n getIgnore(): CascadeIgnore {\n return this.ignore;\n }\n\n getStore(): MemoryStore {\n return this.store;\n }\n\n getCascadeMd(): CascadeMdContent | null {\n return this.cascadeMd;\n }\n\n getWorkspacePath(): string {\n return this.workspacePath;\n }\n\n async save(): Promise<void> {\n const configPath = path.join(this.workspacePath, CASCADE_CONFIG_FILE);\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(this.config, null, 2), 'utf-8');\n }\n\n async updateConfig(updates: Partial<CascadeConfig>): Promise<void> {\n this.config = validateConfig({ ...this.config, ...updates });\n await this.save();\n }\n\n getApiKey(provider: string): string | undefined {\n const envMap: Record<string, string> = {\n anthropic: 'ANTHROPIC_API_KEY',\n openai: 'OPENAI_API_KEY',\n gemini: 'GOOGLE_API_KEY',\n azure: 'AZURE_OPENAI_KEY',\n };\n const envKey = envMap[provider];\n if (envKey && process.env[envKey]) return process.env[envKey];\n if (this.keystore.isUnlocked()) {\n const key = this.keystore.get(`provider:${provider}`);\n if (key) return key;\n }\n const configProvider = this.config.providers.find(p => p.type === provider);\n return configProvider?.apiKey;\n }\n\n private async loadConfig(): Promise<CascadeConfig> {\n const configPath = path.join(this.workspacePath, CASCADE_CONFIG_FILE);\n try {\n const raw = await fs.readFile(configPath, 'utf-8');\n return validateConfig(JSON.parse(raw) as unknown);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return validateConfig({});\n }\n throw err;\n }\n }\n\n private async injectEnvKeys(): Promise<void> {\n const isFirstRun = this.config.providers.length === 0;\n\n const envProviders: Array<{ env: string; type: CascadeConfig['providers'][0]['type'] }> = [\n { env: 'ANTHROPIC_API_KEY', type: 'anthropic' },\n { env: 'OPENAI_API_KEY', type: 'openai' },\n { env: 'GOOGLE_API_KEY', type: 'gemini' },\n { env: 'AZURE_OPENAI_KEY', type: 'azure' },\n ];\n\n for (const { env, type } of envProviders) {\n const key = process.env[env];\n if (!key) continue;\n const existing = this.config.providers.find((p) => p.type === type);\n \n if (!existing && isFirstRun) {\n this.config.providers.push({ type, apiKey: key });\n } else if (existing && !existing.apiKey) {\n existing.apiKey = key;\n }\n }\n\n if (isFirstRun && !this.config.providers.find((p) => p.type === 'ollama')) {\n this.config.providers.push({ type: 'ollama' });\n }\n }\n\n private async ensureDefaultIdentity(): Promise<void> {\n const existing = this.store.getDefaultIdentity();\n if (existing) return;\n const identity: Identity = {\n id: randomUUID(),\n name: 'Default',\n description: 'Default Cascade identity',\n createdAt: new Date().toISOString(),\n isDefault: true,\n };\n this.store.createIdentity(identity);\n this.config.defaultIdentityId = identity.id;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Programmatic SDK\n// ─────────────────────────────────────────────\n\nimport type {\n CascadeConfig,\n CascadeRunOptions,\n CascadeRunResult,\n StreamChunk,\n} from '../types.js';\nimport { Cascade } from '../core/cascade.js';\nimport { ConfigManager } from '../config/index.js';\nimport { CascadeConfigSchema } from '../config/schema.js';\n\nexport { Cascade } from '../core/cascade.js';\nexport * from '../types.js';\n\n/**\n * High-level SDK entry point — loads config from the workspace and runs a task.\n *\n * Cascade automatically determines complexity and routes to the appropriate\n * tier: T3 (simple), T2 (moderate), or the full T1→T2→T3 hierarchy (complex).\n *\n * @param prompt - The natural-language task description to execute.\n * @param options - Optional overrides for run behavior, approval callbacks, etc.\n * @returns A resolved `CascadeRunResult` with the final output and metadata.\n *\n * @example\n * const result = await runCascade('Refactor the auth module to use JWT', {\n * workspacePath: '/path/to/my/project',\n * streamCallback: (chunk) => process.stdout.write(chunk.text ?? ''),\n * approvalCallback: async (req) => {\n * console.log(`Approve ${req.toolName}?`);\n * return { approved: true, always: false };\n * },\n * });\n * console.log(result.output);\n */\nexport async function runCascade(\n prompt: string,\n options: Partial<CascadeRunOptions> & { workspacePath?: string; config?: Partial<CascadeConfig> } = {},\n): Promise<CascadeRunResult> {\n const workspacePath = options.workspacePath ?? process.cwd();\n\n const cm = new ConfigManager(workspacePath);\n await cm.load();\n const config = options.config\n ? CascadeConfigSchema.parse({ ...cm.getConfig(), ...options.config })\n : cm.getConfig();\n\n const cascade = new Cascade(config, workspacePath);\n await cascade.init();\n\n try {\n return await cascade.run({\n prompt,\n workspacePath,\n ...options,\n });\n } finally {\n // Fire-and-forget SDK invocations should not leak the MCP child\n // processes Cascade may have spawned. `createCascade` (which returns\n // the instance) still leaves cleanup to the caller.\n try { await cascade.close(); } catch { /* non-critical */ }\n }\n}\n\n/**\n * Create a `Cascade` instance with custom config — no filesystem config loading.\n *\n * Use this in environments where you control the config programmatically\n * (e.g. tests, serverless, embedded usage).\n *\n * @param config - Partial config; missing fields use schema defaults.\n * @param workspacePath - Workspace root (default: `process.cwd()`).\n *\n * @example\n * const cascade = createCascade({\n * providers: [{ type: 'anthropic', apiKey: process.env.ANTHROPIC_KEY }],\n * });\n * cascade.on('stream:token', (e) => process.stdout.write(e.text));\n * await cascade.init();\n * await cascade.run({ prompt: 'Hello world', workspacePath: '.' });\n */\nexport function createCascade(\n config: Partial<CascadeConfig>,\n workspacePath: string = process.cwd(),\n): Cascade {\n const parsed = CascadeConfigSchema.parse(config);\n return new Cascade(parsed, workspacePath);\n}\n\n/**\n * Convenience streaming helper — runs a task and delivers tokens via callback.\n *\n * @param prompt - The task to execute.\n * @param onToken - Called with each streamed text token as it arrives.\n * @param options - Same options as `runCascade`.\n *\n * @example\n * await streamCascade('Summarize this codebase', (token) => {\n * process.stdout.write(token);\n * });\n */\nexport async function streamCascade(\n prompt: string,\n onToken: (text: string) => void,\n options: Partial<CascadeRunOptions> & { workspacePath?: string } = {},\n): Promise<CascadeRunResult> {\n return runCascade(prompt, {\n ...options,\n streamCallback: (chunk: StreamChunk) => {\n if (chunk.text) onToken(chunk.text);\n },\n });\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — JWT Auth\n// ─────────────────────────────────────────────\n\nimport jwt from 'jsonwebtoken';\nimport type { Request, Response, NextFunction } from 'express';\n\nexport interface DashboardUser {\n id: string;\n username: string;\n role: 'admin' | 'viewer';\n}\n\nexport function createToken(user: DashboardUser, secret: string): string {\n return jwt.sign(user, secret, { expiresIn: '24h' });\n}\n\nexport function verifyToken(token: string, secret: string): DashboardUser | null {\n try {\n return jwt.verify(token, secret) as DashboardUser;\n } catch {\n return null;\n }\n}\n\nexport function authMiddleware(secret: string, required = true) {\n return (req: Request, res: Response, next: NextFunction): void => {\n const header = req.headers.authorization;\n const token = header?.startsWith('Bearer ') ? header.slice(7) : undefined;\n\n if (!token) {\n if (!required) { (req as Request & { user?: DashboardUser }).user = undefined; next(); return; }\n res.status(401).json({ error: 'Unauthorized' });\n return;\n }\n\n const user = verifyToken(token, secret);\n if (!user) {\n res.status(401).json({ error: 'Invalid or expired token' });\n return;\n }\n\n (req as Request & { user: DashboardUser }).user = user;\n next();\n };\n}\n","import type {\n ApprovalResponse,\n PermissionDecisionPayload,\n RuntimeRefreshPayload,\n RuntimeScope,\n SessionSubscriptionPayload,\n} from '../types.js';\n\nexport function normalizeRuntimeRefreshPayload(\n payload?: RuntimeRefreshPayload | RuntimeScope,\n): RuntimeRefreshPayload {\n if (payload === 'workspace' || payload === 'global') {\n return { scope: payload };\n }\n return { scope: payload?.scope ?? 'workspace' };\n}\n\nexport function normalizeSessionSubscriptionPayload(\n payload: SessionSubscriptionPayload | string,\n): SessionSubscriptionPayload {\n return typeof payload === 'string' ? { sessionId: payload } : payload;\n}\n\nexport function normalizePermissionDecisionPayload(\n payload: PermissionDecisionPayload | ApprovalResponse,\n): PermissionDecisionPayload {\n if ('requestId' in payload) return payload;\n return {\n requestId: payload.id,\n approved: payload.approved,\n always: payload.always,\n decidedBy: 'USER',\n };\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — WebSocket (Socket.io)\n// ─────────────────────────────────────────────\n\nimport { Server as SocketServer } from 'socket.io';\nimport parser from 'socket.io-msgpack-parser';\nimport type { Server as HttpServer } from 'node:http';\nimport type {\n CascadeEvent,\n PeerMessageEvent,\n PermissionDecisionPayload,\n PermissionRequest,\n RuntimeRefreshPayload,\n SessionSubscriptionPayload,\n} from '../types.js';\nimport { verifyToken } from './auth.js';\nimport {\n normalizePermissionDecisionPayload,\n normalizeRuntimeRefreshPayload,\n normalizeSessionSubscriptionPayload,\n} from './socket-protocol.js';\n\ninterface DashboardSocketOptions {\n authRequired: boolean;\n secret: string;\n corsOrigin?: string | string[];\n}\n\nexport class DashboardSocket {\n private io: SocketServer;\n private authRequired: boolean;\n private secret: string;\n\n constructor(httpServer: HttpServer, options: DashboardSocketOptions) {\n const corsOrigin = options.corsOrigin ?? '*';\n this.io = new SocketServer(httpServer, {\n cors: { origin: corsOrigin, methods: ['GET', 'POST'] },\n parser,\n });\n this.authRequired = options.authRequired;\n this.secret = options.secret;\n this.setupHandlers();\n }\n\n broadcastToRoom(room: string, event: string, data: unknown): void {\n this.io.to(room).emit(event, data);\n }\n\n broadcast(event: string, data: unknown): void {\n this.io.emit(event, data);\n }\n\n emitCascadeEvent(ev: CascadeEvent): void {\n this.io.emit('cascade:event', ev);\n }\n\n emitTierStatus(tierId: string, role: string, status: string, sessionId: string, action?: string): void {\n const payload = { tierId, role, status, action, timestamp: new Date().toISOString(), sessionId };\n this.io.emit('tier:status', payload);\n this.io.to(`session:${sessionId}`).emit('tier:status', payload);\n }\n\n emitStreamToken(tierId: string, text: string, sessionId: string): void {\n this.io.to(`session:${sessionId}`).emit('stream:token', { tierId, text, sessionId });\n }\n\n emitPeerMessage(event: PeerMessageEvent): void {\n this.io.to(`session:${event.sessionId}`).emit('peer:message', event);\n }\n\n emitApprovalRequest(request: PermissionRequest): void {\n this.io.emit('permission:user-required', request);\n }\n\n onApprovalResponse(callback: (data: PermissionDecisionPayload) => void): void {\n this.io.on('connection', (socket) => {\n socket.on('permission:decision', (payload: PermissionDecisionPayload) => {\n callback(normalizePermissionDecisionPayload(payload));\n });\n });\n }\n\n private setupHandlers(): void {\n this.io.on('connection', (socket) => {\n const token = typeof socket.handshake.auth?.token === 'string'\n ? socket.handshake.auth.token\n : undefined;\n const user = token ? verifyToken(token, this.secret) : null;\n\n if (this.authRequired && !user) {\n socket.emit('auth:error', { error: 'Unauthorized socket connection' });\n socket.disconnect(true);\n return;\n }\n\n socket.data.user = user ?? undefined;\n\n socket.emit('runtime:refresh', { scope: 'workspace' } satisfies RuntimeRefreshPayload);\n socket.emit('runtime:refresh', { scope: 'global' } satisfies RuntimeRefreshPayload);\n socket.on('runtime:refresh', (payload?: RuntimeRefreshPayload) => {\n this.io.emit('runtime:refresh', normalizeRuntimeRefreshPayload(payload));\n });\n socket.on('session:halt', (payload: { sessionId?: string }) => {\n this.io.emit('session:halt', payload);\n });\n socket.on('session:approve', (payload: { nodeId?: string }) => {\n this.io.emit('session:approve', payload);\n });\n socket.on('session:message-injected', (payload: { message?: string }) => {\n this.io.emit('session:message-injected', payload);\n });\n socket.on('join:session', (payload: SessionSubscriptionPayload) => {\n const { sessionId } = normalizeSessionSubscriptionPayload(payload);\n socket.join(`session:${sessionId}`);\n });\n socket.on('leave:session', (payload: SessionSubscriptionPayload) => {\n const { sessionId } = normalizeSessionSubscriptionPayload(payload);\n socket.leave(`session:${sessionId}`);\n });\n });\n }\n\n close(): void {\n this.io.close();\n }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","// ─────────────────────────────────────────────\n// Cascade AI — Dashboard Express Server\n// ─────────────────────────────────────────────\n\nimport { createServer } from 'node:http';\nimport { fileURLToPath } from 'node:url';\nimport os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport express, { type Request, type Response } from 'express';\nimport rateLimit from 'express-rate-limit';\nimport bcrypt from 'bcryptjs';\nimport type { CascadeConfig } from '../types.js';\nimport { MemoryStore } from '../memory/store.js';\nimport type { RuntimeNode, RuntimeNodeLog, RuntimeSession } from '../types.js';\nimport { CASCADE_DB_FILE, GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE, CASCADE_CONFIG_FILE, CASCADE_DASHBOARD_SECRET_FILE } from '../constants.js';\nimport { DashboardSocket } from './websocket.js';\nimport { authMiddleware, createToken } from './auth.js';\nimport { DEFAULT_DASHBOARD_PORT } from '../constants.js';\nimport { randomUUID, timingSafeEqual } from 'node:crypto';\nimport type { Identity, TierLimits, BudgetConfig } from '../types.js';\nimport { Cascade } from '../core/cascade.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport class DashboardServer {\n private app: express.Application;\n private httpServer: ReturnType<typeof createServer>;\n private socket: DashboardSocket;\n private config: CascadeConfig;\n private dashboardSecret: string;\n private store: MemoryStore;\n private globalStore: MemoryStore | null = null;\n private broadcastTimer: NodeJS.Timeout | null = null;\n private port: number;\n private workspacePath: string;\n\n constructor(config: CascadeConfig, store: MemoryStore, workspacePath = process.cwd()) {\n this.config = config;\n this.store = store;\n this.workspacePath = workspacePath;\n this.port = config.dashboard.port ?? DEFAULT_DASHBOARD_PORT;\n this.dashboardSecret = this.resolveDashboardSecret();\n this.app = express();\n this.httpServer = createServer(this.app);\n this.socket = new DashboardSocket(this.httpServer, {\n authRequired: config.dashboard.auth,\n secret: this.dashboardSecret,\n corsOrigin: config.dashboard.auth\n ? [`http://localhost:${this.port}`, `http://127.0.0.1:${this.port}`]\n : '*',\n });\n this.setupMiddleware();\n this.setupRoutes();\n }\n\n async start(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error) => reject(err);\n this.httpServer.once('error', onError);\n this.httpServer.listen(this.port, () => {\n this.httpServer.off('error', onError);\n resolve();\n });\n });\n }\n\n async stop(): Promise<void> {\n // Cancel any pending throttled broadcast so we don't fire a broadcast\n // on an already-closed socket (which logs noisy errors and keeps the\n // event loop alive).\n if (this.broadcastTimer) {\n clearTimeout(this.broadcastTimer);\n this.broadcastTimer = null;\n }\n this.socket.close();\n // Release the lazily-opened global runtime DB handle so the caller can\n // safely reopen the dashboard or delete the underlying file.\n try { this.globalStore?.close(); } catch { /* ignore */ }\n this.globalStore = null;\n await new Promise<void>((resolve, reject) => {\n this.httpServer.close((err) => (err ? reject(err) : resolve()));\n });\n }\n\n getSocket(): DashboardSocket {\n return this.socket;\n }\n\n /**\n * Produce a stable dashboard JWT signing secret.\n *\n * Order of precedence: explicit config → env var → secret file on disk\n * (auto-created with 0600 perms). Previously this generated a fresh UUID\n * on every process start which invalidated all outstanding JWTs.\n */\n private resolveDashboardSecret(): string {\n const fromConfig = this.config.dashboard.secret ?? process.env['CASCADE_DASHBOARD_SECRET'];\n if (fromConfig) return fromConfig;\n\n const secretPath = path.join(this.workspacePath, CASCADE_DASHBOARD_SECRET_FILE);\n try {\n if (fs.existsSync(secretPath)) {\n const existing = fs.readFileSync(secretPath, 'utf-8').trim();\n if (existing.length >= 16) return existing;\n }\n const generated = randomUUID();\n fs.mkdirSync(path.dirname(secretPath), { recursive: true });\n fs.writeFileSync(secretPath, generated, { encoding: 'utf-8', mode: 0o600 });\n if (this.config.dashboard.auth) {\n console.warn(\n `Dashboard auth enabled with no secret configured; persisted a generated secret to ${secretPath}. ` +\n `Set CASCADE_DASHBOARD_SECRET or config.dashboard.secret to override.`,\n );\n }\n return generated;\n } catch {\n // Read-only FS fallback: use an ephemeral secret but warn loudly.\n console.warn('Unable to persist dashboard secret; falling back to a process-ephemeral secret.');\n return randomUUID();\n }\n }\n\n /**\n * Resolve the dashboard password as a bcrypt hash.\n * Accepts either a pre-hashed `CASCADE_DASHBOARD_PASSWORD_HASH` or a plain\n * `CASCADE_DASHBOARD_PASSWORD` which is hashed once at startup.\n */\n private resolvePasswordHash(): string | null {\n const preHashed = process.env['CASCADE_DASHBOARD_PASSWORD_HASH'];\n if (preHashed && preHashed.startsWith('$2')) return preHashed;\n const plain = process.env['CASCADE_DASHBOARD_PASSWORD'];\n if (!plain) return null;\n return bcrypt.hashSync(plain, 10);\n }\n\n // ── Setup ─────────────────────────────────────\n\n private getGlobalStore(): MemoryStore {\n if (!this.globalStore) {\n const globalDbPath = path.join(os.homedir(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE);\n this.globalStore = new MemoryStore(globalDbPath);\n }\n return this.globalStore;\n }\n\n private throttledBroadcast(scope: 'workspace' | 'global'): void {\n if (this.broadcastTimer) return;\n this.broadcastTimer = setTimeout(() => {\n this.broadcastRuntime(scope);\n this.broadcastTimer = null;\n }, 500);\n }\n\n private broadcastRuntime(scope: 'workspace' | 'global'): void {\n if (scope === 'global') {\n const globalStore = this.getGlobalStore();\n try {\n // Broadcast only session list (summary) to everyone\n this.socket.broadcast('runtime:update', {\n scope,\n source: 'dashboard/server',\n fetchedAt: new Date().toISOString(),\n sessions: globalStore.listRuntimeSessions(100),\n nodes: [], // No nodes in summary\n logs: [], // No logs in summary\n });\n } catch (err) {\n console.error('Failed to broadcast global runtime:', err);\n }\n return;\n }\n\n // Workspace scope\n const sessions = this.store.listRuntimeSessions(100);\n this.socket.broadcast('runtime:update', {\n scope,\n source: 'dashboard/server',\n fetchedAt: new Date().toISOString(),\n sessions,\n nodes: [],\n logs: [],\n });\n\n // Broadcast details to active session rooms\n for (const session of sessions) {\n if (session.status === 'ACTIVE') {\n this.broadcastSessionDetails(session.sessionId);\n }\n }\n }\n\n private broadcastSessionDetails(sessionId: string): void {\n try {\n const nodes = this.store.listRuntimeNodes(sessionId, 500);\n const logs = this.store.listRuntimeNodeLogs(sessionId, undefined, 100);\n this.socket.broadcastToRoom(`session:${sessionId}`, 'session:details', {\n sessionId,\n nodes,\n logs,\n updatedAt: new Date().toISOString(),\n });\n } catch (err) {\n console.error(`Failed to broadcast details for session ${sessionId}:`, err);\n }\n }\n\n watchRuntimeChanges(): void {\n const workspaceDbPath = path.join(this.workspacePath, CASCADE_DB_FILE);\n const globalDbPath = path.join(os.homedir(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE);\n const watchPaths = [workspaceDbPath, globalDbPath].filter((p, index, arr) => arr.indexOf(p) === index);\n\n for (const watchPath of watchPaths) {\n if (!fs.existsSync(watchPath)) continue;\n // Increase interval to 3s and use throttled broadcast\n fs.watchFile(watchPath, { interval: 3000 }, () => {\n this.throttledBroadcast(watchPath === globalDbPath ? 'global' : 'workspace');\n });\n }\n }\n\n public refreshRuntime(scope: 'workspace' | 'global' = 'workspace'): void {\n this.broadcastRuntime(scope);\n }\n\n private setupMiddleware(): void {\n this.app.use(express.json({ limit: '10mb' }));\n this.app.use(express.urlencoded({ extended: true }));\n\n // CORS for dev\n this.app.use((_req, res, next) => {\n if (!this.config.dashboard.auth) {\n res.header('Access-Control-Allow-Origin', '*');\n }\n res.header('Access-Control-Allow-Headers', 'Authorization, Content-Type');\n res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n next();\n });\n }\n\n private setupRoutes(): void {\n const authRequired = this.config.dashboard.auth;\n const auth = authMiddleware(this.dashboardSecret, authRequired);\n const passwordHash = authRequired ? this.resolvePasswordHash() : null;\n\n // Brute-force protection: 5 attempts / 15 min per IP.\n const loginLimiter = rateLimit({\n windowMs: 15 * 60 * 1000,\n limit: 5,\n standardHeaders: 'draft-7',\n legacyHeaders: false,\n message: { error: 'Too many login attempts. Try again in 15 minutes.' },\n });\n\n // General API limiter: 60 req/min per IP on all /api routes.\n const apiLimiter = rateLimit({\n windowMs: 60 * 1000,\n limit: 60,\n standardHeaders: 'draft-7',\n legacyHeaders: false,\n message: { error: 'Too many requests. Slow down.' },\n });\n this.app.use('/api', apiLimiter);\n\n // Stricter limiter for mutation/execution endpoints: 10 req/min per IP.\n const mutationLimiter = rateLimit({\n windowMs: 60 * 1000,\n limit: 10,\n standardHeaders: 'draft-7',\n legacyHeaders: false,\n message: { error: 'Too many requests on this endpoint.' },\n });\n\n // ── Auth ────────────────────────────────────\n this.app.post('/api/auth/login', loginLimiter, (req: Request, res: Response) => {\n const { username, password } = (req.body ?? {}) as { username?: string; password?: string };\n if (!authRequired) {\n const token = createToken(\n { id: username ?? 'anonymous', username: username ?? 'anonymous', role: 'admin' },\n this.dashboardSecret,\n );\n res.json({ token });\n return;\n }\n if (!passwordHash) {\n res.status(503).json({\n error: 'Dashboard password is not configured. Set CASCADE_DASHBOARD_PASSWORD (or CASCADE_DASHBOARD_PASSWORD_HASH) or disable dashboard auth.',\n });\n return;\n }\n if (typeof password !== 'string' || typeof username !== 'string') {\n res.status(400).json({ error: 'username and password are required' });\n return;\n }\n // bcrypt.compareSync is constant-time; we additionally gate on a\n // timingSafeEqual over the stringified result to preserve the same\n // response timing for both branches.\n const ok = bcrypt.compareSync(password, passwordHash);\n const truthy = Buffer.from('1');\n const falsy = Buffer.from('0');\n const probe = ok ? truthy : falsy;\n const authorized = timingSafeEqual(probe, truthy);\n if (authorized) {\n const token = createToken(\n { id: username, username, role: 'admin' },\n this.dashboardSecret,\n );\n res.json({ token });\n } else {\n res.status(401).json({ error: 'Invalid credentials' });\n }\n });\n\n // ── Commands ────────────────────────────────────\n this.app.post('/api/force-halt', auth, mutationLimiter, (req: Request, res: Response) => {\n const body = req.body as Record<string, unknown>;\n const sessionId = typeof body['sessionId'] === 'string' ? body['sessionId'] : undefined;\n const nodeId = typeof body['nodeId'] === 'string' ? body['nodeId'] : undefined;\n const payload = { sessionId, nodeId, requestedAt: new Date().toISOString() };\n this.socket.broadcast('session:halt', payload);\n if (sessionId) this.socket.broadcastToRoom(`session:${sessionId}`, 'session:halt', payload);\n res.json({ success: true, ...payload });\n });\n\n this.app.post('/api/approve', auth, mutationLimiter, (req: Request, res: Response) => {\n const body = req.body as Record<string, unknown>;\n const sessionId = typeof body['sessionId'] === 'string' ? body['sessionId'] : undefined;\n const nodeId = typeof body['nodeId'] === 'string' ? body['nodeId'] : undefined;\n const payload = { sessionId, nodeId, requestedAt: new Date().toISOString() };\n this.socket.broadcast('session:approve', payload);\n if (sessionId) this.socket.broadcastToRoom(`session:${sessionId}`, 'session:approve', payload);\n res.json({ success: true, ...payload });\n });\n\n this.app.post('/api/inject', auth, mutationLimiter, (req: Request, res: Response) => {\n const body = req.body as Record<string, unknown>;\n const message = typeof body['message'] === 'string' ? body['message'] : undefined;\n const sessionId = typeof body['sessionId'] === 'string' ? body['sessionId'] : undefined;\n const nodeId = typeof body['nodeId'] === 'string' ? body['nodeId'] : undefined;\n if (!message) {\n res.status(400).json({ error: 'message is required and must be a string' });\n return;\n }\n const payload = { sessionId, nodeId, message, requestedAt: new Date().toISOString() };\n this.socket.broadcast('session:message-injected', payload);\n if (sessionId) this.socket.broadcastToRoom(`session:${sessionId}`, 'session:message-injected', payload);\n res.json({ success: true, ...payload });\n });\n \n // ── Sessions ────────────────────────────────\n this.app.get('/api/sessions', auth, (_req, res) => {\n const sessions = this.store.listSessions();\n res.json(sessions);\n });\n\n this.app.get('/api/sessions/:id', auth, (req, res) => {\n const id = req.params.id as string;\n const session = this.store.getSession(id);\n if (!session) { res.status(404).json({ error: 'Not found' }); return; }\n res.json(session);\n });\n\n this.app.delete('/api/sessions/:id', auth, (req, res) => {\n const sessionId = req.params.id as string;\n this.store.deleteSession(sessionId);\n this.store.deleteRuntimeSession(sessionId);\n\n const globalDbPath = path.join(os.homedir(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE);\n const globalStore = new MemoryStore(globalDbPath);\n try {\n globalStore.deleteRuntimeSession(sessionId);\n } finally {\n globalStore.close();\n }\n\n this.socket.broadcast('session:deleted', { sessionId });\n this.socket.broadcast('runtime:refresh', { scope: 'workspace' });\n this.socket.broadcast('runtime:refresh', { scope: 'global' });\n res.json({ ok: true });\n });\n\n this.app.delete('/api/sessions', auth, (req: Request, res: Response) => {\n const body = req.body as { ids?: string[] } | undefined;\n const globalDbPath = path.join(os.homedir(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE);\n\n if (body?.ids && Array.isArray(body.ids) && body.ids.length > 0) {\n // Bulk delete specific sessions by IDs\n const globalStore = new MemoryStore(globalDbPath);\n try {\n for (const id of body.ids) {\n this.store.deleteSession(id);\n this.store.deleteRuntimeSession(id);\n globalStore.deleteRuntimeSession(id);\n this.socket.broadcast('session:deleted', { sessionId: id });\n }\n } finally {\n globalStore.close();\n }\n res.json({ ok: true, deleted: body.ids.length });\n } else {\n // Delete all sessions (original behavior)\n this.store.deleteAllSessions();\n res.json({ ok: true });\n }\n this.socket.broadcast('runtime:refresh', { scope: 'workspace' });\n this.socket.broadcast('runtime:refresh', { scope: 'global' });\n });\n\n this.app.delete('/api/runtime', auth, (_req, res) => {\n this.store.deleteAllRuntimeNodes();\n const globalDbPath = path.join(os.homedir(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE);\n const globalStore = new MemoryStore(globalDbPath);\n try {\n globalStore.deleteAllRuntimeNodes();\n } finally {\n globalStore.close();\n }\n this.socket.broadcast('runtime:refresh', { scope: 'workspace' });\n this.socket.broadcast('runtime:refresh', { scope: 'global' });\n res.json({ ok: true });\n });\n\n // ── Identities ──────────────────────────────\n this.app.get('/api/identities', auth, (_req, res) => {\n res.json(this.store.listIdentities());\n });\n\n this.app.post('/api/identities', auth, (req: Request, res: Response) => {\n const body = req.body as Partial<Identity> & { setDefault?: boolean };\n if (!body.name) { res.status(400).json({ error: 'name is required' }); return; }\n if (body.setDefault) {\n const existing = this.store.getDefaultIdentity();\n if (existing) this.store.updateIdentity(existing.id, { isDefault: false });\n }\n const id = randomUUID();\n const identity: Identity = {\n id,\n name: body.name,\n description: body.description,\n systemPrompt: body.systemPrompt,\n isDefault: body.setDefault ?? false,\n createdAt: new Date().toISOString(),\n };\n this.store.createIdentity(identity);\n res.json(identity);\n });\n\n this.app.put('/api/identities/:id', auth, (req: Request, res: Response) => {\n const identityId = req.params.id as string;\n const body = req.body as Partial<Identity> & { setDefault?: boolean };\n if (body.setDefault) {\n const existing = this.store.getDefaultIdentity();\n if (existing && existing.id !== identityId) this.store.updateIdentity(existing.id, { isDefault: false });\n body.isDefault = true;\n }\n this.store.updateIdentity(identityId, body);\n res.json({ ok: true });\n });\n\n this.app.delete('/api/identities/:id', auth, (req: Request, res: Response) => {\n this.store.deleteIdentity(req.params.id as string);\n res.json({ ok: true });\n });\n\n // ── Audit log ───────────────────────────────\n this.app.get('/api/audit/:sessionId', auth, (req, res) => {\n const log = this.store.getAuditLog(req.params.sessionId as string);\n res.json(log);\n });\n\n this.app.get('/api/config', auth, (_req, res) => {\n // Strip sensitive fields before sending\n const safe = { ...this.config };\n safe.providers = safe.providers.map((p) => ({ ...p, apiKey: p.apiKey ? '***' : undefined }));\n res.json(safe);\n });\n\n this.app.put('/api/config', auth, async (req: Request, res: Response) => {\n const body = req.body as Record<string, unknown>;\n // Validate shape before mutating in-memory config\n if (body['tierLimits'] !== undefined && (typeof body['tierLimits'] !== 'object' || Array.isArray(body['tierLimits']))) {\n res.status(400).json({ error: 'tierLimits must be an object' });\n return;\n }\n if (body['budget'] !== undefined && (typeof body['budget'] !== 'object' || Array.isArray(body['budget']))) {\n res.status(400).json({ error: 'budget must be an object' });\n return;\n }\n if (body['tierLimits']) this.config.tierLimits = { ...this.config.tierLimits, ...(body['tierLimits'] as TierLimits) };\n if (body['budget']) this.config.budget = { ...this.config.budget, ...(body['budget'] as BudgetConfig) };\n // Persist to .cascade/config.json atomically (write temp + rename)\n try {\n const configPath = path.join(this.workspacePath, CASCADE_CONFIG_FILE);\n const existing = fs.existsSync(configPath) ? JSON.parse(fs.readFileSync(configPath, 'utf-8')) : {};\n const updated = { ...existing, tierLimits: this.config.tierLimits, budget: this.config.budget };\n const tmp = configPath + '.tmp';\n fs.writeFileSync(tmp, JSON.stringify(updated, null, 2), 'utf-8');\n fs.renameSync(tmp, configPath);\n res.json({ ok: true });\n } catch (err) {\n res.status(500).json({ error: `Failed to save config: ${err instanceof Error ? err.message : String(err)}` });\n }\n });\n\n // ── Log History ─────────────────────────────\n this.app.get('/api/runtime/logs/:sessionId', auth, (req: Request, res: Response) => {\n const sessionId = req.params['sessionId'] as string;\n const before = req.query['before'] as string | undefined;\n const limitStr = req.query['limit'] as string | undefined;\n const logs = this.store.listRuntimeNodeLogs(\n sessionId,\n before,\n parseInt(limitStr || '100', 10),\n );\n res.json(logs);\n });\n\n // ── Stats ───────────────────────────────────\n this.app.get('/api/stats', auth, (_req, res) => {\n const sessions = this.store.listSessions(undefined, 1000);\n res.json({\n totalSessions: sessions.length,\n totalMessages: sessions.reduce((acc, s) => acc + s.metadata.taskCount, 0),\n totalCostUsd: sessions.reduce((acc, s) => acc + s.metadata.totalCostUsd, 0),\n });\n });\n\n // ── Runtime ──────────────────────────────────\n this.app.get('/api/runtime', auth, (req, res) => {\n const scope = (req.query['scope'] as string | undefined) ?? 'workspace';\n if (scope === 'global') {\n const globalDbPath = path.join(os.homedir(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE);\n const globalStore = new MemoryStore(globalDbPath);\n try {\n res.json({\n scope,\n sessions: globalStore.listRuntimeSessions(200),\n nodes: globalStore.listRuntimeNodes(undefined, 1000),\n logs: globalStore.listRuntimeNodeLogs(undefined, undefined, 500),\n });\n } finally {\n globalStore.close();\n }\n return;\n }\n res.json({\n scope: 'workspace',\n sessions: this.store.listRuntimeSessions(200),\n nodes: this.store.listRuntimeNodes(undefined, 1000),\n logs: this.store.listRuntimeNodeLogs(undefined, undefined, 500),\n });\n });\n\n // ── Remote Run ──────────────────────────────\n this.app.post('/api/run', auth, mutationLimiter, (req: Request, res: Response) => {\n const body = req.body as { prompt?: string; identityId?: string };\n if (!body.prompt || typeof body.prompt !== 'string') {\n res.status(400).json({ error: 'prompt is required' });\n return;\n }\n\n const sessionId = randomUUID();\n res.json({ sessionId, status: 'ACTIVE' });\n\n void (async () => {\n const cascade = new Cascade(this.config, this.workspacePath, this.store);\n\n cascade.on('stream:token', (e: { text: string; tierId: string }) => {\n this.socket.broadcast('stream:token', { sessionId, tierId: e.tierId, text: e.text });\n this.socket.broadcastToRoom(`session:${sessionId}`, 'stream:token', { sessionId, tierId: e.tierId, text: e.text });\n });\n cascade.on('tier:status', (e: unknown) => {\n this.socket.broadcast('tier:status', { sessionId, ...(e as object) });\n this.socket.broadcastToRoom(`session:${sessionId}`, 'tier:status', { sessionId, ...(e as object) });\n });\n cascade.on('permission:user-required', (e: unknown) => {\n this.socket.broadcastToRoom(`session:${sessionId}`, 'permission:user-required', { sessionId, ...(e as object) });\n });\n cascade.on('peer:message', (e: unknown) => {\n this.socket.emitPeerMessage(e as import('../types.js').PeerMessageEvent);\n });\n\n try {\n const result = await cascade.run({ prompt: body.prompt!, identityId: body.identityId });\n this.socket.broadcast('cost:update', {\n sessionId,\n totalTokens: result.usage.totalTokens,\n totalCostUsd: result.usage.estimatedCostUsd,\n });\n this.socket.broadcastToRoom(`session:${sessionId}`, 'session:complete', { sessionId, result });\n this.throttledBroadcast('workspace');\n } catch (err) {\n this.socket.broadcastToRoom(`session:${sessionId}`, 'session:error', {\n sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n });\n\n // ── Models ───────────────────────────────────\n this.app.get('/api/models', auth, (_req: Request, res: Response) => {\n res.json({\n t1: this.config.models?.t1 ?? 'auto',\n t2: this.config.models?.t2 ?? 'auto',\n t3: this.config.models?.t3 ?? 'auto',\n providers: this.config.providers.map((p) => ({\n type: p.type,\n label: p.label ?? p.type,\n })),\n });\n });\n\n // ── Serve React app ─────────────────────────\n // When running from built CLI, __dirname is dist/.\n // When running locally via ts-node, __dirname is src/dashboard.\n const prodPath = path.resolve(__dirname, '../web/dist');\n const devPath = path.resolve(__dirname, '../../web/dist');\n const webDistPath = fs.existsSync(prodPath) ? prodPath : devPath;\n\n if (fs.existsSync(webDistPath)) {\n this.app.use(express.static(webDistPath));\n this.app.get('*', (_req, res) => {\n res.sendFile(path.join(webDistPath, 'index.html'));\n });\n } else {\n this.app.get('/', (_req, res) => {\n res.send(`\n <html><body style=\"background:#0f0f1a;color:#e2e8f0;font-family:monospace;padding:2rem\">\n <h2>◈ Cascade Dashboard</h2>\n <p>Dashboard not built yet. Run: <code>npm run build:web</code></p>\n <p>API available at <a href=\"/api/stats\" style=\"color:#7c6af7\">/api/stats</a></p>\n </body></html>\n `);\n });\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Task Scheduler (node-cron)\n// ─────────────────────────────────────────────\n\nimport cron, { type ScheduledTask as CronTask } from 'node-cron';\nimport type { ScheduledTask } from '../types.js';\nimport type { MemoryStore } from '../memory/store.js';\n\ntype TaskRunner = (task: ScheduledTask) => Promise<void>;\n\nexport class TaskScheduler {\n private cronJobs: Map<string, CronTask> = new Map();\n private store: MemoryStore;\n private runner: TaskRunner;\n\n constructor(store: MemoryStore, runner: TaskRunner) {\n this.store = store;\n this.runner = runner;\n }\n\n start(): void {\n const tasks = this.store.listScheduledTasks();\n for (const task of tasks) {\n if (task.enabled) this.schedule(task);\n }\n }\n\n stop(): void {\n for (const job of this.cronJobs.values()) job.stop();\n this.cronJobs.clear();\n }\n\n schedule(task: ScheduledTask): void {\n if (!cron.validate(task.cronExpression)) {\n throw new Error(`Invalid cron expression: ${task.cronExpression}`);\n }\n\n // If the same task id is rescheduled, stop the previous cron job first so\n // it doesn't leak into the node-cron internals (node-cron keeps all\n // scheduled jobs alive via a timer until explicitly stopped).\n const existing = this.cronJobs.get(task.id);\n if (existing) {\n try { existing.stop(); } catch { /* ignore */ }\n }\n\n const job = cron.schedule(task.cronExpression, async () => {\n try {\n task.lastRun = new Date().toISOString();\n this.store.saveScheduledTask(task);\n await this.runner(task);\n } catch (err) {\n // Do NOT let cron-thrown rejections bubble into Node's\n // unhandledRejection handler — that crashes long-running daemons.\n console.error(`[scheduler] Task \"${task.id}\" (${task.cronExpression}) failed:`, err);\n }\n }, { timezone: 'UTC' });\n\n this.cronJobs.set(task.id, job);\n }\n\n unschedule(taskId: string): void {\n this.cronJobs.get(taskId)?.stop();\n this.cronJobs.delete(taskId);\n }\n\n add(task: ScheduledTask): void {\n this.store.saveScheduledTask(task);\n if (task.enabled) this.schedule(task);\n }\n\n remove(taskId: string): void {\n this.unschedule(taskId);\n this.store.deleteScheduledTask(taskId);\n }\n\n list(): ScheduledTask[] {\n return this.store.listScheduledTasks();\n }\n\n isRunning(taskId: string): boolean {\n return this.cronJobs.has(taskId);\n }\n\n static validateCron(expression: string): boolean {\n return cron.validate(expression);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Hooks System\n// ─────────────────────────────────────────────\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { HookDefinition, HooksConfig } from '../types.js';\n\nconst execFileAsync = promisify(execFile);\n\nconst SAFE_ENV_NAME = /^[A-Z][A-Z0-9_]*$/;\n\nfunction sanitizeEnvValue(v: unknown): string {\n const raw = typeof v === 'string' ? v : JSON.stringify(v);\n // Strip control chars and cap length so a malicious hook cannot inject NUL\n // or ANSI escape sequences that change how a downstream script parses its\n // environment.\n return raw.replace(/[\\x00-\\x1f\\x7f]/g, ' ').slice(0, 8192);\n}\n\nexport class HooksRunner {\n private config: HooksConfig;\n\n constructor(config: HooksConfig) {\n this.config = config;\n }\n\n async runPreToolUse(toolName: string, input: Record<string, unknown>): Promise<HookResult> {\n return this.runHooks(this.config.preToolUse ?? [], toolName, { tool: toolName, input });\n }\n\n async runPostToolUse(toolName: string, output: string): Promise<HookResult> {\n return this.runHooks(this.config.postToolUse ?? [], toolName, { tool: toolName, output });\n }\n\n async runPreTask(prompt: string): Promise<HookResult> {\n return this.runHooks(this.config.preTask ?? [], '*', { prompt });\n }\n\n async runPostTask(output: string, durationMs: number): Promise<HookResult> {\n return this.runHooks(this.config.postTask ?? [], '*', { output, durationMs });\n }\n\n private async runHooks(\n hooks: HookDefinition[],\n toolName: string,\n env: Record<string, unknown>,\n ): Promise<HookResult> {\n const applicable = hooks.filter(\n (h) => !h.tools?.length || h.tools.includes(toolName) || h.tools.includes('*'),\n );\n\n const results: string[] = [];\n for (const hook of applicable) {\n try {\n const envVars: Record<string, string> = {};\n for (const [k, v] of Object.entries(env)) {\n const name = `CASCADE_${k.toUpperCase()}`;\n // Reject environment variable names that contain shell-unsafe chars.\n // This cannot happen with the built-in callers (fixed strings), but\n // guards against future callers that forward user input.\n if (!SAFE_ENV_NAME.test(name)) continue;\n envVars[name] = sanitizeEnvValue(v);\n }\n\n // SECURITY: Previously this used `exec(hook.command, { env })`, which\n // interpolates the command string verbatim. Because `env` carries\n // tool input, any value containing `$(...)`, backticks, or `;` could\n // be executed by the shell that ran the hook. We now hand the command\n // to the platform shell as a literal argument via `execFile` — the\n // shell still interprets the command body (so users can keep writing\n // pipelines), but env values can never graft onto the command line.\n const isWin = process.platform === 'win32';\n const shell = isWin ? 'cmd.exe' : '/bin/sh';\n const shellArgs = isWin ? ['/d', '/s', '/c', hook.command] : ['-c', hook.command];\n\n const { stdout } = await execFileAsync(shell, shellArgs, {\n timeout: hook.timeout ?? 10_000,\n env: { ...process.env, ...envVars },\n windowsHide: true,\n });\n const text = typeof stdout === 'string' ? stdout : Buffer.from(stdout as ArrayBufferLike).toString('utf-8');\n if (text.trim()) results.push(text.trim());\n } catch (err) {\n return {\n success: false,\n output: results.join('\\n'),\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n return { success: true, output: results.join('\\n') };\n }\n}\n\nexport interface HookResult {\n success: boolean;\n output: string;\n error?: string;\n}\n"]}
1
+ {"version":3,"sources":["node-file:/home/runner/work/Cascade-AI/Cascade-AI/node_modules/keytar/build/Release/keytar.node","../node_modules/keytar/lib/keytar.js","../src/constants.ts","../src/providers/base.ts","../src/providers/anthropic.ts","../src/providers/openai.ts","../src/providers/azure.ts","../src/providers/gemini.ts","../src/providers/ollama.ts","../src/providers/openai-compatible.ts","../src/core/router/selector.ts","../src/core/router/failover.ts","../src/core/router/tpm-limiter.ts","../src/core/router/local-queue.ts","../src/utils/cost.ts","../src/utils/retry.ts","../src/core/router/model-profiler.ts","../src/core/router/savings.ts","../src/core/router/live-data.ts","../src/core/router/benchmarks.ts","../src/core/router/index.ts","../src/core/tiers/base.ts","../src/core/context/manager.ts","../src/audit/log.ts","../src/tools/text-tool-parser.ts","../src/core/tiers/t3-worker.ts","../src/core/peer/bus.ts","../src/core/tiers/t2-manager.ts","../src/utils/json-extract.ts","../src/core/tiers/t1-administrator.ts","../src/tools/base.ts","../src/tools/shell.ts","../src/tools/utils/workspace-path.ts","../src/tools/file.ts","../src/tools/git.ts","../src/tools/github.ts","../src/tools/browser.ts","../src/tools/image.ts","../src/tools/pdf.ts","../src/tools/interpreter.ts","../src/tools/peer.ts","../src/tools/web-search.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/utils/safe-fetch.ts","../src/tools/web-fetch.ts","../src/tools/mcp.ts","../src/tools/registry.ts","../src/mcp/client.ts","../src/core/permissions/escalator.ts","../src/config/schema.ts","../src/config/validate.ts","../src/telemetry/index.ts","../src/core/router/task-analyzer.ts","../src/core/router/model-performance-tracker.ts","../src/tools/tool-creator.ts","../src/core/cascade.ts","../src/config/keystore.ts","../src/config/ignore.ts","../src/config/cascade-md.ts","../src/memory/store.ts","../src/config/index.ts","../src/sdk/index.ts","../src/dashboard/auth.ts","../src/dashboard/socket-protocol.ts","../src/dashboard/websocket.ts","../src/dashboard/server.ts","../src/scheduler/index.ts","../src/hooks/index.ts"],"names":["require_keytar","Anthropic","OpenAI","AzureOpenAI","GoogleGenAI","HarmCategory","HarmBlockThreshold","path","os","fs","EventEmitter","randomUUID","finalOutput","exec","promisify","execAsync","output","simpleGit","PDFDocument","execSync","execFile","glob","net","dns","ignoreFactory","StdioClientTransport","Client","z","Worker","stats","durationMs","crypto","ignore","_ignoreModule","Database","jwt","SocketServer","parser","__dirname","fileURLToPath","express","createServer","bcrypt","rateLimit","timingSafeEqual","cron","execFileAsync"],"mappings":"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","file":"index.cjs","sourcesContent":["\n import path from \"/home/runner/work/Cascade-AI/Cascade-AI/node_modules/keytar/build/Release/keytar.node\"\n try { module.exports = require(path) }\n catch {}\n ","var keytar = require('../build/Release/keytar.node')\n\nfunction checkRequired(val, name) {\n if (!val || val.length <= 0) {\n throw new Error(name + ' is required.');\n }\n}\n\nmodule.exports = {\n getPassword: function (service, account) {\n checkRequired(service, 'Service')\n checkRequired(account, 'Account')\n\n return keytar.getPassword(service, account)\n },\n\n setPassword: function (service, account, password) {\n checkRequired(service, 'Service')\n checkRequired(account, 'Account')\n checkRequired(password, 'Password')\n\n return keytar.setPassword(service, account, password)\n },\n\n deletePassword: function (service, account) {\n checkRequired(service, 'Service')\n checkRequired(account, 'Account')\n\n return keytar.deletePassword(service, account)\n },\n\n findPassword: function (service) {\n checkRequired(service, 'Service')\n\n return keytar.findPassword(service)\n },\n\n findCredentials: function (service) {\n checkRequired(service, 'Service')\n\n return keytar.findCredentials(service)\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Constants\n// ─────────────────────────────────────────────\n\nimport type { ModelInfo, ProviderType, ThemeName } from './types.js';\n\nexport const CASCADE_VERSION = '0.9.6';\nexport const CASCADE_CONFIG_DIR = '.cascade';\nexport const CASCADE_MD_FILE = 'CASCADE.md';\nexport const CASCADE_IGNORE_FILE = '.cascadeignore';\nexport const CASCADE_CONFIG_FILE = '.cascade/config.json';\nexport const CASCADE_KEYSTORE_FILE = '.cascade/keystore.enc';\nexport const CASCADE_AUDIT_FILE = '.cascade/audit.log';\nexport const CASCADE_DB_FILE = '.cascade/memory.db';\nexport const CASCADE_DASHBOARD_SECRET_FILE = '.cascade/dashboard-secret';\n\nexport const GLOBAL_CONFIG_DIR = '.cascade-ai';\nexport const GLOBAL_DB_FILE = 'memory.db';\nexport const GLOBAL_KEYSTORE_FILE = 'keystore.enc';\nexport const GLOBAL_RUNTIME_DB_FILE = 'runtime.db';\n\nexport const DEFAULT_DASHBOARD_PORT = 4891;\nexport const DEFAULT_API_PORT = 4892;\nexport const DEFAULT_CONTEXT_LIMIT = 200_000;\nexport const DEFAULT_AUTO_SUMMARIZE_AT = 150_000;\nexport const DEFAULT_MAX_SESSION_MESSAGES = 1000;\nexport const DEFAULT_RETENTION_DAYS = 90;\n\n// ── Model Catalogue ───────────────────────────\n\nexport const MODELS: Record<string, ModelInfo> = {\n // Anthropic\n 'claude-opus-4': {\n id: 'claude-opus-4-5',\n name: 'Claude Opus 4',\n provider: 'anthropic',\n contextWindow: 200_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.015,\n outputCostPer1kTokens: 0.075,\n maxOutputTokens: 32_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'claude-sonnet-4': {\n id: 'claude-sonnet-4-5',\n name: 'Claude Sonnet 4',\n provider: 'anthropic',\n contextWindow: 200_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.003,\n outputCostPer1kTokens: 0.015,\n maxOutputTokens: 16_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'claude-haiku-3-5': {\n id: 'claude-haiku-3-5-20251001',\n name: 'Claude Haiku 3.5',\n provider: 'anthropic',\n contextWindow: 200_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.0008,\n outputCostPer1kTokens: 0.004,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'claude-haiku-4-5': {\n id: 'claude-haiku-4-5-20251001',\n name: 'Claude Haiku 4.5',\n provider: 'anthropic',\n contextWindow: 200_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.0008,\n outputCostPer1kTokens: 0.004,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: false,\n },\n // OpenAI\n 'gpt-4o': {\n id: 'gpt-4o',\n name: 'GPT-4o',\n provider: 'openai',\n contextWindow: 128_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.005,\n outputCostPer1kTokens: 0.015,\n maxOutputTokens: 16_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gpt-4o-mini': {\n id: 'gpt-4o-mini',\n name: 'GPT-4o Mini',\n provider: 'openai',\n contextWindow: 128_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.00015,\n outputCostPer1kTokens: 0.0006,\n maxOutputTokens: 16_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gpt-4.1': {\n id: 'gpt-4.1',\n name: 'GPT-4.1',\n provider: 'openai',\n contextWindow: 1_047_576,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.002,\n outputCostPer1kTokens: 0.008,\n maxOutputTokens: 32_768,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gpt-4.1-mini': {\n id: 'gpt-4.1-mini',\n name: 'GPT-4.1 Mini',\n provider: 'openai',\n contextWindow: 1_047_576,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.0004,\n outputCostPer1kTokens: 0.0016,\n maxOutputTokens: 32_768,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gpt-4.1-nano': {\n id: 'gpt-4.1-nano',\n name: 'GPT-4.1 Nano',\n provider: 'openai',\n contextWindow: 1_047_576,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.0001,\n outputCostPer1kTokens: 0.0004,\n maxOutputTokens: 32_768,\n supportsStreaming: true,\n isLocal: false,\n },\n // Google\n 'gemini-2.0-flash': {\n id: 'gemini-2.0-flash',\n name: 'Gemini 2.0 Flash',\n provider: 'gemini',\n contextWindow: 1_000_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.0001,\n outputCostPer1kTokens: 0.0004,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gemini-1.5-pro': {\n id: 'gemini-1.5-pro',\n name: 'Gemini 1.5 Pro',\n provider: 'gemini',\n contextWindow: 1_000_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.00125,\n outputCostPer1kTokens: 0.005,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gemini-2.0-flash-lite': {\n id: 'gemini-2.0-flash-lite',\n name: 'Gemini 2.0 Flash-Lite',\n provider: 'gemini',\n contextWindow: 1_000_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.00005,\n outputCostPer1kTokens: 0.0002,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gemini-2.5-pro': {\n id: 'gemini-2.5-pro',\n name: 'Gemini 2.5 Pro',\n provider: 'gemini',\n contextWindow: 1_000_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.00125,\n outputCostPer1kTokens: 0.01,\n maxOutputTokens: 65_536,\n supportsStreaming: true,\n isLocal: false,\n },\n 'gemini-2.5-flash': {\n id: 'gemini-2.5-flash',\n name: 'Gemini 2.5 Flash',\n provider: 'gemini',\n contextWindow: 1_000_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0.00015,\n outputCostPer1kTokens: 0.0006,\n maxOutputTokens: 65_536,\n supportsStreaming: true,\n isLocal: false,\n },\n // Local (Ollama)\n 'llama3.2:3b': {\n id: 'llama3.2:3b',\n name: 'Llama 3.2 3B',\n provider: 'ollama',\n contextWindow: 128_000,\n isVisionCapable: false,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 4_000,\n supportsStreaming: true,\n isLocal: true,\n minSizeB: 3,\n },\n 'llama3:70b': {\n id: 'llama3:70b',\n name: 'Llama 3 70B',\n provider: 'ollama',\n contextWindow: 128_000,\n isVisionCapable: false,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: true,\n minSizeB: 70,\n },\n 'mistral:7b': {\n id: 'mistral:7b',\n name: 'Mistral 7B',\n provider: 'ollama',\n contextWindow: 32_000,\n isVisionCapable: false,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 4_000,\n supportsStreaming: true,\n isLocal: true,\n minSizeB: 7,\n },\n 'llava': {\n id: 'llava',\n name: 'LLaVA (Vision)',\n provider: 'ollama',\n contextWindow: 4_096,\n isVisionCapable: true,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 2_000,\n supportsStreaming: true,\n isLocal: true,\n minSizeB: 7,\n },\n};\n\n// Make tool-capability explicit for every catalog model so the agent loop's\n// native-vs-text decision is intentional rather than \"undefined ⇒ assume\n// native\". Cloud models support native function-calling; hardcoded local\n// entries fall back to the text-tool emulation path (discovered Ollama models\n// get a per-family flag at runtime — see isToolCapable in providers/ollama.ts).\nfor (const _m of Object.values(MODELS)) {\n if (_m.supportsToolUse === undefined) _m.supportsToolUse = !_m.isLocal;\n}\n\n// ── Tier Model Priority Chains ─────────────────\n\nexport const T1_MODEL_PRIORITY: string[] = [\n 'claude-opus-4',\n 'claude-sonnet-4',\n 'gemini-2.5-pro',\n 'gpt-4.1',\n 'gpt-4o',\n 'gemini-1.5-pro',\n];\n\nexport const T2_MODEL_PRIORITY: string[] = [\n 'claude-sonnet-4',\n 'claude-haiku-4-5',\n 'claude-haiku-3-5',\n 'gemini-2.5-flash',\n 'gpt-4.1-mini',\n 'gpt-4o-mini',\n 'gemini-2.0-flash',\n 'llama3:70b',\n];\n\nexport const T3_MODEL_PRIORITY: string[] = [\n 'llama3.2:3b',\n 'mistral:7b',\n 'claude-haiku-4-5',\n 'claude-haiku-3-5',\n 'gpt-4.1-nano',\n 'gpt-4o-mini',\n 'gemini-2.5-flash',\n 'gemini-2.0-flash',\n];\n\nexport const VISION_MODEL_PRIORITY: string[] = [\n 'claude-sonnet-4',\n 'gpt-4o',\n 'gemini-2.0-flash',\n 'llava',\n];\n\n// ── Complexity → T2 count ──────────────────────\n\nexport const COMPLEXITY_T2_COUNT: Record<string, [number, number]> = {\n Simple: [1, 1],\n Moderate: [2, 3],\n Complex: [3, 5],\n 'Highly Complex': [5, 8],\n};\n\n// ── Themes ────────────────────────────────────\n\nexport const THEME_NAMES: ThemeName[] = ['cascade', 'dark', 'light', 'dracula', 'nord', 'solarized'];\nexport const DEFAULT_THEME: ThemeName = 'cascade';\n\n// ── Provider Endpoints ────────────────────────\n\nexport const OLLAMA_BASE_URL = 'http://localhost:11434';\nexport const LM_STUDIO_BASE_URL = 'http://localhost:1234';\nexport const AZURE_BASE_URL_TEMPLATE = 'https://{resource}.openai.azure.com';\n\n// ── Slash Commands ────────────────────────────\n// Command definitions live in src/cli/slash/index.ts.\n\n// ── Tool Names ────────────────────────────────\n\nexport const TOOL_NAMES = {\n SHELL: 'shell',\n FILE_READ: 'file_read',\n FILE_WRITE: 'file_write',\n FILE_EDIT: 'file_edit',\n FILE_DELETE: 'file_delete',\n FILE_LIST: 'file_list',\n GIT: 'git',\n GITHUB: 'github',\n BROWSER: 'browser',\n IMAGE_ANALYZE: 'image_analyze',\n PDF_CREATE: 'pdf_create',\n RUN_CODE: 'run_code',\n PEER_MESSAGE: 'peer_message',\n WEB_SEARCH: 'web_search',\n REQUEST_WORKERS: 'request_workers',\n} as const;\n\n// Defaults that require approval.\n// NOTE: every tool that mutates the filesystem, runs code, or performs a\n// network-side write must be listed here — approval is gated solely by this\n// list (plus user config), not by isDangerous(). file_edit and git were\n// previously omitted, so the agent could rewrite files in place (file_edit)\n// or push/checkout/commit (git) with no prompt while file_write/file_delete\n// required one.\nexport const DEFAULT_APPROVAL_REQUIRED = [\n TOOL_NAMES.SHELL,\n TOOL_NAMES.FILE_DELETE,\n TOOL_NAMES.FILE_WRITE,\n TOOL_NAMES.FILE_EDIT,\n TOOL_NAMES.GIT,\n TOOL_NAMES.BROWSER,\n TOOL_NAMES.GITHUB,\n 'pdf_create',\n 'run_code',\n];\n\n// ── Provider Names ────────────────────────────\n\nexport const PROVIDER_DISPLAY_NAMES: Record<ProviderType, string> = {\n anthropic: 'Anthropic',\n openai: 'OpenAI',\n gemini: 'Google Gemini',\n azure: 'Azure OpenAI',\n 'openai-compatible': 'OpenAI-Compatible',\n ollama: 'Ollama (Local)',\n};\n","// ─────────────────────────────────────────────\n// Cascade AI — Abstract Provider Base\n// ─────────────────────────────────────────────\n\nimport type {\n GenerateOptions,\n GenerateResult,\n ModelInfo,\n ProviderConfig,\n StreamChunk,\n TokenUsage,\n} from '../types.js';\n\nexport abstract class BaseProvider {\n protected config: ProviderConfig;\n protected model: ModelInfo;\n\n constructor(config: ProviderConfig, model: ModelInfo) {\n this.config = config;\n this.model = model;\n }\n\n abstract generate(options: GenerateOptions): Promise<GenerateResult>;\n\n abstract generateStream(\n options: GenerateOptions,\n onChunk: (chunk: StreamChunk) => void,\n ): Promise<GenerateResult>;\n\n abstract countTokens(text: string): Promise<number>;\n\n abstract listModels(): Promise<ModelInfo[]>;\n\n abstract isAvailable(): Promise<boolean>;\n\n getModel(): ModelInfo {\n return this.model;\n }\n\n isVisionCapable(): boolean {\n return this.model.isVisionCapable;\n }\n\n estimateCost(inputTokens: number, outputTokens: number): number {\n return (\n (inputTokens / 1000) * this.model.inputCostPer1kTokens +\n (outputTokens / 1000) * this.model.outputCostPer1kTokens\n );\n }\n\n protected makeUsage(inputTokens: number, outputTokens: number): TokenUsage {\n return {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n estimatedCostUsd: this.estimateCost(inputTokens, outputTokens),\n };\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Anthropic Provider\n// ─────────────────────────────────────────────\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport type {\n ConversationMessage,\n GenerateOptions,\n GenerateResult,\n ImageAttachment,\n ModelInfo,\n ProviderConfig,\n StreamChunk,\n} from '../types.js';\nimport { MODELS } from '../constants.js';\nimport { BaseProvider } from './base.js';\n\nexport class AnthropicProvider extends BaseProvider {\n private client: Anthropic;\n\n constructor(config: ProviderConfig, model: ModelInfo) {\n super(config, model);\n // OAuth bearer (e.g. a Claude Code subscription token) authenticates via\n // Authorization: Bearer + the oauth beta header instead of x-api-key.\n if (config.authToken) {\n this.client = new Anthropic({\n authToken: config.authToken,\n defaultHeaders: { 'anthropic-beta': 'oauth-2025-04-20' },\n });\n } else {\n this.client = new Anthropic({\n apiKey: config.apiKey,\n });\n }\n }\n\n async generate(options: GenerateOptions): Promise<GenerateResult> {\n const chunks: StreamChunk[] = [];\n return this.generateStream(options, (c) => chunks.push(c));\n }\n\n async generateStream(\n options: GenerateOptions,\n onChunk: (chunk: StreamChunk) => void,\n ): Promise<GenerateResult> {\n const messages = this.convertMessages(options.messages);\n const tools = options.tools?.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema as Anthropic.Tool['input_schema'],\n }));\n\n let fullContent = '';\n let inputTokens = 0;\n let outputTokens = 0;\n\n const stream = this.client.messages.stream({\n model: this.model.id,\n max_tokens: options.maxTokens ?? this.model.maxOutputTokens,\n temperature: options.temperature ?? 0.7,\n system: options.systemPrompt,\n messages,\n tools: tools?.length ? tools : undefined,\n }, { signal: options.signal });\n\n let isThinking = false;\n\n for await (const event of stream) {\n if (event.type === 'content_block_delta') {\n if ((event.delta as any).type === 'thinking_delta') {\n if (!isThinking) {\n isThinking = true;\n fullContent += '<think>\\n';\n onChunk({ text: '<think>\\n', finishReason: null });\n }\n const text = (event.delta as any).thinking;\n fullContent += text;\n onChunk({ text, finishReason: null });\n } else if (event.delta.type === 'text_delta') {\n if (isThinking) {\n isThinking = false;\n fullContent += '\\n</think>\\n\\n';\n onChunk({ text: '\\n</think>\\n\\n', finishReason: null });\n }\n const text = event.delta.text;\n fullContent += text;\n onChunk({ text, finishReason: null });\n }\n } else if (event.type === 'message_delta' && event.usage) {\n outputTokens = event.usage.output_tokens;\n } else if (event.type === 'message_start' && event.message.usage) {\n inputTokens = event.message.usage.input_tokens;\n }\n }\n\n if (isThinking) {\n fullContent += '\\n</think>\\n\\n';\n onChunk({ text: '\\n</think>\\n\\n', finishReason: null });\n }\n\n const finalMessage = await stream.finalMessage();\n const toolCalls = finalMessage.content\n .filter((b): b is Anthropic.ToolUseBlock => b.type === 'tool_use')\n .map((b) => ({\n id: b.id,\n name: b.name,\n input: b.input as Record<string, unknown>,\n }));\n\n onChunk({ text: '', finishReason: finalMessage.stop_reason as GenerateResult['finishReason'] });\n\n return {\n content: fullContent,\n usage: this.makeUsage(inputTokens, outputTokens),\n toolCalls: toolCalls.length ? toolCalls : undefined,\n finishReason: (finalMessage.stop_reason as GenerateResult['finishReason']) ?? 'stop',\n };\n }\n\n async countTokens(text: string): Promise<number> {\n // Anthropic token counting is often simplified to 4 chars per token if the SDK doesn't support it directly\n return Math.ceil(text.length / 4);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const resp = await fetch('https://api.anthropic.com/v1/models', {\n headers: {\n 'x-api-key': this.config.apiKey ?? '',\n 'anthropic-version': '2023-06-01',\n },\n });\n // Anthropic returns JSON-encoded error objects ({ type: \"error\", ... })\n // for 4xx/5xx responses. Calling `.data.map` on that crashes the caller\n // and hides the real authentication / network error. Fall through to\n // the hardcoded model list instead.\n if (!resp.ok) {\n return Object.values(MODELS).filter((m) => m.provider === 'anthropic');\n }\n const data = await resp.json() as { data?: Array<{ id: string; display_name: string }> };\n if (!Array.isArray(data?.data)) {\n return Object.values(MODELS).filter((m) => m.provider === 'anthropic');\n }\n\n return data.data.map((m) => {\n const known = Object.values(MODELS).find((km) => km.id === m.id && km.provider === 'anthropic');\n if (known) return known;\n\n return {\n id: m.id,\n name: m.display_name || m.id,\n provider: 'anthropic' as const,\n contextWindow: m.id.includes('3.5-sonnet') ? 200_000 : 100_000,\n isVisionCapable: true,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: false,\n };\n });\n } catch {\n return Object.values(MODELS).filter((m) => m.provider === 'anthropic');\n }\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n // Available with either an API key or an OAuth bearer token.\n return !!(this.config.apiKey || this.config.authToken);\n } catch {\n return false;\n }\n }\n\n private convertMessages(messages: ConversationMessage[]): Anthropic.MessageParam[] {\n const result: Anthropic.MessageParam[] = [];\n\n for (const m of messages) {\n // System messages in history are skipped — they're passed via the top-level `system` field\n if (m.role === 'system') continue;\n\n // ── Tool result messages → Anthropic tool_result content block ─────\n if (m.role === 'tool') {\n const toolContent = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n result.push({\n role: 'user',\n content: [{\n type: 'tool_result',\n tool_use_id: m.toolCallId ?? '',\n content: toolContent,\n }] as any,\n });\n continue;\n }\n\n // ── Assistant messages: may carry tool_use blocks ──────────────────\n if (m.role === 'assistant') {\n const content: any[] = [];\n\n // Text part\n const text = typeof m.content === 'string' ? m.content : '';\n if (text) content.push({ type: 'text', text });\n\n // Tool calls → tool_use blocks\n for (const tc of m.toolCalls ?? []) {\n content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.name,\n input: tc.input,\n });\n }\n\n if (content.length > 0) {\n result.push({ role: 'assistant', content });\n }\n continue;\n }\n\n // ── User messages ──────────────────────────────────────────────────\n if (m.role === 'user') {\n if (typeof m.content === 'string') {\n result.push({ role: 'user', content: m.content });\n } else {\n const content: any[] = m.content.map((block) => {\n if (block.type === 'text') return { type: 'text' as const, text: block.text };\n if (block.type === 'image') {\n const img = block.image as ImageAttachment;\n if (img.type === 'base64') {\n return {\n type: 'image' as const,\n source: { type: 'base64' as const, media_type: img.mimeType, data: img.data },\n };\n }\n return { type: 'image' as const, source: { type: 'url' as const, url: img.data } as any };\n }\n return { type: 'text' as const, text: '' };\n });\n result.push({ role: 'user', content });\n }\n }\n }\n\n return result;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — OpenAI Provider\n// ─────────────────────────────────────────────\n\nimport OpenAI from 'openai';\nimport type {\n ConversationMessage,\n GenerateOptions,\n GenerateResult,\n ImageAttachment,\n ModelInfo,\n ProviderConfig,\n StreamChunk,\n} from '../types.js';\nimport { MODELS } from '../constants.js';\nimport { BaseProvider } from './base.js';\n\nexport class OpenAIProvider extends BaseProvider {\n protected client: OpenAI;\n\n constructor(config: ProviderConfig, model: ModelInfo) {\n super(config, model);\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n });\n }\n\n async generate(options: GenerateOptions): Promise<GenerateResult> {\n const chunks: StreamChunk[] = [];\n return this.generateStream(options, (c) => chunks.push(c));\n }\n\n async generateStream(\n options: GenerateOptions,\n onChunk: (chunk: StreamChunk) => void,\n ): Promise<GenerateResult> {\n const messages = this.convertMessages(options.messages, options.systemPrompt);\n const tools = options.tools?.map((t) => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n\n let fullContent = '';\n let inputTokens = 0;\n let outputTokens = 0;\n let finishReason: GenerateResult['finishReason'] = 'stop';\n\n const params: OpenAI.Chat.ChatCompletionCreateParams = {\n model: this.model.id,\n messages,\n max_tokens: options.maxTokens ?? this.model.maxOutputTokens,\n temperature: options.temperature ?? 0.7,\n tools: tools?.length ? tools : undefined,\n stream: true,\n stream_options: { include_usage: true },\n };\n\n let stream: any;\n try {\n stream = await this.client.chat.completions.create(params, { signal: options.signal });\n } catch (err: any) {\n // Retry with max_completion_tokens instead if the model demands it (e.g., o1/o3 or custom proxy models)\n if (err.message && err.message.includes('max_completion_tokens')) {\n const fallbackParams = { ...params } as Record<string, unknown>;\n delete fallbackParams.max_tokens;\n fallbackParams.max_completion_tokens = options.maxTokens ?? this.model.maxOutputTokens;\n \n // o1 models also often strictly require temperature to be 1\n if (this.model.id.includes('o1') || this.model.id.includes('o3')) {\n fallbackParams.temperature = 1;\n }\n \n stream = await this.client.chat.completions.create(fallbackParams as any, { signal: options.signal });\n } else {\n throw err;\n }\n }\n\n const toolCallsMap: Record<number, { id: string; name: string; args: string }> = {};\n let isThinking = false;\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n\n const reasoningContent = (delta as any)?.reasoning_content;\n if (reasoningContent) {\n if (!isThinking) {\n isThinking = true;\n fullContent += '<think>\\n';\n onChunk({ text: '<think>\\n', finishReason: null });\n }\n fullContent += reasoningContent;\n onChunk({ text: reasoningContent, finishReason: null });\n }\n\n if (delta?.content) {\n if (isThinking) {\n isThinking = false;\n fullContent += '\\n</think>\\n\\n';\n onChunk({ text: '\\n</think>\\n\\n', finishReason: null });\n }\n fullContent += delta.content;\n onChunk({ text: delta.content, finishReason: null });\n }\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n if (!toolCallsMap[idx]) {\n toolCallsMap[idx] = { id: tc.id ?? '', name: tc.function?.name ?? '', args: '' };\n }\n if (tc.function?.arguments) toolCallsMap[idx]!.args += tc.function.arguments;\n if (tc.id) toolCallsMap[idx]!.id = tc.id;\n if (tc.function?.name) toolCallsMap[idx]!.name = tc.function.name;\n }\n }\n if (chunk.choices[0]?.finish_reason) {\n finishReason = (chunk.choices[0].finish_reason as GenerateResult['finishReason']) ?? 'stop';\n }\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n }\n }\n\n if (isThinking) {\n fullContent += '\\n</think>\\n\\n';\n onChunk({ text: '\\n</think>\\n\\n', finishReason: null });\n }\n\n const toolCalls = Object.values(toolCallsMap).map((tc) => {\n // OpenAI streams tool-call arguments as incremental fragments. If the\n // stream is truncated (e.g. max_tokens hit mid-argument, connection\n // dropped, or the model returned empty args) the concatenated string\n // may not be valid JSON. Crashing here throws away the whole response\n // — degrade gracefully by surfacing an empty input and letting the\n // tier decide what to do.\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.args || '{}') as Record<string, unknown>;\n } catch {\n input = { __rawArguments: tc.args, __parseError: true };\n }\n return { id: tc.id, name: tc.name, input };\n });\n\n onChunk({ text: '', finishReason });\n\n return {\n content: fullContent,\n usage: this.makeUsage(inputTokens, outputTokens),\n toolCalls: toolCalls.length ? toolCalls : undefined,\n finishReason,\n };\n }\n\n async countTokens(text: string): Promise<number> {\n // Rough approximation: 4 chars ≈ 1 token\n return Math.ceil(text.length / 4);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const response = await this.client.models.list();\n return response.data.map((m) => {\n const known = Object.values(MODELS).find((km) => km.id === m.id && km.provider === 'openai');\n if (known) return known;\n\n return {\n id: m.id,\n name: m.id,\n provider: 'openai' as const,\n contextWindow: 128_000,\n isVisionCapable: m.id.includes('vision') || m.id.includes('gpt-4o'),\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 4_000,\n supportsStreaming: true,\n isLocal: false,\n };\n });\n } catch {\n return Object.values(MODELS).filter((m) => m.provider === 'openai');\n }\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n await this.client.models.list();\n return true;\n } catch {\n return false;\n }\n }\n\n protected convertMessages(\n messages: ConversationMessage[],\n systemPrompt?: string,\n ): OpenAI.Chat.ChatCompletionMessageParam[] {\n const result: OpenAI.Chat.ChatCompletionMessageParam[] = [];\n\n if (systemPrompt) {\n result.push({ role: 'system', content: systemPrompt });\n }\n\n for (const m of messages) {\n if (m.role === 'system') {\n result.push({ role: 'system', content: typeof m.content === 'string' ? m.content : '' });\n continue;\n }\n if (m.role === 'tool') {\n result.push({\n role: 'tool',\n content: typeof m.content === 'string' ? m.content : '',\n tool_call_id: m.toolCallId ?? '',\n });\n continue;\n }\n if (typeof m.content === 'string') {\n if (m.role === 'assistant' && m.toolCalls?.length) {\n result.push({\n role: 'assistant',\n content: m.content || '',\n tool_calls: m.toolCalls.map((toolCall) => ({\n id: toolCall.id,\n type: 'function',\n function: {\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.input),\n },\n })),\n } as any);\n } else {\n result.push({ role: m.role as 'user' | 'assistant', content: m.content });\n }\n continue;\n }\n\n const parts: OpenAI.Chat.ChatCompletionContentPart[] = m.content.map((block) => {\n if (block.type === 'text') return { type: 'text' as const, text: block.text };\n if (block.type === 'image') {\n const img = block.image as ImageAttachment;\n const url = img.type === 'base64' ? `data:${img.mimeType};base64,${img.data}` : img.data;\n return {\n type: 'image_url' as const,\n image_url: { url },\n };\n }\n return { type: 'text' as const, text: '' };\n });\n\n result.push({ role: m.role as 'user' | 'assistant', content: parts } as any);\n }\n\n return result;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Azure OpenAI Provider\n// ─────────────────────────────────────────────\n\nimport { AzureOpenAI } from 'openai';\nimport { AZURE_BASE_URL_TEMPLATE } from '../constants.js';\nimport type { ModelInfo, ProviderConfig } from '../types.js';\nimport { OpenAIProvider } from './openai.js';\n\nexport class AzureOpenAIProvider extends OpenAIProvider {\n constructor(config: ProviderConfig, model: ModelInfo) {\n const rawUrl = config.baseUrl ?? AZURE_BASE_URL_TEMPLATE.replace('{resource}', 'YOUR_RESOURCE');\n const endpoint = rawUrl.replace(/\\/+$/, ''); // Strip trailing slashes\n super(\n {\n ...config,\n baseUrl: endpoint, // Kept for superclass compatibility if it reads it\n },\n model,\n );\n\n // Use the official AzureOpenAI SDK class which correctly handles pathing and API keys natively\n this.client = new AzureOpenAI({\n apiKey: config.apiKey,\n endpoint: endpoint,\n deployment: config.deploymentName ?? model.id,\n apiVersion: config.apiVersion ?? '2024-08-01-preview',\n });\n }\n\n async listModels(): Promise<ModelInfo[]> {\n // Azure models are configured per deployment; return a static list\n return [this.model];\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n await this.client.chat.completions.create({\n model: this.model.id,\n messages: [{ role: 'user', content: 'ping' }],\n max_tokens: 1,\n });\n return true;\n } catch {\n return false;\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Google Gemini Provider\n// ─────────────────────────────────────────────\n\nimport {\n GoogleGenAI,\n HarmBlockThreshold,\n HarmCategory,\n type Content,\n type FunctionDeclaration,\n type Part,\n} from '@google/genai';\nimport type {\n ConversationMessage,\n GenerateOptions,\n GenerateResult,\n ImageAttachment,\n ModelInfo,\n ProviderConfig,\n StreamChunk,\n ToolCall,\n} from '../types.js';\nimport { MODELS } from '../constants.js';\nimport { BaseProvider } from './base.js';\n\nexport class GeminiProvider extends BaseProvider {\n private client: GoogleGenAI;\n\n constructor(config: ProviderConfig, model: ModelInfo) {\n super(config, model);\n this.client = new GoogleGenAI({ apiKey: config.apiKey ?? '' });\n }\n\n async generate(options: GenerateOptions): Promise<GenerateResult> {\n const chunks: StreamChunk[] = [];\n return this.generateStream(options, (c) => chunks.push(c));\n }\n\n async generateStream(\n options: GenerateOptions,\n onChunk: (chunk: StreamChunk) => void,\n ): Promise<GenerateResult> {\n const contents = this.buildContents(options.messages, options.images);\n\n const stream = await this.client.models.generateContentStream({\n model: this.model.id,\n contents,\n config: {\n systemInstruction: options.systemPrompt,\n safetySettings: [\n { category: HarmCategory.HARM_CATEGORY_HARASSMENT, threshold: HarmBlockThreshold.BLOCK_NONE },\n { category: HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold: HarmBlockThreshold.BLOCK_NONE },\n ],\n tools: options.tools?.length\n ? [{ functionDeclarations: options.tools.map(this.convertTool) }]\n : undefined,\n abortSignal: options.signal,\n },\n });\n\n let fullContent = '';\n let inputTokens = 0;\n let outputTokens = 0;\n const toolCalls: ToolCall[] = [];\n let finishReason: GenerateResult['finishReason'] = 'stop';\n\n for await (const chunk of stream) {\n // ── Text content ──────────────────────────\n const text = chunk.text ?? '';\n if (text) {\n fullContent += text;\n onChunk({ text, finishReason: null });\n }\n\n // ── Tool / function calls ─────────────────\n const candidates = (chunk as any).candidates ?? [];\n for (const candidate of candidates) {\n for (const part of candidate?.content?.parts ?? []) {\n if (part.functionCall) {\n // Use function name as ID — Gemini matches functionResponse by name, not timestamp\n toolCalls.push({\n id: part.functionCall.name as string,\n name: part.functionCall.name as string,\n input: (part.functionCall.args ?? {}) as Record<string, unknown>,\n });\n finishReason = 'tool_use';\n }\n }\n // Capture finish reason from candidate\n if (candidate.finishReason) {\n const fr = (candidate.finishReason as string).toLowerCase();\n if (fr === 'stop') finishReason = toolCalls.length ? 'tool_use' : 'stop';\n else if (fr === 'max_tokens' || fr === 'length') finishReason = 'length';\n }\n }\n\n // ── Token usage ───────────────────────────\n const usage = (chunk as any).usageMetadata;\n if (usage) {\n inputTokens = usage.promptTokenCount ?? inputTokens;\n outputTokens = usage.candidatesTokenCount ?? outputTokens;\n }\n }\n\n onChunk({ text: '', finishReason });\n\n return {\n content: fullContent,\n usage: this.makeUsage(inputTokens, outputTokens), // ✅ real tokens now\n toolCalls: toolCalls.length ? toolCalls : undefined, // ✅ tool calls now returned\n finishReason,\n };\n }\n\n async countTokens(text: string): Promise<number> {\n try {\n const result = await this.client.models.countTokens({\n model: this.model.id,\n contents: [{ role: 'user', parts: [{ text }] }],\n });\n return result.totalTokens ?? 0;\n } catch {\n return Math.ceil(text.length / 4);\n }\n }\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const resp = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models?key=${this.config.apiKey}`,\n );\n if (!resp.ok) {\n // Invalid key / network error — fall back to the built-in model list\n // instead of crashing downstream consumers with a shape mismatch.\n return Object.values(MODELS).filter((m) => m.provider === 'gemini');\n }\n const data = await resp.json() as {\n models?: Array<{\n name: string;\n displayName: string;\n inputTokenLimit: number;\n outputTokenLimit: number;\n }>;\n };\n if (!Array.isArray(data?.models)) {\n return Object.values(MODELS).filter((m) => m.provider === 'gemini');\n }\n\n return data.models.map((m) => {\n const id = m.name.replace('models/', '');\n const known = Object.values(MODELS).find(\n (km) => km.id === id && km.provider === 'gemini',\n );\n if (known) return known;\n\n return {\n id,\n name: m.displayName || id,\n provider: 'gemini' as const,\n contextWindow: m.inputTokenLimit || 128_000,\n isVisionCapable:\n id.includes('vision') || id.includes('pro') || id.includes('flash'),\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: m.outputTokenLimit || 8_000,\n supportsStreaming: true,\n isLocal: false,\n };\n });\n } catch {\n return Object.values(MODELS).filter((m) => m.provider === 'gemini');\n }\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n await this.client.models.countTokens({\n model: this.model.id,\n contents: [{ role: 'user', parts: [{ text: 'ping' }] }],\n });\n return true;\n } catch {\n return false;\n }\n }\n\n // ── Private ──────────────────────────────────\n\n private buildContents(\n messages: ConversationMessage[],\n extraImages?: ImageAttachment[],\n ): Content[] {\n const contents: Content[] = [];\n\n for (const m of messages) {\n // ── System messages in history: prepend to the next user turn ──────\n // Gemini only accepts systemInstruction at the top level; mid-conversation\n // system messages are folded into the following user turn as context.\n if (m.role === 'system') {\n const text = typeof m.content === 'string' ? m.content : '';\n if (!text.trim()) continue;\n // Merge into previous user turn or create a new one\n const prev = contents[contents.length - 1];\n if (prev?.role === 'user') {\n (prev.parts as Part[]).unshift({ text: `[System context]: ${text}\\n\\n` });\n } else {\n contents.push({ role: 'user', parts: [{ text: `[System context]: ${text}` }] });\n }\n continue;\n }\n\n // ── Tool result messages → Gemini functionResponse in a user turn ──\n if (m.role === 'tool') {\n const toolContent = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n // toolCallId carries the function name for Gemini (set by gemini provider using tool name)\n const functionName = m.toolCallId ?? 'unknown_function';\n contents.push({\n role: 'user',\n parts: [{\n functionResponse: {\n name: functionName,\n response: { output: toolContent },\n },\n }] as Part[],\n });\n continue;\n }\n\n // ── Assistant messages: may include functionCall parts ─────────────\n if (m.role === 'assistant') {\n const parts: Part[] = [];\n\n // Text content\n const textContent = typeof m.content === 'string' ? m.content : '';\n if (textContent) parts.push({ text: textContent });\n\n // Tool calls → functionCall parts\n for (const tc of m.toolCalls ?? []) {\n parts.push({\n functionCall: {\n name: tc.name,\n args: tc.input as Record<string, unknown>,\n },\n } as Part);\n }\n\n if (parts.length > 0) {\n contents.push({ role: 'model', parts });\n }\n continue;\n }\n\n // ── User messages ─────────────────────────────────────────────────\n if (m.role === 'user') {\n const parts = this.convertMessageContent(m, contents.length === 0 ? extraImages : undefined);\n // Attach extra images only to the LAST user message\n if (extraImages?.length && contents.length > 0) {\n const isLastUser = !messages.slice(messages.indexOf(m) + 1).some(x => x.role === 'user');\n if (isLastUser) {\n for (const img of extraImages) {\n if (img.type === 'base64') {\n parts.push({ inlineData: { mimeType: img.mimeType, data: img.data } });\n }\n }\n }\n }\n if (parts.length > 0) {\n contents.push({ role: 'user', parts });\n }\n }\n }\n\n return contents;\n }\n\n private convertMessageContent(\n msg: ConversationMessage,\n extraImages?: ImageAttachment[],\n ): Part[] {\n const parts: Part[] = [];\n\n if (typeof msg.content === 'string') {\n parts.push({ text: msg.content });\n } else {\n for (const block of msg.content) {\n if (block.type === 'text') parts.push({ text: block.text });\n if (block.type === 'image') {\n const img = block.image as ImageAttachment;\n if (img.type === 'base64') {\n parts.push({ inlineData: { mimeType: img.mimeType, data: img.data } });\n }\n }\n }\n }\n\n for (const img of extraImages ?? []) {\n if (img.type === 'base64') {\n parts.push({ inlineData: { mimeType: img.mimeType, data: img.data } });\n }\n }\n\n return parts;\n }\n\n private convertTool(tool: {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n }): FunctionDeclaration {\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema as FunctionDeclaration['parameters'],\n };\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Ollama Local Provider\n// ─────────────────────────────────────────────\n\nimport type {\n ConversationMessage,\n GenerateOptions,\n GenerateResult,\n ModelInfo,\n ProviderConfig,\n StreamChunk,\n ToolCall,\n} from '../types.js';\nimport { OLLAMA_BASE_URL } from '../constants.js';\nimport { BaseProvider } from './base.js';\n\n// ── Ollama API types ───────────────────────────\n\ninterface OllamaToolCall {\n function: {\n name: string;\n // Ollama delivers arguments as an already-parsed object, not a JSON string.\n // Some older Ollama releases may deliver a JSON string — handled defensively below.\n arguments: Record<string, unknown> | string;\n };\n}\n\ninterface OllamaConversationMessage {\n role: string;\n content: string;\n images?: string[];\n // Present in assistant messages that contain native tool calls\n tool_calls?: OllamaToolCall[];\n}\n\ninterface OllamaChatChunk {\n message?: {\n content?: string;\n tool_calls?: OllamaToolCall[];\n };\n done: boolean;\n prompt_eval_count?: number;\n eval_count?: number;\n}\n\ninterface OllamaModelEntry { name: string; details?: { parameter_size?: string } }\n\n// ── Model family detection ─────────────────────\n\nconst TOOL_CAPABLE_FAMILIES = [\n 'llama3.1', 'llama3.2', 'llama3.3',\n 'qwen2', 'qwen2.5', 'qwen3',\n 'mistral-nemo', 'mistral-small',\n 'command-r',\n 'firefunction',\n];\n\nfunction isToolCapable(modelName: string): boolean {\n const name = modelName.toLowerCase();\n return TOOL_CAPABLE_FAMILIES.some((family) => name.includes(family));\n}\n\n// ── Provider ───────────────────────────────────\n\nexport class OllamaProvider extends BaseProvider {\n private baseUrl: string;\n\n constructor(config: ProviderConfig, model: ModelInfo) {\n super(config, model);\n this.baseUrl = config.baseUrl ?? OLLAMA_BASE_URL;\n }\n\n async generate(options: GenerateOptions): Promise<GenerateResult> {\n const chunks: StreamChunk[] = [];\n return this.generateStream(options, (c) => chunks.push(c));\n }\n\n async generateStream(\n options: GenerateOptions,\n onChunk: (chunk: StreamChunk) => void,\n ): Promise<GenerateResult> {\n const messages = this.convertMessages(options.messages, options.systemPrompt);\n\n // Convert tools to Ollama/OpenAI-compatible format when provided\n const ollamaTools = options.tools?.map((t) => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n\n const response = await fetch(`${this.baseUrl}/api/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: this.model.id,\n messages,\n stream: true,\n tools: ollamaTools?.length ? ollamaTools : undefined,\n options: {\n num_predict: options.maxTokens ?? this.model.maxOutputTokens,\n temperature: options.temperature ?? 0.7,\n },\n }),\n signal: options.signal,\n });\n if (!response.ok || !response.body) {\n throw new Error(`Ollama chat request failed: ${response.status} ${response.statusText}`);\n }\n\n let fullContent = '';\n let inputTokens = 0;\n let outputTokens = 0;\n const pendingToolCalls: OllamaToolCall[] = [];\n\n // Parse one NDJSON line of the streaming response.\n const handleLine = (line: string): void => {\n if (!line.trim()) return;\n try {\n const parsed = JSON.parse(line) as OllamaChatChunk;\n if (parsed.message?.content) {\n fullContent += parsed.message.content;\n onChunk({ text: parsed.message.content, finishReason: null });\n }\n if (parsed.message?.tool_calls?.length) {\n pendingToolCalls.push(...parsed.message.tool_calls);\n }\n if (parsed.done) {\n inputTokens = parsed.prompt_eval_count ?? inputTokens;\n outputTokens = parsed.eval_count ?? outputTokens;\n }\n } catch { /* ignore parse errors */ }\n };\n\n // Node's fetch body is an async-iterable stream of byte chunks.\n let buffer = '';\n const decoder = new TextDecoder();\n for await (const chunk of response.body as unknown as AsyncIterable<Uint8Array>) {\n buffer += decoder.decode(chunk, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) handleLine(line);\n }\n // Flush any trailing JSON line that was not newline-terminated (e.g. the\n // server disconnects on the last message) so `done` isn't lost.\n handleLine(buffer);\n\n // Convert Ollama tool calls to the normalised ToolCall format.\n // Ollama delivers arguments as an already-parsed object; some older versions\n // may deliver a JSON string — handle both defensively.\n const toolCalls: ToolCall[] = pendingToolCalls.map((tc, i) => {\n let input: Record<string, unknown>;\n if (typeof tc.function.arguments === 'string') {\n try {\n input = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n input = { __rawArguments: tc.function.arguments };\n }\n } else {\n input = tc.function.arguments as Record<string, unknown>;\n }\n return {\n id: `ollama-tool-${Date.now()}-${i}`,\n name: tc.function.name,\n input,\n };\n });\n\n const finishReason = toolCalls.length ? 'tool_use' : 'stop';\n onChunk({ text: '', finishReason });\n\n return {\n content: fullContent,\n usage: this.makeUsage(inputTokens, outputTokens),\n toolCalls: toolCalls.length ? toolCalls : undefined,\n finishReason,\n };\n }\n\n async countTokens(text: string): Promise<number> {\n return Math.ceil(text.length / 4);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const response = await fetch(`${this.baseUrl}/api/tags`);\n if (!response.ok) return [];\n const data = await response.json() as { models: OllamaModelEntry[] };\n const supportedKeywords = ['llama3', 'llama2', 'gemma', 'mistral', 'mixtral', 'qwen', 'phi3', 'codellama', 'deepseek', 'llava', 'starcoder', 'stable-code', 'nomic-embed'];\n return data.models\n .filter((m) => {\n const name = m.name.toLowerCase();\n return supportedKeywords.some((k) => name.includes(k));\n })\n .map((m) => ({\n id: m.name,\n name: m.name,\n provider: 'ollama' as const,\n contextWindow: 128_000,\n isVisionCapable: m.name.includes('llava') || m.name.includes('vision'),\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 4_000,\n supportsStreaming: true,\n isLocal: true,\n supportsToolUse: isToolCapable(m.name),\n minSizeB: this.parseSizeB(m.details?.parameter_size),\n }));\n } catch {\n return [];\n }\n }\n\n async isAvailable(): Promise<boolean> {\n const ac = new AbortController();\n const timer = setTimeout(() => ac.abort(), 2000);\n try {\n const response = await fetch(`${this.baseUrl}/api/tags`, { signal: ac.signal });\n return response.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private convertMessages(messages: ConversationMessage[], systemPrompt?: string): OllamaConversationMessage[] {\n const result: OllamaConversationMessage[] = [];\n if (systemPrompt) result.push({ role: 'system', content: systemPrompt });\n for (const m of messages) {\n if (m.role === 'system') {\n result.push({ role: 'system', content: typeof m.content === 'string' ? m.content : '' });\n continue;\n }\n\n // Tool result messages — role: 'tool' is supported by modern Ollama\n if (m.role === 'tool') {\n result.push({\n role: 'tool',\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n });\n continue;\n }\n\n // Assistant messages that carried native tool calls\n if (m.role === 'assistant' && m.toolCalls?.length) {\n result.push({\n role: 'assistant',\n content: typeof m.content === 'string' ? m.content : '',\n tool_calls: m.toolCalls.map((tc) => ({\n function: {\n name: tc.name,\n arguments: tc.input,\n },\n })),\n });\n continue;\n }\n\n if (typeof m.content === 'string') {\n result.push({ role: m.role, content: m.content });\n continue;\n }\n const text = m.content.filter((b) => b.type === 'text').map((b) => b.type === 'text' ? b.text : '').join('');\n const images = m.content.filter((b) => b.type === 'image').map((b) => {\n if (b.type === 'image') return b.image.data;\n return '';\n }).filter(Boolean);\n result.push({ role: m.role, content: text, images: images.length ? images : undefined });\n }\n return result;\n }\n\n private parseSizeB(size?: string): number | undefined {\n if (!size) return undefined;\n const match = /(\\d+(?:\\.\\d+)?)\\s*([BbMmKkGg]?)/.exec(size);\n if (!match) return undefined;\n const num = parseFloat(match[1]!);\n const unit = (match[2] ?? '').toUpperCase();\n if (unit === 'B') return num;\n if (unit === 'M') return num / 1000;\n return undefined;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — OpenAI-Compatible Endpoint Provider\n// ─────────────────────────────────────────────\n\nimport OpenAI from 'openai';\nimport type { ModelInfo, ProviderConfig } from '../types.js';\nimport { OpenAIProvider } from './openai.js';\n\nexport class OpenAICompatibleProvider extends OpenAIProvider {\n constructor(config: ProviderConfig, model: ModelInfo) {\n super(config, model);\n // Override client to use custom base URL\n this.client = new OpenAI({\n apiKey: config.apiKey ?? 'not-required',\n baseURL: config.baseUrl,\n });\n }\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const response = await this.client.models.list();\n return response.data.map((m) => ({\n id: m.id,\n name: m.id,\n provider: 'openai-compatible' as const,\n contextWindow: 32_000,\n isVisionCapable: false,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 4_000,\n supportsStreaming: true,\n isLocal: false,\n }));\n } catch {\n return [this.model];\n }\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n await this.client.models.list();\n return true;\n } catch {\n return false;\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Model Selector\n// ─────────────────────────────────────────────\n\nimport type { ModelInfo, ProviderType, TierRole } from '../../types.js';\nimport {\n T1_MODEL_PRIORITY,\n T2_MODEL_PRIORITY,\n T3_MODEL_PRIORITY,\n VISION_MODEL_PRIORITY,\n MODELS,\n} from '../../constants.js';\n\nexport class ModelSelector {\n private availableProviders: Set<ProviderType>;\n private availableModels: Map<string, ModelInfo>;\n\n constructor(availableProviders: Set<ProviderType>) {\n this.availableProviders = availableProviders;\n this.availableModels = new Map(Object.entries(MODELS));\n }\n\n addDynamicModel(model: ModelInfo): void {\n this.availableModels.set(model.id, model);\n }\n\n /**\n * Permanently drop a model from the available set for this session. Used by\n * the router's 404 / \"model not found\" self-heal so a dead id is never\n * selected again after it fails once.\n */\n removeModel(id: string): void {\n this.availableModels.delete(id);\n }\n\n /** Look up an available model by exact id (post-discovery/pricing lookups). */\n getModelById(id: string): ModelInfo | undefined {\n const m = this.availableModels.get(id);\n return m && this.availableProviders.has(m.provider) ? m : undefined;\n }\n\n getAvailableModelsForProvider(provider: ProviderType): ModelInfo[] {\n const models = new Map<string, ModelInfo>();\n for (const model of this.availableModels.values()) {\n if (model.provider === provider && this.availableProviders.has(provider)) {\n models.set(model.id, model);\n }\n }\n return [...models.values()].sort((a, b) => a.name.localeCompare(b.name));\n }\n\n selectForTier(\n tier: TierRole,\n overrideModelId?: string,\n requireVision = false,\n ): ModelInfo | null {\n if (overrideModelId) {\n let model = this.availableModels.get(overrideModelId);\n if (!model) {\n model = this.resolveDynamicModel(overrideModelId);\n }\n if (model && this.availableProviders.has(model.provider)) return model;\n return null;\n }\n\n if (requireVision) {\n return this.selectVisionModel();\n }\n\n const priority = this.getPriorityList(tier);\n for (const key of priority) {\n const model = this.availableModels.get(key);\n if (model && this.availableProviders.has(model.provider)) return model;\n }\n\n // Fallback: any model from available providers\n for (const [, model] of this.availableModels) {\n if (this.availableProviders.has(model.provider)) return model;\n }\n\n return null;\n }\n\n selectVisionModel(): ModelInfo | null {\n for (const key of VISION_MODEL_PRIORITY) {\n const model = this.availableModels.get(key);\n if (model && this.availableProviders.has(model.provider) && model.isVisionCapable) {\n return model;\n }\n }\n return null;\n }\n\n getNextFallback(currentModelId: string, tier: TierRole): ModelInfo | null {\n const priority = this.getPriorityList(tier);\n const currentIdx = priority.indexOf(currentModelId);\n if (currentIdx === -1) return null;\n\n for (let i = currentIdx + 1; i < priority.length; i++) {\n const key = priority[i]!;\n const model = this.availableModels.get(key);\n if (model && this.availableProviders.has(model.provider)) return model;\n }\n return null;\n }\n\n private getPriorityList(tier: TierRole): string[] {\n switch (tier) {\n case 'T1': return T1_MODEL_PRIORITY;\n case 'T2': return T2_MODEL_PRIORITY;\n case 'T3': return T3_MODEL_PRIORITY;\n }\n }\n\n getAllAvailableModels(): ModelInfo[] {\n return Array.from(this.availableModels.values()).filter(m =>\n this.availableProviders.has(m.provider),\n );\n }\n\n /**\n * Returns all available models eligible for the given tier, ordered by the\n * tier's priority chain. Use this as the candidate set for scored selection.\n */\n getCandidatesForTier(tier: TierRole): ModelInfo[] {\n const priority = this.getPriorityList(tier);\n const candidates: ModelInfo[] = [];\n for (const key of priority) {\n const model = this.availableModels.get(key);\n if (model && this.availableProviders.has(model.provider)) {\n candidates.push(model);\n }\n }\n // Local-only tier: when the only available provider is Ollama, widen the\n // candidate set to EVERY available local model — including ones discovered\n // from Ollama that aren't in the static priority chain — so \"best available\n // local model\" can actually be selected for the task.\n const localOnly = this.availableProviders.size > 0 &&\n Array.from(this.availableProviders).every((p) => p === 'ollama');\n if (localOnly) {\n for (const model of this.availableModels.values()) {\n if (model.isLocal && this.availableProviders.has(model.provider) &&\n !candidates.some((c) => c.id === model.id)) {\n candidates.push(model);\n }\n }\n }\n return candidates;\n }\n\n isProviderAvailable(provider: ProviderType): boolean {\n return this.availableProviders.has(provider);\n }\n\n markProviderUnavailable(provider: ProviderType): void {\n this.availableProviders.delete(provider);\n }\n\n /**\n * Re-add a provider to the available set after it has recovered (e.g. after\n * a failover timeout expires or a successful call confirms recovery). Only\n * re-enables providers that were originally configured — callers should\n * guard against enabling providers that were never configured.\n */\n markProviderAvailable(provider: ProviderType): void {\n this.availableProviders.add(provider);\n }\n\n private resolveDynamicModel(overrideModelId: string): ModelInfo | undefined {\n let providerStr: ProviderType | null = null;\n let actualId = overrideModelId;\n\n if (overrideModelId.includes(':')) {\n const parts = overrideModelId.split(':');\n const prefix = parts[0]!.toLowerCase();\n const validProviders = ['anthropic', 'openai', 'gemini', 'azure', 'openai-compatible', 'ollama'];\n if (validProviders.includes(prefix)) {\n providerStr = prefix as ProviderType;\n actualId = parts.slice(1).join(':');\n }\n }\n\n if (!providerStr) {\n const lower = actualId.toLowerCase();\n if (lower.includes('claude')) providerStr = 'anthropic';\n else if (lower.startsWith('gpt') || lower.startsWith('o1') || lower.startsWith('o3')) providerStr = 'openai';\n else if (lower.includes('gemini')) providerStr = 'gemini';\n else if (this.availableProviders.has('ollama')) providerStr = 'ollama';\n else if (this.availableProviders.has('openai-compatible')) providerStr = 'openai-compatible';\n else if (this.availableProviders.size === 1) providerStr = Array.from(this.availableProviders)[0]!;\n }\n\n if (providerStr && this.availableProviders.has(providerStr)) {\n const dynamicModel: ModelInfo = {\n id: actualId,\n name: actualId,\n provider: providerStr,\n contextWindow: 128_000,\n isVisionCapable: false,\n inputCostPer1kTokens: 0,\n outputCostPer1kTokens: 0,\n maxOutputTokens: 8_000,\n supportsStreaming: true,\n isLocal: providerStr === 'ollama',\n };\n this.addDynamicModel(dynamicModel);\n return dynamicModel;\n }\n return undefined;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Provider Failover Manager\n// ─────────────────────────────────────────────\n\nimport type { ModelInfo, ProviderType, TierRole } from '../../types.js';\nimport type { ModelSelector } from './selector.js';\n\ninterface FailoverState {\n provider: ProviderType;\n failedAt: number;\n reason: string;\n retryAfterMs: number;\n /** Number of consecutive failures — drives backoff step selection */\n failureCount: number;\n}\n\nexport class FailoverManager {\n private failures: Map<ProviderType, FailoverState> = new Map();\n private selector: ModelSelector;\n\n // Exponential backoff: 30s → 60s → 120s → 300s\n private readonly BACKOFF_STEPS = [30_000, 60_000, 120_000, 300_000];\n\n constructor(selector: ModelSelector) {\n this.selector = selector;\n }\n\n recordFailure(provider: ProviderType, reason: string): void {\n const existing = this.failures.get(provider);\n // Increment failure count and use it as the backoff step index so that\n // repeated failures correctly escalate through the full backoff ladder.\n const failureCount = (existing?.failureCount ?? 0) + 1;\n const step = Math.min(failureCount - 1, this.BACKOFF_STEPS.length - 1);\n const retryAfterMs = this.BACKOFF_STEPS[step] ?? 30_000;\n\n this.failures.set(provider, {\n provider,\n failedAt: Date.now(),\n reason,\n retryAfterMs,\n failureCount,\n });\n\n this.selector.markProviderUnavailable(provider);\n }\n\n isProviderAvailable(provider: ProviderType): boolean {\n const failure = this.failures.get(provider);\n if (!failure) return true;\n\n if (Date.now() - failure.failedAt >= failure.retryAfterMs) {\n // Retry window passed — re-enable provider in both the failure map and\n // the selector so the model priority chain can route to it again.\n this.failures.delete(provider);\n this.selector.markProviderAvailable(provider);\n return true;\n }\n return false;\n }\n\n /**\n * Call after a successful generation to immediately re-enable a provider\n * that had previously been marked unavailable. This allows fast recovery\n * when a transient rate-limit clears before the backoff window expires,\n * preventing unnecessary routing to more expensive fallback models.\n */\n recordSuccess(provider: ProviderType): void {\n if (this.failures.has(provider)) {\n this.failures.delete(provider);\n this.selector.markProviderAvailable(provider);\n }\n }\n\n getFallbackModel(currentModel: ModelInfo, tier: TierRole): ModelInfo | null {\n return this.selector.getNextFallback(currentModel.id, tier);\n }\n\n getFailureReport(): Record<string, string> {\n const report: Record<string, string> = {};\n for (const [provider, state] of this.failures) {\n const remainingMs = state.retryAfterMs - (Date.now() - state.failedAt);\n report[provider] =\n `Failed (${state.failureCount}x): ${state.reason}. Retry in ${Math.ceil(remainingMs / 1000)}s`;\n }\n return report;\n }\n\n getFailureCount(provider: ProviderType): number {\n return this.failures.get(provider)?.failureCount ?? 0;\n }\n\n clearFailure(provider: ProviderType): void {\n this.failures.delete(provider);\n // Sync the selector so that manually cleared providers can be routed to\n // immediately without waiting for the backoff window to expire.\n this.selector.markProviderAvailable(provider);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Per-Provider Token Bucket (TPM)\n// ─────────────────────────────────────────────\n\nimport type { ProviderType } from '../../types.js';\n\n/**\n * Default tokens-per-minute per provider. These are conservative floors that\n * match free-tier quotas; users can override via config.rateLimits.providerTpm.\n */\nexport const DEFAULT_PROVIDER_TPM: Record<ProviderType, number> = {\n anthropic: 40_000,\n openai: 30_000,\n gemini: 60_000,\n azure: 30_000,\n 'openai-compatible': 30_000,\n ollama: Number.POSITIVE_INFINITY,\n};\n\ninterface Bucket {\n tokensPerMinute: number;\n available: number;\n lastRefillMs: number;\n}\n\n/**\n * Token bucket rate limiter keyed by provider type.\n *\n * Each call to `acquire(provider, cost)` refills the bucket based on time\n * elapsed since the last refill, then waits (via setTimeout) until enough\n * tokens are available. Setting TPM to Infinity disables limiting for that\n * provider (used for local Ollama by default).\n */\nexport class TpmLimiter {\n private buckets: Map<ProviderType, Bucket> = new Map();\n\n constructor(overrides: Partial<Record<ProviderType, number>> = {}) {\n for (const [type, tpm] of Object.entries({ ...DEFAULT_PROVIDER_TPM, ...overrides })) {\n const limit = tpm ?? DEFAULT_PROVIDER_TPM[type as ProviderType];\n this.buckets.set(type as ProviderType, {\n tokensPerMinute: limit,\n available: limit,\n lastRefillMs: Date.now(),\n });\n }\n }\n\n /**\n * Block until `estimatedTokens` can be subtracted from the provider's\n * bucket. Estimated cost is best-effort — actual tokens used in the call\n * are reported back via `refund` when short, or simply settled at the next\n * refill.\n */\n async acquire(provider: ProviderType, estimatedTokens: number): Promise<void> {\n const bucket = this.buckets.get(provider);\n if (!bucket || bucket.tokensPerMinute === Number.POSITIVE_INFINITY) return;\n\n // Clamp a single request to the bucket capacity so it can never be\n // impossible to fulfil.\n const want = Math.min(estimatedTokens, bucket.tokensPerMinute);\n\n for (;;) {\n this.refill(bucket);\n if (bucket.available >= want) {\n bucket.available -= want;\n return;\n }\n const deficit = want - bucket.available;\n // Wait just long enough to accumulate the deficit.\n const waitMs = Math.max(50, Math.ceil((deficit / bucket.tokensPerMinute) * 60_000));\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n }\n }\n\n /**\n * Return unused estimated tokens back to the bucket after the call\n * resolved with fewer actual tokens than estimated.\n */\n refund(provider: ProviderType, tokens: number): void {\n const bucket = this.buckets.get(provider);\n if (!bucket || bucket.tokensPerMinute === Number.POSITIVE_INFINITY) return;\n bucket.available = Math.min(bucket.tokensPerMinute, bucket.available + Math.max(0, tokens));\n }\n\n setLimit(provider: ProviderType, tokensPerMinute: number): void {\n const existing = this.buckets.get(provider);\n if (existing) {\n existing.tokensPerMinute = tokensPerMinute;\n if (existing.available > tokensPerMinute) existing.available = tokensPerMinute;\n } else {\n this.buckets.set(provider, {\n tokensPerMinute,\n available: tokensPerMinute,\n lastRefillMs: Date.now(),\n });\n }\n }\n\n /** Internal: top up the bucket based on elapsed time. */\n private refill(bucket: Bucket): void {\n const now = Date.now();\n const elapsedMs = now - bucket.lastRefillMs;\n if (elapsedMs <= 0) return;\n const refill = (elapsedMs / 60_000) * bucket.tokensPerMinute;\n bucket.available = Math.min(bucket.tokensPerMinute, bucket.available + refill);\n bucket.lastRefillMs = now;\n }\n\n /** Diagnostics — returns current available budget per provider. */\n snapshot(): Record<string, { tokensPerMinute: number; available: number }> {\n const out: Record<string, { tokensPerMinute: number; available: number }> = {};\n for (const [k, v] of this.buckets) {\n this.refill(v);\n out[k] = { tokensPerMinute: v.tokensPerMinute, available: Math.round(v.available) };\n }\n return out;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Local Model Request Queue\n// ─────────────────────────────────────────────\n\n/**\n * A simple FIFO concurrency limiter for local (e.g. Ollama) inference calls.\n *\n * When a slot frees up, the next waiter receives a `release` function; calling\n * it frees the slot for the next caller. Setting maxConcurrent > 1 is useful\n * for multi-GPU or CPU setups; the default of 1 serializes all calls to protect\n * GPU VRAM on single-GPU machines.\n */\nexport class LocalRequestQueue {\n private readonly maxConcurrent: number;\n private active = 0;\n private readonly queue: Array<(release: () => void) => void> = [];\n\n constructor(maxConcurrent = 1) {\n this.maxConcurrent = Math.max(1, maxConcurrent);\n }\n\n /**\n * Acquire a queue slot. Returns a `release` function that MUST be called\n * when the inference call is done (even on error). Rejects if the slot\n * cannot be acquired within `timeoutMs`.\n */\n async acquire(timeoutMs?: number): Promise<() => void> {\n if (this.active < this.maxConcurrent) {\n this.active++;\n return this.makeRelease();\n }\n\n return new Promise<() => void>((resolve, reject) => {\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const resolver = (release: () => void) => {\n if (settled) return;\n settled = true;\n if (timer !== undefined) clearTimeout(timer);\n resolve(release);\n };\n\n if (timeoutMs !== undefined && timeoutMs > 0) {\n timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n const idx = this.queue.indexOf(resolver);\n if (idx !== -1) this.queue.splice(idx, 1);\n reject(new Error(\n `Local model queue: timed out waiting for a free slot after ${timeoutMs}ms. ` +\n `Active: ${this.active}, Queued: ${this.queue.length}. ` +\n `Consider increasing localConcurrency or localInferenceTimeoutMs in your config.`,\n ));\n }, timeoutMs);\n }\n\n this.queue.push(resolver);\n });\n }\n\n /** Number of in-flight requests. */\n get activeCount(): number {\n return this.active;\n }\n\n /** Number of requests waiting for a slot. */\n get queueDepth(): number {\n return this.queue.length;\n }\n\n private makeRelease(): () => void {\n let called = false;\n return () => {\n if (called) return;\n called = true;\n this.active--;\n const next = this.queue.shift();\n if (next) {\n this.active++;\n next(this.makeRelease());\n }\n };\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Cost Calculator\n// ─────────────────────────────────────────────\n\nimport type { ModelInfo, TokenUsage } from '../types.js';\n\nexport function calculateCost(\n inputTokens: number,\n outputTokens: number,\n model: ModelInfo,\n): number {\n return (\n (inputTokens / 1000) * model.inputCostPer1kTokens +\n (outputTokens / 1000) * model.outputCostPer1kTokens\n );\n}\n\nexport function buildTokenUsage(\n inputTokens: number,\n outputTokens: number,\n model: ModelInfo,\n): TokenUsage {\n return {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n estimatedCostUsd: calculateCost(inputTokens, outputTokens, model),\n };\n}","// ─────────────────────────────────────────────\n// Cascade AI — Retry Utility\n// ─────────────────────────────────────────────\n\n/**\n * Thrown when a Cascade run is aborted via `AbortSignal`.\n * Caught at the `Cascade.run()` boundary — does NOT propagate as an\n * unhandled rejection. Callers receive a partial result instead.\n */\nexport class CascadeCancelledError extends Error {\n constructor(reason?: string) {\n super(reason ?? 'Run was cancelled via AbortSignal');\n this.name = 'CascadeCancelledError';\n }\n}\n\n/**\n * A retryable error that carries a `.userMessage` for display.\n */\nexport class CascadeToolError extends Error {\n /** A friendly message to show the user / T3 */\n public readonly userMessage: string;\n /** Whether this error class is retryable by default */\n public readonly retryable: boolean;\n\n constructor(userMessage: string, cause?: unknown, retryable = false) {\n const causeMsg = cause instanceof Error ? cause.message : String(cause);\n super(`${userMessage}: ${causeMsg}`);\n this.name = 'CascadeToolError';\n this.userMessage = userMessage;\n this.retryable = retryable;\n }\n}\n\nexport interface RetryOptions {\n /** Maximum number of attempts (including the first). Default: 3 */\n maxAttempts?: number;\n /** Base delay in ms (doubled each retry). Default: 300 */\n baseDelayMs?: number;\n /**\n * Maximum delay cap in ms to prevent excessive waits. Default: 30_000 (30s).\n * Useful when `baseDelayMs` is large and `maxAttempts` is high.\n */\n maxDelayMs?: number;\n /**\n * When true (default), adds ±25% random jitter to each delay to prevent\n * thundering-herd issues when many callers retry simultaneously.\n */\n jitter?: boolean;\n /** Custom predicate: return true if the error warrants a retry. */\n isRetryable?: (err: Error) => boolean;\n /** Optional callback fired before each retry with the attempt number and error. */\n onRetry?: (attempt: number, err: Error, delayMs: number) => void;\n}\n\n/**\n * Executes `fn`, retrying on transient errors up to `maxAttempts` times.\n * Uses exponential back-off with optional jitter to spread load across retrying clients.\n *\n * @example\n * const result = await withRetry(() => fetchRemoteData(), {\n * maxAttempts: 3,\n * isRetryable: (e) => e.message.includes('ECONNRESET'),\n * });\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n opts: RetryOptions = {},\n): Promise<T> {\n const maxAttempts = opts.maxAttempts ?? 3;\n const baseDelayMs = opts.baseDelayMs ?? 300;\n const maxDelayMs = opts.maxDelayMs ?? 30_000;\n const useJitter = opts.jitter !== false; // default: true\n const isRetryable = opts.isRetryable ?? defaultIsRetryable;\n\n let lastErr: Error = new Error('No attempts made');\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err instanceof Error ? err : new Error(String(err));\n\n // Check CascadeToolError.retryable if applicable\n if (lastErr instanceof CascadeToolError && !lastErr.retryable) {\n throw lastErr;\n }\n\n if (attempt === maxAttempts || !isRetryable(lastErr)) {\n throw lastErr;\n }\n\n const rawDelay = Math.min(baseDelayMs * 2 ** (attempt - 1), maxDelayMs);\n // Add ±25% jitter to reduce thundering-herd on simultaneous retries\n const delay = useJitter\n ? rawDelay * (0.75 + Math.random() * 0.5)\n : rawDelay;\n\n opts.onRetry?.(attempt, lastErr, delay);\n await sleep(delay);\n }\n }\n\n throw lastErr;\n}\n\n/**\n * Wraps a promise with a timeout. Clears the internal timer whether the\n * promise resolves, rejects, or times out to avoid lingering handles.\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n errorMessage = 'Operation timed out',\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(errorMessage)),\n timeoutMs,\n );\n });\n\n try {\n return await Promise.race([promise, timeoutPromise]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n}\n\n// ── Helpers ────────────────────────────────────\n\nfunction defaultIsRetryable(err: Error): boolean {\n const msg = err.message.toLowerCase();\n return (\n msg.includes('econnreset') ||\n msg.includes('econnrefused') ||\n msg.includes('etimedout') ||\n msg.includes('enotfound') || // DNS resolution failure (transient)\n msg.includes('econnaborted') || // Connection aborted mid-stream\n msg.includes('socket hang up') ||\n msg.includes('socket timeout') ||\n msg.includes('network error') ||\n msg.includes('failed to fetch') || // fetch() in browser/node environments\n msg.includes('rate limit') ||\n msg.includes('too many requests') || // 429\n msg.includes('overloaded') || // Anthropic 529 body text\n msg.includes('529') || // Anthropic overload status code\n msg.includes('503') ||\n msg.includes('502') ||\n msg.includes('504') || // Gateway timeout\n msg.includes('internal server error') // 500 — may be transient\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((res) => setTimeout(res, ms));\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Model Profiler\n// ─────────────────────────────────────────────\n//\n// Discovers model specializations at first run.\n// Strategy: OpenRouter public API first (no auth, free), then direct LLM query as fallback.\n// Results are cached in SQLite so profiling runs at most once per model.\n//\n\nimport type { ModelInfo, ProviderType } from '../../types.js';\nimport type { MemoryStore } from '../../memory/store.js';\nimport type { CascadeRouter } from './index.js';\n\n// Models to skip — no specialization query makes sense for these\nconst SKIP_PATTERN = /embed|dall-e|whisper|tts|vision|instruct-vision|rerank/i;\n\ninterface OpenRouterModel {\n id: string;\n description?: string;\n name?: string;\n}\n\nconst SPECIALIZATION_KEYWORDS: Record<string, string[]> = {\n code: ['code', 'coding', 'programming', 'developer', 'software', 'function', 'debug', 'typescript', 'python', 'javascript'],\n analysis: ['analysis', 'analytical', 'reasoning', 'logic', 'research', 'evaluate', 'assess', 'explain'],\n creative: ['creative', 'writing', 'story', 'poetry', 'content', 'blog', 'essay', 'narrative'],\n data: ['data', 'sql', 'statistics', 'chart', 'csv', 'json', 'excel', 'spreadsheet', 'math', 'mathematical'],\n instruction: ['instruction', 'instruction-following', 'accurate', 'precise', 'factual'],\n multilingual: ['multilingual', 'language', 'translation', 'linguistic'],\n long_context: ['long', 'context', 'document', 'book', 'summarize', 'large'],\n};\n\nfunction extractSpecializations(description: string): string[] {\n const lower = description.toLowerCase();\n const found: string[] = [];\n for (const [key, terms] of Object.entries(SPECIALIZATION_KEYWORDS)) {\n if (terms.some(t => lower.includes(t))) {\n found.push(key);\n }\n }\n return found;\n}\n\nasync function fetchOpenRouterModels(): Promise<OpenRouterModel[]> {\n try {\n const resp = await fetch('https://openrouter.ai/api/v1/models', {\n headers: { 'User-Agent': 'Cascade-AI/0.4.0' },\n signal: AbortSignal.timeout(8_000),\n });\n if (!resp.ok) return [];\n const data = await resp.json() as { data?: OpenRouterModel[] };\n return data.data ?? [];\n } catch {\n return [];\n }\n}\n\nasync function queryModelDirectly(router: CascadeRouter, model: ModelInfo): Promise<string[]> {\n try {\n const result = await router.generate('T3', {\n messages: [{\n role: 'user',\n content: 'What are your top 3 task specializations? Reply with valid JSON only: {\"specializations\": [\"<area1>\", \"<area2>\", \"<area3>\"]}',\n }],\n maxTokens: 60,\n });\n const match = /\\{[\\s\\S]*?\\}/.exec(result.content);\n if (!match) return [];\n const parsed = JSON.parse(match[0]) as { specializations?: unknown[] };\n const specs = parsed.specializations;\n if (!Array.isArray(specs)) return [];\n return specs.filter((s): s is string => typeof s === 'string').slice(0, 5);\n } catch {\n return [];\n }\n}\n\nexport class ModelProfiler {\n private store: MemoryStore;\n private router?: CascadeRouter;\n\n constructor(store: MemoryStore, router?: CascadeRouter) {\n this.store = store;\n this.router = router;\n }\n\n /**\n * Profile all models that haven't been profiled yet.\n * Safe to call concurrently — SQLite upsert handles races.\n */\n async profileAll(models: ModelInfo[]): Promise<void> {\n const alreadyProfiled = new Set(this.store.getProfiledModelIds());\n const toProfile = models.filter(\n m => !alreadyProfiled.has(m.id) && !SKIP_PATTERN.test(m.id) && !SKIP_PATTERN.test(m.name),\n );\n if (toProfile.length === 0) return;\n\n // Fetch OpenRouter catalog once\n const openRouterModels = await fetchOpenRouterModels();\n const orByNormalizedId = new Map<string, OpenRouterModel>();\n for (const m of openRouterModels) {\n orByNormalizedId.set(m.id.toLowerCase(), m);\n // Also index by just the model name after the last '/'\n const short = m.id.split('/').pop();\n if (short) orByNormalizedId.set(short.toLowerCase(), m);\n }\n\n await Promise.allSettled(\n toProfile.map(async (model) => {\n let specializations: string[] = [];\n\n // Try OpenRouter first\n const orMatch = orByNormalizedId.get(model.id.toLowerCase())\n ?? orByNormalizedId.get(model.id.split('/').pop()?.toLowerCase() ?? '');\n if (orMatch?.description) {\n specializations = extractSpecializations(orMatch.description);\n }\n\n // Fall back to direct LLM query if no data found\n if (specializations.length === 0 && this.router) {\n specializations = await queryModelDirectly(this.router, model);\n }\n\n // Store even if empty so we don't re-attempt\n this.store.saveModelProfile(model.id, model.provider as ProviderType, specializations);\n }),\n );\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Delegation Savings\n// ─────────────────────────────────────────────\n//\n// Only a hierarchy can answer \"what did delegation save you?\": the\n// counterfactual is every call running on the premium T1 model instead of\n// being routed to cheaper T2/T3 models (often free local ones). Pure\n// function over RouterStats so it is unit-testable without a router.\n\nimport type { ModelInfo } from '../../types.js';\nimport { calculateCost } from '../../utils/cost.js';\nimport type { RouterStats } from './index.js';\n\nexport interface DelegationSavings {\n /** USD saved vs. running every call on the T1 model. 0 when nothing was saved. */\n savedUsd: number;\n /** Percentage of the counterfactual cost that was saved (0–100, one decimal). */\n savedPct: number;\n /** What the session would have cost if every call had used the T1 model. */\n counterfactualUsd: number;\n}\n\nconst NO_SAVINGS: DelegationSavings = { savedUsd: 0, savedPct: 0, counterfactualUsd: 0 };\n\nexport function computeDelegationSavings(\n stats: Pick<RouterStats, 'totalCostUsd' | 'inputTokensByTier' | 'outputTokensByTier'>,\n t1Model: ModelInfo | undefined | null,\n): DelegationSavings {\n if (!t1Model) return NO_SAVINGS;\n\n let counterfactualUsd = 0;\n const tiers = new Set([\n ...Object.keys(stats.inputTokensByTier),\n ...Object.keys(stats.outputTokensByTier),\n ]);\n for (const tier of tiers) {\n counterfactualUsd += calculateCost(\n stats.inputTokensByTier[tier] ?? 0,\n stats.outputTokensByTier[tier] ?? 0,\n t1Model,\n );\n }\n\n const savedUsd = counterfactualUsd - stats.totalCostUsd;\n // A free/local T1 (counterfactual 0) or an all-T1 run never shows savings.\n if (!(savedUsd > 0) || counterfactualUsd <= 0) {\n return { ...NO_SAVINGS, counterfactualUsd: Math.max(0, counterfactualUsd) };\n }\n\n return {\n savedUsd,\n savedPct: Math.round((savedUsd / counterfactualUsd) * 1000) / 10,\n counterfactualUsd,\n };\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Live benchmark + pricing data\n// ─────────────────────────────────────────────\n//\n// Hybrid data source for Cascade Auto: fetches *current* public data and\n// degrades gracefully when offline.\n//\n// quality scores : live GitHub-raw snapshot → disk cache → bundled table\n// per-token price : live OpenRouter (free, no key) → disk cache → catalog\n//\n// All network work is best-effort and time-boxed; any failure silently keeps\n// the last-known-good data. Refresh is meant to run in the background (see\n// CascadeRouter.refreshLiveData) so it never blocks a task.\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { ModelInfo } from '../../types.js';\nimport type { BenchmarkProfile } from './benchmarks.js';\nimport { GLOBAL_CONFIG_DIR } from '../../constants.js';\nimport { withTimeout } from '../../utils/retry.js';\n\n/** Shape of the committed/refreshable quality snapshot (benchmark-data.json). */\nexport interface BenchmarkSnapshot {\n generatedAt: string;\n source: string;\n families: Record<string, BenchmarkProfile>;\n}\n\nexport type DataSource = 'live' | 'cache' | 'bundled';\n\ninterface PriceEntry { input: number; output: number }\n\ninterface DiskCache {\n fetchedAt: number;\n snapshot?: BenchmarkSnapshot;\n prices?: Record<string, PriceEntry>;\n}\n\nexport interface LiveDataOptions {\n /** Master switch for live quality fetch. Default: true. */\n live?: boolean;\n /** Master switch for live OpenRouter pricing. Default: true. */\n pricingLive?: boolean;\n /** Hours a fetched snapshot stays fresh before re-fetching. Default: 24. */\n refreshHours?: number;\n /** Override the quality snapshot URL. */\n sourceUrl?: string;\n /** Override the on-disk cache path (tests). */\n cacheFile?: string;\n}\n\n// Maintained snapshot, served straight from the repo. Updated by the\n// scheduled refresh workflow; fetched live so users get the latest without a\n// package upgrade.\nconst DEFAULT_SNAPSHOT_URL =\n 'https://raw.githubusercontent.com/Varun-SV/Cascade-AI/main/src/core/router/benchmark-data.json';\nconst OPENROUTER_MODELS_URL = 'https://openrouter.ai/api/v1/models';\nconst FETCH_TIMEOUT_MS = 8_000;\nconst DEFAULT_CACHE_FILE = path.join(os.homedir(), GLOBAL_CONFIG_DIR, 'benchmarks-cache.json');\n\n/**\n * Normalises a model id for cross-source matching: drops a `vendor/` prefix\n * (OpenRouter style) and trailing date / preview suffixes, lower-cased.\n * \"google/gemini-2.5-flash\" → \"gemini-2.5-flash\"\n * \"claude-haiku-4-5-20251001\" → \"claude-haiku-4-5\"\n * \"gemini-2.5-flash-preview-04-17\" → \"gemini-2.5-flash\"\n */\nexport function normalizeModelId(id: string): string {\n let s = id.toLowerCase();\n const slash = s.lastIndexOf('/');\n if (slash !== -1) s = s.slice(slash + 1);\n s = s.replace(/-preview(?:-\\d{2}-\\d{2})?$/, '');\n s = s.replace(/-\\d{8}$/, '');\n s = s.replace(/[:@].*$/, '');\n return s;\n}\n\nexport class LiveDataProvider {\n private snapshot: BenchmarkSnapshot | null = null;\n private prices = new Map<string, PriceEntry>();\n private source: DataSource = 'bundled';\n private fetchedAt = 0;\n private loaded = false;\n private refreshing: Promise<void> | null = null;\n private readonly opts: Required<Omit<LiveDataOptions, 'sourceUrl'>> & { sourceUrl?: string };\n\n constructor(opts: LiveDataOptions = {}) {\n this.opts = {\n live: opts.live ?? true,\n pricingLive: opts.pricingLive ?? true,\n refreshHours: opts.refreshHours ?? 24,\n cacheFile: opts.cacheFile ?? DEFAULT_CACHE_FILE,\n sourceUrl: opts.sourceUrl,\n };\n }\n\n /** Load cached data from disk (cheap, no network). Safe to call repeatedly. */\n async load(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = await fs.readFile(this.opts.cacheFile, 'utf-8');\n const cache = JSON.parse(raw) as DiskCache;\n if (cache.snapshot?.families) {\n this.snapshot = cache.snapshot;\n this.source = 'cache';\n }\n if (cache.prices) {\n for (const [id, p] of Object.entries(cache.prices)) this.prices.set(id, p);\n }\n this.fetchedAt = cache.fetchedAt ?? 0;\n } catch {\n // No cache yet — bundled fallbacks remain in effect.\n }\n }\n\n /**\n * Refresh from the network if the cache is older than the TTL. Coalesces\n * concurrent callers and never throws — failures keep last-known-good data.\n */\n async refresh(force = false): Promise<void> {\n if (this.refreshing) return this.refreshing;\n this.refreshing = this.doRefresh(force).finally(() => { this.refreshing = null; });\n return this.refreshing;\n }\n\n private async doRefresh(force: boolean): Promise<void> {\n await this.load();\n const ttlMs = this.opts.refreshHours * 3_600_000;\n const fresh = ttlMs > 0 && Date.now() - this.fetchedAt < ttlMs;\n if (!force && fresh && this.source !== 'bundled') return;\n\n const [snap, prices] = await Promise.all([\n this.opts.live ? this.fetchSnapshot() : Promise.resolve(null),\n this.opts.pricingLive ? this.fetchPrices() : Promise.resolve(null),\n ]);\n\n let changed = false;\n if (snap) { this.snapshot = snap; this.source = 'live'; changed = true; }\n if (prices && prices.size > 0) { this.prices = prices; changed = true; }\n if (changed) {\n this.fetchedAt = Date.now();\n await this.saveCache();\n }\n }\n\n private async fetchSnapshot(): Promise<BenchmarkSnapshot | null> {\n const url = this.opts.sourceUrl ?? DEFAULT_SNAPSHOT_URL;\n try {\n const resp = await withTimeout(fetch(url), FETCH_TIMEOUT_MS, 'benchmark fetch timed out');\n if (!resp.ok) return null;\n const data = await resp.json() as BenchmarkSnapshot;\n if (!data || typeof data !== 'object' || !data.families || typeof data.families !== 'object') {\n return null;\n }\n return data;\n } catch {\n return null;\n }\n }\n\n private async fetchPrices(): Promise<Map<string, PriceEntry> | null> {\n try {\n const resp = await withTimeout(fetch(OPENROUTER_MODELS_URL), FETCH_TIMEOUT_MS, 'pricing fetch timed out');\n if (!resp.ok) return null;\n const data = await resp.json() as {\n data?: Array<{ id?: string; pricing?: { prompt?: string; completion?: string } }>;\n };\n if (!Array.isArray(data?.data)) return null;\n const out = new Map<string, PriceEntry>();\n for (const m of data.data) {\n if (!m?.id || !m.pricing) continue;\n // OpenRouter prices are per-token USD strings; convert to per-1k.\n const input = Number(m.pricing.prompt) * 1000;\n const output = Number(m.pricing.completion) * 1000;\n if (!Number.isFinite(input) || !Number.isFinite(output)) continue;\n out.set(normalizeModelId(m.id), { input, output });\n }\n return out;\n } catch {\n return null;\n }\n }\n\n private async saveCache(): Promise<void> {\n try {\n await fs.mkdir(path.dirname(this.opts.cacheFile), { recursive: true });\n const cache: DiskCache = {\n fetchedAt: this.fetchedAt,\n snapshot: this.snapshot ?? undefined,\n prices: Object.fromEntries(this.prices),\n };\n await fs.writeFile(this.opts.cacheFile, JSON.stringify(cache, null, 2), 'utf-8');\n } catch {\n // Non-critical — in-memory data is still used this session.\n }\n }\n\n /** Quality profile for a model family, or null when we have no live/cached data. */\n getQualityProfile(family: string): BenchmarkProfile | null {\n return this.snapshot?.families?.[family] ?? null;\n }\n\n /** Current per-1k price for a model id, or null when unknown. */\n getLivePrice(modelId: string): PriceEntry | null {\n return this.prices.get(normalizeModelId(modelId)) ?? null;\n }\n\n /**\n * Returns a price-corrected copy of each model when live pricing is known,\n * leaving the original untouched (so the shared catalog is never mutated).\n */\n applyLivePricing(models: ModelInfo[]): ModelInfo[] {\n return models.map((m) => {\n const p = this.getLivePrice(m.id);\n if (!p) return m;\n return { ...m, inputCostPer1kTokens: p.input, outputCostPer1kTokens: p.output };\n });\n }\n\n /** Where the active quality data came from — for /why and `cascade models`. */\n getDataSource(): DataSource { return this.source; }\n getGeneratedAt(): string | null { return this.snapshot?.generatedAt ?? null; }\n hasLivePricing(): boolean { return this.prices.size > 0; }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Public-benchmark model strengths\n// ─────────────────────────────────────────────\n//\n// Curated 0–100 scores per model family per task type, approximated from\n// public benchmarks so Cascade Auto can route each subtask to the model that\n// is actually strongest at it, rather than always defaulting to the\n// cheapest-or-first model:\n// - code ← SWE-bench / HumanEval\n// - analysis ← MMLU / GPQA / reasoning suites\n// - creative ← writing evals / LMArena\n// - data ← GSM8K / MATH / data-wrangling\n//\n// These are deliberately editable knobs, not gospel — they only set the\n// *relative* preference between available models for a given task type.\n\nimport type { ModelInfo } from '../../types.js';\nimport type { TaskType } from './task-analyzer.js';\nimport type { LiveDataProvider } from './live-data.js';\n\nexport type BenchmarkProfile = Partial<Record<Exclude<TaskType, 'mixed'>, number>>;\n\n// Optional live/cached data source. When set (Cascade Auto with benchmarks.live\n// on), current public scores override the bundled table below; otherwise the\n// bundled table is the offline baseline. Type-only import keeps this decoupled.\nlet liveProvider: LiveDataProvider | null = null;\n\n/** Wire a live data source so benchmarkScore01 prefers current public scores. */\nexport function setBenchmarkLiveProvider(provider: LiveDataProvider | null): void {\n liveProvider = provider;\n}\n\nconst FAMILY_BENCHMARKS: Record<string, BenchmarkProfile> = {\n // Anthropic — strongest at coding and agentic tool-use.\n 'claude-opus': { code: 95, analysis: 92, creative: 90, data: 88 },\n 'claude-sonnet': { code: 93, analysis: 88, creative: 87, data: 85 },\n 'claude-haiku': { code: 80, analysis: 75, creative: 76, data: 72 },\n // OpenAI — strong all-round, particularly creative/writing.\n 'gpt-4.1': { code: 90, analysis: 89, creative: 91, data: 87 },\n 'gpt-4.1-mini': { code: 82, analysis: 80, creative: 83, data: 79 },\n 'gpt-4.1-nano': { code: 70, analysis: 68, creative: 72, data: 66 },\n 'gpt-4o': { code: 86, analysis: 85, creative: 90, data: 84 },\n 'gpt-4o-mini': { code: 76, analysis: 74, creative: 80, data: 72 },\n // Google — strongest at analysis/data and long-context.\n 'gemini-2.5-pro': { code: 90, analysis: 93, creative: 86, data: 92 },\n 'gemini-2.5-flash': { code: 82, analysis: 83, creative: 80, data: 82 },\n 'gemini-1.5-pro': { code: 82, analysis: 84, creative: 82, data: 85 },\n 'gemini-2.0-flash': { code: 79, analysis: 80, creative: 79, data: 80 },\n 'gemini-flash-lite': { code: 68, analysis: 68, creative: 70, data: 68 },\n // Local (Ollama) — lower absolute scores; the ordering is what matters when a\n // tier is restricted to local-only models.\n 'deepseek': { code: 80, analysis: 72, creative: 68, data: 74 },\n 'qwen': { code: 78, analysis: 73, creative: 72, data: 74 },\n 'codellama': { code: 76, analysis: 60, creative: 55, data: 60 },\n 'llama-70b': { code: 74, analysis: 72, creative: 73, data: 70 },\n 'mistral': { code: 62, analysis: 64, creative: 66, data: 60 },\n 'gemma': { code: 58, analysis: 60, creative: 62, data: 57 },\n 'llama-small': { code: 55, analysis: 56, creative: 60, data: 54 },\n};\n\n// Ordered most-specific → least so e.g. \"gpt-4.1-mini\" doesn't match \"gpt-4.1\".\nconst FAMILY_MATCHERS: Array<[RegExp, string]> = [\n [/opus/i, 'claude-opus'],\n [/sonnet/i, 'claude-sonnet'],\n [/haiku/i, 'claude-haiku'],\n [/gpt-?4\\.1-nano/i, 'gpt-4.1-nano'],\n [/gpt-?4\\.1-mini/i, 'gpt-4.1-mini'],\n [/gpt-?4\\.1/i, 'gpt-4.1'],\n [/gpt-?4o-mini/i, 'gpt-4o-mini'],\n [/gpt-?4o/i, 'gpt-4o'],\n [/gemini-?2\\.5-pro/i, 'gemini-2.5-pro'],\n [/gemini-?2\\.5-flash/i, 'gemini-2.5-flash'],\n [/gemini-?1\\.5-pro/i, 'gemini-1.5-pro'],\n [/gemini-?2\\.0-flash-lite/i, 'gemini-flash-lite'],\n [/gemini-?2\\.0-flash/i, 'gemini-2.0-flash'],\n [/codellama|code-llama|starcoder|stable-code/i, 'codellama'],\n [/deepseek/i, 'deepseek'],\n [/qwen/i, 'qwen'],\n [/llama.?3.*70b|llama3:70b|llama-3-70b/i, 'llama-70b'],\n [/llama/i, 'llama-small'],\n [/mistral|mixtral/i, 'mistral'],\n [/gemma/i, 'gemma'],\n];\n\nexport function resolveFamily(model: ModelInfo): string | null {\n const hay = `${model.id} ${model.name}`;\n for (const [re, fam] of FAMILY_MATCHERS) {\n if (re.test(hay)) return fam;\n }\n return null;\n}\n\n/**\n * Benchmark strength of a model for a task type, normalised to 0–1. Returns a\n * neutral 0.5 for models with no benchmark profile so they neither win nor lose\n * on this factor alone.\n */\nexport function benchmarkScore01(model: ModelInfo, taskType: TaskType): number {\n const fam = resolveFamily(model);\n if (!fam) return 0.5;\n // Prefer current live/cached scores; fall back to the bundled table.\n const profile = liveProvider?.getQualityProfile(fam) ?? FAMILY_BENCHMARKS[fam];\n if (!profile) return 0.5;\n\n let score: number;\n if (taskType === 'mixed') {\n const vals = Object.values(profile).filter((v): v is number => typeof v === 'number');\n score = vals.length ? vals.reduce((a, b) => a + b, 0) / vals.length : 50;\n } else {\n score = profile[taskType] ?? 50;\n }\n return Math.max(0, Math.min(1, score / 100));\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Model Router\n// ─────────────────────────────────────────────\n\nimport EventEmitter from 'node:events';\nimport type {\n CascadeConfig,\n GenerateOptions,\n GenerateResult,\n ModelInfo,\n ProviderConfig,\n ProviderType,\n StreamChunk,\n TierRole,\n TokenUsage,\n} from '../../types.js';\nimport { AnthropicProvider } from '../../providers/anthropic.js';\nimport { AzureOpenAIProvider } from '../../providers/azure.js';\nimport { GeminiProvider } from '../../providers/gemini.js';\nimport { OllamaProvider } from '../../providers/ollama.js';\nimport { OpenAICompatibleProvider } from '../../providers/openai-compatible.js';\nimport { OpenAIProvider } from '../../providers/openai.js';\nimport type { BaseProvider } from '../../providers/base.js';\nimport { ModelSelector } from './selector.js';\nimport { FailoverManager } from './failover.js';\nimport { TpmLimiter } from './tpm-limiter.js';\nimport { LocalRequestQueue } from './local-queue.js';\nimport type { TaskAnalyzer } from './task-analyzer.js';\nimport { MODELS, OLLAMA_BASE_URL } from '../../constants.js';\nimport { calculateCost } from '../../utils/cost.js';\nimport { withTimeout, CascadeCancelledError } from '../../utils/retry.js';\nimport { ModelProfiler } from './model-profiler.js';\nimport type { MemoryStore } from '../../memory/store.js';\nimport { computeDelegationSavings, type DelegationSavings } from './savings.js';\nimport { LiveDataProvider } from './live-data.js';\nimport { setBenchmarkLiveProvider } from './benchmarks.js';\n\nexport interface RouterStats {\n totalTokens: number;\n totalCostUsd: number;\n callsByProvider: Record<string, number>;\n callsByTier: Record<string, number>;\n /** Accumulated cost (USD) broken down per tier — useful for budget attribution. */\n costByTier: Record<string, number>;\n /** Accumulated token usage broken down per tier (input + output). */\n tokensByTier: Record<string, number>;\n /** Input and output token counts per tier for granular cost analysis. */\n inputTokensByTier: Record<string, number>;\n outputTokensByTier: Record<string, number>;\n}\n\nexport class CascadeRouter extends EventEmitter {\n private selector!: ModelSelector;\n private failover!: FailoverManager;\n private providers: Map<string, BaseProvider> = new Map();\n private stats: RouterStats = {\n totalTokens: 0,\n totalCostUsd: 0,\n callsByProvider: {},\n callsByTier: {},\n costByTier: {},\n tokensByTier: {},\n inputTokensByTier: {},\n outputTokensByTier: {},\n };\n\n private tierModels: Map<TierRole, ModelInfo> = new Map();\n private config!: CascadeConfig;\n private sessionCostUsd = 0;\n // Per-run accounting for the hard per-task cap. Reset by beginRun() at the\n // start of every `cascade run`, independent of the session-wide budget.\n private runTokens = 0;\n private runCostUsd = 0;\n private runBudgetExceeded = false;\n private runBudgetExceededReason: string | undefined;\n /**\n * Budget state machine — guards against two concurrent `generate()` calls\n * each firing the warning or both slipping past the hard cap. All\n * transitions happen inside `updateBudgetState()` which is called only\n * from `recordStats`, single-threaded per V8 event loop turn.\n */\n private budgetState: 'ok' | 'warned' | 'exceeded' = 'ok';\n private budgetExceededReason: string | undefined;\n private tpmLimiter!: TpmLimiter;\n private localQueue!: LocalRequestQueue;\n private taskAnalyzer?: TaskAnalyzer;\n private liveData?: LiveDataProvider;\n /** Snapshot of configured/default tier models, taken before Cascade Auto overrides them. */\n private originalTierModels?: Map<TierRole, ModelInfo>;\n /** The current run's abort signal — injected into every provider call so a cancel aborts in-flight requests. */\n private runSignal?: AbortSignal;\n\n /** Thrown when the configured budget is exceeded. */\n static BudgetExceededError = class extends Error {\n constructor(msg: string) { super(msg); this.name = 'BudgetExceededError'; }\n };\n\n constructor() {\n super();\n }\n\n async init(config: CascadeConfig): Promise<void> {\n this.config = config;\n const availableProviders = await this.detectAvailableProviders(config.providers);\n this.selector = new ModelSelector(availableProviders);\n this.failover = new FailoverManager(this.selector);\n this.tpmLimiter = new TpmLimiter((config as unknown as {\n rateLimits?: { providerTpm?: Partial<Record<ProviderType, number>> };\n }).rateLimits?.providerTpm ?? {});\n\n this.localQueue = new LocalRequestQueue(config.localConcurrency ?? 1);\n\n // Discover Ollama models and register them\n const ollamaCfg = config.providers.find((p) => p.type === 'ollama');\n if (availableProviders.has('ollama')) {\n await this.discoverOllamaModels(ollamaCfg);\n }\n\n // Apply explicit tier overrides first.\n for (const tier of ['T1', 'T2', 'T3'] as TierRole[]) {\n const override =\n tier === 'T1' ? config.models.t1\n : tier === 'T2' ? config.models.t2\n : config.models.t3;\n if (!override) continue;\n\n const model = this.selector.selectForTier(tier, override);\n if (!model) {\n const knownProviders = ['anthropic', 'openai', 'gemini', 'azure', 'openai-compatible', 'ollama'];\n const hasProviderPrefix = override.includes(':') &&\n knownProviders.some(p => override.startsWith(p + ':'));\n if (hasProviderPrefix) {\n const provider = override.split(':')[0];\n throw new Error(\n `Configured model \"${override}\" for ${tier} cannot be used: ` +\n `provider '${provider}' is not available or unreachable. ` +\n `Check that the provider is running and accessible.`\n );\n }\n throw new Error(\n `Configured model \"${override}\" for ${tier} could not be loaded. ` +\n `Check provider availability and exact model name.`\n );\n }\n\n this.tierModels.set(tier, model);\n this.ensureProvider(model, config.providers);\n }\n\n // Fill any tiers without explicit overrides using priority defaults.\n for (const tier of ['T1', 'T2', 'T3'] as TierRole[]) {\n if (this.tierModels.has(tier)) continue;\n const model = this.selector.selectForTier(tier);\n if (model) {\n this.tierModels.set(tier, model);\n this.ensureProvider(model, config.providers);\n }\n }\n }\n\n /**\n * Run model specialization profiling in the background.\n * Only profiles models that haven't been profiled yet (cache-first).\n * No-op if store is not provided.\n */\n async profileModels(store: MemoryStore): Promise<void> {\n const allModels = this.selector.getAllAvailableModels();\n const profiler = new ModelProfiler(store, this);\n // Run in background — don't block task execution\n profiler.profileAll(allModels).catch(() => { /* non-fatal */ });\n }\n\n /**\n * Cascade Auto live data: discover/validate real model ids from each cloud\n * provider, then fetch current public quality scores + per-token prices and\n * apply the prices to the available-model set. Best-effort and safe to run in\n * the background — any failure leaves the bundled catalog/benchmarks in effect.\n */\n async refreshLiveData(): Promise<void> {\n const benchCfg = this.config.benchmarks ?? {};\n if (!this.liveData) {\n this.liveData = new LiveDataProvider({\n live: benchCfg.live,\n pricingLive: benchCfg.pricingLive,\n refreshHours: benchCfg.refreshHours,\n sourceUrl: benchCfg.sourceUrl,\n });\n // Route benchmarkScore01 through the live source for this process.\n setBenchmarkLiveProvider(this.liveData);\n }\n await this.discoverProviderModels();\n await this.liveData.refresh().catch(() => { /* keep last-known-good */ });\n this.applyLivePricing();\n }\n\n /** Returns the live-data provider once refreshLiveData has run (UX/insight). */\n getLiveData(): LiveDataProvider | undefined {\n return this.liveData;\n }\n\n /**\n * Query each available cloud provider's live model list and register the\n * results. Confirms catalog ids still exist and surfaces newly released\n * models without a package upgrade. Mirrors discoverOllamaModels.\n */\n private async discoverProviderModels(): Promise<void> {\n const cloud: ProviderType[] = ['anthropic', 'openai', 'gemini', 'azure', 'openai-compatible'];\n const tasks = cloud.map(async (type) => {\n if (!this.selector.isProviderAvailable(type)) return;\n const seed = this.getAnyModelForProvider(type);\n if (!seed) return;\n const cfg = this.config.providers.find((p) => p.type === type) ?? { type };\n try {\n const provider = this.createProvider(cfg, seed);\n if (typeof provider.listModels !== 'function') return;\n const models = await provider.listModels();\n for (const m of models) this.selector.addDynamicModel(m);\n } catch { /* provider listing unavailable — non-fatal */ }\n });\n await Promise.allSettled(tasks);\n }\n\n /**\n * Replace available models with live-priced copies and refresh the already\n * resolved tier models so shared-tier cost accounting uses current prices.\n */\n private applyLivePricing(): void {\n if (!this.liveData?.hasLivePricing()) return;\n const updated = this.liveData.applyLivePricing(this.selector.getAllAvailableModels());\n for (const m of updated) this.selector.addDynamicModel(m);\n for (const tier of ['T1', 'T2', 'T3'] as TierRole[]) {\n const cur = this.tierModels.get(tier);\n if (!cur) continue;\n const fresh = this.selector.getModelById(cur.id);\n if (fresh) this.tierModels.set(tier, fresh);\n }\n }\n\n async generate(\n tier: TierRole,\n options: GenerateOptions,\n onChunk?: (chunk: StreamChunk) => void,\n requireVision = false,\n ): Promise<GenerateResult> {\n // Hard stop: refuse every new LLM call once the budget kill-switch fired.\n // This closes the race where two in-flight generate() calls both slipped\n // past the pre-existing `>= cap` check and pushed spend over the limit.\n if (this.budgetState === 'exceeded') {\n throw new CascadeRouter.BudgetExceededError(\n this.budgetExceededReason ?? 'Session budget exceeded.',\n );\n }\n // Hard per-task ceiling — stop the moment a single run goes over, so a\n // mis-routed task cannot keep spawning LLM calls.\n if (this.runBudgetExceeded) {\n throw new CascadeRouter.BudgetExceededError(\n this.runBudgetExceededReason ?? 'Per-task budget exceeded.',\n );\n }\n\n // ── Apply per-tier token limit ──────────────\n const limits = this.config?.tierLimits;\n const tierKey = tier.toLowerCase() as 't1' | 't2' | 't3';\n const tierMaxTokens = limits?.[`${tierKey}MaxTokens` as keyof typeof limits] as number | undefined;\n if (tierMaxTokens && (!options.maxTokens || options.maxTokens > tierMaxTokens)) {\n options = { ...options, maxTokens: tierMaxTokens };\n }\n // Inject the run's abort signal so the provider can abort the in-flight\n // request the moment a cancel fires (instant cancellation).\n if (this.runSignal && !options.signal) {\n options = { ...options, signal: this.runSignal };\n }\n // Per-call override (Cascade Auto per-subtask routing) wins over the shared\n // tier model, except when a vision model is explicitly required.\n if (options.model && !requireVision) {\n this.ensureProvider(options.model, this.config.providers);\n }\n const model = requireVision\n ? this.selector.selectVisionModel()\n : (options.model ?? this.tierModels.get(tier));\n\n if (!model) throw new Error(`No model available for tier ${tier}`);\n\n const provider = this.getProvider(model);\n if (!provider) throw new Error(`No provider for model ${model.id}`);\n\n // Per-provider TPM guard: pause this call until the token bucket has\n // enough budget to cover the estimated input+output tokens. Prevents\n // sudden bursts of parallel T3 spawns from overshooting a provider's\n // tokens-per-minute quota.\n const estimatedTokens = (options.maxTokens ?? model.maxOutputTokens ?? 1024) + 512;\n if (this.tpmLimiter) {\n await this.tpmLimiter.acquire(model.provider, estimatedTokens);\n }\n\n const useStream = Boolean(onChunk) && model.supportsStreaming && typeof provider.generateStream === 'function';\n\n // Serialize requests to local providers (e.g. Ollama) to prevent GPU VRAM\n // pressure when multiple T3 workers run in parallel on a single-GPU machine.\n let releaseLocalSlot: (() => void) | undefined;\n if (model.isLocal) {\n const inferenceTimeoutMs = this.config.localInferenceTimeoutMs ?? 300_000;\n // Allow up to half the inference timeout to wait in the queue itself.\n const queueWaitMs = Math.round(inferenceTimeoutMs / 2);\n releaseLocalSlot = await this.localQueue.acquire(queueWaitMs);\n }\n\n try {\n let result: GenerateResult;\n\n if (model.isLocal) {\n // Apply a hard timeout to local inference calls so a slow/overloaded\n // model doesn't block the worker indefinitely.\n const inferenceTimeoutMs = this.config.localInferenceTimeoutMs ?? 300_000;\n const inferencePromise = useStream && onChunk\n ? provider.generateStream(options, (chunk) => {\n const text = typeof chunk?.text === 'string' ? chunk.text : '';\n if (text) onChunk({ ...chunk, text });\n })\n : provider.generate(options);\n result = await withTimeout(\n inferencePromise,\n inferenceTimeoutMs,\n `Local model ${model.id} inference timed out after ${inferenceTimeoutMs}ms`,\n );\n } else if (useStream && onChunk) {\n // Cloud streaming MUST be time-boxed: a stalled SSE connection (TCP open,\n // no terminal chunk) would otherwise hang the whole run with no output.\n const cloudTimeoutMs = this.config.cloudInferenceTimeoutMs ?? 120_000;\n try {\n result = await withTimeout(\n provider.generateStream(options, (chunk) => {\n const text = typeof chunk?.text === 'string' ? chunk.text : '';\n if (text) onChunk({ ...chunk, text });\n }),\n cloudTimeoutMs,\n `Model ${model.id} stream timed out after ${cloudTimeoutMs}ms`,\n );\n } catch (streamErr) {\n // Cancelled mid-stream — propagate the abort, don't retry.\n if ((streamErr instanceof Error && streamErr.name === 'AbortError') || this.runSignal?.aborted || options.signal?.aborted) {\n throw streamErr;\n }\n // Stream stalled or errored — fall back to a (also time-boxed)\n // non-streaming call rather than letting a hung stream freeze the run.\n result = await withTimeout(\n provider.generate(options),\n cloudTimeoutMs,\n `Model ${model.id} inference timed out after ${cloudTimeoutMs}ms`,\n );\n }\n } else {\n const cloudTimeoutMs = this.config.cloudInferenceTimeoutMs ?? 120_000;\n result = await withTimeout(\n provider.generate(options),\n cloudTimeoutMs,\n `Model ${model.id} inference timed out after ${cloudTimeoutMs}ms`,\n );\n }\n\n const correctedCost = calculateCost(\n result.usage.inputTokens,\n result.usage.outputTokens,\n model,\n );\n\n result = {\n ...result,\n usage: {\n ...result.usage,\n estimatedCostUsd: correctedCost,\n },\n };\n\n if (!result || typeof result.content !== 'string' || !result.usage) {\n throw new Error(`Provider ${model.provider}:${model.id} returned an invalid generation result.`);\n }\n\n this.recordStats(tier, model, result.usage);\n // On success, signal the failover manager so that a provider which\n // previously tripped a rate-limit can be immediately re-enabled rather\n // than waiting the full backoff window to expire.\n this.failover.recordSuccess(model.provider);\n return result;\n } catch (err) {\n // A cancelled run aborts the in-flight provider request. Surface it as a\n // cancellation so it propagates like the checkpoint-based cancel (graceful\n // stop + partial output upstream) rather than being retried/failed-over.\n if ((err instanceof Error && err.name === 'AbortError') || this.runSignal?.aborted || options.signal?.aborted) {\n throw new CascadeCancelledError('Run cancelled');\n }\n const errMsg = err instanceof Error ? err.message : String(err);\n if (this.isRateLimitError(errMsg)) {\n this.failover.recordFailure(model.provider, 'rate_limit');\n const fallback = this.failover.getFallbackModel(model, tier);\n if (fallback) {\n this.tierModels.set(tier, fallback);\n this.ensureProvider(fallback, this.config.providers);\n this.emit('failover', {\n tier,\n from: `${model.provider}:${model.id}`,\n to: `${fallback.provider}:${fallback.id}`,\n reason: 'rate limit',\n });\n // Release the local slot before the recursive call so the fallback\n // model (which may itself be local) can acquire its own slot.\n releaseLocalSlot?.();\n releaseLocalSlot = undefined;\n return this.generate(tier, options, onChunk, requireVision);\n }\n }\n // Stale / invalid model id (e.g. a retired preview that 404s). Drop it so\n // it is never selected again this session and fail over to the next\n // candidate, instead of surfacing the raw provider error to the user.\n if (isModelNotFoundError(errMsg)) {\n this.selector.removeModel(model.id);\n const next = this.selector.selectForTier(tier);\n if (next && next.id !== model.id) {\n this.tierModels.set(tier, next);\n this.ensureProvider(next, this.config.providers);\n this.emit('failover', {\n tier,\n from: `${model.provider}:${model.id}`,\n to: `${next.provider}:${next.id}`,\n reason: 'model not found',\n });\n releaseLocalSlot?.();\n releaseLocalSlot = undefined;\n // Clear a per-subtask override that pointed at the dead model so the\n // recursive call resolves the tier's next-best model.\n const retryOpts = options.model && options.model.id === model.id\n ? { ...options, model: undefined }\n : options;\n return this.generate(tier, retryOpts, onChunk, requireVision);\n }\n }\n throw err;\n } finally {\n releaseLocalSlot?.();\n }\n }\n\n getModelForTier(tier: TierRole): ModelInfo | undefined {\n return this.tierModels.get(tier);\n }\n\n /** Reflection settings for workers (config.reflection). Off unless enabled. */\n getReflectionConfig(): { enabled: boolean; maxRounds: number } {\n const r = this.config?.reflection;\n return { enabled: r?.enabled === true, maxRounds: r?.maxRounds ?? 1 };\n }\n\n /** T3→T2 reinforcement settings (config.reinforcements). Off unless enabled. */\n getReinforcementsConfig(): { enabled: boolean; maxPerSection: number } {\n const r = this.config?.reinforcements;\n return { enabled: r?.enabled === true, maxPerSection: r?.maxPerSection ?? 4 };\n }\n\n /**\n * Resolved T3 wave execution mode. 'auto' becomes 'sequential' when the T3\n * tier resolves to a LOCAL model (the single-GPU queue serializes anyway, so\n * running them in parallel just thrashes it), and 'parallel' for cloud.\n */\n getT3ExecutionMode(): 'parallel' | 'sequential' {\n const mode = this.config?.t3Execution ?? 'auto';\n if (mode === 'parallel' || mode === 'sequential') return mode;\n return this.tierModels.get('T3')?.isLocal ? 'sequential' : 'parallel';\n }\n\n /**\n * Cascade Auto: temporarily override the model for a tier.\n * Used by TaskAnalyzer to inject task-optimal models before execution.\n * The override is valid for the current task only — restored by restoreTierModels().\n */\n overrideTierModel(tier: TierRole, model: ModelInfo): void {\n // Snapshot the configured/default tier models once so they can be restored\n // after the run — Cascade Auto's per-task picks must not leak across runs.\n if (!this.originalTierModels) {\n this.originalTierModels = new Map(this.tierModels);\n }\n this.tierModels.set(tier, model);\n this.ensureProvider(model, this.config.providers);\n }\n\n /**\n * Restore tier models to the configured/default baseline captured before the\n * first Cascade Auto override. Called at the end of each run so `/why`, the\n * status bar, and the next run reflect the configured models, not stale picks.\n */\n restoreTierModels(): void {\n if (this.originalTierModels) {\n this.tierModels = new Map(this.originalTierModels);\n this.originalTierModels = undefined;\n }\n }\n\n /** Set (or clear) the current run's abort signal for instant cancellation. */\n setRunSignal(signal: AbortSignal | undefined): void {\n this.runSignal = signal;\n }\n\n getSelector(): import('./selector.js').ModelSelector {\n return this.selector;\n }\n\n /** Wire the Cascade Auto task analyzer used for per-subtask model routing. */\n setTaskAnalyzer(analyzer: TaskAnalyzer): void {\n this.taskAnalyzer = analyzer;\n }\n\n /**\n * Cascade Auto per-subtask routing: pick the benchmark-best model for a\n * specific subtask's text, scoped to the tier's eligible candidates. Returns\n * null when Cascade Auto is off (callers then use the shared tier model).\n * Pure heuristic — no extra LLM call.\n */\n async selectModelForSubtask(tier: TierRole, text: string): Promise<ModelInfo | null> {\n if (!this.config?.cascadeAuto || !this.taskAnalyzer || !text.trim()) return null;\n try {\n return await this.taskAnalyzer.selectModel(text, tier, this.selector);\n } catch {\n return null;\n }\n }\n\n getStats(): RouterStats {\n // Deep-copy the nested Record maps so callers cannot mutate internal state.\n return {\n totalTokens: this.stats.totalTokens,\n totalCostUsd: this.stats.totalCostUsd,\n callsByProvider: { ...this.stats.callsByProvider },\n callsByTier: { ...this.stats.callsByTier },\n costByTier: { ...this.stats.costByTier },\n tokensByTier: { ...this.stats.tokensByTier },\n inputTokensByTier: { ...this.stats.inputTokensByTier },\n outputTokensByTier: { ...this.stats.outputTokensByTier },\n };\n }\n\n /**\n * What did delegation save? Compares actual spend against the\n * counterfactual of every call running on the T1 model. This is the\n * number only a tiered hierarchy can show.\n */\n getDelegationSavings(): DelegationSavings {\n return computeDelegationSavings(this.stats, this.tierModels.get('T1'));\n }\n\n /**\n * Returns a human-readable cost summary broken down by tier.\n * Example: { T1: \"$0.0120 (2 calls, 1500 tokens)\", T2: \"$0.0043 (6 calls, 4200 tokens)\", ... }\n */\n getTierCostSummary(): Record<string, string> {\n const summary: Record<string, string> = {};\n for (const tier of Object.keys(this.stats.callsByTier)) {\n const cost = (this.stats.costByTier[tier] ?? 0).toFixed(6);\n const calls = this.stats.callsByTier[tier] ?? 0;\n const tokens = this.stats.tokensByTier[tier] ?? 0;\n summary[tier] = `$${cost} (${calls} call${calls !== 1 ? 's' : ''}, ${tokens.toLocaleString()} tokens)`;\n }\n return summary;\n }\n\n /**\n * Returns the percentage of total cost attributed to each tier.\n * Useful for identifying which tier is the dominant cost driver.\n */\n getTierCostPercentages(): Record<string, number> {\n const total = this.stats.totalCostUsd;\n if (total === 0) return {};\n const pcts: Record<string, number> = {};\n for (const [tier, cost] of Object.entries(this.stats.costByTier)) {\n pcts[tier] = Math.round((cost / total) * 1000) / 10; // e.g. 42.5\n }\n return pcts;\n }\n\n /**\n * Resets all stats — useful between independent task runs in long-lived sessions.\n */\n resetStats(): void {\n this.stats = {\n totalTokens: 0,\n totalCostUsd: 0,\n callsByProvider: {},\n callsByTier: {},\n costByTier: {},\n tokensByTier: {},\n inputTokensByTier: {},\n outputTokensByTier: {},\n };\n this.sessionCostUsd = 0;\n this.budgetState = 'ok';\n this.budgetExceededReason = undefined;\n }\n\n getFailures(): Record<string, string> {\n return this.failover.getFailureReport();\n }\n\n /**\n * Returns the current session budget cap (USD), or undefined if no cap is set.\n */\n getSessionBudget(): number | undefined {\n return this.config?.budget?.sessionBudgetUsd;\n }\n\n /**\n * Sets (or clears) a runtime session budget cap (USD).\n * Pass null to remove the cap.\n */\n /** Raise/set the per-task token cap at runtime (used by /continue resume). */\n setMaxTokensPerRun(maxTokens: number): void {\n if (!this.config) return;\n this.config = { ...this.config, budget: { ...this.config.budget, maxTokensPerRun: maxTokens } };\n }\n\n setSessionBudget(usd: number | null): void {\n if (!this.config) return;\n if (!this.config.budget) {\n this.config = { ...this.config, budget: { sessionBudgetUsd: usd ?? undefined, warnAtPct: 80 } };\n } else {\n this.config = {\n ...this.config,\n budget: { ...this.config.budget, sessionBudgetUsd: usd ?? undefined },\n };\n }\n }\n\n /**\n * Returns how much of the session budget has been used (USD).\n */\n getSessionSpend(): number {\n return this.sessionCostUsd;\n }\n\n /**\n * Returns the resolved ModelInfo for a given tier, or null if no model\n * is available (e.g. the required provider is not configured).\n */\n getTierModel(tier: TierRole): ModelInfo | null {\n return this.tierModels.get(tier) ?? null;\n }\n\n /**\n * Returns all models available for the given provider type.\n * Useful for listing configured/usable models per provider.\n */\n getModelsForProvider(provider: ProviderType): ModelInfo[] {\n return this.selector.getAvailableModelsForProvider(provider);\n }\n\n // ── Private ──────────────────────────────────\n\n private async detectAvailableProviders(\n configs: ProviderConfig[],\n ): Promise<Set<ProviderType>> {\n const available = new Set<ProviderType>();\n\n const checks = configs.map(async (cfg) => {\n try {\n const testModel = this.getAnyModelForProvider(cfg.type);\n if (!testModel) return;\n const provider = this.createProvider(cfg, testModel);\n const ok = await provider.isAvailable();\n if (ok) available.add(cfg.type);\n } catch { /* provider not available */ }\n });\n\n await Promise.allSettled(checks);\n return available;\n }\n\n private async discoverOllamaModels(cfg?: ProviderConfig): Promise<void> {\n try {\n const anyOllamaModel = MODELS['llama3.2:3b']!;\n const provider = new OllamaProvider(\n cfg ?? { type: 'ollama', baseUrl: OLLAMA_BASE_URL },\n anyOllamaModel,\n );\n const models = await provider.listModels();\n for (const m of models) {\n this.selector.addDynamicModel(m);\n }\n } catch { /* Ollama not running */ }\n }\n\n private ensureProvider(model: ModelInfo, configs: ProviderConfig[]): void {\n const key = `${model.provider}:${model.id}`;\n if (this.providers.has(key)) return;\n\n const cfg = configs.find((c) => c.type === model.provider)\n ?? { type: model.provider };\n\n const provider = this.createProvider(cfg, model);\n this.providers.set(key, provider);\n }\n\n private getProvider(model: ModelInfo): BaseProvider | undefined {\n return this.providers.get(`${model.provider}:${model.id}`);\n }\n\n private createProvider(cfg: ProviderConfig, model: ModelInfo): BaseProvider {\n switch (cfg.type) {\n case 'anthropic': return new AnthropicProvider(cfg, model);\n case 'openai': return new OpenAIProvider(cfg, model);\n case 'gemini': return new GeminiProvider(cfg, model);\n case 'azure': return new AzureOpenAIProvider(cfg, model);\n case 'ollama': return new OllamaProvider(cfg, model);\n case 'openai-compatible': return new OpenAICompatibleProvider(cfg, model);\n default:\n throw new Error(`Unsupported provider type: ${String(cfg.type)}`);\n }\n }\n\n private getAnyModelForProvider(type: ProviderType): ModelInfo | undefined {\n return Object.values(MODELS).find((m) => m.provider === type);\n }\n\n private recordStats(tier: TierRole, model: ModelInfo, usage: TokenUsage): void {\n this.stats.totalTokens += usage.totalTokens;\n this.stats.totalCostUsd += usage.estimatedCostUsd;\n this.sessionCostUsd += usage.estimatedCostUsd;\n this.stats.callsByProvider[model.provider] = (this.stats.callsByProvider[model.provider] ?? 0) + 1;\n this.stats.callsByTier[tier] = (this.stats.callsByTier[tier] ?? 0) + 1;\n\n // ── Per-tier cost & token breakdown ──────────\n this.stats.costByTier[tier] = (this.stats.costByTier[tier] ?? 0) + usage.estimatedCostUsd;\n this.stats.tokensByTier[tier] = (this.stats.tokensByTier[tier] ?? 0) + usage.totalTokens;\n this.stats.inputTokensByTier[tier] = (this.stats.inputTokensByTier[tier] ?? 0) + usage.inputTokens;\n this.stats.outputTokensByTier[tier] = (this.stats.outputTokensByTier[tier] ?? 0) + usage.outputTokens;\n\n // ── Per-run accounting (hard per-task ceiling) ──\n this.runTokens += usage.totalTokens;\n this.runCostUsd += usage.estimatedCostUsd;\n\n // ── Budget enforcement & warning (atomic state transitions) ─\n this.updateBudgetState();\n this.enforceRunBudget();\n }\n\n /**\n * Resets per-run accounting at the start of each `cascade run`. Session\n * totals and a session-wide budget halt are deliberately preserved; only the\n * per-task ceiling is cleared so the next task starts with a fresh allowance.\n */\n beginRun(): void {\n this.runTokens = 0;\n this.runCostUsd = 0;\n this.runBudgetExceeded = false;\n this.runBudgetExceededReason = undefined;\n }\n\n /**\n * Enforce the hard per-task ceiling. Once tripped, the flag makes every\n * subsequent (and concurrent) generate() call in this run fail fast.\n */\n private enforceRunBudget(): void {\n if (this.runBudgetExceeded) return;\n const budget = this.config?.budget;\n const maxTokens = budget?.maxTokensPerRun;\n const maxCost = budget?.maxCostPerRunUsd;\n const overTokens = maxTokens != null && this.runTokens >= maxTokens;\n const overCost = maxCost != null && this.runCostUsd >= maxCost;\n if (!overTokens && !overCost) return;\n\n const reason = overTokens\n ? `Per-task token cap of ${maxTokens!.toLocaleString()} reached (used ${this.runTokens.toLocaleString()}). Stopping this run to avoid runaway cost — raise budget.maxTokensPerRun for larger jobs.`\n : `Per-task cost cap of $${maxCost!.toFixed(4)} reached (spent $${this.runCostUsd.toFixed(4)}). Stopping this run to avoid runaway cost.`;\n this.runBudgetExceeded = true;\n this.runBudgetExceededReason = reason;\n this.emit('budget:exceeded', { reason, spentUsd: this.sessionCostUsd });\n throw new CascadeRouter.BudgetExceededError(reason);\n }\n\n /**\n * Single point of truth for budget state transitions. Called after each\n * recordStats() so warning and hard-stop transitions are evaluated\n * exactly once — previous logic allowed concurrent generate() calls to\n * both fire the warning or both miss the hard stop.\n */\n private updateBudgetState(): void {\n const budget = this.config?.budget;\n const cap = budget?.sessionBudgetUsd;\n if (!cap) return;\n const spendPct = (this.sessionCostUsd / cap) * 100;\n const warnAt = budget.warnAtPct ?? 80;\n\n if (this.budgetState === 'ok' && spendPct >= warnAt) {\n this.budgetState = 'warned';\n this.emit('budget:warning', {\n spentUsd: this.sessionCostUsd,\n capUsd: cap,\n spendPct: Math.round(spendPct * 10) / 10,\n warnAtPct: warnAt,\n remainingUsd: Math.max(0, cap - this.sessionCostUsd),\n });\n }\n\n if (this.budgetState !== 'exceeded' && this.sessionCostUsd >= cap) {\n const reason = `Session budget of $${cap.toFixed(4)} exceeded (spent $${this.sessionCostUsd.toFixed(4)}).`;\n this.halt(reason);\n // Throw on the current call so the caller also unwinds.\n throw new CascadeRouter.BudgetExceededError(reason);\n }\n }\n\n /**\n * Flip the router to \"exceeded\" state. Subsequent `generate()` calls will\n * throw BudgetExceededError immediately, and a `budget:exceeded` event is\n * broadcast once so listeners (REPL, dashboard, SDK) can cancel any\n * pending approvals and unwind the run.\n */\n halt(reason: string): void {\n if (this.budgetState === 'exceeded') return;\n this.budgetState = 'exceeded';\n this.budgetExceededReason = reason;\n this.emit('budget:exceeded', { reason, spentUsd: this.sessionCostUsd });\n }\n\n /** Returns current budget state — useful for tests and dashboard. */\n getBudgetState(): 'ok' | 'warned' | 'exceeded' {\n return this.budgetState;\n }\n\n private isRateLimitError(msg: string): boolean {\n return /rate.?limit|429|too.?many.?requests|quota/i.test(msg);\n }\n}\n\n/**\n * Detects \"this model id doesn't exist / isn't usable\" errors so a stale\n * catalog entry self-heals instead of hard-failing. Covers the Gemini\n * \"is not found … NOT_FOUND … is not supported for generateContent\" shape\n * plus the OpenAI/Anthropic equivalents. Exported for unit testing.\n */\nexport function isModelNotFoundError(msg: string): boolean {\n return /not[_\\s]?found|404|does not exist|no such model|unknown model|invalid model|model_not_found|not supported for generatecontent|is not supported for/i.test(msg);\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Abstract Tier Base\n// ─────────────────────────────────────────────\n\nimport EventEmitter from 'node:events';\nimport { randomUUID } from 'node:crypto';\nimport type {\n CascadeMessage,\n StatusUpdate,\n TierRole,\n TierStatus,\n} from '../../types.js';\nimport { CascadeCancelledError } from '../../utils/retry.js';\n\nexport abstract class BaseTier extends EventEmitter {\n readonly id: string;\n readonly role: TierRole;\n protected status: TierStatus = 'IDLE';\n protected parentId?: string;\n protected taskId: string = '';\n protected label: string;\n protected systemPromptOverride: string = '';\n protected hierarchyContext: string = '';\n /** Propagated AbortSignal — set by the tier's `execute()` before work begins. */\n protected signal?: AbortSignal;\n\n constructor(role: TierRole, id?: string, parentId?: string) {\n super();\n this.role = role;\n this.id = id ?? `${role}_${randomUUID().slice(0, 8)}`;\n this.parentId = parentId;\n this.label = this.id;\n }\n\n getStatus(): TierStatus {\n return this.status;\n }\n\n protected setStatus(status: TierStatus, output?: string): void {\n this.status = status;\n const timestamp = new Date().toISOString();\n const event = {\n tierId: this.id,\n role: this.role,\n parentId: this.parentId,\n label: this.label,\n status,\n timestamp,\n output,\n };\n this.emit('status', event);\n this.emit('tier:status', event);\n }\n\n protected setLabel(label: string): void {\n this.label = label;\n }\n\n setSystemPromptOverride(prompt: string): void {\n this.systemPromptOverride = prompt;\n }\n\n setHierarchyContext(context: string): void {\n this.hierarchyContext = context;\n }\n\n protected sendStatusUpdate(update: StatusUpdate): void {\n const timestamp = new Date().toISOString();\n const message = this.buildMessage('STATUS_UPDATE', this.parentId ?? 'T1', update as unknown as Record<string, unknown>);\n this.emit('message', message);\n this.emit('tier:status', {\n tierId: this.id,\n role: this.role,\n parentId: this.parentId,\n label: this.label,\n status: this.status,\n currentAction: update.currentAction,\n progressPct: update.progressPct,\n timestamp,\n output: update.output,\n });\n }\n\n protected buildMessage(\n type: CascadeMessage['type'],\n to: string,\n payload: Record<string, unknown>,\n ): CascadeMessage {\n return {\n version: '1.0',\n from: this.id,\n to,\n type,\n taskId: this.taskId,\n timestamp: new Date().toISOString(),\n payload: payload as unknown as CascadeMessage['payload'],\n };\n }\n\n protected log(message: string, data?: unknown): void {\n this.emit('log', { tierId: this.id, role: this.role, message, data, timestamp: new Date().toISOString() });\n }\n\n /**\n * Throws `CascadeCancelledError` if the run's `AbortSignal` has fired.\n * Call this at safe checkpoints (before LLM calls, between T3 dispatches)\n * to provide a fast, clean cancellation path.\n */\n protected throwIfCancelled(): void {\n if (this.signal?.aborted) {\n throw new CascadeCancelledError(\n typeof this.signal.reason === 'string'\n ? this.signal.reason\n : 'Run cancelled by caller',\n );\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Context Window Manager\n// ─────────────────────────────────────────────\n\nimport type { ConversationMessage, TokenUsage } from '../../types.js';\nimport { DEFAULT_AUTO_SUMMARIZE_AT, DEFAULT_CONTEXT_LIMIT } from '../../constants.js';\n\nexport class ContextManager {\n private messages: ConversationMessage[] = [];\n private tokenCount = 0;\n private readonly limit: number;\n private readonly summarizeAt: number;\n private onSummarizeNeeded?: (messages: ConversationMessage[]) => Promise<string>;\n\n constructor(\n limit = DEFAULT_CONTEXT_LIMIT,\n summarizeAt = DEFAULT_AUTO_SUMMARIZE_AT,\n ) {\n this.limit = limit;\n this.summarizeAt = summarizeAt;\n }\n\n setOnSummarizeNeeded(fn: (messages: ConversationMessage[]) => Promise<string>): void {\n this.onSummarizeNeeded = fn;\n }\n\n async addMessage(message: ConversationMessage, estimatedTokens = 0): Promise<void> {\n this.messages.push(message);\n this.tokenCount += estimatedTokens;\n\n if (this.tokenCount >= this.summarizeAt && this.onSummarizeNeeded) {\n await this.summarize();\n }\n }\n\n getMessages(): ConversationMessage[] {\n return [...this.messages];\n }\n\n getTokenCount(): number {\n return this.tokenCount;\n }\n\n isNearLimit(): boolean {\n return this.tokenCount >= this.summarizeAt;\n }\n\n isAtLimit(): boolean {\n return this.tokenCount >= this.limit;\n }\n\n getUsagePercent(): number {\n return Math.min(100, (this.tokenCount / this.limit) * 100);\n }\n\n pruneToFit(maxTokens: number): ConversationMessage[] {\n const result: ConversationMessage[] = [];\n let count = 0;\n // Always keep system messages + last N messages\n const system = this.messages.filter((m) => m.role === 'system');\n const nonSystem = this.messages.filter((m) => m.role !== 'system');\n\n for (const m of system) result.push(m);\n\n // Add from end going backwards\n const recent: ConversationMessage[] = [];\n for (let i = nonSystem.length - 1; i >= 0; i--) {\n const est = this.estimateTokens(nonSystem[i]!);\n if (count + est > maxTokens) break;\n recent.unshift(nonSystem[i]!);\n count += est;\n }\n result.push(...recent);\n return result;\n }\n\n updateTokenCount(usage: TokenUsage): void {\n this.tokenCount = usage.totalTokens;\n }\n\n clear(): void {\n this.messages = [];\n this.tokenCount = 0;\n }\n\n /**\n * Returns a human-readable summary of the current context state.\n * Useful for debugging and status-bar display.\n */\n getContextSummary(): {\n messageCount: number;\n tokenCount: number;\n usagePercent: number;\n isNearLimit: boolean;\n isAtLimit: boolean;\n } {\n return {\n messageCount: this.messages.length,\n tokenCount: this.tokenCount,\n usagePercent: this.getUsagePercent(),\n isNearLimit: this.isNearLimit(),\n isAtLimit: this.isAtLimit(),\n };\n }\n\n private async summarize(): Promise<void> {\n if (!this.onSummarizeNeeded) return;\n\n const toSummarize = this.messages.filter((m) => m.role !== 'system');\n if (toSummarize.length < 4) return;\n\n const summary = await this.onSummarizeNeeded(toSummarize);\n\n const systemMessages = this.messages.filter((m) => m.role === 'system');\n const recent = toSummarize.slice(-4);\n\n this.messages = [\n ...systemMessages,\n { role: 'user', content: `[Previous conversation summary]\\n${summary}` },\n { role: 'assistant', content: 'Understood. Continuing from the summary above.' },\n ...recent,\n ];\n\n this.tokenCount = Math.floor(this.tokenCount * 0.3);\n }\n\n private estimateTokens(message: ConversationMessage): number {\n let charCount = 0;\n\n if (typeof message.content === 'string') {\n charCount = message.content.length;\n } else {\n for (const block of message.content) {\n if (block.type === 'text') {\n charCount += block.text.length;\n } else if (block.type === 'image') {\n // Images consume significant tokens; use a conservative flat estimate\n // (~85 tokens/image thumbnail tile as a lower-bound proxy)\n charCount += 340; // ≈ 85 tokens × 4 chars/token equivalent\n } else if (block.type === 'tool_result') {\n charCount += block.content.length;\n }\n }\n }\n\n // Role + structural overhead (~4 tokens per message)\n const overhead = 16;\n return Math.ceil(charCount / 4) + overhead;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Audit Logger (Enhanced)\n// ─────────────────────────────────────────────\n\nimport { randomUUID } from 'node:crypto';\nimport type { AuditEntry } from '../types.js';\nimport type { MemoryStore } from '../memory/store.js';\n\n/** Structured log levels for audit entries */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\n/** Extended audit entry with log level */\nexport interface AuditEntryWithLevel extends AuditEntry {\n level: LogLevel;\n}\n\nexport class AuditLogger {\n private store: MemoryStore;\n private sessionId: string;\n private minLevel: LogLevel;\n\n constructor(store: MemoryStore, sessionId: string, minLevel: LogLevel = 'info') {\n this.store = store;\n this.sessionId = sessionId;\n this.minLevel = minLevel;\n }\n\n // ── Level-aware logging ──────────────────────\n\n debug(tierId: string, action: AuditEntry['action'], details: Record<string, unknown>): void {\n this.logAt('debug', tierId, action, details);\n }\n\n info(tierId: string, action: AuditEntry['action'], details: Record<string, unknown>): void {\n this.logAt('info', tierId, action, details);\n }\n\n warn(tierId: string, action: AuditEntry['action'], details: Record<string, unknown>): void {\n this.logAt('warn', tierId, action, details);\n }\n\n error(tierId: string, err: Error | unknown, context: Record<string, unknown> = {}): void {\n const e = err instanceof Error ? err : new Error(String(err));\n this.logAt('error', tierId, 'error', {\n message: e.message,\n name: e.name,\n stack: e.stack?.slice(0, 500),\n ...context,\n });\n }\n\n /** Backward-compatible generic log (defaults to info level) */\n log(\n tierId: string,\n action: AuditEntry['action'],\n details: Record<string, unknown>,\n ): void {\n this.logAt('info', tierId, action, details);\n }\n\n // ── Domain helpers ─────────────────────────\n\n toolCall(tierId: string, toolName: string, input: Record<string, unknown>): void {\n this.info(tierId, 'tool_call', { toolName, input });\n }\n\n fileChange(tierId: string, filePath: string, operation: string): void {\n this.info(tierId, 'file_change', { filePath, operation });\n }\n\n agentDecision(tierId: string, decision: string, reasoning?: string): void {\n this.info(tierId, 'agent_decision', { decision, reasoning });\n }\n\n approval(tierId: string, toolName: string, approved: boolean, decidedBy?: string): void {\n this.info(tierId, 'approval', { toolName, approved, decidedBy });\n }\n\n escalation(tierId: string, blocker: string, needs: string): void {\n this.warn(tierId, 'escalation', { blocker, needs });\n }\n\n getLog(limit?: number): AuditEntry[] {\n return this.store.getAuditLog(this.sessionId, limit);\n }\n\n // ── Structured JSON output ─────────────────\n\n /**\n * Formats an audit entry as a single-line JSON string (e.g. for log aggregation).\n */\n formatStructured(entry: AuditEntryWithLevel): string {\n return JSON.stringify({\n ts: entry.timestamp,\n level: entry.level,\n sessionId: entry.sessionId,\n tierId: entry.tierId,\n action: entry.action,\n ...entry.details,\n });\n }\n\n // ── Internal ───────────────────────────────\n\n private logAt(\n level: LogLevel,\n tierId: string,\n action: AuditEntry['action'],\n details: Record<string, unknown>,\n ): void {\n if (!this.shouldLog(level)) return;\n\n const entry: AuditEntry = {\n id: randomUUID(),\n sessionId: this.sessionId,\n timestamp: new Date().toISOString(),\n tierId,\n action,\n details: { level, ...details },\n };\n this.store.addAuditEntry(entry);\n }\n\n private shouldLog(level: LogLevel): boolean {\n const order: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n return order.indexOf(level) >= order.indexOf(this.minLevel);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Text Tool Call Parser\n// ─────────────────────────────────────────────\n//\n// Parses ReAct-style tool invocations from LLM text output.\n// Used when the model does not support native tool-use (e.g. many Ollama\n// models). Deliberately tolerant: weaker models rarely emit the exact format,\n// so we accept <tool_call> blocks, fenced JSON, OpenAI-style {function:{…}}\n// echoes, and bare {name, input|arguments} objects anywhere in the text.\n//\n// Format we teach:\n// <tool_call>\n// {\"name\": \"shell\", \"input\": {\"command\": \"ls -la\"}}\n// </tool_call>\n//\n\nimport type { ToolCall } from '../types.js';\n\nconst TOOL_CALL_RE = /<tool_call>\\s*([\\s\\S]*?)\\s*<\\/tool_call>/g;\n// Fenced code blocks: ```json / ```tool_call / ``` … ``` containing a call object\nconst JSON_BLOCK_RE = /```(?:json|tool_call|tool)?\\s*([\\s\\S]*?)```/g;\n\nexport interface ParsedTextToolCall {\n name: string;\n input: Record<string, unknown>;\n}\n\n/**\n * Extract tool calls from a text response. Tries progressively looser\n * strategies, stopping at the first that yields results:\n * 1. <tool_call>…</tool_call> blocks (the taught format)\n * 2. ```json|tool_call``` fenced blocks\n * 3. bare {name, input|arguments} (or {function:{…}}) objects anywhere in text\n */\nexport function parseTextToolCalls(text: string): ParsedTextToolCall[] {\n const xml = collect(text, TOOL_CALL_RE);\n if (xml.length > 0) return xml;\n\n const fenced = collect(text, JSON_BLOCK_RE);\n if (fenced.length > 0) return fenced;\n\n return tryBareObjects(text);\n}\n\n/** Run a capturing regex over the text and coerce each captured group into a call. */\nfunction collect(text: string, re: RegExp): ParsedTextToolCall[] {\n const results: ParsedTextToolCall[] = [];\n let match: RegExpExecArray | null;\n re.lastIndex = 0;\n while ((match = re.exec(text)) !== null) {\n const body = (match[1] ?? '').trim();\n const parsed = parseJsonLoose(body);\n const call = coerceCall(parsed);\n if (call) results.push(call);\n }\n return results;\n}\n\n/**\n * Scan the text for balanced {…} objects that look like a tool call and parse\n * them. Brace matching is string-aware so quoted braces don't confuse depth.\n */\nfunction tryBareObjects(text: string): ParsedTextToolCall[] {\n const results: ParsedTextToolCall[] = [];\n for (let i = 0; i < text.length; i++) {\n if (text[i] !== '{') continue;\n let depth = 0;\n let inStr = false;\n let esc = false;\n let end = -1;\n for (let j = i; j < text.length; j++) {\n const c = text[j]!;\n if (esc) { esc = false; continue; }\n if (c === '\\\\') { esc = true; continue; }\n if (c === '\"') { inStr = !inStr; continue; }\n if (inStr) continue;\n if (c === '{') depth++;\n else if (c === '}') { depth--; if (depth === 0) { end = j; break; } }\n }\n if (end === -1) break;\n const candidate = text.slice(i, end + 1);\n // Accept both double- and single-quoted keys; parseJsonLoose normalises the\n // latter before parsing.\n if (/['\"]name['\"]\\s*:/.test(candidate) && /['\"](?:input|arguments)['\"]\\s*:/.test(candidate)) {\n const call = coerceCall(parseJsonLoose(candidate));\n if (call) results.push(call);\n }\n i = end;\n }\n return results;\n}\n\n/** Parse JSON, retrying once with single-quotes normalised to double-quotes. */\nfunction parseJsonLoose(raw: string): unknown {\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n // Some models emit single-quoted JSON; normalise quotes that aren't already\n // inside a double-quoted string and retry. Best-effort only.\n try {\n return JSON.parse(raw.replace(/'/g, '\"'));\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Normalise the many shapes weak models emit into {name, input}:\n * {name, input} {name, arguments} {function:{name, arguments}}\n * `arguments` may itself be a JSON string.\n */\nfunction coerceCall(raw: unknown): ParsedTextToolCall | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n const fn = obj.function && typeof obj.function === 'object'\n ? obj.function as Record<string, unknown>\n : null;\n\n const name = typeof obj.name === 'string'\n ? obj.name\n : fn && typeof fn.name === 'string' ? fn.name : null;\n if (!name) return null;\n\n const rawInput = obj.input ?? obj.arguments ?? (fn ? (fn.input ?? fn.arguments) : undefined);\n let input: Record<string, unknown> = {};\n if (rawInput && typeof rawInput === 'object') {\n input = rawInput as Record<string, unknown>;\n } else if (typeof rawInput === 'string') {\n const parsed = parseJsonLoose(rawInput);\n if (parsed && typeof parsed === 'object') input = parsed as Record<string, unknown>;\n }\n return { name, input };\n}\n\n/**\n * Convert a ParsedTextToolCall to a ToolCall with a generated id.\n */\nexport function toToolCall(parsed: ParsedTextToolCall, index: number): ToolCall {\n return {\n id: `text-tool-${Date.now()}-${index}`,\n name: parsed.name,\n input: parsed.input,\n };\n}\n\ninterface SchemaProp {\n type?: unknown;\n description?: unknown;\n enum?: unknown;\n}\n\n/**\n * Build the system-prompt appendix that teaches a non-tool-capable model how to\n * invoke tools via text. Unlike the previous version this carries the FULL\n * parameter contract — types, required-ness, and enum values — so the model\n * emits valid arguments instead of guessing from a description alone.\n */\nexport function buildTextToolSystemPrompt(\n tools: Array<{ name: string; description: string; inputSchema?: Record<string, unknown> }>,\n): string {\n const toolDefs = tools.map(t => {\n const schema = (t.inputSchema ?? {}) as { properties?: unknown; required?: unknown };\n const props = (schema.properties && typeof schema.properties === 'object'\n ? schema.properties as Record<string, SchemaProp>\n : {});\n const required = Array.isArray(schema.required) ? schema.required as string[] : [];\n const paramLines = Object.entries(props).map(([k, v]) => {\n const type = typeof v.type === 'string' ? v.type : 'any';\n const desc = typeof v.description === 'string' ? v.description : k;\n const req = required.includes(k) ? ' [required]' : '';\n const enumVals = Array.isArray(v.enum)\n ? ` (one of: ${(v.enum as unknown[]).map(e => JSON.stringify(e)).join(', ')})`\n : '';\n return ` - ${k} (${type})${req}: ${desc}${enumVals}`;\n });\n return `• ${t.name} — ${t.description}${paramLines.length ? '\\n' + paramLines.join('\\n') : '\\n (no parameters)'}`;\n }).join('\\n');\n\n return `\nTOOL USE INSTRUCTIONS:\nYou do not have native tool-use capability. To call a tool, output a single <tool_call> block containing JSON with the tool name and its input arguments:\n\n<tool_call>\n{\"name\": \"<tool_name>\", \"input\": { ...arguments... }}\n</tool_call>\n\nRules:\n- Use exactly the parameter names shown below and include every [required] parameter.\n- For parameters that list \"one of\", use one of those values verbatim.\n- Emit valid JSON with double quotes. Call only ONE tool at a time, then wait for the result.\n\nAvailable tools:\n${toolDefs}\n\nEXAMPLE — calling the \"shell\" tool to list files:\n<tool_call>\n{\"name\": \"shell\", \"input\": {\"command\": \"ls -la\"}}\n</tool_call>\n\nWhen you have enough information, stop calling tools and write your final answer.`;\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — T3 Worker\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n ConversationMessage,\n GenerateOptions,\n ModelInfo,\n PermissionRequest,\n T2ToT3Assignment,\n T3Result,\n ToolCall,\n ToolDefinition,\n} from '../../types.js';\nimport type { CascadeRouter } from '../router/index.js';\nimport type { ToolRegistry } from '../../tools/registry.js';\nimport { BaseTier } from './base.js';\nimport { ContextManager } from '../context/manager.js';\nimport { AuditLogger } from '../../audit/log.js';\nimport { MemoryStore } from '../../memory/store.js';\nimport type { PeerBus } from '../peer/bus.js';\nimport type { PermissionEscalator } from '../permissions/escalator.js';\nimport type { ToolCreator, GeneratedToolSpec } from '../../tools/tool-creator.js';\nimport {\n parseTextToolCalls,\n toToolCall,\n buildTextToolSystemPrompt,\n} from '../../tools/text-tool-parser.js';\n\n/**\n * Thrown by executeTool() when the underlying tool error indicates an\n * unrecoverable condition (rate limit, auth failure, forbidden) — the\n * agent loop should NOT keep retrying and the worker should escalate\n * fast with the real reason intact.\n */\nexport class CriticalToolError extends Error {\n constructor(message: string, public readonly toolName: string) {\n super(message);\n this.name = 'CriticalToolError';\n }\n}\n\n/**\n * Thrown by runAgentLoop() when the worker is stuck producing an artifact\n * that verifyArtifacts() rejects on consecutive iterations. Carries any\n * partial output the worker had built so the caller can surface it\n * instead of just the bare error string.\n */\nexport class WorkerStallError extends Error {\n constructor(message: string, public readonly partialOutput: string) {\n super(message);\n this.name = 'WorkerStallError';\n }\n}\n\nconst T3_SYSTEM_PROMPT = `You are a T3 Worker agent in the Cascade AI system. Your job is to execute a specific subtask completely and accurately.\n\nRules:\n- Execute the subtask completely — do not stop partway through.\n- Use tools when needed. Ask for approval only when the tool registry requires it.\n- If the task asks for a file or artifact, you must actually create it in the workspace, verify that it exists, and inspect it before claiming success.\n- Use the \"web_search\" tool to find current information, documentation, news, or general web data.\n- Use the \"pdf_create\" tool for PDF requests.\n- Use the \"run_code\" tool for any file types (Excel, Zip, csv, etc.) or complex processing not covered by other tools. Always cleanup after code execution.\n- If you are not making meaningful progress, stop and escalate rather than looping or padding the response.\n- Use the \"peer_message\" tool to communicate with other T3 workers if your tasks have dependencies or shared state. You can send updates or wait for signals.\n- Return structured output that directly addresses the expected output specification.`;\n\nexport class T3Worker extends BaseTier {\n private router: CascadeRouter;\n private toolRegistry: ToolRegistry;\n private context: ContextManager;\n private assignment?: T2ToT3Assignment;\n private peerSyncBuffer: Array<{ fromId: string; content: unknown; timestamp: string }> = [];\n private store?: MemoryStore;\n private audit?: AuditLogger;\n private tools: ToolDefinition[] = [];\n /** 0 = top-level worker (may request reinforcements); 1 = a spawned reinforcement (may not). */\n private reinforcementDepth = 0;\n /** Sibling-worker requests this worker made via request_workers (T3→T2). */\n private pendingReinforcements: T2ToT3Assignment[] = [];\n /** @deprecated — kept only as fallback when no escalator is attached */\n private sessionApprovals: Map<string, boolean> = new Map();\n private peerBus?: PeerBus;\n private permissionEscalator?: PermissionEscalator;\n private toolCreator?: ToolCreator;\n\n setPeerBus(bus: PeerBus): void {\n this.peerBus = bus;\n this.peerBus.register(this.id);\n\n // Listen for targeted messages from peers\n this.peerBus.on(`message:${this.id}`, (msg) => {\n this.log(`Peer message from ${msg.fromId}: ${msg.type}`);\n this.receivePeerSync(msg.fromId, msg.payload);\n });\n\n // A peer created a runtime tool — register it locally and refresh our tool\n // list so we can use it without regenerating the same capability.\n this.peerBus.on('broadcast', (msg) => {\n const payload = msg?.payload as { type?: string; spec?: GeneratedToolSpec } | undefined;\n if (payload?.type === 'TOOL_CREATED' && payload.spec && this.toolCreator) {\n this.toolCreator.registerSpec(payload.spec);\n this.tools = this.toolRegistry.getToolDefinitions();\n this.log(`Registered peer tool \"${payload.spec.name}\" from broadcast.`);\n }\n });\n }\n\n setPermissionEscalator(escalator: PermissionEscalator): void {\n this.permissionEscalator = escalator;\n }\n\n /** Marks this worker as a spawned reinforcement (depth 1 — cannot request more). */\n markAsReinforcement(): void {\n this.reinforcementDepth = 1;\n }\n\n setToolCreator(creator: ToolCreator): void {\n this.toolCreator = creator;\n }\n\n constructor(router: CascadeRouter, toolRegistry: ToolRegistry, parentId: string) {\n super('T3', undefined, parentId);\n this.router = router;\n this.toolRegistry = toolRegistry;\n this.context = new ContextManager();\n }\n\n setStore(store: MemoryStore, sessionId: string): void {\n this.store = store;\n this.audit = new AuditLogger(store, sessionId);\n }\n\n async execute(assignment: T2ToT3Assignment, taskId: string, signal?: AbortSignal): Promise<T3Result> {\n this.signal = signal;\n this.assignment = assignment;\n this.taskId = taskId;\n this.setLabel(assignment.subtaskTitle);\n this.setStatus('ACTIVE');\n\n this.tools = this.toolRegistry.getToolDefinitions();\n // T3→T2 reinforcement: surface request_workers to top-level workers only, when enabled.\n if (this.reinforcementDepth === 0 && this.router.getReinforcementsConfig?.()?.enabled) {\n this.tools = [...this.tools, {\n name: 'request_workers',\n description: 'Ask your manager to spawn additional sibling workers for sub-problems you discover are too large or parallelizable to finish alone. Use sparingly — only when the work genuinely needs to fan out.',\n inputSchema: {\n type: 'object',\n properties: {\n subtasks: {\n type: 'array',\n description: 'New sibling subtasks for your manager to spawn.',\n items: {\n type: 'object',\n properties: {\n title: { type: 'string' },\n description: { type: 'string' },\n expectedOutput: { type: 'string' },\n },\n required: ['title', 'description'],\n },\n },\n },\n required: ['subtasks'],\n },\n }];\n }\n\n // ── Step 0: Wait for dependencies ──────────\n if (assignment.dependsOn?.length && this.peerBus) {\n this.sendStatusUpdate({\n progressPct: 0,\n currentAction: `Waiting for dependencies: ${assignment.dependsOn.join(', ')}`,\n status: 'IN_PROGRESS',\n });\n\n const depOutputs: string[] = [];\n for (const depId of assignment.dependsOn) {\n try {\n const dep = await this.peerBus.waitFor(depId);\n if (dep.status === 'FAILED' || dep.status === 'ESCALATED') {\n return this.buildResult(\n 'ESCALATED',\n `Dependency ${depId} failed — cannot proceed`,\n { checksRun: [], passed: [], failed: [] },\n [`Blocked by failed dependency: ${depId}`],\n 0,\n );\n }\n depOutputs.push(`[From ${dep.fromId} - ${dep.subtaskId}]:\\n${dep.output}`);\n } catch (err) {\n return this.buildResult(\n 'ESCALATED',\n `Dependency timeout: ${depId}`,\n { checksRun: [], passed: [], failed: [] },\n [err instanceof Error ? err.message : String(err)],\n 0,\n );\n }\n }\n\n // Inject dependency outputs into context\n if (depOutputs.length) {\n await this.context.addMessage({\n role: 'user',\n content: `Context from completed dependencies:\\n\\n${depOutputs.join('\\n\\n')}\\n\\nNow execute your subtask using this context where relevant.`,\n });\n }\n }\n\n this.sendStatusUpdate({\n progressPct: 5,\n currentAction: `Starting subtask: ${assignment.subtaskTitle}`,\n status: 'IN_PROGRESS',\n });\n\n this.log(`T3 executing subtask: ${assignment.subtaskTitle}`);\n\n // ── Step 0.5: T3 File-Intent Coordination ──\n // Announce files this subtask plans to write so siblings can avoid conflicts.\n if (this.peerBus && this.peerBus.getMembers().length > 1) {\n await this.coordinateFileIntents(assignment);\n }\n\n const systemPrompt = this.buildSystemPrompt(assignment);\n\n await this.context.addMessage({\n role: 'user',\n content: this.buildInitialPrompt(assignment),\n });\n\n let output = '';\n let toolCalls: ToolCall[] = [];\n let correctionAttempts = 0;\n const checksRun: string[] = [];\n const passed: string[] = [];\n const failed: string[] = [];\n const issues: string[] = [];\n\n try {\n const result = await this.runAgentLoop(systemPrompt, this.tools);\n output = result.output;\n toolCalls = result.toolCalls;\n\n this.sendStatusUpdate({ progressPct: 65, currentAction: 'Verifying required artifacts', status: 'IN_PROGRESS' });\n\n const artifactCheck = await this.verifyArtifacts(assignment);\n if (!artifactCheck.ok) {\n correctionAttempts = 1;\n issues.push(...artifactCheck.issues);\n output = await this.correctOutput(output, artifactCheck.issues);\n const retryArtifactCheck = await this.verifyArtifacts(assignment);\n if (!retryArtifactCheck.ok) {\n issues.push(...retryArtifactCheck.issues);\n this.setStatus('FAILED');\n // ── Publish failure to peers ──\n this.peerBus?.publish(this.id, assignment.subtaskId, output, 'ESCALATED');\n return this.buildResult('ESCALATED', output, { checksRun, passed, failed }, issues, correctionAttempts);\n }\n }\n\n this.sendStatusUpdate({ progressPct: 70, currentAction: 'Self-testing output', status: 'IN_PROGRESS' });\n\n const testResult = await this.selfTest(assignment, output);\n checksRun.push(...testResult.checksRun);\n passed.push(...testResult.passed);\n failed.push(...testResult.failed);\n\n if (testResult.failed.length > 0) {\n correctionAttempts = 1;\n issues.push(`Initial check failed: ${testResult.failed.join(', ')}`);\n const corrected = await this.correctOutput(output, testResult.failed);\n output = corrected;\n const retest = await this.selfTest(assignment, output);\n passed.push(...retest.passed);\n if (retest.failed.length > 0) {\n failed.push(...retest.failed);\n this.setStatus('FAILED');\n this.peerBus?.publish(this.id, assignment.subtaskId, output, 'ESCALATED');\n return this.buildResult('ESCALATED', output, { checksRun, passed, failed }, issues, correctionAttempts);\n }\n }\n\n // ── Reflection / self-critique (goal-alignment, opt-in) ──\n // The self-test above only checks the subtask spec. When enabled, reflect\n // on whether the output truly serves the goal and revise once if it falls\n // short — distinct from, and on top of, the pass/fail self-test.\n const reflectCfg = this.router.getReflectionConfig?.() ?? { enabled: false, maxRounds: 1 };\n if (reflectCfg.enabled) {\n this.sendStatusUpdate({ progressPct: 85, currentAction: 'Reflecting on output', status: 'IN_PROGRESS' });\n output = await this.reflectAndImprove(assignment, output, reflectCfg.maxRounds);\n }\n\n this.setStatus('COMPLETED', output);\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Subtask complete', status: 'IN_PROGRESS', output });\n\n // ── Publish success to peers ─────────────\n this.peerBus?.publish(this.id, assignment.subtaskId, output, 'COMPLETED');\n\n return this.buildResult('COMPLETED', output, { checksRun, passed, failed }, issues, correctionAttempts);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n // Preserve partial output when the worker stalled mid-generation, and\n // mark critical/unrecoverable errors so T2/T1 can surface them clearly\n // instead of being swallowed under a generic \"Execution error\" prefix.\n if (err instanceof WorkerStallError) {\n issues.push(`Stalled: ${errMsg}`);\n const finalOutput = err.partialOutput || output || errMsg;\n this.setStatus('FAILED', finalOutput);\n this.peerBus?.publish(this.id, assignment.subtaskId, finalOutput, 'FAILED');\n return this.buildResult('ESCALATED', finalOutput, { checksRun, passed, failed }, issues, correctionAttempts);\n }\n if (err instanceof CriticalToolError) {\n issues.push(`[CRITICAL_TOOL_ERROR] ${err.toolName}: ${errMsg}`);\n const finalOutput = output || `Tool \"${err.toolName}\" failed unrecoverably: ${errMsg}`;\n this.setStatus('FAILED', finalOutput);\n this.peerBus?.publish(this.id, assignment.subtaskId, finalOutput, 'FAILED');\n return this.buildResult('ESCALATED', finalOutput, { checksRun, passed, failed }, issues, correctionAttempts);\n }\n issues.push(`Execution error: ${errMsg}`);\n const finalOutput = output || errMsg;\n this.setStatus('FAILED', finalOutput);\n this.peerBus?.publish(this.id, assignment.subtaskId, finalOutput, 'FAILED');\n return this.buildResult('ESCALATED', finalOutput, { checksRun, passed, failed }, issues, correctionAttempts);\n }\n }\n\n sendToPeer(toId: string, content: unknown): void {\n this.peerBus?.send(this.id, toId, 'SHARE_OUTPUT', this.assignment?.subtaskId ?? '', content);\n }\n\n async requestFromPeer(peerId: string, subtaskId: string): Promise<string> {\n if (!this.peerBus) throw new Error('No PeerBus attached');\n const output = await this.peerBus.waitFor(subtaskId);\n return output.output;\n }\n\n async syncWithPeers(barrierName: string): Promise<void> {\n if (!this.peerBus) return;\n const total = this.peerBus.getMembers().length;\n await this.peerBus.barrier(this.id, barrierName, total);\n }\n\n receivePeerSync(fromId: string, content: unknown): void {\n this.peerSyncBuffer.push({ fromId, content, timestamp: new Date().toISOString() });\n this.emit('peer-sync-received', { fromId, content });\n \n // Notify the agent proactively so it doesn't have to guess when to poll\n this.context.addMessage({\n role: 'user',\n content: `[SYSTEM_NOTIFICATION]: You received a new peer message from ${fromId}. Use the \"peer_message\" tool with action=\"receive\" to read it.`\n }).catch(() => {});\n }\n\n // ── Private ──────────────────────────────────\n\n private async runAgentLoop(\n systemPrompt: string,\n tools: ToolDefinition[],\n ): Promise<{ output: string; toolCalls: ToolCall[] }> {\n const allToolCalls: ToolCall[] = [];\n let iterations = 0;\n let stalledArtifactIterations = 0;\n const MAX_ITERATIONS = 15;\n const requiresArtifact = this.requiresArtifact();\n // `tools` is reassigned when a dynamic tool is created — must be a let\n tools = [...tools];\n\n // Cascade Auto: route this specific subtask to the benchmark-best model for\n // its type (coding → Claude, writing → GPT/Gemini, …). Returns null when\n // Cascade Auto is off, in which case the shared tier model is used.\n let subtaskModel: ModelInfo | undefined;\n try {\n const subtaskText = `${this.assignment?.subtaskTitle ?? ''} ${this.assignment?.description ?? ''} ${this.assignment?.expectedOutput ?? ''}`;\n subtaskModel = (await this.router.selectModelForSubtask('T3', subtaskText)) ?? undefined;\n if (subtaskModel) {\n this.log(`Cascade Auto: routing this subtask to ${subtaskModel.provider}:${subtaskModel.id}`);\n }\n } catch { /* fall back to the tier model */ }\n\n // Detect tool-use mode against the EFFECTIVE model (per-subtask override if\n // any, else the tier default).\n const effectiveModel = subtaskModel ?? this.router.getModelForTier('T3');\n const useTextTools = effectiveModel?.supportsToolUse === false && tools.length > 0;\n const textToolSuffix = useTextTools ? buildTextToolSystemPrompt(tools) : '';\n\n while (iterations < MAX_ITERATIONS) {\n iterations++;\n\n // ── Cancellation checkpoint (before every LLM call) ──────────────\n this.throwIfCancelled();\n\n const options: GenerateOptions = {\n messages: this.context.getMessages(),\n systemPrompt: this.systemPromptOverride + systemPrompt\n + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : '')\n + textToolSuffix,\n // Don't pass tools array when model can't use them natively\n tools: useTextTools ? undefined : (tools.length ? tools : undefined),\n maxTokens: 4096,\n ...(subtaskModel ? { model: subtaskModel } : {}),\n };\n\n const result = await this.router.generate(\n 'T3',\n options,\n (chunk) => {\n this.emit('stream:token', { tierId: this.id, text: chunk.text });\n },\n );\n\n // For text-tool mode: parse <tool_call> blocks and inject as native tool calls\n let effectiveToolCalls = result.toolCalls ?? [];\n if (useTextTools && effectiveToolCalls.length === 0) {\n const textCalls = parseTextToolCalls(result.content);\n effectiveToolCalls = textCalls.map((tc, i) => toToolCall(tc, i));\n }\n const effectiveResult = { ...result, toolCalls: effectiveToolCalls };\n\n await this.context.addMessage({ role: 'assistant', content: result.content, toolCalls: effectiveToolCalls });\n\n if (!effectiveResult.toolCalls?.length) {\n if (requiresArtifact) {\n const artifactCheck = await this.verifyArtifacts(this.assignment!);\n if (artifactCheck.ok) {\n return { output: result.content, toolCalls: allToolCalls };\n }\n\n stalledArtifactIterations += 1;\n if (stalledArtifactIterations >= 2) {\n const partial = result.content || '';\n if (stalledArtifactIterations === 2) {\n throw new WorkerStallError(\n `Worker stalled waiting for artifact creation. Requesting dynamic tool generation from T2 Manager for: ${this.assignment?.subtaskTitle ?? 'unknown task'}`,\n partial,\n );\n }\n throw new WorkerStallError(\n 'Artifact-producing task stalled without creating or verifying the required files',\n partial,\n );\n }\n await this.context.addMessage({\n role: 'user',\n content: `You have not yet created and verified the required artifact. Issues: ${artifactCheck.issues.join('; ')}. Use tools to create the file in the workspace, verify it exists, and inspect the result before concluding.`,\n });\n continue;\n }\n return { output: result.content, toolCalls: allToolCalls };\n }\n\n stalledArtifactIterations = 0;\n\n if (effectiveResult.finishReason === 'stop' && effectiveResult.toolCalls.length === 0) {\n if (requiresArtifact) {\n const artifactCheck = await this.verifyArtifacts(this.assignment!);\n if (artifactCheck.ok) {\n return { output: result.content, toolCalls: allToolCalls };\n }\n } else {\n return { output: result.content, toolCalls: allToolCalls };\n }\n }\n\n for (const tc of effectiveResult.toolCalls) {\n allToolCalls.push(tc);\n const toolResult = await this.executeTool(tc);\n await this.context.addMessage({\n role: 'tool',\n content: toolResult,\n toolCallId: tc.id,\n });\n }\n }\n\n const lastMsg = this.context.getMessages().slice().reverse().find((m) => m.role === 'assistant');\n return {\n output: typeof lastMsg?.content === 'string' ? lastMsg.content : '',\n toolCalls: allToolCalls,\n };\n }\n\n /**\n * Lightweight argument check against the tool's JSON Schema: required fields\n * present and enum values in range. Not a full validator — just the two\n * failure modes weak models hit most. Returns an error message, or null if OK.\n */\n private validateToolInput(tc: ToolCall): string | null {\n const def = this.tools.find(t => t.name === tc.name);\n const schema = def?.inputSchema as {\n properties?: Record<string, { enum?: unknown[] }>;\n required?: string[];\n } | undefined;\n if (!schema) return null;\n\n const required = Array.isArray(schema.required) ? schema.required : [];\n const missing = required.filter(k => tc.input[k] === undefined || tc.input[k] === null || tc.input[k] === '');\n if (missing.length) {\n return `Tool error: missing required parameter(s) for \"${tc.name}\": ${missing.join(', ')}. Expected: ${JSON.stringify(schema)}. Supply them and call the tool again.`;\n }\n\n if (schema.properties) {\n for (const [k, prop] of Object.entries(schema.properties)) {\n const allowed = Array.isArray(prop?.enum) ? prop.enum : null;\n if (allowed && tc.input[k] !== undefined && !allowed.includes(tc.input[k])) {\n return `Tool error: invalid value for \"${k}\" in \"${tc.name}\": ${JSON.stringify(tc.input[k])}. Must be one of ${JSON.stringify(allowed)}.`;\n }\n }\n }\n return null;\n }\n\n private async executeTool(tc: ToolCall): Promise<string> {\n // T3→T2 reinforcement: handle locally (record the request for the manager) —\n // it is a signal, not a real side-effecting tool, so it skips registry\n // validation and approval.\n if (tc.name === 'request_workers') {\n const msg = this.recordReinforcements(tc.input);\n this.emit('tool:result', { id: tc.id, tierId: this.id, toolName: tc.name, output: msg, durationMs: 0 });\n return msg;\n }\n\n // Reject malformed calls early (before any approval prompt) with a clear,\n // self-correcting message — weaker models often omit required parameters or\n // pass an out-of-range enum value, which otherwise fails opaquely at run time.\n const validationError = this.validateToolInput(tc);\n if (validationError) {\n this.emit('tool:result', { id: tc.id, tierId: this.id, toolName: tc.name, error: validationError, durationMs: 0 });\n return validationError;\n }\n\n const needsApproval = this.toolRegistry.requiresApproval(tc.name);\n\n if (needsApproval) {\n // ── Hierarchical permission escalation: T3 → T2 → T1 → User ──\n if (this.permissionEscalator) {\n const req: PermissionRequest = {\n id: `${this.id}-${tc.id}`,\n requestedBy: this.id,\n parentT2Id: this.parentId ?? 'root',\n toolName: tc.name,\n input: tc.input,\n isDangerous: this.toolRegistry.isDangerous(tc.name),\n subtaskContext: this.assignment?.subtaskTitle ?? 'Unknown subtask',\n sectionContext: this.assignment?.subtaskTitle ?? 'Unknown section',\n };\n const decision = await this.permissionEscalator.requestPermission(req);\n if (!decision.approved) return `Tool ${tc.name} was denied (decided by ${decision.decidedBy}).`;\n } else {\n // ── Fallback: legacy direct approval event (used when escalator not wired) ──\n if (this.sessionApprovals.has(tc.name)) {\n const wasApproved = this.sessionApprovals.get(tc.name)!;\n if (!wasApproved) return `Tool ${tc.name} was denied by user.`;\n } else {\n // Time-box this fallback too (default 10 min → deny) so a missing or\n // unanswered approval prompt can't hang the worker indefinitely.\n const LEGACY_APPROVAL_TIMEOUT_MS = 600_000;\n const legacyDecision = await new Promise<{ approved: boolean; always?: boolean }>((resolve) => {\n const eventName = `tool:approval-response:${this.id}-${tc.id}`;\n const timer = setTimeout(() => {\n this.removeAllListeners(eventName);\n resolve({ approved: false });\n }, LEGACY_APPROVAL_TIMEOUT_MS);\n timer.unref?.();\n this.emit('tool:approval-request', {\n id: `${this.id}-${tc.id}`,\n tierId: this.id,\n toolName: tc.name,\n input: tc.input,\n description: `T3 (${this.assignment?.subtaskTitle}) wants to run \"${tc.name}\"`,\n isDangerous: this.toolRegistry.isDangerous(tc.name),\n });\n this.once(eventName, (d: { approved: boolean; always?: boolean }) => {\n clearTimeout(timer);\n resolve(d);\n });\n });\n if (legacyDecision.always) this.sessionApprovals.set(tc.name, legacyDecision.approved);\n if (!legacyDecision.approved) return `Tool ${tc.name} was denied by user.`;\n }\n }\n }\n\n // Emit tool:use before execution so the TUI can display the active tool\n this.sendStatusUpdate({\n progressPct: 50,\n currentAction: `Using tool: ${tc.name}`,\n status: 'IN_PROGRESS',\n });\n\n this.emit('tool:call', { id: tc.id, tierId: this.id, toolName: tc.name, input: tc.input });\n const toolStartMs = Date.now();\n\n try {\n const result = await this.toolRegistry.execute(tc.name, tc.input, {\n tierId: this.id,\n sessionId: this.taskId,\n requireApproval: false,\n saveSnapshot: async (path, content) => {\n this.store?.addFileSnapshot(this.taskId, path, content);\n },\n sendPeerSync: (to, syncType, content) => {\n this.peerBus?.send(this.id, to, syncType, this.assignment?.subtaskId ?? '', content);\n },\n getPeerMessages: () => {\n const msgs = [...this.peerSyncBuffer];\n this.peerSyncBuffer = [];\n return msgs;\n },\n });\n if (this.audit) {\n this.audit.toolCall(this.id, tc.name, tc.input);\n if (this.isFileOperation(tc.name)) {\n this.audit.fileChange(this.id, (tc.input['path'] as string | undefined) ?? 'unknown', tc.name);\n }\n }\n const durationMs = Date.now() - toolStartMs;\n this.emit('tool:result', { id: tc.id, tierId: this.id, toolName: tc.name, output: typeof result === 'string' ? result : JSON.stringify(result), durationMs });\n return typeof result === 'string' ? result : JSON.stringify(result);\n } catch (err) {\n const durationMs = Date.now() - toolStartMs;\n const errMsg = err instanceof Error ? err.message : String(err);\n this.emit('tool:result', { id: tc.id, tierId: this.id, toolName: tc.name, error: errMsg, durationMs });\n // Unrecoverable conditions (rate-limit, auth, forbidden) — throw a\n // CriticalToolError so the agent loop stops retrying and the worker\n // escalates fast with the real reason intact (used to loop 15× then\n // emit a generic failure).\n if (/\\b(429|rate.?limit|authentication|api.?key|forbidden|401|403)\\b/i.test(errMsg)) {\n throw new CriticalToolError(errMsg, tc.name);\n }\n // Try to recover via a sibling tool or a synthesized one before giving up;\n // returns the original error string if no fallback succeeds.\n return await this.adaptiveFallback(tc, `Tool error: ${errMsg}`);\n }\n }\n\n /**\n * Adaptive fallback cascade — invoked when executeTool() fails.\n * Strategy order:\n * 1. Find a semantically similar registered tool and retry with same input\n * 2. Synthesize a new tool via ToolCreator (if available) and run it\n * 3. Return the original error so the agent loop can decide what to do next\n */\n private async adaptiveFallback(tc: ToolCall, originalError: string): Promise<string> {\n // Strategy 1: alternative tool with overlapping purpose\n const altTool = this.findAlternativeTool(tc.name);\n if (altTool) {\n this.log(`Adaptive fallback: trying alternative tool \"${altTool}\" for failed \"${tc.name}\"`);\n this.sendStatusUpdate({ progressPct: 50, currentAction: `Fallback: trying ${altTool}`, status: 'IN_PROGRESS' });\n try {\n const result = await this.toolRegistry.execute(altTool, tc.input, {\n tierId: this.id,\n sessionId: this.taskId,\n requireApproval: false,\n });\n const str = typeof result === 'string' ? result : JSON.stringify(result);\n if (!str.startsWith('Tool error:') && !str.startsWith('Error:')) {\n return `[Fallback via ${altTool}]: ${str}`;\n }\n } catch { /* fall through to next strategy */ }\n }\n\n // Strategy 2: synthesize a new tool via ToolCreator\n if (this.toolCreator) {\n this.log(`Adaptive fallback: requesting dynamic tool synthesis for \"${tc.name}\"`);\n this.sendStatusUpdate({ progressPct: 55, currentAction: `Synthesizing fallback tool for: ${tc.name}`, status: 'IN_PROGRESS' });\n try {\n const newToolName = await this.toolCreator.createTool(\n `Replacement for \"${tc.name}\" — original failed with: ${originalError.slice(0, 150)}`,\n this.assignment?.subtaskTitle ?? tc.name,\n );\n if (newToolName) {\n this.log(`Adaptive fallback: synthesized \"${newToolName}\", retrying`);\n const result = await this.toolRegistry.execute(newToolName, tc.input, {\n tierId: this.id,\n sessionId: this.taskId,\n requireApproval: false,\n });\n const str = typeof result === 'string' ? result : JSON.stringify(result);\n if (!str.startsWith('Tool error:')) return `[Synthesized ${newToolName}]: ${str}`;\n }\n } catch { /* fall through */ }\n }\n\n return originalError;\n }\n\n /**\n * Find a registered tool whose name/description semantically overlaps with\n * the failing tool. Returns the best candidate name, or null if none found.\n */\n private findAlternativeTool(failedToolName: string): string | null {\n const failedKeywords = failedToolName.toLowerCase().split(/[_\\-\\s]+/);\n const allTools = this.toolRegistry.getToolDefinitions();\n let bestScore = 0;\n let bestName: string | null = null;\n\n for (const tool of allTools) {\n if (tool.name === failedToolName) continue;\n const toolWords = tool.name.toLowerCase().split(/[_\\-\\s]+/);\n const score = failedKeywords.filter(k => toolWords.includes(k)).length;\n if (score > bestScore && score >= 1) {\n bestScore = score;\n bestName = tool.name;\n }\n }\n return bestName;\n }\n\n /**\n * Announce which files this T3 plans to edit, then acquire locks on them\n * before competing siblings can claim them. T3s working on different files\n * proceed in full parallel; T3s on the same file serialize automatically.\n */\n private async coordinateFileIntents(assignment: T2ToT3Assignment): Promise<void> {\n if (!this.peerBus) return;\n // Only coordinate locks for tasks that will actually WRITE files. A read or\n // analyze task that merely mentions a filename in prose (e.g. \"is the README\n // a novel idea?\") must not lock it — locking phantom or read-only paths\n // previously caused waits that could stall the whole run for minutes.\n const haystack = `${assignment.description}\\n${assignment.expectedOutput}`;\n if (!/\\b(create|write|save|generate|produce|output|edit|update|modify|append|overwrite|rewrite)\\b/i.test(haystack)) {\n return;\n }\n const plannedFiles = this.extractArtifactPaths(assignment);\n if (!plannedFiles.length) return;\n\n // Broadcast intent so siblings are aware\n this.peerBus.broadcast(this.id, {\n type: 'FILE_INTENT',\n subtaskId: assignment.subtaskId,\n files: plannedFiles,\n });\n\n // Give siblings 500ms to announce their intents\n await new Promise(r => setTimeout(r, 500));\n\n // Acquire locks on all planned files (deterministic order to avoid deadlock).\n // Lock coordination is best-effort and time-boxed: a stuck or never-released\n // lock must never hang the actual work, so any wait failure falls through to\n // proceeding without the lock.\n const sortedFiles = [...plannedFiles].sort();\n for (const filePath of sortedFiles) {\n try {\n if (this.peerBus.isFileLocked(filePath)) {\n this.log(`[T3] Waiting for file lock: ${filePath}`);\n this.sendStatusUpdate({\n progressPct: 5,\n currentAction: `Waiting for peer to finish editing: ${filePath}`,\n status: 'IN_PROGRESS',\n });\n await this.peerBus.waitForFileRelease(filePath, 10_000).catch(() => { /* proceed unlocked */ });\n }\n await this.peerBus.lockFile(this.id, filePath, 10_000).catch(() => { /* proceed unlocked */ });\n } catch (err) {\n this.log(`[T3] Lock coordination skipped for ${filePath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Register cleanup: release all locks when this worker finishes\n const origPublish = this.peerBus.publish.bind(this.peerBus);\n const bus = this.peerBus;\n const workerId = this.id;\n const cleanup = () => {\n for (const f of sortedFiles) bus.releaseFile(workerId, f);\n };\n this.once('completed', cleanup);\n this.once('failed', cleanup);\n this.peerBus.publish = (fromId, subtaskId, output, status) => {\n if (fromId === this.id) cleanup();\n // Restore original after first call for this worker\n this.peerBus!.publish = origPublish;\n origPublish(fromId, subtaskId, output, status);\n };\n }\n\n private requiresArtifact(): boolean {\n const haystack = `${this.assignment?.description ?? ''}\n${this.assignment?.expectedOutput ?? ''}`;\n return /\\b[\\w./-]+\\.(pdf|md|html|txt|json|csv|py|js|ts|tsx|jsx|docx?|png|jpg|jpeg|svg|gif)\\b/i.test(haystack)\n || /save (?:a|the)? file|create (?:a|the)? file|write (?:a|the)? file/i.test(haystack);\n }\n\n private extractArtifactPaths(assignment: T2ToT3Assignment): string[] {\n const haystack = `${assignment.description}\n${assignment.expectedOutput}`;\n const matches = haystack.match(/\\b[\\w./-]+\\.(pdf|md|html|txt|json|csv|py|js|ts|tsx|jsx|docx?|png|jpg|jpeg|svg|gif)\\b/gi) ?? [];\n return [...new Set(matches.map((m) => m.trim()))];\n }\n\n private async verifyArtifacts(assignment: T2ToT3Assignment): Promise<{ ok: boolean; issues: string[] }> {\n const artifactPaths = this.extractArtifactPaths(assignment);\n if (!artifactPaths.length) return { ok: true, issues: [] };\n\n const issues: string[] = [];\n const { exec } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(exec);\n\n for (const artifactPath of artifactPaths) {\n const absolutePath = path.resolve(process.cwd(), artifactPath);\n try {\n const stat = await fs.stat(absolutePath);\n if (!stat.isFile()) {\n issues.push(`Expected artifact is not a file: ${artifactPath}`);\n continue;\n }\n if (stat.size <= 0) {\n issues.push(`Artifact is empty: ${artifactPath}`);\n continue;\n }\n\n if (!/\\.pdf$/i.test(artifactPath)) {\n const content = await fs.readFile(absolutePath, 'utf-8');\n if (!content.trim()) {\n issues.push(`Artifact content is empty: ${artifactPath}`);\n continue;\n }\n } else if (stat.size < 100) {\n issues.push(`PDF artifact looks too small to be valid: ${artifactPath}`);\n continue;\n }\n\n // Semantic checks\n const ext = path.extname(absolutePath).toLowerCase();\n try {\n if (ext === '.ts' || ext === '.tsx') {\n await execAsync(`npx tsc --noEmit ${absolutePath}`, { timeout: 10000 });\n } else if (ext === '.js' || ext === '.jsx') {\n await execAsync(`node --check ${absolutePath}`, { timeout: 10000 });\n } else if (ext === '.py') {\n await execAsync(`python -m py_compile ${absolutePath}`, { timeout: 10000 });\n }\n } catch (err: any) {\n const stderr = err?.stderr || String(err);\n const stdout = err?.stdout || '';\n issues.push(`Semantic error in ${artifactPath}:\\n${stderr}\\n${stdout}`);\n }\n } catch {\n issues.push(`Required artifact was not created: ${artifactPath}`);\n }\n }\n\n return { ok: issues.length === 0, issues };\n }\n\n /**\n * Reflection / self-critique: critique the output against the broader GOAL\n * (not just the subtask spec the self-test checks) and revise once if it falls\n * short. Two cheap calls per round — a JSON verdict, then a rewrite only if\n * needed. Best-effort: any parse/error just keeps the current output.\n */\n private async reflectAndImprove(\n assignment: T2ToT3Assignment,\n output: string,\n maxRounds: number,\n ): Promise<string> {\n const sys = this.systemPromptOverride + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : '');\n let current = output;\n for (let round = 0; round < Math.max(1, maxRounds); round++) {\n try {\n const verdict = await this.router.generate('T3', {\n messages: [{\n role: 'user',\n content: `Does this output FULLY achieve the goal — not just the literal task, but the intent behind it?\n\nGoal / expected: ${assignment.expectedOutput}\nSubtask: ${assignment.description}\n\nOutput:\n${current}\n\nReply with ONLY JSON: {\"sufficient\": true|false, \"notes\": \"what is weak or missing if not sufficient\"}`,\n }],\n systemPrompt: sys,\n maxTokens: 400,\n });\n const parsed = JSON.parse(/\\{[\\s\\S]*\\}/.exec(verdict.content)?.[0] ?? '{}') as { sufficient?: boolean; notes?: string };\n if (parsed.sufficient !== false) break; // sufficient (or unclear) → stop\n\n const improved = await this.router.generate('T3', {\n messages: [{\n role: 'user',\n content: `Improve the following so it fully achieves the goal. Address specifically: ${parsed.notes ?? 'gaps vs the goal'}.\nOutput ONLY the improved result — no preamble, no commentary.\n\nGoal / expected: ${assignment.expectedOutput}\n\nCurrent output:\n${current}`,\n }],\n systemPrompt: sys,\n maxTokens: 4096,\n });\n const next = (improved.content ?? '').trim();\n if (!next) break;\n current = next;\n this.log('Reflection: revised output for better goal alignment.');\n } catch {\n break; // reflection is advisory — never fail the worker on it\n }\n }\n return current;\n }\n\n private async selfTest(\n assignment: T2ToT3Assignment,\n output: string,\n ): Promise<{ checksRun: string[]; passed: string[]; failed: string[] }> {\n const prompt = `Self-test this output against the assignment requirements.\n\nAssignment: ${assignment.description}\nExpected output: ${assignment.expectedOutput}\nConstraints: ${assignment.constraints.join('; ')}\n\nOutput to test:\n${output}\n\nReply with JSON: { \"completeness\": \"pass\"|\"fail\", \"correctness\": \"pass\"|\"fail\", \"compliance\": \"pass\"|\"fail\", \"notes\": \"string\" }`;\n\n const testMessages: ConversationMessage[] = [{ role: 'user', content: prompt }];\n const testResult = await this.router.generate('T3', { \n messages: testMessages, \n maxTokens: 500,\n systemPrompt: this.systemPromptOverride + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : ''),\n });\n\n try {\n const jsonMatch = /\\{[\\s\\S]*\\}/.exec(testResult.content);\n if (!jsonMatch) throw new Error('No JSON in test result');\n const parsed = JSON.parse(jsonMatch[0]) as {\n completeness: string;\n correctness: string;\n compliance: string;\n notes: string;\n };\n\n const checksRun = ['completeness', 'correctness', 'compliance'];\n const passed = checksRun.filter((c) => parsed[c as keyof typeof parsed] === 'pass');\n const failed = checksRun.filter((c) => parsed[c as keyof typeof parsed] === 'fail');\n\n return { checksRun, passed, failed };\n } catch {\n return {\n checksRun: ['completeness', 'correctness', 'compliance'],\n passed: ['completeness', 'correctness', 'compliance'],\n failed: [],\n };\n }\n }\n\n private async correctOutput(originalOutput: string, failures: string[]): Promise<string> {\n const correctionPrompt = `The following output failed these checks: ${failures.join(', ')}.\n\nOriginal output:\n${originalOutput}\n\nCorrect the issues and provide an improved version that addresses all failures.`;\n\n await this.context.addMessage({ role: 'user', content: correctionPrompt });\n\n const result = await this.runAgentLoop(\n \"You are in a correction phase. Fix the identified issues using your tools.\" + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : ''),\n this.tools\n );\n return result.output;\n }\n\n private buildSystemPrompt(assignment: T2ToT3Assignment): string {\n return `${T3_SYSTEM_PROMPT}\n\nYour subtask:\n- Title: ${assignment.subtaskTitle}\n- Description: ${assignment.description}\n- Expected output: ${assignment.expectedOutput}\n- Constraints: ${assignment.constraints.join('; ')}`;\n }\n\n private buildInitialPrompt(assignment: T2ToT3Assignment): string {\n return `Execute the following subtask completely:\n\n**${assignment.subtaskTitle}**\n\n${assignment.description}\n\nExpected output: ${assignment.expectedOutput}\n\nConstraints:\n${assignment.constraints.map((c) => `- ${c}`).join('\\n')}\n\nBegin execution now.`;\n }\n\n /**\n * Records a request_workers call (T3→T2 reinforcement). Capped at\n * maxPerSection; reinforcement workers (depth 1) cannot request more.\n */\n private recordReinforcements(input: Record<string, unknown>): string {\n if (this.reinforcementDepth !== 0) {\n return 'request_workers is unavailable to reinforcement workers — complete your assigned subtask.';\n }\n const max = this.router.getReinforcementsConfig?.()?.maxPerSection ?? 4;\n const raw = Array.isArray((input as { subtasks?: unknown }).subtasks)\n ? (input as { subtasks: unknown[] }).subtasks\n : [];\n let added = 0;\n for (const s of raw) {\n if (this.pendingReinforcements.length >= max) break;\n const o = s as { title?: unknown; description?: unknown; expectedOutput?: unknown };\n if (typeof o?.title !== 'string' || typeof o?.description !== 'string') continue;\n this.pendingReinforcements.push({\n subtaskId: `reinf-${this.id}-${this.pendingReinforcements.length + 1}`,\n subtaskTitle: o.title,\n description: o.description,\n expectedOutput: typeof o.expectedOutput === 'string' ? o.expectedOutput : o.title,\n constraints: [],\n peerT3Ids: [],\n parentT2: this.parentId ?? 'root',\n dependsOn: [],\n });\n added++;\n }\n return added > 0\n ? `Requested ${added} reinforcement worker(s) from your manager; they will run in parallel. Focus on your own part — do not redo their work.`\n : 'No valid reinforcement subtasks (each needs a title and description), or the per-section limit was reached.';\n }\n\n private buildResult(\n status: T3Result['status'],\n output: string,\n testResults: T3Result['testResults'],\n issues: string[],\n correctionAttempts: number,\n ): T3Result {\n return {\n subtaskId: this.assignment?.subtaskId ?? '',\n status,\n output,\n testResults,\n issues,\n peerSyncsUsed: this.peerSyncBuffer.map(m => m.fromId),\n correctionAttempts,\n reinforcements: this.pendingReinforcements.length ? this.pendingReinforcements : undefined,\n };\n }\n\n private isFileOperation(toolName: string): boolean {\n return ['file_write', 'file_edit', 'file_delete'].includes(toolName);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Peer-to-Peer Coordination Bus\n// ─────────────────────────────────────────────\n\nimport EventEmitter from 'node:events';\nimport type { PeerMessage, PeerMessageEvent, PeerSyncType } from '../../types.js';\n\ninterface PeerOutput {\n subtaskId: string;\n fromId: string;\n output: string;\n status: 'COMPLETED' | 'FAILED' | 'ESCALATED';\n timestamp: string;\n}\n\n/**\n * PeerBus enables T3↔T3 and T2↔T2 communication within a task.\n * Each T2Manager creates one PeerBus and shares it with its T3Workers.\n * T1 creates one PeerBus and shares it with its T2Managers.\n */\ninterface BroadcastMessage {\n fromId: string;\n payload: unknown;\n timestamp: string;\n}\n\ninterface FileLock {\n holderId: string;\n lockedAt: string;\n waiters: Array<() => void>;\n}\n\nexport class PeerBus extends EventEmitter {\n private outputs: Map<string, PeerOutput> = new Map();\n private waiters: Map<string, Array<(output: PeerOutput) => void>> = new Map();\n private members: Set<string> = new Set();\n private barriers: Map<string, { total: number; arrived: Set<string> }> = new Map();\n private broadcastLog: BroadcastMessage[] = [];\n private fileLocks: Map<string, FileLock> = new Map();\n /** subtaskIds whose T3 is being retried by T2 — dependents should re-wait rather than fail fast */\n private retryPending: Set<string> = new Set();\n\n /** Called when any peer message or broadcast is sent — used for dashboard visibility. */\n onPeerMessage?: (event: PeerMessageEvent) => void;\n sessionId = '';\n\n /** Surface coordination traffic (locks, barriers) to the visibility hook. */\n private emitCoordination(fromId: string, text: string): void {\n this.onPeerMessage?.({\n fromId,\n toId: undefined,\n syncType: 'COORDINATION',\n payload: text,\n timestamp: new Date().toISOString(),\n sessionId: this.sessionId,\n });\n }\n\n register(peerId: string): void {\n this.members.add(peerId);\n }\n\n /**\n * Publish output — unblocks any peers waiting on this subtaskId\n */\n publish(fromId: string, subtaskId: string, output: string, status: PeerOutput['status']): void {\n const entry: PeerOutput = {\n subtaskId,\n fromId,\n output,\n status,\n timestamp: new Date().toISOString(),\n };\n\n this.outputs.set(subtaskId, entry);\n this.emit('output:ready', entry);\n\n // Resolve waiters\n const waiting = this.waiters.get(subtaskId) ?? [];\n for (const resolve of waiting) resolve(entry);\n this.waiters.delete(subtaskId);\n }\n\n /**\n * Mark a subtask as retry-pending so dependents re-wait instead of failing fast\n * when they see an ESCALATED status.\n */\n markRetryPending(subtaskId: string): void {\n this.retryPending.add(subtaskId);\n // Remove the cached ESCALATED output so waitFor() blocks for the retry result\n this.outputs.delete(subtaskId);\n }\n\n /** Called by T2 after retry resolves (success or final failure). */\n clearRetryPending(subtaskId: string): void {\n this.retryPending.delete(subtaskId);\n }\n\n /** Remove a single output entry so a respawned worker can republish without clearing prior-wave outputs. */\n clearOutput(subtaskId: string): void {\n this.outputs.delete(subtaskId);\n this.waiters.delete(subtaskId);\n this.retryPending.delete(subtaskId);\n }\n\n isRetryPending(subtaskId: string): boolean {\n return this.retryPending.has(subtaskId);\n }\n\n /**\n * Wait for a specific subtask's output — resolves immediately if already available.\n * If the output is ESCALATED but a retry is pending, waits for the retry result.\n */\n waitFor(subtaskId: string, timeoutMs = 120_000): Promise<PeerOutput> {\n const existing = this.outputs.get(subtaskId);\n if (existing && !this.retryPending.has(subtaskId)) return Promise.resolve(existing);\n\n return new Promise((resolve, reject) => {\n const resolver = (output: PeerOutput) => {\n clearTimeout(timer);\n resolve(output);\n };\n\n const timer = setTimeout(() => {\n // Remove this specific resolver so publish() cannot call it after rejection\n const waiting = this.waiters.get(subtaskId);\n if (waiting) {\n const idx = waiting.indexOf(resolver);\n if (idx !== -1) waiting.splice(idx, 1);\n if (waiting.length === 0) this.waiters.delete(subtaskId);\n }\n reject(new Error(`Peer timeout waiting for subtask: ${subtaskId}`));\n }, timeoutMs);\n\n const resolvers = this.waiters.get(subtaskId) ?? [];\n resolvers.push(resolver);\n this.waiters.set(subtaskId, resolvers);\n });\n }\n\n /**\n * Get output if already available (non-blocking)\n */\n getOutput(subtaskId: string): PeerOutput | undefined {\n return this.outputs.get(subtaskId);\n }\n\n /**\n * Broadcast a message to all registered peers except sender.\n * Also logs to broadcastLog so collect() can retrieve recent broadcasts.\n */\n broadcast(fromId: string, payload: unknown): void {\n const timestamp = new Date().toISOString();\n const msg: PeerMessage = {\n fromId,\n toId: '*',\n type: 'SYNC_DATA',\n subtaskId: '',\n syncType: 'SHARE_OUTPUT',\n payload,\n timestamp,\n };\n this.broadcastLog.push({ fromId, payload, timestamp });\n this.emit('broadcast', msg);\n this.onPeerMessage?.({\n fromId,\n toId: undefined,\n syncType: 'SHARE_OUTPUT',\n payload: typeof payload === 'string' ? payload : JSON.stringify(payload),\n timestamp,\n sessionId: this.sessionId,\n });\n }\n\n /**\n * Collect all broadcast messages received within a time window.\n * Useful for T2 announcement gathering — call immediately after triggering broadcasts.\n */\n collect(timeoutMs: number): Promise<BroadcastMessage[]> {\n const collected: BroadcastMessage[] = [...this.broadcastLog];\n return new Promise(resolve => {\n const timer = setTimeout(() => {\n off();\n resolve(collected);\n }, timeoutMs);\n\n const handler = (msg: PeerMessage) => {\n collected.push({ fromId: msg.fromId, payload: msg.payload, timestamp: msg.timestamp });\n };\n this.on('broadcast', handler);\n\n const off = () => {\n clearTimeout(timer);\n this.off('broadcast', handler);\n };\n\n // Also resolve early if all members have broadcast\n const checkComplete = () => {\n const broadcasters = new Set(collected.map(m => m.fromId));\n if (broadcasters.size >= this.members.size) {\n off();\n resolve(collected);\n }\n };\n this.on('broadcast', checkComplete);\n });\n }\n\n /**\n * Acquire an exclusive file lock — prevents concurrent T3 writes to the same file.\n * If the file is already locked, waits until the lock is released.\n */\n async lockFile(tierId: string, filePath: string, timeoutMs = 30_000): Promise<void> {\n const existing = this.fileLocks.get(filePath);\n if (!existing) {\n this.fileLocks.set(filePath, { holderId: tierId, lockedAt: new Date().toISOString(), waiters: [] });\n this.emitCoordination(tierId, `🔒 locked ${filePath}`);\n return;\n }\n\n this.emitCoordination(tierId, `⏳ waiting for ${filePath} (held by ${existing.holderId})`);\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`File lock timeout for ${filePath} (held by ${existing.holderId})`));\n }, timeoutMs);\n\n existing.waiters.push(() => {\n clearTimeout(timer);\n // Re-acquire for this tier\n this.fileLocks.set(filePath, { holderId: tierId, lockedAt: new Date().toISOString(), waiters: [] });\n this.emitCoordination(tierId, `🔒 locked ${filePath}`);\n resolve();\n });\n });\n }\n\n /**\n * Release a file lock — unblocks the next waiter if any.\n */\n releaseFile(tierId: string, filePath: string): void {\n const lock = this.fileLocks.get(filePath);\n if (!lock || lock.holderId !== tierId) return;\n\n this.emitCoordination(tierId, `🔓 released ${filePath}`);\n const nextWaiter = lock.waiters.shift();\n if (nextWaiter) {\n nextWaiter();\n } else {\n this.fileLocks.delete(filePath);\n }\n this.emit(`file:released:${filePath}`, { tierId, filePath });\n }\n\n /**\n * Wait until a file lock is released (non-acquiring — just observes).\n * Used by T3s that want to read after another T3 finishes writing.\n */\n waitForFileRelease(filePath: string, timeoutMs = 30_000): Promise<void> {\n if (!this.fileLocks.has(filePath)) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(`Timeout waiting for file release: ${filePath}`)), timeoutMs);\n this.once(`file:released:${filePath}`, () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n /**\n * Check if a file is currently locked (non-blocking).\n */\n isFileLocked(filePath: string): boolean {\n return this.fileLocks.has(filePath);\n }\n\n /**\n * Reset all runtime output/waiter state for a fresh T3 respawn wave.\n * Preserves member registrations and barrier definitions.\n */\n reset(): void {\n this.outputs.clear();\n this.waiters.clear();\n this.retryPending.clear();\n this.broadcastLog = [];\n }\n\n /**\n * Clear broadcast log — call between phases to avoid stale announcements.\n */\n clearBroadcastLog(): void {\n this.broadcastLog = [];\n }\n\n /**\n * Send a targeted message to a specific peer\n */\n send(\n fromId: string,\n toId: string,\n syncType: PeerSyncType,\n subtaskId: string,\n payload: unknown,\n ): void {\n const timestamp = new Date().toISOString();\n const msg: PeerMessage = {\n fromId,\n toId,\n type: 'SYNC_DATA',\n subtaskId,\n syncType,\n payload,\n timestamp,\n };\n this.emit(`message:${toId}`, msg);\n this.emit('message', msg);\n this.onPeerMessage?.({\n fromId,\n toId,\n syncType: syncType ?? 'SHARE_OUTPUT',\n payload: typeof payload === 'string' ? payload : JSON.stringify(payload),\n timestamp,\n sessionId: this.sessionId,\n });\n }\n\n /**\n * Barrier — wait until N peers have all reached this point\n * Useful for fan-in synchronization\n */\n async barrier(peerId: string, barrierName: string, totalPeers: number): Promise<void> {\n if (!this.barriers.has(barrierName)) {\n this.barriers.set(barrierName, { total: totalPeers, arrived: new Set() });\n }\n\n const bar = this.barriers.get(barrierName)!;\n bar.arrived.add(peerId);\n this.emitCoordination(peerId, `⊨ barrier \"${barrierName}\" (${bar.arrived.size}/${bar.total})`);\n\n if (bar.arrived.size >= bar.total) {\n this.emit(`barrier:${barrierName}`);\n return;\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Barrier timeout: ${barrierName} (${bar.arrived.size}/${bar.total} arrived)`));\n }, 120_000);\n\n this.once(`barrier:${barrierName}`, () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n getAllOutputs(): PeerOutput[] {\n return Array.from(this.outputs.values());\n }\n\n getMembers(): string[] {\n return Array.from(this.members);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — T2 Manager\n// ─────────────────────────────────────────────\n\nimport { randomUUID } from 'node:crypto';\nimport type {\n ConversationMessage,\n EscalationPayload,\n ModelInfo,\n PeerMessageEvent,\n PermissionRequest,\n PermissionDecision,\n T1ToT2Assignment,\n T2Result,\n T2ToT3Assignment,\n T3Result,\n} from '../../types.js';\nimport type { CascadeRouter } from '../router/index.js';\nimport type { ToolRegistry } from '../../tools/registry.js';\nimport { BaseTier } from './base.js';\nimport { T3Worker } from './t3-worker.js';\nimport { MemoryStore } from '../../memory/store.js';\nimport { PeerBus } from '../peer/bus.js';\nimport type { PermissionEscalator } from '../permissions/escalator.js';\nimport type { ToolCreator } from '../../tools/tool-creator.js';\n\nconst T2_SYSTEM_PROMPT = `You are a T2 Manager agent in the Cascade AI system.\nYour role is to analyze a section of a task and decompose it into 2-5 discrete subtasks for T3 Workers.\nIf subtasks have dependencies, you can specify \"executionMode\": \"sequential\" for the section.\nProvide \"peerT3Ids\" to subtasks so they can coordinate using the peer_message tool.\nReturn ONLY valid JSON matching the T3 subtask array schema — no other text.`;\n\nexport class T2Manager extends BaseTier {\n private router: CascadeRouter;\n private toolRegistry: ToolRegistry;\n private assignment?: T1ToT2Assignment;\n private sectionModel?: ModelInfo;\n private t3Workers: Map<string, T3Worker> = new Map();\n private escalations: EscalationPayload[] = [];\n private peerSyncBuffer: Array<{ fromId: string; content: unknown; timestamp: string }> = [];\n private store?: MemoryStore;\n private t3PeerBus: PeerBus = new PeerBus(); // ← T3↔T3 bus (local to this T2)\n private t2PeerBus?: PeerBus;\n private permissionEscalator?: PermissionEscalator;\n private toolCreator?: ToolCreator;\n /** Optional boardroom gate (Moderate / root-T2 runs) — pauses after decomposition. */\n private planApprovalCallback?: (\n subtasks: ReadonlyArray<{ subtaskId: string; subtaskTitle: string; description: string }>,\n sectionTitle: string,\n ) => Promise<{ approved: boolean; note?: string; keepSubtaskIds?: string[] }>;\n /** AbortController for the current T3 wave — aborted on cancel-and-respawn */\n private waveAbortController: AbortController | null = null;\n\n setPeerBus(bus: PeerBus): void {\n this.t2PeerBus = bus;\n this.t2PeerBus.register(this.id);\n\n // Listen for messages from sibling T2s\n this.t2PeerBus.on(`message:${this.id}`, (msg) => {\n this.log(`T2 peer message from ${msg.fromId}`);\n this.receivePeerSync(msg.fromId, msg.payload);\n });\n }\n\n setPeerMessageCallback(cb: (event: PeerMessageEvent) => void, sessionId: string): void {\n this.t3PeerBus.onPeerMessage = cb;\n this.t3PeerBus.sessionId = sessionId;\n if (this.t2PeerBus) {\n this.t2PeerBus.onPeerMessage = cb;\n this.t2PeerBus.sessionId = sessionId;\n }\n }\n\n\n\n constructor(router: CascadeRouter, toolRegistry: ToolRegistry, parentId: string) {\n super('T2', undefined, parentId);\n this.router = router;\n this.toolRegistry = toolRegistry;\n }\n\n setStore(store: MemoryStore): void {\n this.store = store;\n }\n\n /**\n * Inject the shared PermissionEscalator for this task run.\n * The escalator will also be given this T2's evaluator function.\n */\n setPermissionEscalator(escalator: PermissionEscalator): void {\n this.permissionEscalator = escalator;\n escalator.setT2Evaluator((req) => this.evaluatePermissionAtT2(req));\n }\n\n setToolCreator(creator: ToolCreator): void {\n this.toolCreator = creator;\n }\n\n /** Boardroom gate for Moderate (root-T2) runs: pause after decomposition. */\n setPlanApprovalCallback(\n cb: (\n subtasks: ReadonlyArray<{ subtaskId: string; subtaskTitle: string; description: string }>,\n sectionTitle: string,\n ) => Promise<{ approved: boolean; note?: string; keepSubtaskIds?: string[] }>,\n ): void {\n this.planApprovalCallback = cb;\n }\n\n /**\n * Phase 1 of T2 peer discussion: broadcast this section's plan so sibling T2s\n * and T1 can detect overlaps and coordinate execution order.\n * Called BEFORE execute() begins the agent loop.\n */\n announcePlan(assignment: T1ToT2Assignment): void {\n if (!this.t2PeerBus) return;\n const payload = {\n type: 'T2_PLAN_ANNOUNCEMENT',\n sectionId: assignment.sectionId,\n sectionTitle: assignment.sectionTitle,\n description: assignment.description,\n subtaskTitles: assignment.t3Subtasks?.map(s => s.subtaskTitle) ?? [],\n keywords: this.extractKeywords(assignment),\n };\n this.t2PeerBus.broadcast(this.id, payload);\n this.log(`[T2] Announced plan for section: ${assignment.sectionTitle}`);\n }\n\n /**\n * Phase 2: After this section completes, share the output with sibling T2s\n * so they can reference it in their final compilation if relevant.\n */\n shareCompletedOutput(sectionId: string, output: string): void {\n if (!this.t2PeerBus) return;\n const payload = { type: 'T2_SECTION_OUTPUT', sectionId, output };\n this.t2PeerBus.broadcast(this.id, payload);\n }\n\n private extractKeywords(assignment: T1ToT2Assignment): string[] {\n const text = `${assignment.sectionTitle} ${assignment.description}`.toLowerCase();\n // Extract file-like tokens and key nouns for overlap detection\n const fileTokens = text.match(/[\\w./-]+\\.(ts|js|tsx|jsx|py|md|json|yaml|txt|html|css|sh)\\b/gi) ?? [];\n const wordTokens = text.match(/\\b(?:auth|database|api|server|client|config|deploy|test|ui|model|schema|route|endpoint|migration|component)\\b/gi) ?? [];\n return [...new Set([...fileTokens, ...wordTokens].map(t => t.toLowerCase()))];\n }\n\n receivePeerSync(fromId: string, content: unknown): void {\n this.peerSyncBuffer.push({\n fromId,\n content,\n timestamp: new Date().toISOString(),\n });\n this.emit('peer-sync-received', { fromId, content });\n }\n\n async execute(assignment: T1ToT2Assignment, taskId: string, signal?: AbortSignal): Promise<T2Result> {\n this.signal = signal;\n this.assignment = assignment;\n this.taskId = taskId;\n this.setLabel(assignment.sectionTitle);\n this.setStatus('ACTIVE');\n\n this.sendStatusUpdate({\n progressPct: 0,\n currentAction: `Analyzing section: ${assignment.sectionTitle}`,\n status: 'IN_PROGRESS',\n });\n\n this.log(`T2 managing section: ${assignment.sectionTitle}`);\n\n // Cascade Auto: route this section to the benchmark-best model for its type\n this.sectionModel = undefined;\n try {\n const sectionText = `${assignment.sectionTitle} ${assignment.description} ${assignment.expectedOutput}`;\n this.sectionModel = (await this.router.selectModelForSubtask('T2', sectionText)) ?? undefined;\n if (this.sectionModel) {\n this.log(`Cascade Auto: routing this section to ${this.sectionModel.provider}:${this.sectionModel.id}`);\n }\n } catch { /* fall back to the tier model */ }\n\n try {\n // ── Cancellation checkpoint: before section decomposition ──\n this.throwIfCancelled();\n\n let subtasks = assignment.t3Subtasks.length > 0\n ? assignment.t3Subtasks\n : await this.decomposeSection(assignment);\n\n // Boardroom gate (planApproval: 'all'): review the decomposition before any\n // T3 spawns — approve, drop subtasks, or steer with one re-decompose pass.\n if (this.planApprovalCallback) {\n const decision = await this.planApprovalCallback(subtasks, assignment.sectionTitle);\n if (!decision.approved) {\n const output = 'Plan rejected — nothing was executed.';\n this.setStatus('COMPLETED', output);\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Plan rejected by user', status: 'IN_PROGRESS', output });\n return { sectionId: assignment.sectionId, sectionTitle: assignment.sectionTitle, status: 'COMPLETED', t3Results: [], sectionSummary: output, issues: [] };\n }\n if (decision.keepSubtaskIds?.length) {\n const keep = new Set(decision.keepSubtaskIds);\n subtasks = subtasks.filter((s) => keep.has(s.subtaskId));\n }\n if (decision.note?.trim()) {\n subtasks = await this.decomposeSection({\n ...assignment,\n description: `${assignment.description}\\n\\nGuidance (must be followed): ${decision.note}`,\n });\n }\n }\n\n this.sendStatusUpdate({\n progressPct: 20,\n currentAction: `Dispatching ${subtasks.length} T3 workers`,\n status: 'IN_PROGRESS',\n });\n\n // ── Cancellation checkpoint: before T3 dispatch ──\n this.throwIfCancelled();\n\n const t3Results = await this.executeSubtasks(subtasks, taskId);\n\n this.sendStatusUpdate({\n progressPct: 90,\n currentAction: 'Aggregating T3 results',\n status: 'IN_PROGRESS',\n });\n\n const summary = await this.aggregateResults(assignment, t3Results);\n const issues = t3Results\n .filter((r) => r.status !== 'COMPLETED')\n .flatMap((r) => r.issues);\n\n const overallStatus = this.determineStatus(t3Results);\n const isOk = overallStatus === 'COMPLETED' || overallStatus === 'PARTIAL';\n this.setStatus(isOk ? 'COMPLETED' : 'FAILED', summary);\n\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Section complete', status: 'IN_PROGRESS', output: summary });\n\n // ── Build result first, then publish to peers ──\n const result: T2Result = {\n sectionId: assignment.sectionId,\n sectionTitle: assignment.sectionTitle,\n status: overallStatus,\n t3Results,\n sectionSummary: summary,\n issues,\n };\n\n this.publishSectionOutput(result); // ← now result exists to publish\n\n return result;\n\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n this.setStatus('FAILED', errMsg);\n\n const failedResult: T2Result = {\n sectionId: assignment.sectionId,\n sectionTitle: assignment.sectionTitle,\n status: 'FAILED',\n t3Results: [],\n sectionSummary: '',\n issues: [`T2 execution error: ${errMsg}`],\n };\n\n this.publishSectionOutput(failedResult); // ← publish failures too so dependents don't hang\n\n return failedResult;\n }\n }\n\n // ── Private ──────────────────────────────────\n\n private async decomposeSection(assignment: T1ToT2Assignment): Promise<T2ToT3Assignment['subtaskId'] extends string ? T2ToT3Assignment[] : never> {\n const peerPlans = this.peerSyncBuffer\n .filter(p => (p.content as any)?.type === 'T2_PLAN_ANNOUNCEMENT')\n .map(p => `[Peer ${p.fromId} Plan]: ${(p.content as any).sectionTitle} - ${(p.content as any).subtaskTitles?.join(', ')}`)\n .join('\\n');\n\n const prompt = `Decompose this section into 2-5 concrete subtasks for T3 workers.\n\nSection: ${assignment.sectionTitle}\nDescription: ${assignment.description}\nExpected output: ${assignment.expectedOutput}\nConstraints: ${assignment.constraints.join('; ')}\n${peerPlans ? `\\nContext from sibling T2 plans (use this to align execution and avoid overlaps):\\n${peerPlans}\\n` : ''}\nReturn a JSON array of subtask objects, each with:\n- subtaskId: string (unique)\n- subtaskTitle: string\n- description: string\n- expectedOutput: string\n- constraints: string[]\n- peerT3Ids: string[] (empty for now)\n- dependsOn: string[] (array of subtaskIds this task depends on to start)\n- executionMode: \"parallel|sequential\" (default is parallel)\n\nReturn ONLY the JSON array.`;\n\n const messages: ConversationMessage[] = [{ role: 'user', content: prompt }];\n const result = await this.router.generate('T2', {\n messages,\n systemPrompt: this.systemPromptOverride + T2_SYSTEM_PROMPT + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : ''),\n maxTokens: 2000,\n ...(this.sectionModel ? { model: this.sectionModel } : {}),\n });\n\n try {\n const jsonMatch = /\\[[\\s\\S]*\\]/.exec(result.content);\n if (!jsonMatch) throw new Error('No JSON array found');\n return JSON.parse(jsonMatch[0]) as T2ToT3Assignment[];\n } catch {\n // Fallback: single subtask = the whole section\n return [{\n subtaskId: randomUUID(),\n subtaskTitle: assignment.sectionTitle,\n description: assignment.description,\n expectedOutput: assignment.expectedOutput,\n constraints: assignment.constraints,\n peerT3Ids: [],\n parentT2: this.id,\n executionMode: 'parallel',\n }];\n }\n }\n\n private buildWorkerMap(assignments: T2ToT3Assignment[], taskId: string): Map<string, T3Worker> {\n const workerMap = new Map<string, T3Worker>();\n for (const a of assignments) {\n const worker = new T3Worker(this.router, this.toolRegistry, this.id);\n if (this.store) worker.setStore(this.store, taskId);\n worker.setPeerBus(this.t3PeerBus);\n if (this.permissionEscalator) worker.setPermissionEscalator(this.permissionEscalator);\n if (this.toolCreator) worker.setToolCreator(this.toolCreator);\n\n workerMap.set(a.subtaskId, worker);\n this.t3Workers.set(a.subtaskId, worker);\n\n worker.on('stream:token', (e) => this.emit('stream:token', e));\n worker.on('log', (e) => this.emit('log', e));\n worker.on('tier:status', (e) => this.emit('tier:status', e));\n worker.on('tool:approval-request', (e) => this.emit('tool:approval-request', {\n ...e,\n __cascadeResponder: (decision: { approved: boolean; always?: boolean }) =>\n worker.emit(`tool:approval-response:${e.id}`, decision),\n }));\n }\n return workerMap;\n }\n\n private async executeSubtasks(\n subtasks: Array<Omit<T2ToT3Assignment, 'parentT2'>>,\n taskId: string,\n ): Promise<T3Result[]> {\n const assignments: T2ToT3Assignment[] = subtasks.map((s) => ({\n ...s,\n parentT2: this.id,\n }));\n\n // Wire peer IDs and sanitize dependencies\n const allKeys = new Set(assignments.map((a) => a.subtaskId));\n for (const a of assignments) {\n a.peerT3Ids = assignments\n .filter((x) => x.subtaskId !== a.subtaskId)\n .map((x) => x.subtaskId);\n a.dependsOn = (a.dependsOn ?? []).filter((d) => allKeys.has(d));\n }\n\n // Create T3 workers\n const workerMap = new Map<string, T3Worker>();\n const workers: T3Worker[] = assignments.map((a) => {\n const worker = new T3Worker(this.router, this.toolRegistry, this.id);\n if (this.store) worker.setStore(this.store, taskId);\n\n // ← Inject the shared T3 peer bus\n worker.setPeerBus(this.t3PeerBus);\n\n // ← Inject the permission escalator so T3 uses T2→T1→User flow\n if (this.permissionEscalator) {\n worker.setPermissionEscalator(this.permissionEscalator);\n }\n\n // ← Inject optional ToolCreator for runtime tool generation\n if (this.toolCreator) {\n worker.setToolCreator(this.toolCreator);\n }\n\n workerMap.set(a.subtaskId, worker);\n this.t3Workers.set(a.subtaskId, worker);\n\n // Bubble up events\n worker.on('stream:token', (e) => this.emit('stream:token', e));\n worker.on('log', (e) => this.emit('log', e));\n worker.on('tier:status', (e) => this.emit('tier:status', e));\n worker.on('tool:call', (e) => this.emit('tool:call', e));\n worker.on('tool:result', (e) => this.emit('tool:result', e));\n worker.on('tool:approval-request', (e) => this.emit('tool:approval-request', {\n ...e,\n __cascadeResponder: (decision: { approved: boolean; always?: boolean }) =>\n worker.emit(`tool:approval-response:${e.id}`, decision),\n }));\n\n return worker;\n });\n\n // ── Dependency-aware execution ────────────\n return this.runWithDependencies(assignments, workerMap, taskId);\n }\n\n /**\n * Runs T3 workers respecting dependsOn declarations.\n *\n * Uses Kahn's algorithm for topological ordering:\n * 1. Build an in-degree map from the dependency graph.\n * 2. Detect cycles — if any exist, break them by removing the offending edge\n * and logging a warning (so the run degrades gracefully instead of deadlocking).\n * 3. Execute workers in waves: start all zero-in-degree tasks in parallel,\n * then reduce in-degrees of their dependents and repeat.\n */\n private async runWithDependencies(\n assignments: T2ToT3Assignment[],\n workerMap: Map<string, T3Worker>,\n taskId: string,\n ): Promise<T3Result[]> {\n // ── Build graph ────────────────────────────\n // adjacency: subtaskId → set of subtaskIds that depend on it\n const adj = new Map<string, Set<string>>();\n // inDegree: how many unresolved dependencies each task has\n const inDegree = new Map<string, number>();\n // resolved outputs\n const resultMap = new Map<string, T3Result>();\n\n for (const a of assignments) {\n if (!adj.has(a.subtaskId)) adj.set(a.subtaskId, new Set());\n inDegree.set(a.subtaskId, 0);\n }\n\n for (const a of assignments) {\n const deps = (a.dependsOn ?? []);\n for (const dep of deps) {\n adj.get(dep)!.add(a.subtaskId);\n inDegree.set(a.subtaskId, (inDegree.get(a.subtaskId) ?? 0) + 1);\n }\n }\n\n // ── Cycle detection & breaking (Kahn's) ───\n //\n // After a full topological pass, any task still with inDegree > 0\n // is part of a cycle. We break cycles by forcibly zeroing their inDegree\n // and logging a warning so they can still execute (without that dependency).\n\n const sanitizedAssignments = this.breakCycles(assignments, adj, inDegree);\n\n // ── Wave-based execution ───────────────────\n //\n // Each iteration: collect all tasks with inDegree = 0, run them in parallel,\n // then decrement in-degrees of their dependents.\n //\n // respawnBudget: how many times a wave may be cancelled and re-run after\n // dynamic tool synthesis. Capped at 1 to prevent infinite loops.\n\n let remaining = new Set(sanitizedAssignments.map((a) => a.subtaskId));\n let wave = 0;\n let respawnBudget = 1;\n // T3→T2 reinforcement: bounded sibling-worker spawns requested by workers.\n const reinforceCfg = this.router.getReinforcementsConfig?.() ?? { enabled: false, maxPerSection: 4 };\n let reinforcementsAdded = 0;\n\n while (remaining.size > 0) {\n // Collect all runnable tasks this wave\n const runnableIds = [...remaining].filter((id) => (inDegree.get(id) ?? 0) === 0);\n\n if (runnableIds.length === 0) {\n // Safety net: should not happen after cycle breaking, but if it does,\n // force-unblock the lowest-in-degree remaining task to prevent stalling.\n const fallbackId = [...remaining].sort(\n (a, b) => (inDegree.get(a) ?? 0) - (inDegree.get(b) ?? 0),\n )[0]!;\n this.log(`⚠ Dependency stall detected — force-starting: ${fallbackId}`);\n inDegree.set(fallbackId, 0);\n runnableIds.push(fallbackId);\n }\n\n wave++;\n this.log(`Wave ${wave}: running ${runnableIds.length} subtask(s) in parallel`);\n this.sendStatusUpdate({\n progressPct: 20 + Math.min(wave * 10, 60),\n currentAction: `T3 wave ${wave}: ${runnableIds.map((id) =>\n sanitizedAssignments.find((a) => a.subtaskId === id)?.subtaskTitle ?? id\n ).join(', ')}`,\n status: 'IN_PROGRESS',\n });\n\n // ── Cancellation checkpoint: between each T3 wave ────────────\n this.throwIfCancelled();\n\n // Fresh AbortController per wave — aborted on cancel-and-respawn\n this.waveAbortController = new AbortController();\n const waveSignal = AbortSignal.any(\n [this.signal, this.waveAbortController.signal].filter(Boolean) as AbortSignal[],\n );\n\n // Execute this wave — parallel for cloud, sequential for local (t3Execution).\n const runOne = async (id: string) => {\n const assignment = sanitizedAssignments.find((a) => a.subtaskId === id)!;\n const worker = workerMap.get(id)!;\n const result = await worker.execute(assignment, taskId, waveSignal);\n resultMap.set(id, result);\n return result;\n };\n\n let waveResults: PromiseSettledResult<Awaited<ReturnType<typeof runOne>>>[];\n if (this.router.getT3ExecutionMode?.() === 'sequential') {\n this.log(`Wave ${wave}: running ${runnableIds.length} subtask(s) sequentially (local tier)`);\n waveResults = [];\n for (const id of runnableIds) {\n try { waveResults.push({ status: 'fulfilled', value: await runOne(id) }); }\n catch (reason) { waveResults.push({ status: 'rejected', reason }); }\n }\n } else {\n waveResults = await Promise.allSettled(runnableIds.map(runOne));\n }\n\n // ── Cancel-and-respawn: if ANY worker in this wave escalated for tool synthesis,\n // cancel the whole wave, synthesize the tool once, then re-run ALL wave workers\n // with fresh instances that have the new tool available.\n const escalatedToolIdx = respawnBudget > 0\n ? waveResults.findIndex(\n (r) => r.status === 'fulfilled' &&\n r.value.status === 'ESCALATED' &&\n r.value.issues.some((iss) => iss.includes('dynamic tool generation')),\n )\n : -1;\n\n if (escalatedToolIdx !== -1 && this.toolCreator) {\n respawnBudget--;\n this.waveAbortController.abort();\n\n const escalatedId = runnableIds[escalatedToolIdx]!;\n const escalatedAssignment = sanitizedAssignments.find((a) => a.subtaskId === escalatedId)!;\n\n this.log(`Wave ${wave}: tool escalation detected — synthesizing tool then respawning all ${runnableIds.length} worker(s)`);\n this.sendStatusUpdate({\n progressPct: 50,\n currentAction: `Synthesizing dynamic tool for: ${escalatedAssignment.subtaskTitle}`,\n status: 'IN_PROGRESS',\n });\n\n const toolName = await this.toolCreator.createTool(\n `Help complete: ${escalatedAssignment.subtaskTitle}`,\n escalatedAssignment.description,\n );\n\n if (toolName) {\n this.log(`Tool \"${toolName}\" created — respawning wave ${wave} workers`);\n // Stamp all wave assignments so fresh T3s know about the tool\n for (const a of sanitizedAssignments) {\n if (runnableIds.includes(a.subtaskId)) {\n a.description += `\\n\\n[SYSTEM]: Dynamic tool \"${toolName}\" is now available — use it to complete your task.`;\n }\n }\n // Share the new tool over the worker bus so peers register it instead\n // of regenerating the same capability.\n const spec = this.toolCreator.getSpec(toolName);\n if (spec) this.t3PeerBus.broadcast(this.id, { type: 'TOOL_CREATED', spec });\n }\n\n // Clear only current-wave outputs so prior-wave completions remain accessible to dependents\n for (const id of runnableIds) {\n this.t3PeerBus.clearOutput(id);\n }\n\n // Rebuild fresh T3Worker instances for this wave\n const freshMap = this.buildWorkerMap(\n sanitizedAssignments.filter((a) => runnableIds.includes(a.subtaskId)),\n taskId,\n );\n for (const [k, v] of freshMap) workerMap.set(k, v);\n\n // Re-queue all wave IDs\n for (const id of runnableIds) {\n remaining.add(id);\n inDegree.set(id, 0);\n }\n wave--; // keep wave counter accurate (will be incremented again at top)\n continue;\n }\n\n // ── Normal wave completion: reduce in-degrees, handle rejections ─\n for (let i = 0; i < runnableIds.length; i++) {\n const id = runnableIds[i]!;\n remaining.delete(id);\n\n const r = waveResults[i]!;\n if (r.status === 'rejected') {\n this.log(`T3 worker ${id} failed: ${r.reason instanceof Error ? r.reason.message : String(r.reason)} — retrying once`);\n const assignment = sanitizedAssignments.find((a) => a.subtaskId === id)!;\n try {\n const retried = await this.retryT3(assignment, taskId);\n resultMap.set(id, retried);\n } catch (retryErr) {\n const msg = retryErr instanceof Error ? retryErr.message : String(retryErr);\n this.log(`T3 retry for ${id} threw before publishing — unblocking dependents with FAILED`);\n this.t3PeerBus.publish(this.id, id, `Retry failed: ${msg}`, 'FAILED');\n resultMap.set(id, {\n subtaskId: id,\n status: 'FAILED',\n output: `Retry threw: ${msg}`,\n testResults: { checksRun: [], passed: [], failed: [] },\n issues: [msg],\n peerSyncsUsed: [],\n correctionAttempts: 1,\n });\n }\n }\n\n for (const dependent of adj.get(id) ?? []) {\n inDegree.set(dependent, Math.max(0, (inDegree.get(dependent) ?? 0) - 1));\n }\n }\n\n // ── T3→T2 reinforcement: spawn the sibling workers requested this wave ──\n // (bounded by maxPerSection; the workers are depth-1 so they can't request\n // more, and the while-loop runs them as a normal wave honoring t3Execution).\n if (reinforceCfg.enabled && reinforcementsAdded < reinforceCfg.maxPerSection) {\n let addedThisWave = 0;\n for (const id of runnableIds) {\n for (const req of resultMap.get(id)?.reinforcements ?? []) {\n if (reinforcementsAdded >= reinforceCfg.maxPerSection) break;\n reinforcementsAdded++;\n addedThisWave++;\n const assignment: T2ToT3Assignment = {\n ...req,\n subtaskId: `reinf-${this.id}-${reinforcementsAdded}`,\n dependsOn: [],\n peerT3Ids: [],\n };\n sanitizedAssignments.push(assignment);\n adj.set(assignment.subtaskId, new Set());\n inDegree.set(assignment.subtaskId, 0);\n remaining.add(assignment.subtaskId);\n const fresh = this.buildWorkerMap([assignment], taskId);\n for (const [k, v] of fresh) { v.markAsReinforcement(); workerMap.set(k, v); }\n this.log(`Reinforcement: spawned worker \"${assignment.subtaskTitle}\" (requested by ${id})`);\n }\n }\n if (addedThisWave > 0) {\n this.sendStatusUpdate({ progressPct: 55, currentAction: `Added ${addedThisWave} reinforcement worker(s)`, status: 'IN_PROGRESS' });\n }\n }\n }\n\n return [...resultMap.values()];\n }\n\n /**\n * Detects cyclic dependencies using Kahn's algorithm and breaks them\n * by removing back-edges. Returns a sanitized copy of assignments.\n *\n * A cycle like t1→t2→t3→t1 is broken at the last edge (t3→t1),\n * meaning t3 will start without waiting for t1, preventing deadlock.\n */\n private breakCycles(\n assignments: T2ToT3Assignment[],\n adj: Map<string, Set<string>>,\n inDegree: Map<string, number>,\n ): T2ToT3Assignment[] {\n // Clone inDegree for simulation\n const degree = new Map(inDegree);\n const queue: string[] = [];\n const visited = new Set<string>();\n\n for (const [id, d] of degree) {\n if (d === 0) queue.push(id);\n }\n\n while (queue.length > 0) {\n const id = queue.shift()!;\n visited.add(id);\n for (const dep of adj.get(id) ?? []) {\n const newDeg = (degree.get(dep) ?? 1) - 1;\n degree.set(dep, newDeg);\n if (newDeg === 0) queue.push(dep);\n }\n }\n\n // Any node not visited is in a cycle\n const cycleNodes = [...inDegree.keys()].filter((id) => !visited.has(id));\n\n if (cycleNodes.length === 0) return assignments; // No cycles\n\n this.log(\n `⚠ Circular dependency detected among subtasks: [${cycleNodes.join(', ')}]. ` +\n `Breaking cycles — affected tasks will run without their cyclic dependencies.`,\n );\n\n // Sanitize: remove dependsOn references that involve cycle nodes\n return assignments.map((a) => {\n if (!cycleNodes.includes(a.subtaskId)) return a;\n const safeDeps = (a.dependsOn ?? []).filter((d) => !cycleNodes.includes(d));\n if (safeDeps.length !== (a.dependsOn ?? []).length) {\n this.log(\n ` → Breaking cycle: removed ${(a.dependsOn ?? []).filter((d) => cycleNodes.includes(d)).join(', ')} ` +\n `from \"${a.subtaskTitle}\" dependsOn`,\n );\n // Also decrement inDegree for the removed deps\n for (const removed of (a.dependsOn ?? []).filter((d) => cycleNodes.includes(d))) {\n inDegree.set(a.subtaskId, Math.max(0, (inDegree.get(a.subtaskId) ?? 1) - 1));\n adj.get(removed)?.delete(a.subtaskId);\n }\n }\n return { ...a, dependsOn: safeDeps };\n });\n }\n\n\n private async retryT3(assignment: T2ToT3Assignment, taskId: string): Promise<T3Result> {\n this.log(`Retrying T3 for subtask: ${assignment.subtaskTitle}`);\n const worker = new T3Worker(this.router, this.toolRegistry, this.id);\n if (this.store) worker.setStore(this.store, taskId);\n worker.setPeerBus(this.t3PeerBus); // ← wire bus on retry too\n worker.on('stream:token', (e) => this.emit('stream:token', e));\n worker.on('tool:approval-request', (e) => this.emit('tool:approval-request', {\n ...e,\n __cascadeResponder: (decision: { approved: boolean; always?: boolean }) =>\n worker.emit(`tool:approval-response:${e.id}`, decision),\n }));\n return worker.execute(\n { ...assignment, description: `[RETRY] ${assignment.description}` },\n taskId,\n this.signal,\n );\n }\n\n private publishSectionOutput(result: T2Result): void {\n this.t2PeerBus?.publish(\n this.id,\n result.sectionId,\n result.sectionSummary,\n result.status === 'COMPLETED' ? 'COMPLETED' : 'FAILED',\n );\n }\n\n private async aggregateResults(\n assignment: T1ToT2Assignment,\n results: T3Result[],\n ): Promise<string> {\n const completed = results.filter((r) => r.status === 'COMPLETED');\n if (!completed.length) return `Section ${assignment.sectionTitle} failed — no T3 workers completed.`;\n\n const peerOutputs = this.peerSyncBuffer\n .filter(p => (p.content as any)?.type === 'T2_SECTION_OUTPUT')\n .map(p => `[Peer ${p.fromId} Output]: ${(p.content as any).output}`)\n .join('\\n\\n');\n\n const peerContext = peerOutputs ? `\\n\\nContext from sibling T2 completed sections (use this to ensure your summary aligns with the overall state):\\n${peerOutputs}` : '';\n const MAX_CHUNK_LENGTH = 15000; // Roughly ~3.5k tokens safety limit\n\n let currentSummary = '';\n let i = 0;\n\n // Rolling map-reduce for large outputs\n while (i < completed.length) {\n let chunkText = '';\n let chunkEnd = i;\n\n while (chunkEnd < completed.length) {\n const nextOutput = `[T3-${chunkEnd + 1}]: ${completed[chunkEnd]!.output}\\n\\n`;\n if (chunkText.length + nextOutput.length > MAX_CHUNK_LENGTH && chunkEnd > i) {\n break; // Stop if adding this output exceeds the chunk limit (and we have at least one)\n }\n chunkText += nextOutput;\n chunkEnd++;\n }\n\n i = chunkEnd;\n\n const prompt = `Summarize these T3 worker outputs for section \"${assignment.sectionTitle}\" in 2-3 sentences.\n ${currentSummary ? `\\nPREVIOUS SUMMARY SO FAR:\\n${currentSummary}\\n\\nNEW OUTPUTS TO INTEGRATE:\\n` : '\\nOUTPUTS:\\n'}${chunkText}${peerContext}`;\n\n const messages: ConversationMessage[] = [{ role: 'user', content: prompt }];\n try {\n const result = await this.router.generate('T2', {\n messages,\n systemPrompt: this.systemPromptOverride + 'You are a T2 Manager. Summarize the work of your T3 workers succinctly.' + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : ''),\n maxTokens: 500,\n ...(this.sectionModel ? { model: this.sectionModel } : {}),\n });\n currentSummary = result.content;\n } catch (err) {\n this.log(`aggregateResults: LLM summarization failed at chunk — returning raw T3 outputs. Error: ${err instanceof Error ? err.message : String(err)}`);\n return currentSummary + '\\n\\n' + chunkText; // Best effort fallback\n }\n }\n\n return currentSummary;\n }\n private determineStatus(results: T3Result[]): T2Result['status'] {\n if (results.every((r) => r.status === 'COMPLETED')) return 'COMPLETED';\n if (results.some((r) => r.status === 'COMPLETED')) return 'PARTIAL';\n if (results.some((r) => r.status === 'ESCALATED')) return 'ESCALATED';\n return 'FAILED';\n }\n\n /**\n * T2-level permission evaluator.\n * - Safe / non-dangerous tools: auto-approve via rules (no LLM call).\n * - Dangerous tools: ask T2's LLM whether the action fits the section goal.\n * - Returns null if the LLM is uncertain (triggers T1 evaluation).\n */\n private async evaluatePermissionAtT2(req: PermissionRequest): Promise<PermissionDecision | null> {\n // Non-dangerous path: already handled by SAFE_TOOLS set in escalator.\n // This method only receives calls for tools that cleared the safe-list.\n if (!req.isDangerous) {\n return {\n requestId: req.id,\n approved: true,\n always: true,\n decidedBy: 'T2',\n reasoning: 'Non-dangerous tool auto-approved by T2 section policy',\n };\n }\n\n // Dangerous path: LLM inference (max 200 tokens)\n const prompt = `You are a T2 Manager for this section: \"${this.assignment?.sectionTitle ?? req.sectionContext}\".\nSection goal: ${this.assignment?.description ?? req.sectionContext}\n\nA T3 Worker wants to execute:\nTool: ${req.toolName}\nTarget: ${JSON.stringify(req.input)}\nReason: ${req.subtaskContext}\n\nIs this consistent with the section goal and safe to allow?\nReply with exactly one word: YES, NO, or UNSURE.`;\n\n try {\n const result = await this.router.generate('T2', {\n messages: [{ role: 'user', content: prompt }],\n systemPrompt: this.systemPromptOverride + 'You are a T2 Manager evaluating permissions.' + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : ''),\n maxTokens: 10,\n temperature: 0,\n ...(this.sectionModel ? { model: this.sectionModel } : {}),\n });\n const answer = result.content.trim().toUpperCase();\n if (answer.includes('YES')) {\n return { requestId: req.id, approved: true, always: true, decidedBy: 'T2', reasoning: 'T2 LLM evaluated: consistent with section goal' };\n }\n if (answer.includes('NO')) {\n return { requestId: req.id, approved: false, always: true, decidedBy: 'T2', reasoning: 'T2 LLM evaluated: inconsistent with section goal' };\n }\n // UNSURE → return null to escalate to T1\n return null;\n } catch {\n return null; // On error, escalate rather than block\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Brace-Balanced JSON Extractor\n// ─────────────────────────────────────────────\n\n/**\n * Extract the first top-level JSON object from a string by scanning braces,\n * respecting string literals and escapes. Greedy `/\\{[\\s\\S]*\\}/` regexes\n * over-match when the model wraps JSON in markdown fences with sample braces\n * inside code comments; this walker ignores any brace inside a string and\n * unbalances correctly on the first complete object.\n *\n * Returns the JSON slice including the outer braces, or `null` if no balanced\n * object is found.\n */\nexport function extractFirstJsonObject(input: string): string | null {\n if (!input) return null;\n const start = input.indexOf('{');\n if (start === -1) return null;\n\n let depth = 0;\n let inString = false;\n let escape = false;\n for (let i = start; i < input.length; i++) {\n const ch = input[i];\n if (inString) {\n if (escape) {\n escape = false;\n } else if (ch === '\\\\') {\n escape = true;\n } else if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n if (ch === '\"') {\n inString = true;\n continue;\n }\n if (ch === '{') {\n depth += 1;\n } else if (ch === '}') {\n depth -= 1;\n if (depth === 0) {\n return input.slice(start, i + 1);\n }\n }\n }\n return null;\n}\n\n/**\n * Parse the first balanced JSON object. Returns `null` on any failure so\n * callers can provide their own fallback.\n */\nexport function parseFirstJsonObject<T = unknown>(input: string): T | null {\n const slice = extractFirstJsonObject(input);\n if (!slice) return null;\n try {\n return JSON.parse(slice) as T;\n } catch {\n return null;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — T1 Administrator\n// ─────────────────────────────────────────────\n\nimport { randomUUID } from 'node:crypto';\nimport type {\n CascadeConfig,\n ConversationMessage,\n EscalationPayload,\n ImageAttachment,\n PeerMessageEvent,\n PermissionDecision,\n PermissionRequest,\n T1ToT2Assignment,\n T2Result,\n TaskComplexity,\n} from '../../types.js';\nimport type { CascadeRouter } from '../router/index.js';\nimport type { ToolRegistry } from '../../tools/registry.js';\nimport { BaseTier } from './base.js';\nimport { T2Manager } from './t2-manager.js';\nimport { MemoryStore } from '../../memory/store.js';\nimport { COMPLEXITY_T2_COUNT } from '../../constants.js';\nimport { PeerBus } from '../peer/bus.js';\nimport type { PermissionEscalator } from '../permissions/escalator.js';\nimport type { ToolCreator } from '../../tools/tool-creator.js';\nimport { parseFirstJsonObject } from '../../utils/json-extract.js';\n\nconst T1_SYSTEM_PROMPT = `You are T1, the Administrator in the Cascade AI orchestration system.\n\nYour responsibilities:\n1. Analyze task complexity: Simple | Moderate | Complex | Highly Complex\n2. Decompose the task into logical sections (one per T2 Manager)\n3. For each section, define 2-5 subtasks for T3 Workers\n4. Return a structured plan as JSON\n\nCRITICAL PATH RULE: If the user specifies a target directory (e.g. \"inside python_exclusive\",\n\"in the /output folder\"), every file path in EVERY T3 subtask's description, expectedOutput,\nand constraints MUST include the full relative path.\nExample: \"python_exclusive/script.py\" NOT just \"script.py\".\nThe directory must appear verbatim in every subtask that creates or reads a file.\nNEVER omit the directory prefix when decomposing into subtasks.\n\nRules:\n- Simple → 1 T3, Moderate → 2-3 T2s, Complex → 3-5 T2s, Highly Complex → 5+ T2s\n- Return ONLY valid JSON — no other text\n- If the user asks for a PDF, explicitly use the \"pdf_create\" tool\n- If the user asks for Excel/Zip/complex processing, use \"run_code\" with Python or Node.js\n- Ensure every plan includes explicit creation and verification steps for requested artifacts\n\nDEPENDENCY GUIDANCE:\n- Leave \"dependsOn\" empty [] for sections that are independent (e.g. writing different files, researching different topics).\n- Populate \"dependsOn\" with section IDs ONLY when a later section strictly depends on the output of an earlier one (e.g. write code → then test it).\n- Prefer empty dependencies (parallel execution): it is significantly faster and reduces total wall-clock time.\n- Within a sequential section, mark T3 subtasks with \"dependsOn\" only when they truly block each other.\n\nQUALITY RULES:\n- Each section must have a clear, testable \"expectedOutput\" so T2 knows when it is done.\n- Do NOT create trivial sections that only move files or print summaries — fold those into adjacent sections.\n- If the plan would naturally produce fewer than 2 independent sections, prefer Moderate routing (single T2).`;\n\nexport interface TaskPlan {\n complexity: TaskComplexity;\n sections: T1ToT2Assignment[];\n reasoning: string;\n}\n\n/** Decision returned by a plan-approval gate (the \"boardroom\"). */\nexport interface PlanApprovalDecision {\n approved: boolean;\n /** Optional steering note — triggers a re-plan pass, then re-asks (up to maxRevisionRounds). */\n note?: string;\n /** Optional user-edited plan — applied directly (no re-decompose) before proceeding. */\n editedPlan?: TaskPlan;\n}\n\n/** Extra context surfaced to the approval gate alongside the plan. */\nexport interface PlanApprovalMeta {\n /** Automated reviewer's critique of the plan (when planReview.autoReviewer is on). */\n critique?: string;\n}\n\nexport class T1Administrator extends BaseTier {\n private router: CascadeRouter;\n private toolRegistry: ToolRegistry;\n private config: CascadeConfig;\n private t2Managers: Map<string, T2Manager> = new Map();\n private escalations: EscalationPayload[] = [];\n private store?: MemoryStore;\n private t2PeerBus: PeerBus = new PeerBus();\n private permissionEscalator?: PermissionEscalator;\n private toolCreator?: ToolCreator;\n /** Stored overall task goal — used when evaluating escalated permissions */\n private taskGoal = '';\n private peerMessageCallback?: (event: PeerMessageEvent) => void;\n private peerMessageSessionId = '';\n private planApprovalCallback?: (plan: TaskPlan, meta?: PlanApprovalMeta) => Promise<PlanApprovalDecision>;\n\n constructor(router: CascadeRouter, toolRegistry: ToolRegistry, config: CascadeConfig) {\n super('T1', 'T1');\n this.router = router;\n this.toolRegistry = toolRegistry;\n this.config = config;\n }\n\n setStore(store: MemoryStore): void {\n this.store = store;\n }\n\n /**\n * Inject the shared PermissionEscalator for this task run.\n * Registers T1's evaluator so it can decide when T2 is uncertain.\n */\n setPermissionEscalator(escalator: PermissionEscalator): void {\n this.permissionEscalator = escalator;\n escalator.setT1Evaluator((req) => this.evaluatePermissionAtT1(req));\n }\n\n setToolCreator(creator: ToolCreator): void {\n this.toolCreator = creator;\n }\n\n setPeerMessageCallback(cb: (event: PeerMessageEvent) => void, sessionId: string): void {\n this.peerMessageCallback = cb;\n this.peerMessageSessionId = sessionId;\n this.t2PeerBus.onPeerMessage = cb;\n this.t2PeerBus.sessionId = sessionId;\n }\n\n /**\n * Install a \"boardroom\" gate: called with T1's plan BEFORE any T2 manager\n * spawns. When unset, plans proceed immediately (headless/SDK unchanged).\n */\n setPlanApprovalCallback(cb: (plan: TaskPlan, meta?: PlanApprovalMeta) => Promise<PlanApprovalDecision>): void {\n this.planApprovalCallback = cb;\n }\n\n /** Decompose a prompt into a plan WITHOUT executing it (powers /plan preview). */\n async previewPlan(prompt: string): Promise<TaskPlan> {\n return this.decomposeTask(prompt);\n }\n\n async execute(\n userPrompt: string,\n images?: ImageAttachment[],\n systemContext?: string,\n signal?: AbortSignal,\n ): Promise<{\n output: string;\n t2Results: T2Result[];\n taskId: string;\n complexity: TaskComplexity;\n }> {\n this.signal = signal;\n this.taskId = randomUUID();\n this.setLabel('Administrator');\n this.setStatus('ACTIVE');\n this.taskGoal = userPrompt; // store for permission evaluation later\n\n this.sendStatusUpdate({\n progressPct: 0,\n currentAction: 'Analyzing task and planning execution',\n status: 'IN_PROGRESS',\n });\n\n this.log(`T1 received task: ${userPrompt.slice(0, 100)}...`);\n\n // ── Cancellation checkpoint: before image analysis ──\n this.throwIfCancelled();\n\n // Step 1: Analyze images if present (T1 processes top-level images)\n let enrichedPrompt = userPrompt;\n if (images?.length) {\n enrichedPrompt = await this.analyzeImages(userPrompt, images);\n }\n\n // ── Cancellation checkpoint: after image analysis, before planning ──\n this.throwIfCancelled();\n\n // Step 2: Decompose task into sections\n let plan = await this.decomposeTask(enrichedPrompt, systemContext);\n\n this.sendStatusUpdate({\n progressPct: 10,\n currentAction: `Plan ready: ${plan.complexity} → ${plan.sections.length} sections`,\n status: 'IN_PROGRESS',\n });\n\n this.emit('plan', { taskId: this.taskId, plan });\n\n // ── Boardroom gate: the user sits above T1 ──────────────────────\n // When installed, the plan needs sign-off before any T2 spawns. Review is\n // iterative: an edited plan is applied directly, and a steering note\n // re-plans then RE-ASKS — up to maxRevisionRounds — so the board can refine\n // the plan across rounds rather than a single take-it-or-leave-it pass.\n if (this.planApprovalCallback) {\n const maxRounds = this.config.planReview?.maxRevisionRounds ?? 5;\n const reviewer = this.config.planReview?.autoReviewer === true;\n let round = 0;\n for (;;) {\n // Optional automated critique of the CURRENT plan, shown in the dialog.\n const critique = reviewer ? (await this.reviewPlan(plan, enrichedPrompt)) ?? undefined : undefined;\n this.sendStatusUpdate({\n progressPct: 10,\n currentAction: 'Boardroom: waiting for plan approval',\n status: 'IN_PROGRESS',\n });\n const decision = await this.planApprovalCallback(plan, { critique });\n\n if (!decision.approved) {\n const output = 'Plan rejected in the boardroom — nothing was executed. Rephrase the request or adjust the plan with a new prompt.';\n this.setStatus('COMPLETED', output);\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Plan rejected by user', status: 'IN_PROGRESS', output });\n return { output, t2Results: [], taskId: this.taskId, complexity: plan.complexity };\n }\n\n // Apply a user-edited plan directly (no LLM re-decompose).\n if (decision.editedPlan?.sections?.length) {\n plan = decision.editedPlan;\n try { this.validatePlan(plan); } catch { /* best-effort: keep user edits even if thin */ }\n this.emit('plan', { taskId: this.taskId, plan });\n }\n\n // A steering note re-plans and re-asks, until the round cap.\n if (decision.note?.trim() && round < maxRounds) {\n round++;\n this.log(`Boardroom note — re-planning (round ${round}/${maxRounds}): ${decision.note}`);\n plan = await this.decomposeTask(\n `${enrichedPrompt}\\n\\nBoard guidance (must be followed in the plan): ${decision.note}`,\n systemContext,\n );\n this.emit('plan', { taskId: this.taskId, plan });\n continue; // re-ask with the revised plan\n }\n\n break; // approved with no further revision → proceed\n }\n }\n\n // ── Cancellation checkpoint: after planning, before T2 dispatch ──\n this.throwIfCancelled();\n\n // Step 3: Dispatch T2 managers in parallel\n let allT2Results = await this.dispatchT2Managers(plan.sections);\n\n // Step 4: T1 Reviewer Phase — corrective re-plan passes with early-stop.\n let pass = 1;\n const maxReplanPasses = this.config.maxReplanPasses ?? 2;\n const okCount = (rs: T2Result[]) =>\n rs.filter((r) => r.status === 'COMPLETED' || r.status === 'PARTIAL').length;\n while (pass <= maxReplanPasses) {\n const reviewResult = await this.reviewT2Outputs(enrichedPrompt, plan, allT2Results);\n if (reviewResult.approved) {\n this.log('T1 Review passed.');\n break;\n }\n\n this.log(`T1 Review rejected outputs. Replanning (Pass ${pass}/${maxReplanPasses}). Reason: ${reviewResult.reason}`);\n this.sendStatusUpdate({\n progressPct: 80 + (pass * 5),\n currentAction: `Review failed: ${reviewResult.reason}. Replanning...`,\n status: 'IN_PROGRESS',\n });\n\n const okBefore = okCount(allT2Results);\n const correctionPlan = await this.decomposeTask(`The previous execution plan failed to fully satisfy the original goal or encountered errors.\nReview reason: ${reviewResult.reason}\n\nOriginal goal: ${enrichedPrompt}\n\nCreate a CORRECTION PLAN that contains only the new sections needed to fix the issues. Do not repeat successful sections.`);\n\n const correctionResults = await this.dispatchT2Managers(correctionPlan.sections);\n allT2Results = [...allT2Results, ...correctionResults];\n\n // Early-stop: a corrective pass that produced NO new successful/partial\n // section isn't converging — stop now with the best partial result instead\n // of burning further passes (and tokens) toward the budget cap.\n if (okCount(allT2Results) <= okBefore) {\n this.log('T1 Review: corrective pass made no net progress — stopping early with the best partial result.');\n break;\n }\n pass++;\n }\n\n this.sendStatusUpdate({\n progressPct: 95,\n currentAction: 'Compiling final output',\n status: 'IN_PROGRESS',\n });\n\n // Step 5: Compile final output\n const output = await this.compileFinalOutput(userPrompt, plan, allT2Results);\n\n this.setStatus('COMPLETED', output);\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Task complete', status: 'IN_PROGRESS', output });\n\n return { output, t2Results: allT2Results, taskId: this.taskId, complexity: plan.complexity };\n }\n\n getEscalations(): EscalationPayload[] {\n return [...this.escalations];\n }\n\n // ── Private ──────────────────────────────────\n\n private async reviewT2Outputs(\n originalPrompt: string,\n plan: TaskPlan,\n t2Results: T2Result[],\n ): Promise<{ approved: boolean; reason?: string }> {\n const failedSections = t2Results.filter(r => r.status === 'FAILED');\n if (failedSections.length > 0) {\n return { \n approved: false, \n reason: `Some T2 managers failed entirely: ${failedSections.map(s => s.sectionTitle).join(', ')}. Errors: ${failedSections.flatMap(s => s.issues).join('; ')}`\n };\n }\n\n const sectionsText = t2Results\n .map((r) => `**${r.sectionTitle}**\\n${r.sectionSummary}`)\n .join('\\n\\n');\n\n const prompt = `You are a strict QA Reviewer for the Cascade AI system.\nReview the following execution outputs against the original user prompt.\n\nOriginal Request: ${originalPrompt}\n\nT2 Manager Summaries:\n${sectionsText}\n\nDoes the current state of the workspace and the outputs fully satisfy the user's request?\nIf yes, reply with exactly: \"APPROVED\".\nIf no, reply with \"REJECTED: [Detailed reason explaining exactly what is missing or incorrect]\".`;\n\n try {\n const result = await this.router.generate('T1', {\n messages: [{ role: 'user', content: prompt }],\n systemPrompt: this.systemPromptOverride + 'You are a QA Reviewer.',\n maxTokens: 500,\n temperature: 0,\n });\n const response = result.content.trim();\n if (response.toUpperCase().startsWith('APPROVED')) {\n return { approved: true };\n }\n return { approved: false, reason: response.replace(/^REJECTED:\\s*/i, '') };\n } catch {\n // If review fails to generate, default to approve to avoid infinite loops on rate limits\n return { approved: true };\n }\n }\n\n private async analyzeImages(prompt: string, images: ImageAttachment[]): Promise<string> {\n const visionModel = this.router.getModelForTier('T1');\n if (!visionModel?.isVisionCapable) return prompt;\n\n const messages: ConversationMessage[] = [{\n role: 'user',\n content: [\n { type: 'text', text: `Describe these images and how they relate to the task: \"${prompt}\"` },\n ...images.map((img) => ({ type: 'image' as const, image: img })),\n ],\n }];\n\n const result = await this.router.generate('T1', { messages, maxTokens: 1000 }, undefined, true);\n return `${prompt}\\n\\n[Image context: ${result.content}]`;\n }\n\n /**\n * Automated reviewer pass: a single T1 critique of the plan before the user\n * sees it (planReview.autoReviewer). Best-effort — returns null on any error\n * so it never blocks the approval gate.\n */\n private async reviewPlan(plan: TaskPlan, goal: string): Promise<string | null> {\n try {\n const sections = plan.sections\n .map((s, i) => `${i + 1}. ${s.sectionTitle} — ${s.description} (${s.t3Subtasks?.length ?? 0} subtasks${s.dependsOn?.length ? `, depends on: ${s.dependsOn.join(', ')}` : ''})`)\n .join('\\n');\n const prompt = `You are a senior engineer reviewing an execution plan BEFORE it runs.\n\nGOAL:\n${goal}\n\nPLAN (${plan.complexity}, ${plan.sections.length} sections):\n${sections}\n\nIn 3-5 terse bullets, flag the most important RISKS, GAPS, or over-/under-decomposition the operator should weigh before approving. If the plan is sound, say so in one line. Output plain-text bullets only - no preamble.`;\n const result = await this.router.generate('T1', {\n messages: [{ role: 'user', content: prompt }],\n systemPrompt: 'You are a concise, critical plan reviewer. Be specific and brief.',\n maxTokens: 400,\n });\n const text = (result.content ?? '').trim();\n return text.length ? text : null;\n } catch {\n return null; // reviewer is advisory — never block the gate\n }\n }\n\n private async decomposeTask(prompt: string, systemContext?: string): Promise<TaskPlan> {\n const contextSection = systemContext ? `\\nProject context:\\n${systemContext}` : '';\n const decompositionPrompt = `Analyze this task and create an execution plan.${contextSection}\n\n Task: ${prompt}\n\n IMPORTANT: If the task specifies a directory (e.g. \"inside X\", \"in X folder\"), \n ALL file paths in ALL subtasks must include that full directory prefix.\n Example: if asked to create files \"inside python_exclusive\", every subtask that \n creates a file must use \"python_exclusive/filename.ext\" as the path.\n\nReturn JSON where SECTIONS can declare dependencies on other SECTIONS:\n{\n \"sections\": [{\n \"sectionId\": \"s1\",\n \"sectionTitle\": \"Setup Project\",\n \"description\": \"Initialize the project\",\n \"expectedOutput\": \"Basic structure created\",\n \"constraints\": [],\n \"dependsOn\": [], // ← empty = runs immediately\n \"t3Subtasks\": [{\n \"subtaskId\": \"t1\",\n \"subtaskTitle\": \"Init NPM\",\n \"description\": \"Run npm init\",\n \"expectedOutput\": \"package.json created\",\n \"constraints\": [],\n \"dependsOn\": []\n }]\n }, {\n \"sectionId\": \"s2\", \n \"sectionTitle\": \"Write Tests\",\n \"description\": \"Write tests for the project\",\n \"expectedOutput\": \"Tests passing\",\n \"constraints\": [],\n \"dependsOn\": [\"s1\"], // ← waits for section s1 to complete first\n \"t3Subtasks\": [...]\n }]\n}\nUse dependsOn at the SECTION level when a whole T2 Manager needs the output of a previous T2 Manager.\nLeave dependsOn empty for sections that can run immediately in parallel.`;\n\n const messages: ConversationMessage[] = [{ role: 'user', content: decompositionPrompt }];\n const result = await this.router.generate('T1', {\n messages,\n systemPrompt: this.systemPromptOverride + T1_SYSTEM_PROMPT,\n maxTokens: 4000,\n });\n\n try {\n const parsed = parseFirstJsonObject<TaskPlan>(result.content);\n if (!parsed) throw new Error('No JSON in T1 response');\n this.validatePlan(parsed);\n return parsed;\n } catch {\n // Fallback: single section, single T3\n return {\n complexity: 'Simple',\n reasoning: 'Fallback single-section plan',\n sections: [{\n sectionId: 's1',\n sectionTitle: 'Main Task',\n description: prompt,\n expectedOutput: 'Complete response to the task',\n constraints: [],\n t3Subtasks: [{\n subtaskId: 't1',\n subtaskTitle: 'Execute Task',\n description: prompt,\n expectedOutput: 'Complete response',\n constraints: [],\n peerT3Ids: [],\n executionMode: 'parallel',\n }],\n executionMode: 'parallel',\n peerT2Ids: [],\n }],\n };\n }\n }\n\n private validatePlan(plan: TaskPlan): void {\n if (!plan.sections || !Array.isArray(plan.sections) || plan.sections.length === 0) {\n throw new Error('Invalid plan: no sections');\n }\n const [min, max] = COMPLEXITY_T2_COUNT[plan.complexity] ?? [1, 8];\n if (plan.sections.length < min) {\n // Auto-expand by duplicating if needed (rare edge case)\n }\n }\n\n private async dispatchT2Managers(sections: T1ToT2Assignment[]): Promise<T2Result[]> {\n // Wire peer sync IDs\n for (const section of sections) {\n section.peerT2Ids = sections\n .filter((x) => x.sectionId !== section.sectionId)\n .map((x) => x.sectionId);\n }\n\n // Track (emitter, event, handler) tuples so we can detach all listeners\n // when dispatch finishes. Without this, bubble handlers and peer-sync\n // routers leak for the lifetime of the process in long-lived REPLs.\n const registered: Array<[T2Manager, string, (...args: unknown[]) => void]> = [];\n const bind = <T>(m: T2Manager, event: string, fn: (arg: T) => void) => {\n const handler = (arg: T) => fn(arg);\n m.on(event, handler as (...args: unknown[]) => void);\n registered.push([m, event, handler as (...args: unknown[]) => void]);\n };\n\n const managers: T2Manager[] = sections.map((section) => {\n const manager = new T2Manager(this.router, this.toolRegistry, this.id);\n manager.setHierarchyContext(`You are a T2 Manager for the section \"${section.sectionTitle}\". You are part of a COMPLEX task overseen by T1 Administrator.`);\n if (this.store) {\n manager.setStore(this.store);\n }\n manager.setPeerBus(this.t2PeerBus);\n\n if (this.peerMessageCallback) {\n manager.setPeerMessageCallback(this.peerMessageCallback, this.peerMessageSessionId);\n }\n\n if (this.permissionEscalator) {\n manager.setPermissionEscalator(this.permissionEscalator);\n }\n\n if (this.toolCreator) {\n manager.setToolCreator(this.toolCreator);\n }\n\n this.t2Managers.set(section.sectionId, manager);\n\n bind(manager, 'stream:token', (e) => this.emit('stream:token', e));\n bind(manager, 'log', (e) => this.emit('log', e));\n bind(manager, 'tier:status', (e) => this.emit('tier:status', e));\n bind(manager, 'tool:call', (e) => this.emit('tool:call', e));\n bind(manager, 'tool:result', (e) => this.emit('tool:result', e));\n bind(manager, 'tool:approval-request', (e) => this.emit('tool:approval-request', e));\n\n bind(manager, 'message', (msg: { type: string; from: string; payload: Record<string, unknown> }) => {\n if (msg.type === 'PEER_SYNC') {\n const recipientId = msg.payload.recipientT3Id as string;\n const target = this.t2Managers.get(recipientId);\n if (target) target.receivePeerSync(msg.from, msg.payload.content as string);\n }\n });\n\n return manager;\n });\n\n const cleanup = () => {\n for (const [m, event, handler] of registered) {\n m.off(event, handler);\n }\n registered.length = 0;\n };\n\n // ── Phase 1: T2 Peer Discussion — Proactive Announcement ──────────────\n // Each T2 broadcasts its section plan. T1 collects for 500ms and uses\n // the results to detect overlapping work and inject sibling context.\n this.t2PeerBus.clearBroadcastLog();\n managers.forEach((m, i) => m.announcePlan(sections[i]!));\n const announcements = await this.t2PeerBus.collect(500);\n\n // Build sibling context map: section → keywords from all other sections\n const siblingKeywords = new Map<string, string[]>();\n for (const ann of announcements) {\n const payload = ann.payload as { type: string; sectionId: string; sectionTitle: string; keywords: string[] };\n if (payload?.type !== 'T2_PLAN_ANNOUNCEMENT') continue;\n for (const other of announcements) {\n const otherPayload = other.payload as typeof payload;\n if (otherPayload?.type !== 'T2_PLAN_ANNOUNCEMENT' || otherPayload.sectionId === payload.sectionId) continue;\n const existing = siblingKeywords.get(payload.sectionId) ?? [];\n existing.push(...(otherPayload.keywords ?? []));\n siblingKeywords.set(payload.sectionId, [...new Set(existing)]);\n }\n }\n\n // Detect shared keywords → mark overlapping sections as sequential\n const overlapSections = new Set<string>();\n for (let i = 0; i < announcements.length; i++) {\n for (let j = i + 1; j < announcements.length; j++) {\n const a = announcements[i]!.payload as { keywords?: string[]; sectionId?: string };\n const b = announcements[j]!.payload as { keywords?: string[]; sectionId?: string };\n if (!a.keywords || !b.keywords || !a.sectionId || !b.sectionId) continue;\n const shared = a.keywords.filter(k => b.keywords!.includes(k));\n if (shared.length > 0) {\n overlapSections.add(a.sectionId);\n overlapSections.add(b.sectionId);\n this.log(`T2 overlap detected between sections: ${a.sectionId} ↔ ${b.sectionId} (shared: ${shared.join(', ')})`);\n }\n }\n }\n\n // Inject sibling context into each T2 manager\n managers.forEach((m, i) => {\n const section = sections[i]!;\n const myKeywords = siblingKeywords.get(section.sectionId) ?? [];\n const otherTitles = sections.filter(s => s.sectionId !== section.sectionId).map(s => s.sectionTitle);\n const context = [\n `You are T2 Manager for section: \"${section.sectionTitle}\".`,\n `Sibling sections being worked on in parallel: ${otherTitles.join(', ') || 'none'}.`,\n myKeywords.length > 0 ? `Watch for overlap with: ${[...new Set(myKeywords)].slice(0, 10).join(', ')}.` : '',\n overlapSections.has(section.sectionId) ? 'NOTE: Potential overlap detected with a sibling section — be careful not to duplicate work.' : '',\n ].filter(Boolean).join(' ');\n m.setHierarchyContext(context);\n });\n\n // If overlaps detected globally, add sequential dependencies for safety\n if (overlapSections.size > 0) {\n this.log('Overlap detected — adding sequential dependencies for conflicting sections to prevent race conditions');\n const overlapArray = Array.from(overlapSections);\n for (let i = 1; i < overlapArray.length; i++) {\n const section = sections.find(s => s.sectionId === overlapArray[i]);\n if (section) {\n section.dependsOn = [...(section.dependsOn || []), overlapArray[i - 1]!];\n }\n }\n }\n\n const t2Results: T2Result[] = [];\n\n try {\n t2Results.push(...await this.runT2sWithDependencies(sections, managers, this.taskId));\n } finally {\n cleanup();\n }\n\n return t2Results;\n }\n\n /**\n * Runs T2 managers respecting dependsOn declarations using Kahn's algorithm.\n */\n private async runT2sWithDependencies(\n sections: T1ToT2Assignment[],\n managers: T2Manager[],\n taskId: string,\n ): Promise<T2Result[]> {\n const adj = new Map<string, Set<string>>();\n const inDegree = new Map<string, number>();\n const resultMap = new Map<string, T2Result>();\n const allKeys = new Set(sections.map(s => s.sectionId));\n\n for (const s of sections) {\n if (!adj.has(s.sectionId)) adj.set(s.sectionId, new Set());\n inDegree.set(s.sectionId, 0);\n // Sanitize dependencies\n s.dependsOn = (s.dependsOn ?? []).filter(d => allKeys.has(d));\n }\n\n for (const s of sections) {\n for (const dep of (s.dependsOn ?? [])) {\n adj.get(dep)!.add(s.sectionId);\n inDegree.set(s.sectionId, (inDegree.get(s.sectionId) ?? 0) + 1);\n }\n }\n\n // Break cycles\n const queue: string[] = [];\n const degree = new Map(inDegree);\n for (const [id, deg] of degree.entries()) if (deg === 0) queue.push(id);\n const visited = new Set<string>();\n while (queue.length > 0) {\n const u = queue.shift()!;\n visited.add(u);\n for (const v of adj.get(u) ?? new Set()) {\n const newDeg = (degree.get(v) ?? 1) - 1;\n degree.set(v, newDeg);\n if (newDeg === 0) queue.push(v);\n }\n }\n const cycleNodes = [...inDegree.keys()].filter(id => !visited.has(id));\n if (cycleNodes.length > 0) {\n this.log(`⚠ Circular dependency detected among sections: [${cycleNodes.join(', ')}]. Breaking cycles.`);\n for (const s of sections) {\n if (cycleNodes.includes(s.sectionId)) {\n const safeDeps = (s.dependsOn ?? []).filter(d => !cycleNodes.includes(d));\n for (const removed of (s.dependsOn ?? []).filter(d => cycleNodes.includes(d))) {\n inDegree.set(s.sectionId, Math.max(0, (inDegree.get(s.sectionId) ?? 1) - 1));\n adj.get(removed)?.delete(s.sectionId);\n }\n s.dependsOn = safeDeps;\n }\n }\n }\n\n // Wave-based execution\n const totalSections = sections.length;\n let completedSections = 0;\n const executeWave = async () => {\n const readyIds: string[] = [];\n for (const [id, deg] of inDegree.entries()) {\n if (deg === 0 && !resultMap.has(id)) {\n readyIds.push(id);\n }\n }\n if (readyIds.length === 0) return;\n\n await Promise.all(readyIds.map(async (id) => {\n // Mark as started (prevent picking it up in next wave before it finishes)\n resultMap.set(id, null as any);\n\n const index = sections.findIndex(s => s.sectionId === id);\n const section = sections[index]!;\n const manager = managers[index]!;\n\n const progressPct = 10 + Math.floor((completedSections / totalSections) * 85);\n this.sendStatusUpdate({\n progressPct,\n currentAction: `T2 working on: ${section.sectionTitle}`,\n status: 'IN_PROGRESS',\n });\n\n this.throwIfCancelled();\n\n let result: T2Result;\n try {\n result = await manager.execute(section, taskId, this.signal);\n manager.shareCompletedOutput(section.sectionId, result.sectionSummary);\n if (result.status === 'ESCALATED') {\n this.escalations.push({\n raisedBy: `T2_${section.sectionId}`,\n sectionId: section.sectionId,\n attempted: result.issues,\n blocker: result.issues.join('; '),\n needs: 'Human review required',\n });\n }\n } catch (err) {\n result = {\n sectionId: section.sectionId,\n sectionTitle: section.sectionTitle,\n status: 'FAILED',\n t3Results: [],\n sectionSummary: '',\n issues: [err instanceof Error ? err.message : String(err)],\n };\n }\n\n resultMap.set(id, result);\n completedSections++;\n\n for (const dependentId of adj.get(id) ?? new Set()) {\n inDegree.set(dependentId, Math.max(0, (inDegree.get(dependentId) ?? 1) - 1));\n }\n }));\n\n // Check if more are ready after this wave\n if (Array.from(inDegree.values()).some(deg => deg === 0) && resultMap.size < totalSections) {\n await executeWave();\n }\n };\n\n await executeWave();\n\n return sections.map(s => resultMap.get(s.sectionId)!).filter(Boolean);\n }\n\n private async compileFinalOutput(\n originalPrompt: string,\n plan: TaskPlan,\n t2Results: T2Result[],\n ): Promise<string> {\n const completedSections = t2Results.filter((r) => r.status !== 'FAILED');\n\n if (!completedSections.length) {\n // Aggregate T3 issues across all FAILED sections to surface the root\n // cause. Critical errors (rate-limit / auth / forbidden, marked with\n // [CRITICAL_TOOL_ERROR] by t3-worker.ts) take precedence over generic\n // stall / execution messages — this is what the user needs to act on\n // (e.g. switch the T3 model away from a rate-limited one).\n const allIssues = t2Results.flatMap((r) => r.t3Results.flatMap((t) => t.issues));\n const critical = allIssues.find((i) => i.includes('[CRITICAL_TOOL_ERROR]'));\n const stalled = allIssues.find((i) => /^Stalled:/.test(i));\n const topReason = critical ?? stalled ?? allIssues[0] ?? 'no specific reason recorded';\n const sectionWord = t2Results.length === 1 ? 'section' : 'sections';\n return `Task failed — ${topReason}\\n\\nAll ${t2Results.length} ${sectionWord} encountered errors. Run \\`/logs\\` for details.`;\n }\n\n const sectionsText = completedSections\n .map((r) => `**${r.sectionTitle}**\\n${r.sectionSummary}\\n\\nOutputs:\\n${r.t3Results\n .filter((t) => t.status === 'COMPLETED')\n .map((t) => `• ${typeof t.output === 'string' ? t.output : JSON.stringify(t.output)}`)\n .join('\\n')\n }`)\n .join('\\n\\n---\\n\\n');\n\n const openIssues = t2Results.flatMap((r) => r.issues).filter(Boolean);\n const failedSections = t2Results.filter((r) => r.status === 'FAILED' || r.status === 'PARTIAL');\n\n const compilePrompt = `Compile a final, coherent response to the user's original request.\n\nOriginal request: ${originalPrompt}\n\nSection results:\n${sectionsText}\n\n${openIssues.length ? `Open issues:\\n${openIssues.map((i) => `- ${i}`).join('\\n')}` : ''}\n\nInstructions:\n- Write the complete final output in natural language\n- Integrate all section outputs coherently\n- Note any partial failures clearly\n- Do NOT expose JSON or tier internals`;\n\n const messages: ConversationMessage[] = [{ role: 'user', content: compilePrompt }];\n const result = await this.router.generate('T1', {\n messages,\n systemPrompt: this.systemPromptOverride + 'You are a final output compiler. Summarize and format the task results clearly.',\n maxTokens: 8000\n }, (chunk) => {\n this.emit('stream:token', { tierId: this.id, text: chunk.text });\n });\n\n return result.content;\n }\n\n /**\n * T1-level permission evaluator.\n * Uses T1's model with full task context.\n * Returns null only when the model explicitly says UNSURE (triggers user prompt).\n */\n private async evaluatePermissionAtT1(req: PermissionRequest): Promise<PermissionDecision | null> {\n const prompt = `You are T1 Administrator. Overall task goal:\n${this.taskGoal}\n\nA T3 Worker (inside section \"${req.sectionContext}\") wants to:\nTool: ${req.toolName}\nTarget: ${JSON.stringify(req.input)}\nReason: ${req.subtaskContext}\n\nT2 Manager was uncertain about this. Given the overall task goal, should this be allowed?\nReply with exactly one word: YES, NO, or UNSURE.\n(UNSURE = escalate to the human user for a final decision.)`;\n\n try {\n const result = await this.router.generate('T1', {\n messages: [{ role: 'user', content: prompt }],\n systemPrompt: this.systemPromptOverride + 'You are a T1 Administrator evaluating permissions.',\n maxTokens: 10,\n temperature: 0,\n });\n const answer = result.content.trim().toUpperCase();\n if (answer.includes('YES')) {\n return { requestId: req.id, approved: true, always: true, decidedBy: 'T1', reasoning: 'T1 evaluated: consistent with overall task goal' };\n }\n if (answer.includes('NO')) {\n return { requestId: req.id, approved: false, always: true, decidedBy: 'T1', reasoning: 'T1 evaluated: not consistent with overall task goal' };\n }\n return null; // UNSURE → escalate to user\n } catch {\n return null; // On error, escalate to user\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Abstract Tool Base\n// ─────────────────────────────────────────────\n\nimport type { ToolDefinition, ToolExecuteOptions } from '../types.js';\n\nexport abstract class BaseTool {\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly inputSchema: Record<string, unknown>;\n protected workspaceRoot: string = process.cwd();\n\n setWorkspaceRoot(root: string): void {\n this.workspaceRoot = root;\n }\n\n abstract execute(\n input: Record<string, unknown>,\n options: ToolExecuteOptions,\n ): Promise<string>;\n\n isDangerous(): boolean {\n return false;\n }\n\n getDefinition(): ToolDefinition {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n };\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Shell Tool\n// ─────────────────────────────────────────────\n\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nconst execAsync = promisify(exec);\n\nexport class ShellTool extends BaseTool {\n readonly name = 'shell';\n readonly description = 'Execute a shell command and return its output. Use for running scripts, compiling code, running tests, etc.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'The shell command to execute' },\n cwd: { type: 'string', description: 'Working directory (optional)' },\n timeout: { type: 'number', description: 'Timeout in milliseconds (default: 30000)' },\n },\n required: ['command'],\n };\n\n private allowlist: string[];\n private blocklist: string[];\n\n constructor(allowlist: string[] = [], blocklist: string[] = []) {\n super();\n this.allowlist = allowlist;\n this.blocklist = blocklist;\n }\n\n isDangerous(): boolean {\n return true;\n }\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const command = input['command'] as string;\n const cwd = (input['cwd'] as string | undefined) ?? this.workspaceRoot;\n const timeout = (input['timeout'] as number | undefined) ?? 30_000;\n\n this.validateCommand(command);\n\n try {\n // windowsHide: prevent a console window flash per command on Windows.\n // Output is piped (exec default), never inherited — it cannot write\n // over the live TUI.\n const { stdout, stderr } = await execAsync(command, { cwd, timeout, windowsHide: true });\n const out = [stdout, stderr].filter(Boolean).join('\\n').trim();\n return out || '(no output)';\n } catch (err) {\n if (err instanceof Error && 'stdout' in err && 'stderr' in err) {\n const e = err as Error & { stdout: string; stderr: string; code: number };\n return `Exit ${e.code ?? 1}:\\n${[e.stdout, e.stderr].filter(Boolean).join('\\n').trim()}`;\n }\n throw err;\n }\n }\n\n private validateCommand(command: string): void {\n // Block obviously catastrophic patterns. This is defense-in-depth only —\n // a blocklist can never be exhaustive; the approval prompt is the real\n // gate. Patterns tolerate flag reordering and extra whitespace so trivial\n // variants like `rm -fr /` don't slip through.\n const builtinDangerous = [\n /\\brm\\s+(?:-\\w+\\s+)*-\\w*[rf]\\w*[rf]\\w*\\s+(?:\\/|~|\\$HOME)(?:\\s|$)/, // rm -rf / , rm -fr ~\n />\\s*\\/dev\\/[sh]d[a-z]/,\n /\\bmkfs[.\\s]/,\n /\\bdd\\s+.*\\bof=\\/dev\\/[sh]d[a-z]/,\n /\\bchmod\\s+(?:-\\w+\\s+)*-?R?\\s*777\\s+\\//,\n /:\\(\\)\\s*\\{\\s*:\\s*\\|\\s*:?\\s*&\\s*\\}\\s*;/, // fork bomb :(){ :|:& };:\n ];\n\n for (const pattern of builtinDangerous) {\n if (pattern.test(command)) {\n throw new Error(`Command blocked: matches dangerous pattern`);\n }\n }\n\n // User blocklist (substring match)\n for (const blocked of this.blocklist) {\n if (command.toLowerCase().includes(blocked.toLowerCase())) {\n throw new Error(`Command blocked by blocklist: \"${blocked}\"`);\n }\n }\n\n // User allowlist (if set, the FIRST token of the command must be an exact\n // match for an entry, and the command must contain no shell metacharacters).\n //\n // Previously this used `command.startsWith(a)`, which let `npm-foo` through\n // when `npm` was whitelisted. Token-level comparison closes that hole.\n if (this.allowlist.length > 0) {\n const firstToken = command.trimStart().split(/\\s+/)[0] ?? '';\n const allowed = this.allowlist.some((a) => firstToken === a);\n if (!allowed) {\n throw new Error(\n `Command not in allowlist. First token \"${firstToken}\" must exactly ` +\n `match one of: ${this.allowlist.join(', ')}`,\n );\n }\n\n // Chaining metacharacters defeat the allowlist — block them when allowlist is active.\n const SHELL_METACHAR = /[;|`]|\\$\\(|&&|\\|\\|/;\n if (SHELL_METACHAR.test(command)) {\n throw new Error(\n `Command blocked: shell metacharacters (;, |, &&, ||, \\`, $(...)) are not permitted ` +\n `when an allowlist is active because they allow chaining of arbitrary commands.`,\n );\n }\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Workspace Path Sandbox Helper\n// ─────────────────────────────────────────────\n\nimport path from 'node:path';\nimport fs from 'node:fs';\n\nexport class WorkspaceSandboxError extends Error {\n constructor(attempted: string, workspaceRoot: string) {\n super(`Refusing access to \"${attempted}\" — outside workspace root \"${workspaceRoot}\".`);\n this.name = 'WorkspaceSandboxError';\n }\n}\n\n/**\n * Resolve a user-supplied path and guarantee it stays inside the workspace.\n *\n * Fails closed on any escape attempt (e.g. \"..\", absolute paths pointing\n * outside the workspace, or symlink-style traversal from the caller).\n *\n * Call this in every file-touching tool BEFORE any fs operation.\n */\nexport function resolveInWorkspace(workspaceRoot: string, input: string): string {\n if (typeof input !== 'string' || input.length === 0) {\n throw new WorkspaceSandboxError(String(input), workspaceRoot);\n }\n\n const root = path.resolve(workspaceRoot);\n const abs = path.isAbsolute(input) ? path.resolve(input) : path.resolve(root, input);\n const rel = path.relative(root, abs);\n\n if (rel === '' || rel === '.') {\n // still verify symlink target for the root itself\n } else if (rel.startsWith('..') || path.isAbsolute(rel)) {\n throw new WorkspaceSandboxError(input, root);\n }\n\n // Dereference symlinks so a link inside the workspace pointing outside is caught.\n try {\n const real = fs.realpathSync(abs);\n const realRel = path.relative(root, real);\n if (realRel !== '' && realRel !== '.' && (realRel.startsWith('..') || path.isAbsolute(realRel))) {\n throw new WorkspaceSandboxError(input, root);\n }\n } catch (e) {\n if (e instanceof WorkspaceSandboxError) throw e;\n // Path doesn't exist yet (new file being created) — symlink check not applicable.\n }\n\n return abs;\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — File Tools\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\nimport { resolveInWorkspace } from './utils/workspace-path.js';\n\n// ── File Read ─────────────────────────────────\n\nexport class FileReadTool extends BaseTool {\n readonly name = 'file_read';\n readonly description = 'Read the contents of a file. Returns the file content as a string.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to the file (relative to workspace root)' },\n offset: { type: 'number', description: 'Line number to start reading from (1-indexed)' },\n limit: { type: 'number', description: 'Maximum number of lines to read' },\n },\n required: ['path'],\n };\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const filePath = input['path'] as string;\n const absPath = resolveInWorkspace(this.workspaceRoot, filePath);\n const offset = (input['offset'] as number | undefined) ?? 1;\n const limit = input['limit'] as number | undefined;\n\n const content = await fs.readFile(absPath, 'utf-8');\n const lines = content.split('\\n');\n const start = Math.max(0, offset - 1);\n const end = limit ? start + limit : lines.length;\n const sliced = lines.slice(start, end);\n\n const numbered = sliced.map((line, i) => `${start + i + 1}\\t${line}`).join('\\n');\n return numbered;\n }\n}\n\n// ── File Write ────────────────────────────────\n\nexport class FileWriteTool extends BaseTool {\n readonly name = 'file_write';\n readonly description = 'Write content to a file. Creates the file and parent directories if they do not exist. OVERWRITES existing content.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to write to (relative to workspace root)' },\n content: { type: 'string', description: 'Content to write' },\n },\n required: ['path', 'content'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const filePath = input['path'] as string;\n const absPath = resolveInWorkspace(this.workspaceRoot, filePath);\n const content = input['content'] as string;\n\n if (options.saveSnapshot) {\n try {\n const oldContent = await fs.readFile(absPath, 'utf-8');\n await options.saveSnapshot(absPath, oldContent);\n } catch {\n // File doesn't exist, nothing to snapshot for rollback (delete on rollback)\n }\n }\n\n await fs.mkdir(path.dirname(absPath), { recursive: true });\n await fs.writeFile(absPath, content, 'utf-8');\n return `Written ${content.length} characters to ${filePath}`;\n }\n}\n\n// ── File Edit ─────────────────────────────────\n\nexport class FileEditTool extends BaseTool {\n readonly name = 'file_edit';\n readonly description = 'Replace a specific string in a file with a new string. The old_string must match exactly.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to the file to edit (relative to workspace root)' },\n old_string: { type: 'string', description: 'The exact string to find and replace' },\n new_string: { type: 'string', description: 'The replacement string' },\n replace_all: { type: 'boolean', description: 'Replace all occurrences (default: false)' },\n },\n required: ['path', 'old_string', 'new_string'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const filePath = input['path'] as string;\n const absPath = resolveInWorkspace(this.workspaceRoot, filePath);\n const oldString = input['old_string'] as string;\n const newString = input['new_string'] as string;\n const replaceAll = (input['replace_all'] as boolean | undefined) ?? false;\n\n const rawContent = await fs.readFile(absPath, 'utf-8');\n\n if (options.saveSnapshot) {\n await options.saveSnapshot(absPath, rawContent);\n }\n\n // Normalize CRLF → LF so edits work on Windows-formatted files transparently.\n const content = rawContent.replace(/\\r\\n/g, '\\n');\n const normalizedOld = oldString.replace(/\\r\\n/g, '\\n');\n\n if (!content.includes(normalizedOld)) {\n throw new Error(\n `old_string not found in ${filePath}. Make sure to match exactly (line endings are normalized to LF).`,\n );\n }\n\n const updated = replaceAll\n ? content.split(normalizedOld).join(newString)\n : content.replace(normalizedOld, newString);\n\n await fs.writeFile(absPath, updated, 'utf-8');\n const count = replaceAll ? (content.split(normalizedOld).length - 1) : 1;\n return `Replaced ${count} occurrence(s) in ${filePath}`;\n }\n}\n\n// ── File Delete ───────────────────────────────\n\nexport class FileDeleteTool extends BaseTool {\n readonly name = 'file_delete';\n readonly description = 'Delete a file or empty directory.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to delete (relative to workspace root)' },\n },\n required: ['path'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const filePath = input['path'] as string;\n const absPath = resolveInWorkspace(this.workspaceRoot, filePath);\n\n if (options.saveSnapshot) {\n try {\n const oldContent = await fs.readFile(absPath, 'utf-8');\n await options.saveSnapshot(absPath, oldContent);\n } catch {\n // Already gone or dir\n }\n }\n\n await fs.rm(absPath, { recursive: false });\n return `Deleted ${filePath}`;\n }\n}\n\n// ── File List ─────────────────────────────────\n\nexport class FileListTool extends BaseTool {\n readonly name = 'file_list';\n readonly description = 'List files and directories in a given path. Returns a list of filenames.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to list (relative to workspace root)' },\n },\n required: ['path'],\n };\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const inputPath = (input['path'] as string) || '.';\n const absPath = resolveInWorkspace(this.workspaceRoot, inputPath);\n\n const entries = await fs.readdir(absPath, { withFileTypes: true });\n return entries.map(e => `${e.isDirectory() ? '[DIR] ' : ' '}${e.name}`).join('\\n') || '(empty directory)';\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Git Tool\n// ─────────────────────────────────────────────\n\nimport { simpleGit, type SimpleGit } from 'simple-git';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nexport class GitTool extends BaseTool {\n readonly name = 'git';\n readonly description = 'Execute git operations: status, diff, log, add, commit, branch, push, pull.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n operation: {\n type: 'string',\n enum: ['status', 'diff', 'log', 'add', 'commit', 'branch', 'checkout', 'push', 'pull', 'stash'],\n description: 'Git operation to perform',\n },\n args: {\n type: 'array',\n items: { type: 'string' },\n description: 'Arguments for the git operation',\n },\n cwd: { type: 'string', description: 'Working directory (defaults to current)' },\n },\n required: ['operation'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const operation = input['operation'] as string;\n const args = (input['args'] as string[] | undefined) ?? [];\n const cwd = (input['cwd'] as string | undefined) ?? this.workspaceRoot;\n\n const git: SimpleGit = simpleGit(cwd);\n\n try {\n switch (operation) {\n case 'status': {\n const status = await git.status();\n return this.formatStatus(status);\n }\n case 'diff': {\n const diff = await git.diff(args);\n return diff || '(no changes)';\n }\n case 'log': {\n const log = await git.log(args.length ? { maxCount: parseInt(args[0] ?? '10', 10) } : { maxCount: 10 });\n return log.all.map((c) => `${c.hash.slice(0, 8)} ${c.date.slice(0, 10)} ${c.message}`).join('\\n');\n }\n case 'add': {\n await git.add(args.length ? args : ['.']);\n return 'Staged files';\n }\n case 'commit': {\n const msg = args[0] ?? 'Cascade AI commit';\n const result = await git.commit(msg);\n return `Committed: ${result.commit}`;\n }\n case 'branch': {\n const branches = await git.branch(args);\n return branches.all.join('\\n');\n }\n case 'checkout': {\n await git.checkout(args);\n return `Checked out ${args.join(' ')}`;\n }\n case 'push': {\n await git.push(args);\n return 'Pushed';\n }\n case 'pull': {\n const result = await git.pull();\n return `Pulled: ${result.summary.changes} changes`;\n }\n case 'stash': {\n await git.stash(args);\n return 'Stashed';\n }\n default:\n throw new Error(`Unknown git operation: ${operation}`);\n }\n } catch (err) {\n throw new Error(`git ${operation} failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n private formatStatus(status: Awaited<ReturnType<SimpleGit['status']>>): string {\n const lines: string[] = [];\n if (status.current) lines.push(`Branch: ${status.current}`);\n if (status.staged.length) lines.push(`Staged: ${status.staged.join(', ')}`);\n if (status.modified.length) lines.push(`Modified: ${status.modified.join(', ')}`);\n if (status.not_added.length) lines.push(`Untracked: ${status.not_added.join(', ')}`);\n if (status.deleted.length) lines.push(`Deleted: ${status.deleted.join(', ')}`);\n if (status.conflicted.length) lines.push(`Conflicts: ${status.conflicted.join(', ')}`);\n return lines.join('\\n') || 'Working tree clean';\n }\n}\n\n// ── Git Context Helper (injected into T1 system prompt) ──\n\nexport async function getGitContext(cwd: string): Promise<string> {\n try {\n const git = simpleGit(cwd);\n const [status, log] = await Promise.all([\n git.status(),\n git.log({ maxCount: 5 }),\n ]);\n\n const statusLines: string[] = [];\n if (status.current) statusLines.push(`Branch: ${status.current}`);\n if (status.staged.length) statusLines.push(`Staged: ${status.staged.join(', ')}`);\n if (status.modified.length) statusLines.push(`Modified: ${status.modified.join(', ')}`);\n if (status.not_added.length) statusLines.push(`Untracked: ${status.not_added.join(', ')}`);\n\n const recentCommits = log.all\n .map((c) => ` ${c.hash.slice(0, 8)} ${c.message}`)\n .join('\\n');\n\n return `Git status:\\n${statusLines.join('\\n')}\\n\\nRecent commits:\\n${recentCommits}`;\n } catch {\n return '';\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — GitHub / GitLab Tool\n// ─────────────────────────────────────────────\n\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\n/** Error thrown by the fetch helpers, carrying the HTTP status + parsed body. */\ninterface HttpError extends Error {\n status: number;\n data?: { message?: string } | unknown;\n}\n\nexport class GitHubTool extends BaseTool {\n readonly name = 'github';\n readonly description = 'Interact with GitHub or GitLab: create PRs, list issues, comment on issues.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n platform: { type: 'string', enum: ['github', 'gitlab'], description: 'Platform' },\n token: { type: 'string', description: 'API token (or read from env)' },\n operation: {\n type: 'string',\n enum: ['list_issues', 'create_pr', 'comment_issue', 'get_pr', 'list_prs'],\n },\n repo: { type: 'string', description: 'owner/repo format' },\n title: { type: 'string', description: 'PR title' },\n body: { type: 'string', description: 'PR/comment body' },\n head: { type: 'string', description: 'PR head branch' },\n base: { type: 'string', description: 'PR base branch (default: main)' },\n issue_number: { type: 'number', description: 'Issue or PR number' },\n },\n required: ['operation', 'repo'],\n };\n\n isDangerous(): boolean { return true; }\n\n // ── fetch helpers (replace axios) ──────────────\n private async request<T>(url: string, init: RequestInit): Promise<T> {\n const res = await fetch(url, init);\n const text = await res.text();\n let data: unknown;\n try { data = text ? JSON.parse(text) : undefined; } catch { data = text; }\n if (!res.ok) {\n const err = new Error(`HTTP ${res.status}`) as HttpError;\n err.status = res.status;\n err.data = data;\n throw err;\n }\n return data as T;\n }\n\n private apiGet<T>(url: string, headers: Record<string, string>): Promise<T> {\n return this.request<T>(url, { headers });\n }\n\n private apiPost<T>(url: string, body: unknown, headers: Record<string, string>): Promise<T> {\n return this.request<T>(url, {\n method: 'POST',\n headers: { ...headers, 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const platform = (input['platform'] as string | undefined) ?? 'github';\n const operation = input['operation'] as string;\n const repo = input['repo'] as string;\n\n // Resolve token per platform to avoid accidentally sending GITLAB_TOKEN to GitHub\n let token = input['token'] as string | undefined;\n if (!token) {\n if (platform === 'github') {\n token = process.env['GITHUB_TOKEN'];\n } else {\n token = process.env['GITLAB_TOKEN'];\n }\n }\n\n if (!token) {\n const envName = platform === 'github' ? 'GITHUB_TOKEN' : 'GITLAB_TOKEN';\n return `Error: No ${platform} token provided. Set the ${envName} environment variable or pass a \"token\" field in the input.`;\n }\n\n try {\n if (platform === 'github') {\n return await this.executeGitHub(operation, repo, token, input);\n }\n return await this.executeGitLab(operation, repo, token, input);\n } catch (err: unknown) {\n // Surface HTTP errors with actionable messages\n const httpErr = err as { status?: number; data?: { message?: string }; message?: string };\n if (httpErr?.status) {\n const status = httpErr.status;\n const msg = httpErr.data?.message ?? '';\n switch (status) {\n case 401: return `Authentication failed: Your ${platform} token is invalid or expired. Check your token and try again.`;\n case 403: return `Permission denied: Your ${platform} token lacks the required scopes for this operation. Needed: repo or workflow.`;\n case 404: return `Not found: Repository \"${repo}\" does not exist, or your token cannot access it.`;\n case 422: return `Validation error from ${platform}: ${msg || 'Check your input parameters (branch names, base/head refs, etc.).'}`;\n case 429: return `Rate limited by ${platform}. Please wait a moment before trying again.`;\n default: return `${platform} API error (${status}): ${msg || (httpErr.message ?? 'Unknown error')}`;\n }\n }\n return `${platform} request failed: ${httpErr.message ?? String(err)}`;\n }\n }\n\n private async executeGitHub(\n operation: string,\n repo: string,\n token: string,\n input: Record<string, unknown>,\n ): Promise<string> {\n const headers = {\n Authorization: `token ${token}`,\n Accept: 'application/vnd.github.v3+json',\n };\n const base = `https://api.github.com/repos/${repo}`;\n\n switch (operation) {\n case 'list_issues': {\n const data = await this.apiGet<Array<{ number: number; title: string; state: string }>>(`${base}/issues`, headers);\n return data.map((i) => `#${i.number} [${i.state}] ${i.title}`).join('\\n');\n }\n case 'list_prs': {\n const data = await this.apiGet<Array<{ number: number; title: string; state: string; head: { ref: string }; base: { ref: string } }>>(`${base}/pulls`, headers);\n return data.map((p) => `#${p.number} [${p.state}] ${p.title} (${p.head.ref} → ${p.base.ref})`).join('\\n');\n }\n case 'create_pr': {\n const data = await this.apiPost<{ number: number; html_url: string }>(`${base}/pulls`, {\n title: input['title'],\n body: input['body'] ?? '',\n head: input['head'],\n base: input['base'] ?? 'main',\n }, headers);\n return `Created PR #${data.number}: ${data.html_url}`;\n }\n case 'comment_issue': {\n const num = input['issue_number'] as number;\n await this.apiPost(`${base}/issues/${num}/comments`, { body: input['body'] }, headers);\n return `Comment added to #${num}`;\n }\n case 'get_pr': {\n const num = input['issue_number'] as number;\n const data = await this.apiGet<{ title: string; state: string; body: string; html_url: string }>(`${base}/pulls/${num}`, headers);\n return `PR #${num}: ${data.title}\\nState: ${data.state}\\n${data.html_url}\\n\\n${data.body}`;\n }\n default:\n throw new Error(`Unknown GitHub operation: ${operation}`);\n }\n }\n\n private async executeGitLab(\n operation: string,\n repo: string,\n token: string,\n input: Record<string, unknown>,\n ): Promise<string> {\n const encodedRepo = encodeURIComponent(repo);\n const headers = { 'PRIVATE-TOKEN': token };\n const base = `https://gitlab.com/api/v4/projects/${encodedRepo}`;\n\n switch (operation) {\n case 'list_issues': {\n const data = await this.apiGet<Array<{ iid: number; title: string; state: string }>>(`${base}/issues`, headers);\n return data.map((i) => `#${i.iid} [${i.state}] ${i.title}`).join('\\n');\n }\n case 'create_pr': {\n const data = await this.apiPost<{ iid: number; web_url: string }>(`${base}/merge_requests`, {\n title: input['title'],\n description: input['body'] ?? '',\n source_branch: input['head'],\n target_branch: input['base'] ?? 'main',\n }, headers);\n return `Created MR !${data.iid}: ${data.web_url}`;\n }\n case 'list_prs': {\n const data = await this.apiGet<Array<{ iid: number; title: string; state: string; source_branch: string; target_branch: string }>>(`${base}/merge_requests`, headers);\n return data.map((p) => `!${p.iid} [${p.state}] ${p.title} (${p.source_branch} → ${p.target_branch})`).join('\\n');\n }\n case 'comment_issue': {\n const num = input['issue_number'] as number;\n await this.apiPost(`${base}/issues/${num}/notes`, { body: input['body'] }, headers);\n return `Comment added to #${num}`;\n }\n case 'get_pr': {\n const num = input['issue_number'] as number;\n const data = await this.apiGet<{ title: string; state: string; description: string; web_url: string }>(`${base}/merge_requests/${num}`, headers);\n return `MR !${num}: ${data.title}\\nState: ${data.state}\\n${data.web_url}\\n\\n${data.description}`;\n }\n default:\n throw new Error(`GitLab operation not supported: ${operation}`);\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Browser Automation Tool (T3 + multimodal only)\n// ─────────────────────────────────────────────\n\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nconst BROWSER_LAUNCH_TIMEOUT_MS = 15_000;\n\nexport class BrowserTool extends BaseTool {\n readonly name = 'browser';\n readonly description = 'Control a browser: navigate to URLs, click elements, fill forms, take screenshots. Only available with multimodal models.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['navigate', 'click', 'fill', 'screenshot', 'evaluate', 'extract_text', 'wait', 'close'],\n },\n url: { type: 'string', description: 'URL to navigate to' },\n selector: { type: 'string', description: 'CSS selector for click/fill' },\n value: { type: 'string', description: 'Value for fill action' },\n script: { type: 'string', description: 'JavaScript for evaluate action' },\n timeout: { type: 'number', description: 'Timeout ms (default 10000)' },\n },\n required: ['action'],\n };\n\n private browser: import('playwright').Browser | null = null;\n private page: import('playwright').Page | null = null;\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n let playwright: typeof import('playwright');\n try {\n playwright = await import('playwright');\n } catch {\n return 'Error: Playwright is not installed. Run: npm install playwright && npx playwright install chromium';\n }\n\n const action = input['action'] as string;\n const timeout = (input['timeout'] as number | undefined) ?? 10_000;\n\n // Allow explicit close action to clean up\n if (action === 'close') {\n await this.close();\n return 'Browser closed.';\n }\n\n // Lazy-initialize browser with a launch timeout\n if (!this.browser || !this.page) {\n await this.close(); // clean up any partial state\n\n const launchPromise = playwright.chromium.launch({ headless: true });\n const timeoutPromise = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(`Browser launch timed out after ${BROWSER_LAUNCH_TIMEOUT_MS}ms. Is Chromium installed? Run: npx playwright install chromium`)), BROWSER_LAUNCH_TIMEOUT_MS),\n );\n\n try {\n this.browser = await Promise.race([launchPromise, timeoutPromise]);\n this.page = await this.browser.newPage();\n } catch (err) {\n this.browser = null;\n this.page = null;\n return `Browser launch failed: ${err instanceof Error ? err.message : String(err)}`;\n }\n }\n\n const page = this.page;\n\n try {\n switch (action) {\n case 'navigate': {\n await page.goto(input['url'] as string, { timeout });\n const title = await page.title();\n return `Navigated to ${input['url']} (title: \"${title}\")`;\n }\n case 'click': {\n await page.click(input['selector'] as string, { timeout });\n return `Clicked ${input['selector']}`;\n }\n case 'fill': {\n await page.fill(input['selector'] as string, input['value'] as string);\n return `Filled ${input['selector']} with value`;\n }\n case 'screenshot': {\n const buf = await page.screenshot({ type: 'png' });\n return `data:image/png;base64,${buf.toString('base64')}`;\n }\n case 'evaluate': {\n const result = await page.evaluate(input['script'] as string);\n return JSON.stringify(result);\n }\n case 'extract_text': {\n const text = await page.locator('body').innerText();\n return text.slice(0, 10_000);\n }\n case 'wait': {\n await page.waitForTimeout(timeout);\n return `Waited ${timeout}ms`;\n }\n default:\n return `Unknown browser action: ${action}. Supported: navigate, click, fill, screenshot, evaluate, extract_text, wait, close`;\n }\n } catch (err) {\n // If the page crashed or navigated away mid-action, reset so next call re-initializes\n const errMsg = err instanceof Error ? err.message : String(err);\n if (/Target closed|Page crashed|Navigation failed/i.test(errMsg)) {\n await this.close();\n return `Browser error (page reset): ${errMsg}`;\n }\n return `Browser action \"${action}\" failed: ${errMsg}`;\n }\n }\n\n async close(): Promise<void> {\n try {\n if (this.page) {\n await this.page.close().catch(() => {});\n this.page = null;\n }\n if (this.browser) {\n await this.browser.close().catch(() => {});\n this.browser = null;\n }\n } catch {\n // Swallow errors on cleanup — the browser may already be dead\n this.browser = null;\n this.page = null;\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Image Analysis Tool\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { ImageAttachment, ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nexport class ImageAnalyzeTool extends BaseTool {\n readonly name = 'image_analyze';\n readonly description = 'Analyze an image file and describe its contents. Only available when using a vision-capable model.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to the image file' },\n prompt: { type: 'string', description: 'What to look for or ask about the image' },\n },\n required: ['path'],\n };\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const filePath = input['path'] as string;\n const prompt = (input['prompt'] as string | undefined) ?? 'Describe this image in detail.';\n\n const attachment = await fileToImageAttachment(filePath);\n\n // Return the image as base64 + prompt — the calling T3 worker will\n // include this in its next message to the vision-capable model\n return JSON.stringify({\n __cascade_image_request: true,\n attachment,\n prompt,\n });\n }\n}\n\nexport async function fileToImageAttachment(filePath: string): Promise<ImageAttachment> {\n const data = await fs.readFile(filePath);\n const ext = path.extname(filePath).toLowerCase();\n const mimeMap: Record<string, ImageAttachment['mimeType']> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n };\n const mimeType = mimeMap[ext] ?? 'image/jpeg';\n\n return {\n type: 'base64',\n data: data.toString('base64'),\n mimeType,\n };\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — PDF Tool\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport PDFDocument from 'pdfkit';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nexport class PDFCreateTool extends BaseTool {\n readonly name = 'pdf_create';\n readonly description = 'Create a PDF document from text or markdown. Supports basic formatting and auto-pagination.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to save the PDF file' },\n content: { type: 'string', description: 'The text or markdown content to include in the PDF' },\n title: { type: 'string', description: 'Optional title for the document' },\n },\n required: ['path', 'content'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const filePath = input['path'] as string;\n const content = input['content'] as string;\n const title = input['title'] as string | undefined;\n\n // Ensure directory exists\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n return new Promise((resolve, reject) => {\n try {\n const doc = new PDFDocument({ margin: 50 });\n const stream = fs.createWriteStream(filePath);\n\n doc.pipe(stream);\n\n // Metadata\n if (title) {\n doc.info['Title'] = title;\n doc.fontSize(24).text(title, { align: 'center' });\n doc.moveDown();\n }\n\n // Content\n doc.fontSize(12).text(content, {\n align: 'justify',\n indent: 20,\n paragraphGap: 10,\n lineGap: 5,\n });\n\n doc.end();\n\n stream.on('finish', () => {\n resolve(`Successfully created PDF at ${filePath} (${content.length} characters)`);\n });\n\n stream.on('error', (err) => {\n reject(new Error(`Failed to write PDF: ${err.message}`));\n });\n } catch (err) {\n reject(err);\n }\n });\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Code Interpreter Tool\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { execFile, execSync } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\n/** Detect the first available command from a candidate list. Returns null if none found. */\nfunction detectCommand(candidates: string[]): string | null {\n for (const cmd of candidates) {\n try {\n // `where` on Windows, `which` on Unix — both exit non-zero if not found\n const which = process.platform === 'win32' ? 'where' : 'which';\n execSync(`${which} ${cmd}`, { stdio: 'ignore' });\n return cmd;\n } catch {\n // command not found, try next\n }\n }\n return null;\n}\n\n// Detect Python and Node at module load time to avoid repeated PATH scans\nconst PYTHON_CMD = detectCommand(['python3', 'python']);\nconst NODE_CMD = detectCommand(['node']);\n\nexport class CodeInterpreterTool extends BaseTool {\n readonly name = 'run_code';\n readonly description = 'Execute a Python or Node.js script to perform complex tasks (data processing, file conversion, etc.). The script is automatically cleaned up after execution.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n language: { type: 'string', enum: ['python', 'nodejs'], description: 'Programming language of the script' },\n code: { type: 'string', description: 'The complete source code to execute' },\n args: { type: 'array', items: { type: 'string' }, description: 'Command line arguments for the script' },\n },\n required: ['language', 'code'],\n };\n\n isDangerous(): boolean { return true; }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const language = input['language'] as 'python' | 'nodejs';\n const code = input['code'] as string;\n const args = (input['args'] as string[]) ?? [];\n\n // Resolve interpreter command\n let cmdPrefix: string;\n if (language === 'python') {\n if (!PYTHON_CMD) {\n return [\n 'Error: Python interpreter not found.',\n 'Please install Python and ensure it is in your PATH.',\n 'Tried: python3, python',\n ].join('\\n');\n }\n cmdPrefix = PYTHON_CMD;\n } else {\n if (!NODE_CMD) {\n return [\n 'Error: Node.js interpreter not found.',\n 'Please install Node.js and ensure it is in your PATH.',\n 'Tried: node',\n ].join('\\n');\n }\n cmdPrefix = NODE_CMD;\n }\n\n // Setup temporary directory structure in .cascade/tmp\n const tmpDir = path.join(this.workspaceRoot, '.cascade', 'tmp');\n if (!fs.existsSync(tmpDir)) {\n fs.mkdirSync(tmpDir, { recursive: true });\n }\n\n const extension = language === 'python' ? 'py' : 'js';\n const fileName = `intp_${randomUUID().slice(0, 8)}.${extension}`;\n const filePath = path.join(tmpDir, fileName);\n\n // 1. Write the script\n fs.writeFileSync(filePath, code, 'utf-8');\n\n // 2. Execute via execFile with an argv array — the interpreter and its\n // arguments are passed directly to the OS, never through a shell, so a\n // value like `\"; rm -rf ~ #` in `args` is an inert string rather than a\n // second command. (Previously these were string-interpolated into an\n // `exec` command line.)\n const execArgs = [filePath, ...args];\n\n // 3. Execute\n return new Promise((resolve) => {\n const startMs = Date.now();\n execFile(cmdPrefix, execArgs, { cwd: this.workspaceRoot, timeout: 30000 }, (error, stdout, stderr) => {\n const duration = Date.now() - startMs;\n\n // 4. Cleanup (Always delete the script from the filesystem)\n try {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n } catch (cleanupErr) {\n console.error(`Failed to cleanup interpreter script ${filePath}:`, cleanupErr);\n }\n\n if (error) {\n const timedOut = error.killed && duration >= 30000;\n if (timedOut) {\n resolve(`Execution timed out after 30s. Consider breaking the task into smaller pieces.\\nPartial stdout: ${stdout}\\nStderr: ${stderr}`);\n } else {\n resolve(`Execution failed (${duration}ms):\\nError: ${error.message}\\nStderr: ${stderr}\\nStdout: ${stdout}`);\n }\n } else {\n resolve(`Execution successful (${duration}ms):\\nStdout: ${stdout}\\nStderr: ${stderr}`);\n }\n });\n });\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Peer Communication Tool\n// ─────────────────────────────────────────────\n\nimport { BaseTool } from './base.js';\nimport type { PeerSyncType, ToolExecuteOptions } from '../types.js';\n\nexport class PeerCommunicationTool extends BaseTool {\n readonly name = 'peer_message';\n readonly description = 'Communicate with peer agents in the same tier or level. Use this to sync outputs, request data, or signal completion of a dependency.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['send', 'receive'],\n description: 'Whether to send a message to a peer or retrieve pending messages from all peers.'\n },\n toId: {\n type: 'string',\n description: 'The ID of the recipient peer (required for action=\"send\").'\n },\n messageType: {\n type: 'string',\n enum: ['SHARE_OUTPUT', 'RESOLVE_CONFLICT', 'DIVIDE_WORK', 'CHECK_ASSUMPTION', 'SIGNAL_READY'],\n description: 'The category of the peer message.'\n },\n content: {\n type: 'string',\n description: 'The text content or JSON string of the message.'\n }\n },\n required: ['action']\n };\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const action = input.action as 'send' | 'receive';\n\n if (action === 'send') {\n const toId = input.toId as string;\n const messageType = ((input.messageType as PeerSyncType | undefined) ?? 'SHARE_OUTPUT');\n const content = input.content as string;\n\n if (!toId) return 'Error: toId is required when action is \"send\"';\n if (!options.sendPeerSync) return 'Error: Peer communication is not enabled for this agent.';\n\n options.sendPeerSync(toId, messageType, content);\n return `Successfully sent ${messageType} message to peer ${toId}.`;\n }\n\n if (action === 'receive') {\n if (!options.getPeerMessages) return 'Error: Peer communication is not enabled for this agent.';\n const messages = options.getPeerMessages();\n\n if (messages.length === 0) {\n return 'No new messages from peers.';\n }\n\n const formatted = messages.map(m => `[From ${m.fromId} at ${m.timestamp}]: ${typeof m.content === 'string' ? m.content : JSON.stringify(m.content)}`).join('\\n---\\n');\n return `Received ${messages.length} peer messages:\\n\\n${formatted}`;\n }\n\n return `Unknown action: ${action}`;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Web Search Tool\n// ─────────────────────────────────────────────\n//\n// Supports multiple backends in priority order:\n// 1. SearXNG (self-hosted, primary)\n// 2. Brave Search API\n// 3. Tavily API\n// 4. DuckDuckGo Lite (no API key needed, last resort)\n//\n// Configuration (env vars or config.json tools.webSearch):\n// SEARXNG_URL — Base URL of your SearXNG instance\n// BRAVE_SEARCH_API_KEY — Brave Search API key\n// TAVILY_API_KEY — Tavily API key\n//\n// DuckDuckGo Lite is always available as a final fallback.\n// ─────────────────────────────────────────────\n\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nexport interface WebSearchResult {\n title: string;\n url: string;\n snippet: string;\n engine?: string;\n}\n\nexport interface WebSearchConfig {\n /** Base URL of a SearXNG instance e.g. https://searx.example.com */\n searxngUrl?: string;\n /** Brave Search API key */\n braveApiKey?: string;\n /** Tavily API key */\n tavilyApiKey?: string;\n /** Max number of results to return (default: 5) */\n maxResults?: number;\n}\n\n// ── SearXNG ───────────────────────────────────\n\nasync function searchSearXNG(\n query: string,\n baseUrl: string,\n maxResults: number,\n): Promise<WebSearchResult[]> {\n const url = new URL('/search', baseUrl);\n url.searchParams.set('q', query);\n url.searchParams.set('format', 'json');\n url.searchParams.set('categories', 'general');\n url.searchParams.set('engines', 'google,bing,duckduckgo');\n\n const resp = await fetch(url.toString(), {\n headers: { 'User-Agent': 'Cascade-AI/1.0 WebSearchTool' },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!resp.ok) {\n throw new Error(`SearXNG returned HTTP ${resp.status}`);\n }\n\n const data = await resp.json() as {\n results?: Array<{ title?: string; url?: string; content?: string; engine?: string }>;\n };\n\n return (data.results ?? [])\n .filter((r) => r.url && r.title)\n .slice(0, maxResults)\n .map((r) => ({\n title: r.title ?? '',\n url: r.url ?? '',\n snippet: r.content ?? '',\n engine: `searxng(${r.engine ?? 'unknown'})`,\n }));\n}\n\n// ── Brave Search ─────────────────────────────\n\nasync function searchBrave(\n query: string,\n apiKey: string,\n maxResults: number,\n): Promise<WebSearchResult[]> {\n const url = `https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=${maxResults}&safesearch=off`;\n const resp = await fetch(url, {\n headers: {\n 'Accept': 'application/json',\n 'Accept-Encoding': 'gzip',\n 'X-Subscription-Token': apiKey,\n },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!resp.ok) {\n throw new Error(`Brave Search returned HTTP ${resp.status}`);\n }\n\n const data = await resp.json() as {\n web?: {\n results?: Array<{ title?: string; url?: string; description?: string }>;\n };\n };\n\n return (data.web?.results ?? [])\n .filter((r) => r.url && r.title)\n .slice(0, maxResults)\n .map((r) => ({\n title: r.title ?? '',\n url: r.url ?? '',\n snippet: r.description ?? '',\n engine: 'brave',\n }));\n}\n\n// ── Tavily ────────────────────────────────────\n\nasync function searchTavily(\n query: string,\n apiKey: string,\n maxResults: number,\n): Promise<WebSearchResult[]> {\n const resp = await fetch('https://api.tavily.com/search', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n query,\n max_results: maxResults,\n search_depth: 'basic',\n include_answer: false,\n include_raw_content: false,\n }),\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!resp.ok) {\n throw new Error(`Tavily returned HTTP ${resp.status}`);\n }\n\n const data = await resp.json() as {\n results?: Array<{ title?: string; url?: string; content?: string; score?: number }>;\n };\n\n return (data.results ?? [])\n .filter((r) => r.url && r.title)\n .slice(0, maxResults)\n .map((r) => ({\n title: r.title ?? '',\n url: r.url ?? '',\n snippet: r.content ?? '',\n engine: 'tavily',\n }));\n}\n\n// ── DuckDuckGo Lite (no key required, last resort) ───────────────────\n\nasync function searchDuckDuckGoLite(\n query: string,\n maxResults: number,\n): Promise<WebSearchResult[]> {\n // DuckDuckGo Lite returns an HTML page — we parse key `<a>` tags\n const resp = await fetch(`https://lite.duckduckgo.com/lite/?q=${encodeURIComponent(query)}`, {\n headers: { 'User-Agent': 'Mozilla/5.0 (compatible; Cascade-AI/1.0)' },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!resp.ok) throw new Error(`DuckDuckGo Lite returned HTTP ${resp.status}`);\n\n const html = await resp.text();\n\n // Extract result links from the lite HTML (result links follow a predictable pattern)\n const linkPattern = /<a[^>]+class=\"result-link\"[^>]+href=\"([^\"]+)\"[^>]*>([^<]+)<\\/a>/g;\n const snippetPattern = /<td[^>]+class=\"result-snippet\"[^>]*>([\\s\\S]*?)<\\/td>/g;\n\n const links: Array<{ url: string; title: string }> = [];\n const snippets: string[] = [];\n\n let m: RegExpExecArray | null;\n while ((m = linkPattern.exec(html)) !== null) {\n links.push({ url: m[1]!, title: m[2]!.trim() });\n }\n while ((m = snippetPattern.exec(html)) !== null) {\n snippets.push(m[1]!.replace(/<[^>]+>/g, '').trim());\n }\n\n return links.slice(0, maxResults).map((link, i) => ({\n title: link.title,\n url: link.url,\n snippet: snippets[i] ?? '',\n engine: 'duckduckgo-lite',\n }));\n}\n\n// ── WebSearchTool ────────────────────────────\n\nexport class WebSearchTool extends BaseTool {\n readonly name = 'web_search';\n readonly description =\n 'Search the web for current information, news, documentation, or any topic. Returns a list of relevant results with titles, URLs, and snippets.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'The search query' },\n maxResults: { type: 'number', description: 'Number of results to return (default: 5, max: 10)' },\n },\n required: ['query'],\n };\n\n private config: WebSearchConfig;\n\n constructor(config: WebSearchConfig = {}) {\n super();\n this.config = {\n searxngUrl: config.searxngUrl ?? process.env['SEARXNG_URL'],\n braveApiKey: config.braveApiKey ?? process.env['BRAVE_SEARCH_API_KEY'],\n tavilyApiKey: config.tavilyApiKey ?? process.env['TAVILY_API_KEY'],\n maxResults: config.maxResults ?? 5,\n };\n }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const query = input['query'] as string;\n if (!query?.trim()) return 'Error: query is required and must be non-empty.';\n\n const maxResults = Math.min(\n (input['maxResults'] as number | undefined) ?? this.config.maxResults ?? 5,\n 10,\n );\n\n const errors: string[] = [];\n let results: WebSearchResult[] = [];\n\n // ── 1. SearXNG (preferred — self-hosted, privacy-preserving) ──────────\n if (this.config.searxngUrl) {\n try {\n results = await searchSearXNG(query, this.config.searxngUrl, maxResults);\n if (results.length > 0) return this.formatResults(query, results);\n errors.push('SearXNG: returned 0 results');\n } catch (err) {\n errors.push(`SearXNG: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // ── 2. Brave Search ───────────────────────────────────────────────────\n if (this.config.braveApiKey) {\n try {\n results = await searchBrave(query, this.config.braveApiKey, maxResults);\n if (results.length > 0) return this.formatResults(query, results);\n errors.push('Brave: returned 0 results');\n } catch (err) {\n errors.push(`Brave: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // ── 3. Tavily ─────────────────────────────────────────────────────────\n if (this.config.tavilyApiKey) {\n try {\n results = await searchTavily(query, this.config.tavilyApiKey, maxResults);\n if (results.length > 0) return this.formatResults(query, results);\n errors.push('Tavily: returned 0 results');\n } catch (err) {\n errors.push(`Tavily: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // ── 4. DuckDuckGo Lite (always available, no key needed) ─────────────\n try {\n results = await searchDuckDuckGoLite(query, maxResults);\n if (results.length > 0) return this.formatResults(query, results);\n errors.push('DuckDuckGo Lite: returned 0 results');\n } catch (err) {\n errors.push(`DuckDuckGo Lite: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // All backends failed\n const configHint = !this.config.searxngUrl && !this.config.braveApiKey && !this.config.tavilyApiKey\n ? '\\nTip: Configure a search backend for better results:\\n • Self-hosted: set SEARXNG_URL in your environment\\n • Brave Search API: set BRAVE_SEARCH_API_KEY\\n • Tavily API: set TAVILY_API_KEY'\n : '';\n\n return [\n `Web search for \"${query}\" failed across all backends:`,\n ...errors.map((e) => ` • ${e}`),\n configHint,\n ].join('\\n');\n }\n\n private formatResults(query: string, results: WebSearchResult[]): string {\n const lines = [`Web search results for: \"${query}\"`, ''];\n for (let i = 0; i < results.length; i++) {\n const r = results[i]!;\n lines.push(`[${i + 1}] ${r.title}`);\n lines.push(` URL: ${r.url}`);\n if (r.snippet) lines.push(` ${r.snippet.slice(0, 300)}`);\n if (r.engine) lines.push(` Source: ${r.engine}`);\n lines.push('');\n }\n return lines.join('\\n');\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Glob Tool\n// ─────────────────────────────────────────────\n\nimport { glob } from 'glob';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nexport class GlobTool extends BaseTool {\n readonly name = 'glob';\n readonly description =\n 'Fast file pattern matching. Returns file paths matching a glob pattern, sorted by modification time. Use this to find files by name patterns.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'Glob pattern to match files against, e.g. \"**/*.ts\", \"src/**/*.tsx\"',\n },\n path: {\n type: 'string',\n description: 'Directory to search in. Defaults to the workspace root.',\n },\n },\n required: ['pattern'],\n };\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const pattern = input['pattern'] as string;\n const searchPath = (input['path'] as string | undefined)\n ? path.resolve(this.workspaceRoot, input['path'] as string)\n : this.workspaceRoot;\n\n const matches = await glob(pattern, {\n cwd: searchPath,\n ignore: ['node_modules/**', '.git/**', 'dist/**', 'build/**'],\n nodir: true,\n dot: false,\n });\n\n if (matches.length === 0) {\n return `No files matched pattern: ${pattern}`;\n }\n\n // Sort by modification time (most recently modified first)\n const withMtime: Array<{ rel: string; mtime: number }> = await Promise.all(\n matches.map(async (rel) => {\n try {\n const stat = await fs.stat(path.join(searchPath, rel));\n return { rel, mtime: stat.mtimeMs };\n } catch {\n return { rel, mtime: 0 };\n }\n }),\n );\n withMtime.sort((a, b) => b.mtime - a.mtime);\n\n const lines = withMtime.map((f) => f.rel);\n return lines.join('\\n');\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Grep Tool\n// ─────────────────────────────────────────────\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { glob } from 'glob';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport class GrepTool extends BaseTool {\n readonly name = 'grep';\n readonly description =\n 'Search file contents using a regex pattern. Returns matching lines with file paths and line numbers. Tries ripgrep (rg) first, falls back to Node.js regex scan.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'Regular expression pattern to search for in file contents',\n },\n path: {\n type: 'string',\n description: 'File or directory to search in. Defaults to workspace root.',\n },\n glob: {\n type: 'string',\n description: 'Glob pattern to filter files, e.g. \"*.ts\", \"**/*.tsx\"',\n },\n output_mode: {\n type: 'string',\n enum: ['content', 'files_with_matches', 'count'],\n description:\n '\"content\" shows matching lines (default), \"files_with_matches\" shows file paths only, \"count\" shows match counts',\n },\n context: {\n type: 'number',\n description: 'Lines of context around each match (content mode only). Default: 0.',\n },\n case_insensitive: {\n type: 'boolean',\n description: 'Case-insensitive search. Default: false.',\n },\n },\n required: ['pattern'],\n };\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const pattern = input['pattern'] as string;\n const searchPath = (input['path'] as string | undefined)\n ? path.resolve(this.workspaceRoot, input['path'] as string)\n : this.workspaceRoot;\n const globPattern = input['glob'] as string | undefined;\n const outputMode = (input['output_mode'] as string | undefined) ?? 'content';\n const context = (input['context'] as number | undefined) ?? 0;\n const caseInsensitive = (input['case_insensitive'] as boolean | undefined) ?? false;\n\n // Try ripgrep first\n try {\n const result = await this.runRipgrep(\n pattern,\n searchPath,\n globPattern,\n outputMode,\n context,\n caseInsensitive,\n );\n return result;\n } catch {\n // ripgrep not available — fall back to Node.js scan\n }\n\n return this.nodeScan(pattern, searchPath, globPattern, outputMode, context, caseInsensitive);\n }\n\n private async runRipgrep(\n pattern: string,\n searchPath: string,\n globPattern: string | undefined,\n outputMode: string,\n context: number,\n caseInsensitive: boolean,\n ): Promise<string> {\n const args: string[] = ['--no-heading'];\n if (caseInsensitive) args.push('-i');\n if (outputMode === 'files_with_matches') args.push('-l');\n else if (outputMode === 'count') args.push('-c');\n else {\n args.push('-n'); // line numbers\n if (context > 0) args.push(`-C${context}`);\n }\n if (globPattern) args.push('--glob', globPattern);\n args.push('--', pattern, searchPath);\n\n const { stdout } = await execFileAsync('rg', args, {\n timeout: 15_000,\n maxBuffer: 2 * 1024 * 1024,\n });\n\n const trimmed = stdout.trim();\n return trimmed || `No matches found for: ${pattern}`;\n }\n\n private async nodeScan(\n pattern: string,\n searchPath: string,\n globPattern: string | undefined,\n outputMode: string,\n context: number,\n caseInsensitive: boolean,\n ): Promise<string> {\n const flags = caseInsensitive ? 'gi' : 'g';\n let regex: RegExp;\n try {\n regex = new RegExp(pattern, flags);\n } catch {\n return `Invalid regex pattern: ${pattern}`;\n }\n\n const fileGlob = globPattern ?? '**/*';\n let files: string[];\n try {\n files = await glob(fileGlob, {\n cwd: searchPath,\n ignore: ['node_modules/**', '.git/**', 'dist/**', 'build/**'],\n nodir: true,\n });\n } catch {\n // If searchPath is a single file\n files = [path.relative(searchPath, searchPath) || '.'];\n }\n\n const results: string[] = [];\n let totalCount = 0;\n\n for (const rel of files) {\n const abs = path.join(searchPath, rel);\n let content: string;\n try {\n content = await fs.readFile(abs, 'utf-8');\n } catch {\n continue;\n }\n\n const lines = content.split('\\n');\n const matchingLines: number[] = [];\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i])) matchingLines.push(i);\n regex.lastIndex = 0;\n }\n\n if (matchingLines.length === 0) continue;\n totalCount += matchingLines.length;\n\n if (outputMode === 'files_with_matches') {\n results.push(rel);\n } else if (outputMode === 'count') {\n results.push(`${rel}: ${matchingLines.length}`);\n } else {\n const shown = new Set<number>();\n for (const lineIdx of matchingLines) {\n const start = Math.max(0, lineIdx - context);\n const end = Math.min(lines.length - 1, lineIdx + context);\n for (let i = start; i <= end; i++) shown.add(i);\n }\n const sortedIdxs = [...shown].sort((a, b) => a - b);\n for (const i of sortedIdxs) {\n const marker = matchingLines.includes(i) ? ':' : '-';\n results.push(`${rel}:${i + 1}${marker}${lines[i]}`);\n }\n }\n }\n\n if (results.length === 0) return `No matches found for: ${pattern}`;\n if (outputMode === 'count') {\n results.push(`\\nTotal: ${totalCount} matches`);\n }\n return results.join('\\n');\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — SSRF-safe fetch helper\n// ─────────────────────────────────────────────\n//\n// Agent-controlled URLs (web_fetch, runtime-generated tools) must not be\n// allowed to reach the loopback interface, link-local cloud metadata\n// endpoints, or private RFC-1918 networks. A prompt-injected page could\n// otherwise instruct the agent to fetch http://169.254.169.254/ and exfiltrate\n// cloud credentials, or pivot to internal services that trust the host.\n//\n// This helper validates the scheme, resolves the hostname, rejects any\n// non-public address, and follows redirects MANUALLY so each hop is\n// re-validated (a public URL cannot 302 you to an internal one).\n//\n// Set CASCADE_ALLOW_LOCAL_FETCH=1 to opt out (e.g. fetching local dev docs).\n\nimport dns from 'node:dns/promises';\nimport net from 'node:net';\n\nexport class SsrfBlockedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SsrfBlockedError';\n }\n}\n\nconst ALLOWED_PROTOCOLS = new Set(['http:', 'https:']);\nconst MAX_REDIRECTS = 5;\n\nfunction allowLocal(): boolean {\n return process.env['CASCADE_ALLOW_LOCAL_FETCH'] === '1';\n}\n\n/** True for loopback, link-local, private, and other non-routable ranges. */\nexport function isPrivateAddress(ip: string): boolean {\n const type = net.isIP(ip);\n if (type === 4) return isPrivateIPv4(ip);\n if (type === 6) return isPrivateIPv6(ip);\n // Not a literal IP — caller resolves DNS first, so treat unknown as unsafe.\n return true;\n}\n\nfunction isPrivateIPv4(ip: string): boolean {\n const parts = ip.split('.').map((p) => Number(p));\n if (parts.length !== 4 || parts.some((p) => Number.isNaN(p) || p < 0 || p > 255)) return true;\n const [a, b] = parts as [number, number, number, number];\n if (a === 0) return true; // 0.0.0.0/8\n if (a === 10) return true; // 10.0.0.0/8 private\n if (a === 127) return true; // 127.0.0.0/8 loopback\n if (a === 169 && b === 254) return true; // 169.254.0.0/16 link-local (cloud metadata)\n if (a === 172 && b >= 16 && b <= 31) return true; // 172.16.0.0/12 private\n if (a === 192 && b === 168) return true; // 192.168.0.0/16 private\n if (a === 100 && b >= 64 && b <= 127) return true; // 100.64.0.0/10 CGNAT\n if (a >= 224) return true; // multicast / reserved\n return false;\n}\n\nfunction isPrivateIPv6(ip: string): boolean {\n const lower = ip.toLowerCase().replace(/^\\[|\\]$/g, '');\n if (lower === '::1' || lower === '::') return true; // loopback / unspecified\n if (lower.startsWith('fe80')) return true; // link-local\n if (lower.startsWith('fc') || lower.startsWith('fd')) return true; // unique-local\n // IPv4-mapped (::ffff:a.b.c.d) — validate the embedded v4 address.\n const mapped = /^::ffff:(\\d+\\.\\d+\\.\\d+\\.\\d+)$/.exec(lower);\n if (mapped) return isPrivateIPv4(mapped[1]!);\n return false;\n}\n\n/**\n * Validate that `rawUrl` is an http(s) URL whose host resolves only to public\n * addresses. Throws SsrfBlockedError otherwise. Returns the parsed URL.\n */\nexport async function assertPublicUrl(rawUrl: string): Promise<URL> {\n let url: URL;\n try {\n url = new URL(rawUrl);\n } catch {\n throw new SsrfBlockedError(`Invalid URL: ${rawUrl}`);\n }\n\n if (!ALLOWED_PROTOCOLS.has(url.protocol)) {\n throw new SsrfBlockedError(`Blocked URL scheme \"${url.protocol}\" — only http and https are allowed.`);\n }\n\n if (allowLocal()) return url;\n\n const host = url.hostname.replace(/^\\[|\\]$/g, '');\n\n // Literal IP in the URL — check directly, no DNS.\n if (net.isIP(host)) {\n if (isPrivateAddress(host)) {\n throw new SsrfBlockedError(`Blocked request to non-public address ${host}.`);\n }\n return url;\n }\n\n // Obvious local hostnames.\n if (host === 'localhost' || host.endsWith('.localhost') || host.endsWith('.local')) {\n throw new SsrfBlockedError(`Blocked request to local hostname \"${host}\".`);\n }\n\n // Resolve and reject if ANY resolved address is private.\n let addresses: string[];\n try {\n const records = await dns.lookup(host, { all: true });\n addresses = records.map((r) => r.address);\n } catch {\n throw new SsrfBlockedError(`Could not resolve host \"${host}\".`);\n }\n if (addresses.length === 0 || addresses.some((addr) => isPrivateAddress(addr))) {\n throw new SsrfBlockedError(`Blocked request to \"${host}\" — resolves to a non-public address.`);\n }\n\n return url;\n}\n\n/**\n * SSRF-safe fetch. Validates the initial URL and every redirect hop against\n * {@link assertPublicUrl}. Drop-in for `fetch` for agent-supplied URLs.\n */\nexport async function safeFetch(rawUrl: string, init: RequestInit = {}): Promise<Response> {\n let currentUrl = (await assertPublicUrl(rawUrl)).toString();\n\n for (let i = 0; i <= MAX_REDIRECTS; i++) {\n const resp = await fetch(currentUrl, { ...init, redirect: 'manual' });\n\n // Not a redirect — return as-is.\n if (resp.status < 300 || resp.status >= 400) return resp;\n\n const location = resp.headers.get('location');\n if (!location) return resp;\n\n const next = new URL(location, currentUrl);\n await assertPublicUrl(next.toString()); // re-validate each hop\n currentUrl = next.toString();\n }\n\n throw new SsrfBlockedError(`Too many redirects (>${MAX_REDIRECTS}).`);\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Web Fetch Tool\n// ─────────────────────────────────────────────\n\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\nimport { safeFetch, SsrfBlockedError } from './utils/safe-fetch.js';\n\nconst MAX_CHARS = 50_000;\nconst TIMEOUT_MS = 15_000;\n\nfunction stripHtml(html: string): string {\n // Remove <script> and <style> blocks with their content\n let text = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<noscript[\\s\\S]*?<\\/noscript>/gi, '');\n\n // Convert common block elements to newlines\n text = text\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/p>/gi, '\\n')\n .replace(/<\\/div>/gi, '\\n')\n .replace(/<\\/h[1-6]>/gi, '\\n')\n .replace(/<\\/li>/gi, '\\n')\n .replace(/<\\/tr>/gi, '\\n')\n .replace(/<\\/td>/gi, '\\t');\n\n // Strip remaining tags\n text = text.replace(/<[^>]+>/g, '');\n\n // Decode common HTML entities\n text = text\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&nbsp;/g, ' ')\n .replace(/&#(\\d+);/g, (_, n) => String.fromCharCode(Number(n)));\n\n // Collapse excessive whitespace / blank lines\n text = text\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .join('\\n');\n\n return text;\n}\n\nexport class WebFetchTool extends BaseTool {\n readonly name = 'web_fetch';\n readonly description =\n 'Fetch a URL and return its content as plain text (HTML stripped). Use for reading documentation, web pages, or any URL. Limit: 50,000 characters.';\n readonly inputSchema = {\n type: 'object',\n properties: {\n url: {\n type: 'string',\n description: 'The URL to fetch',\n },\n prompt: {\n type: 'string',\n description:\n 'Optional hint for what information to extract from the page (not used for filtering, just context)',\n },\n },\n required: ['url'],\n };\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n const url = input['url'] as string;\n\n let resp: Response;\n try {\n // safeFetch validates the scheme, blocks loopback/link-local/private\n // hosts (SSRF — e.g. the cloud metadata endpoint), and re-checks every\n // redirect hop. Set CASCADE_ALLOW_LOCAL_FETCH=1 to fetch local URLs.\n resp = await safeFetch(url, {\n headers: {\n 'User-Agent': 'Cascade-AI/1.0 WebFetchTool',\n Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.5',\n },\n signal: AbortSignal.timeout(TIMEOUT_MS),\n });\n } catch (err) {\n if (err instanceof SsrfBlockedError) {\n return `Refused to fetch ${url}: ${err.message}`;\n }\n return `Failed to fetch ${url}: ${err instanceof Error ? err.message : String(err)}`;\n }\n\n if (!resp.ok) {\n return `HTTP ${resp.status} ${resp.statusText} from ${url}`;\n }\n\n const contentType = resp.headers.get('content-type') ?? '';\n let text: string;\n\n try {\n const raw = await resp.text();\n text = contentType.includes('html') ? stripHtml(raw) : raw;\n } catch (err) {\n return `Failed to read response body: ${err instanceof Error ? err.message : String(err)}`;\n }\n\n if (text.length > MAX_CHARS) {\n text = text.slice(0, MAX_CHARS) + `\\n\\n[Content truncated at ${MAX_CHARS} characters]`;\n }\n\n return `URL: ${url}\\nContent-Type: ${contentType}\\n\\n${text}`;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — MCP Tool Wrapper\n// ─────────────────────────────────────────────\n\nimport type { ToolDefinition, ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\nimport { McpClient } from '../mcp/client.js';\n\n/**\n * A wrapper for a single tool exposed by an MCP server.\n */\nexport class McpToolWrapper extends BaseTool {\n public readonly name: string;\n public readonly description: string;\n public readonly inputSchema: Record<string, unknown>;\n\n private mcpClient: McpClient;\n private serverName: string;\n private toolName: string;\n\n constructor(\n mcpClient: McpClient,\n serverName: string,\n toolName: string,\n description: string,\n inputSchema: Record<string, unknown>\n ) {\n super();\n this.mcpClient = mcpClient;\n this.serverName = serverName;\n this.toolName = toolName;\n this.name = `mcp::${serverName}::${toolName}`;\n this.description = `[MCP:${serverName}] ${description}`;\n this.inputSchema = inputSchema;\n }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n return this.mcpClient.callTool(this.serverName, this.toolName, input);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Tool Registry\n// ─────────────────────────────────────────────\n\nimport EventEmitter from 'node:events';\nimport path from 'node:path';\nimport ignoreFactory, { type Ignore } from 'ignore';\n\n// `ignore` is published as CJS. Under `moduleResolution: NodeNext` the\n// default import surfaces the module namespace rather than the callable\n// factory, so normalise to whichever shape the runtime hands us.\nconst ignore: (opts?: unknown) => Ignore =\n (ignoreFactory as unknown as { default?: (opts?: unknown) => Ignore }).default ??\n (ignoreFactory as unknown as (opts?: unknown) => Ignore);\nimport type { ToolDefinition, ToolExecuteOptions, ToolsConfig } from '../types.js';\nimport { DEFAULT_APPROVAL_REQUIRED } from '../constants.js';\nimport type { BaseTool } from './base.js';\nimport { ShellTool } from './shell.js';\nimport { FileReadTool, FileWriteTool, FileEditTool, FileDeleteTool, FileListTool } from './file.js';\nimport { GitTool } from './git.js';\nimport { GitHubTool } from './github.js';\nimport { BrowserTool } from './browser.js';\nimport { ImageAnalyzeTool } from './image.js';\nimport { PDFCreateTool } from './pdf.js';\nimport { CodeInterpreterTool } from './interpreter.js';\nimport { PeerCommunicationTool } from './peer.js';\nimport { WebSearchTool } from './web-search.js';\nimport { GlobTool } from './glob.js';\nimport { GrepTool } from './grep.js';\nimport { WebFetchTool } from './web-fetch.js';\nimport { McpClient } from '../mcp/client.js';\nimport { McpToolWrapper } from './mcp.js';\n\n// ── Plugin System (Roadmap Stub) ──────────────────────────────────────────\n//\n// Future plugin support. Plugins bundle one or more tools together with\n// optional lifecycle hooks. Use `registry.registerPlugin(plugin)` to register.\n// This is a stub — roadmap tracked in README.md under Roadmap.\n\n/**\n * A ToolPlugin bundles one or more custom tools that extend Cascade's capabilities.\n * Plugins are loaded via `registerPlugin()` and behave like built-in tools.\n *\n * @example\n * const myPlugin: ToolPlugin = {\n * name: 'my-custom-tools',\n * version: '1.0.0',\n * tools: [new MyCustomTool()],\n * onRegister: (registry) => console.log('Plugin registered'),\n * };\n * registry.registerPlugin(myPlugin);\n */\nexport interface ToolPlugin {\n /** Unique plugin identifier */\n name: string;\n /** Semantic version string */\n version: string;\n /** One or more tools this plugin provides */\n tools: BaseTool[];\n /** Called once when the plugin is registered */\n onRegister?: (registry: ToolRegistry) => void;\n}\n\nexport class ToolRegistry extends EventEmitter {\n private tools: Map<string, BaseTool> = new Map();\n private config: ToolsConfig;\n private ignoreMatcher: Ignore = ignore();\n private workspaceRoot: string;\n /** Loaded plugins, keyed by plugin name */\n private plugins: Map<string, ToolPlugin> = new Map();\n\n constructor(config: ToolsConfig, workspaceRoot: string = process.cwd()) {\n super();\n this.config = config;\n this.workspaceRoot = workspaceRoot;\n this.registerDefaults();\n }\n\n register(tool: BaseTool): void {\n this.tools.set(tool.name, tool);\n this.emit('tool:added', tool.name);\n }\n\n /**\n * Wait until a named tool is registered, resolving immediately if it already exists.\n * T3 workers can call this after encountering a missing-tool error to resume\n * automatically once T2 synthesizes the tool.\n */\n waitForTool(toolName: string, timeoutMs = 60_000): Promise<void> {\n if (this.tools.has(toolName)) return Promise.resolve();\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.off('tool:added', handler);\n reject(new Error(`Timeout waiting for tool: ${toolName}`));\n }, timeoutMs);\n\n const handler = (name: string) => {\n if (name === toolName) {\n clearTimeout(timer);\n this.off('tool:added', handler);\n resolve();\n }\n };\n this.on('tool:added', handler);\n });\n }\n\n /**\n * Register a ToolPlugin, loading all its tools into the registry.\n * Each tool is configured with the current workspace root.\n * Duplicate plugin names are silently ignored.\n *\n * @example\n * registry.registerPlugin(myPlugin);\n */\n registerPlugin(plugin: ToolPlugin): void {\n if (this.plugins.has(plugin.name)) return;\n this.plugins.set(plugin.name, plugin);\n for (const tool of plugin.tools) {\n tool.setWorkspaceRoot(this.workspaceRoot);\n this.register(tool);\n }\n plugin.onRegister?.(this);\n }\n\n /** Returns the names of all registered plugins */\n getRegisteredPlugins(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /** Registers all tools from an MCP client */\n registerMcpTools(mcpClient: McpClient): void {\n const definitions = mcpClient.getToolDefinitions();\n for (const def of definitions) {\n // Definitions from McpClient.getToolDefinitions() are prefixed as\n // `mcp::<serverName>::<toolName>` — three parts, not four. Previously\n // this destructured [,, serverName, toolName] which silently dropped\n // every MCP tool (toolName was always undefined and the `continue`\n // below filtered them all out).\n const [, serverName, toolName] = def.name.split('::');\n if (!serverName || !toolName) continue;\n\n const wrapper = new McpToolWrapper(\n mcpClient,\n serverName,\n toolName,\n def.description.replace(`[MCP:${serverName}] `, ''),\n def.inputSchema,\n );\n wrapper.setWorkspaceRoot(this.workspaceRoot);\n this.register(wrapper);\n }\n }\n\n setIgnoredPaths(patterns: string[]): void {\n // `ignore` mirrors .gitignore semantics: supports negation, globs, dirs.\n // Using the library eliminates the old substring bug where `node_modules`\n // would also match `mynodemodules.js`.\n this.ignoreMatcher = ignore().add(patterns);\n }\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.getDefinition());\n }\n\n getTool(name: string): BaseTool | undefined {\n return this.tools.get(name);\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n\n requiresApproval(toolName: string): boolean {\n const defaults = DEFAULT_APPROVAL_REQUIRED as string[];\n const configured = this.config.requireApprovalFor;\n return defaults.includes(toolName) || configured.includes(toolName);\n }\n\n isDangerous(toolName: string): boolean {\n return this.tools.get(toolName)?.isDangerous() ?? false;\n }\n\n async execute(\n toolName: string,\n input: Record<string, unknown>,\n options: ToolExecuteOptions,\n ): Promise<string> {\n const tool = this.tools.get(toolName);\n if (!tool) throw new Error(`Tool not found: ${toolName}`);\n\n // Enforce .cascadeignore for file operations\n if (this.isFileOperation(toolName)) {\n const filePath = (input['path'] as string | undefined) ?? '';\n if (this.isIgnored(filePath)) {\n throw new Error(`Access denied: ${filePath} is in .cascadeignore`);\n }\n }\n\n return tool.execute(input, options);\n }\n\n private registerDefaults(): void {\n const tools: BaseTool[] = [\n new ShellTool(this.config.shellAllowlist, this.config.shellBlocklist),\n new FileReadTool(),\n new FileWriteTool(),\n new FileEditTool(),\n new FileDeleteTool(),\n new FileListTool(),\n new GitTool(),\n new GitHubTool(),\n new ImageAnalyzeTool(),\n new PDFCreateTool(),\n new CodeInterpreterTool(),\n new PeerCommunicationTool(),\n new WebSearchTool(this.config.webSearch),\n new GlobTool(),\n new GrepTool(),\n new WebFetchTool(),\n ];\n\n for (const tool of tools) {\n tool.setWorkspaceRoot(this.workspaceRoot);\n this.register(tool);\n }\n\n if (this.config.browserEnabled) {\n const browser = new BrowserTool();\n browser.setWorkspaceRoot(this.workspaceRoot);\n this.register(browser);\n }\n }\n\n private isFileOperation(toolName: string): boolean {\n return ['file_read', 'file_write', 'file_edit', 'file_delete'].includes(toolName);\n }\n\n private isIgnored(filePath: string): boolean {\n if (!filePath) return false;\n const abs = path.resolve(this.workspaceRoot, filePath);\n const rel = path.relative(this.workspaceRoot, abs);\n // Any path outside the workspace is treated as ignored (defence in depth;\n // the dedicated path-sandbox guards in each file tool also reject these).\n if (!rel || rel.startsWith('..') || path.isAbsolute(rel)) return true;\n // `ignore` requires POSIX-style separators.\n const posixRel = rel.split(path.sep).join('/');\n return this.ignoreMatcher.ignores(posixRel);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — MCP Client\n// ─────────────────────────────────────────────\n\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { ToolDefinition } from '../types.js';\n\nexport interface McpServerConfig {\n name: string;\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nexport interface McpTool {\n serverName: string;\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\n/**\n * Gate called before each MCP server is spawned. Lets the caller (REPL or\n * SDK) prompt the user for explicit approval of a subprocess binary.\n * Return `true` to allow, `false` to reject.\n */\nexport type McpApprovalCallback = (server: McpServerConfig) => Promise<boolean> | boolean;\n\nexport interface McpClientOptions {\n /** Names of servers the user has already trusted (config.mcp.trusted). */\n trustedServers?: string[];\n /** Approval gate invoked when a server is NOT in the trusted list. */\n approvalCallback?: McpApprovalCallback;\n /**\n * Sink for non-fatal warnings. Hosts with a live TUI must route these\n * away from the terminal — a raw console write mid-frame corrupts Ink's\n * rendering. Defaults to console.warn.\n */\n onWarn?: (message: string) => void;\n}\n\nexport class McpClient {\n private static activeProcessPids = new Set<number>();\n\n /** \n * Forcefully kills all known MCP child processes. \n * Call this from global process exit handlers to prevent zombie processes.\n */\n static killAllProcesses(): void {\n for (const pid of McpClient.activeProcessPids) {\n try {\n process.kill(pid, 'SIGKILL');\n } catch {\n // Ignore errors (process already dead, etc.)\n }\n }\n McpClient.activeProcessPids.clear();\n }\n\n private clients: Map<string, Client> = new Map();\n private transports: Map<string, StdioClientTransport> = new Map();\n private tools: Map<string, McpTool> = new Map();\n private trustedServers: Set<string>;\n private approvalCallback: McpApprovalCallback | undefined;\n\n private onWarn: (message: string) => void;\n\n constructor(options: McpClientOptions = {}) {\n this.trustedServers = new Set(options.trustedServers ?? []);\n this.approvalCallback = options.approvalCallback;\n this.onWarn = options.onWarn ?? ((message) => console.warn(message));\n }\n\n async connect(server: McpServerConfig): Promise<void> {\n // Spawning an arbitrary subprocess is the riskiest operation in the\n // tool system — the MCP command could be anything, including curl or a\n // shell. Require explicit trust before transport creation.\n if (!this.trustedServers.has(server.name)) {\n const approved = this.approvalCallback\n ? await this.approvalCallback(server)\n : false;\n if (!approved) {\n throw new Error(\n `MCP server \"${server.name}\" is not trusted. Add it to config.mcp.trusted or approve interactively before connecting.`,\n );\n }\n this.trustedServers.add(server.name);\n }\n\n const transport = new StdioClientTransport({\n command: server.command,\n args: server.args ?? [],\n env: { ...process.env, ...(server.env ?? {}) } as Record<string, string>,\n });\n\n const client = new Client(\n { name: 'cascade-ai', version: '0.1.0' },\n { capabilities: {} },\n );\n\n await client.connect(transport);\n this.clients.set(server.name, client);\n this.transports.set(server.name, transport);\n\n // Accessing undocumented but public getter in SDK\n if (transport.pid) McpClient.activeProcessPids.add(transport.pid);\n\n // Discover tools from this server. If another server already registered\n // a tool with the same bare name, emit a console warning but keep the\n // new key distinct (we namespace internally as `<server>::<tool>`).\n const toolsResult = await client.listTools();\n for (const tool of toolsResult.tools) {\n for (const existing of this.tools.values()) {\n if (existing.name === tool.name && existing.serverName !== server.name) {\n this.onWarn(\n `[mcp] Tool \"${tool.name}\" is exposed by both \"${existing.serverName}\" and \"${server.name}\". ` +\n `Cascade disambiguates internally via mcp::<server>::<tool>.`,\n );\n break;\n }\n }\n this.tools.set(`${server.name}::${tool.name}`, {\n serverName: server.name,\n name: tool.name,\n description: tool.description ?? '',\n inputSchema: tool.inputSchema as Record<string, unknown>,\n });\n }\n }\n\n async disconnect(serverName: string): Promise<void> {\n const client = this.clients.get(serverName);\n if (client) {\n const transport = this.transports.get(serverName);\n // Accessing undocumented but public getter in SDK\n if (transport?.pid) McpClient.activeProcessPids.delete(transport.pid);\n\n await client.close();\n this.clients.delete(serverName);\n this.transports.delete(serverName);\n for (const key of this.tools.keys()) {\n if (key.startsWith(`${serverName}::`)) this.tools.delete(key);\n }\n }\n }\n\n async disconnectAll(): Promise<void> {\n for (const name of this.clients.keys()) {\n await this.disconnect(name);\n }\n }\n\n async callTool(serverName: string, toolName: string, input: Record<string, unknown>): Promise<string> {\n const client = this.clients.get(serverName);\n if (!client) throw new Error(`MCP server not connected: ${serverName}`);\n\n const result = await client.callTool({ name: toolName, arguments: input });\n const content = result.content as Array<{ type: string; text?: string }>;\n return content.map((c) => c.text ?? '').join('\\n');\n }\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => ({\n name: `mcp::${t.serverName}::${t.name}`,\n description: `[MCP:${t.serverName}] ${t.description}`,\n inputSchema: t.inputSchema,\n }));\n }\n\n getConnectedServers(): string[] {\n return Array.from(this.clients.keys());\n }\n\n getActivePids(): number[] {\n const pids: number[] = [];\n for (const transport of this.transports.values()) {\n // Accessing undocumented but public getter in SDK\n if (transport.pid) pids.push(transport.pid);\n }\n return pids;\n }\n\n isConnected(serverName: string): boolean {\n return this.clients.has(serverName);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Permission Escalator\n// Routes T3 approval requests up: T2 → T1 → User\n// ─────────────────────────────────────────────\n\nimport EventEmitter from 'node:events';\nimport { randomUUID } from 'node:crypto';\nimport type { PermissionDecision, PermissionRequest } from '../../types.js';\n\n/** Tools that are inherently safe — T2 auto-approves via rules (no LLM call) */\nconst SAFE_TOOLS = new Set([\n 'file_read',\n 'file_list',\n 'git_status',\n 'git_log',\n 'git_diff',\n 'image_analyze',\n 'peer_message',\n 'diff_view',\n]);\n\ntype T2Evaluator = (req: PermissionRequest) => Promise<PermissionDecision | null>;\ntype T1Evaluator = (req: PermissionRequest) => Promise<PermissionDecision | null>;\n\n/**\n * PermissionEscalator manages the hierarchical permission flow for a single task run.\n *\n * Decision cascade:\n * 1. Check session cache (section-wide key `${t2Id}:${toolName}`) → return if hit\n * 2. Ask T2 evaluator → if decision returned, cache + return\n * 3. Ask T1 evaluator → if decision returned, cache + return\n * 4. Emit `permission:user-required` → wait for external decision via `resolveUserDecision()`\n */\nexport class PermissionEscalator extends EventEmitter {\n /**\n * Session cache keyed by `${t2Id}:${toolName}`.\n * All T3 workers under the same T2 share cached decisions for the same tool.\n */\n private sessionCache = new Map<string, boolean>();\n\n private t2Evaluator?: T2Evaluator;\n private t1Evaluator?: T1Evaluator;\n\n /** Pending user-decision resolvers keyed by request ID */\n private pendingUserDecisions = new Map<\n string,\n (decision: PermissionDecision) => void\n >();\n\n /** ms to wait for a user approval decision before denying for safety. */\n private readonly approvalTimeoutMs: number;\n /** Autonomous mode (autonomy: 'auto'): non-dangerous tools auto-approve. */\n private autonomous: boolean;\n\n constructor(approvalTimeoutMs = 600_000, autonomous = false) {\n super();\n this.approvalTimeoutMs = approvalTimeoutMs;\n this.autonomous = autonomous;\n }\n\n /** Toggle autonomous auto-approval at runtime (e.g. from /auto). */\n setAutonomous(on: boolean): void {\n this.autonomous = on;\n }\n\n setT2Evaluator(evaluator: T2Evaluator): void {\n this.t2Evaluator = evaluator;\n }\n\n setT1Evaluator(evaluator: T1Evaluator): void {\n this.t1Evaluator = evaluator;\n }\n\n /**\n * Main entry point. Called by T3Worker instead of emitting `tool:approval-request`.\n * Returns a PermissionDecision from whichever tier was able to decide.\n */\n async requestPermission(req: PermissionRequest): Promise<PermissionDecision> {\n const cacheKey = `${req.parentT2Id}:${req.toolName}`;\n\n // ── 1. Check session cache ────────────────\n // Untrusted callers (forceReprompt) skip the cache so a prior `always`\n // decision can't silently auto-approve their dangerous actions.\n if (!req.forceReprompt && this.sessionCache.has(cacheKey)) {\n return {\n requestId: req.id,\n approved: this.sessionCache.get(cacheKey)!,\n always: true,\n decidedBy: 'T2',\n reasoning: 'Cached from previous decision in this session',\n };\n }\n\n // ── 2. Non-dangerous safe tools → rule-based auto-approve ──\n if (!req.isDangerous && SAFE_TOOLS.has(req.toolName)) {\n const decision: PermissionDecision = {\n requestId: req.id,\n approved: true,\n always: true,\n decidedBy: 'T2',\n reasoning: `${req.toolName} is a read-only safe tool — auto-approved`,\n };\n this.sessionCache.set(cacheKey, true);\n return decision;\n }\n\n // ── 2b. Autonomous mode: auto-approve any NON-dangerous tool ──\n // Dangerous tools still fall through to T2/T1/user escalation below.\n if (this.autonomous && !req.isDangerous) {\n return {\n requestId: req.id,\n approved: true,\n always: false,\n decidedBy: 'T1',\n reasoning: 'Autonomous mode — non-dangerous tool auto-approved',\n };\n }\n\n // ── 3. Ask T2 evaluator ───────────────────\n if (this.t2Evaluator) {\n try {\n const t2Decision = await this.t2Evaluator(req);\n if (t2Decision !== null) {\n if (t2Decision.always) this.sessionCache.set(cacheKey, t2Decision.approved);\n return t2Decision;\n }\n } catch {\n // T2 evaluator failed — escalate without caching\n }\n }\n\n // ── 4. Ask T1 evaluator ───────────────────\n if (this.t1Evaluator) {\n try {\n const t1Decision = await this.t1Evaluator(req);\n if (t1Decision !== null) {\n if (t1Decision.always) this.sessionCache.set(cacheKey, t1Decision.approved);\n return t1Decision;\n }\n } catch {\n // T1 evaluator failed — escalate to user\n }\n }\n\n // ── 5. Escalate to user ───────────────────\n return this.waitForUserDecision(req);\n }\n\n /**\n * Called by the REPL/SDK once the user has made a decision.\n * Only has effect when a request is actually pending.\n */\n resolveUserDecision(requestId: string, approved: boolean, always?: boolean): void {\n const resolver = this.pendingUserDecisions.get(requestId);\n if (!resolver) return;\n\n this.pendingUserDecisions.delete(requestId);\n const decision: PermissionDecision = {\n requestId,\n approved,\n always,\n decidedBy: 'USER',\n };\n\n if (always) {\n // Find the cacheKey — walk pending list to find the T2 ID association\n // At this point we cache under a generic `user:${toolName}` scope\n // (the req itself is gone — resolver captures it by closure in waitForUserDecision)\n }\n\n resolver(decision);\n }\n\n private waitForUserDecision(req: PermissionRequest): Promise<PermissionDecision> {\n return new Promise<PermissionDecision>((resolve) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const wrappedResolver = (decision: PermissionDecision) => {\n if (timer) clearTimeout(timer);\n if (decision.always) {\n this.sessionCache.set(`${req.parentT2Id}:${req.toolName}`, decision.approved);\n }\n resolve(decision);\n };\n\n this.pendingUserDecisions.set(req.id, wrappedResolver);\n\n // Time-box the wait: if no decision arrives (prompt unanswered or never\n // rendered), DENY — never auto-approve — so the run continues instead of\n // hanging forever on the pending Promise.\n if (this.approvalTimeoutMs > 0 && Number.isFinite(this.approvalTimeoutMs)) {\n timer = setTimeout(() => {\n if (this.pendingUserDecisions.delete(req.id)) {\n resolve({\n requestId: req.id,\n approved: false,\n decidedBy: 'USER',\n reasoning: `Approval timed out after ${this.approvalTimeoutMs}ms — denied for safety`,\n });\n }\n }, this.approvalTimeoutMs);\n // Don't keep the event loop alive solely for this timer.\n timer.unref?.();\n }\n\n // Emit event so cascade.ts / REPL can pick it up\n this.emit('permission:user-required', req);\n });\n }\n\n /** Check if there are permissions waiting for user input */\n hasPendingUserDecisions(): boolean {\n return this.pendingUserDecisions.size > 0;\n }\n\n /** Deny all pending user decisions (used on task cancel) */\n cancelAllPending(): void {\n for (const [id, resolver] of this.pendingUserDecisions) {\n resolver({ requestId: id, approved: false, decidedBy: 'USER', reasoning: 'Task cancelled' });\n }\n this.pendingUserDecisions.clear();\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Config Schema (Zod)\n// ─────────────────────────────────────────────\n\nimport { z } from 'zod';\n\nexport const ProviderConfigSchema = z.object({\n type: z.enum(['anthropic', 'openai', 'gemini', 'azure', 'openai-compatible', 'ollama']),\n label: z.string().optional(),\n apiKey: z.string().optional(),\n baseUrl: z.string().url().optional(),\n deploymentName: z.string().optional(),\n apiVersion: z.string().optional(),\n model: z.string().optional(),\n authToken: z.string().optional(),\n credentialSource: z.string().optional(),\n});\n\nexport const ModelOverridesSchema = z.object({\n t1: z.string().optional(),\n t2: z.string().optional(),\n t3: z.string().optional(),\n vision: z.string().optional(),\n});\n\nexport const McpServerConfigSchema = z.object({\n name: z.string(),\n command: z.string(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string()).optional(),\n});\n\nexport const WebSearchConfigSchema = z.object({\n /** Base URL of your SearXNG instance (e.g. http://localhost:8080) */\n searxngUrl: z.string().optional(),\n /** Brave Search API key — get one at https://api.search.brave.com */\n braveApiKey: z.string().optional(),\n /** Tavily API key — get one at https://tavily.com */\n tavilyApiKey: z.string().optional(),\n /** Max results per search (default 5) */\n maxResults: z.number().default(5),\n});\n\nexport const ToolsConfigSchema = z.object({\n shellAllowlist: z.array(z.string()).default([]),\n shellBlocklist: z.array(z.string()).default(['rm -rf', 'sudo rm', 'format', 'mkfs']),\n requireApprovalFor: z.array(z.string()).default([]),\n browserEnabled: z.boolean().default(false),\n mcpServers: z.array(McpServerConfigSchema).optional(),\n mcpTrusted: z.array(z.string()).optional(),\n /** Web search backends — at least one should be configured for best results */\n webSearch: WebSearchConfigSchema.optional(),\n});\n\nexport const HookDefinitionSchema = z.object({\n name: z.string().optional(),\n command: z.string(),\n tools: z.array(z.string()).optional(),\n timeout: z.number().optional(),\n});\n\nexport const HooksConfigSchema = z.object({\n preToolUse: z.array(HookDefinitionSchema).optional(),\n postToolUse: z.array(HookDefinitionSchema).optional(),\n preTask: z.array(HookDefinitionSchema).optional(),\n postTask: z.array(HookDefinitionSchema).optional(),\n});\n\nexport const DashboardConfigSchema = z.object({\n port: z.number().default(4891),\n /**\n * Interface to bind the dashboard HTTP/WebSocket server to. Defaults to\n * loopback so the dashboard — which exposes /api/run (arbitrary task\n * execution) and config mutation — is never reachable from the network\n * unless the operator explicitly opts in (e.g. \"0.0.0.0\" for team mode).\n */\n host: z.string().default('127.0.0.1'),\n auth: z.boolean().default(true),\n teamMode: z.enum(['single', 'multi']).default('single'),\n secret: z.string().optional(),\n});\n\nexport const TelemetryConfigSchema = z.object({\n enabled: z.boolean().default(false),\n posthogApiKey: z.string().optional(),\n distinctId: z.string().optional(),\n});\n\nexport const MemoryConfigSchema = z.object({\n maxSessionMessages: z.number().default(1000),\n autoSummarizeAt: z.number().default(150_000),\n retentionDays: z.number().default(90),\n});\n\nexport const TierLimitsSchema = z.object({\n t1MaxTokens: z.number().optional(),\n t2MaxTokens: z.number().optional(),\n t3MaxTokens: z.number().optional(),\n});\n\nexport const BudgetConfigSchema = z.object({\n dailyBudgetUsd: z.number().optional(),\n sessionBudgetUsd: z.number().optional(),\n /**\n * Hard per-task token ceiling. A single `cascade run` is stopped once its\n * combined token usage crosses this, so a mis-routed trivial task can never\n * fan out into a runaway multi-agent burn. Resets every run. Raise it for\n * genuinely large jobs. Defaults to 200k.\n */\n maxTokensPerRun: z.number().int().positive().default(200_000),\n /** Optional hard per-task cost ceiling (USD). Unset = only the token cap applies. */\n maxCostPerRunUsd: z.number().positive().optional(),\n warnAtPct: z.number().default(80),\n});\n\nexport const WorkspaceConfigSchema = z.object({\n cascadeMdPath: z.string().default('CASCADE.md'),\n configPath: z.string().default('.cascade/config.json'),\n keystorePath: z.string().default('.cascade/keystore.enc'),\n auditLogPath: z.string().default('.cascade/audit.log'),\n});\n\nexport const CascadeConfigSchema = z.object({\n version: z.literal('1.0').default('1.0'),\n defaultIdentityId: z.string().optional(),\n providers: z.array(ProviderConfigSchema).default([]),\n models: ModelOverridesSchema.default({}),\n tools: ToolsConfigSchema.default({}),\n hooks: HooksConfigSchema.default({}),\n dashboard: DashboardConfigSchema.default({}),\n telemetry: TelemetryConfigSchema.default({}),\n memory: MemoryConfigSchema.default({}),\n tierLimits: TierLimitsSchema.default({}),\n budget: BudgetConfigSchema.default({}),\n theme: z.string().default('cascade'),\n workspace: WorkspaceConfigSchema.default({}),\n /**\n * Cascade Auto: when true, the TaskAnalyzer selects the optimal model for each\n * tier based on task type and complexity, overriding the static priority lists.\n * Heuristic-first with AI inference fallback (adds ~0–500ms per task).\n */\n cascadeAuto: z.boolean().default(false),\n /**\n * Cascade Auto trade-off bias when picking a model for a task:\n * - 'balanced' (default): quality × cost-efficiency — cheap models win\n * trivial tasks, strong models win hard ones.\n * - 'quality': pick the highest-benchmark model; cost only breaks ties.\n * - 'cost': pick the cheapest model that clears a per-task quality floor.\n */\n autoBias: z.enum(['balanced', 'quality', 'cost']).default('balanced'),\n /**\n * Public-benchmark data source for Cascade Auto. All fields have safe\n * defaults so zero config \"just works\" — live data is fetched in the\n * background and the bundled snapshot is used until it arrives (or offline).\n */\n benchmarks: z\n .object({\n /** Fetch current quality scores from a public source. Default: true. */\n live: z.boolean().default(true),\n /** How long a fetched snapshot stays fresh before re-fetching (hours). */\n refreshHours: z.number().min(0).default(24),\n /**\n * Override the quality-benchmark source URL (must return the snapshot\n * JSON shape). When unset, the maintained GitHub-raw snapshot is used.\n */\n sourceUrl: z.string().url().optional(),\n /** Fetch current per-token prices from OpenRouter (free, no key). */\n pricingLive: z.boolean().default(true),\n })\n .default({}),\n /**\n * Runtime Tool Creation: when true, T3 workers can generate and register new tools\n * at runtime via the ToolCreator when no existing tool can handle a required operation.\n * Generated tools are session-scoped and sandboxed in node:vm.\n * HTTP calls from generated tools require approval.\n */\n enableToolCreation: z.boolean().default(true),\n /**\n * Persist runtime-generated tools to .cascade/dynamic-tools.json and reload them\n * on startup for cross-run dedup. Reloaded (and peer-received) tools are always\n * treated as UNTRUSTED — their dangerous actions re-escalate. Set false to disable\n * persistence entirely.\n */\n persistDynamicTools: z.boolean().default(true),\n /**\n * External plugin paths or npm package names to load at startup.\n * Each entry must export a default ToolPlugin object.\n * Example: [\"./plugins/my-tool.js\", \"cascade-plugin-slack\"]\n */\n plugins: z.array(z.string()).default([]),\n /**\n * Maximum number of concurrent inference requests to any local model provider\n * (e.g. Ollama). Defaults to 1 to prevent GPU memory pressure when multiple\n * T3 workers run in parallel on a single-GPU machine.\n */\n localConcurrency: z.number().int().min(1).default(1),\n /**\n * Timeout in milliseconds for a single local model inference call.\n * Local models can take minutes for large parameter counts. Default: 5 minutes.\n */\n localInferenceTimeoutMs: z.number().int().min(1000).default(300_000),\n /**\n * Timeout (ms) for a single cloud LLM call (streaming or not). Guards against\n * a stalled provider stream hanging the whole run with no output. On timeout\n * the call errors and the worker escalates. Default: 2 minutes.\n */\n cloudInferenceTimeoutMs: z.number().int().min(1000).default(120_000),\n /**\n * Timeout (ms) for a tool-approval decision. If no decision arrives in time the\n * request is DENIED (never auto-approved) so the run continues rather than\n * hanging on an unanswered prompt. Default: 10 minutes.\n */\n approvalTimeoutMs: z.number().int().min(1000).default(600_000),\n /**\n * Boardroom plan approval: pause after the plan is produced so the user can\n * review the org chart (sections, workers, estimated cost) before any worker\n * spawns. Scope:\n * 'never' — never pause (default; no behavior change).\n * 'complex' — pause Complex runs only ('always' is kept as an alias).\n * 'all' — pause Moderate and Complex runs.\n * Headless/SDK consumers without a listener auto-approve, so pausing is safe\n * outside the TUI.\n */\n planApproval: z.enum(['never', 'complex', 'all', 'always']).default('never'),\n /**\n * Plan-review behaviour for the boardroom gate:\n * autoReviewer — a reviewer model critiques the plan (gaps/risks/cost)\n * before you see it, and the critique is shown in the dialog.\n * editable — allow editing the plan (drop sections) in the dialog.\n * maxRevisionRounds — how many steering-note → re-plan → re-ask rounds the\n * boardroom allows before proceeding with the last plan.\n */\n planReview: z\n .object({\n autoReviewer: z.boolean().default(false),\n editable: z.boolean().default(true),\n maxRevisionRounds: z.number().int().min(1).max(20).default(5),\n })\n .default({}),\n /**\n * Autonomy level. 'manual' (default): plan + tool approvals prompt as usual.\n * 'auto': hands-off — the plan gate auto-approves and the escalator\n * auto-approves NON-dangerous tools, while dangerous tools still escalate and\n * budget caps remain the hard stop. Toggle at runtime with /auto.\n */\n autonomy: z.enum(['manual', 'auto']).default('manual'),\n /**\n * Max corrective re-plan passes T1's reviewer runs before returning the best\n * partial result. The run also stops early when a pass makes no net progress.\n */\n maxReplanPasses: z.number().int().min(0).max(10).default(2),\n /**\n * Reflection / self-critique. When enabled, after a worker's pass/fail self-test\n * succeeds it runs a goal-alignment critique and revises once if the output is\n * weak against the broader goal (not just the subtask spec). Off by default — it\n * adds an LLM call per worker.\n */\n reflection: z\n .object({\n enabled: z.boolean().default(false),\n maxRounds: z.number().int().min(1).max(3).default(1),\n })\n .default({}),\n /**\n * T3 worker execution within a dependency wave:\n * 'auto' (default) — sequential when the T3 tier is a LOCAL model (a single\n * GPU serializes anyway, so parallel just thrashes the queue), parallel for\n * cloud models.\n * 'parallel' / 'sequential' — force it.\n */\n t3Execution: z.enum(['auto', 'parallel', 'sequential']).default('auto'),\n /**\n * T3→T2 reinforcement: when enabled, a worker that discovers its subtask should\n * fan out can call the `request_workers` tool to have its T2 manager spawn\n * sibling workers for the new pieces (no 4th tier; bounded). Off by default.\n */\n reinforcements: z\n .object({\n enabled: z.boolean().default(false),\n maxPerSection: z.number().int().min(1).max(20).default(4),\n })\n .default({}),\n /**\n * Render the TUI in the terminal's alternate screen buffer (like vim).\n * Flicker-proof and restores the shell on exit, but native scrollback is\n * unavailable — history scrolls in-app with PgUp/PgDn. Also enabled per\n * session with the --alt-screen flag. Default: off.\n */\n altScreen: z.boolean().default(false),\n});\n\nexport type CascadeConfigInput = z.input<typeof CascadeConfigSchema>;\n","// ─────────────────────────────────────────────\n// Cascade AI — Config Validator\n// ─────────────────────────────────────────────\n\nimport { z } from 'zod';\nimport { CascadeConfigSchema } from './schema.js';\nimport type { CascadeConfig } from '../types.js';\n\nexport class CascadeConfigError extends Error {\n public readonly issues: z.ZodIssue[];\n\n constructor(result: z.SafeParseError<unknown>) {\n const summary = result.error.issues\n .map((i) => ` • ${i.path.join('.')}: ${i.message}`)\n .join('\\n');\n super(`Invalid cascade configuration:\\n${summary}`);\n this.name = 'CascadeConfigError';\n this.issues = result.error.issues;\n }\n}\n\n/**\n * Validates raw config input (from YAML, JSON, or programmatic usage) against\n * the Zod CascadeConfigSchema. Throws `CascadeConfigError` with a detailed\n * issue list if validation fails.\n *\n * @param raw - Untrusted config object (e.g. from fs.readFileSync + yaml.parse)\n * @returns A fully populated, type-safe `CascadeConfig` with all defaults applied.\n */\nexport function validateConfig(raw: unknown): CascadeConfig {\n const result = CascadeConfigSchema.safeParse(raw);\n if (!result.success) {\n throw new CascadeConfigError(result);\n }\n return result.data as unknown as CascadeConfig;\n}\n\n/**\n * Like `validateConfig` but returns `null` on failure instead of throwing.\n * Useful for config file watchers where you want to log and skip.\n */\nexport function tryValidateConfig(raw: unknown): CascadeConfig | null {\n try {\n return validateConfig(raw);\n } catch {\n return null;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Opt-in Telemetry (PostHog)\n// ─────────────────────────────────────────────\n\nimport type { TaskComplexity, TelemetryConfig, TierRole } from '../types.js';\n\n// ── Typed event catalogue ──────────────────────\n\nexport interface TelemetryEvents {\n 'cascade:session_start': {\n complexity?: TaskComplexity;\n providerCount: number;\n cascadeAutoEnabled: boolean;\n toolCreationEnabled: boolean;\n };\n 'cascade:session_end': {\n durationMs: number;\n taskCount: number;\n totalTokens: number;\n totalCostUsd: number;\n };\n 'cascade:task_complete': {\n complexity: TaskComplexity;\n tier: TierRole | 'simple';\n durationMs: number;\n tokenCount: number;\n costUsd: number;\n t2Count: number;\n t3Count: number;\n };\n 'cascade:task_failed': {\n tier: TierRole;\n errorType: string;\n complexity?: TaskComplexity;\n };\n 'cascade:tool_executed': {\n toolName: string;\n tier: TierRole;\n success: boolean;\n durationMs?: number;\n };\n 'cascade:tool_created': {\n name: string;\n description: string;\n };\n 'cascade:model_selected': {\n tier: TierRole;\n modelId: string;\n provider: string;\n reason: 'config_override' | 'cascade_auto' | 'priority_list' | 'fallback';\n complexity?: number;\n };\n 'cascade:peer_sync': {\n syncType: string;\n tier: 'T2' | 'T3';\n participantCount: number;\n };\n 'cascade:escalation': {\n fromTier: TierRole;\n toTier: TierRole | 'user';\n toolName: string;\n approved: boolean;\n };\n 'cascade:provider_failover': {\n from: string;\n to: string;\n reason: string;\n };\n 'cascade:t2_overlap_detected': {\n sectionCount: number;\n overlapCount: number;\n switchedToSequential: boolean;\n };\n 'cascade:file_lock_contention': {\n filePath: string;\n waitMs: number;\n };\n}\n\nexport type TelemetryEventName = keyof TelemetryEvents;\n\nexport class Telemetry {\n private client: unknown = null;\n private enabled: boolean;\n private distinctId: string;\n\n constructor(config: TelemetryConfig, distinctId: string) {\n this.enabled = config.enabled;\n this.distinctId = distinctId;\n if (config.enabled && config.posthogApiKey) {\n this.init(config.posthogApiKey);\n }\n }\n\n private init(apiKey: string): void {\n // Dynamically import PostHog to avoid loading it when telemetry is off\n import('posthog-node').then(({ PostHog }) => {\n this.client = new PostHog(apiKey, { host: 'https://app.posthog.com' });\n }).catch(() => { /* PostHog unavailable */ });\n }\n\n /**\n * Capture a typed telemetry event. Silently no-ops if telemetry is disabled.\n */\n capture<E extends TelemetryEventName>(event: E, properties: TelemetryEvents[E]): void;\n capture(event: string, properties?: Record<string, unknown>): void;\n capture(event: string, properties?: Record<string, unknown>): void {\n if (!this.enabled || !this.client) return;\n try {\n const ph = this.client as { capture: (opts: unknown) => void };\n ph.capture({ distinctId: this.distinctId, event, properties });\n } catch { /* never throw on telemetry */ }\n }\n\n async shutdown(): Promise<void> {\n if (!this.client) return;\n try {\n const ph = this.client as { shutdown: () => Promise<void> };\n await ph.shutdown();\n } catch { /* ignore */ }\n }\n}\n\n// No-op telemetry for when it's disabled\nexport const noopTelemetry: Pick<Telemetry, 'capture' | 'shutdown'> = {\n capture: () => {},\n shutdown: async () => {},\n};\n","// ─────────────────────────────────────────────\n// Cascade AI — Task Analyzer (Cascade Auto)\n// ─────────────────────────────────────────────\n//\n// Cascade Auto selects the optimal model for each tier based on task analysis.\n// Pure heuristic scoring — no AI calls for model selection.\n// Adapts over time via ModelPerformanceTracker (session + persistent stats).\n\nimport type { TierRole, ModelInfo } from '../../types.js';\nimport type { ModelSelector } from './selector.js';\nimport type { ModelPerformanceTracker } from './model-performance-tracker.js';\nimport { benchmarkScore01 } from './benchmarks.js';\n\nexport type TaskType = 'code' | 'analysis' | 'creative' | 'data' | 'mixed';\n\n/** Cascade Auto cost/quality trade-off bias. See CascadeConfig.autoBias. */\nexport type AutoBias = 'balanced' | 'quality' | 'cost';\n\nexport interface TaskProfile {\n type: TaskType;\n /** 1 = trivial, 5 = research-grade */\n complexity: 1 | 2 | 3 | 4 | 5;\n requiresReasoning: boolean;\n requiresVision: boolean;\n estimatedTokens: number;\n /** 0.0–1.0 heuristic confidence; below 0.7 triggers AI fallback */\n confidence: number;\n}\n\n// ── Heuristic scoring tables ───────────────────\n\nconst CODE_SIGNALS = [\n /\\b(?:function|class|interface|async|await|import|export|const|let|var|def|return|if|else|for|while|try|catch)\\b/,\n /\\b(?:typescript|javascript|python|rust|go|java|c\\+\\+|sql|bash|shell|dockerfile|kubernetes|terraform)\\b/i,\n /\\b(?:implement|refactor|debug|fix|write.*code|create.*function|add.*method|parse|compile|build|test|deploy)\\b/i,\n /[{}[\\]()=>]/, // Code-like punctuation density\n];\n\nconst ANALYSIS_SIGNALS = [\n /\\b(?:analyze|analyse|explain|describe|compare|evaluate|assess|review|summarize|understand|interpret)\\b/i,\n /\\b(?:why|what.*cause|how.*work|difference.*between|pros.*cons|trade.?off|benchmark)\\b/i,\n];\n\nconst CREATIVE_SIGNALS = [\n /\\b(?:write|draft|compose|create.*story|generate.*text|poem|essay|blog|article|email|proposal)\\b/i,\n /\\b(?:creative|imaginative|fictional|narrative|persuasive|marketing)\\b/i,\n];\n\nconst DATA_SIGNALS = [\n /\\b(?:csv|json|yaml|xml|excel|spreadsheet|dataframe|dataset|sql|query|aggregate|pivot)\\b/i,\n /\\b(?:statistics|chart|graph|visualize|plot|correlation|regression|cluster)\\b/i,\n];\n\nconst HIGH_COMPLEXITY_SIGNALS = [\n /\\b(?:architect|design.*system|distributed|microservice|scalab|performance|optimiz|refactor.*entire|migrate)\\b/i,\n /\\b(?:research|comprehensive|detailed|in-depth|thorough|complete|full.*implementation)\\b/i,\n /multiple.*file|several.*component|entire.*codebase|whole.*project/i,\n];\n\nconst LOW_COMPLEXITY_SIGNALS = [\n /\\b(?:simple|quick|brief|short|small|single|one-line|rename|typo|hello world)\\b/i,\n /^(?:hi|hello|thanks|ok|yes|no|what is|list|show me|tell me)\\b/i,\n];\n\n// ── Heuristic analyser ─────────────────────────\n\nfunction scoreText(text: string, patterns: RegExp[]): number {\n return patterns.reduce((score, re) => score + (re.test(text) ? 1 : 0), 0);\n}\n\nfunction heuristicAnalyze(prompt: string): TaskProfile {\n const lower = prompt.toLowerCase();\n\n const codeScore = scoreText(lower, CODE_SIGNALS);\n const analysisScore = scoreText(lower, ANALYSIS_SIGNALS);\n const creativeScore = scoreText(lower, CREATIVE_SIGNALS);\n const dataScore = scoreText(lower, DATA_SIGNALS);\n const highComplexityScore = scoreText(lower, HIGH_COMPLEXITY_SIGNALS);\n const lowComplexityScore = scoreText(lower, LOW_COMPLEXITY_SIGNALS);\n\n // Determine primary type\n const scores: Record<TaskType, number> = {\n code: codeScore,\n analysis: analysisScore,\n creative: creativeScore,\n data: dataScore,\n mixed: 0,\n };\n const maxScore = Math.max(...Object.values(scores));\n const topTypes = (Object.entries(scores) as [TaskType, number][]).filter(([, s]) => s === maxScore && s > 0);\n const type: TaskType = topTypes.length === 1 ? topTypes[0]![0] : 'mixed';\n\n // Determine complexity (1-5)\n const wordCount = prompt.split(/\\s+/).length;\n let complexity: 1 | 2 | 3 | 4 | 5 = 3;\n if (lowComplexityScore > 0 || wordCount < 10) complexity = 1;\n else if (highComplexityScore >= 2 || wordCount > 200) complexity = 5;\n else if (highComplexityScore === 1 || wordCount > 80) complexity = 4;\n else if (wordCount > 30) complexity = 3;\n else complexity = 2;\n\n // Confidence = how clearly the signals point to one type\n const totalSignals = Object.values(scores).reduce((a, b) => a + b, 0);\n const confidence = totalSignals === 0 ? 0.3 : Math.min(0.95, (maxScore / totalSignals) * (maxScore > 0 ? 1 : 0.3));\n\n const requiresReasoning = complexity >= 4 || analysisScore > 1;\n const requiresVision = /\\b(?:image|screenshot|photo|diagram|figure|visual)\\b/i.test(lower);\n const estimatedTokens = wordCount * 5; // rough token estimate\n\n return { type, complexity, requiresReasoning, requiresVision, estimatedTokens, confidence };\n}\n\n// ── Model selection from profile ───────────────\n\n// ── TaskAnalyzer class ─────────────────────────\n\n/** Prompt hash cache — avoids repeated analysis of the same input within a session. */\nconst analysisCache = new Map<string, TaskProfile>();\n\n// Map from task type to relevant model specialization tags\nconst TASK_TYPE_TAGS: Record<TaskType, string[]> = {\n code: ['code', 'instruction'],\n analysis: ['analysis', 'instruction'],\n creative: ['creative', 'multilingual'],\n data: ['data', 'code'],\n mixed: [],\n};\n\nexport class TaskAnalyzer {\n private tracker?: ModelPerformanceTracker;\n private bias: AutoBias;\n private lastProfile: TaskProfile | null = null;\n private lastSelectedModels = new Map<TierRole, ModelInfo>();\n\n constructor(tracker?: ModelPerformanceTracker, bias: AutoBias = 'balanced') {\n this.tracker = tracker;\n this.bias = bias;\n }\n\n setTracker(tracker: ModelPerformanceTracker): void {\n this.tracker = tracker;\n }\n\n /** Change the cost/quality bias at runtime (e.g. when config reloads). */\n setBias(bias: AutoBias): void {\n this.bias = bias;\n }\n\n /** Returns the TaskProfile from the most recent analyze() call — used for outcome recording. */\n getLastProfile(): TaskProfile | null {\n return this.lastProfile;\n }\n\n /**\n * Analyze a prompt and return a TaskProfile using pure heuristics.\n * Low confidence prompts fall back to a conservative mixed/moderate profile.\n */\n async analyze(prompt: string): Promise<TaskProfile> {\n const cacheKey = prompt.slice(0, 200);\n const cached = analysisCache.get(cacheKey);\n if (cached) {\n this.lastProfile = cached;\n return cached;\n }\n\n const profile = heuristicAnalyze(prompt);\n analysisCache.set(cacheKey, profile);\n this.lastProfile = profile;\n return profile;\n }\n\n /**\n * Select the optimal model for a given tier.\n * Scores tier-eligible models using cost efficiency + historical performance.\n * Falls back to the priority-list default when no candidates have history.\n */\n async selectModel(\n prompt: string,\n tier: TierRole,\n selector: ModelSelector,\n ): Promise<ModelInfo | null> {\n const profile = await this.analyze(prompt);\n\n // Vision tasks: always route to a vision-capable model\n if (profile.requiresVision) {\n return selector.selectVisionModel();\n }\n\n const candidates = selector.getCandidatesForTier(tier);\n if (candidates.length === 0) return selector.selectForTier(tier);\n\n const scored = candidates.map(m => ({\n model: m,\n score: this.scoreModel(m, profile),\n }));\n scored.sort((a, b) => b.score - a.score);\n\n const best = scored[0]?.model ?? selector.selectForTier(tier);\n if (best) this.lastSelectedModels.set(tier, best);\n return best;\n }\n\n /**\n * Record the outcome of a completed run across all tiers that were selected\n * during this session and persist stats to disk.\n */\n recordRunOutcome(outcome: 'success' | 'failure', costByTier: Record<string, number>): void {\n if (!this.tracker || !this.lastProfile) return;\n const taskType = this.lastProfile.type;\n for (const [tier, model] of this.lastSelectedModels) {\n const cost = costByTier[tier] ?? 0;\n this.tracker.record(model.id, taskType, outcome, 0, cost);\n }\n this.lastSelectedModels.clear();\n void this.tracker.save();\n }\n\n private scoreModel(model: ModelInfo, profile: TaskProfile): number {\n const perf = this.tracker?.performanceScore(model.id, profile.type) ?? 0.5;\n const costEff = this.costEfficiency(model, profile.complexity);\n const match = this.taskMatchScore(model, profile);\n // Public-benchmark strength for this task type dominates the choice (so a\n // coding subtask prefers Claude, a writing one GPT/Gemini, etc.) while cost\n // efficiency still breaks ties on trivial work. The 0.3 floor keeps a\n // benchmark-unknown model competitive rather than zeroing it out.\n const benchmark = 0.3 + 0.7 * benchmarkScore01(model, profile.type);\n\n // autoBias reshapes the same factors:\n // balanced — quality × cost-efficiency (default; unchanged behavior).\n // quality — benchmark dominates; cost is only a light tiebreak.\n // cost — cheapest wins, but √benchmark keeps a soft quality floor so a\n // dirt-cheap weak model can't win a hard task outright.\n switch (this.bias) {\n case 'quality':\n return perf * match * (benchmark ** 2) * (0.85 + 0.15 * costEff);\n case 'cost':\n return perf * match * (costEff ** 1.5) * Math.sqrt(benchmark);\n case 'balanced':\n default:\n return perf * costEff * match * benchmark;\n }\n }\n\n private costEfficiency(model: ModelInfo, complexity: 1 | 2 | 3 | 4 | 5): number {\n if (this.tracker) return this.tracker.costEfficiencyScore(model, complexity);\n // Same formula without the tracker instance\n const blended = model.inputCostPer1kTokens + model.outputCostPer1kTokens * 2;\n const normalised = Math.min(1.0, blended / 0.05);\n const complexityWeight = (6 - complexity) / 5;\n return Math.max(0.1, 1 - normalised * complexityWeight);\n }\n\n private taskMatchScore(model: ModelInfo, profile: TaskProfile): number {\n const expected = TASK_TYPE_TAGS[profile.type];\n if (!model.specializations?.length || expected.length === 0) return 1.0;\n const matches = expected.filter(tag => model.specializations!.includes(tag)).length;\n // Boost 30% for full match, slight penalty for zero match vs a specialised competitor\n return matches > 0 ? 1.0 + (matches / expected.length) * 0.3 : 0.8;\n }\n\n /** Clear the analysis cache (call between sessions). */\n static clearCache(): void {\n analysisCache.clear();\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Model Performance Tracker\n// ─────────────────────────────────────────────\n//\n// Non-AI auto-updating model selection support.\n// Records per-(model, taskType) outcomes across sessions and returns\n// numeric scores that drive cost-efficient model selection.\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { ModelInfo } from '../../types.js';\nimport type { TaskType } from './task-analyzer.js';\n\ninterface ModelStat {\n successCount: number;\n failureCount: number;\n totalRetries: number;\n totalCostUsd: number;\n sampleCount: number;\n}\n\nconst DEFAULT_STATS_FILE = path.join(os.homedir(), '.cascade', 'model-perf.json');\n\nexport class ModelPerformanceTracker {\n private stats = new Map<string, ModelStat>();\n private readonly statsFile: string;\n private loaded = false;\n\n constructor(statsFile = DEFAULT_STATS_FILE) {\n this.statsFile = statsFile;\n }\n\n async load(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = await fs.readFile(this.statsFile, 'utf-8');\n const parsed = JSON.parse(raw) as Record<string, ModelStat>;\n for (const [key, stat] of Object.entries(parsed)) {\n this.stats.set(key, stat);\n }\n } catch {\n // File doesn't exist yet — start fresh\n }\n }\n\n async save(): Promise<void> {\n try {\n await fs.mkdir(path.dirname(this.statsFile), { recursive: true });\n const obj: Record<string, ModelStat> = {};\n for (const [key, stat] of this.stats) obj[key] = stat;\n await fs.writeFile(this.statsFile, JSON.stringify(obj, null, 2), 'utf-8');\n } catch { /* non-critical */ }\n }\n\n record(\n modelId: string,\n taskType: TaskType,\n outcome: 'success' | 'failure',\n retries = 0,\n costUsd = 0,\n ): void {\n const key = `${modelId}:${taskType}`;\n const s = this.stats.get(key) ?? {\n successCount: 0, failureCount: 0, totalRetries: 0, totalCostUsd: 0, sampleCount: 0,\n };\n this.stats.set(key, {\n successCount: s.successCount + (outcome === 'success' ? 1 : 0),\n failureCount: s.failureCount + (outcome === 'failure' ? 1 : 0),\n totalRetries: s.totalRetries + retries,\n totalCostUsd: s.totalCostUsd + costUsd,\n sampleCount: s.sampleCount + 1,\n });\n }\n\n /**\n * Returns 0.05–1.0; defaults to 0.5 (neutral prior) when no history exists.\n * High retry counts penalise the score.\n */\n performanceScore(modelId: string, taskType: TaskType): number {\n const key = `${modelId}:${taskType}`;\n const s = this.stats.get(key);\n if (!s || s.sampleCount === 0) return 0.5;\n const successRate = s.successCount / s.sampleCount;\n const avgRetries = s.totalRetries / s.sampleCount;\n const retryPenalty = Math.min(0.4, avgRetries / 3);\n return Math.max(0.05, successRate * (1 - retryPenalty));\n }\n\n /**\n * Returns 0.1–1.0. Cheaper models score higher, with the penalty scaled\n * down for complex tasks (where capability matters more than cost).\n *\n * blended cost = input + 2 × output (output tokens are typically pricier).\n * normalised over $0.05 blended as the \"expensive\" ceiling.\n */\n costEfficiencyScore(model: ModelInfo, complexity: 1 | 2 | 3 | 4 | 5): number {\n const blended = model.inputCostPer1kTokens + model.outputCostPer1kTokens * 2;\n const normalised = Math.min(1.0, blended / 0.05);\n // complexityWeight: 1.0 for trivial tasks → 0.2 for research-grade\n const complexityWeight = (6 - complexity) / 5;\n return Math.max(0.1, 1 - normalised * complexityWeight);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Runtime Tool Creator (opt-in)\n// ─────────────────────────────────────────────\n//\n// Allows Cascade to generate and register new tools at runtime when no\n// existing tool can handle a required operation.\n//\n// SAFETY:\n// - Requires `enableToolCreation: true` in config (on by default)\n// - Generated tools run in node:vm with a restricted sandbox\n// - Generated tools CAN call existing registered cascade tools via callTool()\n// - Dangerous tool access requires approval via the PermissionEscalator chain\n// (T3 → T2 → T1 → user) before execution\n// - Tools are session-scoped and not persisted\n//\n\nimport { Worker } from 'node:worker_threads';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { BaseTool } from './base.js';\nimport { safeFetch } from './utils/safe-fetch.js';\nimport type { ToolExecuteOptions } from '../types.js';\nimport type { ToolRegistry } from './registry.js';\nimport type { CascadeRouter } from '../core/router/index.js';\nimport type { PermissionEscalator } from '../core/permissions/escalator.js';\nimport type { PermissionRequest } from '../types.js';\n\n// ── Generated tool schema ──────────────────────\n\nexport interface GeneratedToolSpec {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n /** Raw JS function body — receives `input`, `fetch`, and `callTool`. Returns string | Promise<string> */\n executeCode: string;\n isDangerous: boolean;\n /**\n * Whether this tool's source is trusted (generated in THIS session) vs untrusted\n * (loaded from disk or received from a peer). Untrusted tools always re-escalate\n * their dangerous actions. Never persisted as trusted — forced false on reload.\n */\n trusted?: boolean;\n}\n\n/** File (under .cascade/) where created tools persist between runs. */\nconst DYNAMIC_TOOLS_FILE = 'dynamic-tools.json';\n\n/**\n * Wrap a generated `inputSchema` into a valid JSON Schema object. LLMs commonly\n * emit just a properties map (`{ path: { type, description } }`); passed through\n * as-is that is malformed for every provider's function-calling. Detect the\n * already-correct shape and otherwise wrap it so created tools are callable on\n * Anthropic, OpenAI, Gemini, and Ollama alike.\n */\nexport function normalizeToolSchema(schema: Record<string, unknown>): Record<string, unknown> {\n if (schema && schema['type'] === 'object' && typeof schema['properties'] === 'object') {\n return schema;\n }\n const properties = (schema && typeof schema === 'object') ? schema : {};\n return {\n type: 'object',\n properties,\n required: Object.keys(properties),\n };\n}\n\n/** Normalised capability fingerprint, used to avoid re-creating the same tool. */\nfunction capabilityKey(text: string): string {\n return Array.from(\n new Set((text.toLowerCase().match(/[a-z0-9]+/g) ?? []).filter(w => w.length > 2)),\n ).sort().join(' ');\n}\n\n// ── Worker sandbox ─────────────────────────────\n//\n// Generated (LLM-authored, hence UNTRUSTED) code runs in a node:worker_threads\n// Worker, not in the main process. node:vm was never a security boundary — its\n// `timeout` can't stop async runaway, the code shares the main heap, and a throw\n// can take down the Ink TUI. The worker gives an enforceable kill timeout\n// (worker.terminate()), a memory cap (resourceLimits), and crash containment,\n// and — crucially — keeps Cascade's privileged objects (registry, router, the\n// PermissionEscalator) on the MAIN thread. The worker reaches them ONLY through a\n// message bridge whose callTool path is gated by the escalator and whose fetch\n// path is SSRF-guarded by safeFetch. (A hard V8 isolate would need isolated-vm;\n// worker + gating is the chosen dependency-free boundary.)\n\nconst DYNAMIC_TOOL_TIMEOUT_MS = 15_000;\nconst DYNAMIC_FETCH_MAX = 1_000_000;\n\n// Fixed harness run inside the worker. The generated `executeCode` arrives as DATA\n// via workerData (never imported as a module); `callTool`/`fetch` are bridged to\n// the main thread. No `require`/`process` is in the generated code's scope.\nconst HARNESS_SRC = `\nconst { parentPort, workerData } = require('node:worker_threads');\nconst { executeCode, input } = workerData;\nlet nextId = 0;\nconst pending = new Map();\nfunction bridge(kind, payload) {\n return new Promise((resolve, reject) => {\n const id = nextId++;\n pending.set(id, { resolve, reject });\n parentPort.postMessage(Object.assign({ kind, id }, payload));\n });\n}\nparentPort.on('message', (msg) => {\n const p = pending.get(msg.id);\n if (!p) return;\n pending.delete(msg.id);\n if (msg.error !== undefined) p.reject(new Error(msg.error));\n else p.resolve(msg.value);\n});\nconst callTool = (name, toolInput) => bridge('callTool', { name: name, input: toolInput });\nconst fetch = async (url, init) => {\n const safeInit = init && typeof init === 'object'\n ? { method: init.method, headers: init.headers, body: typeof init.body === 'string' ? init.body : undefined }\n : undefined;\n const r = await bridge('fetch', { url: url, init: safeInit });\n return {\n ok: r.ok, status: r.status, statusText: r.statusText,\n headers: { get: (k) => (String(k).toLowerCase() === 'content-type' ? r.contentType : null) },\n text: async () => r.body,\n json: async () => JSON.parse(r.body),\n };\n};\n(async () => {\n const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor;\n const fn = new AsyncFunction('input', 'callTool', 'fetch', 'console', executeCode);\n return await fn(input, callTool, fetch, { log() {}, error() {} });\n})()\n .then((r) => parentPort.postMessage({ kind: 'result', value: String(r == null ? '' : r) }))\n .catch((e) => parentPort.postMessage({ kind: 'result', value: 'Tool error: ' + (e && e.message ? e.message : String(e)) }));\n`;\n\n/**\n * Validate that generated code compiles with the SAME async signature the worker\n * uses to run it, so `await callTool(...)` / `await fetch(...)` are valid (a plain\n * sync `new Function` wrongly rejects every I/O tool). Reused on creation AND when\n * re-validating untrusted persisted/peer specs before re-registering them.\n */\nexport function isExecutableToolCode(code: string): boolean {\n try {\n const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor as FunctionConstructor;\n new AsyncFunction('input', 'callTool', 'fetch', 'console', code);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Run an agent-supplied fetch on the MAIN thread through the SSRF guard, marshaling\n * a minimal Response for the worker (a real Response can't cross the thread). */\nasync function bridgeFetch(\n url: string,\n init: unknown,\n): Promise<{ ok: boolean; status: number; statusText: string; contentType: string; body: string } | { __error: string }> {\n try {\n const i = (init && typeof init === 'object') ? (init as Record<string, unknown>) : {};\n const resp = await safeFetch(url, {\n method: typeof i['method'] === 'string' ? (i['method'] as string) : undefined,\n headers: i['headers'] as Record<string, string> | undefined,\n body: typeof i['body'] === 'string' ? (i['body'] as string) : undefined,\n });\n const contentType = resp.headers.get('content-type') ?? '';\n let body = '';\n try { body = await resp.text(); } catch { body = ''; }\n if (body.length > DYNAMIC_FETCH_MAX) body = body.slice(0, DYNAMIC_FETCH_MAX);\n return { ok: resp.ok, status: resp.status, statusText: resp.statusText, contentType, body };\n } catch (err) {\n // SSRF block / network error → reject the worker's fetch (like a real failure).\n return { __error: err instanceof Error ? err.message : String(err) };\n }\n}\n\n// ── Dynamic tool class factory ─────────────────\n\nclass DynamicTool extends BaseTool {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: Record<string, unknown>;\n private executeCode: string;\n private _isDangerous: boolean;\n private registry: ToolRegistry;\n /** Resolve the CURRENT escalator at call time — covers tools registered before\n * the per-run escalator was wired (persisted at init, received from a peer). */\n private getEscalator: () => PermissionEscalator | undefined;\n /** Untrusted = loaded from disk / a peer; its dangerous calls always re-prompt. */\n private trusted: boolean;\n\n constructor(\n spec: GeneratedToolSpec,\n registry: ToolRegistry,\n getEscalator: () => PermissionEscalator | undefined,\n trusted: boolean,\n ) {\n super();\n this.name = spec.name;\n this.description = spec.description;\n this.inputSchema = spec.inputSchema;\n this.executeCode = spec.executeCode;\n this._isDangerous = spec.isDangerous;\n this.registry = registry;\n this.getEscalator = getEscalator;\n this.trusted = trusted;\n }\n\n isDangerous(): boolean {\n return this._isDangerous;\n }\n\n async execute(input: Record<string, unknown>, options: ToolExecuteOptions): Promise<string> {\n const registry = this.registry;\n\n // callTool runs on the MAIN thread (the worker bridges to it). Dangerous tools\n // require escalation; when NO approver is available we DEFAULT-DENY rather than\n // execute. Untrusted tools always re-prompt (forceReprompt bypasses the cache).\n const callTool = async (toolName: string, toolInput: Record<string, unknown>): Promise<string> => {\n if (!registry.hasTool(toolName)) return `Tool not found: ${toolName}`;\n\n if (registry.isDangerous(toolName)) {\n const escalator = this.getEscalator();\n if (!escalator) {\n return `Permission denied for \"${toolName}\": dynamic tool \"${this.name}\" has no approver available (default-deny).`;\n }\n const req: PermissionRequest = {\n id: `dynamic-${this.name}-${toolName}-${Date.now()}`,\n requestedBy: `dynamic_tool:${this.name}`,\n parentT2Id: options.tierId,\n toolName,\n input: toolInput,\n isDangerous: true,\n subtaskContext: `Dynamic tool \"${this.name}\" (${this.trusted ? 'trusted' : 'UNTRUSTED'}) requesting access to \"${toolName}\"`,\n sectionContext: `Dynamic tool \"${this.name}\"`,\n forceReprompt: !this.trusted,\n };\n const decision = await escalator.requestPermission(req);\n if (!decision.approved) {\n return `Permission denied for ${toolName} (decided by ${decision.decidedBy}).`;\n }\n }\n\n try {\n const result = await registry.execute(toolName, toolInput, options);\n return typeof result === 'string' ? result : JSON.stringify(result);\n } catch (err) {\n return `Error calling ${toolName}: ${err instanceof Error ? err.message : String(err)}`;\n }\n };\n\n return this.runInWorker(input, callTool);\n }\n\n /** Spawn the worker, service its callTool/fetch bridge, enforce the kill timeout. */\n private runInWorker(\n input: Record<string, unknown>,\n callTool: (name: string, input: Record<string, unknown>) => Promise<string>,\n ): Promise<string> {\n // Tunable kill timeout (ops may shorten/lengthen; min 200ms).\n const timeoutMs = Math.max(200, Number(process.env['CASCADE_DYNAMIC_TOOL_TIMEOUT_MS']) || DYNAMIC_TOOL_TIMEOUT_MS);\n return new Promise<string>((resolve) => {\n let settled = false;\n const worker = new Worker(HARNESS_SRC, {\n eval: true,\n workerData: { executeCode: this.executeCode, input },\n resourceLimits: { maxOldGenerationSizeMb: 128 },\n });\n\n const finish = (value: string) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n void worker.terminate();\n resolve(value);\n };\n\n const timer = setTimeout(\n () => finish(`Dynamic tool \"${this.name}\" timed out after ${timeoutMs}ms and was terminated.`),\n timeoutMs,\n );\n timer.unref?.();\n\n worker.on('message', (msg: { kind?: string; id?: number; name?: string; input?: unknown; url?: string; init?: unknown; value?: unknown }) => {\n if (msg?.kind === 'result') {\n finish(typeof msg.value === 'string' ? msg.value : String(msg.value ?? ''));\n } else if (msg?.kind === 'callTool') {\n void (async () => {\n const value = await callTool(String(msg.name), (msg.input ?? {}) as Record<string, unknown>);\n if (!settled) worker.postMessage({ id: msg.id, value });\n })();\n } else if (msg?.kind === 'fetch') {\n void (async () => {\n const r = await bridgeFetch(String(msg.url), msg.init);\n if (settled) return;\n if ('__error' in r) worker.postMessage({ id: msg.id, error: r.__error });\n else worker.postMessage({ id: msg.id, value: r });\n })();\n }\n });\n worker.on('error', (err) => finish(`Dynamic tool error: ${err instanceof Error ? err.message : String(err)}`));\n worker.on('exit', (code) => { if (code !== 0) finish(`Dynamic tool \"${this.name}\" exited unexpectedly (code ${code}).`); });\n });\n }\n}\n\n// ── ToolCreator class ──────────────────────────\n\nconst TOOL_CREATOR_PROMPT = `You are a tool-generation assistant for the Cascade AI system.\nGenerate a minimal, safe JavaScript tool function for the described operation.\n\nRules:\n- Return ONLY a JSON object with these fields: name, description, inputSchema, executeCode, isDangerous\n- executeCode is a self-contained JavaScript async function body that:\n - Receives: input (object), fetch (for HTTP), callTool(toolName, input) (to call any registered cascade tool)\n - Returns: a string result\n - For file operations, prefer: await callTool('file_read', { path: input.path })\n - For shell commands, prefer: await callTool('shell', { command: 'ls -la' })\n - For pure computation / HTTP: use fetch or built-ins (JSON, Math, Date, String, Number, Array, Object)\n - Must complete in under 15 seconds\n- isDangerous: true if the tool calls dangerous cascade tools (shell, file_write, file_delete, git) or makes HTTP calls that write data\n- name must be snake_case, start with \"dynamic_\", max 40 chars\n- description must be ≤ 120 chars\n\nExample for a file-summary tool:\n{\n \"name\": \"dynamic_summarize_file\",\n \"description\": \"Read a file and return a one-paragraph summary\",\n \"inputSchema\": { \"path\": { \"type\": \"string\", \"description\": \"File path to summarize\" } },\n \"executeCode\": \"const content = await callTool('file_read', { path: input.path }); return content.slice(0, 500);\",\n \"isDangerous\": false\n}\n\nReturn ONLY valid JSON — no other text.`;\n\nexport class ToolCreator {\n private router: CascadeRouter;\n private registry: ToolRegistry;\n private escalator?: PermissionEscalator;\n private workspacePath?: string;\n /** When false, persisted tools are neither loaded nor written. */\n private persistEnabled: boolean;\n private logger?: (msg: string) => void;\n /** name → spec, for persistence, broadcast, and re-registration. */\n private specs = new Map<string, GeneratedToolSpec>();\n /** capability fingerprint → tool name, so the same need isn't re-generated. */\n private capabilityIndex = new Map<string, string>();\n\n constructor(router: CascadeRouter, registry: ToolRegistry, workspacePath?: string, persistEnabled = true) {\n this.router = router;\n this.registry = registry;\n this.workspacePath = workspacePath;\n this.persistEnabled = persistEnabled;\n }\n\n setPermissionEscalator(escalator: PermissionEscalator): void {\n this.escalator = escalator;\n }\n\n /** Route diagnostics through the host (Cascade) so they survive the Ink TUI. */\n setLogger(fn: (msg: string) => void): void {\n this.logger = fn;\n }\n\n /** Returns the stored spec for a created tool (for peer broadcast). */\n getSpec(name: string): GeneratedToolSpec | undefined {\n return this.specs.get(name);\n }\n\n private log(msg: string): void {\n if (this.logger) this.logger(msg);\n }\n\n /**\n * Generate a new tool from a description and register it with the ToolRegistry.\n * Returns the tool name on success, or null on failure (with a logged reason —\n * failures are no longer swallowed silently). Reuses an existing tool when the\n * same capability has already been created (dedup) so peers/runs don't\n * regenerate identical tools.\n */\n async createTool(description: string, context: string): Promise<string | null> {\n // ── Dedup: reuse a previously created tool for the same capability ──\n const key = capabilityKey(`${description} ${context}`);\n const existing = this.capabilityIndex.get(key);\n if (existing && this.registry.hasTool(existing)) {\n this.log(`[tool-creator] Reusing existing tool \"${existing}\" for: ${description.slice(0, 80)}`);\n return existing;\n }\n\n const prompt = `${TOOL_CREATOR_PROMPT}\n\nTask context: ${context.slice(0, 200)}\nRequired capability: ${description.slice(0, 300)}`;\n\n let spec: GeneratedToolSpec | null = null;\n // One retry — weak models often miss strict-JSON on the first attempt.\n for (let attempt = 1; attempt <= 2 && !spec; attempt++) {\n try {\n const result = await this.router.generate('T3', {\n messages: [{ role: 'user', content: prompt }],\n maxTokens: 800,\n });\n const jsonMatch = /\\{[\\s\\S]*\\}/.exec(result.content);\n if (!jsonMatch) {\n this.log(`[tool-creator] Attempt ${attempt}: model returned no JSON object.`);\n continue;\n }\n const parsed = JSON.parse(jsonMatch[0]) as GeneratedToolSpec;\n if (!parsed.name || !parsed.description || !parsed.executeCode || !parsed.inputSchema) {\n this.log(`[tool-creator] Attempt ${attempt}: spec missing required fields (name/description/executeCode/inputSchema).`);\n continue;\n }\n spec = parsed;\n } catch (err) {\n this.log(`[tool-creator] Attempt ${attempt} failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n if (!spec) {\n this.log(`[tool-creator] Could not generate a tool for: ${description.slice(0, 80)}`);\n return null;\n }\n\n // Wrap a bare properties map into a valid object schema so the tool is\n // callable across every provider.\n spec.inputSchema = normalizeToolSchema(spec.inputSchema);\n\n // Ensure a unique name\n if (this.specs.has(spec.name) || this.registry.hasTool(spec.name)) {\n spec.name = `${spec.name}_${Date.now() % 10000}`;\n }\n\n // Validate the code compiles with the worker's async signature before\n // registering (the v0.9.5 fix — a sync check wrongly rejected every I/O tool).\n if (!isExecutableToolCode(spec.executeCode)) {\n this.log(`[tool-creator] Generated code for \"${spec.name}\" has a syntax error — discarded.`);\n return null;\n }\n\n // Generated in THIS session → trusted.\n this.registerSpec(spec, true);\n this.capabilityIndex.set(key, spec.name);\n this.log(`[tool-creator] Created tool \"${spec.name}\".`);\n\n // Persist so the tool survives future runs (peers are notified by the T2\n // manager over its worker bus right after this returns).\n void this.persist();\n\n return spec.name;\n }\n\n /**\n * Register a spec (from createTool, disk, or a peer) into the registry.\n * Idempotent — a name already present is skipped. `trusted` is set by the\n * caller and never inherited from disk: createTool passes true; persisted and\n * peer-broadcast specs pass false, so their dangerous actions always re-escalate.\n * The DynamicTool resolves the escalator lazily (`() => this.escalator`) so a\n * later setPermissionEscalator covers tools registered before the run wired it.\n */\n registerSpec(spec: GeneratedToolSpec, trusted = false): void {\n spec.trusted = trusted;\n if (this.registry.hasTool(spec.name)) {\n this.specs.set(spec.name, spec);\n return;\n }\n const tool = new DynamicTool(spec, this.registry, () => this.escalator, trusted);\n this.registry.register(tool);\n this.specs.set(spec.name, spec);\n this.capabilityIndex.set(capabilityKey(`${spec.description}`), spec.name);\n }\n\n /** Load tools persisted by previous runs and register them — as UNTRUSTED, and\n * only after re-validating each spec (its source could have been tampered with\n * or authored during a prior prompt-injected run). Untrusted tools re-escalate\n * any dangerous action, so a silently-reloaded tool can't act without approval. */\n async loadPersistedTools(): Promise<void> {\n if (!this.workspacePath || !this.persistEnabled) return;\n const file = path.join(this.workspacePath, '.cascade', DYNAMIC_TOOLS_FILE);\n try {\n const raw = await fs.readFile(file, 'utf-8');\n const specs = JSON.parse(raw) as GeneratedToolSpec[];\n if (!Array.isArray(specs)) return;\n let loaded = 0;\n let skipped = 0;\n for (const spec of specs) {\n if (!(spec?.name && spec.description && spec.executeCode && spec.inputSchema)\n || !isExecutableToolCode(spec.executeCode)) {\n skipped++;\n continue;\n }\n spec.inputSchema = normalizeToolSchema(spec.inputSchema);\n this.registerSpec(spec, false); // persisted → untrusted\n loaded++;\n }\n if (loaded || skipped) {\n this.log(`[tool-creator] Loaded ${loaded} persisted tool(s) as untrusted${skipped ? `, skipped ${skipped} invalid` : ''}.`);\n }\n } catch {\n // No persisted file yet, or unreadable — start fresh.\n }\n }\n\n private async persist(): Promise<void> {\n if (!this.workspacePath || !this.persistEnabled) return;\n const dir = path.join(this.workspacePath, '.cascade');\n const file = path.join(dir, DYNAMIC_TOOLS_FILE);\n try {\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(file, JSON.stringify(Array.from(this.specs.values()), null, 2), 'utf-8');\n } catch (err) {\n this.log(`[tool-creator] Failed to persist tools: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n /** Returns the names of all tools created in this session. */\n getCreatedTools(): string[] {\n return Array.from(this.specs.keys());\n }\n}\n","import EventEmitter from 'node:events';\nimport { randomUUID } from 'node:crypto';\nimport path from 'node:path';\nimport { glob } from 'glob';\nimport type {\n ApprovalRequest,\n ApprovalResponse,\n CascadeConfig,\n CascadeRunOptions,\n CascadeRunResult,\n ConversationMessage,\n ImageAttachment,\n PermissionRequest,\n StreamChunk,\n TaskComplexity,\n TierRole,\n T3Result\n} from '../types.js';\nimport { CascadeRouter } from './router/index.js';\nimport { T1Administrator, type PlanApprovalDecision, type TaskPlan } from './tiers/t1-administrator.js';\nimport { calculateCost } from '../utils/cost.js';\nimport { T2Manager } from './tiers/t2-manager.js';\nimport { T3Worker } from './tiers/t3-worker.js';\nimport { ToolRegistry } from '../tools/registry.js';\nimport { McpClient } from '../mcp/client.js';\nimport { AuditLogger } from '../audit/log.js';\nimport { MemoryStore } from '../memory/store.js';\nimport { PermissionEscalator } from './permissions/escalator.js';\nimport { validateConfig } from '../config/validate.js';\nimport { Telemetry, noopTelemetry } from '../telemetry/index.js';\nimport { TaskAnalyzer } from './router/task-analyzer.js';\nimport { ModelPerformanceTracker } from './router/model-performance-tracker.js';\nimport { benchmarkScore01 } from './router/benchmarks.js';\nimport { ToolCreator } from '../tools/tool-creator.js';\nimport { CascadeCancelledError } from '../utils/retry.js';\n\n/** One entry in the per-run orchestration decision trail (see /why). */\nexport interface DecisionLogEntry {\n at: string;\n kind: 'complexity' | 'model' | 'failover' | 'escalation';\n detail: string;\n}\n\nexport class Cascade extends EventEmitter {\n private router: CascadeRouter;\n private toolRegistry: ToolRegistry;\n private mcpClient: McpClient;\n private config: CascadeConfig;\n /** Orchestration decisions for the CURRENT run — cleared on each run(). */\n private decisionLog: DecisionLogEntry[] = [];\n private initialized = false;\n /** Last task that stopped at the budget cap — powers /continue (resumeRun). */\n private lastInterruptedRun?: { prompt: string; partialOutput: string; taskId: string };\n private initPromise?: Promise<void>;\n private store?: MemoryStore;\n private audit?: AuditLogger;\n private telemetry: Pick<Telemetry, 'capture' | 'shutdown'>;\n private taskAnalyzer?: TaskAnalyzer;\n private perfTracker?: ModelPerformanceTracker;\n private toolCreator?: ToolCreator;\n private workspacePath: string;\n\n constructor(config: CascadeConfig, workspacePath: string, store?: MemoryStore) {\n super();\n // Validate config eagerly so users get a clear error at startup, not at run time\n this.config = validateConfig(config) as CascadeConfig;\n this.workspacePath = workspacePath;\n this.store = store;\n this.router = new CascadeRouter();\n this.mcpClient = new McpClient({\n trustedServers: this.config.tools.mcpTrusted,\n approvalCallback: async (server) => {\n // Surface as a generic permission event so REPL / dashboard / SDK\n // consumers can all plug the same approval dialog in.\n return await this.requestMcpApproval(server);\n },\n // Route warnings through the event stream when anyone is listening —\n // a raw console write while the TUI is live corrupts Ink's frame.\n onWarn: (message) => {\n if (this.listenerCount('log') > 0) this.emit('log', { level: 'warn', message });\n else console.warn(message);\n },\n });\n this.toolRegistry = new ToolRegistry(this.config.tools, workspacePath);\n this.telemetry = config.telemetry?.enabled\n ? new Telemetry(config.telemetry, config.telemetry.distinctId ?? 'anonymous')\n : noopTelemetry;\n }\n\n private initOptionalFeatures(): void {\n if (this.config.cascadeAuto === true) {\n this.perfTracker = new ModelPerformanceTracker();\n void this.perfTracker.load(); // non-blocking; stats available before first run completes\n this.taskAnalyzer = new TaskAnalyzer(this.perfTracker, this.config.autoBias ?? 'balanced');\n // Share the analyzer with the router so workers can route each subtask to\n // the benchmark-best model for its type.\n this.router.setTaskAnalyzer(this.taskAnalyzer);\n }\n const cfg = this.config as unknown as Record<string, unknown>;\n if (cfg['enableToolCreation'] === true) {\n this.toolCreator = new ToolCreator(this.router, this.toolRegistry, this.workspacePath, cfg['persistDynamicTools'] !== false);\n this.toolCreator.setLogger((m) => {\n if (this.listenerCount('log') > 0) this.emit('log', { level: 'info', message: m });\n });\n }\n }\n\n setStore(store: MemoryStore): void {\n this.store = store;\n }\n\n /**\n * Emit an `mcp:approval-required` event and wait up to 30 s for a listener\n * to resolve it via `cascade.resolveMcpApproval(serverName, approved)`.\n *\n * If no listener is attached (e.g. a non-interactive SDK run), the default\n * is to reject — safer than silently spawning an arbitrary subprocess.\n */\n private pendingMcpApprovals: Map<string, (approved: boolean) => void> = new Map();\n\n private async requestMcpApproval(server: { name: string; command: string; args?: string[] }): Promise<boolean> {\n // No listeners → reject. Callers can add a listener BEFORE init() runs\n // when they need to approve servers programmatically.\n if (this.listenerCount('mcp:approval-required') === 0) {\n return false;\n }\n return await new Promise<boolean>((resolve) => {\n this.pendingMcpApprovals.set(server.name, resolve);\n const timeout = setTimeout(() => {\n if (this.pendingMcpApprovals.delete(server.name)) resolve(false);\n }, 30_000);\n // If the caller resolves, also clear the timeout.\n const wrap = (approved: boolean) => {\n clearTimeout(timeout);\n resolve(approved);\n };\n this.pendingMcpApprovals.set(server.name, wrap);\n this.emit('mcp:approval-required', { server });\n });\n }\n\n private recordDecision(kind: DecisionLogEntry['kind'], detail: string): void {\n this.decisionLog.push({ at: new Date().toISOString(), kind, detail });\n }\n\n /**\n * The orchestration decision trail for the most recent run: complexity\n * verdict (and why), which model served each tier, failovers, and\n * escalations. Powers the /why command.\n */\n getDecisionLog(): DecisionLogEntry[] {\n return [...this.decisionLog];\n }\n\n /** Resolve a pending MCP server approval from a REPL / dashboard listener. */\n resolveMcpApproval(serverName: string, approved: boolean): void {\n const resolver = this.pendingMcpApprovals.get(serverName);\n if (resolver) {\n this.pendingMcpApprovals.delete(serverName);\n resolver(approved);\n }\n }\n\n // ── Boardroom plan approval ─────────────────────────────────────────\n // Same gate pattern as MCP approvals, with the opposite default: plans\n // are work the user asked for, so no listener (SDK/headless) or a\n // timeout means PROCEED, not reject.\n\n private pendingPlanApproval?: (decision: PlanApprovalDecision) => void;\n\n private async requestPlanApproval(plan: TaskPlan, taskId: string, critique?: string, summary?: string): Promise<PlanApprovalDecision> {\n // Autonomous mode: skip the boardroom wait and proceed.\n if (this.config.autonomy === 'auto') {\n return { approved: true };\n }\n if (this.listenerCount('plan:approval-required') === 0) {\n return { approved: true };\n }\n const t2Count = plan.sections.length;\n const t3Count = plan.sections.reduce((sum, s) => sum + (s.t3Subtasks?.length ?? 0), 0);\n return await new Promise<PlanApprovalDecision>((resolve) => {\n const timeout = setTimeout(() => {\n if (this.pendingPlanApproval) {\n this.pendingPlanApproval = undefined;\n resolve({ approved: true });\n }\n }, 120_000);\n this.pendingPlanApproval = (decision) => {\n clearTimeout(timeout);\n this.pendingPlanApproval = undefined;\n resolve(decision);\n };\n this.emit('plan:approval-required', {\n taskId,\n plan,\n t2Count,\n t3Count,\n estCostUsd: this.estimatePlanCost(plan),\n critique,\n summary,\n });\n });\n }\n\n /**\n * Resolve a pending boardroom plan approval from a REPL / dashboard listener.\n * An optional `note` re-plans and re-asks; an optional `editedPlan` is applied\n * directly (no re-decompose).\n */\n resolvePlanApproval(approved: boolean, note?: string, editedPlan?: TaskPlan): void {\n this.pendingPlanApproval?.({ approved, note, editedPlan });\n }\n\n /**\n * Autonomy control (used by the /auto command). 'auto' makes the next run\n * hands-off: the plan gate auto-approves and non-dangerous tools auto-approve,\n * while dangerous tools still escalate and budget caps remain the hard stop.\n */\n setAutonomy(mode: 'manual' | 'auto'): void {\n this.config = { ...this.config, autonomy: mode };\n }\n\n getAutonomy(): 'manual' | 'auto' {\n return this.config.autonomy === 'auto' ? 'auto' : 'manual';\n }\n\n /**\n * Preview T1's decomposition for a prompt WITHOUT executing it (powers /plan).\n * Idempotent init guard, so it works before the first run.\n */\n async previewPlan(prompt: string): Promise<TaskPlan> {\n await this.init();\n const t1 = new T1Administrator(this.router, this.toolRegistry, this.config);\n if (this.store) t1.setStore(this.store);\n return t1.previewPlan(prompt);\n }\n\n /** True when a task stopped at the budget cap and can be resumed via /continue. */\n hasResumableRun(): boolean {\n return this.lastInterruptedRun != null;\n }\n\n /**\n * Raise the per-run token budget for a resume and return the continuation\n * prompt (or null when nothing is resumable). Consumes the interrupted-run\n * state. The REPL submits the returned prompt through its normal flow so the\n * resumed run renders like any other; `resumeRun` wraps this for SDK callers.\n */\n prepareResume(opts: { maxTokens?: number } = {}): string | null {\n const last = this.lastInterruptedRun;\n if (!last) return null;\n this.lastInterruptedRun = undefined; // consume it\n\n const raised = opts.maxTokens ?? Math.round((this.config.budget?.maxTokensPerRun ?? 200_000) * 2);\n this.config = { ...this.config, budget: { ...this.config.budget, maxTokensPerRun: raised } };\n this.router.setMaxTokensPerRun(raised);\n\n return (\n 'Continue and FINISH this task. A previous attempt was interrupted before completion; ' +\n 'any files already created are on disk — build on them, do NOT recreate them. Complete only the remaining work.\\n\\n' +\n `Original task: ${last.prompt}` +\n (last.partialOutput ? `\\n\\nPartial result so far:\\n${last.partialOutput}` : '')\n );\n }\n\n /**\n * Resume the last budget-capped task with a raised budget (SDK/headless).\n * Returns null when there is nothing to resume.\n */\n async resumeRun(opts: { maxTokens?: number } = {}): Promise<CascadeRunResult | null> {\n const prompt = this.prepareResume(opts);\n if (!prompt) return null;\n return this.run({ prompt });\n }\n\n /**\n * Rough pre-execution cost estimate for a plan: ~3 T2 calls per section\n * plus ~4 T3 calls per subtask at typical token volumes. A ballpark for\n * the approval dialog, not an invoice — always label it \"est.\"\n */\n private estimatePlanCost(plan: TaskPlan): number {\n const T2_CALLS_PER_SECTION = 3;\n const T3_CALLS_PER_SUBTASK = 4;\n const IN_TOKENS = 1500;\n const OUT_TOKENS = 700;\n const t2Model = this.router.getTierModel('T2');\n const t3Model = this.router.getTierModel('T3');\n let est = 0;\n for (const section of plan.sections) {\n if (t2Model) est += T2_CALLS_PER_SECTION * calculateCost(IN_TOKENS, OUT_TOKENS, t2Model);\n const subtasks = section.t3Subtasks?.length ?? 1;\n if (t3Model) est += subtasks * T3_CALLS_PER_SUBTASK * calculateCost(IN_TOKENS, OUT_TOKENS, t3Model);\n }\n return est;\n }\n\n async init(): Promise<void> {\n if (this.initialized) return;\n // Concurrent callers (e.g. the REPL eagerly calls init() and the first\n // run() also awaits init()) must share the SAME init promise. Otherwise\n // the MCP client would open duplicate connections and budget:warning\n // would be registered twice, causing double-emission.\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n await this.router.init(this.config);\n\n // Bubble budget:warning events from the router up to Cascade consumers\n this.router.on('budget:warning', (payload: {\n spentUsd: number;\n capUsd: number;\n spendPct: number;\n warnAtPct: number;\n remainingUsd: number;\n }) => {\n this.emit('budget:warning', payload);\n });\n\n // Record provider failovers in the per-run decision trail (/why).\n this.router.on('failover', (e: { tier: string; from: string; to: string; reason: string }) => {\n this.recordDecision('failover', `${e.tier} ${e.from} → ${e.to} (${e.reason})`);\n });\n\n // Budget hard-kill: cancel any pending user approvals and notify\n // consumers so the REPL/dashboard can tear down gracefully instead\n // of waiting for an approval that will never resolve.\n this.router.on('budget:exceeded', (payload: { reason: string; spentUsd: number }) => {\n this.emit('budget:exceeded', payload);\n for (const [name, resolver] of this.pendingMcpApprovals) {\n resolver(false);\n this.pendingMcpApprovals.delete(name);\n }\n });\n\n // Initialize MCP servers\n if (this.config.tools.mcpServers?.length) {\n for (const server of this.config.tools.mcpServers) {\n try {\n await this.mcpClient.connect(server);\n this.toolRegistry.registerMcpTools(this.mcpClient);\n } catch (err) {\n console.error(`Failed to connect to MCP server \"${server.name}\":`, err);\n }\n }\n }\n\n // Load external plugins declared in config.plugins\n const pluginPaths = (this.config as unknown as Record<string, unknown>)['plugins'] as string[] | undefined;\n if (pluginPaths?.length) {\n for (const pluginPath of pluginPaths) {\n try {\n const mod = await import(pluginPath);\n const plugin = (mod.default ?? mod) as import('../tools/registry.js').ToolPlugin;\n if (plugin && Array.isArray(plugin.tools)) {\n this.toolRegistry.registerPlugin(plugin);\n } else {\n console.warn(`[cascade] Plugin \"${pluginPath}\" does not export a valid ToolPlugin.`);\n }\n } catch (err) {\n console.warn(`[cascade] Failed to load plugin \"${pluginPath}\":`, err);\n }\n }\n }\n\n // Model specialization profiling (cascadeAuto mode) — non-blocking\n if (this.config.cascadeAuto && this.store) {\n this.router.profileModels(this.store).catch(() => { /* non-fatal */ });\n }\n\n // Cascade Auto live data: validate model ids against each provider and\n // fetch current public benchmark scores + prices. Background, non-blocking\n // — the bundled catalog/benchmarks are used until (or unless) it lands.\n if (this.config.cascadeAuto) {\n this.router.refreshLiveData().catch(() => { /* non-fatal */ });\n }\n\n this.initOptionalFeatures();\n // Re-register tools created in previous runs so identical capabilities\n // aren't generated again from scratch.\n if (this.toolCreator) await this.toolCreator.loadPersistedTools();\n this.initialized = true;\n })();\n\n try {\n await this.initPromise;\n } catch (err) {\n // Allow a retry after a failed init.\n this.initPromise = undefined;\n throw err;\n }\n }\n\n private isCasualGreeting(prompt: string): boolean {\n const casual = /^(hi|hello|hey|greetings|thanks|thank you|thx|bye|goodbye|cya)$/i.test(prompt.trim().replace(/[!?.]+$/, ''));\n return casual;\n }\n\n private looksLikeSimpleArtifactTask(prompt: string): boolean {\n return /create .*\\.(txt|md|json|csv)\\b/i.test(prompt)\n && !/(research|compare|thorough|pdf|report|analy[sz]e|architecture|multi-agent)/i.test(prompt);\n }\n\n private looksLikeConversational(prompt: string): boolean {\n const LOW_COMPLEXITY = [\n /^(?:hi|hello|hey|thanks|thank you|ok|okay|yes|no|sure|got it|sounds good)\\b/i,\n /^(?:what is|what are|list|show me|tell me|who is|where is|when is|how do i)\\b/i,\n /\\b(?:simple|quick|brief|small|single|one-line|typo|rename)\\b/i,\n ];\n const wordCount = prompt.trim().split(/\\s+/).length;\n return wordCount <= 12 && LOW_COMPLEXITY.some(re => re.test(prompt.trim()));\n }\n\n /**\n * Read-only inquiries about existing content (\"read / review / explain /\n * summarize / analyze this file or codebase and tell me …\") are single-agent\n * work — one worker with file/grep tools answers directly, no T1→T2→T3 fan-out.\n * They must NOT ask to create, build, implement, refactor, or save an artifact;\n * those stay on the heavier classifier path. This keeps trivial \"what does this\n * do?\" requests from being mis-routed into a multi-agent, multi-thousand-token run.\n */\n private looksLikeReadOnlyInquiry(prompt: string): boolean {\n const p = prompt.trim();\n const inquiry = /\\b(?:read|review|explain|describe|summari[sz]e|analy[sz]e|assess|evaluate|inspect|examine|explore|go through|look at|tell me about|what (?:is|are|does|do)|is it|understand|novelty|novel idea)\\b/i.test(p);\n const producesArtifact = /\\b(?:create|build|implement|generate|write|refactor|rewrite|add|fix|deploy|install|migrate|scaffold|set up|save (?:a|the)|report|\\.(?:pdf|md|txt|json|csv|py|js|ts|tsx|jsx|html|docx?))\\b/i.test(p);\n return inquiry && !producesArtifact;\n }\n\n // Cache glob scan results per workspace path to avoid repeated I/O.\n private static globCache = new Map<string, { count: number; expiresAt: number }>();\n\n private async countWorkspaceFiles(workspacePath: string): Promise<number> {\n const now = Date.now();\n const cached = Cascade.globCache.get(workspacePath);\n if (cached && cached.expiresAt > now) return cached.count;\n try {\n const files = await glob('**/*.*', {\n cwd: workspacePath,\n ignore: ['node_modules/**', '.git/**', 'dist/**', 'build/**'],\n nodir: true,\n });\n Cascade.globCache.set(workspacePath, { count: files.length, expiresAt: now + 30_000 });\n return files.length;\n } catch {\n return 0;\n }\n }\n\n private async determineComplexity(\n prompt: string,\n workspacePath: string,\n conversationHistory: ConversationMessage[] = [],\n ): Promise<TaskComplexity> {\n if (this.isCasualGreeting(prompt)) {\n this.recordDecision('complexity', 'Simple — heuristic: casual greeting (no classifier call)');\n return 'Simple';\n }\n if (this.looksLikeSimpleArtifactTask(prompt)) {\n this.recordDecision('complexity', 'Simple — heuristic: single-file artifact task (no classifier call)');\n return 'Simple';\n }\n if (this.looksLikeConversational(prompt)) {\n this.recordDecision('complexity', 'Simple — heuristic: short conversational message (no classifier call)');\n return 'Simple';\n }\n if (this.looksLikeReadOnlyInquiry(prompt)) {\n this.recordDecision('complexity', 'Simple — heuristic: read-only inquiry over existing content (single agent, no classifier call)');\n return 'Simple';\n }\n\n // Quick workspace scout (cached for 30s)\n let workspaceContext = '';\n try {\n const count = await this.countWorkspaceFiles(workspacePath);\n workspaceContext = `Workspace Scout: Found ~${count} source files in the project.`;\n } catch {\n workspaceContext = 'Workspace Scout: Could not scan workspace.';\n }\n\n const sysPrompt = `You are a routing classifier for a hierarchical AI system. Determine task complexity using BOTH the latest user message and the recent conversation context.\n\n${workspaceContext}\n\nClassification:\n- \"Simple\": basic conversation, direct single-step work, or small troubleshooting\n- \"Moderate\": requires a few steps, some tool use, or a manager coordinating workers\n- \"Complex\": requires planning, multiple agents/sections, file artifact production, verification, research, or substantial implementation\n\nImportant rules:\n- Treat short follow-ups like \"proceed\", \"continue\", \"do it\", \"yes\" as referring to the recent context.\n- If the earlier context is complex, keep the inherited complexity unless the user clearly narrows scope.\n- Reading, explaining, summarizing, or analyzing existing files/code and answering a question — WITHOUT creating files or implementing changes — is \"Simple\" (single agent), never \"Complex\".\n- If the task asks for a simple single-file artifact like hello.txt, it is usually Moderate.\n- If the task asks for a saved report, PDF, implementation, or deeper verification workflow, it is at least Moderate and often Complex.\n\nRespond with the verdict word first, then a dash and a short reason (under 12 words).\nFormat: <Simple|Moderate|Complex> — <reason>`;\n\n const recentHistory = conversationHistory.slice(-6);\n const contextBlock = recentHistory.map((message, index) => {\n const content = typeof message.content === 'string'\n ? message.content\n : message.content.map((block) => block.type === 'text' ? block.text : '[non-text]').join(' ');\n return `${index + 1}. ${message.role}: ${content}`;\n }).join('\\n');\n\n const routedPrompt = contextBlock\n ? `Recent conversation:\n${contextBlock}\\n\\nLatest user message:\n${prompt}`\n : prompt;\n\n try {\n const result = await this.router.generate('T1', {\n messages: [{ role: 'user', content: routedPrompt }],\n systemPrompt: sysPrompt,\n maxTokens: 40,\n temperature: 0,\n });\n const content = result.content.trim();\n // Verdict is the FIRST word only — the reason text after the dash may\n // legitimately mention other levels (\"not complex enough for ...\").\n const firstWord = (content.split(/[\\s—–-]+/)[0] ?? '').toLowerCase();\n const reason = content.replace(/^\\S+\\s*[—–-]*\\s*/, '').trim();\n const verdict: TaskComplexity = firstWord.includes('simple')\n ? 'Simple'\n : firstWord.includes('moderate') ? 'Moderate' : 'Complex';\n this.recordDecision('complexity', `${verdict} — classifier: ${reason || 'no reason given'}`);\n return verdict;\n } catch {\n const followUpPrompt = /^(proceed|continue|go ahead|do it|yes|yep|ok|okay|carry on)$/i.test(prompt.trim());\n if (followUpPrompt && recentHistory.length > 0) {\n this.recordDecision('complexity', 'Complex — classifier unavailable; short follow-up inherits prior context');\n return 'Complex';\n }\n // A transient classifier failure must not silently route every task into\n // the most expensive full-hierarchy path — default to Moderate instead.\n this.recordDecision('complexity', 'Moderate — classifier unavailable; defaulting to the mid-cost route');\n return 'Moderate';\n }\n }\n\n async run(options: CascadeRunOptions): Promise<CascadeRunResult> {\n await this.init();\n // Reset the per-task budget allowance so this run starts with a fresh ceiling.\n this.router.beginRun();\n // Wire the abort signal into the router so a cancel aborts in-flight LLM\n // calls (not just the checkpoints between them) — i.e. near-instant cancel.\n this.router.setRunSignal(options.signal);\n const startMs = Date.now();\n const taskId = randomUUID();\n this.decisionLog = [];\n\n // Create a fresh permission escalator for this task run\n const escalator = new PermissionEscalator(this.config.approvalTimeoutMs ?? 600_000, this.config.autonomy === 'auto');\n\n // Wire escalator's user-required event → approvalCallback or direct event\n escalator.on('permission:user-required', async (req: PermissionRequest) => {\n this.emit('permission:user-required', req);\n this.recordDecision('escalation', `\"${req.toolName}\" by ${req.requestedBy} — T2 and T1 both unsure, escalated to user`);\n\n // Build enriched context for the approval callback / REPL\n const enrichedRequest: ApprovalRequest & { escalationContext?: unknown } = {\n id: req.id,\n tierId: req.requestedBy,\n toolName: req.toolName,\n input: req.input,\n description: `T3 Worker \"${req.subtaskContext}\" wants to run \"${req.toolName}\". T2 and T1 could not determine if this is safe.`,\n isDangerous: req.isDangerous,\n escalationContext: {\n requestedBy: req.requestedBy,\n parentT2Id: req.parentT2Id,\n subtaskContext: req.subtaskContext,\n sectionContext: req.sectionContext,\n taskContext: req.taskContext,\n },\n };\n\n let approved = false;\n let always = false;\n\n if (options.approvalCallback) {\n const result = await options.approvalCallback(enrichedRequest);\n if (typeof result === 'boolean') {\n approved = result;\n } else {\n approved = result.approved;\n always = result.always;\n }\n }\n\n escalator.resolveUserDecision(req.id, approved, always);\n });\n\n // 1. Determine complexity\n const complexity = await this.determineComplexity(options.prompt, options.workspacePath || process.cwd(), options.conversationHistory);\n\n this.telemetry.capture('cascade:session_start', {\n complexity,\n providerCount: this.config.providers.length,\n cascadeAutoEnabled: this.config.cascadeAuto === true,\n toolCreationEnabled: (this.config as unknown as Record<string, unknown>)['enableToolCreation'] === true,\n });\n\n this.emit('tier:root', { role: complexity === 'Simple' ? 'T3' : complexity === 'Moderate' ? 'T2' : 'T1' });\n\n const tiersInPlay: TierRole[] = complexity === 'Simple' ? ['T3'] : complexity === 'Moderate' ? ['T2', 'T3'] : ['T1', 'T2', 'T3'];\n\n // Cascade Auto: select optimal models for each tier based on task analysis\n if (this.taskAnalyzer) {\n await Promise.all(tiersInPlay.map(async (tier) => {\n // Respect an explicitly-configured model — Cascade Auto only routes\n // tiers the user left on 'auto' (otherwise it would silently switch the\n // configured model, which /why then surfaces).\n const tierKey = tier.toLowerCase() as 't1' | 't2' | 't3';\n if (this.config.models?.[tierKey]) return;\n try {\n const model = await this.taskAnalyzer!.selectModel(options.prompt, tier, this.router.getSelector());\n if (model) {\n this.router.overrideTierModel(tier, model);\n const taskType = this.taskAnalyzer!.getLastProfile()?.type ?? 'mixed';\n const bench = Math.round(benchmarkScore01(model, taskType) * 100);\n const price = model.inputCostPer1kTokens === 0 && model.outputCostPer1kTokens === 0\n ? 'free'\n : `$${model.outputCostPer1kTokens.toFixed(4)}/1K out`;\n const dataSrc = this.router.getLiveData()?.getDataSource() ?? 'bundled';\n this.recordDecision(\n 'model',\n `${tier} → ${model.provider}:${model.id} — Cascade Auto: best value for ${taskType} ` +\n `(bench ${bench}/100, ${price}, data: ${dataSrc})`,\n );\n }\n } catch { /* non-critical — fall back to priority list */ }\n }));\n }\n\n // Record what model actually serves each tier in play.\n this.recordDecision('model', tiersInPlay.map((tier) => {\n const m = this.router.getTierModel(tier);\n return m ? `${tier} ${m.provider}:${m.id}${m.isLocal ? ' ⌂local' : ''}` : `${tier} (none)`;\n }).join(' · '));\n\n // Register ToolCreator with the T3 instances (done below, passed via closure)\n const toolCreator = this.toolCreator;\n if (toolCreator) toolCreator.setPermissionEscalator(escalator);\n\n let finalOutput = '';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let t2Results: any[] = [];\n let runError: unknown = null;\n\n // ── Fetch Identity System Prompt ────────────\n let identityPrompt = '';\n if (this.store) {\n const identityId = options.identityId || this.config.defaultIdentityId;\n if (identityId) {\n const identities = this.store.listIdentities();\n const identity = identities.find(i => i.id === identityId);\n if (identity?.systemPrompt) {\n identityPrompt = identity.systemPrompt + '\\n\\n';\n }\n }\n }\n\n // Helper to bind standard events to any tier\n type TierEventSource = EventEmitter & {\n on(event: 'stream:token', listener: (event: { text: string }) => void): TierEventSource;\n on(event: 'log', listener: (event: unknown) => void): TierEventSource;\n on(event: 'tier:status', listener: (event: unknown) => void): TierEventSource;\n on(\n event: 'tool:approval-request',\n listener: (\n request: ApprovalRequest & {\n __cascadeResponder?: (decision: { approved: boolean; always?: boolean }) => void;\n },\n ) => void,\n ): TierEventSource;\n };\n\n const bindTierEvents = (tier: TierEventSource) => {\n tier.on('stream:token', (e) => {\n this.emit('stream:token', e);\n options.streamCallback?.({ text: e.text, finishReason: null });\n });\n tier.on('log', (e) => this.emit('log', e));\n tier.on('tier:status', (e) => this.emit('tier:status', e));\n tier.on('tool:call', (e) => this.emit('tool:call', e));\n tier.on('tool:result', (e) => this.emit('tool:result', e));\n // Legacy approval events (for tiers not yet wired to escalator)\n tier.on('tool:approval-request', async (request: ApprovalRequest & { __cascadeResponder?: (decision: { approved: boolean; always?: boolean }) => void }) => {\n this.emit('tool:approval-request', request);\n let decision: { approved: boolean; always?: boolean } = { approved: false };\n if (options.approvalCallback) {\n const result = await options.approvalCallback(request);\n if (typeof result === 'boolean') {\n decision = { approved: result };\n } else {\n decision = result;\n }\n }\n if (typeof request.__cascadeResponder === 'function') {\n request.__cascadeResponder(decision);\n } else {\n tier.emit(`tool:approval-response:${request.id}`, { id: request.id, ...decision } as ApprovalResponse);\n }\n });\n };\n\n try {\n if (complexity === 'Simple') {\n const t3 = new T3Worker(this.router, this.toolRegistry, 'root');\n t3.setHierarchyContext('You are the DIRECT worker for this task. There is no T1 Administrator or T2 Manager involved in this run.');\n if (identityPrompt) {\n t3.setSystemPromptOverride(identityPrompt);\n }\n if (this.store) {\n t3.setStore(this.store, taskId);\n }\n t3.setPermissionEscalator(escalator);\n if (toolCreator) t3.setToolCreator(toolCreator);\n bindTierEvents(t3);\n const assignment = {\n subtaskId: taskId,\n subtaskTitle: 'Direct Request',\n description: options.prompt,\n expectedOutput: 'A complete and direct answer.',\n constraints: [],\n peerT3Ids: [],\n parentT2: 'root'\n };\n const t3Result = await t3.execute(assignment, taskId, options.signal);\n finalOutput = typeof t3Result.output === 'string' ? t3Result.output : JSON.stringify(t3Result.output);\n this.emit('tier:status', { tierId: 't3-root', status: 'COMPLETED', role: 'T3' });\n } else if (complexity === 'Moderate') {\n const t2 = new T2Manager(this.router, this.toolRegistry, 'root');\n t2.setHierarchyContext('You are the ROOT Manager for this task. There is no T1 Administrator involved in this run. You are responsible for decomposing the task and managing T3 workers directly.');\n if (identityPrompt) {\n t2.setSystemPromptOverride(identityPrompt);\n }\n if (this.store) {\n t2.setStore(this.store);\n }\n t2.setPermissionEscalator(escalator);\n if (toolCreator) t2.setToolCreator(toolCreator);\n t2.setPeerMessageCallback((e) => this.emit('peer:message', e), options.sessionId ?? '');\n bindTierEvents(t2);\n // Boardroom gate for Moderate (root-T2) runs when planApproval is 'all':\n // review the decomposed subtasks before any worker spawns.\n if (this.config.planApproval === 'all') {\n t2.setPlanApprovalCallback(async (subtasks) => {\n const pseudoPlan = {\n complexity: 'Moderate',\n reasoning: '',\n sections: subtasks.map((st) => ({\n sectionId: st.subtaskId,\n sectionTitle: st.subtaskTitle,\n description: st.description,\n t3Subtasks: [],\n })),\n } as unknown as TaskPlan;\n const n = subtasks.length;\n const summary = `${n} worker${n !== 1 ? 's' : ''} · 1 root manager · est. $${this.estimatePlanCost(pseudoPlan).toFixed(4)}`;\n const decision = await this.requestPlanApproval(pseudoPlan, taskId, undefined, summary);\n const keepSubtaskIds = decision.editedPlan?.sections\n ?.map((s) => (s as { sectionId?: string }).sectionId)\n .filter((id): id is string => Boolean(id));\n return { approved: decision.approved, note: decision.note, keepSubtaskIds };\n });\n }\n const assignment = {\n sectionId: taskId,\n sectionTitle: 'Direct Task',\n description: options.prompt,\n expectedOutput: 'A complete resolution of the task.',\n constraints: [],\n t3Subtasks: []\n };\n const t2Result = await t2.execute(assignment, taskId, options.signal);\n this.emit('tier:status', { tierId: 't2-root', status: 'COMPLETED', role: 'T2' });\n t2Results = [t2Result];\n const completed = t2Result.t3Results.filter((r: T3Result) => r.status === 'COMPLETED');\n if (completed.length > 0) {\n finalOutput = t2Result.sectionSummary + '\\n\\n' + completed.map((r: T3Result) => r.output).join('\\n\\n');\n } else {\n finalOutput = 'Task failed to complete successfully.';\n }\n } else {\n const t1 = new T1Administrator(this.router, this.toolRegistry, this.config);\n t1.setHierarchyContext('You are the top-level Administrator. You are responsible for the overall plan and supervising multiple T2 Managers.');\n if (identityPrompt) {\n t1.setSystemPromptOverride(identityPrompt);\n }\n if (this.store) {\n t1.setStore(this.store);\n }\n t1.setPermissionEscalator(escalator);\n if (toolCreator) t1.setToolCreator(toolCreator);\n t1.setPeerMessageCallback((e) => this.emit('peer:message', e), options.sessionId ?? '');\n bindTierEvents(t1);\n t1.on('plan', (e) => this.emit('plan', e));\n // Gate Complex runs for 'complex' | 'all' | 'always' (anything but 'never').\n if (this.config.planApproval != null && this.config.planApproval !== 'never') {\n t1.setPlanApprovalCallback(async (plan, meta) => {\n const decision = await this.requestPlanApproval(plan, taskId, meta?.critique);\n this.recordDecision('escalation', decision.approved\n ? `Boardroom: plan approved (${plan.sections.length} sections)${decision.note ? ' with a steering note' : ''}${decision.editedPlan ? ' (edited)' : ''}`\n : 'Boardroom: plan rejected — run stopped before any T2 spawned');\n return decision;\n });\n }\n \n const result = await t1.execute(options.prompt, options.images, undefined, options.signal);\n finalOutput = result.output;\n t2Results = result.t2Results;\n }\n } catch (err) {\n // ── Graceful cancellation handling ──────────────────────────────\n // When aborted, don't re-throw — resolve with what we have so far. This\n // covers both the checkpoint-based CascadeCancelledError and the\n // AbortError thrown by a provider whose in-flight request was aborted\n // (instant cancel), plus any error surfacing while the signal is aborted.\n if (err instanceof CascadeCancelledError\n || (err instanceof Error && err.name === 'AbortError')\n || options.signal?.aborted) {\n this.emit('run:cancelled', {\n taskId,\n reason: err instanceof Error ? err.message : 'Task cancelled',\n partialOutput: finalOutput || '',\n });\n runError = null; // suppress telemetry error flag for intentional cancels\n } else if (err instanceof Error && err.name === 'BudgetExceededError') {\n // Per-task (or session) budget ceiling hit — stop gracefully with a\n // clear message instead of letting a runaway task throw to the user.\n this.emit('run:budget-exceeded', {\n taskId,\n reason: err.message,\n partialOutput: finalOutput || '',\n });\n // Remember the interrupted task so /continue can resume it with a raised\n // budget (files already created persist on disk via snapshots).\n this.lastInterruptedRun = { prompt: options.prompt, partialOutput: finalOutput || '', taskId };\n if (!finalOutput) finalOutput = `⚠ Stopped to avoid runaway cost: ${err.message}`;\n runError = null;\n } else {\n runError = err;\n throw err;\n }\n } finally {\n // Always release pending permission escalations so they don't leak\n // across runs — even on error paths. cancelAllPending is safe to call\n // when there are no pending requests.\n try { escalator.cancelAllPending(); } catch { /* non-critical */ }\n\n // Restore tier models to the configured baseline so Cascade Auto's\n // per-task picks don't leak into /why, the status bar, or the next run.\n this.router.restoreTierModels();\n this.router.setRunSignal(undefined);\n\n // Record model performance for future auto-selection\n if (this.taskAnalyzer) {\n try {\n const stats = this.router.getStats();\n this.taskAnalyzer.recordRunOutcome(runError ? 'failure' : 'success', stats.costByTier);\n } catch { /* non-critical */ }\n }\n\n // Always emit telemetry for completion (or failure) so dashboards\n // don't silently drop failed runs.\n try {\n const stats = this.router.getStats();\n const durationMs = Date.now() - startMs;\n this.telemetry.capture(runError ? 'cascade:task_failed' : 'cascade:task_complete', {\n complexity,\n tier: complexity === 'Simple' ? 'simple' : complexity === 'Moderate' ? 'T2' : 'T1',\n durationMs,\n tokenCount: stats.totalTokens,\n costUsd: stats.totalCostUsd,\n t2Count: t2Results.length,\n t3Count: t2Results.reduce((sum: number, r: { t3Results?: unknown[] }) => sum + (r.t3Results?.length ?? 0), 0),\n errored: runError ? true : false,\n errorMessage: runError instanceof Error ? runError.message : undefined,\n });\n } catch { /* telemetry must never block task results */ }\n }\n\n const stats = this.router.getStats();\n const durationMs = Date.now() - startMs;\n\n return {\n output: finalOutput,\n sessionId: options.sessionId ?? '',\n taskId,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: stats.totalTokens,\n estimatedCostUsd: stats.totalCostUsd,\n },\n t2Results,\n durationMs,\n costByTier: stats.costByTier,\n tokensByTier: stats.tokensByTier,\n costPercentByTier: this.router.getTierCostPercentages(),\n };\n }\n\n getRouter(): CascadeRouter {\n return this.router;\n }\n\n getToolRegistry(): ToolRegistry {\n return this.toolRegistry;\n }\n\n /**\n * Tear down MCP connections and flush any pending telemetry so long-lived\n * hosts (REPL, SDK embedders) don't leak child processes. Safe to call\n * multiple times.\n */\n async close(): Promise<void> {\n try { await this.mcpClient.disconnectAll(); } catch { /* non-critical */ }\n try {\n const maybeShutdown = (this.telemetry as Pick<Telemetry, 'shutdown'>)?.shutdown;\n if (typeof maybeShutdown === 'function') await maybeShutdown.call(this.telemetry);\n } catch { /* non-critical */ }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Keystore (keytar primary, AES-256-GCM fallback)\n// ─────────────────────────────────────────────\n\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst KEY_LEN = 32;\nconst IV_LEN = 12;\nconst TAG_LEN = 16;\nconst SALT_LEN = 32;\nconst PBKDF2_ITERATIONS = 100_000;\n\nconst KEYTAR_SERVICE = 'cascade-ai';\n\ntype KeytarModule = {\n getPassword: (service: string, account: string) => Promise<string | null>;\n setPassword: (service: string, account: string, password: string) => Promise<void>;\n deletePassword: (service: string, account: string) => Promise<boolean>;\n findCredentials: (service: string) => Promise<Array<{ account: string; password: string }>>;\n};\n\nasync function loadKeytar(): Promise<KeytarModule | null> {\n try {\n // Native module — may fail on headless containers, Alpine, etc.\n const mod = (await import('keytar')) as unknown as KeytarModule | { default: KeytarModule };\n const candidate = (mod as { default?: KeytarModule }).default ?? (mod as KeytarModule);\n if (typeof candidate.getPassword !== 'function') return null;\n return candidate;\n } catch {\n return null;\n }\n}\n\n/**\n * Keystore with two backends:\n * 1. OS keychain via `keytar` — preferred when available (macOS Keychain,\n * Windows Credential Vault, libsecret). No master password required.\n * 2. AES-256-GCM encrypted file — used when keytar is unavailable or the\n * caller passes `{ forceFile: true }`. Requires a master password.\n *\n * On first successful keytar unlock we silently migrate any existing AES\n * entries into the OS keychain. The AES file is left in place as a backup\n * until the user explicitly deletes it via `cascade keys migrate --confirm`.\n */\nexport class Keystore {\n private storePath: string;\n private masterKey: Buffer | null = null;\n private keytar: KeytarModule | null = null;\n private cache: Record<string, string> = {};\n private backend: 'keytar' | 'file' | null = null;\n\n constructor(storePath: string) {\n this.storePath = storePath;\n }\n\n /**\n * Unlock the keystore.\n *\n * If `password` is omitted we try keytar only. If keytar is unavailable and\n * there are AES entries to read, unlock will fail — re-call with a password\n * to decrypt the file backend.\n */\n async unlock(password?: string, opts: { forceFile?: boolean } = {}): Promise<void> {\n if (!opts.forceFile) {\n this.keytar = await loadKeytar();\n }\n\n if (this.keytar) {\n const creds = await this.keytar.findCredentials(KEYTAR_SERVICE);\n this.cache = Object.fromEntries(creds.map((c) => [c.account, c.password]));\n this.backend = 'keytar';\n\n if (password && fs.existsSync(this.storePath)) {\n try {\n const fileEntries = this.decryptFile(password);\n for (const [k, v] of Object.entries(fileEntries)) {\n if (!(k in this.cache)) {\n await this.keytar.setPassword(KEYTAR_SERVICE, k, v);\n this.cache[k] = v;\n }\n }\n } catch {\n // Wrong password or no file — ignore; keytar cache is authoritative.\n }\n }\n return;\n }\n\n // Keytar unavailable — fall back to AES file backend.\n if (!password) {\n throw new Error(\n 'Keystore unlock requires a password because the OS keychain (keytar) is not available on this system.',\n );\n }\n if (!fs.existsSync(this.storePath)) {\n const salt = crypto.randomBytes(SALT_LEN);\n this.masterKey = this.deriveKey(password, salt);\n this.writeWithSalt({}, salt);\n this.cache = {};\n } else {\n const { salt } = this.readRaw();\n this.masterKey = this.deriveKey(password, salt);\n this.cache = this.decryptFile(password, salt);\n }\n this.backend = 'file';\n }\n\n /** Synchronous legacy unlock kept for AES-only environments. */\n unlockSync(password: string): void {\n if (!fs.existsSync(this.storePath)) {\n const salt = crypto.randomBytes(SALT_LEN);\n this.masterKey = this.deriveKey(password, salt);\n this.writeWithSalt({}, salt);\n this.cache = {};\n } else {\n const { salt } = this.readRaw();\n this.masterKey = this.deriveKey(password, salt);\n this.cache = this.decryptFile(password, salt);\n }\n this.backend = 'file';\n }\n\n lock(): void {\n this.masterKey = null;\n this.cache = {};\n this.backend = null;\n this.keytar = null;\n }\n\n isUnlocked(): boolean {\n return this.backend !== null;\n }\n\n /** Report the active backend (`keytar` or `file`) for diagnostics. */\n getBackend(): 'keytar' | 'file' | null {\n return this.backend;\n }\n\n async set(key: string, value: string): Promise<void> {\n this.assertUnlocked();\n this.cache[key] = value;\n if (this.backend === 'keytar' && this.keytar) {\n await this.keytar.setPassword(KEYTAR_SERVICE, key, value);\n return;\n }\n this.saveAll(this.cache);\n }\n\n get(key: string): string | undefined {\n this.assertUnlocked();\n return this.cache[key];\n }\n\n async delete(key: string): Promise<void> {\n this.assertUnlocked();\n delete this.cache[key];\n if (this.backend === 'keytar' && this.keytar) {\n await this.keytar.deletePassword(KEYTAR_SERVICE, key);\n return;\n }\n this.saveAll(this.cache);\n }\n\n listKeys(): string[] {\n this.assertUnlocked();\n return Object.keys(this.cache);\n }\n\n // ── Private ──────────────────────────────────\n\n private assertUnlocked(): void {\n if (this.backend === null) {\n throw new Error('Keystore is locked. Call unlock() first.');\n }\n }\n\n private decryptFile(password: string, knownSalt?: Buffer): Record<string, string> {\n if (!fs.existsSync(this.storePath)) return {};\n try {\n const { salt, ciphertext, iv, tag } = this.readRaw();\n const useSalt = knownSalt ?? salt;\n const key = this.masterKey ?? this.deriveKey(password, useSalt);\n const decipher = crypto.createDecipheriv(ALGORITHM, key, iv) as crypto.DecipherGCM;\n decipher.setAuthTag(tag);\n const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return JSON.parse(decrypted.toString('utf-8')) as Record<string, string>;\n } catch {\n throw new Error('Failed to decrypt keystore. Wrong password?');\n }\n }\n\n private saveAll(data: Record<string, string>): void {\n if (!this.masterKey) return; // keytar backend — nothing to persist to file\n const raw = this.readRaw();\n const iv = crypto.randomBytes(IV_LEN);\n const cipher = crypto.createCipheriv(ALGORITHM, this.masterKey, iv) as crypto.CipherGCM;\n const plaintext = Buffer.from(JSON.stringify(data), 'utf-8');\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n const out = Buffer.concat([raw.salt, iv, tag, ciphertext]);\n fs.mkdirSync(path.dirname(this.storePath), { recursive: true });\n fs.writeFileSync(this.storePath, out, { mode: 0o600 });\n }\n\n private writeWithSalt(data: Record<string, string>, salt: Buffer): void {\n if (!this.masterKey) throw new Error('writeWithSalt called before masterKey was set');\n const iv = crypto.randomBytes(IV_LEN);\n const cipher = crypto.createCipheriv(ALGORITHM, this.masterKey, iv) as crypto.CipherGCM;\n const plaintext = Buffer.from(JSON.stringify(data), 'utf-8');\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n const out = Buffer.concat([salt, iv, tag, ciphertext]);\n fs.mkdirSync(path.dirname(this.storePath), { recursive: true });\n fs.writeFileSync(this.storePath, out, { mode: 0o600 });\n }\n\n private readRaw(): { salt: Buffer; iv: Buffer; tag: Buffer; ciphertext: Buffer } {\n const buf = fs.readFileSync(this.storePath);\n let offset = 0;\n const salt = buf.subarray(offset, offset + SALT_LEN); offset += SALT_LEN;\n const iv = buf.subarray(offset, offset + IV_LEN); offset += IV_LEN;\n const tag = buf.subarray(offset, offset + TAG_LEN); offset += TAG_LEN;\n const ciphertext = buf.subarray(offset);\n return { salt, iv, tag, ciphertext };\n }\n\n private deriveKey(password: string, salt: Buffer): Buffer {\n return crypto.pbkdf2Sync(password, salt, PBKDF2_ITERATIONS, KEY_LEN, 'sha256');\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — .cascadeignore Parser\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport * as _ignoreModule from 'ignore';\nimport type { Ignore } from 'ignore';\n// ignore is a CJS package — access .default under NodeNext ESM interop\nconst ignore = (_ignoreModule as unknown as { default: () => Ignore }).default ?? (_ignoreModule as unknown as () => Ignore);\n\nexport class CascadeIgnore {\n private ig: Ignore;\n private loaded = false;\n\n constructor() {\n this.ig = ignore();\n // Built-in defaults — always protected\n this.ig.add([\n '.cascade/keystore.enc',\n '.cascade/memory.db',\n '.env',\n '.env.*',\n '*.pem',\n '*.key',\n 'id_rsa',\n 'id_ed25519',\n ]);\n }\n\n async load(workspacePath: string): Promise<void> {\n const filePath = path.join(workspacePath, '.cascadeignore');\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n').filter((l) => l.trim() && !l.startsWith('#'));\n this.ig.add(lines);\n this.loaded = true;\n } catch {\n // No .cascadeignore file — only built-in defaults apply\n }\n }\n\n isIgnored(filePath: string, workspacePath?: string): boolean {\n try {\n const relative = workspacePath\n ? path.relative(workspacePath, filePath)\n : filePath;\n return this.ig.ignores(relative);\n } catch {\n return false;\n }\n }\n\n getPatterns(): string[] {\n return (this.ig as unknown as { _rules: Array<{ pattern: string }> })._rules?.map((r) => r.pattern) ?? [];\n }\n}\n\nexport async function createDefaultIgnoreFile(workspacePath: string): Promise<void> {\n const filePath = path.join(workspacePath, '.cascadeignore');\n const content = `# .cascadeignore — Files Cascade agents cannot read or modify\n# Syntax identical to .gitignore\n\n# Secrets\n.env\n.env.*\n*.pem\n*.key\n*.cert\nid_rsa\nid_ed25519\n\n# Cascade internals\n.cascade/keystore.enc\n.cascade/memory.db\n\n# Build artifacts\nnode_modules/\ndist/\nbuild/\n*.min.js\n\n# OS files\n.DS_Store\nThumbs.db\n`;\n await fs.writeFile(filePath, content, 'utf-8');\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — CASCADE.md Parser\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface CascadeMdContent {\n raw: string;\n sections: Record<string, string>;\n systemPrompt: string;\n}\n\nexport async function loadCascadeMd(workspacePath: string): Promise<CascadeMdContent | null> {\n const filePath = path.join(workspacePath, 'CASCADE.md');\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return parseCascadeMd(raw);\n } catch {\n return null;\n }\n}\n\nexport function parseCascadeMd(raw: string): CascadeMdContent {\n const sections: Record<string, string> = {};\n const lines = raw.split('\\n');\n let currentSection = 'main';\n const sectionLines: string[] = [];\n\n for (const line of lines) {\n const h2Match = /^##\\s+(.+)$/.exec(line);\n if (h2Match) {\n sections[currentSection] = sectionLines.join('\\n').trim();\n sectionLines.length = 0;\n currentSection = h2Match[1]!.toLowerCase().replace(/\\s+/g, '_');\n } else {\n sectionLines.push(line);\n }\n }\n sections[currentSection] = sectionLines.join('\\n').trim();\n\n // Build system prompt from the full content\n const systemPrompt = `[Project Instructions from CASCADE.md]\\n${raw.trim()}`;\n\n return { raw, sections, systemPrompt };\n}\n\nexport async function createDefaultCascadeMd(workspacePath: string): Promise<void> {\n const filePath = path.join(workspacePath, 'CASCADE.md');\n const content = `# Cascade Project Instructions\n\nThis file contains project-specific instructions for the Cascade AI agent.\nEdit this file to customize how agents behave in this project.\n\n## Project Overview\n\nDescribe your project here.\n\n## Coding Guidelines\n\n- Follow existing code style\n- Write tests for new features\n- Document public APIs\n\n## Agent Behavior\n\n- Prefer small, focused changes\n- Always ask before deleting files\n- Run tests before committing\n\n## Allowed Tools\n\nAll tools are allowed unless specified otherwise.\n\n## Out of Scope\n\nList any areas the agent should not touch.\n`;\n await fs.writeFile(filePath, content, 'utf-8');\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — SQLite Memory Store\n// ─────────────────────────────────────────────\n\nimport Database from 'better-sqlite3';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport type {\n AuditEntry,\n Identity,\n ModelInfo,\n ProviderType,\n RuntimeNode,\n RuntimeNodeLog,\n RuntimeSession,\n ScheduledTask,\n Session,\n StoredMessage,\n} from '../types.js';\n\nexport class MemoryStore {\n private db: Database.Database;\n\n constructor(dbPath: string) {\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n try {\n this.db = new Database(dbPath, { timeout: 5000 });\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.db.pragma('synchronous = NORMAL'); // Better concurrency with WAL\n this.migrate();\n } catch (err) {\n if (err instanceof Error && err.message.includes('Could not locate the bindings file')) {\n throw new Error(\n `Cascade AI failed to load its database (better-sqlite3). This is usually because native bindings for Node.js ${process.version} are missing.\\n\\n` +\n `Please try running: npm install better-sqlite3 --force\\n` +\n `Original error: ${err.message}`\n );\n }\n throw err;\n }\n }\n\n // ── Async Write Queue ─────────────────────────\n\n private writeQueue: Array<() => void> = [];\n private isProcessingQueue = false;\n\n private async processQueue() {\n if (this.isProcessingQueue) return;\n this.isProcessingQueue = true;\n while (this.writeQueue.length > 0) {\n const op = this.writeQueue.shift();\n if (op) {\n let attempts = 0;\n while (attempts < 5) {\n try {\n op();\n break;\n } catch (err: unknown) {\n if (err instanceof Error && (err as any).code === 'SQLITE_BUSY') {\n attempts++;\n await new Promise(r => setTimeout(r, 100 * Math.pow(2, attempts)));\n } else {\n console.error('Cascade AI: DB Write Error:', err);\n break;\n }\n }\n }\n }\n }\n this.isProcessingQueue = false;\n }\n\n private enqueueWrite(op: () => void) {\n this.writeQueue.push(op);\n this.processQueue().catch(console.error);\n }\n\n // ── Sessions ──────────────────────────────────\n\n createSession(session: Session): void {\n this.db.prepare(`\n INSERT INTO sessions (id, title, created_at, updated_at, identity_id, workspace_path, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `).run(session.id, session.title, session.createdAt, session.updatedAt, session.identityId, session.workspacePath, JSON.stringify(session.metadata));\n }\n\n updateSession(id: string, updates: Partial<Session>): void {\n const parts: string[] = [];\n const values: unknown[] = [];\n if (updates.title) { parts.push('title = ?'); values.push(updates.title); }\n if (updates.updatedAt) { parts.push('updated_at = ?'); values.push(updates.updatedAt); }\n if (updates.identityId) { parts.push('identity_id = ?'); values.push(updates.identityId); }\n if (updates.metadata) { parts.push('metadata = ?'); values.push(JSON.stringify(updates.metadata)); }\n if (!parts.length) return;\n values.push(id);\n this.db.prepare(`UPDATE sessions SET ${parts.join(', ')} WHERE id = ?`).run(...values);\n }\n\n getSession(id: string): Session | null {\n const row = this.db.prepare('SELECT * FROM sessions WHERE id = ?').get(id) as DbSession | undefined;\n if (!row) return null;\n const messages = this.getSessionMessages(id);\n return this.deserializeSession(row, messages);\n }\n\n listSessions(identityId?: string, limit = 50): Session[] {\n const rows = identityId\n ? this.db.prepare('SELECT * FROM sessions WHERE identity_id = ? ORDER BY updated_at DESC LIMIT ?').all(identityId, limit) as DbSession[]\n : this.db.prepare('SELECT * FROM sessions ORDER BY updated_at DESC LIMIT ?').all(limit) as DbSession[];\n return rows.map((r) => this.deserializeSession(r, []));\n }\n\n deleteSession(id: string): void {\n this.db.prepare('DELETE FROM messages WHERE session_id = ?').run(id);\n this.db.prepare('DELETE FROM sessions WHERE id = ?').run(id);\n }\n\n deleteAllSessions(): void {\n this.db.prepare('DELETE FROM file_snapshots').run();\n this.db.prepare('DELETE FROM messages').run();\n this.db.prepare('DELETE FROM sessions').run();\n }\n\n deleteRuntimeSession(sessionId: string): void {\n this.db.prepare('DELETE FROM runtime_node_logs WHERE session_id = ?').run(sessionId);\n this.db.prepare('DELETE FROM runtime_nodes WHERE session_id = ?').run(sessionId);\n this.db.prepare('DELETE FROM runtime_sessions WHERE session_id = ?').run(sessionId);\n }\n\n deleteAllRuntimeNodes(): void {\n this.db.prepare('DELETE FROM runtime_node_logs').run();\n this.db.prepare('DELETE FROM runtime_nodes').run();\n this.db.prepare('DELETE FROM runtime_sessions').run();\n }\n\n branchSession(originalId: string, newId: string): void {\n const session = this.db.prepare('SELECT * FROM sessions WHERE id = ?').get(originalId) as DbSession | undefined;\n if (!session) throw new Error(`Original session ${originalId} not found`);\n\n const now = new Date().toISOString();\n this.db.prepare(`\n INSERT INTO sessions (id, title, created_at, updated_at, identity_id, workspace_path, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `).run(newId, `${session.title} (Branch)`, now, now, session.identity_id, session.workspace_path, session.metadata);\n\n const messages = this.db.prepare('SELECT * FROM messages WHERE session_id = ? ORDER BY timestamp ASC').all(originalId) as DbMessage[];\n const stmt = this.db.prepare(`\n INSERT INTO messages (id, session_id, role, content, timestamp, tokens, agent_messages)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n for (const msg of messages) {\n stmt.run(randomUUID(), newId, msg.role, msg.content, msg.timestamp, msg.tokens, msg.agent_messages);\n }\n\n const snapshots = this.db.prepare('SELECT * FROM file_snapshots WHERE session_id = ?').all(originalId) as DbFileSnapshot[];\n const snapStmt = this.db.prepare(`\n INSERT INTO file_snapshots (id, session_id, file_path, content, timestamp)\n VALUES (?, ?, ?, ?, ?)\n `);\n for (const snap of snapshots) {\n snapStmt.run(randomUUID(), newId, snap.file_path, snap.content, snap.timestamp);\n }\n }\n\n // ── Runtime Sessions / Nodes ─────────────────\n\n upsertRuntimeSession(session: RuntimeSession): void {\n this.enqueueWrite(() => {\n this.db.prepare(`\n INSERT INTO runtime_sessions (session_id, title, workspace_path, status, started_at, updated_at, latest_prompt, is_global)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(session_id) DO UPDATE SET\n title = excluded.title,\n workspace_path = excluded.workspace_path,\n status = excluded.status,\n updated_at = excluded.updated_at,\n latest_prompt = excluded.latest_prompt,\n is_global = excluded.is_global\n `).run(\n session.sessionId,\n session.title,\n session.workspacePath,\n session.status,\n session.startedAt,\n session.updatedAt,\n session.latestPrompt ?? null,\n session.isGlobal ? 1 : 0,\n );\n });\n }\n\n listRuntimeSessions(limit = 100): RuntimeSession[] {\n const rows = this.db.prepare(`\n SELECT * FROM runtime_sessions ORDER BY updated_at DESC LIMIT ?\n `).all(limit) as DbRuntimeSession[];\n return rows.map((row) => ({\n sessionId: row.session_id,\n title: row.title,\n workspacePath: row.workspace_path,\n status: row.status as RuntimeSession['status'],\n startedAt: row.started_at,\n updatedAt: row.updated_at,\n latestPrompt: row.latest_prompt ?? undefined,\n isGlobal: row.is_global === 1,\n }));\n }\n\n upsertRuntimeNode(node: RuntimeNode): void {\n this.enqueueWrite(() => {\n this.db.prepare(`\n INSERT INTO runtime_nodes (tier_id, session_id, parent_id, role, label, status, current_action, progress_pct, updated_at, workspace_path, is_global, output)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tier_id) DO UPDATE SET\n session_id = excluded.session_id,\n parent_id = excluded.parent_id,\n role = excluded.role,\n label = excluded.label,\n status = excluded.status,\n current_action = excluded.current_action,\n progress_pct = excluded.progress_pct,\n updated_at = excluded.updated_at,\n workspace_path = excluded.workspace_path,\n is_global = excluded.is_global,\n output = excluded.output\n `).run(\n node.tierId,\n node.sessionId,\n node.parentId ?? null,\n node.role,\n node.label,\n node.status,\n node.currentAction ?? null,\n node.progressPct ?? null,\n node.updatedAt,\n node.workspacePath ?? null,\n node.isGlobal ? 1 : 0,\n node.output ?? null,\n );\n });\n }\n\n listRuntimeNodes(sessionId?: string, limit = 500): RuntimeNode[] {\n const rows = sessionId\n ? this.db.prepare(`\n SELECT * FROM runtime_nodes WHERE session_id = ? ORDER BY updated_at DESC LIMIT ?\n `).all(sessionId, limit) as DbRuntimeNode[]\n : this.db.prepare(`\n SELECT * FROM runtime_nodes ORDER BY updated_at DESC LIMIT ?\n `).all(limit) as DbRuntimeNode[];\n\n return rows.map((row) => ({\n tierId: row.tier_id,\n sessionId: row.session_id,\n parentId: row.parent_id ?? undefined,\n role: row.role as RuntimeNode['role'],\n label: row.label,\n status: row.status as RuntimeNode['status'],\n currentAction: row.current_action ?? undefined,\n progressPct: row.progress_pct ?? undefined,\n updatedAt: row.updated_at,\n workspacePath: row.workspace_path ?? undefined,\n isGlobal: row.is_global === 1,\n output: row.output ?? undefined,\n }));\n }\n\n addRuntimeNodeLog(log: RuntimeNodeLog): void {\n this.enqueueWrite(() => {\n this.db.prepare(`\n INSERT INTO runtime_node_logs (id, session_id, tier_id, role, label, status, current_action, progress_pct, timestamp, workspace_path, is_global, output)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n log.id,\n log.sessionId,\n log.tierId,\n log.role,\n log.label,\n log.status,\n log.currentAction ?? null,\n log.progressPct ?? null,\n log.timestamp,\n log.workspacePath ?? null,\n log.isGlobal ? 1 : 0,\n log.output ?? null,\n );\n\n this.db.prepare(`\n DELETE FROM runtime_node_logs\n WHERE id NOT IN (\n SELECT id FROM runtime_node_logs\n ORDER BY timestamp DESC\n LIMIT 2000\n )\n `).run();\n });\n }\n\n listRuntimeNodeLogs(sessionId?: string, tierId?: string, limit = 200): RuntimeNodeLog[] {\n let rows: DbRuntimeNodeLog[];\n\n if (sessionId && tierId) {\n rows = this.db.prepare(`\n SELECT * FROM runtime_node_logs\n WHERE session_id = ? AND tier_id = ?\n ORDER BY timestamp DESC LIMIT ?\n `).all(sessionId, tierId, limit) as DbRuntimeNodeLog[];\n } else if (sessionId) {\n rows = this.db.prepare(`\n SELECT * FROM runtime_node_logs\n WHERE session_id = ?\n ORDER BY timestamp DESC LIMIT ?\n `).all(sessionId, limit) as DbRuntimeNodeLog[];\n } else {\n rows = this.db.prepare(`\n SELECT * FROM runtime_node_logs\n ORDER BY timestamp DESC LIMIT ?\n `).all(limit) as DbRuntimeNodeLog[];\n }\n\n return rows.map((row) => ({\n id: row.id,\n sessionId: row.session_id,\n tierId: row.tier_id,\n role: row.role as RuntimeNodeLog['role'],\n label: row.label,\n status: row.status as RuntimeNodeLog['status'],\n currentAction: row.current_action ?? undefined,\n progressPct: row.progress_pct ?? undefined,\n timestamp: row.timestamp,\n workspacePath: row.workspace_path ?? undefined,\n isGlobal: row.is_global === 1,\n output: row.output ?? undefined,\n }));\n }\n\n // ── Messages ──────────────────────────────────\n\n addMessage(message: StoredMessage): void {\n this.enqueueWrite(() => {\n this.db.prepare(`\n INSERT INTO messages (id, session_id, role, content, timestamp, tokens, agent_messages)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `).run(\n message.id,\n message.sessionId,\n message.role,\n typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n message.timestamp,\n message.tokens ? JSON.stringify(message.tokens) : null,\n message.agentMessages ? JSON.stringify(message.agentMessages) : null,\n );\n this.db.prepare('UPDATE sessions SET updated_at = ? WHERE id = ?').run(message.timestamp, message.sessionId);\n });\n }\n\n getSessionMessages(sessionId: string): StoredMessage[] {\n const rows = this.db.prepare('SELECT * FROM messages WHERE session_id = ? ORDER BY timestamp ASC').all(sessionId) as DbMessage[];\n return rows.map(this.deserializeMessage);\n }\n\n searchMessages(query: string, limit = 20): StoredMessage[] {\n const rows = this.db.prepare(`\n SELECT * FROM messages WHERE content LIKE ? ORDER BY timestamp DESC LIMIT ?\n `).all(`%${query}%`, limit) as DbMessage[];\n return rows.map(this.deserializeMessage);\n }\n\n // ── Identities ────────────────────────────────\n\n createIdentity(identity: Identity): void {\n this.db.prepare(`\n INSERT INTO identities (id, name, description, avatar, created_at, default_model, system_prompt, is_default)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).run(identity.id, identity.name, identity.description ?? null, identity.avatar ?? null,\n identity.createdAt, identity.defaultModel ?? null, identity.systemPrompt ?? null,\n identity.isDefault ? 1 : 0);\n }\n\n updateIdentity(id: string, updates: Partial<Identity>): void {\n const parts: string[] = [];\n const values: unknown[] = [];\n if (updates.name !== undefined) { parts.push('name = ?'); values.push(updates.name); }\n if (updates.description !== undefined) { parts.push('description = ?'); values.push(updates.description); }\n if (updates.systemPrompt !== undefined) { parts.push('system_prompt = ?'); values.push(updates.systemPrompt); }\n if (updates.isDefault !== undefined) { parts.push('is_default = ?'); values.push(updates.isDefault ? 1 : 0); }\n if (!parts.length) return;\n values.push(id);\n this.db.prepare(`UPDATE identities SET ${parts.join(', ')} WHERE id = ?`).run(...values);\n }\n\n getIdentity(id: string): Identity | null {\n const row = this.db.prepare('SELECT * FROM identities WHERE id = ?').get(id) as DbIdentity | undefined;\n return row ? this.deserializeIdentity(row) : null;\n }\n\n getDefaultIdentity(): Identity | null {\n const row = this.db.prepare('SELECT * FROM identities WHERE is_default = 1 LIMIT 1').get() as DbIdentity | undefined;\n if (!row) {\n const first = this.db.prepare('SELECT * FROM identities LIMIT 1').get() as DbIdentity | undefined;\n return first ? this.deserializeIdentity(first) : null;\n }\n return this.deserializeIdentity(row);\n }\n\n listIdentities(): Identity[] {\n const rows = this.db.prepare('SELECT * FROM identities ORDER BY is_default DESC, name ASC').all() as DbIdentity[];\n return rows.map(this.deserializeIdentity);\n }\n\n deleteIdentity(id: string): void {\n this.db.prepare('DELETE FROM identities WHERE id = ?').run(id);\n }\n\n // ── Scheduled Tasks ───────────────────────────\n\n saveScheduledTask(task: ScheduledTask): void {\n this.db.prepare(`\n INSERT OR REPLACE INTO scheduled_tasks (id, name, cron_expression, prompt, identity_id, workspace_path, created_at, last_run, next_run, enabled)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(task.id, task.name, task.cronExpression, task.prompt, task.identityId ?? null,\n task.workspacePath ?? null, task.createdAt, task.lastRun ?? null, task.nextRun ?? null, task.enabled ? 1 : 0);\n }\n\n listScheduledTasks(): ScheduledTask[] {\n const rows = this.db.prepare('SELECT * FROM scheduled_tasks ORDER BY name').all() as DbScheduledTask[];\n return rows.map(this.deserializeScheduledTask);\n }\n\n deleteScheduledTask(id: string): void {\n this.db.prepare('DELETE FROM scheduled_tasks WHERE id = ?').run(id);\n }\n\n // ── Audit Log ─────────────────────────────────\n\n addAuditEntry(entry: AuditEntry): void {\n this.enqueueWrite(() => {\n this.db.prepare(`\n INSERT INTO audit_log (id, session_id, timestamp, tier_id, action, details)\n VALUES (?, ?, ?, ?, ?, ?)\n `).run(entry.id, entry.sessionId, entry.timestamp, entry.tierId, entry.action, JSON.stringify(entry.details));\n });\n }\n\n getAuditLog(sessionId: string, limit = 100): AuditEntry[] {\n const rows = this.db.prepare('SELECT * FROM audit_log WHERE session_id = ? ORDER BY timestamp DESC LIMIT ?').all(sessionId, limit) as DbAudit[];\n return rows.map((r) => ({\n id: r.id,\n sessionId: r.session_id,\n timestamp: r.timestamp,\n tierId: r.tier_id,\n action: r.action as AuditEntry['action'],\n details: JSON.parse(r.details) as Record<string, unknown>,\n }));\n }\n\n // ── File Snapshots ────────────────────────────\n\n addFileSnapshot(sessionId: string, filePath: string, content: string): void {\n this.enqueueWrite(() => {\n this.db.prepare(`\n INSERT INTO file_snapshots (id, session_id, file_path, content, timestamp)\n VALUES (?, ?, ?, ?, ?)\n `).run(randomUUID(), sessionId, filePath, content, new Date().toISOString());\n });\n }\n\n getLatestFileSnapshots(sessionId: string): Array<{ filePath: string; content: string }> {\n // Return the earliest snapshot per file — the \"before\" state used by\n // /rollback. ISO timestamps have millisecond resolution, so two rapid\n // calls can share a timestamp. The inner query picks a single winning\n // row per (session, path) by (timestamp ASC, rowid ASC), then the outer\n // query dedups to that row — avoiding the duplicate-row bug that\n // returned every snapshot for files written in the same millisecond.\n const rows = this.db.prepare(`\n SELECT fs.file_path, fs.content\n FROM file_snapshots fs\n WHERE fs.session_id = ?\n AND fs.rowid = (\n SELECT fs2.rowid\n FROM file_snapshots fs2\n WHERE fs2.session_id = fs.session_id\n AND fs2.file_path = fs.file_path\n ORDER BY fs2.timestamp ASC, fs2.rowid ASC\n LIMIT 1\n )\n `).all(sessionId) as Array<{ file_path: string; content: string }>;\n\n return rows.map((r) => ({ filePath: r.file_path, content: r.content }));\n }\n\n // ── Model Cache ───────────────────────────────\n\n upsertCachedModel(model: ModelInfo): void {\n this.db.prepare(`\n INSERT INTO model_cache (id, provider, model_id, name, metadata, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n name = excluded.name,\n metadata = excluded.metadata,\n updated_at = excluded.updated_at\n `).run(\n `${model.provider}:${model.id}`,\n model.provider,\n model.id,\n model.name,\n JSON.stringify(model),\n new Date().toISOString(),\n );\n }\n\n getCachedModels(provider?: ProviderType): ModelInfo[] {\n const rows = provider\n ? this.db.prepare('SELECT metadata FROM model_cache WHERE provider = ?').all(provider) as { metadata: string }[]\n : this.db.prepare('SELECT metadata FROM model_cache').all() as { metadata: string }[];\n return rows.map(r => JSON.parse(r.metadata));\n }\n\n clearModelCache(provider?: ProviderType): void {\n if (provider) {\n this.db.prepare('DELETE FROM model_cache WHERE provider = ?').run(provider);\n } else {\n this.db.prepare('DELETE FROM model_cache').run();\n }\n }\n\n getCacheAge(): number {\n const row = this.db.prepare('SELECT MIN(updated_at) as oldest FROM model_cache').get() as { oldest: string | null };\n if (!row.oldest) return Infinity;\n return Date.now() - new Date(row.oldest).getTime();\n }\n\n saveModelProfile(modelId: string, provider: ProviderType, specializations: string[]): void {\n const cacheKey = `${provider}:${modelId}`;\n const existing = this.db.prepare('SELECT metadata FROM model_cache WHERE id = ?').get(cacheKey) as { metadata: string } | undefined;\n const meta: ModelInfo = existing\n ? JSON.parse(existing.metadata) as ModelInfo\n : { id: modelId, provider, name: modelId, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: false };\n meta.specializations = specializations;\n this.db.prepare(`\n INSERT INTO model_cache (id, provider, model_id, name, metadata, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET metadata = excluded.metadata, updated_at = excluded.updated_at\n `).run(cacheKey, provider, modelId, meta.name ?? modelId, JSON.stringify(meta), new Date().toISOString());\n }\n\n getModelProfile(modelId: string, provider: ProviderType): ModelInfo | undefined {\n const row = this.db.prepare('SELECT metadata FROM model_cache WHERE id = ?').get(`${provider}:${modelId}`) as { metadata: string } | undefined;\n return row ? JSON.parse(row.metadata) as ModelInfo : undefined;\n }\n\n getProfiledModelIds(): string[] {\n const rows = this.db.prepare(\n \"SELECT model_id FROM model_cache WHERE json_extract(metadata, '$.specializations') IS NOT NULL\"\n ).all() as { model_id: string }[];\n return rows.map(r => r.model_id);\n }\n\n // ── Tool Result Cache (in-memory, TTL-based) ──────────────────────────\n // Avoids redundant calls for read-only tools within a short window.\n // Not persisted to DB — cleared on process restart.\n\n private toolResultCache: Map<string, { result: string; expiresAt: number }> = new Map();\n\n private static CACHEABLE_TOOLS = new Set([\n 'file_read', 'file_list',\n ]);\n\n private static TOOL_TTL_MS: Record<string, number> = {\n file_read: 60_000,\n file_list: 30_000,\n };\n\n /**\n * Returns a cached tool result, or null if not cached / expired.\n */\n getToolResult(toolName: string, input: Record<string, unknown>): string | null {\n if (!MemoryStore.CACHEABLE_TOOLS.has(toolName)) return null;\n const key = `${toolName}:${JSON.stringify(input)}`;\n const entry = this.toolResultCache.get(key);\n if (!entry || Date.now() > entry.expiresAt) {\n this.toolResultCache.delete(key);\n return null;\n }\n return entry.result;\n }\n\n /**\n * Stores a tool result in the in-memory cache.\n * Only caches read-only/safe tools (see CACHEABLE_TOOLS).\n */\n setToolResult(toolName: string, input: Record<string, unknown>, result: string): void {\n if (!MemoryStore.CACHEABLE_TOOLS.has(toolName)) return;\n const ttl = MemoryStore.TOOL_TTL_MS[toolName] ?? 30_000;\n this.toolResultCache.set(`${toolName}:${JSON.stringify(input)}`, {\n result,\n expiresAt: Date.now() + ttl,\n });\n }\n\n /** Invalidate tool cache for a specific tool name, or all tools if omitted. */\n invalidateToolCache(toolName?: string): void {\n if (!toolName) { this.toolResultCache.clear(); return; }\n for (const key of this.toolResultCache.keys()) {\n if (key.startsWith(`${toolName}:`)) this.toolResultCache.delete(key);\n }\n }\n\n close(): void {\n this.db.close();\n }\n\n // ── Migration ─────────────────────────────────\n\n private migrate(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n identity_id TEXT NOT NULL,\n workspace_path TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}'\n );\n\n CREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n role TEXT NOT NULL,\n content TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n tokens TEXT,\n agent_messages TEXT,\n FOREIGN KEY (session_id) REFERENCES sessions(id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);\n CREATE INDEX IF NOT EXISTS idx_messages_content ON messages(content);\n\n CREATE TABLE IF NOT EXISTS identities (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT,\n avatar TEXT,\n created_at TEXT NOT NULL,\n default_model TEXT,\n system_prompt TEXT,\n is_default INTEGER NOT NULL DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS scheduled_tasks (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n cron_expression TEXT NOT NULL,\n prompt TEXT NOT NULL,\n identity_id TEXT,\n workspace_path TEXT,\n created_at TEXT NOT NULL,\n last_run TEXT,\n next_run TEXT,\n enabled INTEGER NOT NULL DEFAULT 1\n );\n\n CREATE TABLE IF NOT EXISTS audit_log (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n tier_id TEXT NOT NULL,\n action TEXT NOT NULL,\n details TEXT NOT NULL DEFAULT '{}'\n );\n\n CREATE INDEX IF NOT EXISTS idx_audit_session ON audit_log(session_id);\n\n CREATE TABLE IF NOT EXISTS runtime_sessions (\n session_id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n workspace_path TEXT NOT NULL,\n status TEXT NOT NULL,\n started_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n latest_prompt TEXT,\n is_global INTEGER NOT NULL DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS runtime_nodes (\n tier_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n parent_id TEXT,\n role TEXT NOT NULL,\n label TEXT NOT NULL,\n status TEXT NOT NULL,\n current_action TEXT,\n progress_pct INTEGER,\n updated_at TEXT NOT NULL,\n workspace_path TEXT,\n is_global INTEGER NOT NULL DEFAULT 0,\n output TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_runtime_nodes_session ON runtime_nodes(session_id);\n CREATE INDEX IF NOT EXISTS idx_runtime_nodes_updated ON runtime_nodes(updated_at);\n\n CREATE TABLE IF NOT EXISTS runtime_node_logs (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n tier_id TEXT NOT NULL,\n role TEXT NOT NULL,\n label TEXT NOT NULL,\n status TEXT NOT NULL,\n current_action TEXT,\n progress_pct INTEGER,\n timestamp TEXT NOT NULL,\n workspace_path TEXT,\n is_global INTEGER NOT NULL DEFAULT 0,\n output TEXT\n );\n\n CREATE TABLE IF NOT EXISTS model_cache (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL,\n model_id TEXT NOT NULL,\n name TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n updated_at TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_runtime_logs_session ON runtime_node_logs(session_id);\n CREATE INDEX IF NOT EXISTS idx_runtime_logs_tier ON runtime_node_logs(tier_id);\n CREATE INDEX IF NOT EXISTS idx_runtime_logs_timestamp ON runtime_node_logs(timestamp);\n CREATE INDEX IF NOT EXISTS idx_runtime_nodes_session_updated ON runtime_nodes(session_id, updated_at);\n CREATE INDEX IF NOT EXISTS idx_runtime_logs_session_timestamp ON runtime_node_logs(session_id, timestamp);\n\n CREATE TABLE IF NOT EXISTS file_snapshots (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n file_path TEXT NOT NULL,\n content TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n FOREIGN KEY (session_id) REFERENCES sessions(id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_file_snapshots_session ON file_snapshots(session_id);\n `);\n\n // Auto-migrate: Add 'output' column if missing\n try { this.db.exec('ALTER TABLE runtime_nodes ADD COLUMN output TEXT'); } catch { /* ignore */ }\n try { this.db.exec('ALTER TABLE runtime_node_logs ADD COLUMN output TEXT'); } catch { /* ignore */ }\n }\n\n // ── Deserializers ─────────────────────────────\n\n private deserializeSession(row: DbSession, messages: StoredMessage[]): Session {\n return {\n id: row.id,\n title: row.title,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n identityId: row.identity_id,\n workspacePath: row.workspace_path,\n messages,\n metadata: JSON.parse(row.metadata) as Session['metadata'],\n };\n }\n\n private deserializeMessage(row: DbMessage): StoredMessage {\n return {\n id: row.id,\n sessionId: row.session_id,\n role: row.role as StoredMessage['role'],\n content: row.content,\n timestamp: row.timestamp,\n tokens: row.tokens ? JSON.parse(row.tokens) : undefined,\n agentMessages: row.agent_messages ? JSON.parse(row.agent_messages) : undefined,\n };\n }\n\n private deserializeIdentity(row: DbIdentity): Identity {\n return {\n id: row.id,\n name: row.name,\n description: row.description ?? undefined,\n avatar: row.avatar ?? undefined,\n createdAt: row.created_at,\n defaultModel: row.default_model ?? undefined,\n systemPrompt: row.system_prompt ?? undefined,\n isDefault: row.is_default === 1,\n };\n }\n\n private deserializeScheduledTask(row: DbScheduledTask): ScheduledTask {\n return {\n id: row.id,\n name: row.name,\n cronExpression: row.cron_expression,\n prompt: row.prompt,\n identityId: row.identity_id ?? undefined,\n workspacePath: row.workspace_path ?? undefined,\n createdAt: row.created_at,\n lastRun: row.last_run ?? undefined,\n nextRun: row.next_run ?? undefined,\n enabled: row.enabled === 1,\n };\n }\n}\n\n// ── DB Row Types ──────────────────────────────\n\ninterface DbSession {\n id: string; title: string; created_at: string; updated_at: string;\n identity_id: string; workspace_path: string; metadata: string;\n}\ninterface DbMessage {\n id: string; session_id: string; role: string; content: string;\n timestamp: string; tokens: string | null; agent_messages: string | null;\n}\ninterface DbIdentity {\n id: string; name: string; description: string | null; avatar: string | null;\n created_at: string; default_model: string | null; system_prompt: string | null; is_default: number;\n}\ninterface DbScheduledTask {\n id: string; name: string; cron_expression: string; prompt: string;\n identity_id: string | null; workspace_path: string | null;\n created_at: string; last_run: string | null; next_run: string | null; enabled: number;\n}\ninterface DbAudit { id: string; session_id: string; timestamp: string; tier_id: string; action: string; details: string; }\ninterface DbFileSnapshot { id: string; session_id: string; file_path: string; content: string; timestamp: string; }\ninterface DbRuntimeSession {\n session_id: string; title: string; workspace_path: string; status: string;\n started_at: string; updated_at: string; latest_prompt: string | null; is_global: number;\n}\ninterface DbRuntimeNode {\n tier_id: string; session_id: string; parent_id: string | null; role: string;\n label: string; status: string; current_action: string | null; progress_pct: number | null;\n updated_at: string; workspace_path: string | null; is_global: number; output: string | null;\n}\ninterface DbRuntimeNodeLog {\n id: string; session_id: string; tier_id: string; role: string; label: string;\n status: string; current_action: string | null; progress_pct: number | null; timestamp: string;\n workspace_path: string | null; is_global: number; output: string | null;\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Config Manager\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { CascadeConfig, Identity } from '../types.js';\nimport { Keystore } from './keystore.js';\nimport { CascadeIgnore } from './ignore.js';\nimport { loadCascadeMd, type CascadeMdContent } from './cascade-md.js';\nimport { MemoryStore } from '../memory/store.js';\nimport { validateConfig } from './validate.js';\nimport {\n CASCADE_CONFIG_FILE,\n CASCADE_DB_FILE,\n GLOBAL_CONFIG_DIR,\n GLOBAL_KEYSTORE_FILE,\n} from '../constants.js';\n\nexport class ConfigManager {\n private config!: CascadeConfig;\n private keystore!: Keystore;\n private ignore!: CascadeIgnore;\n private store!: MemoryStore;\n private cascadeMd: CascadeMdContent | null = null;\n private workspacePath: string;\n private globalDir: string;\n\n constructor(workspacePath = process.cwd()) {\n this.workspacePath = workspacePath;\n this.globalDir = path.join(os.homedir(), GLOBAL_CONFIG_DIR);\n }\n\n async load(): Promise<void> {\n this.config = await this.loadConfig();\n this.ignore = new CascadeIgnore();\n await this.ignore.load(this.workspacePath);\n this.cascadeMd = await loadCascadeMd(this.workspacePath);\n this.keystore = new Keystore(path.join(this.globalDir, GLOBAL_KEYSTORE_FILE));\n this.store = new MemoryStore(path.join(this.workspacePath, CASCADE_DB_FILE));\n await this.injectEnvKeys();\n await this.ensureDefaultIdentity();\n }\n\n getConfig(): CascadeConfig {\n return this.config;\n }\n\n getKeystore(): Keystore {\n return this.keystore;\n }\n\n getIgnore(): CascadeIgnore {\n return this.ignore;\n }\n\n getStore(): MemoryStore {\n return this.store;\n }\n\n getCascadeMd(): CascadeMdContent | null {\n return this.cascadeMd;\n }\n\n getWorkspacePath(): string {\n return this.workspacePath;\n }\n\n async save(): Promise<void> {\n const configPath = path.join(this.workspacePath, CASCADE_CONFIG_FILE);\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(this.config, null, 2), 'utf-8');\n }\n\n async updateConfig(updates: Partial<CascadeConfig>): Promise<void> {\n this.config = validateConfig({ ...this.config, ...updates });\n await this.save();\n }\n\n getApiKey(provider: string): string | undefined {\n const envMap: Record<string, string> = {\n anthropic: 'ANTHROPIC_API_KEY',\n openai: 'OPENAI_API_KEY',\n gemini: 'GOOGLE_API_KEY',\n azure: 'AZURE_OPENAI_KEY',\n };\n const envKey = envMap[provider];\n if (envKey && process.env[envKey]) return process.env[envKey];\n if (this.keystore.isUnlocked()) {\n const key = this.keystore.get(`provider:${provider}`);\n if (key) return key;\n }\n const configProvider = this.config.providers.find(p => p.type === provider);\n return configProvider?.apiKey;\n }\n\n private async loadConfig(): Promise<CascadeConfig> {\n const configPath = path.join(this.workspacePath, CASCADE_CONFIG_FILE);\n try {\n const raw = await fs.readFile(configPath, 'utf-8');\n return validateConfig(JSON.parse(raw) as unknown);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return validateConfig({});\n }\n throw err;\n }\n }\n\n private async injectEnvKeys(): Promise<void> {\n const isFirstRun = this.config.providers.length === 0;\n\n const envProviders: Array<{ env: string; type: CascadeConfig['providers'][0]['type'] }> = [\n { env: 'ANTHROPIC_API_KEY', type: 'anthropic' },\n { env: 'OPENAI_API_KEY', type: 'openai' },\n { env: 'GOOGLE_API_KEY', type: 'gemini' },\n { env: 'AZURE_OPENAI_KEY', type: 'azure' },\n ];\n\n for (const { env, type } of envProviders) {\n const key = process.env[env];\n if (!key) continue;\n const existing = this.config.providers.find((p) => p.type === type);\n \n if (!existing && isFirstRun) {\n this.config.providers.push({ type, apiKey: key });\n } else if (existing && !existing.apiKey) {\n existing.apiKey = key;\n }\n }\n\n if (isFirstRun && !this.config.providers.find((p) => p.type === 'ollama')) {\n this.config.providers.push({ type: 'ollama' });\n }\n }\n\n private async ensureDefaultIdentity(): Promise<void> {\n const existing = this.store.getDefaultIdentity();\n if (existing) return;\n const identity: Identity = {\n id: randomUUID(),\n name: 'Default',\n description: 'Default Cascade identity',\n createdAt: new Date().toISOString(),\n isDefault: true,\n };\n this.store.createIdentity(identity);\n this.config.defaultIdentityId = identity.id;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Programmatic SDK\n// ─────────────────────────────────────────────\n\nimport type {\n CascadeConfig,\n CascadeRunOptions,\n CascadeRunResult,\n StreamChunk,\n} from '../types.js';\nimport { Cascade } from '../core/cascade.js';\nimport { ConfigManager } from '../config/index.js';\nimport { CascadeConfigSchema } from '../config/schema.js';\n\nexport { Cascade } from '../core/cascade.js';\nexport * from '../types.js';\n\n/**\n * High-level SDK entry point — loads config from the workspace and runs a task.\n *\n * Cascade automatically determines complexity and routes to the appropriate\n * tier: T3 (simple), T2 (moderate), or the full T1→T2→T3 hierarchy (complex).\n *\n * @param prompt - The natural-language task description to execute.\n * @param options - Optional overrides for run behavior, approval callbacks, etc.\n * @returns A resolved `CascadeRunResult` with the final output and metadata.\n *\n * @example\n * const result = await runCascade('Refactor the auth module to use JWT', {\n * workspacePath: '/path/to/my/project',\n * streamCallback: (chunk) => process.stdout.write(chunk.text ?? ''),\n * approvalCallback: async (req) => {\n * console.log(`Approve ${req.toolName}?`);\n * return { approved: true, always: false };\n * },\n * });\n * console.log(result.output);\n */\nexport async function runCascade(\n prompt: string,\n options: Partial<CascadeRunOptions> & { workspacePath?: string; config?: Partial<CascadeConfig> } = {},\n): Promise<CascadeRunResult> {\n const workspacePath = options.workspacePath ?? process.cwd();\n\n const cm = new ConfigManager(workspacePath);\n await cm.load();\n const config = options.config\n ? CascadeConfigSchema.parse({ ...cm.getConfig(), ...options.config })\n : cm.getConfig();\n\n const cascade = new Cascade(config, workspacePath);\n await cascade.init();\n\n try {\n return await cascade.run({\n prompt,\n workspacePath,\n ...options,\n });\n } finally {\n // Fire-and-forget SDK invocations should not leak the MCP child\n // processes Cascade may have spawned. `createCascade` (which returns\n // the instance) still leaves cleanup to the caller.\n try { await cascade.close(); } catch { /* non-critical */ }\n }\n}\n\n/**\n * Create a `Cascade` instance with custom config — no filesystem config loading.\n *\n * Use this in environments where you control the config programmatically\n * (e.g. tests, serverless, embedded usage).\n *\n * @param config - Partial config; missing fields use schema defaults.\n * @param workspacePath - Workspace root (default: `process.cwd()`).\n *\n * @example\n * const cascade = createCascade({\n * providers: [{ type: 'anthropic', apiKey: process.env.ANTHROPIC_KEY }],\n * });\n * cascade.on('stream:token', (e) => process.stdout.write(e.text));\n * await cascade.init();\n * await cascade.run({ prompt: 'Hello world', workspacePath: '.' });\n */\nexport function createCascade(\n config: Partial<CascadeConfig>,\n workspacePath: string = process.cwd(),\n): Cascade {\n const parsed = CascadeConfigSchema.parse(config);\n return new Cascade(parsed, workspacePath);\n}\n\n/**\n * Convenience streaming helper — runs a task and delivers tokens via callback.\n *\n * @param prompt - The task to execute.\n * @param onToken - Called with each streamed text token as it arrives.\n * @param options - Same options as `runCascade`.\n *\n * @example\n * await streamCascade('Summarize this codebase', (token) => {\n * process.stdout.write(token);\n * });\n */\nexport async function streamCascade(\n prompt: string,\n onToken: (text: string) => void,\n options: Partial<CascadeRunOptions> & { workspacePath?: string } = {},\n): Promise<CascadeRunResult> {\n return runCascade(prompt, {\n ...options,\n streamCallback: (chunk: StreamChunk) => {\n if (chunk.text) onToken(chunk.text);\n },\n });\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — JWT Auth\n// ─────────────────────────────────────────────\n\nimport jwt from 'jsonwebtoken';\nimport type { Request, Response, NextFunction } from 'express';\n\nexport interface DashboardUser {\n id: string;\n username: string;\n role: 'admin' | 'viewer';\n}\n\n// Pin the signing algorithm so a forged token cannot downgrade to `alg: none`\n// or trick verification into using an unexpected algorithm.\nconst JWT_ALGORITHM = 'HS256' as const;\n\nexport function createToken(user: DashboardUser, secret: string): string {\n return jwt.sign(user, secret, { expiresIn: '24h', algorithm: JWT_ALGORITHM });\n}\n\nexport function verifyToken(token: string, secret: string): DashboardUser | null {\n try {\n return jwt.verify(token, secret, { algorithms: [JWT_ALGORITHM] }) as DashboardUser;\n } catch {\n return null;\n }\n}\n\nexport function authMiddleware(secret: string, required = true) {\n return (req: Request, res: Response, next: NextFunction): void => {\n const header = req.headers.authorization;\n const token = header?.startsWith('Bearer ') ? header.slice(7) : undefined;\n\n if (!token) {\n if (!required) { (req as Request & { user?: DashboardUser }).user = undefined; next(); return; }\n res.status(401).json({ error: 'Unauthorized' });\n return;\n }\n\n const user = verifyToken(token, secret);\n if (!user) {\n res.status(401).json({ error: 'Invalid or expired token' });\n return;\n }\n\n (req as Request & { user: DashboardUser }).user = user;\n next();\n };\n}\n","import type {\n ApprovalResponse,\n PermissionDecisionPayload,\n RuntimeRefreshPayload,\n RuntimeScope,\n SessionSubscriptionPayload,\n} from '../types.js';\n\nexport function normalizeRuntimeRefreshPayload(\n payload?: RuntimeRefreshPayload | RuntimeScope,\n): RuntimeRefreshPayload {\n if (payload === 'workspace' || payload === 'global') {\n return { scope: payload };\n }\n return { scope: payload?.scope ?? 'workspace' };\n}\n\nexport function normalizeSessionSubscriptionPayload(\n payload: SessionSubscriptionPayload | string,\n): SessionSubscriptionPayload {\n return typeof payload === 'string' ? { sessionId: payload } : payload;\n}\n\nexport function normalizePermissionDecisionPayload(\n payload: PermissionDecisionPayload | ApprovalResponse,\n): PermissionDecisionPayload {\n if ('requestId' in payload) return payload;\n return {\n requestId: payload.id,\n approved: payload.approved,\n always: payload.always,\n decidedBy: 'USER',\n };\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — WebSocket (Socket.io)\n// ─────────────────────────────────────────────\n\nimport { Server as SocketServer } from 'socket.io';\nimport parser from 'socket.io-msgpack-parser';\nimport type { Server as HttpServer } from 'node:http';\nimport type {\n CascadeEvent,\n PeerMessageEvent,\n PermissionDecisionPayload,\n PermissionRequest,\n RuntimeRefreshPayload,\n SessionSubscriptionPayload,\n} from '../types.js';\nimport { verifyToken } from './auth.js';\nimport {\n normalizePermissionDecisionPayload,\n normalizeRuntimeRefreshPayload,\n normalizeSessionSubscriptionPayload,\n} from './socket-protocol.js';\n\ninterface DashboardSocketOptions {\n authRequired: boolean;\n secret: string;\n corsOrigin?: string | string[];\n}\n\nexport class DashboardSocket {\n private io: SocketServer;\n private authRequired: boolean;\n private secret: string;\n\n constructor(httpServer: HttpServer, options: DashboardSocketOptions) {\n const corsOrigin = options.corsOrigin ?? '*';\n this.io = new SocketServer(httpServer, {\n cors: { origin: corsOrigin, methods: ['GET', 'POST'] },\n parser,\n });\n this.authRequired = options.authRequired;\n this.secret = options.secret;\n this.setupHandlers();\n }\n\n broadcastToRoom(room: string, event: string, data: unknown): void {\n this.io.to(room).emit(event, data);\n }\n\n broadcast(event: string, data: unknown): void {\n this.io.emit(event, data);\n }\n\n emitCascadeEvent(ev: CascadeEvent): void {\n this.io.emit('cascade:event', ev);\n }\n\n emitTierStatus(tierId: string, role: string, status: string, sessionId: string, action?: string): void {\n const payload = { tierId, role, status, action, timestamp: new Date().toISOString(), sessionId };\n this.io.emit('tier:status', payload);\n this.io.to(`session:${sessionId}`).emit('tier:status', payload);\n }\n\n emitStreamToken(tierId: string, text: string, sessionId: string): void {\n this.io.to(`session:${sessionId}`).emit('stream:token', { tierId, text, sessionId });\n }\n\n emitPeerMessage(event: PeerMessageEvent): void {\n this.io.to(`session:${event.sessionId}`).emit('peer:message', event);\n }\n\n emitApprovalRequest(request: PermissionRequest): void {\n this.io.emit('permission:user-required', request);\n }\n\n onApprovalResponse(callback: (data: PermissionDecisionPayload) => void): void {\n this.io.on('connection', (socket) => {\n socket.on('permission:decision', (payload: PermissionDecisionPayload) => {\n callback(normalizePermissionDecisionPayload(payload));\n });\n });\n }\n\n private setupHandlers(): void {\n this.io.on('connection', (socket) => {\n const token = typeof socket.handshake.auth?.token === 'string'\n ? socket.handshake.auth.token\n : undefined;\n const user = token ? verifyToken(token, this.secret) : null;\n\n if (this.authRequired && !user) {\n socket.emit('auth:error', { error: 'Unauthorized socket connection' });\n socket.disconnect(true);\n return;\n }\n\n socket.data.user = user ?? undefined;\n\n socket.emit('runtime:refresh', { scope: 'workspace' } satisfies RuntimeRefreshPayload);\n socket.emit('runtime:refresh', { scope: 'global' } satisfies RuntimeRefreshPayload);\n socket.on('runtime:refresh', (payload?: RuntimeRefreshPayload) => {\n this.io.emit('runtime:refresh', normalizeRuntimeRefreshPayload(payload));\n });\n socket.on('session:halt', (payload: { sessionId?: string }) => {\n this.io.emit('session:halt', payload);\n });\n socket.on('session:approve', (payload: { nodeId?: string }) => {\n this.io.emit('session:approve', payload);\n });\n socket.on('session:message-injected', (payload: { message?: string }) => {\n this.io.emit('session:message-injected', payload);\n });\n socket.on('join:session', (payload: SessionSubscriptionPayload) => {\n const { sessionId } = normalizeSessionSubscriptionPayload(payload);\n socket.join(`session:${sessionId}`);\n });\n socket.on('leave:session', (payload: SessionSubscriptionPayload) => {\n const { sessionId } = normalizeSessionSubscriptionPayload(payload);\n socket.leave(`session:${sessionId}`);\n });\n });\n }\n\n close(): void {\n this.io.close();\n }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","// ─────────────────────────────────────────────\n// Cascade AI — Dashboard Express Server\n// ─────────────────────────────────────────────\n\nimport { createServer } from 'node:http';\nimport { fileURLToPath } from 'node:url';\nimport os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport express, { type Request, type Response } from 'express';\nimport rateLimit from 'express-rate-limit';\nimport bcrypt from 'bcryptjs';\nimport type { CascadeConfig } from '../types.js';\nimport { MemoryStore } from '../memory/store.js';\nimport type { RuntimeNode, RuntimeNodeLog, RuntimeSession } from '../types.js';\nimport { CASCADE_DB_FILE, GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE, CASCADE_CONFIG_FILE, CASCADE_DASHBOARD_SECRET_FILE } from '../constants.js';\nimport { DashboardSocket } from './websocket.js';\nimport { authMiddleware, createToken } from './auth.js';\nimport { DEFAULT_DASHBOARD_PORT } from '../constants.js';\nimport { randomUUID, timingSafeEqual } from 'node:crypto';\nimport type { Identity, TierLimits, BudgetConfig } from '../types.js';\nimport { Cascade } from '../core/cascade.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport class DashboardServer {\n private app: express.Application;\n private httpServer: ReturnType<typeof createServer>;\n private socket: DashboardSocket;\n private config: CascadeConfig;\n private dashboardSecret: string;\n private store: MemoryStore;\n private globalStore: MemoryStore | null = null;\n private broadcastTimer: NodeJS.Timeout | null = null;\n private port: number;\n private host: string;\n private workspacePath: string;\n\n constructor(config: CascadeConfig, store: MemoryStore, workspacePath = process.cwd()) {\n this.config = config;\n this.store = store;\n this.workspacePath = workspacePath;\n this.port = config.dashboard.port ?? DEFAULT_DASHBOARD_PORT;\n this.host = config.dashboard.host ?? '127.0.0.1';\n this.dashboardSecret = this.resolveDashboardSecret();\n this.app = express();\n this.httpServer = createServer(this.app);\n this.socket = new DashboardSocket(this.httpServer, {\n authRequired: config.dashboard.auth,\n secret: this.dashboardSecret,\n corsOrigin: config.dashboard.auth\n ? [`http://localhost:${this.port}`, `http://127.0.0.1:${this.port}`]\n : '*',\n });\n this.setupMiddleware();\n this.setupRoutes();\n }\n\n async start(): Promise<void> {\n const isLoopback = this.host === '127.0.0.1' || this.host === '::1' || this.host === 'localhost';\n if (!isLoopback) {\n console.warn(\n `⚠ Dashboard is binding to ${this.host}:${this.port} — reachable from the network. ` +\n `It exposes task execution (/api/run) and config endpoints. ` +\n `Ensure dashboard.auth is enabled and CASCADE_DASHBOARD_PASSWORD is set.`,\n );\n if (!this.config.dashboard.auth) {\n console.warn('⚠ Dashboard auth is DISABLED while bound to a non-loopback interface — this allows unauthenticated remote task execution.');\n }\n }\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error) => reject(err);\n this.httpServer.once('error', onError);\n this.httpServer.listen(this.port, this.host, () => {\n this.httpServer.off('error', onError);\n resolve();\n });\n });\n }\n\n async stop(): Promise<void> {\n // Cancel any pending throttled broadcast so we don't fire a broadcast\n // on an already-closed socket (which logs noisy errors and keeps the\n // event loop alive).\n if (this.broadcastTimer) {\n clearTimeout(this.broadcastTimer);\n this.broadcastTimer = null;\n }\n this.socket.close();\n // Release the lazily-opened global runtime DB handle so the caller can\n // safely reopen the dashboard or delete the underlying file.\n try { this.globalStore?.close(); } catch { /* ignore */ }\n this.globalStore = null;\n await new Promise<void>((resolve, reject) => {\n this.httpServer.close((err) => (err ? reject(err) : resolve()));\n });\n }\n\n getSocket(): DashboardSocket {\n return this.socket;\n }\n\n /**\n * Produce a stable dashboard JWT signing secret.\n *\n * Order of precedence: explicit config → env var → secret file on disk\n * (auto-created with 0600 perms). Previously this generated a fresh UUID\n * on every process start which invalidated all outstanding JWTs.\n */\n private resolveDashboardSecret(): string {\n const fromConfig = this.config.dashboard.secret ?? process.env['CASCADE_DASHBOARD_SECRET'];\n if (fromConfig) return fromConfig;\n\n const secretPath = path.join(this.workspacePath, CASCADE_DASHBOARD_SECRET_FILE);\n try {\n if (fs.existsSync(secretPath)) {\n const existing = fs.readFileSync(secretPath, 'utf-8').trim();\n if (existing.length >= 16) return existing;\n }\n const generated = randomUUID();\n fs.mkdirSync(path.dirname(secretPath), { recursive: true });\n fs.writeFileSync(secretPath, generated, { encoding: 'utf-8', mode: 0o600 });\n if (this.config.dashboard.auth) {\n console.warn(\n `Dashboard auth enabled with no secret configured; persisted a generated secret to ${secretPath}. ` +\n `Set CASCADE_DASHBOARD_SECRET or config.dashboard.secret to override.`,\n );\n }\n return generated;\n } catch {\n // Read-only FS fallback: use an ephemeral secret but warn loudly.\n console.warn('Unable to persist dashboard secret; falling back to a process-ephemeral secret.');\n return randomUUID();\n }\n }\n\n /**\n * Resolve the dashboard password as a bcrypt hash.\n * Accepts either a pre-hashed `CASCADE_DASHBOARD_PASSWORD_HASH` or a plain\n * `CASCADE_DASHBOARD_PASSWORD` which is hashed once at startup.\n */\n private resolvePasswordHash(): string | null {\n const preHashed = process.env['CASCADE_DASHBOARD_PASSWORD_HASH'];\n if (preHashed && preHashed.startsWith('$2')) return preHashed;\n const plain = process.env['CASCADE_DASHBOARD_PASSWORD'];\n if (!plain) return null;\n return bcrypt.hashSync(plain, 10);\n }\n\n // ── Setup ─────────────────────────────────────\n\n private getGlobalStore(): MemoryStore {\n if (!this.globalStore) {\n const globalDbPath = path.join(os.homedir(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE);\n this.globalStore = new MemoryStore(globalDbPath);\n }\n return this.globalStore;\n }\n\n private throttledBroadcast(scope: 'workspace' | 'global'): void {\n if (this.broadcastTimer) return;\n this.broadcastTimer = setTimeout(() => {\n this.broadcastRuntime(scope);\n this.broadcastTimer = null;\n }, 500);\n }\n\n private broadcastRuntime(scope: 'workspace' | 'global'): void {\n if (scope === 'global') {\n const globalStore = this.getGlobalStore();\n try {\n // Broadcast only session list (summary) to everyone\n this.socket.broadcast('runtime:update', {\n scope,\n source: 'dashboard/server',\n fetchedAt: new Date().toISOString(),\n sessions: globalStore.listRuntimeSessions(100),\n nodes: [], // No nodes in summary\n logs: [], // No logs in summary\n });\n } catch (err) {\n console.error('Failed to broadcast global runtime:', err);\n }\n return;\n }\n\n // Workspace scope\n const sessions = this.store.listRuntimeSessions(100);\n this.socket.broadcast('runtime:update', {\n scope,\n source: 'dashboard/server',\n fetchedAt: new Date().toISOString(),\n sessions,\n nodes: [],\n logs: [],\n });\n\n // Broadcast details to active session rooms\n for (const session of sessions) {\n if (session.status === 'ACTIVE') {\n this.broadcastSessionDetails(session.sessionId);\n }\n }\n }\n\n private broadcastSessionDetails(sessionId: string): void {\n try {\n const nodes = this.store.listRuntimeNodes(sessionId, 500);\n const logs = this.store.listRuntimeNodeLogs(sessionId, undefined, 100);\n this.socket.broadcastToRoom(`session:${sessionId}`, 'session:details', {\n sessionId,\n nodes,\n logs,\n updatedAt: new Date().toISOString(),\n });\n } catch (err) {\n console.error(`Failed to broadcast details for session ${sessionId}:`, err);\n }\n }\n\n watchRuntimeChanges(): void {\n const workspaceDbPath = path.join(this.workspacePath, CASCADE_DB_FILE);\n const globalDbPath = path.join(os.homedir(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE);\n const watchPaths = [workspaceDbPath, globalDbPath].filter((p, index, arr) => arr.indexOf(p) === index);\n\n for (const watchPath of watchPaths) {\n if (!fs.existsSync(watchPath)) continue;\n // Increase interval to 3s and use throttled broadcast\n fs.watchFile(watchPath, { interval: 3000 }, () => {\n this.throttledBroadcast(watchPath === globalDbPath ? 'global' : 'workspace');\n });\n }\n }\n\n public refreshRuntime(scope: 'workspace' | 'global' = 'workspace'): void {\n this.broadcastRuntime(scope);\n }\n\n private setupMiddleware(): void {\n this.app.use(express.json({ limit: '10mb' }));\n this.app.use(express.urlencoded({ extended: true }));\n\n // CORS for dev\n this.app.use((_req, res, next) => {\n if (!this.config.dashboard.auth) {\n res.header('Access-Control-Allow-Origin', '*');\n }\n res.header('Access-Control-Allow-Headers', 'Authorization, Content-Type');\n res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n next();\n });\n }\n\n private setupRoutes(): void {\n const authRequired = this.config.dashboard.auth;\n const auth = authMiddleware(this.dashboardSecret, authRequired);\n const passwordHash = authRequired ? this.resolvePasswordHash() : null;\n\n // Brute-force protection: 5 attempts / 15 min per IP.\n const loginLimiter = rateLimit({\n windowMs: 15 * 60 * 1000,\n limit: 5,\n standardHeaders: 'draft-7',\n legacyHeaders: false,\n message: { error: 'Too many login attempts. Try again in 15 minutes.' },\n });\n\n // General API limiter: 60 req/min per IP on all /api routes.\n const apiLimiter = rateLimit({\n windowMs: 60 * 1000,\n limit: 60,\n standardHeaders: 'draft-7',\n legacyHeaders: false,\n message: { error: 'Too many requests. Slow down.' },\n });\n this.app.use('/api', apiLimiter);\n\n // Stricter limiter for mutation/execution endpoints: 10 req/min per IP.\n const mutationLimiter = rateLimit({\n windowMs: 60 * 1000,\n limit: 10,\n standardHeaders: 'draft-7',\n legacyHeaders: false,\n message: { error: 'Too many requests on this endpoint.' },\n });\n\n // ── Auth ────────────────────────────────────\n this.app.post('/api/auth/login', loginLimiter, (req: Request, res: Response) => {\n const { username, password } = (req.body ?? {}) as { username?: string; password?: string };\n if (!authRequired) {\n const token = createToken(\n { id: username ?? 'anonymous', username: username ?? 'anonymous', role: 'admin' },\n this.dashboardSecret,\n );\n res.json({ token });\n return;\n }\n if (!passwordHash) {\n res.status(503).json({\n error: 'Dashboard password is not configured. Set CASCADE_DASHBOARD_PASSWORD (or CASCADE_DASHBOARD_PASSWORD_HASH) or disable dashboard auth.',\n });\n return;\n }\n if (typeof password !== 'string' || typeof username !== 'string') {\n res.status(400).json({ error: 'username and password are required' });\n return;\n }\n // bcrypt.compareSync is constant-time; we additionally gate on a\n // timingSafeEqual over the stringified result to preserve the same\n // response timing for both branches.\n const ok = bcrypt.compareSync(password, passwordHash);\n const truthy = Buffer.from('1');\n const falsy = Buffer.from('0');\n const probe = ok ? truthy : falsy;\n const authorized = timingSafeEqual(probe, truthy);\n if (authorized) {\n const token = createToken(\n { id: username, username, role: 'admin' },\n this.dashboardSecret,\n );\n res.json({ token });\n } else {\n res.status(401).json({ error: 'Invalid credentials' });\n }\n });\n\n // ── Commands ────────────────────────────────────\n this.app.post('/api/force-halt', auth, mutationLimiter, (req: Request, res: Response) => {\n const body = req.body as Record<string, unknown>;\n const sessionId = typeof body['sessionId'] === 'string' ? body['sessionId'] : undefined;\n const nodeId = typeof body['nodeId'] === 'string' ? body['nodeId'] : undefined;\n const payload = { sessionId, nodeId, requestedAt: new Date().toISOString() };\n this.socket.broadcast('session:halt', payload);\n if (sessionId) this.socket.broadcastToRoom(`session:${sessionId}`, 'session:halt', payload);\n res.json({ success: true, ...payload });\n });\n\n this.app.post('/api/approve', auth, mutationLimiter, (req: Request, res: Response) => {\n const body = req.body as Record<string, unknown>;\n const sessionId = typeof body['sessionId'] === 'string' ? body['sessionId'] : undefined;\n const nodeId = typeof body['nodeId'] === 'string' ? body['nodeId'] : undefined;\n const payload = { sessionId, nodeId, requestedAt: new Date().toISOString() };\n this.socket.broadcast('session:approve', payload);\n if (sessionId) this.socket.broadcastToRoom(`session:${sessionId}`, 'session:approve', payload);\n res.json({ success: true, ...payload });\n });\n\n this.app.post('/api/inject', auth, mutationLimiter, (req: Request, res: Response) => {\n const body = req.body as Record<string, unknown>;\n const message = typeof body['message'] === 'string' ? body['message'] : undefined;\n const sessionId = typeof body['sessionId'] === 'string' ? body['sessionId'] : undefined;\n const nodeId = typeof body['nodeId'] === 'string' ? body['nodeId'] : undefined;\n if (!message) {\n res.status(400).json({ error: 'message is required and must be a string' });\n return;\n }\n const payload = { sessionId, nodeId, message, requestedAt: new Date().toISOString() };\n this.socket.broadcast('session:message-injected', payload);\n if (sessionId) this.socket.broadcastToRoom(`session:${sessionId}`, 'session:message-injected', payload);\n res.json({ success: true, ...payload });\n });\n \n // ── Sessions ────────────────────────────────\n this.app.get('/api/sessions', auth, (_req, res) => {\n const sessions = this.store.listSessions();\n res.json(sessions);\n });\n\n this.app.get('/api/sessions/:id', auth, (req, res) => {\n const id = req.params.id as string;\n const session = this.store.getSession(id);\n if (!session) { res.status(404).json({ error: 'Not found' }); return; }\n res.json(session);\n });\n\n this.app.delete('/api/sessions/:id', auth, (req, res) => {\n const sessionId = req.params.id as string;\n this.store.deleteSession(sessionId);\n this.store.deleteRuntimeSession(sessionId);\n\n const globalDbPath = path.join(os.homedir(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE);\n const globalStore = new MemoryStore(globalDbPath);\n try {\n globalStore.deleteRuntimeSession(sessionId);\n } finally {\n globalStore.close();\n }\n\n this.socket.broadcast('session:deleted', { sessionId });\n this.socket.broadcast('runtime:refresh', { scope: 'workspace' });\n this.socket.broadcast('runtime:refresh', { scope: 'global' });\n res.json({ ok: true });\n });\n\n this.app.delete('/api/sessions', auth, (req: Request, res: Response) => {\n const body = req.body as { ids?: string[] } | undefined;\n const globalDbPath = path.join(os.homedir(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE);\n\n if (body?.ids && Array.isArray(body.ids) && body.ids.length > 0) {\n // Bulk delete specific sessions by IDs\n const globalStore = new MemoryStore(globalDbPath);\n try {\n for (const id of body.ids) {\n this.store.deleteSession(id);\n this.store.deleteRuntimeSession(id);\n globalStore.deleteRuntimeSession(id);\n this.socket.broadcast('session:deleted', { sessionId: id });\n }\n } finally {\n globalStore.close();\n }\n res.json({ ok: true, deleted: body.ids.length });\n } else {\n // Delete all sessions (original behavior)\n this.store.deleteAllSessions();\n res.json({ ok: true });\n }\n this.socket.broadcast('runtime:refresh', { scope: 'workspace' });\n this.socket.broadcast('runtime:refresh', { scope: 'global' });\n });\n\n this.app.delete('/api/runtime', auth, (_req, res) => {\n this.store.deleteAllRuntimeNodes();\n const globalDbPath = path.join(os.homedir(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE);\n const globalStore = new MemoryStore(globalDbPath);\n try {\n globalStore.deleteAllRuntimeNodes();\n } finally {\n globalStore.close();\n }\n this.socket.broadcast('runtime:refresh', { scope: 'workspace' });\n this.socket.broadcast('runtime:refresh', { scope: 'global' });\n res.json({ ok: true });\n });\n\n // ── Identities ──────────────────────────────\n this.app.get('/api/identities', auth, (_req, res) => {\n res.json(this.store.listIdentities());\n });\n\n this.app.post('/api/identities', auth, (req: Request, res: Response) => {\n const body = req.body as Partial<Identity> & { setDefault?: boolean };\n if (!body.name) { res.status(400).json({ error: 'name is required' }); return; }\n if (body.setDefault) {\n const existing = this.store.getDefaultIdentity();\n if (existing) this.store.updateIdentity(existing.id, { isDefault: false });\n }\n const id = randomUUID();\n const identity: Identity = {\n id,\n name: body.name,\n description: body.description,\n systemPrompt: body.systemPrompt,\n isDefault: body.setDefault ?? false,\n createdAt: new Date().toISOString(),\n };\n this.store.createIdentity(identity);\n res.json(identity);\n });\n\n this.app.put('/api/identities/:id', auth, (req: Request, res: Response) => {\n const identityId = req.params.id as string;\n const body = req.body as Partial<Identity> & { setDefault?: boolean };\n if (body.setDefault) {\n const existing = this.store.getDefaultIdentity();\n if (existing && existing.id !== identityId) this.store.updateIdentity(existing.id, { isDefault: false });\n body.isDefault = true;\n }\n this.store.updateIdentity(identityId, body);\n res.json({ ok: true });\n });\n\n this.app.delete('/api/identities/:id', auth, (req: Request, res: Response) => {\n this.store.deleteIdentity(req.params.id as string);\n res.json({ ok: true });\n });\n\n // ── Audit log ───────────────────────────────\n this.app.get('/api/audit/:sessionId', auth, (req, res) => {\n const log = this.store.getAuditLog(req.params.sessionId as string);\n res.json(log);\n });\n\n this.app.get('/api/config', auth, (_req, res) => {\n // Strip sensitive fields before sending\n const safe = { ...this.config };\n safe.providers = safe.providers.map((p) => ({ ...p, apiKey: p.apiKey ? '***' : undefined }));\n res.json(safe);\n });\n\n this.app.put('/api/config', auth, async (req: Request, res: Response) => {\n const body = req.body as Record<string, unknown>;\n // Validate shape before mutating in-memory config\n if (body['tierLimits'] !== undefined && (typeof body['tierLimits'] !== 'object' || Array.isArray(body['tierLimits']))) {\n res.status(400).json({ error: 'tierLimits must be an object' });\n return;\n }\n if (body['budget'] !== undefined && (typeof body['budget'] !== 'object' || Array.isArray(body['budget']))) {\n res.status(400).json({ error: 'budget must be an object' });\n return;\n }\n if (body['tierLimits']) this.config.tierLimits = { ...this.config.tierLimits, ...(body['tierLimits'] as TierLimits) };\n if (body['budget']) this.config.budget = { ...this.config.budget, ...(body['budget'] as BudgetConfig) };\n // Persist to .cascade/config.json atomically (write temp + rename)\n try {\n const configPath = path.join(this.workspacePath, CASCADE_CONFIG_FILE);\n const existing = fs.existsSync(configPath) ? JSON.parse(fs.readFileSync(configPath, 'utf-8')) : {};\n const updated = { ...existing, tierLimits: this.config.tierLimits, budget: this.config.budget };\n const tmp = configPath + '.tmp';\n fs.writeFileSync(tmp, JSON.stringify(updated, null, 2), 'utf-8');\n fs.renameSync(tmp, configPath);\n res.json({ ok: true });\n } catch (err) {\n res.status(500).json({ error: `Failed to save config: ${err instanceof Error ? err.message : String(err)}` });\n }\n });\n\n // ── Log History ─────────────────────────────\n this.app.get('/api/runtime/logs/:sessionId', auth, (req: Request, res: Response) => {\n const sessionId = req.params['sessionId'] as string;\n const before = req.query['before'] as string | undefined;\n const limitStr = req.query['limit'] as string | undefined;\n const logs = this.store.listRuntimeNodeLogs(\n sessionId,\n before,\n parseInt(limitStr || '100', 10),\n );\n res.json(logs);\n });\n\n // ── Stats ───────────────────────────────────\n this.app.get('/api/stats', auth, (_req, res) => {\n const sessions = this.store.listSessions(undefined, 1000);\n res.json({\n totalSessions: sessions.length,\n totalMessages: sessions.reduce((acc, s) => acc + s.metadata.taskCount, 0),\n totalCostUsd: sessions.reduce((acc, s) => acc + s.metadata.totalCostUsd, 0),\n });\n });\n\n // ── Runtime ──────────────────────────────────\n this.app.get('/api/runtime', auth, (req, res) => {\n const scope = (req.query['scope'] as string | undefined) ?? 'workspace';\n if (scope === 'global') {\n const globalDbPath = path.join(os.homedir(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE);\n const globalStore = new MemoryStore(globalDbPath);\n try {\n res.json({\n scope,\n sessions: globalStore.listRuntimeSessions(200),\n nodes: globalStore.listRuntimeNodes(undefined, 1000),\n logs: globalStore.listRuntimeNodeLogs(undefined, undefined, 500),\n });\n } finally {\n globalStore.close();\n }\n return;\n }\n res.json({\n scope: 'workspace',\n sessions: this.store.listRuntimeSessions(200),\n nodes: this.store.listRuntimeNodes(undefined, 1000),\n logs: this.store.listRuntimeNodeLogs(undefined, undefined, 500),\n });\n });\n\n // ── Remote Run ──────────────────────────────\n this.app.post('/api/run', auth, mutationLimiter, (req: Request, res: Response) => {\n const body = req.body as { prompt?: string; identityId?: string };\n if (!body.prompt || typeof body.prompt !== 'string') {\n res.status(400).json({ error: 'prompt is required' });\n return;\n }\n\n const sessionId = randomUUID();\n res.json({ sessionId, status: 'ACTIVE' });\n\n void (async () => {\n const cascade = new Cascade(this.config, this.workspacePath, this.store);\n\n cascade.on('stream:token', (e: { text: string; tierId: string }) => {\n this.socket.broadcast('stream:token', { sessionId, tierId: e.tierId, text: e.text });\n this.socket.broadcastToRoom(`session:${sessionId}`, 'stream:token', { sessionId, tierId: e.tierId, text: e.text });\n });\n cascade.on('tier:status', (e: unknown) => {\n this.socket.broadcast('tier:status', { sessionId, ...(e as object) });\n this.socket.broadcastToRoom(`session:${sessionId}`, 'tier:status', { sessionId, ...(e as object) });\n });\n cascade.on('permission:user-required', (e: unknown) => {\n this.socket.broadcastToRoom(`session:${sessionId}`, 'permission:user-required', { sessionId, ...(e as object) });\n });\n cascade.on('peer:message', (e: unknown) => {\n this.socket.emitPeerMessage(e as import('../types.js').PeerMessageEvent);\n });\n\n try {\n const result = await cascade.run({ prompt: body.prompt!, identityId: body.identityId });\n this.socket.broadcast('cost:update', {\n sessionId,\n totalTokens: result.usage.totalTokens,\n totalCostUsd: result.usage.estimatedCostUsd,\n });\n this.socket.broadcastToRoom(`session:${sessionId}`, 'session:complete', { sessionId, result });\n this.throttledBroadcast('workspace');\n } catch (err) {\n this.socket.broadcastToRoom(`session:${sessionId}`, 'session:error', {\n sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n });\n\n // ── Models ───────────────────────────────────\n this.app.get('/api/models', auth, (_req: Request, res: Response) => {\n res.json({\n t1: this.config.models?.t1 ?? 'auto',\n t2: this.config.models?.t2 ?? 'auto',\n t3: this.config.models?.t3 ?? 'auto',\n providers: this.config.providers.map((p) => ({\n type: p.type,\n label: p.label ?? p.type,\n })),\n });\n });\n\n // ── Serve React app ─────────────────────────\n // When running from built CLI, __dirname is dist/.\n // When running locally via ts-node, __dirname is src/dashboard.\n const prodPath = path.resolve(__dirname, '../web/dist');\n const devPath = path.resolve(__dirname, '../../web/dist');\n const webDistPath = fs.existsSync(prodPath) ? prodPath : devPath;\n\n if (fs.existsSync(webDistPath)) {\n this.app.use(express.static(webDistPath));\n this.app.get('*', (_req, res) => {\n res.sendFile(path.join(webDistPath, 'index.html'));\n });\n } else {\n this.app.get('/', (_req, res) => {\n res.send(`\n <html><body style=\"background:#0f0f1a;color:#e2e8f0;font-family:monospace;padding:2rem\">\n <h2>◈ Cascade Dashboard</h2>\n <p>Dashboard not built yet. Run: <code>npm run build:web</code></p>\n <p>API available at <a href=\"/api/stats\" style=\"color:#7c6af7\">/api/stats</a></p>\n </body></html>\n `);\n });\n }\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Task Scheduler (node-cron)\n// ─────────────────────────────────────────────\n\nimport cron, { type ScheduledTask as CronTask } from 'node-cron';\nimport type { ScheduledTask } from '../types.js';\nimport type { MemoryStore } from '../memory/store.js';\n\ntype TaskRunner = (task: ScheduledTask) => Promise<void>;\n\nexport class TaskScheduler {\n private cronJobs: Map<string, CronTask> = new Map();\n private store: MemoryStore;\n private runner: TaskRunner;\n\n constructor(store: MemoryStore, runner: TaskRunner) {\n this.store = store;\n this.runner = runner;\n }\n\n start(): void {\n const tasks = this.store.listScheduledTasks();\n for (const task of tasks) {\n if (task.enabled) this.schedule(task);\n }\n }\n\n stop(): void {\n for (const job of this.cronJobs.values()) job.stop();\n this.cronJobs.clear();\n }\n\n schedule(task: ScheduledTask): void {\n if (!cron.validate(task.cronExpression)) {\n throw new Error(`Invalid cron expression: ${task.cronExpression}`);\n }\n\n // If the same task id is rescheduled, stop the previous cron job first so\n // it doesn't leak into the node-cron internals (node-cron keeps all\n // scheduled jobs alive via a timer until explicitly stopped).\n const existing = this.cronJobs.get(task.id);\n if (existing) {\n try { existing.stop(); } catch { /* ignore */ }\n }\n\n const job = cron.schedule(task.cronExpression, async () => {\n try {\n task.lastRun = new Date().toISOString();\n this.store.saveScheduledTask(task);\n await this.runner(task);\n } catch (err) {\n // Do NOT let cron-thrown rejections bubble into Node's\n // unhandledRejection handler — that crashes long-running daemons.\n console.error(`[scheduler] Task \"${task.id}\" (${task.cronExpression}) failed:`, err);\n }\n }, { timezone: 'UTC' });\n\n this.cronJobs.set(task.id, job);\n }\n\n unschedule(taskId: string): void {\n this.cronJobs.get(taskId)?.stop();\n this.cronJobs.delete(taskId);\n }\n\n add(task: ScheduledTask): void {\n this.store.saveScheduledTask(task);\n if (task.enabled) this.schedule(task);\n }\n\n remove(taskId: string): void {\n this.unschedule(taskId);\n this.store.deleteScheduledTask(taskId);\n }\n\n list(): ScheduledTask[] {\n return this.store.listScheduledTasks();\n }\n\n isRunning(taskId: string): boolean {\n return this.cronJobs.has(taskId);\n }\n\n static validateCron(expression: string): boolean {\n return cron.validate(expression);\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Hooks System\n// ─────────────────────────────────────────────\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { HookDefinition, HooksConfig } from '../types.js';\n\nconst execFileAsync = promisify(execFile);\n\nconst SAFE_ENV_NAME = /^[A-Z][A-Z0-9_]*$/;\n\nfunction sanitizeEnvValue(v: unknown): string {\n const raw = typeof v === 'string' ? v : JSON.stringify(v);\n // Strip control chars and cap length so a malicious hook cannot inject NUL\n // or ANSI escape sequences that change how a downstream script parses its\n // environment.\n return raw.replace(/[\\x00-\\x1f\\x7f]/g, ' ').slice(0, 8192);\n}\n\nexport class HooksRunner {\n private config: HooksConfig;\n\n constructor(config: HooksConfig) {\n this.config = config;\n }\n\n async runPreToolUse(toolName: string, input: Record<string, unknown>): Promise<HookResult> {\n return this.runHooks(this.config.preToolUse ?? [], toolName, { tool: toolName, input });\n }\n\n async runPostToolUse(toolName: string, output: string): Promise<HookResult> {\n return this.runHooks(this.config.postToolUse ?? [], toolName, { tool: toolName, output });\n }\n\n async runPreTask(prompt: string): Promise<HookResult> {\n return this.runHooks(this.config.preTask ?? [], '*', { prompt });\n }\n\n async runPostTask(output: string, durationMs: number): Promise<HookResult> {\n return this.runHooks(this.config.postTask ?? [], '*', { output, durationMs });\n }\n\n private async runHooks(\n hooks: HookDefinition[],\n toolName: string,\n env: Record<string, unknown>,\n ): Promise<HookResult> {\n const applicable = hooks.filter(\n (h) => !h.tools?.length || h.tools.includes(toolName) || h.tools.includes('*'),\n );\n\n const results: string[] = [];\n for (const hook of applicable) {\n try {\n const envVars: Record<string, string> = {};\n for (const [k, v] of Object.entries(env)) {\n const name = `CASCADE_${k.toUpperCase()}`;\n // Reject environment variable names that contain shell-unsafe chars.\n // This cannot happen with the built-in callers (fixed strings), but\n // guards against future callers that forward user input.\n if (!SAFE_ENV_NAME.test(name)) continue;\n envVars[name] = sanitizeEnvValue(v);\n }\n\n // SECURITY: Previously this used `exec(hook.command, { env })`, which\n // interpolates the command string verbatim. Because `env` carries\n // tool input, any value containing `$(...)`, backticks, or `;` could\n // be executed by the shell that ran the hook. We now hand the command\n // to the platform shell as a literal argument via `execFile` — the\n // shell still interprets the command body (so users can keep writing\n // pipelines), but env values can never graft onto the command line.\n const isWin = process.platform === 'win32';\n const shell = isWin ? 'cmd.exe' : '/bin/sh';\n const shellArgs = isWin ? ['/d', '/s', '/c', hook.command] : ['-c', hook.command];\n\n const { stdout } = await execFileAsync(shell, shellArgs, {\n timeout: hook.timeout ?? 10_000,\n env: { ...process.env, ...envVars },\n windowsHide: true,\n });\n const text = typeof stdout === 'string' ? stdout : Buffer.from(stdout as ArrayBufferLike).toString('utf-8');\n if (text.trim()) results.push(text.trim());\n } catch (err) {\n return {\n success: false,\n output: results.join('\\n'),\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n return { success: true, output: results.join('\\n') };\n }\n}\n\nexport interface HookResult {\n success: boolean;\n output: string;\n error?: string;\n}\n"]}