cascade-ai 0.2.2 → 0.2.11

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/utils/cost.ts","../src/core/router/index.ts","../src/core/tiers/base.ts","../src/core/context/manager.ts","../src/audit/log.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/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/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","GoogleGenAI","HarmCategory","HarmBlockThreshold","axios","EventEmitter","randomUUID","path","fs","promisify","exec","simpleGit","PDFDocument","ignoreFactory","StdioClientTransport","Client","z","createContext","runInContext","stats","durationMs","crypto","ignore","_ignoreModule","Database","os","jwt","SocketServer","parser","__dirname","fileURLToPath","express","createServer","bcrypt","rateLimit","timingSafeEqual","cron","execFile"],"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.2.2';\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} 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 for await (const event of stream) {\n if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {\n const text = event.delta.text;\n fullContent += text;\n onChunk({ text, finishReason: null });\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 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 return messages\n .filter((m) => m.role !== 'system')\n .map((m) => {\n if (typeof m.content === 'string') {\n return { role: m.role as 'user' | 'assistant', content: m.content };\n }\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: {\n type: 'base64' as const,\n media_type: img.mimeType,\n data: img.data,\n },\n };\n }\n return {\n type: 'image' as const,\n source: { type: 'url' as const, url: img.data } as any,\n };\n }\n return { type: 'text' as const, text: '' };\n });\n return { role: m.role as 'user' | 'assistant', content };\n });\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\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (delta?.content) {\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 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 OpenAI 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 baseUrl = config.baseUrl\n ?? AZURE_BASE_URL_TEMPLATE.replace('{resource}', 'YOUR_RESOURCE');\n super(\n {\n ...config,\n baseUrl: `${baseUrl}/openai/deployments/${config.deploymentName ?? model.id}`,\n },\n model,\n );\n\n // Override client with Azure-specific configuration\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: `${baseUrl}/openai/deployments/${config.deploymentName ?? model.id}`,\n defaultQuery: { 'api-version': config.apiVersion ?? '2024-08-01-preview' },\n defaultHeaders: { 'api-key': config.apiKey ?? '' },\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 toolCalls.push({\n id: `gemini-tool-${Date.now()}-${toolCalls.length}`,\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 return messages\n .filter((m) => m.role === 'user' || m.role === 'assistant')\n .map((m) => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts:\n typeof m.content === 'string'\n ? [{ text: m.content }]\n : this.convertMessageContent(m, extraImages),\n }));\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} from '../types.js';\nimport { OLLAMA_BASE_URL } from '../constants.js';\nimport { BaseProvider } from './base.js';\n\ninterface OllamaMessage { role: string; content: string; images?: string[] }\ninterface OllamaChatChunk { message?: { content: string }; done: boolean; prompt_eval_count?: number; eval_count?: number }\ninterface OllamaModelEntry { name: string; details?: { parameter_size?: string } }\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 const response = await axios.post<any>(\n `${this.baseUrl}/api/chat`,\n {\n model: this.model.id,\n messages,\n stream: true,\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\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.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.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 onChunk({ text: '', finishReason: 'stop' });\n\n return {\n content: fullContent,\n usage: this.makeUsage(inputTokens, outputTokens),\n finishReason: 'stop',\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 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): OllamaMessage[] {\n const result: OllamaMessage[] = [];\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 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 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 — 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 — 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 { MODELS, OLLAMA_BASE_URL } from '../../constants.js';\nimport { calculateCost } from '../../utils/cost.js';\nimport { withTimeout } from '../../utils/retry.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\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 // 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) {\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 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 try {\n let result: GenerateResult;\n 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 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 return this.generate(tier, options, onChunk, requireVision);\n }\n }\n throw err;\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';\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\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): 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 };\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 });\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// 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 — 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';\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 \"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): Promise<T3Result> {\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');\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Subtask complete', status: 'IN_PROGRESS' });\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 this.setStatus('FAILED');\n this.peerBus?.publish(this.id, assignment.subtaskId, errMsg, 'FAILED');\n return this.buildResult('ESCALATED', output || errMsg, { 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 while (iterations < MAX_ITERATIONS) {\n iterations++;\n\n const options: GenerateOptions = {\n messages: this.context.getMessages(),\n systemPrompt: this.systemPromptOverride + systemPrompt + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : ''),\n tools: 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 await this.context.addMessage({ role: 'assistant', content: result.content, toolCalls: result.toolCalls });\n\n if (!result.toolCalls?.length) {\n if (requiresArtifact) {\n stalledArtifactIterations += 1;\n if (stalledArtifactIterations >= 2) {\n // Attempt to create a runtime tool if ToolCreator is available\n if (this.toolCreator && stalledArtifactIterations === 2) {\n const toolName = await this.toolCreator.createTool(\n `Help complete: ${this.assignment?.subtaskTitle ?? 'unknown task'}`,\n this.assignment?.description ?? '',\n );\n if (toolName) {\n // Refresh tool definitions with newly created tool\n tools = this.toolRegistry.getToolDefinitions();\n this.sendStatusUpdate({\n progressPct: 50,\n currentAction: `Dynamic tool created: ${toolName}`,\n status: 'IN_PROGRESS',\n });\n this.emit('tool:created', { tierId: this.id, toolName });\n continue;\n }\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. 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 (result.finishReason === 'stop' && !requiresArtifact) {\n return { output: result.content, toolCalls: allToolCalls };\n }\n\n for (const tc of result.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 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 this.emit('tool:result', { tierId: this.id, toolName: tc.name, result });\n return typeof result === 'string' ? result : JSON.stringify(result);\n } catch (err) {\n return `Tool error: ${err instanceof Error ? err.message : String(err)}`;\n }\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\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 }\n } else if (stat.size < 100) {\n issues.push(`PDF artifact looks too small to be valid: ${artifactPath}`);\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, 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\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 * Wait for a specific subtask's output — resolves immediately if already available\n */\n waitFor(subtaskId: string, timeoutMs = 120_000): Promise<PeerOutput> {\n const existing = this.outputs.get(subtaskId);\n if (existing) 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 msg: PeerMessage = {\n fromId,\n toId: '*',\n type: 'SYNC_DATA',\n subtaskId: '',\n syncType: 'SHARE_OUTPUT',\n payload,\n timestamp: new Date().toISOString(),\n };\n this.broadcastLog.push({ fromId, payload, timestamp: msg.timestamp });\n this.emit('broadcast', msg);\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 * 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 msg: PeerMessage = {\n fromId,\n toId,\n type: 'SYNC_DATA',\n subtaskId,\n syncType,\n payload,\n timestamp: new Date().toISOString(),\n };\n this.emit(`message:${toId}`, msg);\n this.emit('message', msg);\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 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\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\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): Promise<T2Result> {\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 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 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 this.setStatus(overallStatus === 'COMPLETED' ? 'COMPLETED' : 'FAILED');\n\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Section complete', status: 'IN_PROGRESS' });\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');\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 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: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 let remaining = new Set(sanitizedAssignments.map((a) => a.subtaskId));\n let wave = 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 // 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);\n resultMap.set(id, result);\n return result;\n }),\n );\n\n // Reduce in-degrees for dependents of completed tasks\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 const retried = await this.retryT3(assignment, taskId);\n resultMap.set(id, retried);\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 );\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 outputs = completed.map((r, i) => `[T3-${i + 1}]: ${r.output}`).join('\\n\\n');\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 prompt = `Summarize these T3 worker outputs for section \"${assignment.sectionTitle}\" in 2-3 sentences:\\n\\n${outputs}\n${peerOutputs ? `\\n\\nContext from sibling T2 completed sections (use this to ensure your summary aligns with the overall state):\\n${peerOutputs}` : ''}`;\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: 300\n });\n return result.content;\n } catch (err) {\n this.log(`aggregateResults: LLM summarization failed — returning raw T3 outputs. Error: ${err instanceof Error ? err.message : String(err)}`);\n return outputs;\n }\n }\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 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\nEXECUTION MODE GUIDANCE:\n- Use \"parallel\" for sections that are independent (e.g. writing different files, researching different topics).\n- Use \"sequential\" ONLY when a later section strictly depends on the output of an earlier one (e.g. write code → then test it).\n- Prefer 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\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 async execute(\n userPrompt: string,\n images?: ImageAttachment[],\n systemContext?: string,\n ): Promise<{\n output: string;\n t2Results: T2Result[];\n taskId: string;\n complexity: TaskComplexity;\n }> {\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 // 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 // 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 // Step 3: Dispatch T2 managers in parallel\n const t2Results = await this.dispatchT2Managers(plan.sections);\n\n this.sendStatusUpdate({\n progressPct: 95,\n currentAction: 'Compiling final output',\n status: 'IN_PROGRESS',\n });\n\n // Step 4: Compile final output\n const output = await this.compileFinalOutput(userPrompt, plan, t2Results);\n\n this.setStatus('COMPLETED');\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Task complete', status: 'IN_PROGRESS' });\n\n return { output, t2Results, taskId: this.taskId, complexity: plan.complexity };\n }\n\n getEscalations(): EscalationPayload[] {\n return [...this.escalations];\n }\n\n // ── Private ──────────────────────────────────\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 subtasks can declare dependencies:\n{\n \"sections\": [{\n \"t3Subtasks\": [{\n \"subtaskId\": \"t1\",\n \"subtaskTitle\": \"Generate Source Code\",\n \"dependsOn\": [], // ← empty = runs immediately\n \"executionMode\": \"parallel\"\n }, {\n \"subtaskId\": \"t2\", \n \"subtaskTitle\": \"Save Code to File\",\n \"dependsOn\": [\"t1\"], // ← waits for t1 to complete first\n \"executionMode\": \"parallel\"\n }, {\n \"subtaskId\": \"t3\",\n \"subtaskTitle\": \"Execute and Verify\",\n \"dependsOn\": [\"t2\"], // ← waits for t2\n \"executionMode\": \"parallel\"\n }]\n }]\n}\nUse dependsOn when a subtask needs the output of a previous one.\nLeave dependsOn empty for subtasks 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.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: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, switch to sequential execution for safety\n if (overlapSections.size > 0 && !sections.some(s => s.executionMode === 'sequential')) {\n this.log('Overlap detected — switching to sequential execution for conflicting sections');\n for (const section of sections) {\n if (overlapSections.has(section.sectionId)) {\n section.executionMode = 'sequential';\n }\n }\n }\n\n const pct = (i: number) => 10 + Math.floor((i / sections.length) * 85);\n const isSequential = sections.some(s => s.executionMode === 'sequential');\n const t2Results: T2Result[] = [];\n\n try {\n if (isSequential) {\n this.log('Dispatching T2 managers sequentially');\n for (let i = 0; i < managers.length; i++) {\n const m = managers[i]!;\n this.sendStatusUpdate({\n progressPct: pct(i),\n currentAction: `T2 working on: ${sections[i]!.sectionTitle} (Sequential)`,\n status: 'IN_PROGRESS',\n });\n try {\n const result = await m.execute(sections[i]!, this.taskId);\n t2Results.push(result);\n // Phase 2: Reactive — share completed section output with siblings\n m.shareCompletedOutput(sections[i]!.sectionId, result.sectionSummary);\n if (result.status === 'ESCALATED') {\n this.escalations.push({\n raisedBy: `T2_${sections[i]!.sectionId}`,\n sectionId: sections[i]!.sectionId,\n attempted: result.issues,\n blocker: result.issues.join('; '),\n needs: 'Human review required',\n });\n }\n } catch (err) {\n t2Results.push({\n sectionId: sections[i]!.sectionId,\n sectionTitle: sections[i]!.sectionTitle,\n status: 'FAILED',\n t3Results: [],\n sectionSummary: '',\n issues: [err instanceof Error ? err.message : String(err)],\n });\n }\n }\n } else {\n const results = await Promise.allSettled(\n managers.map((m, i) => {\n this.sendStatusUpdate({\n progressPct: pct(i),\n currentAction: `T2 working on: ${sections[i]!.sectionTitle}`,\n status: 'IN_PROGRESS',\n });\n return m.execute(sections[i]!, this.taskId);\n }),\n );\n\n for (let i = 0; i < results.length; i++) {\n const r = results[i]!;\n if (r.status === 'fulfilled') {\n t2Results.push(r.value);\n // Phase 2: Reactive — share completed section output with siblings\n managers[i]!.shareCompletedOutput(sections[i]!.sectionId, r.value.sectionSummary);\n if (r.value.status === 'ESCALATED') {\n this.escalations.push({\n raisedBy: `T2_${sections[i]!.sectionId}`,\n sectionId: sections[i]!.sectionId,\n attempted: r.value.issues,\n blocker: r.value.issues.join('; '),\n needs: 'Human review required',\n });\n }\n } else {\n t2Results.push({\n sectionId: sections[i]!.sectionId,\n sectionTitle: sections[i]!.sectionTitle,\n status: 'FAILED',\n t3Results: [],\n sectionSummary: '',\n issues: [r.reason instanceof Error ? r.reason.message : String(r.reason)],\n });\n }\n }\n }\n } finally {\n cleanup();\n }\n\n return t2Results;\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';\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 === '.') return abs;\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n throw new WorkspaceSandboxError(input, root);\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 token = (input['token'] as string | undefined) ?? process.env['GITHUB_TOKEN'] ?? process.env['GITLAB_TOKEN'] ?? '';\n const operation = input['operation'] as string;\n const repo = input['repo'] as string;\n\n if (platform === 'github') {\n return this.executeGitHub(operation, repo, token, input);\n }\n return this.executeGitLab(operation, repo, token, input);\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\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'],\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: unknown = null;\n private page: unknown = 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 throw new Error('Playwright is not installed. Run: npm install playwright && npx playwright install chromium');\n }\n\n if (!this.browser) {\n const pw = playwright as typeof import('playwright');\n this.browser = await pw.chromium.launch({ headless: true });\n const b = this.browser as import('playwright').Browser;\n this.page = await b.newPage();\n }\n\n const page = this.page as import('playwright').Page;\n const action = input['action'] as string;\n const timeout = (input['timeout'] as number | undefined) ?? 10_000;\n\n switch (action) {\n case 'navigate': {\n await page.goto(input['url'] as string, { timeout });\n return `Navigated to ${input['url']}`;\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 throw new Error(`Unknown browser action: ${action}`);\n }\n }\n\n async close(): Promise<void> {\n if (this.browser) {\n await (this.browser as import('playwright').Browser).close();\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 } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport type { ToolExecuteOptions } from '../types.js';\nimport { BaseTool } from './base.js';\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 // 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\n const cmdPrefix = language === 'python' ? 'python3' : 'node';\n const fullCmd = `${cmdPrefix} \"${filePath}\" ${args.map(a => `\"${a}\"`).join(' ')}`;\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 resolve(`Execution failed (${duration}ms):\\nError: ${error.message}\\nStderr: ${stderr}\\nStdout: ${stdout}`);\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 — 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 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 { 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 {\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 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 }\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 ];\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 clients: Map<string, Client> = 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\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 await client.close();\n this.clients.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 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 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});\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(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// Uses a hybrid approach:\n// 1. Heuristic pass (instant) — keyword/pattern scoring\n// 2. AI inference fallback (when heuristic confidence < 0.7)\n//\n\nimport type { TierRole } from '../../types.js';\nimport type { ModelInfo } from '../../types.js';\nimport type { ModelSelector } from './selector.js';\nimport type { CascadeRouter } from './index.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\nfunction selectModelFromProfile(\n profile: TaskProfile,\n tier: TierRole,\n selector: ModelSelector,\n): ModelInfo | null {\n // Vision tasks always need a vision model regardless of tier\n if (profile.requiresVision) {\n return selector.selectVisionModel();\n }\n\n // Cascade Auto model mapping:\n // T1: orchestrator — always benefits from the most capable model\n if (tier === 'T1') {\n if (profile.complexity >= 4) {\n // High complexity → most capable (opus-class)\n return selector.selectForTier('T1');\n } else {\n // Lower complexity → mid-tier for T1 to save cost\n return selector.selectForTier('T2');\n }\n }\n\n // T2: section manager\n if (tier === 'T2') {\n if (profile.type === 'code' || profile.type === 'data') {\n // Structured tasks need reliable instruction-following\n return selector.selectForTier('T2');\n } else if (profile.complexity <= 2) {\n // Simple sections can use the fast tier\n return selector.selectForTier('T3');\n }\n return selector.selectForTier('T2');\n }\n\n // T3: worker — optimize for task type\n if (tier === 'T3') {\n if (profile.complexity >= 4 || profile.requiresReasoning) {\n // Complex subtasks need a capable model\n return selector.selectForTier('T2');\n } else if (profile.type === 'creative') {\n // Creative tasks benefit from a balanced model\n return selector.selectForTier('T2');\n } else {\n // Most T3 tasks → fast model to minimize latency\n return selector.selectForTier('T3');\n }\n }\n\n return selector.selectForTier(tier);\n}\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\nexport class TaskAnalyzer {\n private router?: CascadeRouter;\n\n constructor(router?: CascadeRouter) {\n this.router = router;\n }\n\n /**\n * Analyze a prompt and return a TaskProfile.\n * Uses heuristics first; falls back to AI inference if confidence is low.\n */\n async analyze(prompt: string): Promise<TaskProfile> {\n // Cache hit\n const cacheKey = prompt.slice(0, 200);\n const cached = analysisCache.get(cacheKey);\n if (cached) return cached;\n\n // Phase 1: Heuristic pass (instant)\n const heuristic = heuristicAnalyze(prompt);\n\n // Phase 2: AI inference fallback when heuristics are uncertain\n if (heuristic.confidence < 0.7 && this.router) {\n try {\n const aiProfile = await this.aiInference(prompt);\n const merged: TaskProfile = {\n type: aiProfile.type,\n complexity: aiProfile.complexity,\n requiresReasoning: aiProfile.requiresReasoning,\n requiresVision: heuristic.requiresVision || aiProfile.requiresVision,\n estimatedTokens: heuristic.estimatedTokens,\n confidence: 0.9, // AI-backed\n };\n analysisCache.set(cacheKey, merged);\n return merged;\n } catch {\n // AI inference failed — use heuristic result\n }\n }\n\n analysisCache.set(cacheKey, heuristic);\n return heuristic;\n }\n\n /**\n * Select the optimal model for a given tier based on task analysis.\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 return selectModelFromProfile(profile, tier, selector);\n }\n\n private async aiInference(prompt: string): Promise<TaskProfile> {\n if (!this.router) throw new Error('No router for AI inference');\n\n const inferencePrompt = `Analyze this task and return ONLY a JSON object — no other text.\n\nTask: \"${prompt.slice(0, 300)}\"\n\nReturn: { \"type\": \"code\"|\"analysis\"|\"creative\"|\"data\"|\"mixed\", \"complexity\": 1-5, \"requiresReasoning\": true|false, \"requiresVision\": true|false }\n\nWhere complexity: 1=trivial, 2=simple, 3=moderate, 4=complex, 5=research-grade.`;\n\n const result = await this.router.generate('T3', {\n messages: [{ role: 'user', content: inferencePrompt }],\n maxTokens: 80,\n });\n\n const jsonMatch = /\\{[\\s\\S]*?\\}/.exec(result.content);\n if (!jsonMatch) throw new Error('No JSON in AI inference response');\n const parsed = JSON.parse(jsonMatch[0]) as {\n type: TaskType;\n complexity: number;\n requiresReasoning: boolean;\n requiresVision: boolean;\n };\n\n const validTypes: TaskType[] = ['code', 'analysis', 'creative', 'data', 'mixed'];\n const type = validTypes.includes(parsed.type) ? parsed.type : 'mixed';\n const complexity = Math.max(1, Math.min(5, Math.round(parsed.complexity))) as 1 | 2 | 3 | 4 | 5;\n\n return {\n type,\n complexity,\n requiresReasoning: Boolean(parsed.requiresReasoning),\n requiresVision: Boolean(parsed.requiresVision),\n estimatedTokens: 0,\n confidence: 0.9,\n };\n }\n\n /** Clear the analysis cache (call between sessions). */\n static clearCache(): void {\n analysisCache.clear();\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 (off by default)\n// - Generated code runs in node:vm with a restricted sandbox context\n// - HTTP (fetch) calls are allowed but gated by the approval workflow\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';\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` and `fetch`, 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\n constructor(spec: GeneratedToolSpec) {\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 }\n\n isDangerous(): boolean {\n return this._isDangerous;\n }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n // Sandbox: expose only fetch and basic globals — no require, no fs, no process\n const sandbox: Record<string, unknown> = {\n input,\n fetch: globalThis.fetch,\n JSON,\n Math,\n Date,\n console: { log: () => {}, error: () => {} }, // Silenced\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 function body that:\n - Receives: input (object), fetch (if HTTP needed)\n - Returns: a string result\n - Uses no require(), no fs, no process — only fetch, JSON, Math, Date, String, Number, Array, Object\n - Must complete in under 15 seconds\n- isDangerous should be true only if the tool makes write operations or external HTTP calls\n- name must be snake_case, start with \"dynamic_\", max 40 chars\n- description must be ≤ 120 chars\n\nExample executeCode for an HTTP tool:\n\"const res = await fetch(input.url); const text = await res.text(); return text.slice(0, 2000);\"\n\nReturn ONLY valid JSON — no other text.`;\n\nexport class ToolCreator {\n private router: CascadeRouter;\n private registry: ToolRegistry;\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 /**\n * Generate a new tool from a description and register it with the ToolRegistry.\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: 600,\n });\n\n const jsonMatch = /\\{[\\s\\S]*\\}/.exec(result.content);\n if (!jsonMatch) {\n return null;\n }\n\n const spec = JSON.parse(jsonMatch[0]) as GeneratedToolSpec;\n\n // Validate required fields\n if (!spec.name || !spec.description || !spec.executeCode || !spec.inputSchema) {\n return null;\n }\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 // Validate the generated code compiles (non-executing check)\n try {\n createContext({ input: {}, fetch: globalThis.fetch });\n // Syntax check only — don't execute\n new Function('input', 'fetch', spec.executeCode);\n } catch (err) {\n return null;\n }\n\n const tool = new DynamicTool(spec);\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 /**\n * Returns the names of all tools created in this session.\n */\n getCreatedTools(): string[] {\n return Array.from(this.createdTools);\n }\n}\n","import EventEmitter from 'node:events';\nimport { randomUUID } from 'node:crypto';\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 { ToolCreator } from '../tools/tool-creator.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 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 const cfg = this.config as unknown as Record<string, unknown>;\n if (cfg['cascadeAuto'] === true) {\n this.taskAnalyzer = new TaskAnalyzer(this.router);\n }\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 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 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 async determineComplexity(\n prompt: string,\n conversationHistory: ConversationMessage[] = [],\n ): Promise<TaskComplexity> {\n if (this.looksLikeSimpleArtifactTask(prompt)) {\n return 'Simple';\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\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.conversationHistory);\n\n this.telemetry.capture('cascade:session_start', {\n complexity,\n providerCount: this.config.providers.length,\n cascadeAutoEnabled: (this.config as unknown as Record<string, unknown>)['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\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 // 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);\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 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);\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 bindTierEvents(t1);\n t1.on('plan', (e) => this.emit('plan', e));\n \n const result = await t1.execute(options.prompt, options.images);\n finalOutput = result.output;\n t2Results = result.t2Results;\n }\n } catch (err) {\n runError = err;\n throw err;\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 // 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);\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\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 // ── 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.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 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.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)\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 `).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 );\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 }));\n }\n\n addRuntimeNodeLog(log: RuntimeNodeLog): void {\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)\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 );\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 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 }));\n }\n\n // ── Messages ──────────────────────────────────\n\n addMessage(message: StoredMessage): void {\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 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.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 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.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 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 // ── 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 );\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 );\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\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;\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;\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 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 if (!existing) this.config.providers.push({ type, apiKey: key });\n else if (!existing.apiKey) existing.apiKey = key;\n }\n\n if (!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 tenantId?: string; // For multi-tenant mode\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 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 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 socket.on('join:tenant', (tenantId: string) => {\n socket.join(`tenant:${tenantId}`);\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 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(process.env['HOME'] ?? process.cwd(), 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(process.env['HOME'] ?? process.cwd(), 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. Applied only to\n // the login route so a bad password cannot be rapidly guessed.\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 // ── 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, (req: Request, res: Response) => {\n const { sessionId, nodeId } = req.body as { sessionId?: string; nodeId?: string };\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, (req: Request, res: Response) => {\n const { nodeId, sessionId } = req.body as { nodeId?: string; sessionId?: string };\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, (req: Request, res: Response) => {\n const { message, sessionId, nodeId } = req.body as { message?: string; sessionId?: string; nodeId?: string };\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(process.env['HOME'] ?? process.cwd(), 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(process.env['HOME'] ?? process.cwd(), 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(process.env['HOME'] ?? process.cwd(), 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 { tierLimits?: TierLimits; budget?: BudgetConfig };\n if (body.tierLimits) this.config.tierLimits = { ...this.config.tierLimits, ...body.tierLimits };\n if (body.budget) this.config.budget = { ...this.config.budget, ...body.budget };\n // Persist to .cascade/config.json\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 fs.writeFileSync(configPath, JSON.stringify(updated, null, 2), 'utf-8');\n res.json({ ok: true });\n } catch (err) {\n res.status(500).json({ error: `Failed to save config: ${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(process.env['HOME'] ?? process.cwd(), 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, (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 }) => {\n this.socket.broadcast('stream:token', { sessionId, token: e.text });\n this.socket.broadcastToRoom(`session:${sessionId}`, 'stream:token', { sessionId, token: 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\n try {\n const result = await cascade.run({ prompt: body.prompt!, identityId: body.identityId });\n this.socket.broadcast('cost:update', {\n sessionId,\n tokens: result.usage.totalTokens,\n costUsd: 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: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/utils/cost.ts","../src/core/router/index.ts","../src/utils/retry.ts","../src/core/tiers/base.ts","../src/core/context/manager.ts","../src/audit/log.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/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/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","GoogleGenAI","HarmCategory","HarmBlockThreshold","axios","EventEmitter","randomUUID","path","exec","promisify","execAsync","fs","i","simpleGit","PDFDocument","execSync","ignoreFactory","StdioClientTransport","Client","z","createContext","runInContext","glob","stats","durationMs","crypto","ignore","_ignoreModule","Database","os","jwt","SocketServer","parser","__dirname","fileURLToPath","express","createServer","bcrypt","rateLimit","timingSafeEqual","cron","execFile"],"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.2.11';\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 for await (const event of stream) {\n if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {\n const text = event.delta.text;\n fullContent += text;\n onChunk({ text, finishReason: null });\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 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\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (delta?.content) {\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 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 OpenAI 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 baseUrl = config.baseUrl\n ?? AZURE_BASE_URL_TEMPLATE.replace('{resource}', 'YOUR_RESOURCE');\n super(\n {\n ...config,\n baseUrl: `${baseUrl}/openai/deployments/${config.deploymentName ?? model.id}`,\n },\n model,\n );\n\n // Override client with Azure-specific configuration\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: `${baseUrl}/openai/deployments/${config.deploymentName ?? model.id}`,\n defaultQuery: { 'api-version': config.apiVersion ?? '2024-08-01-preview' },\n defaultHeaders: { 'api-key': config.apiKey ?? '' },\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} from '../types.js';\nimport { OLLAMA_BASE_URL } from '../constants.js';\nimport { BaseProvider } from './base.js';\n\ninterface OllamaMessage { role: string; content: string; images?: string[] }\ninterface OllamaChatChunk { message?: { content: string }; done: boolean; prompt_eval_count?: number; eval_count?: number }\ninterface OllamaModelEntry { name: string; details?: { parameter_size?: string } }\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 const response = await axios.post<any>(\n `${this.baseUrl}/api/chat`,\n {\n model: this.model.id,\n messages,\n stream: true,\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\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.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.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 onChunk({ text: '', finishReason: 'stop' });\n\n return {\n content: fullContent,\n usage: this.makeUsage(inputTokens, outputTokens),\n finishReason: 'stop',\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 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): OllamaMessage[] {\n const result: OllamaMessage[] = [];\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 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 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 — 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 — 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 { MODELS, OLLAMA_BASE_URL } from '../../constants.js';\nimport { calculateCost } from '../../utils/cost.js';\nimport { withTimeout } from '../../utils/retry.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\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 // 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) {\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 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 try {\n let result: GenerateResult;\n 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 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 return this.generate(tier, options, onChunk, requireVision);\n }\n }\n throw err;\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 — 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 — 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): 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 };\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 });\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 — 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';\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');\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Subtask complete', status: 'IN_PROGRESS' });\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 this.setStatus('FAILED');\n this.peerBus?.publish(this.id, assignment.subtaskId, errMsg, 'FAILED');\n return this.buildResult('ESCALATED', output || errMsg, { 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 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 + (this.hierarchyContext ? `\\n\\nHIERARCHY CONTEXT: ${this.hierarchyContext}` : ''),\n tools: 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 await this.context.addMessage({ role: 'assistant', content: result.content, toolCalls: result.toolCalls });\n\n if (!result.toolCalls?.length) {\n if (requiresArtifact) {\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. 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 (result.finishReason === 'stop' && !requiresArtifact) {\n return { output: result.content, toolCalls: allToolCalls };\n }\n\n for (const tc of result.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 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 this.emit('tool:result', { tierId: this.id, toolName: tc.name, result });\n return typeof result === 'string' ? result : JSON.stringify(result);\n } catch (err) {\n return `Tool error: ${err instanceof Error ? err.message : String(err)}`;\n }\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, 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\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 * Wait for a specific subtask's output — resolves immediately if already available\n */\n waitFor(subtaskId: string, timeoutMs = 120_000): Promise<PeerOutput> {\n const existing = this.outputs.get(subtaskId);\n if (existing) 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 msg: PeerMessage = {\n fromId,\n toId: '*',\n type: 'SYNC_DATA',\n subtaskId: '',\n syncType: 'SHARE_OUTPUT',\n payload,\n timestamp: new Date().toISOString(),\n };\n this.broadcastLog.push({ fromId, payload, timestamp: msg.timestamp });\n this.emit('broadcast', msg);\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 * 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 msg: PeerMessage = {\n fromId,\n toId,\n type: 'SYNC_DATA',\n subtaskId,\n syncType,\n payload,\n timestamp: new Date().toISOString(),\n };\n this.emit(`message:${toId}`, msg);\n this.emit('message', msg);\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 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\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\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 this.setStatus(overallStatus === 'COMPLETED' ? 'COMPLETED' : 'FAILED');\n\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Section complete', status: 'IN_PROGRESS' });\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');\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 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: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 let remaining = new Set(sanitizedAssignments.map((a) => a.subtaskId));\n let wave = 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 // 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, this.signal);\n resultMap.set(id, result);\n return result;\n }),\n );\n\n // Reduce in-degrees for dependents of completed tasks\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 const retried = await this.retryT3(assignment, taskId);\n resultMap.set(id, retried);\n } else if (r.status === 'fulfilled' && r.value.status === 'ESCALATED' && r.value.issues.some(i => i.includes('dynamic tool generation'))) {\n // Tool Creation Redesign: T2 spawns builder -> verifies -> original T3 uses it\n const assignment = sanitizedAssignments.find((a) => a.subtaskId === id)!;\n if (this.toolCreator) {\n this.log(`T3 escalated for tool. T2 spawning Tool-Builder T3 for: ${assignment.subtaskTitle}`);\n this.sendStatusUpdate({\n progressPct: 50,\n currentAction: `Spawning Tool-Builder T3 for: ${assignment.subtaskTitle}`,\n status: 'IN_PROGRESS',\n });\n const toolName = await this.toolCreator.createTool(\n `Help complete: ${assignment.subtaskTitle}`,\n assignment.description,\n );\n if (toolName) {\n this.log(`T2 verifying new tool: ${toolName}`);\n this.sendStatusUpdate({\n progressPct: 60,\n currentAction: `T2 Verifying new tool: ${toolName}`,\n status: 'IN_PROGRESS',\n });\n // Verification step via T2 model\n try {\n const verifyResult = await this.router.generate('T2', {\n messages: [{ role: 'user', content: `A new tool named \"${toolName}\" was just created dynamically to help with: ${assignment.description}. Based on its name and purpose, does this seem like a valid addition? Reply \"VERIFIED\" or \"REJECTED\".` }],\n systemPrompt: this.systemPromptOverride + 'You are T2 Manager verifying a dynamic tool.',\n maxTokens: 50,\n });\n if (!verifyResult.content.toUpperCase().includes('REJECTED')) {\n this.log(`T2 verification passed for ${toolName}. Restarting original T3.`);\n const retried = await this.retryT3({\n ...assignment,\n description: `${assignment.description}\\n\\n[SYSTEM NOTIFICATION]: A new dynamic tool \"${toolName}\" has been built and verified for you. Use it to complete your task.`\n }, taskId);\n resultMap.set(id, retried);\n } else {\n this.log(`T2 rejected the dynamic tool: ${toolName}`);\n resultMap.set(id, r.value);\n }\n } catch {\n // If verification generation fails, gracefully accept the tool\n const retried = await this.retryT3({\n ...assignment,\n description: `${assignment.description}\\n\\n[SYSTEM NOTIFICATION]: A new dynamic tool \"${toolName}\" has been built for you. Use it to complete your task.`\n }, taskId);\n resultMap.set(id, retried);\n }\n } else {\n resultMap.set(id, r.value);\n }\n } else {\n resultMap.set(id, r.value);\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 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\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 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');\n this.sendStatusUpdate({ progressPct: 100, currentAction: 'Task complete', status: 'IN_PROGRESS' });\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.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: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';\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 === '.') return abs;\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n throw new WorkspaceSandboxError(input, root);\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 — 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 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 { 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 {\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 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 }\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 ];\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(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// Uses a hybrid approach:\n// 1. Heuristic pass (instant) — keyword/pattern scoring\n// 2. AI inference fallback (when heuristic confidence < 0.7)\n//\n\nimport type { TierRole } from '../../types.js';\nimport type { ModelInfo } from '../../types.js';\nimport type { ModelSelector } from './selector.js';\nimport type { CascadeRouter } from './index.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\nfunction selectModelFromProfile(\n profile: TaskProfile,\n tier: TierRole,\n selector: ModelSelector,\n): ModelInfo | null {\n // Vision tasks always need a vision model regardless of tier\n if (profile.requiresVision) {\n return selector.selectVisionModel();\n }\n\n // Cascade Auto model mapping:\n // T1: orchestrator — always benefits from the most capable model\n if (tier === 'T1') {\n if (profile.complexity >= 4) {\n // High complexity → most capable (opus-class)\n return selector.selectForTier('T1');\n } else {\n // Lower complexity → mid-tier for T1 to save cost\n return selector.selectForTier('T2');\n }\n }\n\n // T2: section manager\n if (tier === 'T2') {\n if (profile.type === 'code' || profile.type === 'data') {\n // Structured tasks need reliable instruction-following\n return selector.selectForTier('T2');\n } else if (profile.complexity <= 2) {\n // Simple sections can use the fast tier\n return selector.selectForTier('T3');\n }\n return selector.selectForTier('T2');\n }\n\n // T3: worker — optimize for task type\n if (tier === 'T3') {\n if (profile.complexity >= 4 || profile.requiresReasoning) {\n // Complex subtasks need a capable model\n return selector.selectForTier('T2');\n } else if (profile.type === 'creative') {\n // Creative tasks benefit from a balanced model\n return selector.selectForTier('T2');\n } else {\n // Most T3 tasks → fast model to minimize latency\n return selector.selectForTier('T3');\n }\n }\n\n return selector.selectForTier(tier);\n}\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\nexport class TaskAnalyzer {\n private router?: CascadeRouter;\n\n constructor(router?: CascadeRouter) {\n this.router = router;\n }\n\n /**\n * Analyze a prompt and return a TaskProfile.\n * Uses heuristics first; falls back to AI inference if confidence is low.\n */\n async analyze(prompt: string): Promise<TaskProfile> {\n // Cache hit\n const cacheKey = prompt.slice(0, 200);\n const cached = analysisCache.get(cacheKey);\n if (cached) return cached;\n\n // Phase 1: Heuristic pass (instant)\n const heuristic = heuristicAnalyze(prompt);\n\n // Phase 2: AI inference fallback when heuristics are uncertain\n if (heuristic.confidence < 0.7 && this.router) {\n try {\n const aiProfile = await this.aiInference(prompt);\n const merged: TaskProfile = {\n type: aiProfile.type,\n complexity: aiProfile.complexity,\n requiresReasoning: aiProfile.requiresReasoning,\n requiresVision: heuristic.requiresVision || aiProfile.requiresVision,\n estimatedTokens: heuristic.estimatedTokens,\n confidence: 0.9, // AI-backed\n };\n analysisCache.set(cacheKey, merged);\n return merged;\n } catch {\n // AI inference failed — use heuristic result\n }\n }\n\n analysisCache.set(cacheKey, heuristic);\n return heuristic;\n }\n\n /**\n * Select the optimal model for a given tier based on task analysis.\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 return selectModelFromProfile(profile, tier, selector);\n }\n\n private async aiInference(prompt: string): Promise<TaskProfile> {\n if (!this.router) throw new Error('No router for AI inference');\n\n const inferencePrompt = `Analyze this task and return ONLY a JSON object — no other text.\n\nTask: \"${prompt.slice(0, 300)}\"\n\nReturn: { \"type\": \"code\"|\"analysis\"|\"creative\"|\"data\"|\"mixed\", \"complexity\": 1-5, \"requiresReasoning\": true|false, \"requiresVision\": true|false }\n\nWhere complexity: 1=trivial, 2=simple, 3=moderate, 4=complex, 5=research-grade.`;\n\n const result = await this.router.generate('T3', {\n messages: [{ role: 'user', content: inferencePrompt }],\n maxTokens: 80,\n });\n\n const jsonMatch = /\\{[\\s\\S]*?\\}/.exec(result.content);\n if (!jsonMatch) throw new Error('No JSON in AI inference response');\n const parsed = JSON.parse(jsonMatch[0]) as {\n type: TaskType;\n complexity: number;\n requiresReasoning: boolean;\n requiresVision: boolean;\n };\n\n const validTypes: TaskType[] = ['code', 'analysis', 'creative', 'data', 'mixed'];\n const type = validTypes.includes(parsed.type) ? parsed.type : 'mixed';\n const complexity = Math.max(1, Math.min(5, Math.round(parsed.complexity))) as 1 | 2 | 3 | 4 | 5;\n\n return {\n type,\n complexity,\n requiresReasoning: Boolean(parsed.requiresReasoning),\n requiresVision: Boolean(parsed.requiresVision),\n estimatedTokens: 0,\n confidence: 0.9,\n };\n }\n\n /** Clear the analysis cache (call between sessions). */\n static clearCache(): void {\n analysisCache.clear();\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 (off by default)\n// - Generated code runs in node:vm with a restricted sandbox context\n// - HTTP (fetch) calls are allowed but gated by the approval workflow\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';\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` and `fetch`, 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\n constructor(spec: GeneratedToolSpec) {\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 }\n\n isDangerous(): boolean {\n return this._isDangerous;\n }\n\n async execute(input: Record<string, unknown>, _options: ToolExecuteOptions): Promise<string> {\n // Sandbox: expose only fetch and basic globals — no require, no fs, no process\n const sandbox: Record<string, unknown> = {\n input,\n fetch: globalThis.fetch,\n JSON,\n Math,\n Date,\n console: { log: () => {}, error: () => {} }, // Silenced\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 function body that:\n - Receives: input (object), fetch (if HTTP needed)\n - Returns: a string result\n - Uses no require(), no fs, no process — only fetch, JSON, Math, Date, String, Number, Array, Object\n - Must complete in under 15 seconds\n- isDangerous should be true only if the tool makes write operations or external HTTP calls\n- name must be snake_case, start with \"dynamic_\", max 40 chars\n- description must be ≤ 120 chars\n\nExample executeCode for an HTTP tool:\n\"const res = await fetch(input.url); const text = await res.text(); return text.slice(0, 2000);\"\n\nReturn ONLY valid JSON — no other text.`;\n\nexport class ToolCreator {\n private router: CascadeRouter;\n private registry: ToolRegistry;\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 /**\n * Generate a new tool from a description and register it with the ToolRegistry.\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: 600,\n });\n\n const jsonMatch = /\\{[\\s\\S]*\\}/.exec(result.content);\n if (!jsonMatch) {\n return null;\n }\n\n const spec = JSON.parse(jsonMatch[0]) as GeneratedToolSpec;\n\n // Validate required fields\n if (!spec.name || !spec.description || !spec.executeCode || !spec.inputSchema) {\n return null;\n }\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 // Validate the generated code compiles (non-executing check)\n try {\n createContext({ input: {}, fetch: globalThis.fetch });\n // Syntax check only — don't execute\n new Function('input', 'fetch', spec.executeCode);\n } catch (err) {\n return null;\n }\n\n const tool = new DynamicTool(spec);\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 /**\n * Returns the names of all tools created in this session.\n */\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 { 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 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 const cfg = this.config as unknown as Record<string, unknown>;\n if (cfg['cascadeAuto'] === true) {\n this.taskAnalyzer = new TaskAnalyzer(this.router);\n }\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 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 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 async determineComplexity(\n prompt: string,\n workspacePath: string,\n conversationHistory: ConversationMessage[] = [],\n ): Promise<TaskComplexity> {\n if (this.looksLikeSimpleArtifactTask(prompt)) {\n return 'Simple';\n }\n\n // Quick workspace scout\n let workspaceContext = '';\n try {\n const files = await glob('**/*.*', {\n cwd: workspacePath,\n ignore: ['node_modules/**', '.git/**', 'dist/**', 'build/**'],\n nodir: true,\n });\n workspaceContext = `Workspace Scout: Found ~${files.length} 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 as unknown as Record<string, unknown>)['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\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 // 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 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 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 // 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)\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 `).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 );\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 }));\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)\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 );\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 }));\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 // ── 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 );\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 );\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\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;\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;\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 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 if (!existing) this.config.providers.push({ type, apiKey: key });\n else if (!existing.apiKey) existing.apiKey = key;\n }\n\n if (!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 tenantId?: string; // For multi-tenant mode\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 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 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 socket.on('join:tenant', (tenantId: string) => {\n socket.join(`tenant:${tenantId}`);\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. Applied only to\n // the login route so a bad password cannot be rapidly guessed.\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 // ── 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, (req: Request, res: Response) => {\n const { sessionId, nodeId } = req.body as { sessionId?: string; nodeId?: string };\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, (req: Request, res: Response) => {\n const { nodeId, sessionId } = req.body as { nodeId?: string; sessionId?: string };\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, (req: Request, res: Response) => {\n const { message, sessionId, nodeId } = req.body as { message?: string; sessionId?: string; nodeId?: string };\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 { tierLimits?: TierLimits; budget?: BudgetConfig };\n if (body.tierLimits) this.config.tierLimits = { ...this.config.tierLimits, ...body.tierLimits };\n if (body.budget) this.config.budget = { ...this.config.budget, ...body.budget };\n // Persist to .cascade/config.json\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 fs.writeFileSync(configPath, JSON.stringify(updated, null, 2), 'utf-8');\n res.json({ ok: true });\n } catch (err) {\n res.status(500).json({ error: `Failed to save config: ${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, (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 }) => {\n this.socket.broadcast('stream:token', { sessionId, token: e.text });\n this.socket.broadcastToRoom(`session:${sessionId}`, 'stream:token', { sessionId, token: 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\n try {\n const result = await cascade.run({ prompt: body.prompt!, identityId: body.identityId });\n this.socket.broadcast('cost:update', {\n sessionId,\n tokens: result.usage.totalTokens,\n costUsd: 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"]}