cascade-ai 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +23 -11
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +23 -11
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +23 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +23 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","node-file:F:/Softwares/Github Softwares/Cascade-AI/node_modules/keytar/build/Release/keytar.node","../node_modules/keytar/lib/keytar.js","../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/cli/index.ts","../src/config/keystore.ts","../src/config/ignore.ts","../src/config/cascade-md.ts","../src/memory/store.ts","../src/config/schema.ts","../src/config/validate.ts","../src/config/index.ts","../src/cli/utils/terminal-input.ts","../src/cli/utils/clipboard.ts","../src/cli/components/SafeTextInput.tsx","../src/cli/repl/index.tsx","../src/core/router/index.ts","../src/core/router/selector.ts","../src/core/router/failover.ts","../src/core/router/tpm-limiter.ts","../src/utils/cost.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/core/tiers/t1-administrator.ts","../src/utils/json-extract.ts","../src/tools/registry.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/mcp/client.ts","../src/core/permissions/escalator.ts","../src/telemetry/index.ts","../src/core/router/task-analyzer.ts","../src/tools/tool-creator.ts","../src/core/cascade.ts","../src/cli/themes/index.ts","../src/cli/slash/index.ts","../src/cli/repl/components/AgentTree.tsx","../src/cli/repl/components/TimelinePanel.tsx","../src/cli/repl/components/StatusBar.tsx","../src/cli/repl/components/HintBar.tsx","../src/cli/repl/components/ApprovalPrompt.tsx","../src/cli/repl/components/ModelsDisplay.tsx","../src/cli/repl/components/CostTracker.tsx","../src/cli/repl/utils/line-buffer.ts","../src/cli/commands/init.ts","../src/cli/setup/index.tsx","../src/cli/commands/doctor.ts","../src/cli/commands/update.ts","../src/dashboard/server.ts","../src/dashboard/auth.ts","../src/dashboard/socket-protocol.ts","../src/dashboard/websocket.ts","../src/cli/commands/dashboard.ts","../src/cli/commands/identity.ts","../src/cli/commands/models.ts","../src/cli/commands/export.ts","../src/cli/commands/telemetry.ts"],"names":["exports","require_keytar","Anthropic","OpenAI","GoogleGenAI","HarmCategory","HarmBlockThreshold","candidates","axios","fs","crypto","path","_ignoreModule","Database","randomUUID","z","os","spawnSync","useState","useRef","useEffect","useCallback","useInput","chalk","jsx","Text","EventEmitter","promisify","exec","simpleGit","PDFDocument","ignore","ignoreFactory","StdioClientTransport","Client","createContext","runInContext","stats","durationMs","Box","jsxs","Fragment","Spinner","useStdout","useMemo","wrapAnsi","useApp","useReducer","maxScroll","OllamaProvider","AnthropicProvider","OpenAIProvider","OpenAICompatibleProvider","GeminiProvider","AzureOpenAIProvider","SelectInput","render","React","ora","execAsync","jwt","SocketServer","parser","__dirname","fileURLToPath","express","createServer","bcrypt","rateLimit","timingSafeEqual","Command","session","dotenv"],"mappings":"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","file":"cli.cjs","sourcesContent":["// ─────────────────────────────────────────────\n// Cascade AI — Constants\n// ─────────────────────────────────────────────\n\nimport type { ModelInfo, ProviderType, ThemeName } from './types.js';\n\nexport const CASCADE_VERSION = '0.2.0';\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 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 — 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 — CLI Entry Point\n// ─────────────────────────────────────────────\n\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport React from 'react';\nimport chalk from 'chalk';\nimport dotenv from 'dotenv';\nimport { CASCADE_VERSION, DEFAULT_THEME } from '../constants.js';\nimport { ConfigManager } from '../config/index.js';\nimport { Repl } from './repl/index.js';\nimport { initCommand } from './commands/init.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { updateCommand } from './commands/update.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { makeIdentityCommand } from './commands/identity.js';\nimport { modelsCommand } from './commands/models.js';\nimport { exportCommand } from './commands/export.js';\nimport { telemetryCommand } from './commands/telemetry.js';\nimport { runSetupWizard } from './setup/index.js';\n\ndotenv.config();\n\nconst program = new Command();\n\nprogram\n .name('cascade')\n .description('Multi-tier AI orchestration CLI')\n .version(CASCADE_VERSION, '-v, --version')\n .option('-p, --prompt <text>', 'Run a single prompt non-interactively')\n .option('-t, --theme <name>', 'Color theme', DEFAULT_THEME)\n .option('-w, --workspace <path>', 'Workspace path', process.cwd())\n .option('-i, --identity <name>', 'Identity name or ID')\n .option('--no-color', 'Disable colors')\n .action(async (options) => {\n await startRepl(options);\n });\n\nprogram.addCommand(makeIdentityCommand());\n\nprogram\n .command('init [path]')\n .description('Initialize Cascade in a project directory')\n .action(async (dirPath?: string) => {\n await initCommand(dirPath ?? process.cwd());\n });\n\nprogram\n .command('doctor')\n .description('Check system configuration and API key availability')\n .action(async () => {\n await doctorCommand();\n });\n\nprogram\n .command('update')\n .description('Update Cascade to the latest version')\n .action(async () => {\n await updateCommand();\n });\n\nprogram\n .command('dashboard')\n .description('Launch the web dashboard')\n .option('-p, --port <number>', 'Port number', '4891')\n .action(async (opts) => {\n const cm = new ConfigManager(process.cwd());\n await cm.load();\n const config = cm.getConfig();\n config.dashboard.port = parseInt(opts.port, 10);\n await dashboardCommand(config, process.cwd());\n });\n\nprogram\n .command('run <prompt>')\n .description('Run a single prompt and exit')\n .option('-t, --theme <name>', 'Color theme', DEFAULT_THEME)\n .option('-i, --identity <name>', 'Identity name or ID')\n .action(async (prompt: string, opts) => {\n await startRepl({ prompt, theme: opts.theme, workspace: process.cwd(), identity: opts.identity });\n });\n\nprogram\n .command('models')\n .description('List available AI models for each tier')\n .option('-v, --verbose', 'Show all models per provider with pricing')\n .action(async (opts) => {\n await modelsCommand({ verbose: opts.verbose });\n });\n\nprogram\n .command('telemetry [action]')\n .description('Toggle anonymous usage telemetry (on | off | status). Default: status')\n .action(async (action?: string) => {\n const normalized = (action ?? 'status').toLowerCase();\n if (normalized !== 'on' && normalized !== 'off' && normalized !== 'status') {\n console.error(chalk.red(`Unknown action: ${action}. Use: on | off | status`));\n process.exit(1);\n }\n await telemetryCommand(normalized);\n });\n\nprogram\n .command('export')\n .description('Export a session conversation to Markdown or JSON')\n .option('-s, --session <id>', 'Session ID to export (default: most recent)')\n .option('-f, --format <format>', 'Output format: markdown | json', 'markdown')\n .option('-o, --output <path>', 'Output file path')\n .action(async (opts) => {\n await exportCommand({\n sessionId: opts.session,\n format: opts.format as 'markdown' | 'json',\n output: opts.output,\n });\n });\n\n// ── Start REPL ────────────────────────────────\n\nasync function startRepl(options: {\n prompt?: string;\n theme?: string;\n workspace?: string;\n identity?: string;\n}): Promise<void> {\n const workspacePath = options.workspace ?? process.cwd();\n\n // Print banner\n printBanner();\n\n // Load config\n const cm = new ConfigManager(workspacePath);\n try {\n await cm.load();\n } catch (err) {\n console.error(chalk.red(`Config error: ${err instanceof Error ? err.message : String(err)}`));\n console.error(chalk.gray('Run `cascade init` to set up this directory.'));\n process.exit(1);\n }\n\n let config = cm.getConfig();\n\n // First-run detection: no providers configured → launch setup wizard\n const needsSetup =\n !config.providers?.length ||\n config.providers.every((p: { type: string; apiKey?: string }) => p.type !== 'ollama' && !p.apiKey);\n\n if (needsSetup) {\n console.log(chalk.magenta(' ◈ No providers configured — launching setup wizard…'));\n console.log();\n config = await runSetupWizard(workspacePath);\n await cm.updateConfig(config);\n // Reload to pick up persisted defaults\n await cm.load();\n config = cm.getConfig();\n }\n\n // Render ink REPL\n const { waitUntilExit } = render(\n React.createElement(Repl, {\n config,\n workspacePath,\n themeName: options.theme ?? config.theme ?? DEFAULT_THEME,\n initialPrompt: options.prompt,\n identityName: options.identity,\n }),\n { exitOnCtrlC: false },\n );\n\n await waitUntilExit();\n process.exit(0);\n}\n\nfunction printBanner(): void {\n if (process.stdout.columns < 60) return;\n console.log();\n console.log(chalk.hex('#7C6AF7').bold(' ╔═══════════════════════════════╗'));\n console.log(chalk.hex('#7C6AF7').bold(' ║') + chalk.white.bold(' ◈ CASCADE AI') + chalk.gray(' v' + CASCADE_VERSION + ' ') + chalk.hex('#7C6AF7').bold('║'));\n console.log(chalk.hex('#7C6AF7').bold(' ║') + chalk.gray(' Multi-Tier Orchestration ') + chalk.hex('#7C6AF7').bold('║'));\n console.log(chalk.hex('#7C6AF7').bold(' ╚═══════════════════════════════╝'));\n console.log();\n}\n\nprogram.parse(process.argv);\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 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 — 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 — Terminal input sanitizers & modes\n// ─────────────────────────────────────────────\n//\n// Centralizes the terminal-control escape sequences that would otherwise\n// pollute Ink text inputs:\n// - SGR mouse reports (`\\x1b[<b;x;yM` / `\\x1b[<b;x;ym`) from mouse moves,\n// wheel scroll, and right-click events.\n// - Bracketed-paste markers (`\\x1b[200~…\\x1b[201~`) — these are handled\n// at a higher level but stripped as a safety net.\n// - CSI / SS3 / OSC / DCS sequences and stray C0 control characters.\n//\n// The REPL and the setup wizard both need the same behaviour, so the\n// logic lives here in one place and is referenced by both.\n\n/**\n * Matches SGR-encoded mouse reports (xterm 1006 mode):\n * ESC [ < Pb ; Px ; Py (M|m)\n * We match lazily to avoid eating unrelated CSI sequences that happen to\n * contain semicolons.\n */\nexport const MOUSE_SGR_RE = /\\x1b\\[<\\d+;\\d+;\\d+[Mm]/g;\n\n/**\n * Matches x10/legacy mouse reports:\n * ESC [ M Cb Cx Cy (three raw bytes follow)\n * Uses a tolerant character class so we swallow the trailing bytes safely.\n */\nexport const MOUSE_LEGACY_RE = /\\x1b\\[M[\\s\\S]{3}/g;\n\n/** Bracketed-paste start / end markers. */\nexport const PASTE_START = '\\x1b[200~';\nexport const PASTE_END = '\\x1b[201~';\n\n/**\n * Broad escape-sequence stripper used as a final safety net on anything\n * that reaches the text input's onChange. Preserves \\x7F (backspace/delete)\n * because Ink's TextInput relies on it.\n */\n// Order matters: put the legacy 3-byte mouse sequence BEFORE any shorter\n// pattern that could match `\\x1b[M` alone, otherwise the trailing raw\n// bytes leak through.\nconst ESC_SANITIZER_RE =\n /(?:\\x1b\\[<\\d+;\\d+;\\d+[Mm])|(?:\\x1b\\[M[\\s\\S]{3})|(?:\\x1b\\[\\d+[Mm])|(?:\\x1b\\[\\?[0-9;]*[a-zA-Z])|(?:\\x1b\\[[0-9;?]*[\\x40-\\x7E])|(?:\\x1bO[\\x40-\\x7E])|(?:\\x1b[PX^_][\\s\\S]*?\\x1b\\\\)|(?:\\x1b\\][\\s\\S]*?(?:\\x07|\\x1b\\\\))|[\\x00-\\x08\\x0B-\\x1F]/g;\n\nexport function sanitizeTerminalInput(value: string): string {\n return value.replace(ESC_SANITIZER_RE, '');\n}\n\n/** True if the chunk contains a mouse report (SGR or legacy). */\nexport function containsMouseSequence(chunk: string): boolean {\n return /\\x1b\\[<\\d+;\\d+;\\d+[Mm]/.test(chunk) || /\\x1b\\[M[\\s\\S]{3}/.test(chunk);\n}\n\n/**\n * Enable xterm-compatible bracketed paste mode. Terminals that support it\n * will wrap pasted content in ESC[200~ / ESC[201~ so we can distinguish\n * pasted bytes from typed keystrokes.\n */\nexport function enableBracketedPaste(): void {\n try { process.stdout.write('\\x1b[?2004h'); } catch { /* non-TTY */ }\n}\n\nexport function disableBracketedPaste(): void {\n try { process.stdout.write('\\x1b[?2004l'); } catch { /* non-TTY */ }\n}\n\n/** Disable any mouse reporting that a prior run or terminal may have left on. */\nexport function disableMouseReporting(): void {\n try {\n // 1000 = press/release, 1002 = button-motion, 1003 = any-motion,\n // 1006 = SGR encoding, 1015 = urxvt encoding.\n process.stdout.write('\\x1b[?1000l\\x1b[?1002l\\x1b[?1003l\\x1b[?1006l\\x1b[?1015l');\n } catch {\n /* non-TTY */\n }\n}\n\n/** Enable SGR mouse reporting (used only by the REPL for scroll handling). */\nexport function enableMouseReporting(): void {\n try { process.stdout.write('\\x1b[?1000h\\x1b[?1006h'); } catch { /* non-TTY */ }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Cross-platform clipboard reader\n// ─────────────────────────────────────────────\n//\n// Shells out to the native OS clipboard command. Used as a fallback\n// when the terminal does not translate Ctrl+V into a paste event\n// (e.g. legacy Windows console, some SSH sessions, etc.).\n//\n// Returns an empty string on failure rather than throwing — the caller\n// is typing in an interactive TUI and we don't want to crash the UI.\n\nimport { spawnSync } from 'node:child_process';\n\ntype Cmd = { cmd: string; args: string[] };\n\nfunction candidates(): Cmd[] {\n if (process.platform === 'win32') {\n return [\n // Prefer powershell.exe which is present on all supported Windows versions.\n { cmd: 'powershell.exe', args: ['-NoProfile', '-Command', 'Get-Clipboard -Raw'] },\n { cmd: 'pwsh.exe', args: ['-NoProfile', '-Command', 'Get-Clipboard -Raw'] },\n ];\n }\n if (process.platform === 'darwin') {\n return [{ cmd: 'pbpaste', args: [] }];\n }\n // Linux / BSD — try the common clipboard tools in order.\n const out: Cmd[] = [];\n if (process.env['WAYLAND_DISPLAY']) {\n out.push({ cmd: 'wl-paste', args: ['--no-newline'] });\n }\n out.push({ cmd: 'xclip', args: ['-selection', 'clipboard', '-o'] });\n out.push({ cmd: 'xsel', args: ['--clipboard', '--output'] });\n // Termux on Android\n out.push({ cmd: 'termux-clipboard-get', args: [] });\n return out;\n}\n\n/**\n * Read the system clipboard. Returns an empty string if the clipboard is\n * empty or no supported clipboard tool is available. Never throws.\n *\n * The result is trimmed of a single trailing newline (which `Get-Clipboard`\n * and most X clipboard tools append) so pasted single-line values don't\n * auto-submit the current prompt.\n */\nexport function readClipboardSync(): string {\n for (const { cmd, args } of candidates()) {\n try {\n const result = spawnSync(cmd, args, {\n encoding: 'utf-8',\n timeout: 1500,\n // Hide any stderr output — we'll fall back silently.\n stdio: ['ignore', 'pipe', 'ignore'],\n windowsHide: true,\n });\n if (result.status === 0 && typeof result.stdout === 'string') {\n // PowerShell's Get-Clipboard appends a trailing CRLF; pbpaste doesn't.\n // Strip a single trailing newline so paste doesn't auto-submit.\n return result.stdout.replace(/\\r\\n?$/, '').replace(/\\n$/, '');\n }\n } catch {\n // try next candidate\n }\n }\n return '';\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — SafeTextInput\n// ─────────────────────────────────────────────\n//\n// A drop-in replacement for `ink-text-input` that fixes three real-world\n// papercuts observed on Windows consoles and some SSH terminals:\n//\n// 1. Ctrl+V (and Ctrl+Shift+V) insert a literal \"v\" instead of pasting.\n// Ink treats Ctrl+V as a modified keypress; the terminal never\n// converts it into clipboard bytes in raw mode. We intercept the\n// keypress ourselves and read the system clipboard via a small\n// cross-platform shell-out.\n//\n// 2. Right-click / scroll wheel / other mouse events emit raw SGR\n// sequences like `\\x1b[<2;98;44M` which end up typed into the\n// field. We disable mouse reporting on mount and strip any\n// sequences that still arrive.\n//\n// 3. Bracketed-paste content (ESC[200~…ESC[201~) from modern terminals\n// is captured in a single insert rather than being processed one\n// character at a time.\n//\n// The prop surface mirrors ink-text-input so existing call sites can\n// swap the component with no other changes.\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Text, useInput } from 'ink';\nimport chalk from 'chalk';\nimport {\n PASTE_START,\n PASTE_END,\n sanitizeTerminalInput,\n enableBracketedPaste,\n disableBracketedPaste,\n disableMouseReporting,\n} from '../utils/terminal-input.js';\nimport { readClipboardSync } from '../utils/clipboard.js';\n\nexport interface SafeTextInputProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit?: (value: string) => void;\n placeholder?: string;\n /** When set, displayed characters are replaced with this glyph (for API keys). */\n mask?: string;\n focus?: boolean;\n showCursor?: boolean;\n /** Disable the Ctrl+V clipboard fallback. Defaults to `false`. */\n disableClipboardFallback?: boolean;\n /**\n * When `true` (default) the component disables mouse reporting on mount.\n * Set to `false` from hosts (e.g. the REPL) that keep mouse reporting\n * enabled for scroll-wheel handling.\n */\n manageMouseReporting?: boolean;\n}\n\nconst PASTE_BUFFER_TIMEOUT_MS = 500;\n\nexport function SafeTextInput(props: SafeTextInputProps): React.ReactElement {\n const {\n value,\n onChange,\n onSubmit,\n placeholder = '',\n mask,\n focus = true,\n showCursor = true,\n disableClipboardFallback = false,\n manageMouseReporting = true,\n } = props;\n\n const [cursorOffset, setCursorOffset] = useState<number>(value.length);\n\n const valueRef = useRef(value);\n valueRef.current = value;\n const cursorRef = useRef(cursorOffset);\n cursorRef.current = cursorOffset;\n const focusRef = useRef(focus);\n focusRef.current = focus;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const onSubmitRef = useRef(onSubmit);\n onSubmitRef.current = onSubmit;\n\n // Keep cursor within bounds when value shrinks externally.\n useEffect(() => {\n if (cursorOffset > value.length) setCursorOffset(value.length);\n }, [value, cursorOffset]);\n\n // Insert text at the current cursor position.\n const insertAtCursor = useCallback((text: string) => {\n const v = valueRef.current;\n const c = cursorRef.current;\n const next = v.slice(0, c) + text + v.slice(c);\n valueRef.current = next;\n const nextCursor = c + text.length;\n cursorRef.current = nextCursor;\n setCursorOffset(nextCursor);\n onChangeRef.current(next);\n }, []);\n\n // Bracketed-paste buffer state.\n const pasteBufferRef = useRef<string | null>(null);\n const pasteTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n // Tracks the most recent forward-delete (ESC[3~) handled in the raw stdin\n // listener. Ink surfaces BOTH backspace (\\x7F) and forward-delete (\\x1b[3~)\n // as `key.delete = true`, so useInput cannot distinguish them. We handle\n // forward-delete in the raw listener and set this timestamp so the\n // useInput handler can ignore the duplicate event that Ink is about to\n // fire for the same keystroke.\n const lastForwardDeleteRef = useRef<number>(0);\n\n const flushPaste = useCallback(() => {\n const buf = pasteBufferRef.current;\n pasteBufferRef.current = null;\n if (pasteTimerRef.current) { clearTimeout(pasteTimerRef.current); pasteTimerRef.current = null; }\n if (buf === null) return;\n const content = sanitizeTerminalInput(buf);\n if (content) insertAtCursor(content);\n }, [insertAtCursor]);\n\n // Enable bracketed paste + (optionally) disable mouse reporting on mount.\n useEffect(() => {\n enableBracketedPaste();\n if (manageMouseReporting) disableMouseReporting();\n return () => {\n disableBracketedPaste();\n if (pasteTimerRef.current) clearTimeout(pasteTimerRef.current);\n };\n }, [manageMouseReporting]);\n\n // Raw stdin listener — captures bracketed-paste content before Ink\n // splits it into per-character keypress events.\n useEffect(() => {\n const onData = (data: Buffer) => {\n if (!focusRef.current) return;\n const chunk = data.toString('utf8');\n\n // Continue an in-flight paste.\n if (pasteBufferRef.current !== null) {\n const endIdx = chunk.indexOf(PASTE_END);\n if (endIdx === -1) {\n pasteBufferRef.current += chunk;\n } else {\n pasteBufferRef.current += chunk.slice(0, endIdx);\n flushPaste();\n }\n return;\n }\n\n // Detect a new paste.\n const startIdx = chunk.indexOf(PASTE_START);\n if (startIdx !== -1) {\n const after = chunk.slice(startIdx + PASTE_START.length);\n const endIdx = after.indexOf(PASTE_END);\n if (endIdx !== -1) {\n const pasted = sanitizeTerminalInput(after.slice(0, endIdx));\n if (pasted) insertAtCursor(pasted);\n } else {\n pasteBufferRef.current = after;\n pasteTimerRef.current = setTimeout(flushPaste, PASTE_BUFFER_TIMEOUT_MS);\n }\n return;\n }\n\n // Forward-delete key: ESC[3~ (PC Delete, not Backspace).\n // Ink will also dispatch this as `key.delete = true`, which our\n // useInput handler treats as backspace. We pre-empt it here so the\n // character at the cursor is removed instead of the character before\n // the cursor, and record the timestamp so useInput can skip the\n // duplicate event. The chunk can contain other keypress bytes on\n // some terminals, so we match both an exact equal and an endsWith.\n if (chunk === '\\x1b[3~' || chunk.endsWith('\\x1b[3~')) {\n lastForwardDeleteRef.current = Date.now();\n const c = cursorRef.current;\n const v = valueRef.current;\n if (c < v.length) {\n const next = v.slice(0, c) + v.slice(c + 1);\n valueRef.current = next;\n onChangeRef.current(next);\n // Cursor stays where it is for forward-delete.\n }\n return;\n }\n };\n\n process.stdin.on('data', onData);\n return () => { process.stdin.off('data', onData); };\n }, [flushPaste, insertAtCursor]);\n\n useInput((input, key) => {\n if (!focusRef.current) return;\n\n // Ignore outer navigation keys — let the parent component act on them.\n if (key.upArrow || key.downArrow || key.tab || (key.shift && key.tab)) return;\n if (key.ctrl && input === 'c') return;\n\n // Ctrl+V / Ctrl+Shift+V → read clipboard.\n if (key.ctrl && (input === 'v' || input === 'V')) {\n if (disableClipboardFallback) return;\n const text = readClipboardSync();\n if (text) {\n const sanitized = sanitizeTerminalInput(text);\n if (sanitized) insertAtCursor(sanitized);\n }\n return;\n }\n\n if (key.return) {\n onSubmitRef.current?.(valueRef.current);\n return;\n }\n\n if (key.leftArrow) {\n setCursorOffset(c => Math.max(0, c - 1));\n return;\n }\n if (key.rightArrow) {\n setCursorOffset(c => Math.min(valueRef.current.length, c + 1));\n return;\n }\n\n // Home / End (these arrive via `key.ctrl` flags in some terminals;\n // ink doesn't map them natively — we simply support the common case).\n if (key.backspace || key.delete) {\n // Ink surfaces BOTH \\x7F (backspace) and \\x1b[3~ (forward-delete) as\n // `key.delete = true`. The raw stdin listener already handled the\n // forward-delete case; if that fired within the last few ms, this\n // duplicate event should be ignored to avoid deleting a second char.\n if (Date.now() - lastForwardDeleteRef.current < 50) return;\n const v = valueRef.current;\n const c = cursorRef.current;\n if (c === 0) return;\n const next = v.slice(0, c - 1) + v.slice(c);\n valueRef.current = next;\n const nextCursor = c - 1;\n cursorRef.current = nextCursor;\n setCursorOffset(nextCursor);\n onChangeRef.current(next);\n return;\n }\n\n if (!input) return;\n\n // Any modifier-key combo we don't explicitly handle is ignored so\n // that stray Ctrl+<letter> keystrokes don't type a literal letter.\n if (key.ctrl || key.meta) return;\n\n // Strip escape sequences / control characters that slipped through.\n const cleaned = sanitizeTerminalInput(input);\n if (cleaned.length === 0) return;\n insertAtCursor(cleaned);\n }, { isActive: focus });\n\n // ── Render ──────────────────────────────────────\n const displayValue = mask ? mask.repeat(value.length) : value;\n\n let rendered: string;\n if (displayValue.length === 0) {\n rendered = showCursor && focus\n ? (placeholder.length > 0 ? chalk.inverse(placeholder[0]!) + chalk.grey(placeholder.slice(1)) : chalk.inverse(' '))\n : (placeholder.length > 0 ? chalk.grey(placeholder) : '');\n } else if (!showCursor || !focus) {\n rendered = displayValue;\n } else {\n let out = '';\n for (let i = 0; i < displayValue.length; i++) {\n out += i === cursorOffset ? chalk.inverse(displayValue[i]!) : displayValue[i]!;\n }\n if (cursorOffset >= displayValue.length) out += chalk.inverse(' ');\n rendered = out;\n }\n\n return <Text>{rendered}</Text>;\n}\n\nexport default SafeTextInput;\n","// ─────────────────────────────────────────────\n// Cascade AI — Interactive REPL (ink)\n// ─────────────────────────────────────────────\n\nimport React, { useCallback, useEffect, useReducer, useRef, useState } from 'react';\nimport { Box, Text, useApp, useInput, useStdout } from 'ink';\nimport { SafeTextInput } from '../components/SafeTextInput.js';\nimport { sanitizeTerminalInput, containsMouseSequence } from '../utils/terminal-input.js';\nimport { randomUUID } from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n ApprovalRequest,\n CascadeConfig,\n ConversationMessage,\n ModelInfo,\n ProviderType,\n RuntimeNode,\n RuntimeNodeLog,\n Session,\n Theme,\n Message,\n} from '../../types.js';\nimport { CASCADE_DB_FILE, GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE } from '../../constants.js';\nimport { Cascade } from '../../core/cascade.js';\nimport { MemoryStore } from '../../memory/store.js';\nimport { ModelSelector } from '../../core/router/selector.js';\nimport { OpenAIProvider } from '../../providers/openai.js';\nimport { GeminiProvider } from '../../providers/gemini.js';\nimport { AnthropicProvider } from '../../providers/anthropic.js';\nimport { OllamaProvider } from '../../providers/ollama.js';\nimport { OpenAICompatibleProvider } from '../../providers/openai-compatible.js';\nimport type { BaseProvider } from '../../providers/base.js';\nimport { getTheme } from '../themes/index.js';\nimport { SlashCommandRegistry } from '../slash/index.js';\nimport { AgentTree, type TierNode } from './components/AgentTree.js';\nimport { TimelinePanel } from './components/TimelinePanel.js';\nimport { StatusBar } from './components/StatusBar.js';\nimport { HintBar } from './components/HintBar.js';\nimport { ApprovalPrompt } from './components/ApprovalPrompt.js';\nimport { ModelsDisplay, type ModelPickerSelection } from './components/ModelsDisplay.js';\nimport { CostTracker } from './components/CostTracker.js';\nimport { CompactStatus } from './components/CompactStatus.js';\nimport { formatToLines } from './utils/line-buffer.js';\n\ninterface WelcomeBannerProps {\n theme: Theme;\n config: CascadeConfig;\n workspacePath: string;\n sessionId: string;\n}\n\nfunction WelcomeBanner({ theme, config, workspacePath, sessionId }: WelcomeBannerProps) {\n const t1 = config.models?.t1 ?? 'auto';\n const t2 = config.models?.t2 ?? 'auto';\n const t3 = config.models?.t3 ?? 'auto';\n const folder = workspacePath.split(/[/\\\\]/).pop() ?? workspacePath;\n\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingLeft={2}>\n <Text color={theme.colors.primary} bold>◈ CASCADE AI</Text>\n <Text color={theme.colors.muted}>\n {'T1: '}<Text color={theme.colors.foreground}>{t1}</Text>\n {' T2: '}<Text color={theme.colors.foreground}>{t2}</Text>\n {' T3: '}<Text color={theme.colors.foreground}>{t3}</Text>\n </Text>\n <Text color={theme.colors.muted}>\n {'workspace: '}<Text color={theme.colors.foreground}>{folder}</Text>\n {' · session: '}<Text color={theme.colors.foreground}>{sessionId.slice(0, 8)}</Text>\n </Text>\n <Box marginTop={1}>\n <Text color={theme.colors.muted}>\n {'Type '}<Text color={theme.colors.accent} bold>/help</Text>{' for commands · Esc to cancel · Ctrl+C to exit'}\n </Text>\n </Box>\n </Box>\n );\n}\n\ninterface FlatTreeNode extends TierNode {\n parentId?: string;\n}\n\ninterface RootTierEvent {\n role: 'T1' | 'T2' | 'T3';\n}\n\ninterface TierStatusEvent {\n tierId: string;\n role: 'T1' | 'T2' | 'T3';\n parentId?: string;\n label?: string;\n status: RuntimeNode['status'];\n currentAction?: string;\n progressPct?: number;\n}\n\ninterface ReplState {\n messages: Message[];\n agentTree: TierNode | null;\n isStreaming: boolean;\n isExecuting: boolean;\n streamBuffer: string;\n totalTokens: number;\n totalCostUsd: number;\n callsByProvider: Record<string, number>;\n callsByTier: Record<string, number>;\n costByTier: Record<string, number>;\n tokensByTier: Record<string, number>;\n approvalRequest: ApprovalRequest | null;\n showCost: boolean;\n showDetails: boolean;\n error: string | null;\n activeTool: string | null;\n}\n\ntype ReplAction =\n | { type: 'ADD_MESSAGE'; message: Message }\n | { type: 'APPEND_STREAM'; text: string }\n | { type: 'COMMIT_STREAM'; finalText: string; timestamp?: string }\n | { type: 'SET_TREE'; tree: TierNode | null }\n | { type: 'UPDATE_COST'; tokens: number; costUsd: number; byProvider: Record<string,number>; byTier: Record<string,number>; costByTier: Record<string,number>; tokensByTier: Record<string,number> }\n | { type: 'SET_APPROVAL'; request: ApprovalRequest | null }\n | { type: 'SET_EXECUTING'; isExecuting: boolean }\n | { type: 'SET_STREAMING'; isStreaming: boolean }\n | { type: 'CLEAR' }\n | { type: 'TOGGLE_COST' }\n | { type: 'TOGGLE_DETAILS' }\n | { type: 'SET_ERROR'; error: string | null }\n | { type: 'SET_ACTIVE_TOOL'; toolName: string | null };\n\nfunction replReducer(state: ReplState, action: ReplAction): ReplState {\n switch (action.type) {\n case 'ADD_MESSAGE':\n return { ...state, messages: [...state.messages, action.message], isStreaming: false, streamBuffer: '' };\n case 'APPEND_STREAM':\n return { ...state, isStreaming: true, streamBuffer: state.streamBuffer + action.text };\n case 'COMMIT_STREAM': {\n const msg: Message = {\n id: randomUUID(),\n role: 'assistant',\n content: action.finalText,\n timestamp: action.timestamp ?? new Date().toISOString(),\n };\n return { ...state, messages: [...state.messages, msg], isStreaming: false, streamBuffer: '', activeTool: null };\n }\n case 'SET_TREE':\n return { ...state, agentTree: action.tree };\n case 'UPDATE_COST':\n return { ...state, totalTokens: action.tokens, totalCostUsd: action.costUsd, callsByProvider: action.byProvider, callsByTier: action.byTier, costByTier: action.costByTier, tokensByTier: action.tokensByTier };\n case 'SET_APPROVAL':\n return { ...state, approvalRequest: action.request };\n case 'SET_EXECUTING':\n return { ...state, isExecuting: action.isExecuting };\n case 'SET_STREAMING':\n return { ...state, isStreaming: action.isStreaming };\n case 'CLEAR':\n return { ...state, messages: [], agentTree: null, streamBuffer: '', totalTokens: 0, totalCostUsd: 0, activeTool: null };\n case 'TOGGLE_COST':\n return { ...state, showCost: !state.showCost };\n case 'TOGGLE_DETAILS':\n return { ...state, showDetails: !state.showDetails };\n case 'SET_ERROR':\n return { ...state, error: action.error };\n case 'SET_ACTIVE_TOOL':\n return { ...state, activeTool: action.toolName };\n default:\n return state;\n }\n}\n\ninterface ReplProps {\n config: CascadeConfig;\n workspacePath: string;\n themeName: string;\n initialPrompt?: string;\n identityName?: string;\n}\n\nasync function refreshModelCache(store: MemoryStore, providers: CascadeConfig['providers']) {\n for (const provider of providers) {\n try {\n const dummyModel: ModelInfo = { id: 'dummy', name: 'dummy', provider: provider.type, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: false };\n let instance: BaseProvider | undefined;\n if (provider.type === 'openai') instance = new OpenAIProvider(provider, dummyModel);\n else if (provider.type === 'gemini') instance = new GeminiProvider(provider, dummyModel);\n else if (provider.type === 'anthropic') instance = new AnthropicProvider(provider, dummyModel);\n else if (provider.type === 'ollama') instance = new OllamaProvider(provider, dummyModel);\n else if (provider.type === 'openai-compatible') instance = new OpenAICompatibleProvider(provider, dummyModel);\n if (instance) {\n const fetched = await instance.listModels();\n for (const m of fetched) store.upsertCachedModel(m);\n }\n } catch (err) { console.error(`Failed refresh: ${provider.type}`, err); }\n }\n}\n\nexport function Repl({ config, workspacePath, themeName, initialPrompt, identityName }: ReplProps): React.ReactElement {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const [theme, setTheme] = useState<Theme>(() => getTheme(themeName));\n const [input, setInput] = useState('');\n const [inputHistory, setInputHistory] = useState<string[]>([]);\n const [historyIndex, setHistoryIndex] = useState<number | null>(null);\n const [slashIndex, setSlashIndex] = useState(0);\n const [identities, setIdentities] = useState<Array<{ id: string; name: string; isDefault: boolean }>>([]);\n const [currentIdentityId, setCurrentIdentityId] = useState<string | undefined>(config.defaultIdentityId);\n const [state, dispatch] = useReducer(replReducer, { messages: [], agentTree: null, isStreaming: false, isExecuting: false, streamBuffer: '', totalTokens: 0, totalCostUsd: 0, callsByProvider: {}, callsByTier: {}, costByTier: {}, tokensByTier: {}, approvalRequest: null, showCost: false, showDetails: false, error: null, activeTool: null });\n const [isShowingModels, setIsShowingModels] = useState(false);\n const [cachedModels, setCachedModels] = useState<Map<ProviderType, ModelInfo[]>>(new Map());\n const cascadeRef = useRef<Cascade | null>(null);\n const storeRef = useRef<MemoryStore | null>(null);\n const slashRef = useRef(new SlashCommandRegistry());\n const approvalResolverRef = useRef<((decision: { approved: boolean; always: boolean }) => void) | null>(null);\n const sessionIdRef = useRef(randomUUID());\n const startedAtRef = useRef(new Date().toISOString());\n const treeNodesRef = useRef<Map<string, FlatTreeNode>>(new Map());\n const nodeLogsRef = useRef<Map<string, string[]>>(new Map());\n const [startupWarning, setStartupWarning] = useState<string | null>(null);\n const [timelineIndex, setTimelineIndex] = useState(0);\n const [scrollOffset, setScrollOffset] = useState(0);\n const [isAutoScrolling, setIsAutoScrolling] = useState(true);\n const [queuedMessages, setQueuedMessages] = useState<string[]>([]);\n const [quitAttempted, setQuitAttempted] = useState(false);\n const isInputLockedRef = useRef(false);\n const lockTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n const lockInputTemporarily = useCallback(() => {\n isInputLockedRef.current = true;\n if (lockTimerRef.current) clearTimeout(lockTimerRef.current);\n lockTimerRef.current = setTimeout(() => { isInputLockedRef.current = false; }, 200);\n }, []);\n\n const sessionTitle = state.messages.find(m => m.role === 'user')?.content.slice(0, 72) ?? 'Cascade Session';\n const lastUserPrompt = useRef<string | null>(null);\n const lastSubmittedInputRef = useRef<string | null>(null);\n const sessionTitleGeneratedRef = useRef(false);\n const rootTierIdRef = useRef<'T1' | 't2-root' | 't3-root'>('T1');\n const SLASH_PAGE_SIZE = 8;\n const isTypingCommand = input.startsWith('/');\n // Full list of matching commands (names only — used for index cycling & Tab)\n const slashCompletions = isTypingCommand ? (\n input.startsWith('/identity ')\n ? identities.map(i => `/identity ${i.name}`).filter(c => c.startsWith(input))\n : slashRef.current.getCompletions(input)\n ) : [];\n // Paired list with descriptions for the suggestion panel\n const slashEntries = isTypingCommand ? (\n input.startsWith('/identity ')\n ? identities.map(i => `/identity ${i.name}`).filter(c => c.startsWith(input)).map(c => ({ command: c, description: '' }))\n : slashRef.current.getCompletionEntries(input)\n ) : [];\n // Viewport: keep selected item visible, centred in the window\n const slashViewStart = Math.max(\n 0,\n Math.min(\n slashIndex - Math.floor(SLASH_PAGE_SIZE / 2),\n slashEntries.length - SLASH_PAGE_SIZE,\n ),\n );\n\n const persistMessage = useCallback((role: 'user' | 'assistant' | 'system', content: string, timestamp: string) => {\n storeRef.current?.addMessage({ id: randomUUID(), sessionId: sessionIdRef.current, role, content, timestamp });\n }, []);\n\n /**\n * Apply a selection from the interactive model picker:\n * - update the in-memory CascadeConfig.models[tier]\n * - persist the updated config to .cascade/config.json\n * - hot-swap the running router via overrideTierModel (if a concrete\n * ModelInfo is available in the model cache)\n * - print a short confirmation in the chat stream\n */\n const applyModelPick = useCallback(async (sel: ModelPickerSelection) => {\n const tierKey = sel.tier.toLowerCase() as 't1' | 't2' | 't3';\n const tierLabel = sel.tier;\n\n // Update in-memory config (mutating is OK here — this is a TUI session\n // local copy; runCascade hasn't persisted it elsewhere).\n if (sel.kind === 'auto') {\n delete (config.models as Record<string, string | undefined>)[tierKey];\n } else {\n (config.models as Record<string, string | undefined>)[tierKey] = sel.modelId;\n }\n\n // Hot-swap the live router — best-effort.\n try {\n const router = cascadeRef.current?.getRouter();\n if (router && sel.kind === 'pick') {\n const candidate = (cachedModels.get(sel.provider) ?? []).find(m => m.id === sel.modelId);\n if (candidate) router.overrideTierModel(tierLabel, candidate);\n }\n } catch {\n /* hot-swap is best effort; persisted config will take effect next start */\n }\n\n // Persist .cascade/config.json\n const configPath = path.join(workspacePath, '.cascade', 'config.json');\n try {\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n dispatch({\n type: 'ADD_MESSAGE',\n message: { id: randomUUID(), role: 'error', content: `Failed to persist model selection: ${msg}`, timestamp: new Date().toISOString() },\n });\n return;\n }\n\n const summary = sel.kind === 'auto'\n ? `${tierLabel} → Auto (Cascade will pick best available).`\n : `${tierLabel} → ${sel.modelId} (provider: ${sel.provider}).`;\n dispatch({\n type: 'ADD_MESSAGE',\n message: { id: randomUUID(), role: 'system', content: `✔ Model updated — ${summary}`, timestamp: new Date().toISOString() },\n });\n }, [config, workspacePath, cachedModels]);\n\n const globalStoreRef = useRef<MemoryStore | null>(null);\n\n const persistRuntimeSession = useCallback((status: 'ACTIVE' | 'COMPLETED' | 'FAILED', latestPrompt?: string) => {\n const runtimeSession = { sessionId: sessionIdRef.current, title: sessionTitle, workspacePath, status, startedAt: startedAtRef.current, updatedAt: new Date().toISOString(), latestPrompt, isGlobal: false };\n storeRef.current?.upsertRuntimeSession(runtimeSession);\n globalStoreRef.current?.upsertRuntimeSession({ ...runtimeSession, isGlobal: true });\n }, [sessionTitle, workspacePath]);\n\n const rebuildTree = useCallback(() => { dispatch({ type: 'SET_TREE', tree: buildTreeFromFlatNodes([...treeNodesRef.current.values()]) }); }, []);\n\n const recordNodeEvent = useCallback((event: TierStatusEvent) => {\n const existing = treeNodesRef.current.get(event.tierId);\n const node: FlatTreeNode = { id: event.tierId, role: event.role ?? existing?.role ?? 'T3', label: event.label ?? existing?.label ?? event.tierId, status: event.status ?? existing?.status ?? 'IDLE', currentAction: event.currentAction ?? existing?.currentAction, progressPct: event.progressPct ?? existing?.progressPct, parentId: event.parentId ?? existing?.parentId, children: [] };\n treeNodesRef.current.set(event.tierId, node);\n const store = storeRef.current;\n if (store) {\n const runtimeNode: RuntimeNode = { tierId: node.id, sessionId: sessionIdRef.current, parentId: node.parentId, role: node.role, label: node.label, status: node.status, currentAction: node.currentAction, progressPct: node.progressPct, updatedAt: new Date().toISOString(), workspacePath, isGlobal: false };\n store.upsertRuntimeNode(runtimeNode);\n globalStoreRef.current?.upsertRuntimeNode({ ...runtimeNode, isGlobal: true });\n }\n const history = nodeLogsRef.current.get(node.id) ?? [];\n nodeLogsRef.current.set(node.id, [...history.slice(-24), [node.status, node.currentAction].filter(Boolean).join(' — ')]);\n rebuildTree();\n }, [rebuildTree, workspacePath]);\n\n useEffect(() => {\n // Silence verbose SDK warnings that pollute the TUI\n const originalWarn = console.warn;\n const originalLog = console.log;\n \n process.stdout.write('\\x1bc');\n\n console.warn = (...args: unknown[]) => {\n const msg = args.join(' ');\n if (msg.includes('non-text parts') || msg.includes('functionCall')) return;\n originalWarn(...args);\n };\n\n // Also silence some direct logs if they leak\n console.log = (...args: unknown[]) => {\n const msg = args.join(' ');\n if (msg.includes('non-text parts')) return;\n originalLog(...args);\n };\n\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n storeRef.current = store;\n globalStoreRef.current = new MemoryStore(path.join(process.env['HOME'] ?? process.cwd(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE));\n const identityRows = store.listIdentities().map(i => ({ id: i.id, name: i.name, isDefault: i.isDefault }));\n setIdentities(identityRows);\n let initialIdentityId = config.defaultIdentityId ?? identityRows.find(i => i.isDefault)?.id ?? identityRows[0]?.id;\n if (identityName) {\n const match = identityRows.find(i => i.id === identityName || i.name.toLowerCase() === identityName.toLowerCase());\n if (match) initialIdentityId = match.id;\n else console.warn(`Identity '${identityName}' not found. Using default.`);\n }\n setCurrentIdentityId(initialIdentityId);\n const loadCache = async () => {\n const models = store.getCachedModels();\n const map = new Map<ProviderType, ModelInfo[]>();\n for (const m of models) { const list = map.get(m.provider) ?? []; list.push(m); map.set(m.provider, list); }\n setCachedModels(map);\n if (models.length === 0 || store.getCacheAge() > 24 * 60 * 60 * 1000) await refreshModelCache(store, config.providers);\n };\n loadCache();\n store.createSession({ id: sessionIdRef.current, title: 'Cascade Session', createdAt: startedAtRef.current, updatedAt: startedAtRef.current, identityId: config.defaultIdentityId ?? 'default', workspacePath, messages: [], metadata: { totalTokens: 0, totalCostUsd: 0, modelsUsed: [], toolsUsed: [], taskCount: 0 } });\n persistRuntimeSession('ACTIVE');\n cascadeRef.current = new Cascade(config, workspacePath);\n cascadeRef.current.init().catch(err => setStartupWarning(`Init failed: ${err.message}`));\n validateConfiguredModels(config).then(setStartupWarning);\n return () => {\n persistRuntimeSession('COMPLETED');\n // Close any MCP servers / telemetry the Cascade orchestrator opened so\n // we don't leak child processes when the REPL exits.\n cascadeRef.current?.close().catch(() => { /* ignored on shutdown */ });\n globalStoreRef.current?.close();\n store.close();\n console.warn = originalWarn;\n console.log = originalLog;\n };\n }, []);\n \n useEffect(() => {\n if (slashCompletions.length > 0 && slashIndex >= slashCompletions.length) {\n setSlashIndex(0);\n } else if (slashCompletions.length === 0 && slashIndex !== 0) {\n setSlashIndex(0);\n }\n }, [slashCompletions.length, slashIndex]);\n\n const handleSlashCommand = useCallback(async (trimmed: string) => {\n const result = await slashRef.current.handle(trimmed, {\n sessionId: sessionIdRef.current,\n workspacePath,\n onOutput: (text) => {\n const safeText = stringifySlashOutput(text);\n if (!safeText) return;\n const timestamp = new Date().toISOString();\n dispatch({ type: 'ADD_MESSAGE', message: { id: randomUUID(), role: 'assistant', content: safeText, timestamp } });\n persistMessage('assistant', safeText, timestamp);\n },\n onClear: () => dispatch({ type: 'CLEAR' }),\n onExit: () => exit(),\n onThemeChange: (name) => setTheme(getTheme(name)),\n onExport: async (fmt) => {\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n const exportPath = path.join(workspacePath, `cascade-export-${stamp}.${fmt === 'json' ? 'json' : 'md'}`);\n if (fmt === 'json') {\n await fs.writeFile(exportPath, JSON.stringify({ sessionId: sessionIdRef.current, messages: state.messages }, null, 2), 'utf-8');\n } else {\n const markdown = state.messages.map((msg) => `## ${msg.role.toUpperCase()} — ${msg.timestamp}\\n\\n${msg.content}`).join('\\n\\n');\n await fs.writeFile(exportPath, markdown, 'utf-8');\n }\n },\n onRollback: async () => {\n const store = storeRef.current;\n if (!store) return 'No database connection.';\n const snapshots = store.getLatestFileSnapshots(sessionIdRef.current);\n if (!snapshots.length) return 'No file snapshots found for this session.';\n for (const { filePath, content } of snapshots) {\n try { await fs.writeFile(filePath, content, 'utf-8'); } catch (err) { console.error(`Restore failed: ${filePath}`, err); }\n }\n return `Restored ${snapshots.length} files to their initial session state.`;\n },\n onBranch: async () => {\n const store = storeRef.current;\n if (!store) return;\n const newSessionId = randomUUID();\n try {\n store.branchSession(sessionIdRef.current, newSessionId);\n sessionIdRef.current = newSessionId;\n const timestamp = new Date().toISOString();\n dispatch({ type: 'ADD_MESSAGE', message: { id: randomUUID(), role: 'assistant', content: `Branched session. New Session ID: ${newSessionId}`, timestamp } });\n } catch (err) { console.error(`Branching failed:`, err); }\n },\n onModelInfo: () => {\n const router = cascadeRef.current?.getRouter();\n if (!router) return 'No models loaded';\n return ['T1', 'T2', 'T3'].map((t) => {\n const tier = t as 'T1' | 'T2' | 'T3';\n const m = router.getModelForTier(tier);\n const configured = config.models[tier.toLowerCase() as 't1' | 't2' | 't3'];\n return `${t}: ${m?.name ?? 'none'} (${m?.provider ?? '—'})${configured ? ` | configured: ${configured}` : ''}`;\n }).join('\\n');\n },\n onModelPicker: async () => { setIsShowingModels(true); return 'Opening model picker — choose provider → tier → model (ESC to exit).'; },\n onModelsInfo: async () => { setIsShowingModels(true); return 'Opening interactive models explorer... (ESC to exit)'; },\n onProvidersInfo: () => listConfiguredProviders(config),\n onConfigInfo: () => formatConfigSummary(config),\n onRetry: async () => {\n const prompt = lastUserPrompt.current;\n if (!prompt) return 'No previous user prompt to retry.';\n await handleSubmit(prompt);\n return `Retried: ${prompt}`;\n },\n onSearch: async (args) => searchSessionsAndMessages(args.join(' ').trim(), workspacePath),\n onDiagnose: async () => diagnoseRuntime(config, workspacePath),\n onLogs: async (args) => showRecentLogs(args, workspacePath),\n onResume: async (args) => {\n const snapshot = await loadSessionSnapshot(args, workspacePath);\n if (typeof snapshot === 'string') return snapshot;\n hydrateResumeState(snapshot, { dispatch, treeNodesRef, nodeLogsRef, sessionIdRef, startedAtRef, setInputHistory, setHistoryIndex, setCurrentIdentityId, storeRef });\n return `Restored session ${snapshot.session.title} with ${snapshot.messages.length} messages.`;\n },\n onMcpList: async () => {\n const cascade = cascadeRef.current;\n if (!cascade) return 'Cascade not initialized.';\n const toolRegistry = cascade.getToolRegistry();\n const tools = toolRegistry.getToolDefinitions().filter(t => t.name.startsWith('mcp::'));\n if (tools.length === 0) return 'No MCP tools connected.';\n \n const servers = new Set<string>();\n tools.forEach(t => servers.add(t.name.split('::')[1]!));\n \n const lines = [`Connected MCP Servers (${servers.size}):`];\n for (const server of servers) {\n const serverTools = tools.filter(t => t.name.startsWith(`mcp::${server}::`));\n lines.push(`\\n● ${server} (${serverTools.length} tools)`);\n serverTools.forEach(t => lines.push(` - ${t.name.split('::')[2]} — ${t.description.replace(`[MCP:${server}] `, '')}`));\n }\n return lines.join('\\n');\n },\n onCostInfo: () => { dispatch({ type: 'TOGGLE_COST' }); return ''; },\n onBudget: (args) => {\n const router = cascadeRef.current?.getRouter();\n if (!router) return 'Router not initialised yet.';\n\n if (args[0] === 'set' && args[1]) {\n const amount = parseFloat(args[1].replace(/^\\$/, ''));\n if (isNaN(amount) || amount <= 0) {\n return 'Invalid amount. Usage: /budget set 1.00';\n }\n router.setSessionBudget(amount);\n return `✔ Session budget set to $${amount.toFixed(2)}. Cascade will stop new tasks once this limit is reached.`;\n }\n\n if (args[0] === 'clear') {\n router.setSessionBudget(null);\n return '✔ Session budget cap removed.';\n }\n\n // Show current status\n const cap = router.getSessionBudget();\n const spent = router.getSessionSpend();\n if (!cap) {\n return `Session budget: none (no cap set)\\nSpent so far: $${spent.toFixed(6)}\\n\\nSet a cap with: /budget set <amount> (e.g. /budget set 0.50)`;\n }\n const remaining = Math.max(0, cap - spent);\n const pct = Math.min(100, Math.round((spent / cap) * 100));\n const bar = '█'.repeat(Math.round(pct / 5)) + '░'.repeat(20 - Math.round(pct / 5));\n return `Session budget: $${cap.toFixed(2)}\\nSpent: $${spent.toFixed(6)} (${pct}%)\\nRemaining: $${remaining.toFixed(6)}\\n[${bar}]`;\n },\n onCompact: async () => {\n const prompt = 'Please summarize our conversation so far to keep the context compact and efficient.';\n await handleSubmit(prompt);\n return 'Triggered context compaction. The agent will now summarize the history...';\n },\n onStatus: () => formatRuntimeStatus([...treeNodesRef.current.values()], nodeLogsRef.current),\n onTree: () => { \n dispatch({ type: 'TOGGLE_DETAILS' }); \n return 'Toggled agent tree visualization.'; \n },\n onSessions: async () => {\n const store = storeRef.current;\n if (!store) return 'No session store loaded.';\n const sessions = store.listSessions(undefined, 12);\n if (!sessions.length) return 'No saved sessions yet.';\n return sessions.map((s, idx) => `${idx + 1}. ${s.title}\\n id: ${s.id}\\n updated: ${new Date(s.updatedAt).toLocaleString()}\\n tokens: ${s.metadata.totalTokens} · cost: $${s.metadata.totalCostUsd.toFixed(4)}`).join('\\n\\n');\n },\n onIdentity: async (args) => {\n if (args.length === 0) {\n if (identities.length === 0) return 'No identities found.';\n const list = identities.map(id => {\n const isActive = id.id === currentIdentityId;\n const isDef = id.isDefault ? ' [Default]' : '';\n return ` ${isActive ? '●' : '○'} ${id.name} (${id.id.slice(0, 8)}...)${isDef}`;\n }).join('\\n');\n return `Available identities:\\n\\n${list}\\n\\nUse /identity <name|id> to switch.`;\n }\n const target = args.join(' ').trim();\n const match = identities.find((identity) => identity.id === target || identity.name.toLowerCase() === target.toLowerCase() || identity.id.startsWith(target));\n if (!match) return `Unknown identity: ${target}`;\n setCurrentIdentityId(match.id);\n storeRef.current?.updateSession(sessionIdRef.current, { identityId: match.id, updatedAt: new Date().toISOString() });\n return `Active identity set to ${match.name}`;\n },\n });\n\n if (result.output) {\n const safeOutput = stringifySlashOutput(result.output);\n const timestamp = new Date().toISOString();\n dispatch({ type: 'ADD_MESSAGE', message: { id: randomUUID(), role: 'assistant', content: safeOutput, timestamp } });\n persistMessage('assistant', safeOutput, timestamp);\n }\n }, [workspacePath, exit, state.messages, identities, currentIdentityId, persistMessage]);\n\n const handleSubmit = useCallback(async (userInput: string) => {\n if (slashCompletions.length > 0) {\n const selected = slashCompletions[slashIndex];\n if (selected && selected !== userInput.trim()) {\n setInput(selected + ' ');\n setSlashIndex(0);\n return;\n }\n }\n const trimmed = userInput.trim();\n if (!trimmed) return;\n if (state.isExecuting) {\n if (slashRef.current.isSlashCommand(trimmed)) {\n setInput('');\n await handleSlashCommand(trimmed);\n return;\n }\n setQueuedMessages(prev => [...prev, trimmed]);\n setInput('');\n return;\n }\n setInputHistory((prev) => [trimmed, ...prev.filter((item) => item !== trimmed)].slice(0, 100));\n setHistoryIndex(null);\n if (slashRef.current.isSlashCommand(trimmed)) { await handleSlashCommand(trimmed); return; }\n const timestamp = new Date().toISOString();\n dispatch({ type: 'ADD_MESSAGE', message: { id: randomUUID(), role: 'user', content: trimmed, timestamp } });\n persistMessage('user', trimmed, timestamp);\n lastUserPrompt.current = trimmed;\n lastSubmittedInputRef.current = trimmed;\n setInput('');\n dispatch({ type: 'SET_EXECUTING', isExecuting: true });\n dispatch({ type: 'SET_STREAMING', isStreaming: true });\n const cascade = cascadeRef.current;\n if (!cascade) {\n // Cascade failed to initialise — don't leave the UI stuck with\n // isExecuting=true (input field disabled, spinner running forever).\n dispatch({ type: 'SET_EXECUTING', isExecuting: false });\n dispatch({ type: 'SET_STREAMING', isStreaming: false });\n dispatch({ type: 'ADD_MESSAGE', message: { id: randomUUID(), role: 'error', content: 'Cascade not initialised. Check your configuration and restart.', timestamp: new Date().toISOString() } });\n return;\n }\n treeNodesRef.current.clear(); rebuildTree();\n const onRoot = ({ role }: RootTierEvent) => {\n const tierId = role === 'T1' ? 'T1' : `${role.toLowerCase()}-root` as 't2-root' | 't3-root';\n rootTierIdRef.current = tierId;\n recordNodeEvent({ tierId, role, label: 'Initializing', status: 'ACTIVE' });\n };\n let currentStreamBuffer = '';\n let streamThrottleTimeout: NodeJS.Timeout | null = null;\n const flushStream = () => { if (currentStreamBuffer) { dispatch({ type: 'APPEND_STREAM', text: currentStreamBuffer }); currentStreamBuffer = ''; } streamThrottleTimeout = null; };\n const onStream = ({ text, tierId }: { text: string; tierId: string }) => { \n if (tierId !== rootTierIdRef.current) return; // Hide non-root streams from main chat\n currentStreamBuffer += (text ?? ''); \n if (!streamThrottleTimeout) streamThrottleTimeout = setTimeout(flushStream, 50); \n };\n cascade.on('tier:root', onRoot);\n cascade.on('stream:token', onStream);\n cascade.on('tier:status', (ev: TierStatusEvent) => {\n recordNodeEvent(ev);\n const stats = cascade.getRouter().getStats();\n dispatch({ type: 'UPDATE_COST', tokens: stats.totalTokens, costUsd: stats.totalCostUsd, byProvider: stats.callsByProvider, byTier: stats.callsByTier, costByTier: stats.costByTier, tokensByTier: stats.tokensByTier });\n // Extract active tool from currentAction if present\n if (ev.currentAction?.startsWith('Using tool:')) {\n const toolName = ev.currentAction.replace('Using tool:', '').trim();\n dispatch({ type: 'SET_ACTIVE_TOOL', toolName });\n }\n });\n cascade.on('budget:warning', (payload: { spentUsd: number; capUsd: number; spendPct: number; remainingUsd: number }) => {\n const bar = '█'.repeat(Math.round(payload.spendPct / 10)) + '░'.repeat(10 - Math.round(payload.spendPct / 10));\n dispatch({\n type: 'ADD_MESSAGE',\n message: {\n id: randomUUID(),\n role: 'system',\n content: `⚠ Budget warning: ${payload.spendPct}% used ($${payload.spentUsd.toFixed(4)} of $${payload.capUsd.toFixed(2)}) — $${payload.remainingUsd.toFixed(4)} remaining [${bar}]`,\n timestamp: new Date().toISOString(),\n },\n });\n });\n cascade.on('budget:exceeded', (payload: { reason: string }) => {\n dispatch({\n type: 'ADD_MESSAGE',\n message: {\n id: randomUUID(),\n role: 'error',\n content: `Budget exceeded: ${payload.reason}. New LLM calls rejected.`,\n timestamp: new Date().toISOString(),\n },\n });\n });\n // Re-use the approval dialog for MCP server spawn requests. These are the\n // riskiest events we expose — an arbitrary subprocess.\n cascade.on('mcp:approval-required', (payload: { server: { name: string; command: string; args?: string[] } }) => {\n const server = payload.server;\n dispatch({\n type: 'SET_APPROVAL',\n request: {\n id: `mcp-${server.name}`,\n tierId: 'MCP',\n toolName: `mcp::${server.name}`,\n input: { command: server.command, args: server.args ?? [] },\n description: `Spawn MCP server \"${server.name}\" via command: ${server.command} ${server.args?.join(' ') ?? ''}`,\n isDangerous: true,\n },\n });\n approvalResolverRef.current = ({ approved }) => cascade.resolveMcpApproval(server.name, approved);\n });\n try {\n const result = await cascade.run({\n prompt: trimmed,\n workspacePath,\n identityId: currentIdentityId,\n conversationHistory: toConversationHistory(state.messages),\n approvalCallback: async (req) => {\n dispatch({ type: 'SET_APPROVAL', request: req });\n return new Promise<{ approved: boolean; always: boolean }>((resolve) => {\n approvalResolverRef.current = resolve;\n });\n }\n });\n flushStream();\n const stats = cascade.getRouter().getStats();\n dispatch({ type: 'UPDATE_COST', tokens: stats.totalTokens, costUsd: stats.totalCostUsd, byProvider: stats.callsByProvider, byTier: stats.callsByTier, costByTier: stats.costByTier, tokensByTier: stats.tokensByTier });\n dispatch({ type: 'COMMIT_STREAM', finalText: result.output, timestamp: new Date().toISOString() });\n persistMessage('assistant', result.output, new Date().toISOString());\n // Generate AI session name on first exchange (async, fire-and-forget)\n if (!sessionTitleGeneratedRef.current && storeRef.current) {\n sessionTitleGeneratedRef.current = true;\n generateSessionName(trimmed, cascadeRef.current).then(name => {\n if (name && storeRef.current) {\n storeRef.current.updateSession(sessionIdRef.current, { title: name, updatedAt: new Date().toISOString() });\n persistRuntimeSession('ACTIVE');\n }\n }).catch(() => { /* non-critical */ });\n }\n } catch (err: unknown) { \n const message = err instanceof Error ? err.message : String(err);\n dispatch({ type: 'ADD_MESSAGE', message: { id: randomUUID(), role: 'error', content: message, timestamp: new Date().toISOString() } }); \n }\n finally { \n cascade.removeAllListeners(); \n const finalStats = cascade.getRouter().getStats();\n const currentSession = storeRef.current?.getSession(sessionIdRef.current);\n if (currentSession) {\n storeRef.current?.updateSession(sessionIdRef.current, {\n metadata: {\n ...currentSession.metadata,\n totalTokens: finalStats.totalTokens,\n totalCostUsd: finalStats.totalCostUsd,\n }\n });\n }\n dispatch({ type: 'SET_EXECUTING', isExecuting: false });\n }\n }, [handleSlashCommand, persistMessage, state.messages, workspacePath, rebuildTree, recordNodeEvent, slashCompletions, slashIndex, state.isExecuting]);\n\n useInput((_input, key) => {\n // When the interactive model picker is open it owns the keyboard.\n // Let Ctrl+C still exit, but route every other key (incl. arrows, Enter,\n // Tab, number keys, Esc) to the picker's own useInput so navigation\n // isn't hijacked — this is the root-cause fix for the \"only ↑ worked\n // in the model selector\" regression.\n if (isShowingModels) {\n if (key.ctrl && _input === 'c') {\n if (quitAttempted) { exit(); return; }\n setQuitAttempted(true);\n }\n return;\n }\n if (key.ctrl && _input === 'c') {\n if (quitAttempted) {\n exit();\n return;\n }\n setQuitAttempted(true);\n return;\n }\n if (key.escape) {\n if (quitAttempted) { setQuitAttempted(false); return; }\n if (isShowingModels) { setIsShowingModels(false); return; }\n if (queuedMessages.length > 0) {\n setInput(queuedMessages[0]!);\n setQueuedMessages(p => p.slice(1));\n return;\n }\n // Restore last submitted message if input is empty and not currently executing\n if (!input && lastSubmittedInputRef.current && !state.isExecuting) {\n setInput(lastSubmittedInputRef.current);\n setHistoryIndex(null);\n return;\n }\n setInput('');\n setHistoryIndex(null);\n return;\n }\n if (key.upArrow && !input.includes('\\n')) {\n if (slashCompletions.length > 0) { setSlashIndex(p => (p <= 0 ? slashCompletions.length - 1 : p - 1)); return; }\n const nextIndex = historyIndex === null ? 0 : Math.min(historyIndex + 1, inputHistory.length - 1);\n if (inputHistory[nextIndex]) { setHistoryIndex(nextIndex); setInput(inputHistory[nextIndex]!); }\n } else if (key.downArrow && !input.includes('\\n')) {\n if (slashCompletions.length > 0) { setSlashIndex(p => (p + 1) % slashCompletions.length); return; }\n if (historyIndex === null) return;\n const nextIndex = historyIndex - 1; setHistoryIndex(nextIndex < 0 ? null : nextIndex); setInput(nextIndex < 0 ? '' : inputHistory[nextIndex]!);\n } else if (key.tab && slashCompletions.length > 0) {\n const selected = slashCompletions[slashIndex];\n if (selected) {\n setInput(selected + ' ');\n setSlashIndex(0);\n return;\n }\n }\n const maxScroll = Math.max(0, allLines.length - chatWindowHeight);\n if (key.pageUp || (key.shift && key.upArrow)) { \n setIsAutoScrolling(false); \n setScrollOffset(p => Math.max(0, p - 5)); \n }\n if (key.pageDown || (key.shift && key.downArrow)) { \n setScrollOffset(p => { \n const next = p + 5; \n if (next >= maxScroll) { setIsAutoScrolling(true); return maxScroll; }\n return next; \n }); \n }\n \n // Ensure slashIndex is handled when characters are deleted\n if ((key.backspace || key.delete) && slashCompletions.length > 0) {\n setSlashIndex(0);\n }\n });\n\n const allLinesRef = useRef<number>(0);\n const chatWindowHeightRef = useRef<number>(10);\n const isAutoScrollingRef = useRef<boolean>(true);\n\n const width = stdout?.columns ?? 100;\n const height = stdout?.rows ?? 24;\n \n // Calculate fixed element overhead accurately\n const headerHeight = 2; // Header + Border top\n const statusHeight = state.showDetails ? (state.agentTree ? 10 : 4) : 3;\n const costHeight = state.showCost ? 6 : 0;\n const approvalHeight = state.approvalRequest ? 12 : 0;\n const slashVisibleCount = Math.min(SLASH_PAGE_SIZE, slashEntries.length);\n const slashHeight = slashVisibleCount > 0 ? slashVisibleCount + 2 : 0; // +2 for border + header row\n const chromeHeight = statusHeight + costHeight + approvalHeight + slashHeight + 7; // Input(3) + Status(2) + Header(2) + Margin(2)\n const totalCap = Math.floor(height * 0.7);\n\n const availableHeight = Math.max(4, totalCap - chromeHeight);\n const allLines = formatToLines(\n state.isStreaming \n ? [...state.messages, { id: 'stream', role: 'assistant', content: state.streamBuffer, timestamp: new Date().toISOString() } as Message] \n : state.messages,\n width - 4,\n theme\n );\n\n const chatWindowHeight = Math.min(allLines.length || (state.isStreaming ? 0 : 4), availableHeight);\n const maxScroll = Math.max(0, allLines.length - chatWindowHeight);\n\n useEffect(() => {\n if (isAutoScrolling) {\n setScrollOffset(maxScroll);\n }\n }, [allLines.length, isAutoScrolling, maxScroll]);\n\n useEffect(() => {\n allLinesRef.current = allLines.length;\n chatWindowHeightRef.current = chatWindowHeight;\n isAutoScrollingRef.current = isAutoScrolling;\n }, [allLines.length, isAutoScrolling, chatWindowHeight]);\n\n useEffect(() => {\n // Enable mouse reporting (1000: mouse move/press, 1006: SGR mode).\n // SafeTextInput honours `manageMouseReporting={false}` so it won't disable\n // this on mount. Bracketed-paste mode is enabled by SafeTextInput itself.\n process.stdout.write('\\x1b[?1000h\\x1b[?1006h');\n\n const onData = (data: Buffer) => {\n const str = data.toString();\n\n // SGR mouse sequence → handle scroll wheel, swallow the rest.\n if (containsMouseSequence(str)) {\n // Lock input ONLY for mouse sequences to prevent them leaking into the prompt.\n // ⚠ Do NOT lock for all \\x1b sequences — that would block Delete (\\x1b[3~),\n // arrow keys, Home, End, and other navigation escape sequences.\n lockInputTemporarily();\n const mouseMatch = str.match(/\\x1b\\[<(\\d+);\\d+;\\d+[Mm]/);\n if (mouseMatch) {\n const code = parseInt(mouseMatch[1]!, 10);\n if (code === 64) { // Wheel Up\n setIsAutoScrolling(false);\n setScrollOffset(p => Math.max(0, p - 3));\n } else if (code === 65) { // Wheel Down\n setScrollOffset(p => {\n const next = p + 3;\n const max = Math.max(0, allLinesRef.current - chatWindowHeightRef.current);\n if (next >= max) { setIsAutoScrolling(true); return max; }\n return next;\n });\n }\n }\n return; // Consumed by mouse handler\n }\n\n // Forward-delete (\\x1b[3~) is handled by SafeTextInput's own raw-stdin\n // listener — it correctly removes the character AT the cursor, not the\n // last character of the buffer. We deliberately do NOT handle it here\n // to avoid double-deletions.\n };\n\n process.stdin.on('data', onData);\n return () => {\n process.stdout.write('\\x1b[?1000l\\x1b[?1006l');\n process.stdin.removeListener('data', onData);\n };\n }, [lockInputTemporarily]);\n\n const visibleLines = allLines.slice(scrollOffset, scrollOffset + chatWindowHeight);\n const showScrollAlert = !isAutoScrolling;\n const chatHeight = chatWindowHeight - (showScrollAlert ? 1 : 0);\n const currentIdentity = identities.find((id) => id.id === currentIdentityId)?.name ?? 'Default';\n const modelName = cascadeRef.current?.getRouter().getModelForTier('T1')?.name ?? 'Initializing...';\n\n return (\n <Box flexDirection=\"column\" width={width}>\n {/* ── Status bar — top, always visible ── */}\n <StatusBar\n theme={theme}\n tierModels={{\n t1: config.models?.t1,\n t2: config.models?.t2,\n t3: config.models?.t3,\n }}\n tokens={state.totalTokens}\n costUsd={state.totalCostUsd}\n workspacePath={workspacePath}\n isExecuting={state.isExecuting}\n activeTier={state.agentTree?.status === 'ACTIVE' ? 'T1' : undefined}\n />\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.colors.border} paddingX={1} height={chatWindowHeight + 2}>\n <Box flexDirection=\"column\" flexGrow={1} overflow=\"hidden\">\n {showScrollAlert && (\n <Box justifyContent=\"center\" height={1}>\n <Text backgroundColor=\"blue\" color=\"white\" bold> ⇡ SCROLLED UP — PgDn TO BOTTOM ⇣ </Text>\n </Box>\n )}\n <Box flexDirection=\"column\" height={chatHeight}>\n {visibleLines.map((line, i) => (\n <Text key={i}>{line}</Text>\n ))}\n </Box>\n </Box>\n </Box>\n\n <Box flexDirection=\"column\" paddingX={1}>\n {state.messages.length === 0 && !state.isStreaming && (\n <WelcomeBanner theme={theme} config={config} workspacePath={workspacePath} sessionId={sessionIdRef.current} />\n )}\n {isShowingModels && (\n <ModelsDisplay\n providers={config.providers.map(p => p.type)}\n modelsByProvider={cachedModels}\n onSelect={(sel) => { void applyModelPick(sel); }}\n onClose={() => setIsShowingModels(false)}\n />\n )}\n </Box>\n\n {/* ── Compact agent tree — auto-hides when idle ── */}\n <AgentTree root={state.agentTree} theme={theme} />\n\n {state.showDetails && (\n <TimelinePanel nodes={[...treeNodesRef.current.values()]} theme={theme} currentIndex={timelineIndex} onChangeIndex={setTimelineIndex} />\n )}\n {state.showCost && <CostTracker theme={theme} totalTokens={state.totalTokens} totalCostUsd={state.totalCostUsd} callsByProvider={state.callsByProvider} callsByTier={state.callsByTier} costByTier={state.costByTier} tokensByTier={state.tokensByTier} />}\n {state.approvalRequest && <ApprovalPrompt request={state.approvalRequest} theme={theme} onDecision={(decision) => { dispatch({ type: 'SET_APPROVAL', request: null }); approvalResolverRef.current?.(decision); }} />}\n {slashEntries.length > 0 && (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.colors.border} paddingX={1}>\n <Box flexDirection=\"row\" justifyContent=\"space-between\">\n <Text color={theme.colors.muted}>Commands ↑↓ navigate · ↵ select · Tab complete</Text>\n {slashEntries.length > SLASH_PAGE_SIZE && (\n <Text color={theme.colors.muted} dimColor>\n {slashIndex + 1}/{slashEntries.length}\n </Text>\n )}\n </Box>\n {slashViewStart > 0 && (\n <Text color={theme.colors.muted} dimColor> ↑ {slashViewStart} more above</Text>\n )}\n {slashEntries.slice(slashViewStart, slashViewStart + SLASH_PAGE_SIZE).map((entry, i) => {\n const globalIdx = slashViewStart + i;\n const isSelected = globalIdx === slashIndex;\n return (\n <Box key={entry.command} flexDirection=\"row\">\n <Text color={isSelected ? theme.colors.accent : theme.colors.foreground} bold={isSelected}>\n {isSelected ? '› ' : ' '}\n </Text>\n <Box width={16}>\n <Text color={isSelected ? theme.colors.accent : theme.colors.foreground} bold={isSelected}>\n {entry.command}\n </Text>\n </Box>\n {entry.description ? (\n <Text color={theme.colors.muted} dimColor> {entry.description}</Text>\n ) : null}\n </Box>\n );\n })}\n {slashViewStart + SLASH_PAGE_SIZE < slashEntries.length && (\n <Text color={theme.colors.muted} dimColor> ↓ {slashEntries.length - slashViewStart - SLASH_PAGE_SIZE} more below</Text>\n )}\n </Box>\n )}\n {/* ── Hint bar — keyboard shortcuts, hidden during execution ── */}\n <HintBar theme={theme} isExecuting={state.isExecuting} />\n\n <Box borderStyle=\"round\" borderColor={quitAttempted ? 'red' : (state.isStreaming ? theme.colors.accent : theme.colors.border)} paddingX={2} flexDirection=\"column\">\n {quitAttempted && (\n <Box marginBottom={0}>\n <Text color=\"red\" bold> Press Ctrl+C again to quit or ESC to return to TUI </Text>\n </Box>\n )}\n <Box flexDirection=\"row\">\n <Text color={theme.colors.primary} bold>▸ {queuedMessages.length > 0 ? <Text color={theme.colors.accent}>[QUEUED] </Text> : ''}</Text>\n <SafeTextInput\n focus={!state.approvalRequest && !isShowingModels}\n value={input}\n manageMouseReporting={false}\n onChange={(val) => {\n if (isInputLockedRef.current) return;\n // Defense in depth — SafeTextInput already sanitizes, but a brief\n // input-lock window can still pass through values we'd rather drop.\n setInput(sanitizeTerminalInput(val));\n }}\n onSubmit={handleSubmit}\n placeholder={state.isStreaming ? \"Wait for response or type next prompt to queue…\" : \"Ask Cascade anything… (/help for commands)\"}\n />\n </Box>\n </Box>\n </Box>\n );\n}\n\nfunction toConversationHistory(messages: Message[]): ConversationMessage[] {\n return messages\n .filter((m): m is Message & { role: 'user' | 'assistant' | 'system' } => m.role !== 'error')\n .map((m) => ({ role: m.role, content: m.content }));\n}\n\nfunction buildTreeFromFlatNodes(nodes: FlatTreeNode[]): TierNode | null {\n if (!nodes.length) return null;\n const cloned = new Map<string, FlatTreeNode>();\n for (const node of nodes) cloned.set(node.id, { ...node, children: [] });\n const roots: FlatTreeNode[] = [];\n for (const node of cloned.values()) {\n if (node.parentId && cloned.has(node.parentId)) cloned.get(node.parentId)!.children!.push(node);\n else roots.push(node);\n }\n return roots[0] || null;\n}\n\nasync function validateConfiguredModels(config: CascadeConfig): Promise<string | null> {\n const problems: string[] = [];\n if (config.models.t1 && !inferProviderFromModelId(config.models.t1, config.providers)) problems.push(`T1: ${config.models.t1}`);\n return problems.length ? `Model warnings: ${problems.join(', ')}` : null;\n}\n\nfunction inferProviderFromModelId(id: string, providers: CascadeConfig['providers']): ProviderType | null {\n const lower = id.toLowerCase();\n if (lower.includes('gpt')) return 'openai';\n if (lower.includes('claude')) return 'anthropic';\n if (lower.includes('gemini')) return 'gemini';\n return providers[0]?.type || null;\n}\n\nfunction listConfiguredProviders(config: CascadeConfig): string { return config.providers.map(p => p.type).join(', '); }\nfunction formatConfigSummary(config: CascadeConfig): string { return `Theme: ${config.theme}, Port: ${config.dashboard.port}`; }\nfunction stringifySlashOutput(val: unknown): string { return typeof val === 'string' ? val : JSON.stringify(val); }\nasync function searchSessionsAndMessages(query: string, workspacePath: string): Promise<string> {\n if (!query) return 'Usage: /search <query>';\n const dbPath = path.join(workspacePath, CASCADE_DB_FILE);\n \n // Check if DB exists\n try {\n await fs.access(dbPath);\n } catch {\n return 'No database found. Start a conversation first.';\n }\n\n const store = new MemoryStore(dbPath);\n try {\n const sessions = store.listSessions(undefined, 20).filter((s) => s.title.toLowerCase().includes(query.toLowerCase()));\n const messages = store.searchMessages(query, 20);\n \n if (sessions.length === 0 && messages.length === 0) {\n return `No results found for \"${query}\".`;\n }\n\n const lines = [\n `🔍 Search results for \"${query}\":`,\n '',\n `📂 Sessions (${sessions.length}):`,\n ...sessions.slice(0, 5).map((s) => ` - ${s.title} (ID: ${s.id.slice(0, 8)}...)`),\n sessions.length > 5 ? ` ... and ${sessions.length - 5} more` : '',\n '',\n `💬 Messages (${messages.length}):`,\n ...messages.slice(0, 8).map((m) => ` - [${m.role.toUpperCase()}] ${m.content.slice(0, 100)}${m.content.length > 100 ? '...' : ''}`),\n messages.length > 8 ? ` ... and ${messages.length - 8} more` : '',\n ];\n return lines.filter(Boolean).join('\\n');\n } catch (err: unknown) {\n return `Search failed: ${err instanceof Error ? err.message : String(err)}`;\n } finally { store.close(); }\n}\n\nasync function diagnoseRuntime(config: CascadeConfig, workspacePath: string): Promise<string> {\n const providers = config.providers.map((p) => `${p.type}${p.apiKey ? ' (key set)' : ' (no key)'}`).join('\\n');\n const models = [`T1: ${config.models.t1 ?? 'default'}`, `T2: ${config.models.t2 ?? 'default'}`, `T3: ${config.models.t3 ?? 'default'}`].join('\\n');\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n try {\n const sessions = store.listSessions(undefined, 3);\n return [\n 'Provider checks:', providers || 'No providers configured.', '',\n 'Configured models:', models, '',\n `Local sessions: ${sessions.length}`,\n ...sessions.map((s) => `- ${s.title} (${s.id})`),\n ].join('\\n');\n } finally { store.close(); }\n}\n\nasync function showRecentLogs(args: string[], workspacePath: string): Promise<string> {\n const limit = Number.parseInt(args[0] ?? '10', 10) || 10;\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n try {\n const logs = store.listRuntimeNodeLogs(undefined, undefined, limit);\n if (!logs.length) return 'No recent runtime logs.';\n return logs.map((log) => `[${log.timestamp}] ${log.role} ${log.label} — ${log.status}${log.currentAction ? ` — ${log.currentAction}` : ''}`).join('\\n');\n } finally { store.close(); }\n}\n\ninterface SessionResumeSnapshot {\n session: Session;\n messages: Message[];\n runtimeNodes: RuntimeNode[];\n runtimeLogs: RuntimeNodeLog[];\n}\n\nasync function loadSessionSnapshot(args: string[], workspacePath: string): Promise<SessionResumeSnapshot | string> {\n const sessionId = args[0];\n if (!sessionId) return 'Usage: /resume <sessionId>';\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n try {\n const session = store.getSession(sessionId);\n if (!session) return `Session not found: ${sessionId}`;\n return {\n session,\n messages: session.messages.map((m) => ({ id: m.id, role: m.role, content: m.content, timestamp: m.timestamp })),\n runtimeNodes: store.listRuntimeNodes(sessionId, 500),\n runtimeLogs: store.listRuntimeNodeLogs(sessionId, undefined, 500),\n };\n } finally { store.close(); }\n}\n\nfunction hydrateResumeState(snapshot: SessionResumeSnapshot, options: {\n dispatch: React.Dispatch<ReplAction>;\n treeNodesRef: React.MutableRefObject<Map<string, FlatTreeNode>>;\n nodeLogsRef: React.MutableRefObject<Map<string, string[]>>;\n sessionIdRef: React.MutableRefObject<string>;\n startedAtRef: React.MutableRefObject<string>;\n setInputHistory: React.Dispatch<React.SetStateAction<string[]>>;\n setHistoryIndex: React.Dispatch<React.SetStateAction<number | null>>;\n setCurrentIdentityId: React.Dispatch<React.SetStateAction<string | undefined>>;\n storeRef: React.MutableRefObject<MemoryStore | null>;\n}) {\n const { dispatch, treeNodesRef, nodeLogsRef, sessionIdRef, startedAtRef, setInputHistory, setHistoryIndex, setCurrentIdentityId, storeRef } = options;\n sessionIdRef.current = snapshot.session.id;\n startedAtRef.current = snapshot.session.createdAt;\n setInputHistory(snapshot.messages.filter((m) => m.role === 'user').map((m) => m.content));\n setHistoryIndex(null);\n setCurrentIdentityId(snapshot.session.identityId);\n dispatch({ type: 'CLEAR' });\n for (const msg of snapshot.messages) { dispatch({ type: 'ADD_MESSAGE', message: msg } as ReplAction); }\n treeNodesRef.current.clear();\n nodeLogsRef.current.clear();\n for (const node of snapshot.runtimeNodes) {\n treeNodesRef.current.set(node.tierId, { id: node.tierId, role: node.role, label: node.label, status: node.status, currentAction: node.currentAction, progressPct: node.progressPct, children: [], parentId: node.parentId });\n }\n for (const log of snapshot.runtimeLogs) {\n const history = nodeLogsRef.current.get(log.tierId) ?? [];\n nodeLogsRef.current.set(log.tierId, [...history.slice(-24), [log.status, log.currentAction].filter(Boolean).join(' — ')]);\n }\n dispatch({ type: 'SET_TREE', tree: buildTreeFromFlatNodes([...treeNodesRef.current.values()]) });\n storeRef.current?.updateSession(snapshot.session.id, { updatedAt: new Date().toISOString() });\n}\n\nfunction formatRuntimeStatus(nodes: FlatTreeNode[], nodeLogs: Map<string, string[]>): string {\n if (!nodes.length) return 'No active agent tree.';\n const active = nodes.filter((node) => node.status === 'ACTIVE');\n const failed = nodes.filter((node) => node.status === 'FAILED' || node.status === 'ESCALATED');\n const lines = [`Active nodes: ${active.length}`, `Failed nodes: ${failed.length}`, ''];\n for (const node of [...active, ...failed].slice(0, 10)) {\n lines.push(`[${node.role}] ${node.label} — ${node.status}`);\n const recent = (nodeLogs.get(node.id) ?? []).slice(-2);\n for (const entry of recent) lines.push(` · ${entry}`);\n }\n return lines.join('\\n');\n}\n\nasync function generateSessionName(firstMessage: string, cascade: Cascade | null): Promise<string | null> {\n if (!cascade) return null;\n try {\n const router = cascade.getRouter();\n const prompt = `Generate a concise 3-5 word session title for this AI conversation. Return ONLY the title, no punctuation, no quotes.\\n\\nFirst message: \"${firstMessage.slice(0, 200)}\"`;\n const result = await router.generate('T3', {\n messages: [{ role: 'user', content: prompt }],\n maxTokens: 20,\n });\n const name = result.content.trim().replace(/^[\"']|[\"']$/g, '').slice(0, 60);\n return name || null;\n } catch {\n return null;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Model Router\n// ─────────────────────────────────────────────\n\nimport EventEmitter from 'node:events';\nimport type {\n CascadeConfig,\n GenerateOptions,\n GenerateResult,\n ModelInfo,\n ProviderConfig,\n ProviderType,\n StreamChunk,\n TierRole,\n TokenUsage,\n} from '../../types.js';\nimport { AnthropicProvider } from '../../providers/anthropic.js';\nimport { AzureOpenAIProvider } from '../../providers/azure.js';\nimport { GeminiProvider } from '../../providers/gemini.js';\nimport { OllamaProvider } from '../../providers/ollama.js';\nimport { OpenAICompatibleProvider } from '../../providers/openai-compatible.js';\nimport { OpenAIProvider } from '../../providers/openai.js';\nimport type { BaseProvider } from '../../providers/base.js';\nimport { ModelSelector } from './selector.js';\nimport { FailoverManager } from './failover.js';\nimport { TpmLimiter } from './tpm-limiter.js';\nimport { 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 — 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 — 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 const existing = this.peerSyncBuffer.find(p => p.fromId === fromId);\n if (existing) {\n existing.content = content;\n existing.timestamp = new Date().toISOString();\n } else {\n this.peerSyncBuffer.push({ fromId, content, timestamp: new Date().toISOString() });\n }\n this.emit('peer-sync-received', { fromId, content });\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: () => [...this.peerSyncBuffer],\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 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\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 const prompt = `Summarize these T3 worker outputs for section \"${assignment.sectionTitle}\" in 2-3 sentences:\\n\\n${outputs}`;\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 — 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 — 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 — 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 — 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 — 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 — 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 — Theme Registry\n// ─────────────────────────────────────────────\n\nimport type { Theme, ThemeName } from '../../types.js';\n\nconst cascadeTheme: Theme = {\n name: 'cascade',\n colors: {\n primary: '#7C6AF7', // Cascade violet\n secondary: '#A78BFA',\n accent: '#06B6D4', // Cyan\n success: '#10B981',\n warning: '#F59E0B',\n error: '#EF4444',\n info: '#3B82F6',\n muted: '#6B7280',\n background: '#0F0F1A',\n foreground: '#E2E8F0',\n border: '#2D2B55',\n t1Color: '#7C6AF7', // Violet\n t2Color: '#06B6D4', // Cyan\n t3Color: '#10B981', // Green\n },\n};\n\nconst darkTheme: Theme = {\n name: 'dark',\n colors: {\n primary: '#60A5FA',\n secondary: '#818CF8',\n accent: '#34D399',\n success: '#34D399',\n warning: '#FBBF24',\n error: '#F87171',\n info: '#60A5FA',\n muted: '#6B7280',\n background: '#111827',\n foreground: '#F9FAFB',\n border: '#374151',\n t1Color: '#60A5FA',\n t2Color: '#818CF8',\n t3Color: '#34D399',\n },\n};\n\nconst lightTheme: Theme = {\n name: 'light',\n colors: {\n primary: '#2563EB',\n secondary: '#7C3AED',\n accent: '#0891B2',\n success: '#059669',\n warning: '#D97706',\n error: '#DC2626',\n info: '#2563EB',\n muted: '#6B7280',\n background: '#FFFFFF',\n foreground: '#111827',\n border: '#E5E7EB',\n t1Color: '#2563EB',\n t2Color: '#7C3AED',\n t3Color: '#059669',\n },\n};\n\nconst draculaTheme: Theme = {\n name: 'dracula',\n colors: {\n primary: '#BD93F9',\n secondary: '#FF79C6',\n accent: '#8BE9FD',\n success: '#50FA7B',\n warning: '#FFB86C',\n error: '#FF5555',\n info: '#8BE9FD',\n muted: '#6272A4',\n background: '#282A36',\n foreground: '#F8F8F2',\n border: '#44475A',\n t1Color: '#BD93F9',\n t2Color: '#FF79C6',\n t3Color: '#50FA7B',\n },\n};\n\nconst nordTheme: Theme = {\n name: 'nord',\n colors: {\n primary: '#88C0D0',\n secondary: '#81A1C1',\n accent: '#A3BE8C',\n success: '#A3BE8C',\n warning: '#EBCB8B',\n error: '#BF616A',\n info: '#5E81AC',\n muted: '#4C566A',\n background: '#2E3440',\n foreground: '#ECEFF4',\n border: '#3B4252',\n t1Color: '#88C0D0',\n t2Color: '#81A1C1',\n t3Color: '#A3BE8C',\n },\n};\n\nconst solarizedTheme: Theme = {\n name: 'solarized',\n colors: {\n primary: '#268BD2',\n secondary: '#2AA198',\n accent: '#B58900',\n success: '#859900',\n warning: '#CB4B16',\n error: '#DC322F',\n info: '#268BD2',\n muted: '#657B83',\n background: '#002B36',\n foreground: '#839496',\n border: '#073642',\n t1Color: '#268BD2',\n t2Color: '#2AA198',\n t3Color: '#859900',\n },\n};\n\nconst themes: Map<ThemeName, Theme> = new Map([\n ['cascade', cascadeTheme],\n ['dark', darkTheme],\n ['light', lightTheme],\n ['dracula', draculaTheme],\n ['nord', nordTheme],\n ['solarized', solarizedTheme],\n]);\n\nexport function getTheme(name: ThemeName | string): Theme {\n return themes.get(name as ThemeName) ?? cascadeTheme;\n}\n\nexport function listThemes(): Theme[] {\n return Array.from(themes.values());\n}\n\nexport { cascadeTheme, darkTheme, lightTheme, draculaTheme, nordTheme, solarizedTheme };\n","// ─────────────────────────────────────────────\n// Cascade AI — Slash Command Registry\n// ─────────────────────────────────────────────\n\nimport { THEME_NAMES } from '../../constants.js';\n\nexport interface SlashCommand {\n command: string;\n description: string;\n args?: string[];\n handler: (args: string[], ctx: SlashCommandContext) => Promise<SlashCommandResult> | SlashCommandResult;\n}\n\nexport interface SlashCommandContext {\n sessionId: string;\n workspacePath: string;\n onOutput: (text: string) => void;\n onClear: () => void;\n onExit: () => void;\n onThemeChange: (theme: string) => void;\n onExport: (format: 'markdown' | 'json') => Promise<void>;\n onRollback: () => Promise<string | void>;\n onBranch: () => Promise<void>;\n onModelInfo: () => string | Promise<string>;\n /** Opens the interactive provider → tier → model picker (Claude-Code-style). */\n onModelPicker: () => string | Promise<string>;\n onModelsInfo: () => string | Promise<string>;\n onProvidersInfo: () => string | Promise<string>;\n onConfigInfo: () => string | Promise<string>;\n onCostInfo: () => string | Promise<string>;\n onBudget: (args: string[]) => string | Promise<string>;\n onCompact: () => Promise<string | void>;\n onStatus: () => string | Promise<string>;\n onSessions: (args: string[]) => Promise<string> | string;\n onIdentity: (args: string[]) => Promise<string> | string;\n onRetry: () => Promise<string> | string;\n onSearch: (args: string[]) => Promise<string> | string;\n onDiagnose: () => Promise<string> | string;\n onLogs: (args: string[]) => Promise<string> | string;\n onTree: () => string;\n onResume: (args: string[]) => Promise<string> | string;\n onMcpList: () => string | Promise<string>;\n}\n\nexport interface SlashCommandResult {\n output?: string | Promise<string>;\n handled: boolean;\n}\n\nexport class SlashCommandRegistry {\n private commands: Map<string, SlashCommand> = new Map();\n\n constructor() {\n this.registerDefaults();\n }\n\n register(cmd: SlashCommand): void {\n this.commands.set(cmd.command, cmd);\n }\n\n async handle(input: string, ctx: SlashCommandContext): Promise<SlashCommandResult> {\n const [command, ...args] = input.trim().split(/\\s+/);\n const cmd = this.commands.get(command ?? '');\n if (!cmd) return { handled: false };\n const result = await cmd.handler(args, ctx);\n if (result.output instanceof Promise) {\n result.output = await result.output;\n }\n return result as { output?: string; handled: boolean };\n }\n\n isSlashCommand(input: string): boolean {\n return input.trim().startsWith('/');\n }\n\n getCompletions(partial: string): string[] {\n return Array.from(this.commands.keys()).filter((c) => c.startsWith(partial));\n }\n\n /** Returns completions as {command, description} pairs — used by the REPL suggestion list. */\n getCompletionEntries(partial: string): Array<{ command: string; description: string }> {\n return Array.from(this.commands.values())\n .filter((c) => c.command.startsWith(partial))\n .map((c) => ({ command: c.command, description: c.description }));\n }\n\n getAll(): SlashCommand[] {\n return Array.from(this.commands.values());\n }\n\n private registerDefaults(): void {\n this.register({\n command: '/help',\n description: 'Show available commands',\n handler: (_args, ctx) => {\n const lines = this.getAll()\n .filter((c) => c.command !== '/help')\n .map((c) => ` ${c.command.padEnd(14)} ${c.description}`);\n ctx.onOutput(['', 'Cascade AI — Slash Commands', '─'.repeat(40), ...lines, ''].join('\\n'));\n return { handled: true };\n },\n });\n\n this.register({\n command: '/clear',\n description: 'Clear the conversation',\n handler: (_args, ctx) => {\n ctx.onClear();\n return { handled: true };\n },\n });\n\n this.register({\n command: '/exit',\n description: 'Exit Cascade',\n handler: (_args, ctx) => {\n ctx.onExit();\n return { handled: true };\n },\n });\n\n this.register({\n command: '/theme',\n description: 'Switch color theme',\n handler: (args, ctx) => {\n const name = args[0];\n if (!name) {\n ctx.onOutput(`Available themes: ${THEME_NAMES.join(', ')}`);\n return { handled: true };\n }\n if (!THEME_NAMES.includes(name as never)) {\n return { output: `Unknown theme: ${name}. Available: ${THEME_NAMES.join(', ')}`, handled: true };\n }\n ctx.onThemeChange(name);\n return { output: `Theme switched to: ${name}`, handled: true };\n },\n });\n\n this.register({\n command: '/export',\n description: 'Export session (markdown|json)',\n handler: async (args, ctx) => {\n const format = (args[0] as 'markdown' | 'json' | undefined) ?? 'markdown';\n await ctx.onExport(format);\n return { output: `Session exported as ${format}`, handled: true };\n },\n });\n\n this.register({\n command: '/rollback',\n description: 'Undo all file changes in this session',\n handler: async (_args, ctx) => {\n const out = await ctx.onRollback();\n return { output: out || 'File changes rolled back.', handled: true };\n },\n });\n\n this.register({\n command: '/branch',\n description: 'Fork current session into parallel branches',\n handler: async (_args, ctx) => {\n await ctx.onBranch();\n return { output: 'Session branched.', handled: true };\n },\n });\n\n this.register({\n command: '/model',\n description: 'Pick a provider and model for a tier (interactive)',\n handler: (_args, ctx) => ({ output: ctx.onModelPicker(), handled: true }),\n });\n\n this.register({\n command: '/model-info',\n description: 'Show active models per tier',\n handler: (_args, ctx) => ({ output: ctx.onModelInfo(), handled: true }),\n });\n\n this.register({\n command: '/models',\n description: 'Browse available models by provider',\n handler: (_args, ctx) => ({ output: ctx.onModelsInfo(), handled: true }),\n });\n\n this.register({\n command: '/providers',\n description: 'Show configured providers',\n handler: (_args, ctx) => ({ output: ctx.onProvidersInfo(), handled: true }),\n });\n\n this.register({\n command: '/config',\n description: 'Show active configuration summary',\n handler: (_args, ctx) => ({ output: ctx.onConfigInfo(), handled: true }),\n });\n\n this.register({\n command: '/retry',\n description: 'Retry the last user prompt',\n handler: async (_args, ctx) => ({ output: await ctx.onRetry(), handled: true }),\n });\n\n this.register({\n command: '/search',\n description: 'Search past sessions/messages',\n handler: async (args, ctx) => ({ output: await ctx.onSearch(args), handled: true }),\n });\n\n this.register({\n command: '/diagnose',\n description: 'Run provider/model/config health checks',\n handler: async (_args, ctx) => ({ output: await ctx.onDiagnose(), handled: true }),\n });\n\n this.register({\n command: '/logs',\n description: 'Show recent runtime logs',\n handler: async (args, ctx) => ({ output: await ctx.onLogs(args), handled: true }),\n });\n\n this.register({\n command: '/tree',\n description: 'Show current agent tree as text',\n handler: (_args, ctx) => ({ output: ctx.onTree(), handled: true }),\n });\n\n this.register({\n command: '/resume',\n description: 'Resume a session by ID',\n handler: async (args, ctx) => ({ output: await ctx.onResume(args), handled: true }),\n });\n\n this.register({\n command: '/mcp',\n description: 'List and manage MCP servers',\n handler: async (_args, ctx) => ({ output: await ctx.onMcpList(), handled: true }),\n });\n\n this.register({\n command: '/cost',\n description: 'Show session cost and token usage',\n handler: (_args, ctx) => {\n return { output: ctx.onCostInfo(), handled: true };\n },\n });\n\n this.register({\n command: '/budget',\n description: 'Manage session budget cap /budget [set <$amount> | clear]',\n args: ['set <amount>', 'clear'],\n handler: (args, ctx) => ({ output: ctx.onBudget(args), handled: true }),\n });\n\n this.register({\n command: '/status',\n description: 'Show active agent tree status',\n handler: (_args, ctx) => ({ output: ctx.onStatus(), handled: true }),\n });\n\n this.register({\n command: '/sessions',\n description: 'List and resume past sessions',\n handler: async (args, ctx) => ({ output: await ctx.onSessions(args), handled: true }),\n });\n\n this.register({\n command: '/identity',\n description: 'Switch active identity',\n handler: async (args, ctx) => ({ output: await ctx.onIdentity(args), handled: true }),\n });\n\n this.register({\n command: '/compact',\n description: 'Compact/summarize context now',\n handler: async (_args, ctx) => {\n const out = await ctx.onCompact();\n return { output: out || 'Context compacted.', handled: true };\n },\n });\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Live Agent Tree (compact, Claude Code style)\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport type { Theme } from '../../../types.js';\n\nexport interface TierNode {\n id: string;\n role: 'T1' | 'T2' | 'T3';\n label: string;\n status: 'IDLE' | 'ACTIVE' | 'COMPLETED' | 'FAILED' | 'ESCALATED';\n currentAction?: string;\n progressPct?: number;\n children?: TierNode[];\n}\n\ninterface AgentTreeProps {\n root: TierNode | null;\n theme: Theme;\n onToggleCollapse?: (nodeId: string) => void;\n}\n\nexport function AgentTree({ root, theme }: AgentTreeProps): React.ReactElement | null {\n if (!root) return null;\n\n // Only render when something is actually running or recently ran\n const isActive = hasActiveOrFailed(root);\n if (!isActive) return null;\n\n const t2Count = countByRole(root, 'T2');\n const t3Count = countByRole(root, 'T3');\n const t2Active = countByRoleAndStatus(root, 'T2', 'ACTIVE');\n const t3Active = countByRoleAndStatus(root, 'T3', 'ACTIVE');\n\n const headerAction = root.currentAction?.slice(0, 45) ?? '';\n const t2Label = t2Count > 0 ? ` → T2×${t2Count}` : '';\n const t3Label = t3Count > 0 ? ` → T3×${t3Count}` : '';\n const activeLabel = (t2Active + t3Active) > 0\n ? ` (${t2Active + t3Active} active)`\n : '';\n\n return (\n <Box flexDirection=\"column\" marginY={0} paddingLeft={1}>\n {/* Header line: ◈ T1 → T2×3 → T3×12 (action) spinner */}\n <Box>\n <Text color={theme.colors.primary} bold>◈ T1{t2Label}{t3Label}</Text>\n {activeLabel ? <Text color={theme.colors.muted}>{activeLabel}</Text> : null}\n {headerAction ? <Text color={theme.colors.muted}> {headerAction}</Text> : null}\n <Text> </Text>\n {root.status === 'ACTIVE'\n ? <><Spinner type=\"dots\" /></>\n : root.status === 'COMPLETED'\n ? <Text color={theme.colors.success}> ✔</Text>\n : root.status === 'FAILED'\n ? <Text color={theme.colors.error}> ✘</Text>\n : null}\n </Box>\n\n {/* T2 rows — depth-capped, max 6 visible */}\n {root.children?.slice(0, 6).map((child, i, arr) => (\n <T2Row\n key={child.id}\n node={child}\n theme={theme}\n isLast={i === arr.length - 1}\n />\n ))}\n {(root.children?.length ?? 0) > 6 && (\n <Text color={theme.colors.muted}> └─ …{(root.children?.length ?? 0) - 6} more sections</Text>\n )}\n </Box>\n );\n}\n\ninterface T2RowProps {\n node: TierNode;\n theme: Theme;\n isLast: boolean;\n}\n\nfunction T2Row({ node, theme, isLast }: T2RowProps): React.ReactElement {\n const connector = isLast ? '└─ ' : '├─ ';\n const t3Active = countByRoleAndStatus(node, 'T3', 'ACTIVE');\n const t3Total = countByRole(node, 'T3');\n const workerSuffix = t3Total > 0 ? ` T3×${t3Total}` : '';\n\n const label = stripRolePrefix(node.label, node.role);\n const action = node.currentAction ? ` ${node.currentAction.slice(0, 38)}` : '';\n\n return (\n <Box>\n <Text color={theme.colors.muted}> {connector}</Text>\n <Text color={theme.colors.t2Color} bold>[T2]</Text>\n <Text color={theme.colors.foreground}> {label}</Text>\n {workerSuffix ? <Text color={theme.colors.muted}>{workerSuffix}</Text> : null}\n {node.status === 'ACTIVE' && (\n <>\n {action ? <Text color={theme.colors.muted}>{action}</Text> : null}\n <Text> </Text><Spinner type=\"dots\" />\n {t3Active > 0 ? <Text color={theme.colors.muted}> ({t3Active} running)</Text> : null}\n </>\n )}\n {node.status === 'COMPLETED' && <Text color={theme.colors.success}> ✔</Text>}\n {node.status === 'FAILED' && <Text color={theme.colors.error}> ✘</Text>}\n {node.status === 'ESCALATED' && <Text color={theme.colors.warning}> ▲</Text>}\n </Box>\n );\n}\n\nfunction hasActiveOrFailed(node: TierNode): boolean {\n if (node.status === 'ACTIVE' || node.status === 'FAILED') return true;\n return node.children?.some(hasActiveOrFailed) ?? false;\n}\n\nfunction countByRole(node: TierNode, role: TierNode['role']): number {\n const self = node.role === role ? 1 : 0;\n return self + (node.children?.reduce((a, c) => a + countByRole(c, role), 0) ?? 0);\n}\n\nfunction countByRoleAndStatus(node: TierNode, role: TierNode['role'], status: TierNode['status']): number {\n const self = node.role === role && node.status === status ? 1 : 0;\n return self + (node.children?.reduce((a, c) => a + countByRoleAndStatus(c, role, status), 0) ?? 0);\n}\n\nfunction stripRolePrefix(label: string, role: string): string {\n return label.replace(new RegExp(`^\\\\[${role}\\\\]\\\\s*`, 'i'), '');\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Execution Timeline Panel\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport type { Theme } from '../../../types.js';\nimport type { TierNode } from './AgentTree.js';\n\ninterface TimelinePanelProps {\n nodes: TierNode[];\n theme: Theme;\n currentIndex: number;\n onChangeIndex?: (index: number) => void;\n}\n\nexport function TimelinePanel({ nodes, theme, currentIndex }: TimelinePanelProps): React.ReactElement | null {\n if (!nodes.length) return null;\n\n const entries = [...nodes].sort((a, b) => a.id.localeCompare(b.id));\n const selected = entries[Math.min(currentIndex, entries.length - 1)] ?? entries[0];\n\n return (\n <Box flexDirection=\"column\" marginTop={0}>\n <Text bold color={theme.colors.muted}>Activity Log</Text>\n <Box flexDirection=\"column\" marginTop={0}>\n {entries.slice(-3).map((node) => (\n <Text key={node.id} color={theme.colors.accent}>\n [{node.role}] {node.label} — {node.status}\n </Text>\n ))}\n </Box>\n </Box>\n );\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Status Bar (top, Claude Code style)\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport type { Theme } from '../../../types.js';\n\ninterface StatusBarProps {\n theme: Theme;\n tierModels: { t1?: string; t2?: string; t3?: string };\n tokens: number;\n costUsd: number;\n workspacePath: string;\n isExecuting: boolean;\n activeTier?: string;\n}\n\nexport function StatusBar({\n theme,\n tierModels,\n tokens,\n costUsd,\n workspacePath,\n isExecuting,\n activeTier,\n}: StatusBarProps): React.ReactElement {\n const { stdout } = useStdout();\n const width = (stdout?.columns ?? 80) - 2;\n\n const t1Label = tierModels.t1 ? truncate(tierModels.t1, 18) : 'auto';\n const folderName = workspacePath.split(/[/\\\\]/).pop() ?? workspacePath;\n const tierIndicator = activeTier ? ` [${activeTier}]` : '';\n\n const left = ` ◈ CASCADE${tierIndicator} `;\n const mid = ` ${truncate(folderName, 24)} T1:${t1Label} `;\n const right = ` ${formatTokens(tokens)} · $${costUsd.toFixed(4)} ${isExecuting ? '⚡' : '·'} `;\n\n const totalUsed = left.length + mid.length + right.length;\n const gap = Math.max(0, width - totalUsed);\n const leftGap = ' '.repeat(Math.floor(gap / 2));\n const rightGap = ' '.repeat(Math.ceil(gap / 2));\n\n return (\n <Box\n borderStyle=\"single\"\n borderTop={false}\n borderBottom={true}\n borderLeft={false}\n borderRight={false}\n borderColor={theme.colors.border}\n width={width + 2}\n >\n <Text backgroundColor={theme.colors.primary} color={theme.colors.background} bold>{left}</Text>\n <Text color={theme.colors.muted}>{leftGap}{mid}{rightGap}</Text>\n <Text color={theme.colors.muted}>{right}</Text>\n </Box>\n );\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M tok`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K tok`;\n return `${n} tok`;\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Keyboard Hint Bar\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport type { Theme } from '../../../types.js';\n\ninterface HintBarProps {\n theme: Theme;\n isExecuting: boolean;\n}\n\nexport function HintBar({ theme, isExecuting }: HintBarProps): React.ReactElement | null {\n // Hide during execution to reclaim vertical space\n if (isExecuting) return null;\n\n return (\n <Box paddingLeft={1}>\n <Text color={theme.colors.muted} dimColor>\n {'Esc cancel · ↑↓ history · / commands · Ctrl+C exit'}\n </Text>\n </Box>\n );\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Approval Prompt\n// ─────────────────────────────────────────────\n\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ApprovalRequest, Theme } from '../../../types.js';\n\ninterface ApprovalPromptProps {\n request: ApprovalRequest;\n theme: Theme;\n onDecision: (decision: { approved: boolean; always: boolean }) => void;\n}\n\nexport function ApprovalPrompt({ request, theme, onDecision }: ApprovalPromptProps): React.ReactElement {\n const [decided, setDecided] = useState(false);\n\n useInput((input, key) => {\n if (decided) return;\n if (input === 'a' || input === 'A') {\n setDecided(true);\n onDecision({ approved: true, always: true });\n } else if (input === 'y' || input === 'Y') {\n setDecided(true);\n onDecision({ approved: true, always: false });\n } else if (input === 'n' || input === 'N' || key.escape) {\n setDecided(true);\n onDecision({ approved: false, always: false });\n }\n });\n\n const borderColor = request.isDangerous ? theme.colors.error : theme.colors.warning;\n const icon = request.isDangerous ? '⚠' : '?';\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n paddingX={2}\n paddingY={1}\n marginY={1}\n >\n <Text color={borderColor} bold>{icon} Approval Required</Text>\n <Text color={theme.colors.muted}>Agent: {request.tierId}</Text>\n <Text color={theme.colors.foreground} bold>Tool: {request.toolName}</Text>\n <Box marginTop={1} height={4}>\n <Text color={theme.colors.muted}>Input: </Text>\n <Text>{JSON.stringify(request.input, null, 2).slice(0, 200).split('\\n').slice(0, 4).join('\\n')}</Text>\n </Box>\n <Box marginTop={1}>\n {!decided ? (\n <Text>\n <Text color={theme.colors.success} bold>[a]</Text>\n <Text color={theme.colors.muted}> Allow Always </Text>\n <Text color={theme.colors.success} bold>[y]</Text>\n <Text color={theme.colors.muted}> Allow </Text>\n <Text color={theme.colors.error} bold>[n]</Text>\n <Text color={theme.colors.muted}> Deny </Text>\n <Text color={theme.colors.muted}>[Esc] Deny</Text>\n </Text>\n ) : (\n <Text color={theme.colors.muted}>Responding...</Text>\n )}\n </Box>\n </Box>\n );\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Interactive Model Picker\n// ─────────────────────────────────────────────\n//\n// Three-step picker, modelled after Claude Code's `/model` UX:\n//\n// 1. PROVIDER — list of configured providers + \"Auto\"\n// 2. TIER — T1 / T2 / T3 (which tier to configure)\n// 3. MODEL — list of models for that provider + \"Auto\"\n//\n// Both ↑ and ↓ arrows (plus j/k and Tab) move the cursor. Enter confirms,\n// Esc goes back one step (and closes the picker from the first step).\n// The previous build used ink-select-input which only responded to\n// the up arrow inside this component due to the REPL intercepting\n// key.downArrow for history navigation — we now roll our own key\n// handler so the picker is unambiguously the focused surface.\n\nimport React, { useMemo, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ModelInfo, ProviderType, TierRole } from '../../../types.js';\n\nexport type ModelPickerSelection =\n | { kind: 'auto'; tier: TierRole }\n | { kind: 'pick'; tier: TierRole; modelId: string; provider: ProviderType };\n\ninterface Props {\n providers: ProviderType[];\n modelsByProvider: Map<ProviderType, ModelInfo[]>;\n /** When the user confirms a selection, the REPL persists it + updates the router. */\n onSelect?: (selection: ModelPickerSelection) => void;\n onClose: () => void;\n}\n\ntype Step = 'PROVIDER' | 'TIER' | 'MODEL';\n\nconst TIERS: Array<{ id: TierRole; label: string; hint: string }> = [\n { id: 'T1', label: 'T1 — Administrator', hint: 'complex reasoning · runs once per task' },\n { id: 'T2', label: 'T2 — Manager', hint: 'per-section planning · a few calls per task' },\n { id: 'T3', label: 'T3 — Worker', hint: 'high volume · many parallel runs' },\n];\n\ninterface MenuItem {\n label: string;\n sublabel?: string;\n value: string;\n}\n\nexport const ModelsDisplay: React.FC<Props> = ({\n providers,\n modelsByProvider,\n onSelect,\n onClose,\n}) => {\n const [step, setStep] = useState<Step>('PROVIDER');\n const [cursor, setCursor] = useState(0);\n const [picked, setPicked] = useState<{ provider?: ProviderType | 'auto'; tier?: TierRole }>({});\n\n // ── Step → menu items ──────────────────────────\n const providerItems = useMemo<MenuItem[]>(() => {\n const base: MenuItem[] = [\n { label: '◇ Auto', sublabel: 'let Cascade pick per tier — recommended', value: 'auto' },\n ];\n for (const p of providers) {\n const count = modelsByProvider.get(p)?.length ?? 0;\n base.push({ label: p, sublabel: `${count} model${count === 1 ? '' : 's'} discovered`, value: p });\n }\n return base;\n }, [providers, modelsByProvider]);\n\n const tierItems = useMemo<MenuItem[]>(\n () => TIERS.map(t => ({ label: t.label, sublabel: t.hint, value: t.id })),\n [],\n );\n\n const modelItems = useMemo<MenuItem[]>(() => {\n if (!picked.provider || picked.provider === 'auto') return [];\n const list = (modelsByProvider.get(picked.provider as ProviderType) ?? [])\n .slice()\n .sort((a, b) => a.id.localeCompare(b.id));\n const items: MenuItem[] = [\n { label: '◇ Auto', sublabel: 'best available from this provider', value: '__auto__' },\n ];\n for (const m of list) {\n const ctx = m.contextWindow >= 1_000_000\n ? `${(m.contextWindow / 1_000_000).toFixed(1)}M ctx`\n : m.contextWindow >= 1_000\n ? `${Math.round(m.contextWindow / 1_000)}K ctx`\n : `${m.contextWindow} ctx`;\n items.push({ label: m.name, sublabel: `${m.id} · ${ctx}`, value: m.id });\n }\n return items;\n }, [picked.provider, modelsByProvider]);\n\n const currentItems: MenuItem[] =\n step === 'PROVIDER' ? providerItems : step === 'TIER' ? tierItems : modelItems;\n\n // ── Input handling — fixes the \"only ↑ works\" regression ────────\n useInput((input, key) => {\n if (key.escape) {\n if (step === 'MODEL') { setStep('TIER'); setCursor(0); return; }\n if (step === 'TIER') { setStep('PROVIDER'); setCursor(0); return; }\n onClose();\n return;\n }\n\n if (key.upArrow || input === 'k') {\n setCursor(c => (currentItems.length === 0 ? 0 : (c - 1 + currentItems.length) % currentItems.length));\n return;\n }\n if (key.downArrow || key.tab || input === 'j') {\n setCursor(c => (currentItems.length === 0 ? 0 : (c + 1) % currentItems.length));\n return;\n }\n // j/k handled above; numeric 1-9 jumps directly\n if (/^[1-9]$/.test(input)) {\n const idx = parseInt(input, 10) - 1;\n if (idx < currentItems.length) setCursor(idx);\n return;\n }\n\n if (key.return) {\n const selected = currentItems[cursor];\n if (!selected) return;\n\n if (step === 'PROVIDER') {\n if (selected.value === 'auto') {\n // Auto across all tiers — still ask which tier to clear the pin on\n setPicked({ provider: 'auto' });\n setStep('TIER');\n setCursor(0);\n return;\n }\n setPicked({ provider: selected.value as ProviderType });\n setStep('TIER');\n setCursor(0);\n return;\n }\n\n if (step === 'TIER') {\n const tier = selected.value as TierRole;\n if (picked.provider === 'auto') {\n onSelect?.({ kind: 'auto', tier });\n onClose();\n return;\n }\n setPicked(p => ({ ...p, tier }));\n setStep('MODEL');\n setCursor(0);\n return;\n }\n\n // step === 'MODEL'\n if (!picked.tier || !picked.provider || picked.provider === 'auto') {\n onClose();\n return;\n }\n if (selected.value === '__auto__') {\n onSelect?.({ kind: 'auto', tier: picked.tier });\n } else {\n onSelect?.({\n kind: 'pick',\n tier: picked.tier,\n provider: picked.provider as ProviderType,\n modelId: selected.value,\n });\n }\n onClose();\n }\n });\n\n // ── Presentation helpers ──────────────────────\n const title =\n step === 'PROVIDER' ? '◈ SELECT PROVIDER'\n : step === 'TIER' ? `◈ APPLY ${picked.provider === 'auto' ? 'AUTO' : String(picked.provider).toUpperCase()} TO WHICH TIER?`\n : `◈ ${String(picked.provider).toUpperCase()} → SELECT MODEL FOR ${picked.tier}`;\n\n const breadcrumb =\n step === 'PROVIDER' ? 'Step 1 / 3'\n : step === 'TIER' ? `Step 2 / 3 · provider: ${picked.provider}`\n : `Step 3 / 3 · ${picked.provider} → ${picked.tier}`;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Box justifyContent=\"space-between\">\n <Text bold color=\"cyan\">{title}</Text>\n <Text color=\"gray\">[Esc back · Enter select]</Text>\n </Box>\n <Box marginBottom={1}>\n <Text color=\"gray\">{breadcrumb} · ↑/↓ navigate · 1–9 jump</Text>\n </Box>\n\n {currentItems.length === 0 ? (\n <Text italic color=\"yellow\">No items to show.</Text>\n ) : (\n <Box flexDirection=\"column\">\n {currentItems.map((item, i) => {\n const focused = i === cursor;\n return (\n <Box key={`${step}-${item.value}-${i}`} flexDirection=\"row\">\n <Text color={focused ? 'green' : 'gray'}>{focused ? '❯ ' : ' '}</Text>\n <Box flexDirection=\"column\">\n <Text color={focused ? 'white' : 'gray'} bold={focused}>{item.label}</Text>\n {item.sublabel && (\n <Text color=\"gray\" dimColor>{` ${item.sublabel}`}</Text>\n )}\n </Box>\n </Box>\n );\n })}\n </Box>\n )}\n </Box>\n );\n};\n","// ─────────────────────────────────────────────\n// Cascade AI — Cost Tracker Display\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport type { Theme } from '../../../types.js';\n\ninterface CostTrackerProps {\n theme: Theme;\n totalTokens: number;\n totalCostUsd: number;\n callsByProvider: Record<string, number>;\n callsByTier: Record<string, number>;\n /** Optional per-tier cost breakdown for granular attribution. */\n costByTier?: Record<string, number>;\n /** Optional per-tier token totals. */\n tokensByTier?: Record<string, number>;\n}\n\nexport function CostTracker({\n theme,\n totalTokens,\n totalCostUsd,\n callsByProvider,\n callsByTier,\n costByTier,\n tokensByTier,\n}: CostTrackerProps): React.ReactElement {\n const hasTierCost = costByTier && Object.keys(costByTier).length > 0;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.colors.border} paddingX={2}>\n <Text color={theme.colors.primary} bold>Session Usage</Text>\n\n <Box marginTop={1}>\n <Box width={20}><Text color={theme.colors.muted}>Total tokens:</Text></Box>\n <Text color={theme.colors.foreground} bold>{totalTokens.toLocaleString()}</Text>\n </Box>\n <Box>\n <Box width={20}><Text color={theme.colors.muted}>Estimated cost:</Text></Box>\n <Text color={theme.colors.success} bold>${totalCostUsd.toFixed(6)}</Text>\n </Box>\n\n {Object.keys(callsByProvider).length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.colors.muted}>By provider:</Text>\n {Object.entries(callsByProvider).map(([p, c]) => (\n <Box key={p} marginLeft={2}>\n <Box width={20}><Text color={theme.colors.secondary}>{p}</Text></Box>\n <Text>{c} calls</Text>\n </Box>\n ))}\n </Box>\n )}\n\n {Object.keys(callsByTier).length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.colors.muted}>By tier:</Text>\n {Object.entries(callsByTier).map(([tier, calls]) => {\n const color = tier === 'T1'\n ? theme.colors.t1Color\n : tier === 'T2' ? theme.colors.t2Color : theme.colors.t3Color;\n const tierCost = hasTierCost ? (costByTier![tier] ?? 0) : null;\n const tierTokens = tokensByTier ? (tokensByTier[tier] ?? 0) : null;\n\n return (\n <Box key={tier} marginLeft={2}>\n <Box width={8}><Text color={color} bold>{tier}</Text></Box>\n <Box width={12}><Text dimColor>{calls} call{calls !== 1 ? 's' : ''}</Text></Box>\n {tierTokens !== null && (\n <Box width={16}><Text dimColor>{tierTokens.toLocaleString()} tok</Text></Box>\n )}\n {tierCost !== null && (\n <Text color={theme.colors.success}>${tierCost.toFixed(6)}</Text>\n )}\n </Box>\n );\n })}\n {hasTierCost && totalCostUsd > 0 && (\n <Box marginLeft={2} marginTop={1} flexDirection=\"column\">\n <Text color={theme.colors.muted} dimColor>Cost distribution:</Text>\n {Object.entries(costByTier!).map(([tier, cost]) => {\n const pct = Math.round((cost / totalCostUsd) * 1000) / 10;\n const color = tier === 'T1'\n ? theme.colors.t1Color\n : tier === 'T2' ? theme.colors.t2Color : theme.colors.t3Color;\n const barLen = Math.round(pct / 5); // 20 char max bar\n const bar = '█'.repeat(barLen) + '░'.repeat(20 - barLen);\n return (\n <Box key={tier} marginLeft={2}>\n <Box width={5}><Text color={color} bold>{tier}</Text></Box>\n <Text color={color}>{bar}</Text>\n <Text dimColor> {pct}%</Text>\n </Box>\n );\n })}\n </Box>\n )}\n </Box>\n )}\n </Box>\n );\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Line Buffer Utility\n// ─────────────────────────────────────────────\n\nimport wrapAnsi from 'wrap-ansi';\nimport chalk from 'chalk';\nimport type { Message, Theme } from '../../../types.js';\n\n/**\n * Converts a conversation history into a flat array of formatted lines,\n * respecting terminal width and applying word-wrapping.\n */\nexport function formatToLines(messages: Message[], width: number, theme: Theme): string[] {\n const lines: string[] = [];\n\n for (const msg of messages) {\n const { label, color, prefix } = getRoleStyle(msg.role, theme);\n \n // 1. Header (Role + Timestamp)\n const time = msg.timestamp ? ` ${chalk.hex(theme.colors.muted)(new Date(msg.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }))}` : '';\n lines.push(`${color(prefix)} ${color.bold(label)}${time}`);\n \n // 2. Content\n const content = normalizeContent(msg.content);\n const formattedContent = formatMarkdownish(content, theme);\n \n // Wrap the content (with indentation)\n const wrapped = wrapAnsi(formattedContent, width - 4, { hard: true, trim: false });\n const contentLines = wrapped.split('\\n');\n \n for (const line of contentLines) {\n lines.push(` ${line}`); // Indent content for readability\n }\n \n // 3. Spacing\n lines.push('');\n }\n\n return lines;\n}\n\nfunction getRoleStyle(role: Message['role'], theme: Theme) {\n switch (role) {\n case 'user':\n return { label: 'You', color: chalk.hex(theme.colors.primary), prefix: '▸' };\n case 'assistant':\n return { label: 'Cascade', color: chalk.hex(theme.colors.secondary), prefix: '◈' };\n case 'system':\n return { label: 'System', color: chalk.hex(theme.colors.muted), prefix: '◦' };\n case 'error':\n return { label: 'Error', color: chalk.hex(theme.colors.error), prefix: '✗' };\n default:\n return { label: 'Unknown', color: chalk.white, prefix: '?' };\n }\n}\n\nfunction normalizeContent(content: string | unknown): string {\n if (typeof content === 'string') return content;\n if (content == null) return '';\n if (Array.isArray(content)) {\n return content.map(p => typeof p === 'string' ? p : JSON.stringify(p)).join(' ');\n }\n return typeof content === 'object' ? JSON.stringify(content) : String(content);\n}\n\nfunction formatMarkdownish(content: string, theme: Theme): string {\n return content\n .replace(/\\*\\*(.*?)\\*\\*/g, (_, t) => chalk.bold(t))\n .replace(/`(.*?)`/g, (_, t) => chalk.inverse(t))\n .replace(/```([\\s\\S]*?)```/g, (_, code) => {\n // For simple inline viewport, we'll just dim code blocks or give them a subtle background\n return chalk.dim(code.trim());\n });\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — `cascade init` Command\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { createDefaultCascadeMd } from '../../config/cascade-md.js';\nimport { createDefaultIgnoreFile } from '../../config/ignore.js';\nimport { ConfigManager } from '../../config/index.js';\nimport { CASCADE_CONFIG_FILE } from '../../constants.js';\nimport { runSetupWizard } from '../setup/index.js';\n\nexport async function initCommand(workspacePath = process.cwd()): Promise<void> {\n const spin = ora({ text: 'Initializing Cascade project…', color: 'magenta' }).start();\n\n try {\n const configDir = path.join(workspacePath, '.cascade');\n await fs.mkdir(configDir, { recursive: true });\n\n // Write CASCADE.md\n const mdPath = path.join(workspacePath, 'CASCADE.md');\n if (!(await fileExists(mdPath))) {\n await createDefaultCascadeMd(workspacePath);\n spin.succeed(chalk.green('Created CASCADE.md'));\n }\n\n // Write .cascadeignore\n const ignorePath = path.join(workspacePath, '.cascadeignore');\n if (!(await fileExists(ignorePath))) {\n await createDefaultIgnoreFile(workspacePath);\n spin.succeed(chalk.green('Created .cascadeignore'));\n }\n\n spin.stop();\n console.log();\n console.log(chalk.magenta(' ◈ Cascade AI — Project initialized'));\n console.log();\n\n // Launch interactive setup wizard to configure providers and models\n const configPath = path.join(workspacePath, CASCADE_CONFIG_FILE);\n if (await fileExists(configPath)) {\n console.log(chalk.yellow(' .cascade/config.json already exists — launching wizard to reconfigure.'));\n console.log();\n }\n\n const config = await runSetupWizard(workspacePath);\n\n // Persist config via ConfigManager so all schema defaults are applied\n const cm = new ConfigManager(workspacePath);\n await cm.load();\n await cm.updateConfig(config);\n\n console.log();\n console.log(chalk.green(' ◈ Setup complete! Run `cascade` to start.'));\n console.log();\n } catch (err) {\n console.error(chalk.red(`Init failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — First-Run Setup Wizard (Ink TUI)\n// ─────────────────────────────────────────────\n//\n// Flow: PROVIDER_SELECT → API_KEYS → FETCH_MODELS → TIER_ASSIGN → SAVE\n//\n// Supports multiple Azure deployments and multiple OpenAI-compatible\n// endpoints — each appears as a separate selectable entry in tier assignment.\n\nimport React, { useCallback, useEffect, useReducer, useRef, useState } from 'react';\nimport { Box, Text, useApp, useInput, render } from 'ink';\nimport SelectInput from 'ink-select-input';\nimport Spinner from 'ink-spinner';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { randomUUID } from 'node:crypto';\nimport { CascadeConfigSchema } from '../../config/schema.js';\nimport { CASCADE_CONFIG_FILE, GLOBAL_CONFIG_DIR } from '../../constants.js';\nimport type { CascadeConfig } from '../../types.js';\nimport { SafeTextInput } from '../components/SafeTextInput.js';\n\n// ── Types ─────────────────────────────────────\n\ntype ProviderType = 'anthropic' | 'openai' | 'gemini' | 'azure' | 'ollama' | 'openai-compatible';\n\ninterface ProviderEntry {\n id: string;\n type: ProviderType;\n label: string; // display name\n apiKey?: string;\n baseUrl?: string;\n deploymentName?: string;\n}\n\ninterface FetchedModel {\n id: string;\n name: string;\n providerLabel: string;\n}\n\ntype WizardStep =\n | 'PROVIDER_SELECT'\n | 'API_KEYS'\n | 'FETCH_MODELS'\n | 'TIER_ASSIGN'\n | 'SAVE';\n\ninterface WizardState {\n step: WizardStep;\n selectedTypes: Set<ProviderType>;\n entries: ProviderEntry[]; // one per configured provider/deployment\n currentEntryIdx: number; // which entry we are collecting keys for\n addingAnotherAzure: boolean;\n addingAnotherCompat: boolean;\n fetchedModels: FetchedModel[];\n fetchLog: string[];\n tierT1: string; // 'auto' or model id\n tierT2: string;\n tierT3: string;\n tierSelectFocus: 'T1' | 'T2' | 'T3';\n error: string | null;\n}\n\ntype WizardAction =\n | { type: 'TOGGLE_PROVIDER'; provider: ProviderType }\n | { type: 'TOGGLE_ALL' }\n | { type: 'INVERT_SELECTION' }\n | { type: 'CONFIRM_PROVIDERS' }\n | { type: 'SET_ENTRY_FIELD'; field: keyof ProviderEntry; value: string }\n | { type: 'NEXT_ENTRY' }\n | { type: 'ADD_AZURE' }\n | { type: 'ADD_COMPAT' }\n | { type: 'SKIP_MORE' }\n | { type: 'SET_FETCH_LOG'; line: string }\n | { type: 'SET_MODELS'; models: FetchedModel[] }\n | { type: 'GO_FETCH' }\n | { type: 'SET_TIER'; tier: 'T1' | 'T2' | 'T3'; value: string }\n | { type: 'SET_TIER_FOCUS'; tier: 'T1' | 'T2' | 'T3' }\n | { type: 'GO_SAVE' }\n | { type: 'SET_ERROR'; error: string };\n\nconst PROVIDER_LABELS: Record<ProviderType, string> = {\n anthropic: 'Anthropic Claude',\n openai: 'OpenAI GPT',\n gemini: 'Google Gemini',\n azure: 'Azure OpenAI',\n ollama: 'Ollama (local)',\n 'openai-compatible': 'OpenAI-Compatible',\n};\n\nconst providerOrder: ProviderType[] = ['anthropic', 'openai', 'gemini', 'azure', 'ollama', 'openai-compatible'];\n\nfunction buildInitialEntries(types: Set<ProviderType>): ProviderEntry[] {\n return [...types].map(type => ({\n id: randomUUID(),\n type,\n label: type === 'azure' ? 'Azure deployment 1'\n : type === 'openai-compatible' ? 'Custom endpoint 1'\n : PROVIDER_LABELS[type],\n }));\n}\n\nfunction wizardReducer(state: WizardState, action: WizardAction): WizardState {\n switch (action.type) {\n case 'TOGGLE_PROVIDER': {\n const next = new Set(state.selectedTypes);\n if (next.has(action.provider)) next.delete(action.provider);\n else next.add(action.provider);\n return { ...state, selectedTypes: next };\n }\n case 'TOGGLE_ALL': {\n const allSelected = state.selectedTypes.size === providerOrder.length;\n return { ...state, selectedTypes: allSelected ? new Set() : new Set(providerOrder) };\n }\n case 'INVERT_SELECTION': {\n const next = new Set<ProviderType>();\n providerOrder.forEach(p => {\n if (!state.selectedTypes.has(p)) next.add(p);\n });\n return { ...state, selectedTypes: next };\n }\n case 'CONFIRM_PROVIDERS': {\n const entries = buildInitialEntries(state.selectedTypes);\n return { ...state, entries, currentEntryIdx: 0, step: 'API_KEYS' };\n }\n case 'SET_ENTRY_FIELD': {\n const updated = [...state.entries];\n updated[state.currentEntryIdx] = {\n ...updated[state.currentEntryIdx]!,\n [action.field]: action.value,\n };\n return { ...state, entries: updated };\n }\n case 'NEXT_ENTRY': {\n const next = state.currentEntryIdx + 1;\n if (next >= state.entries.length) {\n return { ...state, step: 'FETCH_MODELS', currentEntryIdx: 0 };\n }\n return { ...state, currentEntryIdx: next };\n }\n case 'ADD_AZURE': {\n const newEntry: ProviderEntry = {\n id: randomUUID(),\n type: 'azure',\n label: `Azure deployment ${state.entries.filter(e => e.type === 'azure').length + 1}`,\n };\n return {\n ...state,\n entries: [...state.entries, newEntry],\n currentEntryIdx: state.entries.length,\n addingAnotherAzure: false,\n };\n }\n case 'ADD_COMPAT': {\n const newEntry: ProviderEntry = {\n id: randomUUID(),\n type: 'openai-compatible',\n label: `Custom endpoint ${state.entries.filter(e => e.type === 'openai-compatible').length + 1}`,\n };\n return {\n ...state,\n entries: [...state.entries, newEntry],\n currentEntryIdx: state.entries.length,\n addingAnotherCompat: false,\n };\n }\n case 'SKIP_MORE':\n return { ...state, addingAnotherAzure: false, addingAnotherCompat: false, step: 'FETCH_MODELS', currentEntryIdx: 0 };\n case 'GO_FETCH':\n return { ...state, step: 'FETCH_MODELS', fetchLog: [], fetchedModels: [] };\n case 'SET_FETCH_LOG':\n return { ...state, fetchLog: [...state.fetchLog, action.line] };\n case 'SET_MODELS':\n return { ...state, fetchedModels: action.models, step: 'TIER_ASSIGN' };\n case 'SET_TIER':\n return {\n ...state,\n tierT1: action.tier === 'T1' ? action.value : state.tierT1,\n tierT2: action.tier === 'T2' ? action.value : state.tierT2,\n tierT3: action.tier === 'T3' ? action.value : state.tierT3,\n };\n case 'SET_TIER_FOCUS':\n return { ...state, tierSelectFocus: action.tier };\n case 'GO_SAVE':\n return { ...state, step: 'SAVE' };\n case 'SET_ERROR':\n return { ...state, error: action.error };\n default:\n return state;\n }\n}\n\n// ── Main Wizard Component ─────────────────────\n\ninterface SetupWizardProps {\n workspacePath: string;\n onComplete: (config: CascadeConfig) => void;\n}\n\nexport function SetupWizard({ workspacePath, onComplete }: SetupWizardProps): React.ReactElement {\n const { exit } = useApp();\n\n const [state, dispatch] = useReducer(wizardReducer, {\n step: 'PROVIDER_SELECT',\n selectedTypes: new Set<ProviderType>(),\n entries: [],\n currentEntryIdx: 0,\n addingAnotherAzure: false,\n addingAnotherCompat: false,\n fetchedModels: [],\n fetchLog: [],\n tierT1: 'auto',\n tierT2: 'auto',\n tierT3: 'auto',\n tierSelectFocus: 'T1',\n error: null,\n });\n\n const [providerCursor, setProviderCursor] = useState(0);\n const [fieldBuffer, setFieldBuffer] = useState('');\n const [fieldStage, setFieldStage] = useState<'apiKey' | 'baseUrl' | 'deploymentName' | 'label' | 'askMore'>('apiKey');\n const dispatchRef = useRef(dispatch);\n dispatchRef.current = dispatch;\n\n // ── Step: FETCH_MODELS ───────────────────────\n useEffect(() => {\n if (state.step !== 'FETCH_MODELS') return;\n\n const run = async () => {\n const models: FetchedModel[] = [];\n // Always include \"auto\"\n for (const entry of state.entries) {\n try {\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ⠋ ${entry.label} — connecting...` });\n // Build a minimal provider config to call listModels\n const { type, apiKey, baseUrl, deploymentName } = entry;\n if (type === 'ollama') {\n const { OllamaProvider } = await import('../../providers/ollama.js');\n const dummyModel = { id: 'dummy', name: 'dummy', provider: type as never, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: true };\n const p = new OllamaProvider({ type, baseUrl }, dummyModel);\n const fetched = await p.listModels();\n fetched.forEach(m => models.push({ id: m.id, name: m.name, providerLabel: entry.label }));\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ✔ ${entry.label} — ${fetched.length} models` });\n } else if (type === 'anthropic') {\n const { AnthropicProvider } = await import('../../providers/anthropic.js');\n const dummyModel = { id: 'dummy', name: 'dummy', provider: type as never, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: false };\n const p = new AnthropicProvider({ type, apiKey }, dummyModel);\n const fetched = await p.listModels();\n fetched.forEach(m => models.push({ id: m.id, name: m.name, providerLabel: entry.label }));\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ✔ ${entry.label} — ${fetched.length} models` });\n } else if (type === 'openai' || type === 'openai-compatible') {\n const { OpenAIProvider } = await import('../../providers/openai.js');\n const { OpenAICompatibleProvider } = await import('../../providers/openai-compatible.js');\n const dummyModel = { id: 'dummy', name: 'dummy', provider: type as never, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: false };\n const cfg = { type, apiKey, ...(baseUrl ? { baseUrl } : {}) };\n const p = type === 'openai' ? new OpenAIProvider(cfg as never, dummyModel) : new OpenAICompatibleProvider(cfg as never, dummyModel);\n const fetched = await p.listModels();\n fetched.forEach(m => models.push({ id: m.id, name: m.name, providerLabel: entry.label }));\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ✔ ${entry.label} — ${fetched.length} models` });\n } else if (type === 'gemini') {\n const { GeminiProvider } = await import('../../providers/gemini.js');\n const dummyModel = { id: 'dummy', name: 'dummy', provider: type as never, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: false };\n const p = new GeminiProvider({ type, apiKey }, dummyModel);\n const fetched = await p.listModels();\n fetched.forEach(m => models.push({ id: m.id, name: m.name, providerLabel: entry.label }));\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ✔ ${entry.label} — ${fetched.length} models` });\n } else if (type === 'azure') {\n const { AzureOpenAIProvider } = await import('../../providers/azure.js');\n const dummyModel = { id: 'dummy', name: 'dummy', provider: type as never, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: false };\n const p = new AzureOpenAIProvider({ type, apiKey, baseUrl, deploymentName }, dummyModel);\n const fetched = await p.listModels();\n fetched.forEach(m => models.push({ id: m.id, name: m.name, providerLabel: entry.label }));\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ✔ ${entry.label} — ${fetched.length} models` });\n }\n } catch (err) {\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ✘ ${entry.label} — ${err instanceof Error ? err.message : 'failed'}` });\n }\n }\n dispatchRef.current({ type: 'SET_MODELS', models });\n };\n\n run();\n }, [state.step, state.entries]);\n\n // ── Step: SAVE ───────────────────────────────\n useEffect(() => {\n if (state.step !== 'SAVE') return;\n\n const run = async () => {\n try {\n const providers = state.entries.map(e => ({\n type: e.type,\n ...(e.apiKey ? { apiKey: e.apiKey } : {}),\n ...(e.baseUrl ? { baseUrl: e.baseUrl } : {}),\n ...(e.deploymentName ? { deploymentName: e.deploymentName } : {}),\n }));\n\n const models: Record<string, string> = {};\n if (state.tierT1 !== 'auto') models['t1'] = state.tierT1;\n if (state.tierT2 !== 'auto') models['t2'] = state.tierT2;\n if (state.tierT3 !== 'auto') models['t3'] = state.tierT3;\n\n const rawConfig = { providers, ...(Object.keys(models).length ? { models } : {}) };\n const config = CascadeConfigSchema.parse(rawConfig);\n\n const configDir = path.join(workspacePath, '.cascade');\n await fs.mkdir(configDir, { recursive: true });\n const configPath = path.join(workspacePath, CASCADE_CONFIG_FILE);\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n\n onComplete(config as CascadeConfig);\n exit();\n } catch (err) {\n dispatchRef.current({ type: 'SET_ERROR', error: err instanceof Error ? err.message : String(err) });\n }\n };\n\n run();\n }, [state.step, state.entries, state.tierT1, state.tierT2, state.tierT3, workspacePath, onComplete, exit]);\n\n // ── Input handling ────────────────────────────\n useInput((_input, key) => {\n if (state.step === 'PROVIDER_SELECT') {\n if (key.upArrow) setProviderCursor(p => Math.max(0, p - 1));\n if (key.downArrow) setProviderCursor(p => Math.min(providerOrder.length - 1, p + 1));\n if (_input === ' ') dispatch({ type: 'TOGGLE_PROVIDER', provider: providerOrder[providerCursor]! });\n if (_input === 'a') dispatch({ type: 'TOGGLE_ALL' });\n if (_input === 'i') dispatch({ type: 'INVERT_SELECTION' });\n if (key.return) {\n if (state.selectedTypes.size === 0) return;\n dispatch({ type: 'CONFIRM_PROVIDERS' });\n setFieldStage('apiKey');\n setFieldBuffer('');\n }\n }\n if (state.step === 'TIER_ASSIGN') {\n if (key.tab || key.downArrow) {\n const order: Array<'T1' | 'T2' | 'T3'> = ['T1', 'T2', 'T3'];\n const idx = order.indexOf(state.tierSelectFocus);\n dispatch({ type: 'SET_TIER_FOCUS', tier: order[(idx + 1) % 3]! });\n }\n if (key.return) dispatch({ type: 'GO_SAVE' });\n }\n });\n\n // ── Current entry being configured ──────────\n const currentEntry = state.entries[state.currentEntryIdx];\n\n const handleFieldSubmit = useCallback((val: string) => {\n if (!currentEntry) return;\n\n if (currentEntry.type === 'azure') {\n if (fieldStage === 'deploymentName') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'deploymentName', value: val });\n setFieldBuffer('');\n setFieldStage('baseUrl');\n } else if (fieldStage === 'baseUrl') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'baseUrl', value: val });\n setFieldBuffer('');\n setFieldStage('apiKey');\n } else if (fieldStage === 'apiKey') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'apiKey', value: val });\n setFieldBuffer('');\n setFieldStage('askMore');\n }\n } else if (currentEntry.type === 'openai-compatible') {\n if (fieldStage === 'label') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'label', value: val || currentEntry.label });\n setFieldBuffer('');\n setFieldStage('baseUrl');\n } else if (fieldStage === 'baseUrl') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'baseUrl', value: val });\n setFieldBuffer('');\n setFieldStage('apiKey');\n } else if (fieldStage === 'apiKey') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'apiKey', value: val });\n setFieldBuffer('');\n setFieldStage('askMore');\n }\n } else if (currentEntry.type === 'ollama') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'baseUrl', value: val || 'http://localhost:11434' });\n setFieldBuffer('');\n dispatch({ type: 'NEXT_ENTRY' });\n setFieldStage('apiKey');\n } else {\n // anthropic / openai / gemini — just need apiKey\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'apiKey', value: val });\n setFieldBuffer('');\n dispatch({ type: 'NEXT_ENTRY' });\n setFieldStage('apiKey');\n }\n }, [currentEntry, fieldStage]);\n\n // ── Render ────────────────────────────────────\n\n if (state.step === 'PROVIDER_SELECT') {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color=\"magenta\" bold>? </Text>\n <Text bold>Which providers do you want to configure?</Text>\n </Box>\n <Box flexDirection=\"column\">\n {providerOrder.map((p, i) => {\n const selected = state.selectedTypes.has(p);\n const focused = i === providerCursor;\n return (\n <Box key={p}>\n <Text color={focused ? 'magenta' : 'white'}>{focused ? '❯ ' : ' '}</Text>\n <Text color={selected ? 'green' : 'white'}>{selected ? '◉ ' : '◯ '}</Text>\n <Text color={focused ? 'magenta' : (selected ? 'white' : 'gray')}>{PROVIDER_LABELS[p]}</Text>\n {p === 'azure' && <Text dimColor> — multiple deployments supported</Text>}\n {p === 'openai-compatible' && <Text dimColor> — Groq, Together, custom</Text>}\n {p === 'ollama' && <Text dimColor> — no API key needed</Text>}\n </Box>\n );\n })}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>(Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)</Text>\n </Box>\n {state.error && <Text color=\"red\">{state.error}</Text>}\n </Box>\n );\n }\n\n if (state.step === 'API_KEYS' && currentEntry) {\n const isAzure = currentEntry.type === 'azure';\n const isCompat = currentEntry.type === 'openai-compatible';\n const isOllama = currentEntry.type === 'ollama';\n\n if (fieldStage === 'askMore') {\n // After completing an Azure or compat entry, ask if they want another\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color=\"magenta\" bold>? </Text>\n <Text bold>{isAzure ? 'Add another Azure deployment? (y/n)' : 'Add another custom endpoint? (y/n)'}</Text>\n </Box>\n <Box>\n <SelectInput\n items={[\n { label: 'Yes — add another', value: 'yes' },\n { label: 'No — continue', value: 'no' },\n ]}\n indicatorComponent={({ isSelected }) => <Text color=\"magenta\">{isSelected ? '❯ ' : ' '}</Text>}\n itemComponent={({ isSelected, label }) => <Text color={isSelected ? 'magenta' : 'white'}>{label}</Text>}\n onSelect={(item) => {\n if (item.value === 'yes') {\n if (isAzure) dispatch({ type: 'ADD_AZURE' });\n else dispatch({ type: 'ADD_COMPAT' });\n setFieldStage(isAzure ? 'deploymentName' : 'label');\n setFieldBuffer('');\n } else {\n dispatch({ type: 'NEXT_ENTRY' });\n setFieldStage('apiKey');\n setFieldBuffer('');\n }\n }}\n />\n </Box>\n </Box>\n );\n }\n\n const prompt =\n isAzure && fieldStage === 'deploymentName' ? `Azure deployment name (${currentEntry.label})` :\n isAzure && fieldStage === 'baseUrl' ? `Azure endpoint URL` :\n isCompat && fieldStage === 'label' ? `Name for this endpoint (e.g. Groq)` :\n isCompat && fieldStage === 'baseUrl' ? `Base URL (e.g. https://api.groq.com/openai/v1)` :\n isOllama ? `Ollama URL (Enter for http://localhost:11434)` :\n `${currentEntry.label} API Key`;\n\n const isMasked = fieldStage === 'apiKey';\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color=\"magenta\" bold>? </Text>\n <Text bold>{prompt}</Text>\n </Box>\n <Box>\n <Text color=\"magenta\">❯ </Text>\n <SafeTextInput\n value={fieldBuffer}\n onChange={setFieldBuffer}\n onSubmit={handleFieldSubmit}\n {...(isMasked ? { mask: '*' } : {})}\n placeholder={isOllama ? 'http://localhost:11434' : ''}\n />\n </Box>\n {isMasked && (\n <Box marginTop={1}>\n <Text dimColor>\n Tip: Ctrl+V pastes from clipboard. Most terminals also support right-click paste.\n </Text>\n </Box>\n )}\n {state.error && <Text color=\"red\">{state.error}</Text>}\n </Box>\n );\n }\n\n if (state.step === 'FETCH_MODELS') {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color=\"magenta\" bold>? </Text>\n <Text bold>Connecting to providers and fetching models...</Text>\n </Box>\n <Box flexDirection=\"column\">\n {state.fetchLog.map((line, i) => <Text key={i}>{line}</Text>)}\n {state.fetchedModels.length === 0 && (\n <Box>\n <Spinner type=\"dots\" />\n </Box>\n )}\n </Box>\n </Box>\n );\n }\n\n if (state.step === 'TIER_ASSIGN') {\n const modelOptions = [\n { label: 'Auto — let Cascade choose best available', value: 'auto' },\n ...state.fetchedModels.map(m => ({\n label: `${m.name} [${m.providerLabel}]`,\n value: m.id,\n })),\n ];\n\n const tierLabel = (tier: 'T1' | 'T2' | 'T3', hint: string) => {\n const isFocused = state.tierSelectFocus === tier;\n const current = tier === 'T1' ? state.tierT1 : tier === 'T2' ? state.tierT2 : state.tierT3;\n \n if (!isFocused) {\n return (\n <Box key={tier}>\n <Text color=\"green\" bold>✔ </Text>\n <Text bold>{tier} {hint}: </Text>\n <Text color=\"magenta\">{current === 'auto' ? 'Auto — let Cascade choose best available' : state.fetchedModels.find(m => m.id === current)?.name || current}</Text>\n </Box>\n );\n }\n \n return (\n <Box flexDirection=\"column\" marginBottom={1} key={tier}>\n <Box>\n <Text color=\"magenta\" bold>? </Text>\n <Text bold>{tier} {hint}: </Text>\n </Box>\n <Box>\n <SelectInput\n items={modelOptions}\n onSelect={(item) => dispatch({ type: 'SET_TIER', tier, value: item.value })}\n indicatorComponent={({ isSelected }) => <Text color=\"magenta\">{isSelected ? '❯ ' : ' '}</Text>}\n itemComponent={({ isSelected, label }) => <Text color={isSelected ? 'magenta' : 'white'}>{label}</Text>}\n />\n </Box>\n </Box>\n );\n };\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box flexDirection=\"column\">\n {tierLabel('T1', '(Administrator — complex reasoning, runs once per task)')}\n {tierLabel('T2', '(Manager — runs per section)')}\n {tierLabel('T3', '(Worker — high volume, many parallel runs)')}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>(Tab/Arrow Down to skip tier, Enter to select or save)</Text>\n </Box>\n {state.error && <Text color=\"red\">{state.error}</Text>}\n </Box>\n );\n }\n\n if (state.step === 'SAVE') {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box>\n <Text color=\"green\" bold>✔ </Text>\n <Text bold>Setup complete!</Text>\n </Box>\n <Box marginTop={1}>\n <Spinner type=\"dots\" />\n <Text> Writing .cascade/config.json...</Text>\n </Box>\n {state.error && <Text color=\"red\">Error: {state.error}</Text>}\n </Box>\n );\n }\n\n return <Box />;\n}\n\n// ── Exported runner ───────────────────────────\n\nexport async function runSetupWizard(workspacePath: string): Promise<CascadeConfig> {\n // Prominent telemetry notice — shown on every first-run setup so users\n // understand the default is OFF and they can revisit the decision later.\n printTelemetryBanner();\n return new Promise((resolve) => {\n const { unmount } = render(\n React.createElement(SetupWizard, {\n workspacePath,\n onComplete: (config) => {\n unmount();\n resolve(config);\n },\n }),\n { exitOnCtrlC: true },\n );\n });\n}\n\nfunction printTelemetryBanner(): void {\n // Plain console output (outside Ink) so it survives re-mounts.\n // eslint-disable-next-line no-console\n console.log();\n // eslint-disable-next-line no-console\n console.log(' ┌──────────────────────────────────────────────────────────────┐');\n // eslint-disable-next-line no-console\n console.log(' │ Telemetry: OFF by default. │');\n // eslint-disable-next-line no-console\n console.log(' │ Toggle anytime with: cascade telemetry on | off | status │');\n // eslint-disable-next-line no-console\n console.log(' │ Anonymous session metadata only — never prompts or output. │');\n // eslint-disable-next-line no-console\n console.log(' └──────────────────────────────────────────────────────────────┘');\n // eslint-disable-next-line no-console\n console.log();\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — `cascade doctor` Command\n// ─────────────────────────────────────────────\n\nimport axios from 'axios';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { CASCADE_CONFIG_FILE, LM_STUDIO_BASE_URL, OLLAMA_BASE_URL } from '../../constants.js';\nimport { ConfigManager } from '../../config/index.js';\n\ninterface CheckResult {\n label: string;\n ok: boolean;\n detail?: string;\n}\n\nexport async function doctorCommand(): Promise<void> {\n console.log(chalk.magenta('\\n ◈ Cascade Doctor — System Diagnostics\\n'));\n\n const checks: CheckResult[] = [];\n\n // Node version\n const nodeVersion = process.versions.node;\n const [major] = nodeVersion.split('.').map(Number);\n checks.push({\n label: `Node.js ${nodeVersion}`,\n ok: (major ?? 0) >= 18,\n detail: (major ?? 0) < 18 ? 'Requires Node.js ≥ 18' : undefined,\n });\n\n const cm = new ConfigManager(process.cwd());\n await cm.load();\n const config = cm.getConfig();\n\n checks.push({\n label: 'Cascade config',\n ok: true,\n detail: `Loaded ${path.join(process.cwd(), CASCADE_CONFIG_FILE)}`,\n });\n\n // API keys from config/env/keystore\n const providers: Array<{ type: string; name: string }> = [\n { type: 'anthropic', name: 'Anthropic' },\n { type: 'openai', name: 'OpenAI' },\n { type: 'gemini', name: 'Google Gemini' },\n { type: 'azure', name: 'Azure OpenAI' },\n ];\n\n for (const { type, name } of providers) {\n const key = cm.getApiKey(type);\n checks.push({\n label: `${name} API key`,\n ok: Boolean(key),\n detail: key ? 'Set' : 'Missing',\n });\n }\n\n // Ollama\n const ollamaOk = await checkEndpoint(OLLAMA_BASE_URL + '/api/tags');\n checks.push({ label: 'Ollama (localhost:11434)', ok: ollamaOk, detail: ollamaOk ? 'Running' : 'Not running' });\n\n // LM Studio\n const lmOk = await checkEndpoint(LM_STUDIO_BASE_URL + '/v1/models');\n checks.push({ label: 'LM Studio (localhost:1234)', ok: lmOk, detail: lmOk ? 'Running' : 'Not running' });\n\n // Playwright\n let playwrightOk = false;\n try {\n await import('playwright');\n playwrightOk = true;\n } catch { /* not installed */ }\n checks.push({ label: 'Playwright (browser automation)', ok: playwrightOk, detail: playwrightOk ? 'Installed' : 'Optional — npm install playwright' });\n\n const hasOpenAICompatible = config.providers.some((provider) => provider.type === 'openai-compatible');\n if (hasOpenAICompatible) {\n checks.push({\n label: 'OpenAI-compatible endpoint',\n ok: config.providers.some((provider) => provider.type === 'openai-compatible' && Boolean(provider.baseUrl)),\n detail: 'Configured in .cascade/config.json',\n });\n }\n\n const dashboardPasswordConfigured = Boolean(process.env['CASCADE_DASHBOARD_PASSWORD']);\n checks.push({\n label: 'Dashboard auth',\n ok: !config.dashboard.auth || dashboardPasswordConfigured,\n detail: config.dashboard.auth\n ? (dashboardPasswordConfigured ? 'Password configured' : 'Missing CASCADE_DASHBOARD_PASSWORD')\n : 'Disabled',\n });\n\n const dashboardSecretConfigured = Boolean(config.dashboard.secret || process.env['CASCADE_DASHBOARD_SECRET']);\n checks.push({\n label: 'Dashboard JWT secret',\n ok: !config.dashboard.auth || dashboardSecretConfigured,\n detail: config.dashboard.auth\n ? (dashboardSecretConfigured ? 'Configured' : 'Persisted at .cascade/dashboard-secret (0600)')\n : 'Not required',\n });\n\n // Keystore backend (keytar if available, encrypted file otherwise)\n let keystoreBackend = 'file (AES-256-GCM)';\n try {\n await import('keytar');\n keystoreBackend = 'keytar (OS keychain)';\n } catch {\n // keytar not installed or failed to load (Alpine, headless)\n }\n checks.push({\n label: 'Keystore backend',\n ok: true,\n detail: keystoreBackend,\n });\n\n // Telemetry — opt-in only, displayed prominently so users can audit it.\n const telemetryEnabled = Boolean(config.telemetry?.enabled);\n checks.push({\n label: 'Telemetry',\n ok: true,\n detail: telemetryEnabled\n ? 'ON — toggle with `cascade telemetry off`'\n : 'OFF (default) — toggle with `cascade telemetry on`',\n });\n\n // Print results\n for (const c of checks) {\n const icon = c.ok ? chalk.green(' ✓') : chalk.yellow(' ○');\n const label = c.ok ? chalk.white(c.label) : chalk.gray(c.label);\n const detail = c.detail ? chalk.gray(` — ${c.detail}`) : '';\n console.log(`${icon} ${label}${detail}`);\n }\n\n const failures = checks.filter((c) => !c.ok);\n console.log();\n\n if (failures.length === 0) {\n console.log(chalk.green(' All checks passed!\\n'));\n } else {\n const critical = failures.filter((c) => c.label.includes('Node') || c.label.includes('API key'));\n if (critical.length) {\n console.log(chalk.yellow(` ${critical.length} issue(s) need attention.\\n`));\n } else {\n console.log(chalk.gray(` ${failures.length} optional item(s) not configured.\\n`));\n }\n }\n}\n\nasync function checkEndpoint(url: string): Promise<boolean> {\n try {\n await axios.get(url, { timeout: 2000 });\n return true;\n } catch {\n return false;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — `cascade update` Command\n// ─────────────────────────────────────────────\n\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { CASCADE_VERSION } from '../../constants.js';\n\nconst execAsync = promisify(exec);\n\nexport async function updateCommand(): Promise<void> {\n const spin = ora({ text: 'Checking for updates…', color: 'magenta' }).start();\n\n try {\n const { stdout } = await execAsync('npm show cascade-ai version', { timeout: 10_000 });\n const latest = stdout.trim();\n\n if (latest === CASCADE_VERSION) {\n spin.succeed(chalk.green(`Already up to date (v${CASCADE_VERSION})`));\n return;\n }\n\n spin.text = `Updating cascade-ai ${CASCADE_VERSION} → ${latest}…`;\n await execAsync('npm install -g cascade-ai@latest', { timeout: 60_000 });\n spin.succeed(chalk.green(`Updated to v${latest}! Restart your terminal.`));\n } catch (err) {\n spin.fail(chalk.red(`Update failed: ${err instanceof Error ? err.message : String(err)}`));\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 — 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 — `cascade dashboard` Command\n// ─────────────────────────────────────────────\n\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'node:path';\nimport type { CascadeConfig } from '../../types.js';\nimport { DashboardServer } from '../../dashboard/server.js';\nimport { MemoryStore } from '../../memory/store.js';\nimport { CASCADE_DB_FILE, DEFAULT_DASHBOARD_PORT } from '../../constants.js';\n\nexport async function dashboardCommand(\n config: CascadeConfig,\n workspacePath = process.cwd(),\n): Promise<void> {\n const port = config.dashboard.port ?? DEFAULT_DASHBOARD_PORT;\n const spin = ora({ text: `Starting dashboard on port ${port}…`, color: 'magenta' }).start();\n\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n const server = new DashboardServer(config, store, workspacePath);\n server.watchRuntimeChanges();\n (globalThis as typeof globalThis & { cascadeDashboardServer?: DashboardServer }).cascadeDashboardServer = server;\n\n try {\n await server.start();\n\n spin.succeed(chalk.green(`Dashboard running at http://localhost:${port}`));\n server.refreshRuntime('workspace');\n server.refreshRuntime('global');\n console.log(chalk.gray(` Press Ctrl+C to stop\\n`));\n\n process.on('SIGINT', async () => {\n await server.stop();\n process.exit(0);\n });\n\n // Keep alive\n await new Promise(() => {});\n } catch (err) {\n await server.stop().catch(() => {});\n store.close();\n spin.fail(chalk.red(`Dashboard failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n } finally {\n delete (globalThis as typeof globalThis & { cascadeDashboardServer?: DashboardServer }).cascadeDashboardServer;\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { MemoryStore } from '../../memory/store.js';\nimport { CASCADE_DB_FILE } from '../../constants.js';\n\nexport function makeIdentityCommand(workspacePath = process.cwd()): Command {\n const identity = new Command('identity')\n .alias('id')\n .description('Manage Cascade identities');\n\n identity\n .command('list')\n .description('List all available identities')\n .action(() => {\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n const identities = store.listIdentities();\n \n console.log(chalk.bold('\\n Identities:'));\n if (identities.length === 0) {\n console.log(chalk.gray(' No identities found.'));\n } else {\n identities.forEach(id => {\n const defaultLabel = id.isDefault ? chalk.green(' [Default]') : '';\n console.log(` - ${chalk.cyan(id.name)}${defaultLabel}`);\n console.log(chalk.gray(` ID: ${id.id}`));\n if (id.description) console.log(chalk.gray(` ${id.description}`));\n });\n }\n console.log();\n });\n\n identity\n .command('create <name>')\n .description('Create a new identity')\n .option('-d, --desc <text>', 'Description of the identity')\n .option('-s, --system <text>', 'System prompt')\n .option('--default', 'Set as default identity')\n .action((name, options) => {\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n \n if (options.default) {\n // Clear existing default\n const existingDefault = store.getDefaultIdentity();\n if (existingDefault) {\n store.updateIdentity(existingDefault.id, { isDefault: false });\n }\n }\n\n const id = randomUUID();\n store.createIdentity({\n id,\n name,\n description: options.desc,\n systemPrompt: options.system,\n isDefault: !!options.default,\n createdAt: new Date().toISOString()\n });\n\n console.log(chalk.green(`\\n Successfully created identity: ${name} (${id})`));\n if (options.default) console.log(chalk.green(' Set as default.'));\n console.log();\n });\n\n identity\n .command('set-default <name>')\n .description('Set an identity as default by name or ID')\n .action((query) => {\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n const identities = store.listIdentities();\n const match = identities.find(i => i.id === query || i.name.toLowerCase() === query.toLowerCase());\n\n if (!match) {\n console.log(chalk.red(`\\n Identity '${query}' not found.\\n`));\n return;\n }\n\n const existingDefault = store.getDefaultIdentity();\n if (existingDefault && existingDefault.id !== match.id) {\n store.updateIdentity(existingDefault.id, { isDefault: false });\n }\n\n store.updateIdentity(match.id, { isDefault: true });\n console.log(chalk.green(`\\n Identity ${match.name} is now the default.\\n`));\n });\n\n return identity;\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — `cascade models` Command\n// ─────────────────────────────────────────────\n\nimport chalk from 'chalk';\nimport { ConfigManager } from '../../config/index.js';\nimport { CascadeRouter } from '../../core/router/index.js';\n\nexport async function modelsCommand(options: { verbose?: boolean } = {}): Promise<void> {\n console.log(chalk.magenta('\\n ◈ Cascade Models\\n'));\n\n const cm = new ConfigManager(process.cwd());\n await cm.load();\n const config = cm.getConfig();\n\n const router = new CascadeRouter();\n try {\n await router.init(config);\n } catch (err) {\n console.error(chalk.red(` Failed to initialize router: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tiers: Array<{ tier: 'T1' | 'T2' | 'T3'; label: string; color: any }> = [\n { tier: 'T1', label: 'T1 Administrator', color: chalk.hex('#7C6AF7') },\n { tier: 'T2', label: 'T2 Manager', color: chalk.hex('#5AB4E8') },\n { tier: 'T3', label: 'T3 Worker', color: chalk.hex('#5AE8A4') },\n ];\n\n let anyMissing = false;\n\n for (const { tier, label, color } of tiers) {\n const model = router.getTierModel(tier);\n if (model) {\n const costIn = model.inputCostPer1kTokens === 0 ? 'free' : `$${model.inputCostPer1kTokens.toFixed(4)}/1K in`;\n const costOut = model.outputCostPer1kTokens === 0 ? 'free' : `$${model.outputCostPer1kTokens.toFixed(4)}/1K out`;\n const ctx = model.contextWindow >= 1_000_000\n ? `${(model.contextWindow / 1_000_000).toFixed(1)}M ctx`\n : `${(model.contextWindow / 1_000).toFixed(0)}K ctx`;\n const local = model.isLocal ? chalk.gray(' [local]') : '';\n const vision = model.isVisionCapable ? chalk.gray(' 👁') : '';\n\n console.log(\n ` ${color.bold(tier)} ${chalk.white(model.name.padEnd(24))}` +\n `${chalk.gray(model.provider.padEnd(16))}` +\n (options.verbose\n ? `${chalk.gray(ctx.padEnd(12))}${chalk.gray(`${costIn}, ${costOut}`)}`\n : `${chalk.gray(ctx)}`) +\n local + vision,\n );\n } else {\n console.log(` ${color.bold(tier)} ${chalk.red('No model available')} ${chalk.gray(`(check provider config for ${label})`)}`);\n anyMissing = true;\n }\n }\n\n console.log();\n\n // Configured providers\n const providers = config.providers.map((p) => p.type).join(', ') || '(none)';\n console.log(chalk.gray(` Configured providers: ${providers}`));\n\n if (options.verbose) {\n // Show all available models grouped by provider\n console.log();\n console.log(chalk.white(' Available models by provider:\\n'));\n const allProviderTypes = [...new Set(config.providers.map((p) => p.type))];\n for (const providerType of allProviderTypes) {\n const available = router.getModelsForProvider(providerType as Parameters<typeof router.getModelsForProvider>[0]);\n if (available.length === 0) continue;\n console.log(chalk.gray(` ${providerType}:`));\n for (const m of available) {\n const override = config.models.t1 === m.id ? ' ← T1'\n : config.models.t2 === m.id ? ' ← T2'\n : config.models.t3 === m.id ? ' ← T3'\n : '';\n console.log(` ${chalk.white(m.name.padEnd(28))}${chalk.gray(m.id)}${chalk.yellow(override)}`);\n }\n console.log();\n }\n }\n\n if (anyMissing) {\n console.log(chalk.yellow(' Some tiers have no available model. Run `cascade doctor` for details.\\n'));\n } else {\n console.log(chalk.green(' All tiers are configured.\\n'));\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — `cascade export` Command\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { MemoryStore } from '../../memory/store.js';\nimport { GLOBAL_CONFIG_DIR, GLOBAL_DB_FILE } from '../../constants.js';\nimport type { Session, StoredMessage } from '../../types.js';\n\nexport interface ExportOptions {\n sessionId?: string;\n format?: 'markdown' | 'json';\n output?: string;\n last?: number;\n}\n\nexport async function exportCommand(options: ExportOptions = {}): Promise<void> {\n const format = options.format ?? 'markdown';\n const spin = ora({ text: 'Loading sessions…', color: 'magenta' }).start();\n\n let store: MemoryStore;\n try {\n const dbPath = path.join(process.env['HOME'] ?? '~', GLOBAL_CONFIG_DIR, GLOBAL_DB_FILE);\n store = new MemoryStore(dbPath);\n } catch (err) {\n spin.fail(chalk.red(`Cannot open memory store: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n\n try {\n let sessions: Session[];\n\n if (options.sessionId) {\n const session = store.getSession(options.sessionId);\n if (!session) {\n spin.fail(chalk.red(`Session \"${options.sessionId}\" not found.`));\n process.exit(1);\n }\n sessions = [session];\n } else {\n const limit = options.last ?? 10;\n sessions = store.listSessions(undefined, limit);\n if (sessions.length === 0) {\n spin.warn(chalk.yellow('No sessions found.'));\n return;\n }\n\n // If no specific session requested, let the user know we'll export the most recent\n if (!options.sessionId) {\n const latest = sessions[0]!;\n const full = store.getSession(latest.id);\n sessions = full ? [full] : [];\n if (sessions.length === 0) {\n spin.fail(chalk.red('Could not load latest session.'));\n process.exit(1);\n }\n }\n }\n\n const session = sessions[0]!;\n spin.text = `Exporting session \"${session.title}\"…`;\n\n const content = format === 'json'\n ? buildJsonExport(session)\n : buildMarkdownExport(session);\n\n const ext = format === 'json' ? '.json' : '.md';\n const safeName = session.title.replace(/[^\\w\\s-]/g, '').replace(/\\s+/g, '-').slice(0, 60);\n const defaultFile = `cascade-export-${safeName}${ext}`;\n const outPath = options.output\n ? path.resolve(options.output)\n : path.join(process.cwd(), defaultFile);\n\n await fs.writeFile(outPath, content, 'utf-8');\n spin.succeed(chalk.green(`Exported to ${chalk.white(outPath)}`));\n\n // Print summary\n const messageCount = Array.isArray(session.messages) ? session.messages.length : 0;\n console.log();\n console.log(chalk.gray(` Session: ${session.title}`));\n console.log(chalk.gray(` Messages: ${messageCount}`));\n console.log(chalk.gray(` Format: ${format}`));\n console.log();\n } catch (err) {\n spin.fail(chalk.red(`Export failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\n// ── Formatters ────────────────────────────────\n\nfunction buildMarkdownExport(session: Session): string {\n const lines: string[] = [];\n\n lines.push(`# ${session.title}`);\n lines.push('');\n lines.push(`> **Session ID:** \\`${session.id}\\` `);\n lines.push(`> **Created:** ${new Date(session.createdAt).toLocaleString()} `);\n lines.push(`> **Updated:** ${new Date(session.updatedAt).toLocaleString()}`);\n lines.push('');\n lines.push('---');\n lines.push('');\n\n const messages: StoredMessage[] = Array.isArray(session.messages) ? session.messages : [];\n\n for (const msg of messages) {\n const role = msg.role;\n if (!msg.content.trim()) continue;\n\n if (role === 'user') {\n lines.push(`## 👤 User`);\n } else if (role === 'assistant') {\n lines.push(`## 🤖 Assistant`);\n } else if (role === 'system') {\n lines.push(`## ⚙️ System`);\n } else {\n lines.push(`## 🔧 Tool`);\n }\n\n lines.push('');\n lines.push(msg.content);\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction buildJsonExport(session: Session): string {\n const messages: StoredMessage[] = Array.isArray(session.messages) ? session.messages : [];\n const payload = {\n id: session.id,\n title: session.title,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n workspacePath: session.workspacePath,\n messageCount: messages.length,\n messages: messages.map((m) => ({\n id: m.id,\n role: m.role,\n content: m.content,\n timestamp: m.timestamp,\n tokens: m.tokens,\n })),\n };\n return JSON.stringify(payload, null, 2);\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — `cascade telemetry on|off` Command\n// ─────────────────────────────────────────────\n\nimport chalk from 'chalk';\nimport { ConfigManager } from '../../config/index.js';\n\ntype TelemetryAction = 'on' | 'off' | 'status';\n\nexport async function telemetryCommand(action: TelemetryAction): Promise<void> {\n const cm = new ConfigManager(process.cwd());\n await cm.load();\n const config = cm.getConfig();\n\n if (action === 'status') {\n const state = config.telemetry?.enabled ? 'ON' : 'OFF';\n console.log();\n console.log(chalk.magenta(' ◈ Cascade Telemetry'));\n console.log();\n console.log(` Status: ${config.telemetry?.enabled ? chalk.green(state) : chalk.gray(state)}`);\n console.log(chalk.gray(' Scope: anonymous session metadata only (no prompts/outputs)'));\n console.log();\n console.log(chalk.gray(' Toggle with: cascade telemetry on | cascade telemetry off'));\n console.log();\n return;\n }\n\n const enabled = action === 'on';\n await cm.updateConfig({\n ...config,\n telemetry: {\n ...config.telemetry,\n enabled,\n },\n });\n\n console.log();\n if (enabled) {\n console.log(chalk.green(` ✓ Telemetry enabled.`));\n console.log(chalk.gray(' Anonymous session metadata (no prompts, no outputs) will be sent.'));\n } else {\n console.log(chalk.yellow(` ✓ Telemetry disabled.`));\n console.log(chalk.gray(' No events will be transmitted from this workspace.'));\n }\n console.log();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","node-file:F:/Softwares/Github Softwares/Cascade-AI/node_modules/keytar/build/Release/keytar.node","../node_modules/keytar/lib/keytar.js","../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/cli/index.ts","../src/config/keystore.ts","../src/config/ignore.ts","../src/config/cascade-md.ts","../src/memory/store.ts","../src/config/schema.ts","../src/config/validate.ts","../src/config/index.ts","../src/cli/utils/terminal-input.ts","../src/cli/utils/clipboard.ts","../src/cli/components/SafeTextInput.tsx","../src/cli/repl/index.tsx","../src/core/router/index.ts","../src/core/router/selector.ts","../src/core/router/failover.ts","../src/core/router/tpm-limiter.ts","../src/utils/cost.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/core/tiers/t1-administrator.ts","../src/utils/json-extract.ts","../src/tools/registry.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/mcp/client.ts","../src/core/permissions/escalator.ts","../src/telemetry/index.ts","../src/core/router/task-analyzer.ts","../src/tools/tool-creator.ts","../src/core/cascade.ts","../src/cli/themes/index.ts","../src/cli/slash/index.ts","../src/cli/repl/components/AgentTree.tsx","../src/cli/repl/components/TimelinePanel.tsx","../src/cli/repl/components/StatusBar.tsx","../src/cli/repl/components/HintBar.tsx","../src/cli/repl/components/ApprovalPrompt.tsx","../src/cli/repl/components/ModelsDisplay.tsx","../src/cli/repl/components/CostTracker.tsx","../src/cli/repl/utils/line-buffer.ts","../src/cli/commands/init.ts","../src/cli/setup/index.tsx","../src/cli/commands/doctor.ts","../src/cli/commands/update.ts","../src/dashboard/server.ts","../src/dashboard/auth.ts","../src/dashboard/socket-protocol.ts","../src/dashboard/websocket.ts","../src/cli/commands/dashboard.ts","../src/cli/commands/identity.ts","../src/cli/commands/models.ts","../src/cli/commands/export.ts","../src/cli/commands/telemetry.ts"],"names":["exports","require_keytar","Anthropic","OpenAI","GoogleGenAI","HarmCategory","HarmBlockThreshold","candidates","axios","fs","crypto","path","_ignoreModule","Database","randomUUID","z","os","spawnSync","useState","useRef","useEffect","useCallback","useInput","chalk","jsx","Text","EventEmitter","promisify","exec","simpleGit","PDFDocument","ignore","ignoreFactory","StdioClientTransport","Client","createContext","runInContext","stats","durationMs","Box","jsxs","Fragment","Spinner","useStdout","useMemo","wrapAnsi","useApp","useReducer","maxScroll","OllamaProvider","AnthropicProvider","OpenAIProvider","OpenAICompatibleProvider","GeminiProvider","AzureOpenAIProvider","SelectInput","render","React","ora","execAsync","jwt","SocketServer","parser","__dirname","fileURLToPath","express","createServer","bcrypt","rateLimit","timingSafeEqual","Command","session","dotenv"],"mappings":"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","file":"cli.cjs","sourcesContent":["// ─────────────────────────────────────────────\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 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 — 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 — CLI Entry Point\n// ─────────────────────────────────────────────\n\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport React from 'react';\nimport chalk from 'chalk';\nimport dotenv from 'dotenv';\nimport { CASCADE_VERSION, DEFAULT_THEME } from '../constants.js';\nimport { ConfigManager } from '../config/index.js';\nimport { Repl } from './repl/index.js';\nimport { initCommand } from './commands/init.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { updateCommand } from './commands/update.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { makeIdentityCommand } from './commands/identity.js';\nimport { modelsCommand } from './commands/models.js';\nimport { exportCommand } from './commands/export.js';\nimport { telemetryCommand } from './commands/telemetry.js';\nimport { runSetupWizard } from './setup/index.js';\n\ndotenv.config();\n\nconst program = new Command();\n\nprogram\n .name('cascade')\n .description('Multi-tier AI orchestration CLI')\n .version(CASCADE_VERSION, '-v, --version')\n .option('-p, --prompt <text>', 'Run a single prompt non-interactively')\n .option('-t, --theme <name>', 'Color theme', DEFAULT_THEME)\n .option('-w, --workspace <path>', 'Workspace path', process.cwd())\n .option('-i, --identity <name>', 'Identity name or ID')\n .option('--no-color', 'Disable colors')\n .action(async (options) => {\n await startRepl(options);\n });\n\nprogram.addCommand(makeIdentityCommand());\n\nprogram\n .command('init [path]')\n .description('Initialize Cascade in a project directory')\n .action(async (dirPath?: string) => {\n await initCommand(dirPath ?? process.cwd());\n });\n\nprogram\n .command('doctor')\n .description('Check system configuration and API key availability')\n .action(async () => {\n await doctorCommand();\n });\n\nprogram\n .command('update')\n .description('Update Cascade to the latest version')\n .action(async () => {\n await updateCommand();\n });\n\nprogram\n .command('dashboard')\n .description('Launch the web dashboard')\n .option('-p, --port <number>', 'Port number', '4891')\n .action(async (opts) => {\n const cm = new ConfigManager(process.cwd());\n await cm.load();\n const config = cm.getConfig();\n config.dashboard.port = parseInt(opts.port, 10);\n await dashboardCommand(config, process.cwd());\n });\n\nprogram\n .command('run <prompt>')\n .description('Run a single prompt and exit')\n .option('-t, --theme <name>', 'Color theme', DEFAULT_THEME)\n .option('-i, --identity <name>', 'Identity name or ID')\n .action(async (prompt: string, opts) => {\n await startRepl({ prompt, theme: opts.theme, workspace: process.cwd(), identity: opts.identity });\n });\n\nprogram\n .command('models')\n .description('List available AI models for each tier')\n .option('-v, --verbose', 'Show all models per provider with pricing')\n .action(async (opts) => {\n await modelsCommand({ verbose: opts.verbose });\n });\n\nprogram\n .command('telemetry [action]')\n .description('Toggle anonymous usage telemetry (on | off | status). Default: status')\n .action(async (action?: string) => {\n const normalized = (action ?? 'status').toLowerCase();\n if (normalized !== 'on' && normalized !== 'off' && normalized !== 'status') {\n console.error(chalk.red(`Unknown action: ${action}. Use: on | off | status`));\n process.exit(1);\n }\n await telemetryCommand(normalized);\n });\n\nprogram\n .command('export')\n .description('Export a session conversation to Markdown or JSON')\n .option('-s, --session <id>', 'Session ID to export (default: most recent)')\n .option('-f, --format <format>', 'Output format: markdown | json', 'markdown')\n .option('-o, --output <path>', 'Output file path')\n .action(async (opts) => {\n await exportCommand({\n sessionId: opts.session,\n format: opts.format as 'markdown' | 'json',\n output: opts.output,\n });\n });\n\n// ── Start REPL ────────────────────────────────\n\nasync function startRepl(options: {\n prompt?: string;\n theme?: string;\n workspace?: string;\n identity?: string;\n}): Promise<void> {\n const workspacePath = options.workspace ?? process.cwd();\n\n // Print banner\n printBanner();\n\n // Load config\n const cm = new ConfigManager(workspacePath);\n try {\n await cm.load();\n } catch (err) {\n console.error(chalk.red(`Config error: ${err instanceof Error ? err.message : String(err)}`));\n console.error(chalk.gray('Run `cascade init` to set up this directory.'));\n process.exit(1);\n }\n\n let config = cm.getConfig();\n\n // First-run detection: no providers configured → launch setup wizard\n const needsSetup =\n !config.providers?.length ||\n config.providers.every((p: { type: string; apiKey?: string }) => p.type !== 'ollama' && !p.apiKey);\n\n if (needsSetup) {\n console.log(chalk.magenta(' ◈ No providers configured — launching setup wizard…'));\n console.log();\n config = await runSetupWizard(workspacePath);\n await cm.updateConfig(config);\n // Reload to pick up persisted defaults\n await cm.load();\n config = cm.getConfig();\n }\n\n // Render ink REPL\n const { waitUntilExit } = render(\n React.createElement(Repl, {\n config,\n workspacePath,\n themeName: options.theme ?? config.theme ?? DEFAULT_THEME,\n initialPrompt: options.prompt,\n identityName: options.identity,\n }),\n { exitOnCtrlC: false },\n );\n\n await waitUntilExit();\n process.exit(0);\n}\n\nfunction printBanner(): void {\n if (process.stdout.columns < 60) return;\n console.log();\n console.log(chalk.hex('#7C6AF7').bold(' ╔═══════════════════════════════╗'));\n console.log(chalk.hex('#7C6AF7').bold(' ║') + chalk.white.bold(' ◈ CASCADE AI') + chalk.gray(' v' + CASCADE_VERSION + ' ') + chalk.hex('#7C6AF7').bold('║'));\n console.log(chalk.hex('#7C6AF7').bold(' ║') + chalk.gray(' Multi-Tier Orchestration ') + chalk.hex('#7C6AF7').bold('║'));\n console.log(chalk.hex('#7C6AF7').bold(' ╚═══════════════════════════════╝'));\n console.log();\n}\n\nprogram.parse(process.argv);\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 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 — 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 — Terminal input sanitizers & modes\n// ─────────────────────────────────────────────\n//\n// Centralizes the terminal-control escape sequences that would otherwise\n// pollute Ink text inputs:\n// - SGR mouse reports (`\\x1b[<b;x;yM` / `\\x1b[<b;x;ym`) from mouse moves,\n// wheel scroll, and right-click events.\n// - Bracketed-paste markers (`\\x1b[200~…\\x1b[201~`) — these are handled\n// at a higher level but stripped as a safety net.\n// - CSI / SS3 / OSC / DCS sequences and stray C0 control characters.\n//\n// The REPL and the setup wizard both need the same behaviour, so the\n// logic lives here in one place and is referenced by both.\n\n/**\n * Matches SGR-encoded mouse reports (xterm 1006 mode):\n * ESC [ < Pb ; Px ; Py (M|m)\n * We match lazily to avoid eating unrelated CSI sequences that happen to\n * contain semicolons.\n */\nexport const MOUSE_SGR_RE = /\\x1b\\[<\\d+;\\d+;\\d+[Mm]/g;\n\n/**\n * Matches x10/legacy mouse reports:\n * ESC [ M Cb Cx Cy (three raw bytes follow)\n * Uses a tolerant character class so we swallow the trailing bytes safely.\n */\nexport const MOUSE_LEGACY_RE = /\\x1b\\[M[\\s\\S]{3}/g;\n\n/** Bracketed-paste start / end markers. */\nexport const PASTE_START = '\\x1b[200~';\nexport const PASTE_END = '\\x1b[201~';\n\n/**\n * Broad escape-sequence stripper used as a final safety net on anything\n * that reaches the text input's onChange. Preserves \\x7F (backspace/delete)\n * because Ink's TextInput relies on it.\n */\n// Order matters: put the legacy 3-byte mouse sequence BEFORE any shorter\n// pattern that could match `\\x1b[M` alone, otherwise the trailing raw\n// bytes leak through.\nconst ESC_SANITIZER_RE =\n /(?:\\x1b\\[<\\d+;\\d+;\\d+[Mm])|(?:\\x1b\\[M[\\s\\S]{3})|(?:\\x1b\\[\\d+[Mm])|(?:\\x1b\\[\\?[0-9;]*[a-zA-Z])|(?:\\x1b\\[[0-9;?]*[\\x40-\\x7E])|(?:\\x1bO[\\x40-\\x7E])|(?:\\x1b[PX^_][\\s\\S]*?\\x1b\\\\)|(?:\\x1b\\][\\s\\S]*?(?:\\x07|\\x1b\\\\))|[\\x00-\\x08\\x0B-\\x1F]/g;\n\nexport function sanitizeTerminalInput(value: string): string {\n return value.replace(ESC_SANITIZER_RE, '');\n}\n\n/** True if the chunk contains a mouse report (SGR or legacy). */\nexport function containsMouseSequence(chunk: string): boolean {\n return /\\x1b\\[<\\d+;\\d+;\\d+[Mm]/.test(chunk) || /\\x1b\\[M[\\s\\S]{3}/.test(chunk);\n}\n\n/**\n * Enable xterm-compatible bracketed paste mode. Terminals that support it\n * will wrap pasted content in ESC[200~ / ESC[201~ so we can distinguish\n * pasted bytes from typed keystrokes.\n */\nexport function enableBracketedPaste(): void {\n try { process.stdout.write('\\x1b[?2004h'); } catch { /* non-TTY */ }\n}\n\nexport function disableBracketedPaste(): void {\n try { process.stdout.write('\\x1b[?2004l'); } catch { /* non-TTY */ }\n}\n\n/** Disable any mouse reporting that a prior run or terminal may have left on. */\nexport function disableMouseReporting(): void {\n try {\n // 1000 = press/release, 1002 = button-motion, 1003 = any-motion,\n // 1006 = SGR encoding, 1015 = urxvt encoding.\n process.stdout.write('\\x1b[?1000l\\x1b[?1002l\\x1b[?1003l\\x1b[?1006l\\x1b[?1015l');\n } catch {\n /* non-TTY */\n }\n}\n\n/** Enable SGR mouse reporting (used only by the REPL for scroll handling). */\nexport function enableMouseReporting(): void {\n try { process.stdout.write('\\x1b[?1000h\\x1b[?1006h'); } catch { /* non-TTY */ }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Cross-platform clipboard reader\n// ─────────────────────────────────────────────\n//\n// Shells out to the native OS clipboard command. Used as a fallback\n// when the terminal does not translate Ctrl+V into a paste event\n// (e.g. legacy Windows console, some SSH sessions, etc.).\n//\n// Returns an empty string on failure rather than throwing — the caller\n// is typing in an interactive TUI and we don't want to crash the UI.\n\nimport { spawnSync } from 'node:child_process';\n\ntype Cmd = { cmd: string; args: string[] };\n\nfunction candidates(): Cmd[] {\n if (process.platform === 'win32') {\n return [\n // Prefer powershell.exe which is present on all supported Windows versions.\n { cmd: 'powershell.exe', args: ['-NoProfile', '-Command', 'Get-Clipboard -Raw'] },\n { cmd: 'pwsh.exe', args: ['-NoProfile', '-Command', 'Get-Clipboard -Raw'] },\n ];\n }\n if (process.platform === 'darwin') {\n return [{ cmd: 'pbpaste', args: [] }];\n }\n // Linux / BSD — try the common clipboard tools in order.\n const out: Cmd[] = [];\n if (process.env['WAYLAND_DISPLAY']) {\n out.push({ cmd: 'wl-paste', args: ['--no-newline'] });\n }\n out.push({ cmd: 'xclip', args: ['-selection', 'clipboard', '-o'] });\n out.push({ cmd: 'xsel', args: ['--clipboard', '--output'] });\n // Termux on Android\n out.push({ cmd: 'termux-clipboard-get', args: [] });\n return out;\n}\n\n/**\n * Read the system clipboard. Returns an empty string if the clipboard is\n * empty or no supported clipboard tool is available. Never throws.\n *\n * The result is trimmed of a single trailing newline (which `Get-Clipboard`\n * and most X clipboard tools append) so pasted single-line values don't\n * auto-submit the current prompt.\n */\nexport function readClipboardSync(): string {\n for (const { cmd, args } of candidates()) {\n try {\n const result = spawnSync(cmd, args, {\n encoding: 'utf-8',\n timeout: 1500,\n // Hide any stderr output — we'll fall back silently.\n stdio: ['ignore', 'pipe', 'ignore'],\n windowsHide: true,\n });\n if (result.status === 0 && typeof result.stdout === 'string') {\n // PowerShell's Get-Clipboard appends a trailing CRLF; pbpaste doesn't.\n // Strip a single trailing newline so paste doesn't auto-submit.\n return result.stdout.replace(/\\r\\n?$/, '').replace(/\\n$/, '');\n }\n } catch {\n // try next candidate\n }\n }\n return '';\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — SafeTextInput\n// ─────────────────────────────────────────────\n//\n// A drop-in replacement for `ink-text-input` that fixes three real-world\n// papercuts observed on Windows consoles and some SSH terminals:\n//\n// 1. Ctrl+V (and Ctrl+Shift+V) insert a literal \"v\" instead of pasting.\n// Ink treats Ctrl+V as a modified keypress; the terminal never\n// converts it into clipboard bytes in raw mode. We intercept the\n// keypress ourselves and read the system clipboard via a small\n// cross-platform shell-out.\n//\n// 2. Right-click / scroll wheel / other mouse events emit raw SGR\n// sequences like `\\x1b[<2;98;44M` which end up typed into the\n// field. We disable mouse reporting on mount and strip any\n// sequences that still arrive.\n//\n// 3. Bracketed-paste content (ESC[200~…ESC[201~) from modern terminals\n// is captured in a single insert rather than being processed one\n// character at a time.\n//\n// The prop surface mirrors ink-text-input so existing call sites can\n// swap the component with no other changes.\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Text, useInput } from 'ink';\nimport chalk from 'chalk';\nimport {\n PASTE_START,\n PASTE_END,\n sanitizeTerminalInput,\n enableBracketedPaste,\n disableBracketedPaste,\n disableMouseReporting,\n} from '../utils/terminal-input.js';\nimport { readClipboardSync } from '../utils/clipboard.js';\n\nexport interface SafeTextInputProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit?: (value: string) => void;\n placeholder?: string;\n /** When set, displayed characters are replaced with this glyph (for API keys). */\n mask?: string;\n focus?: boolean;\n showCursor?: boolean;\n /** Disable the Ctrl+V clipboard fallback. Defaults to `false`. */\n disableClipboardFallback?: boolean;\n /**\n * When `true` (default) the component disables mouse reporting on mount.\n * Set to `false` from hosts (e.g. the REPL) that keep mouse reporting\n * enabled for scroll-wheel handling.\n */\n manageMouseReporting?: boolean;\n}\n\nconst PASTE_BUFFER_TIMEOUT_MS = 500;\n\nexport function SafeTextInput(props: SafeTextInputProps): React.ReactElement {\n const {\n value,\n onChange,\n onSubmit,\n placeholder = '',\n mask,\n focus = true,\n showCursor = true,\n disableClipboardFallback = false,\n manageMouseReporting = true,\n } = props;\n\n const [cursorOffset, setCursorOffset] = useState<number>(value.length);\n\n const valueRef = useRef(value);\n valueRef.current = value;\n const cursorRef = useRef(cursorOffset);\n cursorRef.current = cursorOffset;\n const focusRef = useRef(focus);\n focusRef.current = focus;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const onSubmitRef = useRef(onSubmit);\n onSubmitRef.current = onSubmit;\n\n // Keep cursor within bounds when value shrinks externally.\n useEffect(() => {\n if (cursorOffset > value.length) setCursorOffset(value.length);\n }, [value, cursorOffset]);\n\n // Insert text at the current cursor position.\n const insertAtCursor = useCallback((text: string) => {\n const v = valueRef.current;\n const c = cursorRef.current;\n const next = v.slice(0, c) + text + v.slice(c);\n valueRef.current = next;\n const nextCursor = c + text.length;\n cursorRef.current = nextCursor;\n setCursorOffset(nextCursor);\n onChangeRef.current(next);\n }, []);\n\n // Bracketed-paste buffer state.\n const pasteBufferRef = useRef<string | null>(null);\n const pasteTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n // Tracks the most recent forward-delete (ESC[3~) handled in the raw stdin\n // listener. Ink surfaces BOTH backspace (\\x7F) and forward-delete (\\x1b[3~)\n // as `key.delete = true`, so useInput cannot distinguish them. We handle\n // forward-delete in the raw listener and set this timestamp so the\n // useInput handler can ignore the duplicate event that Ink is about to\n // fire for the same keystroke.\n const lastForwardDeleteRef = useRef<number>(0);\n\n const flushPaste = useCallback(() => {\n const buf = pasteBufferRef.current;\n pasteBufferRef.current = null;\n if (pasteTimerRef.current) { clearTimeout(pasteTimerRef.current); pasteTimerRef.current = null; }\n if (buf === null) return;\n const content = sanitizeTerminalInput(buf);\n if (content) insertAtCursor(content);\n }, [insertAtCursor]);\n\n // Enable bracketed paste + (optionally) disable mouse reporting on mount.\n useEffect(() => {\n enableBracketedPaste();\n if (manageMouseReporting) disableMouseReporting();\n return () => {\n disableBracketedPaste();\n if (pasteTimerRef.current) clearTimeout(pasteTimerRef.current);\n };\n }, [manageMouseReporting]);\n\n // Raw stdin listener — captures bracketed-paste content before Ink\n // splits it into per-character keypress events.\n useEffect(() => {\n const onData = (data: Buffer) => {\n if (!focusRef.current) return;\n const chunk = data.toString('utf8');\n\n // Continue an in-flight paste.\n if (pasteBufferRef.current !== null) {\n const endIdx = chunk.indexOf(PASTE_END);\n if (endIdx === -1) {\n pasteBufferRef.current += chunk;\n } else {\n pasteBufferRef.current += chunk.slice(0, endIdx);\n flushPaste();\n }\n return;\n }\n\n // Detect a new paste.\n const startIdx = chunk.indexOf(PASTE_START);\n if (startIdx !== -1) {\n const after = chunk.slice(startIdx + PASTE_START.length);\n const endIdx = after.indexOf(PASTE_END);\n if (endIdx !== -1) {\n const pasted = sanitizeTerminalInput(after.slice(0, endIdx));\n if (pasted) insertAtCursor(pasted);\n } else {\n pasteBufferRef.current = after;\n pasteTimerRef.current = setTimeout(flushPaste, PASTE_BUFFER_TIMEOUT_MS);\n }\n return;\n }\n\n // Forward-delete key: ESC[3~ (PC Delete, not Backspace).\n // Ink will also dispatch this as `key.delete = true`, which our\n // useInput handler treats as backspace. We pre-empt it here so the\n // character at the cursor is removed instead of the character before\n // the cursor, and record the timestamp so useInput can skip the\n // duplicate event. The chunk can contain other keypress bytes on\n // some terminals, so we match both an exact equal and an endsWith.\n if (chunk === '\\x1b[3~' || chunk.endsWith('\\x1b[3~')) {\n lastForwardDeleteRef.current = Date.now();\n const c = cursorRef.current;\n const v = valueRef.current;\n if (c < v.length) {\n const next = v.slice(0, c) + v.slice(c + 1);\n valueRef.current = next;\n onChangeRef.current(next);\n // Cursor stays where it is for forward-delete.\n }\n return;\n }\n };\n\n process.stdin.on('data', onData);\n return () => { process.stdin.off('data', onData); };\n }, [flushPaste, insertAtCursor]);\n\n useInput((input, key) => {\n if (!focusRef.current) return;\n\n // Ignore outer navigation keys — let the parent component act on them.\n if (key.upArrow || key.downArrow || key.tab || (key.shift && key.tab)) return;\n if (key.ctrl && input === 'c') return;\n\n // Ctrl+V / Ctrl+Shift+V → read clipboard.\n if (key.ctrl && (input === 'v' || input === 'V')) {\n if (disableClipboardFallback) return;\n const text = readClipboardSync();\n if (text) {\n const sanitized = sanitizeTerminalInput(text);\n if (sanitized) insertAtCursor(sanitized);\n }\n return;\n }\n\n if (key.return) {\n onSubmitRef.current?.(valueRef.current);\n return;\n }\n\n if (key.leftArrow) {\n setCursorOffset(c => Math.max(0, c - 1));\n return;\n }\n if (key.rightArrow) {\n setCursorOffset(c => Math.min(valueRef.current.length, c + 1));\n return;\n }\n\n // Home / End (these arrive via `key.ctrl` flags in some terminals;\n // ink doesn't map them natively — we simply support the common case).\n if (key.backspace || key.delete) {\n // Ink surfaces BOTH \\x7F (backspace) and \\x1b[3~ (forward-delete) as\n // `key.delete = true`. The raw stdin listener already handled the\n // forward-delete case; if that fired within the last few ms, this\n // duplicate event should be ignored to avoid deleting a second char.\n if (Date.now() - lastForwardDeleteRef.current < 50) return;\n const v = valueRef.current;\n const c = cursorRef.current;\n if (c === 0) return;\n const next = v.slice(0, c - 1) + v.slice(c);\n valueRef.current = next;\n const nextCursor = c - 1;\n cursorRef.current = nextCursor;\n setCursorOffset(nextCursor);\n onChangeRef.current(next);\n return;\n }\n\n if (!input) return;\n\n // Any modifier-key combo we don't explicitly handle is ignored so\n // that stray Ctrl+<letter> keystrokes don't type a literal letter.\n if (key.ctrl || key.meta) return;\n\n // Strip escape sequences / control characters that slipped through.\n const cleaned = sanitizeTerminalInput(input);\n if (cleaned.length === 0) return;\n insertAtCursor(cleaned);\n }, { isActive: focus });\n\n // ── Render ──────────────────────────────────────\n const displayValue = mask ? mask.repeat(value.length) : value;\n\n let rendered: string;\n if (displayValue.length === 0) {\n rendered = showCursor && focus\n ? (placeholder.length > 0 ? chalk.inverse(placeholder[0]!) + chalk.grey(placeholder.slice(1)) : chalk.inverse(' '))\n : (placeholder.length > 0 ? chalk.grey(placeholder) : '');\n } else if (!showCursor || !focus) {\n rendered = displayValue;\n } else {\n let out = '';\n for (let i = 0; i < displayValue.length; i++) {\n out += i === cursorOffset ? chalk.inverse(displayValue[i]!) : displayValue[i]!;\n }\n if (cursorOffset >= displayValue.length) out += chalk.inverse(' ');\n rendered = out;\n }\n\n return <Text>{rendered}</Text>;\n}\n\nexport default SafeTextInput;\n","// ─────────────────────────────────────────────\n// Cascade AI — Interactive REPL (ink)\n// ─────────────────────────────────────────────\n\nimport React, { useCallback, useEffect, useReducer, useRef, useState } from 'react';\nimport { Box, Text, useApp, useInput, useStdout } from 'ink';\nimport { SafeTextInput } from '../components/SafeTextInput.js';\nimport { sanitizeTerminalInput, containsMouseSequence } from '../utils/terminal-input.js';\nimport { randomUUID } from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n ApprovalRequest,\n CascadeConfig,\n ConversationMessage,\n ModelInfo,\n ProviderType,\n RuntimeNode,\n RuntimeNodeLog,\n Session,\n Theme,\n Message,\n} from '../../types.js';\nimport { CASCADE_DB_FILE, GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE } from '../../constants.js';\nimport { Cascade } from '../../core/cascade.js';\nimport { MemoryStore } from '../../memory/store.js';\nimport { ModelSelector } from '../../core/router/selector.js';\nimport { OpenAIProvider } from '../../providers/openai.js';\nimport { GeminiProvider } from '../../providers/gemini.js';\nimport { AnthropicProvider } from '../../providers/anthropic.js';\nimport { OllamaProvider } from '../../providers/ollama.js';\nimport { OpenAICompatibleProvider } from '../../providers/openai-compatible.js';\nimport type { BaseProvider } from '../../providers/base.js';\nimport { getTheme } from '../themes/index.js';\nimport { SlashCommandRegistry } from '../slash/index.js';\nimport { AgentTree, type TierNode } from './components/AgentTree.js';\nimport { TimelinePanel } from './components/TimelinePanel.js';\nimport { StatusBar } from './components/StatusBar.js';\nimport { HintBar } from './components/HintBar.js';\nimport { ApprovalPrompt } from './components/ApprovalPrompt.js';\nimport { ModelsDisplay, type ModelPickerSelection } from './components/ModelsDisplay.js';\nimport { CostTracker } from './components/CostTracker.js';\nimport { CompactStatus } from './components/CompactStatus.js';\nimport { formatToLines } from './utils/line-buffer.js';\n\ninterface WelcomeBannerProps {\n theme: Theme;\n config: CascadeConfig;\n workspacePath: string;\n sessionId: string;\n}\n\nfunction WelcomeBanner({ theme, config, workspacePath, sessionId }: WelcomeBannerProps) {\n const t1 = config.models?.t1 ?? 'auto';\n const t2 = config.models?.t2 ?? 'auto';\n const t3 = config.models?.t3 ?? 'auto';\n const folder = workspacePath.split(/[/\\\\]/).pop() ?? workspacePath;\n\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingLeft={2}>\n <Text color={theme.colors.primary} bold>◈ CASCADE AI</Text>\n <Text color={theme.colors.muted}>\n {'T1: '}<Text color={theme.colors.foreground}>{t1}</Text>\n {' T2: '}<Text color={theme.colors.foreground}>{t2}</Text>\n {' T3: '}<Text color={theme.colors.foreground}>{t3}</Text>\n </Text>\n <Text color={theme.colors.muted}>\n {'workspace: '}<Text color={theme.colors.foreground}>{folder}</Text>\n {' · session: '}<Text color={theme.colors.foreground}>{sessionId.slice(0, 8)}</Text>\n </Text>\n <Box marginTop={1}>\n <Text color={theme.colors.muted}>\n {'Type '}<Text color={theme.colors.accent} bold>/help</Text>{' for commands · Esc to cancel · Ctrl+C to exit'}\n </Text>\n </Box>\n </Box>\n );\n}\n\ninterface FlatTreeNode extends TierNode {\n parentId?: string;\n}\n\ninterface RootTierEvent {\n role: 'T1' | 'T2' | 'T3';\n}\n\ninterface TierStatusEvent {\n tierId: string;\n role: 'T1' | 'T2' | 'T3';\n parentId?: string;\n label?: string;\n status: RuntimeNode['status'];\n currentAction?: string;\n progressPct?: number;\n}\n\ninterface ReplState {\n messages: Message[];\n agentTree: TierNode | null;\n isStreaming: boolean;\n isExecuting: boolean;\n streamBuffer: string;\n totalTokens: number;\n totalCostUsd: number;\n callsByProvider: Record<string, number>;\n callsByTier: Record<string, number>;\n costByTier: Record<string, number>;\n tokensByTier: Record<string, number>;\n approvalRequest: ApprovalRequest | null;\n showCost: boolean;\n showDetails: boolean;\n error: string | null;\n activeTool: string | null;\n}\n\ntype ReplAction =\n | { type: 'ADD_MESSAGE'; message: Message }\n | { type: 'APPEND_STREAM'; text: string }\n | { type: 'COMMIT_STREAM'; finalText: string; timestamp?: string }\n | { type: 'SET_TREE'; tree: TierNode | null }\n | { type: 'UPDATE_COST'; tokens: number; costUsd: number; byProvider: Record<string,number>; byTier: Record<string,number>; costByTier: Record<string,number>; tokensByTier: Record<string,number> }\n | { type: 'SET_APPROVAL'; request: ApprovalRequest | null }\n | { type: 'SET_EXECUTING'; isExecuting: boolean }\n | { type: 'SET_STREAMING'; isStreaming: boolean }\n | { type: 'CLEAR' }\n | { type: 'TOGGLE_COST' }\n | { type: 'TOGGLE_DETAILS' }\n | { type: 'SET_ERROR'; error: string | null }\n | { type: 'SET_ACTIVE_TOOL'; toolName: string | null };\n\nfunction replReducer(state: ReplState, action: ReplAction): ReplState {\n switch (action.type) {\n case 'ADD_MESSAGE':\n return { ...state, messages: [...state.messages, action.message], isStreaming: false, streamBuffer: '' };\n case 'APPEND_STREAM':\n return { ...state, isStreaming: true, streamBuffer: state.streamBuffer + action.text };\n case 'COMMIT_STREAM': {\n const msg: Message = {\n id: randomUUID(),\n role: 'assistant',\n content: action.finalText,\n timestamp: action.timestamp ?? new Date().toISOString(),\n };\n return { ...state, messages: [...state.messages, msg], isStreaming: false, streamBuffer: '', activeTool: null };\n }\n case 'SET_TREE':\n return { ...state, agentTree: action.tree };\n case 'UPDATE_COST':\n return { ...state, totalTokens: action.tokens, totalCostUsd: action.costUsd, callsByProvider: action.byProvider, callsByTier: action.byTier, costByTier: action.costByTier, tokensByTier: action.tokensByTier };\n case 'SET_APPROVAL':\n return { ...state, approvalRequest: action.request };\n case 'SET_EXECUTING':\n return { ...state, isExecuting: action.isExecuting };\n case 'SET_STREAMING':\n return { ...state, isStreaming: action.isStreaming };\n case 'CLEAR':\n return { ...state, messages: [], agentTree: null, streamBuffer: '', totalTokens: 0, totalCostUsd: 0, activeTool: null };\n case 'TOGGLE_COST':\n return { ...state, showCost: !state.showCost };\n case 'TOGGLE_DETAILS':\n return { ...state, showDetails: !state.showDetails };\n case 'SET_ERROR':\n return { ...state, error: action.error };\n case 'SET_ACTIVE_TOOL':\n return { ...state, activeTool: action.toolName };\n default:\n return state;\n }\n}\n\ninterface ReplProps {\n config: CascadeConfig;\n workspacePath: string;\n themeName: string;\n initialPrompt?: string;\n identityName?: string;\n}\n\nasync function refreshModelCache(store: MemoryStore, providers: CascadeConfig['providers']) {\n for (const provider of providers) {\n try {\n const dummyModel: ModelInfo = { id: 'dummy', name: 'dummy', provider: provider.type, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: false };\n let instance: BaseProvider | undefined;\n if (provider.type === 'openai') instance = new OpenAIProvider(provider, dummyModel);\n else if (provider.type === 'gemini') instance = new GeminiProvider(provider, dummyModel);\n else if (provider.type === 'anthropic') instance = new AnthropicProvider(provider, dummyModel);\n else if (provider.type === 'ollama') instance = new OllamaProvider(provider, dummyModel);\n else if (provider.type === 'openai-compatible') instance = new OpenAICompatibleProvider(provider, dummyModel);\n if (instance) {\n const fetched = await instance.listModels();\n for (const m of fetched) store.upsertCachedModel(m);\n }\n } catch (err) { console.error(`Failed refresh: ${provider.type}`, err); }\n }\n}\n\nexport function Repl({ config, workspacePath, themeName, initialPrompt, identityName }: ReplProps): React.ReactElement {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const [theme, setTheme] = useState<Theme>(() => getTheme(themeName));\n const [input, setInput] = useState('');\n const [inputHistory, setInputHistory] = useState<string[]>([]);\n const [historyIndex, setHistoryIndex] = useState<number | null>(null);\n const [slashIndex, setSlashIndex] = useState(0);\n const [identities, setIdentities] = useState<Array<{ id: string; name: string; isDefault: boolean }>>([]);\n const [currentIdentityId, setCurrentIdentityId] = useState<string | undefined>(config.defaultIdentityId);\n const [state, dispatch] = useReducer(replReducer, { messages: [], agentTree: null, isStreaming: false, isExecuting: false, streamBuffer: '', totalTokens: 0, totalCostUsd: 0, callsByProvider: {}, callsByTier: {}, costByTier: {}, tokensByTier: {}, approvalRequest: null, showCost: false, showDetails: false, error: null, activeTool: null });\n const [isShowingModels, setIsShowingModels] = useState(false);\n const [cachedModels, setCachedModels] = useState<Map<ProviderType, ModelInfo[]>>(new Map());\n const cascadeRef = useRef<Cascade | null>(null);\n const storeRef = useRef<MemoryStore | null>(null);\n const slashRef = useRef(new SlashCommandRegistry());\n const approvalResolverRef = useRef<((decision: { approved: boolean; always: boolean }) => void) | null>(null);\n const sessionIdRef = useRef(randomUUID());\n const startedAtRef = useRef(new Date().toISOString());\n const treeNodesRef = useRef<Map<string, FlatTreeNode>>(new Map());\n const nodeLogsRef = useRef<Map<string, string[]>>(new Map());\n const [startupWarning, setStartupWarning] = useState<string | null>(null);\n const [timelineIndex, setTimelineIndex] = useState(0);\n const [scrollOffset, setScrollOffset] = useState(0);\n const [isAutoScrolling, setIsAutoScrolling] = useState(true);\n const [queuedMessages, setQueuedMessages] = useState<string[]>([]);\n const [quitAttempted, setQuitAttempted] = useState(false);\n const isInputLockedRef = useRef(false);\n const lockTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n const lockInputTemporarily = useCallback(() => {\n isInputLockedRef.current = true;\n if (lockTimerRef.current) clearTimeout(lockTimerRef.current);\n lockTimerRef.current = setTimeout(() => { isInputLockedRef.current = false; }, 200);\n }, []);\n\n const sessionTitle = state.messages.find(m => m.role === 'user')?.content.slice(0, 72) ?? 'Cascade Session';\n const lastUserPrompt = useRef<string | null>(null);\n const lastSubmittedInputRef = useRef<string | null>(null);\n const sessionTitleGeneratedRef = useRef(false);\n const rootTierIdRef = useRef<'T1' | 't2-root' | 't3-root'>('T1');\n const SLASH_PAGE_SIZE = 8;\n const isTypingCommand = input.startsWith('/');\n // Full list of matching commands (names only — used for index cycling & Tab)\n const slashCompletions = isTypingCommand ? (\n input.startsWith('/identity ')\n ? identities.map(i => `/identity ${i.name}`).filter(c => c.startsWith(input))\n : slashRef.current.getCompletions(input)\n ) : [];\n // Paired list with descriptions for the suggestion panel\n const slashEntries = isTypingCommand ? (\n input.startsWith('/identity ')\n ? identities.map(i => `/identity ${i.name}`).filter(c => c.startsWith(input)).map(c => ({ command: c, description: '' }))\n : slashRef.current.getCompletionEntries(input)\n ) : [];\n // Viewport: keep selected item visible, centred in the window\n const slashViewStart = Math.max(\n 0,\n Math.min(\n slashIndex - Math.floor(SLASH_PAGE_SIZE / 2),\n slashEntries.length - SLASH_PAGE_SIZE,\n ),\n );\n\n const persistMessage = useCallback((role: 'user' | 'assistant' | 'system', content: string, timestamp: string) => {\n storeRef.current?.addMessage({ id: randomUUID(), sessionId: sessionIdRef.current, role, content, timestamp });\n }, []);\n\n /**\n * Apply a selection from the interactive model picker:\n * - update the in-memory CascadeConfig.models[tier]\n * - persist the updated config to .cascade/config.json\n * - hot-swap the running router via overrideTierModel (if a concrete\n * ModelInfo is available in the model cache)\n * - print a short confirmation in the chat stream\n */\n const applyModelPick = useCallback(async (sel: ModelPickerSelection) => {\n const tierKey = sel.tier.toLowerCase() as 't1' | 't2' | 't3';\n const tierLabel = sel.tier;\n\n // Update in-memory config (mutating is OK here — this is a TUI session\n // local copy; runCascade hasn't persisted it elsewhere).\n if (sel.kind === 'auto') {\n delete (config.models as Record<string, string | undefined>)[tierKey];\n } else {\n (config.models as Record<string, string | undefined>)[tierKey] = sel.modelId;\n }\n\n // Hot-swap the live router — best-effort.\n try {\n const router = cascadeRef.current?.getRouter();\n if (router && sel.kind === 'pick') {\n const candidate = (cachedModels.get(sel.provider) ?? []).find(m => m.id === sel.modelId);\n if (candidate) router.overrideTierModel(tierLabel, candidate);\n }\n } catch {\n /* hot-swap is best effort; persisted config will take effect next start */\n }\n\n // Persist .cascade/config.json\n const configPath = path.join(workspacePath, '.cascade', 'config.json');\n try {\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n dispatch({\n type: 'ADD_MESSAGE',\n message: { id: randomUUID(), role: 'error', content: `Failed to persist model selection: ${msg}`, timestamp: new Date().toISOString() },\n });\n return;\n }\n\n const summary = sel.kind === 'auto'\n ? `${tierLabel} → Auto (Cascade will pick best available).`\n : `${tierLabel} → ${sel.modelId} (provider: ${sel.provider}).`;\n dispatch({\n type: 'ADD_MESSAGE',\n message: { id: randomUUID(), role: 'system', content: `✔ Model updated — ${summary}`, timestamp: new Date().toISOString() },\n });\n }, [config, workspacePath, cachedModels]);\n\n const globalStoreRef = useRef<MemoryStore | null>(null);\n\n const persistRuntimeSession = useCallback((status: 'ACTIVE' | 'COMPLETED' | 'FAILED', latestPrompt?: string) => {\n const runtimeSession = { sessionId: sessionIdRef.current, title: sessionTitle, workspacePath, status, startedAt: startedAtRef.current, updatedAt: new Date().toISOString(), latestPrompt, isGlobal: false };\n storeRef.current?.upsertRuntimeSession(runtimeSession);\n globalStoreRef.current?.upsertRuntimeSession({ ...runtimeSession, isGlobal: true });\n }, [sessionTitle, workspacePath]);\n\n const rebuildTree = useCallback(() => { dispatch({ type: 'SET_TREE', tree: buildTreeFromFlatNodes([...treeNodesRef.current.values()]) }); }, []);\n\n const recordNodeEvent = useCallback((event: TierStatusEvent) => {\n const existing = treeNodesRef.current.get(event.tierId);\n const node: FlatTreeNode = { id: event.tierId, role: event.role ?? existing?.role ?? 'T3', label: event.label ?? existing?.label ?? event.tierId, status: event.status ?? existing?.status ?? 'IDLE', currentAction: event.currentAction ?? existing?.currentAction, progressPct: event.progressPct ?? existing?.progressPct, parentId: event.parentId ?? existing?.parentId, children: [] };\n treeNodesRef.current.set(event.tierId, node);\n const store = storeRef.current;\n if (store) {\n const runtimeNode: RuntimeNode = { tierId: node.id, sessionId: sessionIdRef.current, parentId: node.parentId, role: node.role, label: node.label, status: node.status, currentAction: node.currentAction, progressPct: node.progressPct, updatedAt: new Date().toISOString(), workspacePath, isGlobal: false };\n store.upsertRuntimeNode(runtimeNode);\n globalStoreRef.current?.upsertRuntimeNode({ ...runtimeNode, isGlobal: true });\n }\n const history = nodeLogsRef.current.get(node.id) ?? [];\n nodeLogsRef.current.set(node.id, [...history.slice(-24), [node.status, node.currentAction].filter(Boolean).join(' — ')]);\n rebuildTree();\n }, [rebuildTree, workspacePath]);\n\n useEffect(() => {\n // Silence verbose SDK warnings that pollute the TUI\n const originalWarn = console.warn;\n const originalLog = console.log;\n \n process.stdout.write('\\x1bc');\n\n console.warn = (...args: unknown[]) => {\n const msg = args.join(' ');\n if (msg.includes('non-text parts') || msg.includes('functionCall')) return;\n originalWarn(...args);\n };\n\n // Also silence some direct logs if they leak\n console.log = (...args: unknown[]) => {\n const msg = args.join(' ');\n if (msg.includes('non-text parts')) return;\n originalLog(...args);\n };\n\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n storeRef.current = store;\n globalStoreRef.current = new MemoryStore(path.join(process.env['HOME'] ?? process.cwd(), GLOBAL_CONFIG_DIR, GLOBAL_RUNTIME_DB_FILE));\n const identityRows = store.listIdentities().map(i => ({ id: i.id, name: i.name, isDefault: i.isDefault }));\n setIdentities(identityRows);\n let initialIdentityId = config.defaultIdentityId ?? identityRows.find(i => i.isDefault)?.id ?? identityRows[0]?.id;\n if (identityName) {\n const match = identityRows.find(i => i.id === identityName || i.name.toLowerCase() === identityName.toLowerCase());\n if (match) initialIdentityId = match.id;\n else console.warn(`Identity '${identityName}' not found. Using default.`);\n }\n setCurrentIdentityId(initialIdentityId);\n const loadCache = async () => {\n const models = store.getCachedModels();\n const map = new Map<ProviderType, ModelInfo[]>();\n for (const m of models) { const list = map.get(m.provider) ?? []; list.push(m); map.set(m.provider, list); }\n setCachedModels(map);\n if (models.length === 0 || store.getCacheAge() > 24 * 60 * 60 * 1000) await refreshModelCache(store, config.providers);\n };\n loadCache();\n store.createSession({ id: sessionIdRef.current, title: 'Cascade Session', createdAt: startedAtRef.current, updatedAt: startedAtRef.current, identityId: config.defaultIdentityId ?? 'default', workspacePath, messages: [], metadata: { totalTokens: 0, totalCostUsd: 0, modelsUsed: [], toolsUsed: [], taskCount: 0 } });\n persistRuntimeSession('ACTIVE');\n cascadeRef.current = new Cascade(config, workspacePath);\n cascadeRef.current.init().catch(err => setStartupWarning(`Init failed: ${err.message}`));\n validateConfiguredModels(config).then(setStartupWarning);\n return () => {\n persistRuntimeSession('COMPLETED');\n // Close any MCP servers / telemetry the Cascade orchestrator opened so\n // we don't leak child processes when the REPL exits.\n cascadeRef.current?.close().catch(() => { /* ignored on shutdown */ });\n globalStoreRef.current?.close();\n store.close();\n console.warn = originalWarn;\n console.log = originalLog;\n };\n }, []);\n \n useEffect(() => {\n if (slashCompletions.length > 0 && slashIndex >= slashCompletions.length) {\n setSlashIndex(0);\n } else if (slashCompletions.length === 0 && slashIndex !== 0) {\n setSlashIndex(0);\n }\n }, [slashCompletions.length, slashIndex]);\n\n const handleSlashCommand = useCallback(async (trimmed: string) => {\n const result = await slashRef.current.handle(trimmed, {\n sessionId: sessionIdRef.current,\n workspacePath,\n onOutput: (text) => {\n const safeText = stringifySlashOutput(text);\n if (!safeText) return;\n const timestamp = new Date().toISOString();\n dispatch({ type: 'ADD_MESSAGE', message: { id: randomUUID(), role: 'assistant', content: safeText, timestamp } });\n persistMessage('assistant', safeText, timestamp);\n },\n onClear: () => dispatch({ type: 'CLEAR' }),\n onExit: () => exit(),\n onThemeChange: (name) => setTheme(getTheme(name)),\n onExport: async (fmt) => {\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n const exportPath = path.join(workspacePath, `cascade-export-${stamp}.${fmt === 'json' ? 'json' : 'md'}`);\n if (fmt === 'json') {\n await fs.writeFile(exportPath, JSON.stringify({ sessionId: sessionIdRef.current, messages: state.messages }, null, 2), 'utf-8');\n } else {\n const markdown = state.messages.map((msg) => `## ${msg.role.toUpperCase()} — ${msg.timestamp}\\n\\n${msg.content}`).join('\\n\\n');\n await fs.writeFile(exportPath, markdown, 'utf-8');\n }\n },\n onRollback: async () => {\n const store = storeRef.current;\n if (!store) return 'No database connection.';\n const snapshots = store.getLatestFileSnapshots(sessionIdRef.current);\n if (!snapshots.length) return 'No file snapshots found for this session.';\n for (const { filePath, content } of snapshots) {\n try { await fs.writeFile(filePath, content, 'utf-8'); } catch (err) { console.error(`Restore failed: ${filePath}`, err); }\n }\n return `Restored ${snapshots.length} files to their initial session state.`;\n },\n onBranch: async () => {\n const store = storeRef.current;\n if (!store) return;\n const newSessionId = randomUUID();\n try {\n store.branchSession(sessionIdRef.current, newSessionId);\n sessionIdRef.current = newSessionId;\n const timestamp = new Date().toISOString();\n dispatch({ type: 'ADD_MESSAGE', message: { id: randomUUID(), role: 'assistant', content: `Branched session. New Session ID: ${newSessionId}`, timestamp } });\n } catch (err) { console.error(`Branching failed:`, err); }\n },\n onModelInfo: () => {\n const router = cascadeRef.current?.getRouter();\n if (!router) return 'No models loaded';\n return ['T1', 'T2', 'T3'].map((t) => {\n const tier = t as 'T1' | 'T2' | 'T3';\n const m = router.getModelForTier(tier);\n const configured = config.models[tier.toLowerCase() as 't1' | 't2' | 't3'];\n return `${t}: ${m?.name ?? 'none'} (${m?.provider ?? '—'})${configured ? ` | configured: ${configured}` : ''}`;\n }).join('\\n');\n },\n onModelPicker: async () => { setIsShowingModels(true); return 'Opening model picker — choose provider → tier → model (ESC to exit).'; },\n onModelsInfo: async () => { setIsShowingModels(true); return 'Opening interactive models explorer... (ESC to exit)'; },\n onProvidersInfo: () => listConfiguredProviders(config),\n onConfigInfo: () => formatConfigSummary(config),\n onRetry: async () => {\n const prompt = lastUserPrompt.current;\n if (!prompt) return 'No previous user prompt to retry.';\n await handleSubmit(prompt);\n return `Retried: ${prompt}`;\n },\n onSearch: async (args) => searchSessionsAndMessages(args.join(' ').trim(), workspacePath),\n onDiagnose: async () => diagnoseRuntime(config, workspacePath),\n onLogs: async (args) => showRecentLogs(args, workspacePath),\n onResume: async (args) => {\n const snapshot = await loadSessionSnapshot(args, workspacePath);\n if (typeof snapshot === 'string') return snapshot;\n hydrateResumeState(snapshot, { dispatch, treeNodesRef, nodeLogsRef, sessionIdRef, startedAtRef, setInputHistory, setHistoryIndex, setCurrentIdentityId, storeRef });\n return `Restored session ${snapshot.session.title} with ${snapshot.messages.length} messages.`;\n },\n onMcpList: async () => {\n const cascade = cascadeRef.current;\n if (!cascade) return 'Cascade not initialized.';\n const toolRegistry = cascade.getToolRegistry();\n const tools = toolRegistry.getToolDefinitions().filter(t => t.name.startsWith('mcp::'));\n if (tools.length === 0) return 'No MCP tools connected.';\n \n const servers = new Set<string>();\n tools.forEach(t => servers.add(t.name.split('::')[1]!));\n \n const lines = [`Connected MCP Servers (${servers.size}):`];\n for (const server of servers) {\n const serverTools = tools.filter(t => t.name.startsWith(`mcp::${server}::`));\n lines.push(`\\n● ${server} (${serverTools.length} tools)`);\n serverTools.forEach(t => lines.push(` - ${t.name.split('::')[2]} — ${t.description.replace(`[MCP:${server}] `, '')}`));\n }\n return lines.join('\\n');\n },\n onCostInfo: () => { dispatch({ type: 'TOGGLE_COST' }); return ''; },\n onBudget: (args) => {\n const router = cascadeRef.current?.getRouter();\n if (!router) return 'Router not initialised yet.';\n\n if (args[0] === 'set' && args[1]) {\n const amount = parseFloat(args[1].replace(/^\\$/, ''));\n if (isNaN(amount) || amount <= 0) {\n return 'Invalid amount. Usage: /budget set 1.00';\n }\n router.setSessionBudget(amount);\n return `✔ Session budget set to $${amount.toFixed(2)}. Cascade will stop new tasks once this limit is reached.`;\n }\n\n if (args[0] === 'clear') {\n router.setSessionBudget(null);\n return '✔ Session budget cap removed.';\n }\n\n // Show current status\n const cap = router.getSessionBudget();\n const spent = router.getSessionSpend();\n if (!cap) {\n return `Session budget: none (no cap set)\\nSpent so far: $${spent.toFixed(6)}\\n\\nSet a cap with: /budget set <amount> (e.g. /budget set 0.50)`;\n }\n const remaining = Math.max(0, cap - spent);\n const pct = Math.min(100, Math.round((spent / cap) * 100));\n const bar = '█'.repeat(Math.round(pct / 5)) + '░'.repeat(20 - Math.round(pct / 5));\n return `Session budget: $${cap.toFixed(2)}\\nSpent: $${spent.toFixed(6)} (${pct}%)\\nRemaining: $${remaining.toFixed(6)}\\n[${bar}]`;\n },\n onCompact: async () => {\n const prompt = 'Please summarize our conversation so far to keep the context compact and efficient.';\n await handleSubmit(prompt);\n return 'Triggered context compaction. The agent will now summarize the history...';\n },\n onStatus: () => formatRuntimeStatus([...treeNodesRef.current.values()], nodeLogsRef.current),\n onTree: () => { \n dispatch({ type: 'TOGGLE_DETAILS' }); \n return 'Toggled agent tree visualization.'; \n },\n onSessions: async () => {\n const store = storeRef.current;\n if (!store) return 'No session store loaded.';\n const sessions = store.listSessions(undefined, 12);\n if (!sessions.length) return 'No saved sessions yet.';\n return sessions.map((s, idx) => `${idx + 1}. ${s.title}\\n id: ${s.id}\\n updated: ${new Date(s.updatedAt).toLocaleString()}\\n tokens: ${s.metadata.totalTokens} · cost: $${s.metadata.totalCostUsd.toFixed(4)}`).join('\\n\\n');\n },\n onIdentity: async (args) => {\n if (args.length === 0) {\n if (identities.length === 0) return 'No identities found.';\n const list = identities.map(id => {\n const isActive = id.id === currentIdentityId;\n const isDef = id.isDefault ? ' [Default]' : '';\n return ` ${isActive ? '●' : '○'} ${id.name} (${id.id.slice(0, 8)}...)${isDef}`;\n }).join('\\n');\n return `Available identities:\\n\\n${list}\\n\\nUse /identity <name|id> to switch.`;\n }\n const target = args.join(' ').trim();\n const match = identities.find((identity) => identity.id === target || identity.name.toLowerCase() === target.toLowerCase() || identity.id.startsWith(target));\n if (!match) return `Unknown identity: ${target}`;\n setCurrentIdentityId(match.id);\n storeRef.current?.updateSession(sessionIdRef.current, { identityId: match.id, updatedAt: new Date().toISOString() });\n return `Active identity set to ${match.name}`;\n },\n });\n\n if (result.output) {\n const safeOutput = stringifySlashOutput(result.output);\n const timestamp = new Date().toISOString();\n dispatch({ type: 'ADD_MESSAGE', message: { id: randomUUID(), role: 'assistant', content: safeOutput, timestamp } });\n persistMessage('assistant', safeOutput, timestamp);\n }\n }, [workspacePath, exit, state.messages, identities, currentIdentityId, persistMessage]);\n\n const handleSubmit = useCallback(async (userInput: string) => {\n if (slashCompletions.length > 0) {\n const selected = slashCompletions[slashIndex];\n if (selected && selected !== userInput.trim()) {\n setInput(selected + ' ');\n setSlashIndex(0);\n return;\n }\n }\n const trimmed = userInput.trim();\n if (!trimmed) return;\n if (state.isExecuting) {\n if (slashRef.current.isSlashCommand(trimmed)) {\n setInput('');\n await handleSlashCommand(trimmed);\n return;\n }\n setQueuedMessages(prev => [...prev, trimmed]);\n setInput('');\n return;\n }\n setInputHistory((prev) => [trimmed, ...prev.filter((item) => item !== trimmed)].slice(0, 100));\n setHistoryIndex(null);\n if (slashRef.current.isSlashCommand(trimmed)) { await handleSlashCommand(trimmed); return; }\n const timestamp = new Date().toISOString();\n dispatch({ type: 'ADD_MESSAGE', message: { id: randomUUID(), role: 'user', content: trimmed, timestamp } });\n persistMessage('user', trimmed, timestamp);\n lastUserPrompt.current = trimmed;\n lastSubmittedInputRef.current = trimmed;\n setInput('');\n dispatch({ type: 'SET_EXECUTING', isExecuting: true });\n dispatch({ type: 'SET_STREAMING', isStreaming: true });\n const cascade = cascadeRef.current;\n if (!cascade) {\n // Cascade failed to initialise — don't leave the UI stuck with\n // isExecuting=true (input field disabled, spinner running forever).\n dispatch({ type: 'SET_EXECUTING', isExecuting: false });\n dispatch({ type: 'SET_STREAMING', isStreaming: false });\n dispatch({ type: 'ADD_MESSAGE', message: { id: randomUUID(), role: 'error', content: 'Cascade not initialised. Check your configuration and restart.', timestamp: new Date().toISOString() } });\n return;\n }\n treeNodesRef.current.clear(); rebuildTree();\n const onRoot = ({ role }: RootTierEvent) => {\n const tierId = role === 'T1' ? 'T1' : `${role.toLowerCase()}-root` as 't2-root' | 't3-root';\n rootTierIdRef.current = tierId;\n recordNodeEvent({ tierId, role, label: 'Initializing', status: 'ACTIVE' });\n };\n let currentStreamBuffer = '';\n let streamThrottleTimeout: NodeJS.Timeout | null = null;\n const flushStream = () => { if (currentStreamBuffer) { dispatch({ type: 'APPEND_STREAM', text: currentStreamBuffer }); currentStreamBuffer = ''; } streamThrottleTimeout = null; };\n const onStream = ({ text, tierId }: { text: string; tierId: string }) => { \n if (tierId !== rootTierIdRef.current) return; // Hide non-root streams from main chat\n currentStreamBuffer += (text ?? ''); \n if (!streamThrottleTimeout) streamThrottleTimeout = setTimeout(flushStream, 50); \n };\n cascade.on('tier:root', onRoot);\n cascade.on('stream:token', onStream);\n cascade.on('tier:status', (ev: TierStatusEvent) => {\n recordNodeEvent(ev);\n const stats = cascade.getRouter().getStats();\n dispatch({ type: 'UPDATE_COST', tokens: stats.totalTokens, costUsd: stats.totalCostUsd, byProvider: stats.callsByProvider, byTier: stats.callsByTier, costByTier: stats.costByTier, tokensByTier: stats.tokensByTier });\n // Extract active tool from currentAction if present\n if (ev.currentAction?.startsWith('Using tool:')) {\n const toolName = ev.currentAction.replace('Using tool:', '').trim();\n dispatch({ type: 'SET_ACTIVE_TOOL', toolName });\n }\n });\n cascade.on('budget:warning', (payload: { spentUsd: number; capUsd: number; spendPct: number; remainingUsd: number }) => {\n const bar = '█'.repeat(Math.round(payload.spendPct / 10)) + '░'.repeat(10 - Math.round(payload.spendPct / 10));\n dispatch({\n type: 'ADD_MESSAGE',\n message: {\n id: randomUUID(),\n role: 'system',\n content: `⚠ Budget warning: ${payload.spendPct}% used ($${payload.spentUsd.toFixed(4)} of $${payload.capUsd.toFixed(2)}) — $${payload.remainingUsd.toFixed(4)} remaining [${bar}]`,\n timestamp: new Date().toISOString(),\n },\n });\n });\n cascade.on('budget:exceeded', (payload: { reason: string }) => {\n dispatch({\n type: 'ADD_MESSAGE',\n message: {\n id: randomUUID(),\n role: 'error',\n content: `Budget exceeded: ${payload.reason}. New LLM calls rejected.`,\n timestamp: new Date().toISOString(),\n },\n });\n });\n // Re-use the approval dialog for MCP server spawn requests. These are the\n // riskiest events we expose — an arbitrary subprocess.\n cascade.on('mcp:approval-required', (payload: { server: { name: string; command: string; args?: string[] } }) => {\n const server = payload.server;\n dispatch({\n type: 'SET_APPROVAL',\n request: {\n id: `mcp-${server.name}`,\n tierId: 'MCP',\n toolName: `mcp::${server.name}`,\n input: { command: server.command, args: server.args ?? [] },\n description: `Spawn MCP server \"${server.name}\" via command: ${server.command} ${server.args?.join(' ') ?? ''}`,\n isDangerous: true,\n },\n });\n approvalResolverRef.current = ({ approved }) => cascade.resolveMcpApproval(server.name, approved);\n });\n try {\n const result = await cascade.run({\n prompt: trimmed,\n workspacePath,\n identityId: currentIdentityId,\n conversationHistory: toConversationHistory(state.messages),\n approvalCallback: async (req) => {\n dispatch({ type: 'SET_APPROVAL', request: req });\n return new Promise<{ approved: boolean; always: boolean }>((resolve) => {\n approvalResolverRef.current = resolve;\n });\n }\n });\n flushStream();\n const stats = cascade.getRouter().getStats();\n dispatch({ type: 'UPDATE_COST', tokens: stats.totalTokens, costUsd: stats.totalCostUsd, byProvider: stats.callsByProvider, byTier: stats.callsByTier, costByTier: stats.costByTier, tokensByTier: stats.tokensByTier });\n dispatch({ type: 'COMMIT_STREAM', finalText: result.output, timestamp: new Date().toISOString() });\n persistMessage('assistant', result.output, new Date().toISOString());\n // Generate AI session name on first exchange (async, fire-and-forget)\n if (!sessionTitleGeneratedRef.current && storeRef.current) {\n sessionTitleGeneratedRef.current = true;\n generateSessionName(trimmed, cascadeRef.current).then(name => {\n if (name && storeRef.current) {\n storeRef.current.updateSession(sessionIdRef.current, { title: name, updatedAt: new Date().toISOString() });\n persistRuntimeSession('ACTIVE');\n }\n }).catch(() => { /* non-critical */ });\n }\n } catch (err: unknown) { \n const message = err instanceof Error ? err.message : String(err);\n dispatch({ type: 'ADD_MESSAGE', message: { id: randomUUID(), role: 'error', content: message, timestamp: new Date().toISOString() } }); \n }\n finally { \n cascade.removeAllListeners(); \n const finalStats = cascade.getRouter().getStats();\n const currentSession = storeRef.current?.getSession(sessionIdRef.current);\n if (currentSession) {\n storeRef.current?.updateSession(sessionIdRef.current, {\n metadata: {\n ...currentSession.metadata,\n totalTokens: finalStats.totalTokens,\n totalCostUsd: finalStats.totalCostUsd,\n }\n });\n }\n dispatch({ type: 'SET_EXECUTING', isExecuting: false });\n }\n }, [handleSlashCommand, persistMessage, state.messages, workspacePath, rebuildTree, recordNodeEvent, slashCompletions, slashIndex, state.isExecuting]);\n\n useInput((_input, key) => {\n // When the interactive model picker is open it owns the keyboard.\n // Let Ctrl+C still exit, but route every other key (incl. arrows, Enter,\n // Tab, number keys, Esc) to the picker's own useInput so navigation\n // isn't hijacked — this is the root-cause fix for the \"only ↑ worked\n // in the model selector\" regression.\n if (isShowingModels) {\n if (key.ctrl && _input === 'c') {\n if (quitAttempted) { exit(); return; }\n setQuitAttempted(true);\n }\n return;\n }\n if (key.ctrl && _input === 'c') {\n if (quitAttempted) {\n exit();\n return;\n }\n setQuitAttempted(true);\n return;\n }\n if (key.escape) {\n if (quitAttempted) { setQuitAttempted(false); return; }\n if (isShowingModels) { setIsShowingModels(false); return; }\n if (queuedMessages.length > 0) {\n setInput(queuedMessages[0]!);\n setQueuedMessages(p => p.slice(1));\n return;\n }\n // Restore last submitted message if input is empty and not currently executing\n if (!input && lastSubmittedInputRef.current && !state.isExecuting) {\n setInput(lastSubmittedInputRef.current);\n setHistoryIndex(null);\n return;\n }\n setInput('');\n setHistoryIndex(null);\n return;\n }\n if (key.upArrow && !input.includes('\\n')) {\n if (slashCompletions.length > 0) { setSlashIndex(p => (p <= 0 ? slashCompletions.length - 1 : p - 1)); return; }\n const nextIndex = historyIndex === null ? 0 : Math.min(historyIndex + 1, inputHistory.length - 1);\n if (inputHistory[nextIndex]) { setHistoryIndex(nextIndex); setInput(inputHistory[nextIndex]!); }\n } else if (key.downArrow && !input.includes('\\n')) {\n if (slashCompletions.length > 0) { setSlashIndex(p => (p + 1) % slashCompletions.length); return; }\n if (historyIndex === null) return;\n const nextIndex = historyIndex - 1; setHistoryIndex(nextIndex < 0 ? null : nextIndex); setInput(nextIndex < 0 ? '' : inputHistory[nextIndex]!);\n } else if (key.tab && slashCompletions.length > 0) {\n const selected = slashCompletions[slashIndex];\n if (selected) {\n setInput(selected + ' ');\n setSlashIndex(0);\n return;\n }\n }\n const maxScroll = Math.max(0, allLines.length - chatWindowHeight);\n if (key.pageUp || (key.shift && key.upArrow)) { \n setIsAutoScrolling(false); \n setScrollOffset(p => Math.max(0, p - 5)); \n }\n if (key.pageDown || (key.shift && key.downArrow)) { \n setScrollOffset(p => { \n const next = p + 5; \n if (next >= maxScroll) { setIsAutoScrolling(true); return maxScroll; }\n return next; \n }); \n }\n \n // Ensure slashIndex is handled when characters are deleted\n if ((key.backspace || key.delete) && slashCompletions.length > 0) {\n setSlashIndex(0);\n }\n });\n\n const allLinesRef = useRef<number>(0);\n const chatWindowHeightRef = useRef<number>(10);\n const isAutoScrollingRef = useRef<boolean>(true);\n\n const width = stdout?.columns ?? 100;\n const height = stdout?.rows ?? 24;\n \n // Calculate fixed element overhead accurately\n const headerHeight = 2; // Header + Border top\n const statusHeight = state.showDetails ? (state.agentTree ? 10 : 4) : 3;\n const costHeight = state.showCost ? 6 : 0;\n const approvalHeight = state.approvalRequest ? 12 : 0;\n const slashVisibleCount = Math.min(SLASH_PAGE_SIZE, slashEntries.length);\n const slashHeight = slashVisibleCount > 0 ? slashVisibleCount + 2 : 0; // +2 for border + header row\n const chromeHeight = statusHeight + costHeight + approvalHeight + slashHeight + 7; // Input(3) + Status(2) + Header(2) + Margin(2)\n const totalCap = Math.floor(height * 0.7);\n\n const availableHeight = Math.max(4, totalCap - chromeHeight);\n const allLines = formatToLines(\n state.isStreaming \n ? [...state.messages, { id: 'stream', role: 'assistant', content: state.streamBuffer, timestamp: new Date().toISOString() } as Message] \n : state.messages,\n width - 4,\n theme\n );\n\n const chatWindowHeight = Math.min(allLines.length || (state.isStreaming ? 0 : 4), availableHeight);\n const maxScroll = Math.max(0, allLines.length - chatWindowHeight);\n\n useEffect(() => {\n if (isAutoScrolling) {\n setScrollOffset(maxScroll);\n }\n }, [allLines.length, isAutoScrolling, maxScroll]);\n\n useEffect(() => {\n allLinesRef.current = allLines.length;\n chatWindowHeightRef.current = chatWindowHeight;\n isAutoScrollingRef.current = isAutoScrolling;\n }, [allLines.length, isAutoScrolling, chatWindowHeight]);\n\n useEffect(() => {\n // Enable mouse reporting (1000: mouse move/press, 1006: SGR mode).\n // SafeTextInput honours `manageMouseReporting={false}` so it won't disable\n // this on mount. Bracketed-paste mode is enabled by SafeTextInput itself.\n process.stdout.write('\\x1b[?1000h\\x1b[?1006h');\n\n const onData = (data: Buffer) => {\n const str = data.toString();\n\n // SGR mouse sequence → handle scroll wheel, swallow the rest.\n if (containsMouseSequence(str)) {\n // Lock input ONLY for mouse sequences to prevent them leaking into the prompt.\n // ⚠ Do NOT lock for all \\x1b sequences — that would block Delete (\\x1b[3~),\n // arrow keys, Home, End, and other navigation escape sequences.\n lockInputTemporarily();\n const mouseMatch = str.match(/\\x1b\\[<(\\d+);\\d+;\\d+[Mm]/);\n if (mouseMatch) {\n const code = parseInt(mouseMatch[1]!, 10);\n if (code === 64) { // Wheel Up\n setIsAutoScrolling(false);\n setScrollOffset(p => Math.max(0, p - 3));\n } else if (code === 65) { // Wheel Down\n setScrollOffset(p => {\n const next = p + 3;\n const max = Math.max(0, allLinesRef.current - chatWindowHeightRef.current);\n if (next >= max) { setIsAutoScrolling(true); return max; }\n return next;\n });\n }\n }\n return; // Consumed by mouse handler\n }\n\n // Forward-delete (\\x1b[3~) is handled by SafeTextInput's own raw-stdin\n // listener — it correctly removes the character AT the cursor, not the\n // last character of the buffer. We deliberately do NOT handle it here\n // to avoid double-deletions.\n };\n\n process.stdin.on('data', onData);\n return () => {\n process.stdout.write('\\x1b[?1000l\\x1b[?1006l');\n process.stdin.removeListener('data', onData);\n };\n }, [lockInputTemporarily]);\n\n const visibleLines = allLines.slice(scrollOffset, scrollOffset + chatWindowHeight);\n const showScrollAlert = !isAutoScrolling;\n const chatHeight = chatWindowHeight - (showScrollAlert ? 1 : 0);\n const currentIdentity = identities.find((id) => id.id === currentIdentityId)?.name ?? 'Default';\n const modelName = cascadeRef.current?.getRouter().getModelForTier('T1')?.name ?? 'Initializing...';\n\n return (\n <Box flexDirection=\"column\" width={width}>\n {/* ── Status bar — top, always visible ── */}\n <StatusBar\n theme={theme}\n tierModels={{\n t1: config.models?.t1,\n t2: config.models?.t2,\n t3: config.models?.t3,\n }}\n tokens={state.totalTokens}\n costUsd={state.totalCostUsd}\n workspacePath={workspacePath}\n isExecuting={state.isExecuting}\n activeTier={state.agentTree?.status === 'ACTIVE' ? 'T1' : undefined}\n />\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.colors.border} paddingX={1} height={chatWindowHeight + 2}>\n <Box flexDirection=\"column\" flexGrow={1} overflow=\"hidden\">\n {showScrollAlert && (\n <Box justifyContent=\"center\" height={1}>\n <Text backgroundColor=\"blue\" color=\"white\" bold> ⇡ SCROLLED UP — PgDn TO BOTTOM ⇣ </Text>\n </Box>\n )}\n <Box flexDirection=\"column\" height={chatHeight}>\n {visibleLines.map((line, i) => (\n <Text key={i}>{line}</Text>\n ))}\n </Box>\n </Box>\n </Box>\n\n <Box flexDirection=\"column\" paddingX={1}>\n {state.messages.length === 0 && !state.isStreaming && (\n <WelcomeBanner theme={theme} config={config} workspacePath={workspacePath} sessionId={sessionIdRef.current} />\n )}\n {isShowingModels && (\n <ModelsDisplay\n providers={config.providers.map(p => p.type)}\n modelsByProvider={cachedModels}\n onSelect={(sel) => { void applyModelPick(sel); }}\n onClose={() => setIsShowingModels(false)}\n />\n )}\n </Box>\n\n {/* ── Compact agent tree — auto-hides when idle ── */}\n <AgentTree root={state.agentTree} theme={theme} />\n\n {state.showDetails && (\n <TimelinePanel nodes={[...treeNodesRef.current.values()]} theme={theme} currentIndex={timelineIndex} onChangeIndex={setTimelineIndex} />\n )}\n {state.showCost && <CostTracker theme={theme} totalTokens={state.totalTokens} totalCostUsd={state.totalCostUsd} callsByProvider={state.callsByProvider} callsByTier={state.callsByTier} costByTier={state.costByTier} tokensByTier={state.tokensByTier} />}\n {state.approvalRequest && <ApprovalPrompt request={state.approvalRequest} theme={theme} onDecision={(decision) => { dispatch({ type: 'SET_APPROVAL', request: null }); approvalResolverRef.current?.(decision); }} />}\n {slashEntries.length > 0 && (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.colors.border} paddingX={1}>\n <Box flexDirection=\"row\" justifyContent=\"space-between\">\n <Text color={theme.colors.muted}>Commands ↑↓ navigate · ↵ select · Tab complete</Text>\n {slashEntries.length > SLASH_PAGE_SIZE && (\n <Text color={theme.colors.muted} dimColor>\n {slashIndex + 1}/{slashEntries.length}\n </Text>\n )}\n </Box>\n {slashViewStart > 0 && (\n <Text color={theme.colors.muted} dimColor> ↑ {slashViewStart} more above</Text>\n )}\n {slashEntries.slice(slashViewStart, slashViewStart + SLASH_PAGE_SIZE).map((entry, i) => {\n const globalIdx = slashViewStart + i;\n const isSelected = globalIdx === slashIndex;\n return (\n <Box key={entry.command} flexDirection=\"row\">\n <Text color={isSelected ? theme.colors.accent : theme.colors.foreground} bold={isSelected}>\n {isSelected ? '› ' : ' '}\n </Text>\n <Box width={16}>\n <Text color={isSelected ? theme.colors.accent : theme.colors.foreground} bold={isSelected}>\n {entry.command}\n </Text>\n </Box>\n {entry.description ? (\n <Text color={theme.colors.muted} dimColor> {entry.description}</Text>\n ) : null}\n </Box>\n );\n })}\n {slashViewStart + SLASH_PAGE_SIZE < slashEntries.length && (\n <Text color={theme.colors.muted} dimColor> ↓ {slashEntries.length - slashViewStart - SLASH_PAGE_SIZE} more below</Text>\n )}\n </Box>\n )}\n {/* ── Hint bar — keyboard shortcuts, hidden during execution ── */}\n <HintBar theme={theme} isExecuting={state.isExecuting} />\n\n <Box borderStyle=\"round\" borderColor={quitAttempted ? 'red' : (state.isStreaming ? theme.colors.accent : theme.colors.border)} paddingX={2} flexDirection=\"column\">\n {quitAttempted && (\n <Box marginBottom={0}>\n <Text color=\"red\" bold> Press Ctrl+C again to quit or ESC to return to TUI </Text>\n </Box>\n )}\n <Box flexDirection=\"row\">\n <Text color={theme.colors.primary} bold>▸ {queuedMessages.length > 0 ? <Text color={theme.colors.accent}>[QUEUED] </Text> : ''}</Text>\n <SafeTextInput\n focus={!state.approvalRequest && !isShowingModels}\n value={input}\n manageMouseReporting={false}\n onChange={(val) => {\n if (isInputLockedRef.current) return;\n // Defense in depth — SafeTextInput already sanitizes, but a brief\n // input-lock window can still pass through values we'd rather drop.\n setInput(sanitizeTerminalInput(val));\n }}\n onSubmit={handleSubmit}\n placeholder={state.isStreaming ? \"Wait for response or type next prompt to queue…\" : \"Ask Cascade anything… (/help for commands)\"}\n />\n </Box>\n </Box>\n </Box>\n );\n}\n\nfunction toConversationHistory(messages: Message[]): ConversationMessage[] {\n return messages\n .filter((m): m is Message & { role: 'user' | 'assistant' | 'system' } => m.role !== 'error')\n .map((m) => ({ role: m.role, content: m.content }));\n}\n\nfunction buildTreeFromFlatNodes(nodes: FlatTreeNode[]): TierNode | null {\n if (!nodes.length) return null;\n const cloned = new Map<string, FlatTreeNode>();\n for (const node of nodes) cloned.set(node.id, { ...node, children: [] });\n const roots: FlatTreeNode[] = [];\n for (const node of cloned.values()) {\n if (node.parentId && cloned.has(node.parentId)) cloned.get(node.parentId)!.children!.push(node);\n else roots.push(node);\n }\n return roots[0] || null;\n}\n\nasync function validateConfiguredModels(config: CascadeConfig): Promise<string | null> {\n const problems: string[] = [];\n if (config.models.t1 && !inferProviderFromModelId(config.models.t1, config.providers)) problems.push(`T1: ${config.models.t1}`);\n return problems.length ? `Model warnings: ${problems.join(', ')}` : null;\n}\n\nfunction inferProviderFromModelId(id: string, providers: CascadeConfig['providers']): ProviderType | null {\n const lower = id.toLowerCase();\n if (lower.includes('gpt')) return 'openai';\n if (lower.includes('claude')) return 'anthropic';\n if (lower.includes('gemini')) return 'gemini';\n return providers[0]?.type || null;\n}\n\nfunction listConfiguredProviders(config: CascadeConfig): string { return config.providers.map(p => p.type).join(', '); }\nfunction formatConfigSummary(config: CascadeConfig): string { return `Theme: ${config.theme}, Port: ${config.dashboard.port}`; }\nfunction stringifySlashOutput(val: unknown): string { return typeof val === 'string' ? val : JSON.stringify(val); }\nasync function searchSessionsAndMessages(query: string, workspacePath: string): Promise<string> {\n if (!query) return 'Usage: /search <query>';\n const dbPath = path.join(workspacePath, CASCADE_DB_FILE);\n \n // Check if DB exists\n try {\n await fs.access(dbPath);\n } catch {\n return 'No database found. Start a conversation first.';\n }\n\n const store = new MemoryStore(dbPath);\n try {\n const sessions = store.listSessions(undefined, 20).filter((s) => s.title.toLowerCase().includes(query.toLowerCase()));\n const messages = store.searchMessages(query, 20);\n \n if (sessions.length === 0 && messages.length === 0) {\n return `No results found for \"${query}\".`;\n }\n\n const lines = [\n `🔍 Search results for \"${query}\":`,\n '',\n `📂 Sessions (${sessions.length}):`,\n ...sessions.slice(0, 5).map((s) => ` - ${s.title} (ID: ${s.id.slice(0, 8)}...)`),\n sessions.length > 5 ? ` ... and ${sessions.length - 5} more` : '',\n '',\n `💬 Messages (${messages.length}):`,\n ...messages.slice(0, 8).map((m) => ` - [${m.role.toUpperCase()}] ${m.content.slice(0, 100)}${m.content.length > 100 ? '...' : ''}`),\n messages.length > 8 ? ` ... and ${messages.length - 8} more` : '',\n ];\n return lines.filter(Boolean).join('\\n');\n } catch (err: unknown) {\n return `Search failed: ${err instanceof Error ? err.message : String(err)}`;\n } finally { store.close(); }\n}\n\nasync function diagnoseRuntime(config: CascadeConfig, workspacePath: string): Promise<string> {\n const providers = config.providers.map((p) => `${p.type}${p.apiKey ? ' (key set)' : ' (no key)'}`).join('\\n');\n const models = [`T1: ${config.models.t1 ?? 'default'}`, `T2: ${config.models.t2 ?? 'default'}`, `T3: ${config.models.t3 ?? 'default'}`].join('\\n');\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n try {\n const sessions = store.listSessions(undefined, 3);\n return [\n 'Provider checks:', providers || 'No providers configured.', '',\n 'Configured models:', models, '',\n `Local sessions: ${sessions.length}`,\n ...sessions.map((s) => `- ${s.title} (${s.id})`),\n ].join('\\n');\n } finally { store.close(); }\n}\n\nasync function showRecentLogs(args: string[], workspacePath: string): Promise<string> {\n const limit = Number.parseInt(args[0] ?? '10', 10) || 10;\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n try {\n const logs = store.listRuntimeNodeLogs(undefined, undefined, limit);\n if (!logs.length) return 'No recent runtime logs.';\n return logs.map((log) => `[${log.timestamp}] ${log.role} ${log.label} — ${log.status}${log.currentAction ? ` — ${log.currentAction}` : ''}`).join('\\n');\n } finally { store.close(); }\n}\n\ninterface SessionResumeSnapshot {\n session: Session;\n messages: Message[];\n runtimeNodes: RuntimeNode[];\n runtimeLogs: RuntimeNodeLog[];\n}\n\nasync function loadSessionSnapshot(args: string[], workspacePath: string): Promise<SessionResumeSnapshot | string> {\n const sessionId = args[0];\n if (!sessionId) return 'Usage: /resume <sessionId>';\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n try {\n const session = store.getSession(sessionId);\n if (!session) return `Session not found: ${sessionId}`;\n return {\n session,\n messages: session.messages.map((m) => ({ id: m.id, role: m.role, content: m.content, timestamp: m.timestamp })),\n runtimeNodes: store.listRuntimeNodes(sessionId, 500),\n runtimeLogs: store.listRuntimeNodeLogs(sessionId, undefined, 500),\n };\n } finally { store.close(); }\n}\n\nfunction hydrateResumeState(snapshot: SessionResumeSnapshot, options: {\n dispatch: React.Dispatch<ReplAction>;\n treeNodesRef: React.MutableRefObject<Map<string, FlatTreeNode>>;\n nodeLogsRef: React.MutableRefObject<Map<string, string[]>>;\n sessionIdRef: React.MutableRefObject<string>;\n startedAtRef: React.MutableRefObject<string>;\n setInputHistory: React.Dispatch<React.SetStateAction<string[]>>;\n setHistoryIndex: React.Dispatch<React.SetStateAction<number | null>>;\n setCurrentIdentityId: React.Dispatch<React.SetStateAction<string | undefined>>;\n storeRef: React.MutableRefObject<MemoryStore | null>;\n}) {\n const { dispatch, treeNodesRef, nodeLogsRef, sessionIdRef, startedAtRef, setInputHistory, setHistoryIndex, setCurrentIdentityId, storeRef } = options;\n sessionIdRef.current = snapshot.session.id;\n startedAtRef.current = snapshot.session.createdAt;\n setInputHistory(snapshot.messages.filter((m) => m.role === 'user').map((m) => m.content));\n setHistoryIndex(null);\n setCurrentIdentityId(snapshot.session.identityId);\n dispatch({ type: 'CLEAR' });\n for (const msg of snapshot.messages) { dispatch({ type: 'ADD_MESSAGE', message: msg } as ReplAction); }\n treeNodesRef.current.clear();\n nodeLogsRef.current.clear();\n for (const node of snapshot.runtimeNodes) {\n treeNodesRef.current.set(node.tierId, { id: node.tierId, role: node.role, label: node.label, status: node.status, currentAction: node.currentAction, progressPct: node.progressPct, children: [], parentId: node.parentId });\n }\n for (const log of snapshot.runtimeLogs) {\n const history = nodeLogsRef.current.get(log.tierId) ?? [];\n nodeLogsRef.current.set(log.tierId, [...history.slice(-24), [log.status, log.currentAction].filter(Boolean).join(' — ')]);\n }\n dispatch({ type: 'SET_TREE', tree: buildTreeFromFlatNodes([...treeNodesRef.current.values()]) });\n storeRef.current?.updateSession(snapshot.session.id, { updatedAt: new Date().toISOString() });\n}\n\nfunction formatRuntimeStatus(nodes: FlatTreeNode[], nodeLogs: Map<string, string[]>): string {\n if (!nodes.length) return 'No active agent tree.';\n const active = nodes.filter((node) => node.status === 'ACTIVE');\n const failed = nodes.filter((node) => node.status === 'FAILED' || node.status === 'ESCALATED');\n const lines = [`Active nodes: ${active.length}`, `Failed nodes: ${failed.length}`, ''];\n for (const node of [...active, ...failed].slice(0, 10)) {\n lines.push(`[${node.role}] ${node.label} — ${node.status}`);\n const recent = (nodeLogs.get(node.id) ?? []).slice(-2);\n for (const entry of recent) lines.push(` · ${entry}`);\n }\n return lines.join('\\n');\n}\n\nasync function generateSessionName(firstMessage: string, cascade: Cascade | null): Promise<string | null> {\n if (!cascade) return null;\n try {\n const router = cascade.getRouter();\n const prompt = `Generate a concise 3-5 word session title for this AI conversation. Return ONLY the title, no punctuation, no quotes.\\n\\nFirst message: \"${firstMessage.slice(0, 200)}\"`;\n const result = await router.generate('T3', {\n messages: [{ role: 'user', content: prompt }],\n maxTokens: 20,\n });\n const name = result.content.trim().replace(/^[\"']|[\"']$/g, '').slice(0, 60);\n return name || null;\n } catch {\n return null;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Model Router\n// ─────────────────────────────────────────────\n\nimport EventEmitter from 'node:events';\nimport type {\n CascadeConfig,\n GenerateOptions,\n GenerateResult,\n ModelInfo,\n ProviderConfig,\n ProviderType,\n StreamChunk,\n TierRole,\n TokenUsage,\n} from '../../types.js';\nimport { AnthropicProvider } from '../../providers/anthropic.js';\nimport { AzureOpenAIProvider } from '../../providers/azure.js';\nimport { GeminiProvider } from '../../providers/gemini.js';\nimport { OllamaProvider } from '../../providers/ollama.js';\nimport { OpenAICompatibleProvider } from '../../providers/openai-compatible.js';\nimport { OpenAIProvider } from '../../providers/openai.js';\nimport type { BaseProvider } from '../../providers/base.js';\nimport { ModelSelector } from './selector.js';\nimport { FailoverManager } from './failover.js';\nimport { TpmLimiter } from './tpm-limiter.js';\nimport { 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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 — Theme Registry\n// ─────────────────────────────────────────────\n\nimport type { Theme, ThemeName } from '../../types.js';\n\nconst cascadeTheme: Theme = {\n name: 'cascade',\n colors: {\n primary: '#7C6AF7', // Cascade violet\n secondary: '#A78BFA',\n accent: '#06B6D4', // Cyan\n success: '#10B981',\n warning: '#F59E0B',\n error: '#EF4444',\n info: '#3B82F6',\n muted: '#6B7280',\n background: '#0F0F1A',\n foreground: '#E2E8F0',\n border: '#2D2B55',\n t1Color: '#7C6AF7', // Violet\n t2Color: '#06B6D4', // Cyan\n t3Color: '#10B981', // Green\n },\n};\n\nconst darkTheme: Theme = {\n name: 'dark',\n colors: {\n primary: '#60A5FA',\n secondary: '#818CF8',\n accent: '#34D399',\n success: '#34D399',\n warning: '#FBBF24',\n error: '#F87171',\n info: '#60A5FA',\n muted: '#6B7280',\n background: '#111827',\n foreground: '#F9FAFB',\n border: '#374151',\n t1Color: '#60A5FA',\n t2Color: '#818CF8',\n t3Color: '#34D399',\n },\n};\n\nconst lightTheme: Theme = {\n name: 'light',\n colors: {\n primary: '#2563EB',\n secondary: '#7C3AED',\n accent: '#0891B2',\n success: '#059669',\n warning: '#D97706',\n error: '#DC2626',\n info: '#2563EB',\n muted: '#6B7280',\n background: '#FFFFFF',\n foreground: '#111827',\n border: '#E5E7EB',\n t1Color: '#2563EB',\n t2Color: '#7C3AED',\n t3Color: '#059669',\n },\n};\n\nconst draculaTheme: Theme = {\n name: 'dracula',\n colors: {\n primary: '#BD93F9',\n secondary: '#FF79C6',\n accent: '#8BE9FD',\n success: '#50FA7B',\n warning: '#FFB86C',\n error: '#FF5555',\n info: '#8BE9FD',\n muted: '#6272A4',\n background: '#282A36',\n foreground: '#F8F8F2',\n border: '#44475A',\n t1Color: '#BD93F9',\n t2Color: '#FF79C6',\n t3Color: '#50FA7B',\n },\n};\n\nconst nordTheme: Theme = {\n name: 'nord',\n colors: {\n primary: '#88C0D0',\n secondary: '#81A1C1',\n accent: '#A3BE8C',\n success: '#A3BE8C',\n warning: '#EBCB8B',\n error: '#BF616A',\n info: '#5E81AC',\n muted: '#4C566A',\n background: '#2E3440',\n foreground: '#ECEFF4',\n border: '#3B4252',\n t1Color: '#88C0D0',\n t2Color: '#81A1C1',\n t3Color: '#A3BE8C',\n },\n};\n\nconst solarizedTheme: Theme = {\n name: 'solarized',\n colors: {\n primary: '#268BD2',\n secondary: '#2AA198',\n accent: '#B58900',\n success: '#859900',\n warning: '#CB4B16',\n error: '#DC322F',\n info: '#268BD2',\n muted: '#657B83',\n background: '#002B36',\n foreground: '#839496',\n border: '#073642',\n t1Color: '#268BD2',\n t2Color: '#2AA198',\n t3Color: '#859900',\n },\n};\n\nconst themes: Map<ThemeName, Theme> = new Map([\n ['cascade', cascadeTheme],\n ['dark', darkTheme],\n ['light', lightTheme],\n ['dracula', draculaTheme],\n ['nord', nordTheme],\n ['solarized', solarizedTheme],\n]);\n\nexport function getTheme(name: ThemeName | string): Theme {\n return themes.get(name as ThemeName) ?? cascadeTheme;\n}\n\nexport function listThemes(): Theme[] {\n return Array.from(themes.values());\n}\n\nexport { cascadeTheme, darkTheme, lightTheme, draculaTheme, nordTheme, solarizedTheme };\n","// ─────────────────────────────────────────────\n// Cascade AI — Slash Command Registry\n// ─────────────────────────────────────────────\n\nimport { THEME_NAMES } from '../../constants.js';\n\nexport interface SlashCommand {\n command: string;\n description: string;\n args?: string[];\n handler: (args: string[], ctx: SlashCommandContext) => Promise<SlashCommandResult> | SlashCommandResult;\n}\n\nexport interface SlashCommandContext {\n sessionId: string;\n workspacePath: string;\n onOutput: (text: string) => void;\n onClear: () => void;\n onExit: () => void;\n onThemeChange: (theme: string) => void;\n onExport: (format: 'markdown' | 'json') => Promise<void>;\n onRollback: () => Promise<string | void>;\n onBranch: () => Promise<void>;\n onModelInfo: () => string | Promise<string>;\n /** Opens the interactive provider → tier → model picker (Claude-Code-style). */\n onModelPicker: () => string | Promise<string>;\n onModelsInfo: () => string | Promise<string>;\n onProvidersInfo: () => string | Promise<string>;\n onConfigInfo: () => string | Promise<string>;\n onCostInfo: () => string | Promise<string>;\n onBudget: (args: string[]) => string | Promise<string>;\n onCompact: () => Promise<string | void>;\n onStatus: () => string | Promise<string>;\n onSessions: (args: string[]) => Promise<string> | string;\n onIdentity: (args: string[]) => Promise<string> | string;\n onRetry: () => Promise<string> | string;\n onSearch: (args: string[]) => Promise<string> | string;\n onDiagnose: () => Promise<string> | string;\n onLogs: (args: string[]) => Promise<string> | string;\n onTree: () => string;\n onResume: (args: string[]) => Promise<string> | string;\n onMcpList: () => string | Promise<string>;\n}\n\nexport interface SlashCommandResult {\n output?: string | Promise<string>;\n handled: boolean;\n}\n\nexport class SlashCommandRegistry {\n private commands: Map<string, SlashCommand> = new Map();\n\n constructor() {\n this.registerDefaults();\n }\n\n register(cmd: SlashCommand): void {\n this.commands.set(cmd.command, cmd);\n }\n\n async handle(input: string, ctx: SlashCommandContext): Promise<SlashCommandResult> {\n const [command, ...args] = input.trim().split(/\\s+/);\n const cmd = this.commands.get(command ?? '');\n if (!cmd) return { handled: false };\n const result = await cmd.handler(args, ctx);\n if (result.output instanceof Promise) {\n result.output = await result.output;\n }\n return result as { output?: string; handled: boolean };\n }\n\n isSlashCommand(input: string): boolean {\n return input.trim().startsWith('/');\n }\n\n getCompletions(partial: string): string[] {\n return Array.from(this.commands.keys()).filter((c) => c.startsWith(partial));\n }\n\n /** Returns completions as {command, description} pairs — used by the REPL suggestion list. */\n getCompletionEntries(partial: string): Array<{ command: string; description: string }> {\n return Array.from(this.commands.values())\n .filter((c) => c.command.startsWith(partial))\n .map((c) => ({ command: c.command, description: c.description }));\n }\n\n getAll(): SlashCommand[] {\n return Array.from(this.commands.values());\n }\n\n private registerDefaults(): void {\n this.register({\n command: '/help',\n description: 'Show available commands',\n handler: (_args, ctx) => {\n const lines = this.getAll()\n .filter((c) => c.command !== '/help')\n .map((c) => ` ${c.command.padEnd(14)} ${c.description}`);\n ctx.onOutput(['', 'Cascade AI — Slash Commands', '─'.repeat(40), ...lines, ''].join('\\n'));\n return { handled: true };\n },\n });\n\n this.register({\n command: '/clear',\n description: 'Clear the conversation',\n handler: (_args, ctx) => {\n ctx.onClear();\n return { handled: true };\n },\n });\n\n this.register({\n command: '/exit',\n description: 'Exit Cascade',\n handler: (_args, ctx) => {\n ctx.onExit();\n return { handled: true };\n },\n });\n\n this.register({\n command: '/theme',\n description: 'Switch color theme',\n handler: (args, ctx) => {\n const name = args[0];\n if (!name) {\n ctx.onOutput(`Available themes: ${THEME_NAMES.join(', ')}`);\n return { handled: true };\n }\n if (!THEME_NAMES.includes(name as never)) {\n return { output: `Unknown theme: ${name}. Available: ${THEME_NAMES.join(', ')}`, handled: true };\n }\n ctx.onThemeChange(name);\n return { output: `Theme switched to: ${name}`, handled: true };\n },\n });\n\n this.register({\n command: '/export',\n description: 'Export session (markdown|json)',\n handler: async (args, ctx) => {\n const format = (args[0] as 'markdown' | 'json' | undefined) ?? 'markdown';\n await ctx.onExport(format);\n return { output: `Session exported as ${format}`, handled: true };\n },\n });\n\n this.register({\n command: '/rollback',\n description: 'Undo all file changes in this session',\n handler: async (_args, ctx) => {\n const out = await ctx.onRollback();\n return { output: out || 'File changes rolled back.', handled: true };\n },\n });\n\n this.register({\n command: '/branch',\n description: 'Fork current session into parallel branches',\n handler: async (_args, ctx) => {\n await ctx.onBranch();\n return { output: 'Session branched.', handled: true };\n },\n });\n\n this.register({\n command: '/model',\n description: 'Pick a provider and model for a tier (interactive)',\n handler: (_args, ctx) => ({ output: ctx.onModelPicker(), handled: true }),\n });\n\n this.register({\n command: '/model-info',\n description: 'Show active models per tier',\n handler: (_args, ctx) => ({ output: ctx.onModelInfo(), handled: true }),\n });\n\n this.register({\n command: '/models',\n description: 'Browse available models by provider',\n handler: (_args, ctx) => ({ output: ctx.onModelsInfo(), handled: true }),\n });\n\n this.register({\n command: '/providers',\n description: 'Show configured providers',\n handler: (_args, ctx) => ({ output: ctx.onProvidersInfo(), handled: true }),\n });\n\n this.register({\n command: '/config',\n description: 'Show active configuration summary',\n handler: (_args, ctx) => ({ output: ctx.onConfigInfo(), handled: true }),\n });\n\n this.register({\n command: '/retry',\n description: 'Retry the last user prompt',\n handler: async (_args, ctx) => ({ output: await ctx.onRetry(), handled: true }),\n });\n\n this.register({\n command: '/search',\n description: 'Search past sessions/messages',\n handler: async (args, ctx) => ({ output: await ctx.onSearch(args), handled: true }),\n });\n\n this.register({\n command: '/diagnose',\n description: 'Run provider/model/config health checks',\n handler: async (_args, ctx) => ({ output: await ctx.onDiagnose(), handled: true }),\n });\n\n this.register({\n command: '/logs',\n description: 'Show recent runtime logs',\n handler: async (args, ctx) => ({ output: await ctx.onLogs(args), handled: true }),\n });\n\n this.register({\n command: '/tree',\n description: 'Show current agent tree as text',\n handler: (_args, ctx) => ({ output: ctx.onTree(), handled: true }),\n });\n\n this.register({\n command: '/resume',\n description: 'Resume a session by ID',\n handler: async (args, ctx) => ({ output: await ctx.onResume(args), handled: true }),\n });\n\n this.register({\n command: '/mcp',\n description: 'List and manage MCP servers',\n handler: async (_args, ctx) => ({ output: await ctx.onMcpList(), handled: true }),\n });\n\n this.register({\n command: '/cost',\n description: 'Show session cost and token usage',\n handler: (_args, ctx) => {\n return { output: ctx.onCostInfo(), handled: true };\n },\n });\n\n this.register({\n command: '/budget',\n description: 'Manage session budget cap /budget [set <$amount> | clear]',\n args: ['set <amount>', 'clear'],\n handler: (args, ctx) => ({ output: ctx.onBudget(args), handled: true }),\n });\n\n this.register({\n command: '/status',\n description: 'Show active agent tree status',\n handler: (_args, ctx) => ({ output: ctx.onStatus(), handled: true }),\n });\n\n this.register({\n command: '/sessions',\n description: 'List and resume past sessions',\n handler: async (args, ctx) => ({ output: await ctx.onSessions(args), handled: true }),\n });\n\n this.register({\n command: '/identity',\n description: 'Switch active identity',\n handler: async (args, ctx) => ({ output: await ctx.onIdentity(args), handled: true }),\n });\n\n this.register({\n command: '/compact',\n description: 'Compact/summarize context now',\n handler: async (_args, ctx) => {\n const out = await ctx.onCompact();\n return { output: out || 'Context compacted.', handled: true };\n },\n });\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Live Agent Tree (compact, Claude Code style)\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport type { Theme } from '../../../types.js';\n\nexport interface TierNode {\n id: string;\n role: 'T1' | 'T2' | 'T3';\n label: string;\n status: 'IDLE' | 'ACTIVE' | 'COMPLETED' | 'FAILED' | 'ESCALATED';\n currentAction?: string;\n progressPct?: number;\n children?: TierNode[];\n}\n\ninterface AgentTreeProps {\n root: TierNode | null;\n theme: Theme;\n onToggleCollapse?: (nodeId: string) => void;\n}\n\nexport function AgentTree({ root, theme }: AgentTreeProps): React.ReactElement | null {\n if (!root) return null;\n\n // Only render when something is actually running or recently ran\n const isActive = hasActiveOrFailed(root);\n if (!isActive) return null;\n\n const t2Count = countByRole(root, 'T2');\n const t3Count = countByRole(root, 'T3');\n const t2Active = countByRoleAndStatus(root, 'T2', 'ACTIVE');\n const t3Active = countByRoleAndStatus(root, 'T3', 'ACTIVE');\n\n const headerAction = root.currentAction?.slice(0, 45) ?? '';\n const t2Label = t2Count > 0 ? ` → T2×${t2Count}` : '';\n const t3Label = t3Count > 0 ? ` → T3×${t3Count}` : '';\n const activeLabel = (t2Active + t3Active) > 0\n ? ` (${t2Active + t3Active} active)`\n : '';\n\n return (\n <Box flexDirection=\"column\" marginY={0} paddingLeft={1}>\n {/* Header line: ◈ T1 → T2×3 → T3×12 (action) spinner */}\n <Box>\n <Text color={theme.colors.primary} bold>◈ T1{t2Label}{t3Label}</Text>\n {activeLabel ? <Text color={theme.colors.muted}>{activeLabel}</Text> : null}\n {headerAction ? <Text color={theme.colors.muted}> {headerAction}</Text> : null}\n <Text> </Text>\n {root.status === 'ACTIVE'\n ? <><Spinner type=\"dots\" /></>\n : root.status === 'COMPLETED'\n ? <Text color={theme.colors.success}> ✔</Text>\n : root.status === 'FAILED'\n ? <Text color={theme.colors.error}> ✘</Text>\n : null}\n </Box>\n\n {/* T2 rows — depth-capped, max 6 visible */}\n {root.children?.slice(0, 6).map((child, i, arr) => (\n <T2Row\n key={child.id}\n node={child}\n theme={theme}\n isLast={i === arr.length - 1}\n />\n ))}\n {(root.children?.length ?? 0) > 6 && (\n <Text color={theme.colors.muted}> └─ …{(root.children?.length ?? 0) - 6} more sections</Text>\n )}\n </Box>\n );\n}\n\ninterface T2RowProps {\n node: TierNode;\n theme: Theme;\n isLast: boolean;\n}\n\nfunction T2Row({ node, theme, isLast }: T2RowProps): React.ReactElement {\n const connector = isLast ? '└─ ' : '├─ ';\n const t3Active = countByRoleAndStatus(node, 'T3', 'ACTIVE');\n const t3Total = countByRole(node, 'T3');\n const workerSuffix = t3Total > 0 ? ` T3×${t3Total}` : '';\n\n const label = stripRolePrefix(node.label, node.role);\n const action = node.currentAction ? ` ${node.currentAction.slice(0, 38)}` : '';\n\n return (\n <Box>\n <Text color={theme.colors.muted}> {connector}</Text>\n <Text color={theme.colors.t2Color} bold>[T2]</Text>\n <Text color={theme.colors.foreground}> {label}</Text>\n {workerSuffix ? <Text color={theme.colors.muted}>{workerSuffix}</Text> : null}\n {node.status === 'ACTIVE' && (\n <>\n {action ? <Text color={theme.colors.muted}>{action}</Text> : null}\n <Text> </Text><Spinner type=\"dots\" />\n {t3Active > 0 ? <Text color={theme.colors.muted}> ({t3Active} running)</Text> : null}\n </>\n )}\n {node.status === 'COMPLETED' && <Text color={theme.colors.success}> ✔</Text>}\n {node.status === 'FAILED' && <Text color={theme.colors.error}> ✘</Text>}\n {node.status === 'ESCALATED' && <Text color={theme.colors.warning}> ▲</Text>}\n </Box>\n );\n}\n\nfunction hasActiveOrFailed(node: TierNode): boolean {\n if (node.status === 'ACTIVE' || node.status === 'FAILED') return true;\n return node.children?.some(hasActiveOrFailed) ?? false;\n}\n\nfunction countByRole(node: TierNode, role: TierNode['role']): number {\n const self = node.role === role ? 1 : 0;\n return self + (node.children?.reduce((a, c) => a + countByRole(c, role), 0) ?? 0);\n}\n\nfunction countByRoleAndStatus(node: TierNode, role: TierNode['role'], status: TierNode['status']): number {\n const self = node.role === role && node.status === status ? 1 : 0;\n return self + (node.children?.reduce((a, c) => a + countByRoleAndStatus(c, role, status), 0) ?? 0);\n}\n\nfunction stripRolePrefix(label: string, role: string): string {\n return label.replace(new RegExp(`^\\\\[${role}\\\\]\\\\s*`, 'i'), '');\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Execution Timeline Panel\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport type { Theme } from '../../../types.js';\nimport type { TierNode } from './AgentTree.js';\n\ninterface TimelinePanelProps {\n nodes: TierNode[];\n theme: Theme;\n currentIndex: number;\n onChangeIndex?: (index: number) => void;\n}\n\nexport function TimelinePanel({ nodes, theme, currentIndex }: TimelinePanelProps): React.ReactElement | null {\n if (!nodes.length) return null;\n\n const entries = [...nodes].sort((a, b) => a.id.localeCompare(b.id));\n const selected = entries[Math.min(currentIndex, entries.length - 1)] ?? entries[0];\n\n return (\n <Box flexDirection=\"column\" marginTop={0}>\n <Text bold color={theme.colors.muted}>Activity Log</Text>\n <Box flexDirection=\"column\" marginTop={0}>\n {entries.slice(-3).map((node) => (\n <Text key={node.id} color={theme.colors.accent}>\n [{node.role}] {node.label} — {node.status}\n </Text>\n ))}\n </Box>\n </Box>\n );\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Status Bar (top, Claude Code style)\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport type { Theme } from '../../../types.js';\n\ninterface StatusBarProps {\n theme: Theme;\n tierModels: { t1?: string; t2?: string; t3?: string };\n tokens: number;\n costUsd: number;\n workspacePath: string;\n isExecuting: boolean;\n activeTier?: string;\n}\n\nexport function StatusBar({\n theme,\n tierModels,\n tokens,\n costUsd,\n workspacePath,\n isExecuting,\n activeTier,\n}: StatusBarProps): React.ReactElement {\n const { stdout } = useStdout();\n const width = (stdout?.columns ?? 80) - 2;\n\n const t1Label = tierModels.t1 ? truncate(tierModels.t1, 18) : 'auto';\n const folderName = workspacePath.split(/[/\\\\]/).pop() ?? workspacePath;\n const tierIndicator = activeTier ? ` [${activeTier}]` : '';\n\n const left = ` ◈ CASCADE${tierIndicator} `;\n const mid = ` ${truncate(folderName, 24)} T1:${t1Label} `;\n const right = ` ${formatTokens(tokens)} · $${costUsd.toFixed(4)} ${isExecuting ? '⚡' : '·'} `;\n\n const totalUsed = left.length + mid.length + right.length;\n const gap = Math.max(0, width - totalUsed);\n const leftGap = ' '.repeat(Math.floor(gap / 2));\n const rightGap = ' '.repeat(Math.ceil(gap / 2));\n\n return (\n <Box\n borderStyle=\"single\"\n borderTop={false}\n borderBottom={true}\n borderLeft={false}\n borderRight={false}\n borderColor={theme.colors.border}\n width={width + 2}\n >\n <Text backgroundColor={theme.colors.primary} color={theme.colors.background} bold>{left}</Text>\n <Text color={theme.colors.muted}>{leftGap}{mid}{rightGap}</Text>\n <Text color={theme.colors.muted}>{right}</Text>\n </Box>\n );\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M tok`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K tok`;\n return `${n} tok`;\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Keyboard Hint Bar\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport type { Theme } from '../../../types.js';\n\ninterface HintBarProps {\n theme: Theme;\n isExecuting: boolean;\n}\n\nexport function HintBar({ theme, isExecuting }: HintBarProps): React.ReactElement | null {\n // Hide during execution to reclaim vertical space\n if (isExecuting) return null;\n\n return (\n <Box paddingLeft={1}>\n <Text color={theme.colors.muted} dimColor>\n {'Esc cancel · ↑↓ history · / commands · Ctrl+C exit'}\n </Text>\n </Box>\n );\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Approval Prompt\n// ─────────────────────────────────────────────\n\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ApprovalRequest, Theme } from '../../../types.js';\n\ninterface ApprovalPromptProps {\n request: ApprovalRequest;\n theme: Theme;\n onDecision: (decision: { approved: boolean; always: boolean }) => void;\n}\n\nexport function ApprovalPrompt({ request, theme, onDecision }: ApprovalPromptProps): React.ReactElement {\n const [decided, setDecided] = useState(false);\n\n useInput((input, key) => {\n if (decided) return;\n if (input === 'a' || input === 'A') {\n setDecided(true);\n onDecision({ approved: true, always: true });\n } else if (input === 'y' || input === 'Y') {\n setDecided(true);\n onDecision({ approved: true, always: false });\n } else if (input === 'n' || input === 'N' || key.escape) {\n setDecided(true);\n onDecision({ approved: false, always: false });\n }\n });\n\n const borderColor = request.isDangerous ? theme.colors.error : theme.colors.warning;\n const icon = request.isDangerous ? '⚠' : '?';\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n paddingX={2}\n paddingY={1}\n marginY={1}\n >\n <Text color={borderColor} bold>{icon} Approval Required</Text>\n <Text color={theme.colors.muted}>Agent: {request.tierId}</Text>\n <Text color={theme.colors.foreground} bold>Tool: {request.toolName}</Text>\n <Box marginTop={1} height={4}>\n <Text color={theme.colors.muted}>Input: </Text>\n <Text>{JSON.stringify(request.input, null, 2).slice(0, 200).split('\\n').slice(0, 4).join('\\n')}</Text>\n </Box>\n <Box marginTop={1}>\n {!decided ? (\n <Text>\n <Text color={theme.colors.success} bold>[a]</Text>\n <Text color={theme.colors.muted}> Allow Always </Text>\n <Text color={theme.colors.success} bold>[y]</Text>\n <Text color={theme.colors.muted}> Allow </Text>\n <Text color={theme.colors.error} bold>[n]</Text>\n <Text color={theme.colors.muted}> Deny </Text>\n <Text color={theme.colors.muted}>[Esc] Deny</Text>\n </Text>\n ) : (\n <Text color={theme.colors.muted}>Responding...</Text>\n )}\n </Box>\n </Box>\n );\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Interactive Model Picker\n// ─────────────────────────────────────────────\n//\n// Three-step picker, modelled after Claude Code's `/model` UX:\n//\n// 1. PROVIDER — list of configured providers + \"Auto\"\n// 2. TIER — T1 / T2 / T3 (which tier to configure)\n// 3. MODEL — list of models for that provider + \"Auto\"\n//\n// Both ↑ and ↓ arrows (plus j/k and Tab) move the cursor. Enter confirms,\n// Esc goes back one step (and closes the picker from the first step).\n// The previous build used ink-select-input which only responded to\n// the up arrow inside this component due to the REPL intercepting\n// key.downArrow for history navigation — we now roll our own key\n// handler so the picker is unambiguously the focused surface.\n\nimport React, { useMemo, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ModelInfo, ProviderType, TierRole } from '../../../types.js';\n\nexport type ModelPickerSelection =\n | { kind: 'auto'; tier: TierRole }\n | { kind: 'pick'; tier: TierRole; modelId: string; provider: ProviderType };\n\ninterface Props {\n providers: ProviderType[];\n modelsByProvider: Map<ProviderType, ModelInfo[]>;\n /** When the user confirms a selection, the REPL persists it + updates the router. */\n onSelect?: (selection: ModelPickerSelection) => void;\n onClose: () => void;\n}\n\ntype Step = 'PROVIDER' | 'TIER' | 'MODEL';\n\nconst TIERS: Array<{ id: TierRole; label: string; hint: string }> = [\n { id: 'T1', label: 'T1 — Administrator', hint: 'complex reasoning · runs once per task' },\n { id: 'T2', label: 'T2 — Manager', hint: 'per-section planning · a few calls per task' },\n { id: 'T3', label: 'T3 — Worker', hint: 'high volume · many parallel runs' },\n];\n\ninterface MenuItem {\n label: string;\n sublabel?: string;\n value: string;\n}\n\nexport const ModelsDisplay: React.FC<Props> = ({\n providers,\n modelsByProvider,\n onSelect,\n onClose,\n}) => {\n const [step, setStep] = useState<Step>('PROVIDER');\n const [cursor, setCursor] = useState(0);\n const [picked, setPicked] = useState<{ provider?: ProviderType | 'auto'; tier?: TierRole }>({});\n\n // ── Step → menu items ──────────────────────────\n const providerItems = useMemo<MenuItem[]>(() => {\n const base: MenuItem[] = [\n { label: '◇ Auto', sublabel: 'let Cascade pick per tier — recommended', value: 'auto' },\n ];\n for (const p of providers) {\n const count = modelsByProvider.get(p)?.length ?? 0;\n base.push({ label: p, sublabel: `${count} model${count === 1 ? '' : 's'} discovered`, value: p });\n }\n return base;\n }, [providers, modelsByProvider]);\n\n const tierItems = useMemo<MenuItem[]>(\n () => TIERS.map(t => ({ label: t.label, sublabel: t.hint, value: t.id })),\n [],\n );\n\n const modelItems = useMemo<MenuItem[]>(() => {\n if (!picked.provider || picked.provider === 'auto') return [];\n const list = (modelsByProvider.get(picked.provider as ProviderType) ?? [])\n .slice()\n .sort((a, b) => a.id.localeCompare(b.id));\n const items: MenuItem[] = [\n { label: '◇ Auto', sublabel: 'best available from this provider', value: '__auto__' },\n ];\n for (const m of list) {\n const ctx = m.contextWindow >= 1_000_000\n ? `${(m.contextWindow / 1_000_000).toFixed(1)}M ctx`\n : m.contextWindow >= 1_000\n ? `${Math.round(m.contextWindow / 1_000)}K ctx`\n : `${m.contextWindow} ctx`;\n items.push({ label: m.name, sublabel: `${m.id} · ${ctx}`, value: m.id });\n }\n return items;\n }, [picked.provider, modelsByProvider]);\n\n const currentItems: MenuItem[] =\n step === 'PROVIDER' ? providerItems : step === 'TIER' ? tierItems : modelItems;\n\n // ── Input handling — fixes the \"only ↑ works\" regression ────────\n useInput((input, key) => {\n if (key.escape) {\n if (step === 'MODEL') { setStep('TIER'); setCursor(0); return; }\n if (step === 'TIER') { setStep('PROVIDER'); setCursor(0); return; }\n onClose();\n return;\n }\n\n if (key.upArrow || input === 'k') {\n setCursor(c => (currentItems.length === 0 ? 0 : (c - 1 + currentItems.length) % currentItems.length));\n return;\n }\n if (key.downArrow || key.tab || input === 'j') {\n setCursor(c => (currentItems.length === 0 ? 0 : (c + 1) % currentItems.length));\n return;\n }\n // j/k handled above; numeric 1-9 jumps directly\n if (/^[1-9]$/.test(input)) {\n const idx = parseInt(input, 10) - 1;\n if (idx < currentItems.length) setCursor(idx);\n return;\n }\n\n if (key.return) {\n const selected = currentItems[cursor];\n if (!selected) return;\n\n if (step === 'PROVIDER') {\n if (selected.value === 'auto') {\n // Auto across all tiers — still ask which tier to clear the pin on\n setPicked({ provider: 'auto' });\n setStep('TIER');\n setCursor(0);\n return;\n }\n setPicked({ provider: selected.value as ProviderType });\n setStep('TIER');\n setCursor(0);\n return;\n }\n\n if (step === 'TIER') {\n const tier = selected.value as TierRole;\n if (picked.provider === 'auto') {\n onSelect?.({ kind: 'auto', tier });\n onClose();\n return;\n }\n setPicked(p => ({ ...p, tier }));\n setStep('MODEL');\n setCursor(0);\n return;\n }\n\n // step === 'MODEL'\n if (!picked.tier || !picked.provider || picked.provider === 'auto') {\n onClose();\n return;\n }\n if (selected.value === '__auto__') {\n onSelect?.({ kind: 'auto', tier: picked.tier });\n } else {\n onSelect?.({\n kind: 'pick',\n tier: picked.tier,\n provider: picked.provider as ProviderType,\n modelId: selected.value,\n });\n }\n onClose();\n }\n });\n\n // ── Presentation helpers ──────────────────────\n const title =\n step === 'PROVIDER' ? '◈ SELECT PROVIDER'\n : step === 'TIER' ? `◈ APPLY ${picked.provider === 'auto' ? 'AUTO' : String(picked.provider).toUpperCase()} TO WHICH TIER?`\n : `◈ ${String(picked.provider).toUpperCase()} → SELECT MODEL FOR ${picked.tier}`;\n\n const breadcrumb =\n step === 'PROVIDER' ? 'Step 1 / 3'\n : step === 'TIER' ? `Step 2 / 3 · provider: ${picked.provider}`\n : `Step 3 / 3 · ${picked.provider} → ${picked.tier}`;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Box justifyContent=\"space-between\">\n <Text bold color=\"cyan\">{title}</Text>\n <Text color=\"gray\">[Esc back · Enter select]</Text>\n </Box>\n <Box marginBottom={1}>\n <Text color=\"gray\">{breadcrumb} · ↑/↓ navigate · 1–9 jump</Text>\n </Box>\n\n {currentItems.length === 0 ? (\n <Text italic color=\"yellow\">No items to show.</Text>\n ) : (\n <Box flexDirection=\"column\">\n {currentItems.map((item, i) => {\n const focused = i === cursor;\n return (\n <Box key={`${step}-${item.value}-${i}`} flexDirection=\"row\">\n <Text color={focused ? 'green' : 'gray'}>{focused ? '❯ ' : ' '}</Text>\n <Box flexDirection=\"column\">\n <Text color={focused ? 'white' : 'gray'} bold={focused}>{item.label}</Text>\n {item.sublabel && (\n <Text color=\"gray\" dimColor>{` ${item.sublabel}`}</Text>\n )}\n </Box>\n </Box>\n );\n })}\n </Box>\n )}\n </Box>\n );\n};\n","// ─────────────────────────────────────────────\n// Cascade AI — Cost Tracker Display\n// ─────────────────────────────────────────────\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport type { Theme } from '../../../types.js';\n\ninterface CostTrackerProps {\n theme: Theme;\n totalTokens: number;\n totalCostUsd: number;\n callsByProvider: Record<string, number>;\n callsByTier: Record<string, number>;\n /** Optional per-tier cost breakdown for granular attribution. */\n costByTier?: Record<string, number>;\n /** Optional per-tier token totals. */\n tokensByTier?: Record<string, number>;\n}\n\nexport function CostTracker({\n theme,\n totalTokens,\n totalCostUsd,\n callsByProvider,\n callsByTier,\n costByTier,\n tokensByTier,\n}: CostTrackerProps): React.ReactElement {\n const hasTierCost = costByTier && Object.keys(costByTier).length > 0;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.colors.border} paddingX={2}>\n <Text color={theme.colors.primary} bold>Session Usage</Text>\n\n <Box marginTop={1}>\n <Box width={20}><Text color={theme.colors.muted}>Total tokens:</Text></Box>\n <Text color={theme.colors.foreground} bold>{totalTokens.toLocaleString()}</Text>\n </Box>\n <Box>\n <Box width={20}><Text color={theme.colors.muted}>Estimated cost:</Text></Box>\n <Text color={theme.colors.success} bold>${totalCostUsd.toFixed(6)}</Text>\n </Box>\n\n {Object.keys(callsByProvider).length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.colors.muted}>By provider:</Text>\n {Object.entries(callsByProvider).map(([p, c]) => (\n <Box key={p} marginLeft={2}>\n <Box width={20}><Text color={theme.colors.secondary}>{p}</Text></Box>\n <Text>{c} calls</Text>\n </Box>\n ))}\n </Box>\n )}\n\n {Object.keys(callsByTier).length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.colors.muted}>By tier:</Text>\n {Object.entries(callsByTier).map(([tier, calls]) => {\n const color = tier === 'T1'\n ? theme.colors.t1Color\n : tier === 'T2' ? theme.colors.t2Color : theme.colors.t3Color;\n const tierCost = hasTierCost ? (costByTier![tier] ?? 0) : null;\n const tierTokens = tokensByTier ? (tokensByTier[tier] ?? 0) : null;\n\n return (\n <Box key={tier} marginLeft={2}>\n <Box width={8}><Text color={color} bold>{tier}</Text></Box>\n <Box width={12}><Text dimColor>{calls} call{calls !== 1 ? 's' : ''}</Text></Box>\n {tierTokens !== null && (\n <Box width={16}><Text dimColor>{tierTokens.toLocaleString()} tok</Text></Box>\n )}\n {tierCost !== null && (\n <Text color={theme.colors.success}>${tierCost.toFixed(6)}</Text>\n )}\n </Box>\n );\n })}\n {hasTierCost && totalCostUsd > 0 && (\n <Box marginLeft={2} marginTop={1} flexDirection=\"column\">\n <Text color={theme.colors.muted} dimColor>Cost distribution:</Text>\n {Object.entries(costByTier!).map(([tier, cost]) => {\n const pct = Math.round((cost / totalCostUsd) * 1000) / 10;\n const color = tier === 'T1'\n ? theme.colors.t1Color\n : tier === 'T2' ? theme.colors.t2Color : theme.colors.t3Color;\n const barLen = Math.round(pct / 5); // 20 char max bar\n const bar = '█'.repeat(barLen) + '░'.repeat(20 - barLen);\n return (\n <Box key={tier} marginLeft={2}>\n <Box width={5}><Text color={color} bold>{tier}</Text></Box>\n <Text color={color}>{bar}</Text>\n <Text dimColor> {pct}%</Text>\n </Box>\n );\n })}\n </Box>\n )}\n </Box>\n )}\n </Box>\n );\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — Line Buffer Utility\n// ─────────────────────────────────────────────\n\nimport wrapAnsi from 'wrap-ansi';\nimport chalk from 'chalk';\nimport type { Message, Theme } from '../../../types.js';\n\n/**\n * Converts a conversation history into a flat array of formatted lines,\n * respecting terminal width and applying word-wrapping.\n */\nexport function formatToLines(messages: Message[], width: number, theme: Theme): string[] {\n const lines: string[] = [];\n\n for (const msg of messages) {\n const { label, color, prefix } = getRoleStyle(msg.role, theme);\n \n // 1. Header (Role + Timestamp)\n const time = msg.timestamp ? ` ${chalk.hex(theme.colors.muted)(new Date(msg.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }))}` : '';\n lines.push(`${color(prefix)} ${color.bold(label)}${time}`);\n \n // 2. Content\n const content = normalizeContent(msg.content);\n const formattedContent = formatMarkdownish(content, theme);\n \n // Wrap the content (with indentation)\n const wrapped = wrapAnsi(formattedContent, width - 4, { hard: true, trim: false });\n const contentLines = wrapped.split('\\n');\n \n for (const line of contentLines) {\n lines.push(` ${line}`); // Indent content for readability\n }\n \n // 3. Spacing\n lines.push('');\n }\n\n return lines;\n}\n\nfunction getRoleStyle(role: Message['role'], theme: Theme) {\n switch (role) {\n case 'user':\n return { label: 'You', color: chalk.hex(theme.colors.primary), prefix: '▸' };\n case 'assistant':\n return { label: 'Cascade', color: chalk.hex(theme.colors.secondary), prefix: '◈' };\n case 'system':\n return { label: 'System', color: chalk.hex(theme.colors.muted), prefix: '◦' };\n case 'error':\n return { label: 'Error', color: chalk.hex(theme.colors.error), prefix: '✗' };\n default:\n return { label: 'Unknown', color: chalk.white, prefix: '?' };\n }\n}\n\nfunction normalizeContent(content: string | unknown): string {\n if (typeof content === 'string') return content;\n if (content == null) return '';\n if (Array.isArray(content)) {\n return content.map(p => typeof p === 'string' ? p : JSON.stringify(p)).join(' ');\n }\n return typeof content === 'object' ? JSON.stringify(content) : String(content);\n}\n\nfunction formatMarkdownish(content: string, theme: Theme): string {\n return content\n .replace(/\\*\\*(.*?)\\*\\*/g, (_, t) => chalk.bold(t))\n .replace(/`(.*?)`/g, (_, t) => chalk.inverse(t))\n .replace(/```([\\s\\S]*?)```/g, (_, code) => {\n // For simple inline viewport, we'll just dim code blocks or give them a subtle background\n return chalk.dim(code.trim());\n });\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — `cascade init` Command\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { createDefaultCascadeMd } from '../../config/cascade-md.js';\nimport { createDefaultIgnoreFile } from '../../config/ignore.js';\nimport { ConfigManager } from '../../config/index.js';\nimport { CASCADE_CONFIG_FILE } from '../../constants.js';\nimport { runSetupWizard } from '../setup/index.js';\n\nexport async function initCommand(workspacePath = process.cwd()): Promise<void> {\n const spin = ora({ text: 'Initializing Cascade project…', color: 'magenta' }).start();\n\n try {\n const configDir = path.join(workspacePath, '.cascade');\n await fs.mkdir(configDir, { recursive: true });\n\n // Write CASCADE.md\n const mdPath = path.join(workspacePath, 'CASCADE.md');\n if (!(await fileExists(mdPath))) {\n await createDefaultCascadeMd(workspacePath);\n spin.succeed(chalk.green('Created CASCADE.md'));\n }\n\n // Write .cascadeignore\n const ignorePath = path.join(workspacePath, '.cascadeignore');\n if (!(await fileExists(ignorePath))) {\n await createDefaultIgnoreFile(workspacePath);\n spin.succeed(chalk.green('Created .cascadeignore'));\n }\n\n spin.stop();\n console.log();\n console.log(chalk.magenta(' ◈ Cascade AI — Project initialized'));\n console.log();\n\n // Launch interactive setup wizard to configure providers and models\n const configPath = path.join(workspacePath, CASCADE_CONFIG_FILE);\n if (await fileExists(configPath)) {\n console.log(chalk.yellow(' .cascade/config.json already exists — launching wizard to reconfigure.'));\n console.log();\n }\n\n const config = await runSetupWizard(workspacePath);\n\n // Persist config via ConfigManager so all schema defaults are applied\n const cm = new ConfigManager(workspacePath);\n await cm.load();\n await cm.updateConfig(config);\n\n console.log();\n console.log(chalk.green(' ◈ Setup complete! Run `cascade` to start.'));\n console.log();\n } catch (err) {\n console.error(chalk.red(`Init failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — First-Run Setup Wizard (Ink TUI)\n// ─────────────────────────────────────────────\n//\n// Flow: PROVIDER_SELECT → API_KEYS → FETCH_MODELS → TIER_ASSIGN → SAVE\n//\n// Supports multiple Azure deployments and multiple OpenAI-compatible\n// endpoints — each appears as a separate selectable entry in tier assignment.\n\nimport React, { useCallback, useEffect, useReducer, useRef, useState } from 'react';\nimport { Box, Text, useApp, useInput, render } from 'ink';\nimport SelectInput from 'ink-select-input';\nimport Spinner from 'ink-spinner';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { randomUUID } from 'node:crypto';\nimport { CascadeConfigSchema } from '../../config/schema.js';\nimport { CASCADE_CONFIG_FILE, GLOBAL_CONFIG_DIR } from '../../constants.js';\nimport type { CascadeConfig } from '../../types.js';\nimport { SafeTextInput } from '../components/SafeTextInput.js';\n\n// ── Types ─────────────────────────────────────\n\ntype ProviderType = 'anthropic' | 'openai' | 'gemini' | 'azure' | 'ollama' | 'openai-compatible';\n\ninterface ProviderEntry {\n id: string;\n type: ProviderType;\n label: string; // display name\n apiKey?: string;\n baseUrl?: string;\n deploymentName?: string;\n}\n\ninterface FetchedModel {\n id: string;\n name: string;\n providerLabel: string;\n}\n\ntype WizardStep =\n | 'PROVIDER_SELECT'\n | 'API_KEYS'\n | 'FETCH_MODELS'\n | 'TIER_ASSIGN'\n | 'SAVE';\n\ninterface WizardState {\n step: WizardStep;\n selectedTypes: Set<ProviderType>;\n entries: ProviderEntry[]; // one per configured provider/deployment\n currentEntryIdx: number; // which entry we are collecting keys for\n addingAnotherAzure: boolean;\n addingAnotherCompat: boolean;\n fetchedModels: FetchedModel[];\n fetchLog: string[];\n tierT1: string; // 'auto' or model id\n tierT2: string;\n tierT3: string;\n tierSelectFocus: 'T1' | 'T2' | 'T3';\n error: string | null;\n}\n\ntype WizardAction =\n | { type: 'TOGGLE_PROVIDER'; provider: ProviderType }\n | { type: 'TOGGLE_ALL' }\n | { type: 'INVERT_SELECTION' }\n | { type: 'CONFIRM_PROVIDERS' }\n | { type: 'SET_ENTRY_FIELD'; field: keyof ProviderEntry; value: string }\n | { type: 'NEXT_ENTRY' }\n | { type: 'ADD_AZURE' }\n | { type: 'ADD_COMPAT' }\n | { type: 'SKIP_MORE' }\n | { type: 'SET_FETCH_LOG'; line: string }\n | { type: 'SET_MODELS'; models: FetchedModel[] }\n | { type: 'GO_FETCH' }\n | { type: 'SET_TIER'; tier: 'T1' | 'T2' | 'T3'; value: string }\n | { type: 'SET_TIER_FOCUS'; tier: 'T1' | 'T2' | 'T3' }\n | { type: 'GO_SAVE' }\n | { type: 'SET_ERROR'; error: string };\n\nconst PROVIDER_LABELS: Record<ProviderType, string> = {\n anthropic: 'Anthropic Claude',\n openai: 'OpenAI GPT',\n gemini: 'Google Gemini',\n azure: 'Azure OpenAI',\n ollama: 'Ollama (local)',\n 'openai-compatible': 'OpenAI-Compatible',\n};\n\nconst providerOrder: ProviderType[] = ['anthropic', 'openai', 'gemini', 'azure', 'ollama', 'openai-compatible'];\n\nfunction buildInitialEntries(types: Set<ProviderType>): ProviderEntry[] {\n return [...types].map(type => ({\n id: randomUUID(),\n type,\n label: type === 'azure' ? 'Azure deployment 1'\n : type === 'openai-compatible' ? 'Custom endpoint 1'\n : PROVIDER_LABELS[type],\n }));\n}\n\nfunction wizardReducer(state: WizardState, action: WizardAction): WizardState {\n switch (action.type) {\n case 'TOGGLE_PROVIDER': {\n const next = new Set(state.selectedTypes);\n if (next.has(action.provider)) next.delete(action.provider);\n else next.add(action.provider);\n return { ...state, selectedTypes: next };\n }\n case 'TOGGLE_ALL': {\n const allSelected = state.selectedTypes.size === providerOrder.length;\n return { ...state, selectedTypes: allSelected ? new Set() : new Set(providerOrder) };\n }\n case 'INVERT_SELECTION': {\n const next = new Set<ProviderType>();\n providerOrder.forEach(p => {\n if (!state.selectedTypes.has(p)) next.add(p);\n });\n return { ...state, selectedTypes: next };\n }\n case 'CONFIRM_PROVIDERS': {\n const entries = buildInitialEntries(state.selectedTypes);\n return { ...state, entries, currentEntryIdx: 0, step: 'API_KEYS' };\n }\n case 'SET_ENTRY_FIELD': {\n const updated = [...state.entries];\n updated[state.currentEntryIdx] = {\n ...updated[state.currentEntryIdx]!,\n [action.field]: action.value,\n };\n return { ...state, entries: updated };\n }\n case 'NEXT_ENTRY': {\n const next = state.currentEntryIdx + 1;\n if (next >= state.entries.length) {\n return { ...state, step: 'FETCH_MODELS', currentEntryIdx: 0 };\n }\n return { ...state, currentEntryIdx: next };\n }\n case 'ADD_AZURE': {\n const newEntry: ProviderEntry = {\n id: randomUUID(),\n type: 'azure',\n label: `Azure deployment ${state.entries.filter(e => e.type === 'azure').length + 1}`,\n };\n return {\n ...state,\n entries: [...state.entries, newEntry],\n currentEntryIdx: state.entries.length,\n addingAnotherAzure: false,\n };\n }\n case 'ADD_COMPAT': {\n const newEntry: ProviderEntry = {\n id: randomUUID(),\n type: 'openai-compatible',\n label: `Custom endpoint ${state.entries.filter(e => e.type === 'openai-compatible').length + 1}`,\n };\n return {\n ...state,\n entries: [...state.entries, newEntry],\n currentEntryIdx: state.entries.length,\n addingAnotherCompat: false,\n };\n }\n case 'SKIP_MORE':\n return { ...state, addingAnotherAzure: false, addingAnotherCompat: false, step: 'FETCH_MODELS', currentEntryIdx: 0 };\n case 'GO_FETCH':\n return { ...state, step: 'FETCH_MODELS', fetchLog: [], fetchedModels: [] };\n case 'SET_FETCH_LOG':\n return { ...state, fetchLog: [...state.fetchLog, action.line] };\n case 'SET_MODELS':\n return { ...state, fetchedModels: action.models, step: 'TIER_ASSIGN' };\n case 'SET_TIER':\n return {\n ...state,\n tierT1: action.tier === 'T1' ? action.value : state.tierT1,\n tierT2: action.tier === 'T2' ? action.value : state.tierT2,\n tierT3: action.tier === 'T3' ? action.value : state.tierT3,\n };\n case 'SET_TIER_FOCUS':\n return { ...state, tierSelectFocus: action.tier };\n case 'GO_SAVE':\n return { ...state, step: 'SAVE' };\n case 'SET_ERROR':\n return { ...state, error: action.error };\n default:\n return state;\n }\n}\n\n// ── Main Wizard Component ─────────────────────\n\ninterface SetupWizardProps {\n workspacePath: string;\n onComplete: (config: CascadeConfig) => void;\n}\n\nexport function SetupWizard({ workspacePath, onComplete }: SetupWizardProps): React.ReactElement {\n const { exit } = useApp();\n\n const [state, dispatch] = useReducer(wizardReducer, {\n step: 'PROVIDER_SELECT',\n selectedTypes: new Set<ProviderType>(),\n entries: [],\n currentEntryIdx: 0,\n addingAnotherAzure: false,\n addingAnotherCompat: false,\n fetchedModels: [],\n fetchLog: [],\n tierT1: 'auto',\n tierT2: 'auto',\n tierT3: 'auto',\n tierSelectFocus: 'T1',\n error: null,\n });\n\n const [providerCursor, setProviderCursor] = useState(0);\n const [fieldBuffer, setFieldBuffer] = useState('');\n const [fieldStage, setFieldStage] = useState<'apiKey' | 'baseUrl' | 'deploymentName' | 'label' | 'askMore'>('apiKey');\n const dispatchRef = useRef(dispatch);\n dispatchRef.current = dispatch;\n\n // ── Step: FETCH_MODELS ───────────────────────\n useEffect(() => {\n if (state.step !== 'FETCH_MODELS') return;\n\n const run = async () => {\n const models: FetchedModel[] = [];\n // Always include \"auto\"\n for (const entry of state.entries) {\n try {\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ⠋ ${entry.label} — connecting...` });\n // Build a minimal provider config to call listModels\n const { type, apiKey, baseUrl, deploymentName } = entry;\n if (type === 'ollama') {\n const { OllamaProvider } = await import('../../providers/ollama.js');\n const dummyModel = { id: 'dummy', name: 'dummy', provider: type as never, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: true };\n const p = new OllamaProvider({ type, baseUrl }, dummyModel);\n const fetched = await p.listModels();\n fetched.forEach(m => models.push({ id: m.id, name: m.name, providerLabel: entry.label }));\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ✔ ${entry.label} — ${fetched.length} models` });\n } else if (type === 'anthropic') {\n const { AnthropicProvider } = await import('../../providers/anthropic.js');\n const dummyModel = { id: 'dummy', name: 'dummy', provider: type as never, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: false };\n const p = new AnthropicProvider({ type, apiKey }, dummyModel);\n const fetched = await p.listModels();\n fetched.forEach(m => models.push({ id: m.id, name: m.name, providerLabel: entry.label }));\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ✔ ${entry.label} — ${fetched.length} models` });\n } else if (type === 'openai' || type === 'openai-compatible') {\n const { OpenAIProvider } = await import('../../providers/openai.js');\n const { OpenAICompatibleProvider } = await import('../../providers/openai-compatible.js');\n const dummyModel = { id: 'dummy', name: 'dummy', provider: type as never, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: false };\n const cfg = { type, apiKey, ...(baseUrl ? { baseUrl } : {}) };\n const p = type === 'openai' ? new OpenAIProvider(cfg as never, dummyModel) : new OpenAICompatibleProvider(cfg as never, dummyModel);\n const fetched = await p.listModels();\n fetched.forEach(m => models.push({ id: m.id, name: m.name, providerLabel: entry.label }));\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ✔ ${entry.label} — ${fetched.length} models` });\n } else if (type === 'gemini') {\n const { GeminiProvider } = await import('../../providers/gemini.js');\n const dummyModel = { id: 'dummy', name: 'dummy', provider: type as never, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: false };\n const p = new GeminiProvider({ type, apiKey }, dummyModel);\n const fetched = await p.listModels();\n fetched.forEach(m => models.push({ id: m.id, name: m.name, providerLabel: entry.label }));\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ✔ ${entry.label} — ${fetched.length} models` });\n } else if (type === 'azure') {\n const { AzureOpenAIProvider } = await import('../../providers/azure.js');\n const dummyModel = { id: 'dummy', name: 'dummy', provider: type as never, contextWindow: 0, isVisionCapable: false, inputCostPer1kTokens: 0, outputCostPer1kTokens: 0, maxOutputTokens: 0, supportsStreaming: false, isLocal: false };\n const p = new AzureOpenAIProvider({ type, apiKey, baseUrl, deploymentName }, dummyModel);\n const fetched = await p.listModels();\n fetched.forEach(m => models.push({ id: m.id, name: m.name, providerLabel: entry.label }));\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ✔ ${entry.label} — ${fetched.length} models` });\n }\n } catch (err) {\n dispatchRef.current({ type: 'SET_FETCH_LOG', line: ` ✘ ${entry.label} — ${err instanceof Error ? err.message : 'failed'}` });\n }\n }\n dispatchRef.current({ type: 'SET_MODELS', models });\n };\n\n run();\n }, [state.step, state.entries]);\n\n // ── Step: SAVE ───────────────────────────────\n useEffect(() => {\n if (state.step !== 'SAVE') return;\n\n const run = async () => {\n try {\n const providers = state.entries.map(e => ({\n type: e.type,\n ...(e.apiKey ? { apiKey: e.apiKey } : {}),\n ...(e.baseUrl ? { baseUrl: e.baseUrl } : {}),\n ...(e.deploymentName ? { deploymentName: e.deploymentName } : {}),\n }));\n\n const models: Record<string, string> = {};\n if (state.tierT1 !== 'auto') models['t1'] = state.tierT1;\n if (state.tierT2 !== 'auto') models['t2'] = state.tierT2;\n if (state.tierT3 !== 'auto') models['t3'] = state.tierT3;\n\n const rawConfig = { providers, ...(Object.keys(models).length ? { models } : {}) };\n const config = CascadeConfigSchema.parse(rawConfig);\n\n const configDir = path.join(workspacePath, '.cascade');\n await fs.mkdir(configDir, { recursive: true });\n const configPath = path.join(workspacePath, CASCADE_CONFIG_FILE);\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n\n onComplete(config as CascadeConfig);\n exit();\n } catch (err) {\n dispatchRef.current({ type: 'SET_ERROR', error: err instanceof Error ? err.message : String(err) });\n }\n };\n\n run();\n }, [state.step, state.entries, state.tierT1, state.tierT2, state.tierT3, workspacePath, onComplete, exit]);\n\n // ── Input handling ────────────────────────────\n useInput((_input, key) => {\n if (state.step === 'PROVIDER_SELECT') {\n if (key.upArrow) setProviderCursor(p => Math.max(0, p - 1));\n if (key.downArrow) setProviderCursor(p => Math.min(providerOrder.length - 1, p + 1));\n if (_input === ' ') dispatch({ type: 'TOGGLE_PROVIDER', provider: providerOrder[providerCursor]! });\n if (_input === 'a') dispatch({ type: 'TOGGLE_ALL' });\n if (_input === 'i') dispatch({ type: 'INVERT_SELECTION' });\n if (key.return) {\n if (state.selectedTypes.size === 0) return;\n dispatch({ type: 'CONFIRM_PROVIDERS' });\n setFieldStage('apiKey');\n setFieldBuffer('');\n }\n }\n if (state.step === 'TIER_ASSIGN') {\n if (key.tab || key.downArrow) {\n const order: Array<'T1' | 'T2' | 'T3'> = ['T1', 'T2', 'T3'];\n const idx = order.indexOf(state.tierSelectFocus);\n dispatch({ type: 'SET_TIER_FOCUS', tier: order[(idx + 1) % 3]! });\n }\n if (key.return) dispatch({ type: 'GO_SAVE' });\n }\n });\n\n // ── Current entry being configured ──────────\n const currentEntry = state.entries[state.currentEntryIdx];\n\n const handleFieldSubmit = useCallback((val: string) => {\n if (!currentEntry) return;\n\n if (currentEntry.type === 'azure') {\n if (fieldStage === 'deploymentName') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'deploymentName', value: val });\n setFieldBuffer('');\n setFieldStage('baseUrl');\n } else if (fieldStage === 'baseUrl') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'baseUrl', value: val });\n setFieldBuffer('');\n setFieldStage('apiKey');\n } else if (fieldStage === 'apiKey') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'apiKey', value: val });\n setFieldBuffer('');\n setFieldStage('askMore');\n }\n } else if (currentEntry.type === 'openai-compatible') {\n if (fieldStage === 'label') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'label', value: val || currentEntry.label });\n setFieldBuffer('');\n setFieldStage('baseUrl');\n } else if (fieldStage === 'baseUrl') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'baseUrl', value: val });\n setFieldBuffer('');\n setFieldStage('apiKey');\n } else if (fieldStage === 'apiKey') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'apiKey', value: val });\n setFieldBuffer('');\n setFieldStage('askMore');\n }\n } else if (currentEntry.type === 'ollama') {\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'baseUrl', value: val || 'http://localhost:11434' });\n setFieldBuffer('');\n dispatch({ type: 'NEXT_ENTRY' });\n setFieldStage('apiKey');\n } else {\n // anthropic / openai / gemini — just need apiKey\n dispatch({ type: 'SET_ENTRY_FIELD', field: 'apiKey', value: val });\n setFieldBuffer('');\n dispatch({ type: 'NEXT_ENTRY' });\n setFieldStage('apiKey');\n }\n }, [currentEntry, fieldStage]);\n\n // ── Render ────────────────────────────────────\n\n if (state.step === 'PROVIDER_SELECT') {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color=\"magenta\" bold>? </Text>\n <Text bold>Which providers do you want to configure?</Text>\n </Box>\n <Box flexDirection=\"column\">\n {providerOrder.map((p, i) => {\n const selected = state.selectedTypes.has(p);\n const focused = i === providerCursor;\n return (\n <Box key={p}>\n <Text color={focused ? 'magenta' : 'white'}>{focused ? '❯ ' : ' '}</Text>\n <Text color={selected ? 'green' : 'white'}>{selected ? '◉ ' : '◯ '}</Text>\n <Text color={focused ? 'magenta' : (selected ? 'white' : 'gray')}>{PROVIDER_LABELS[p]}</Text>\n {p === 'azure' && <Text dimColor> — multiple deployments supported</Text>}\n {p === 'openai-compatible' && <Text dimColor> — Groq, Together, custom</Text>}\n {p === 'ollama' && <Text dimColor> — no API key needed</Text>}\n </Box>\n );\n })}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>(Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)</Text>\n </Box>\n {state.error && <Text color=\"red\">{state.error}</Text>}\n </Box>\n );\n }\n\n if (state.step === 'API_KEYS' && currentEntry) {\n const isAzure = currentEntry.type === 'azure';\n const isCompat = currentEntry.type === 'openai-compatible';\n const isOllama = currentEntry.type === 'ollama';\n\n if (fieldStage === 'askMore') {\n // After completing an Azure or compat entry, ask if they want another\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color=\"magenta\" bold>? </Text>\n <Text bold>{isAzure ? 'Add another Azure deployment? (y/n)' : 'Add another custom endpoint? (y/n)'}</Text>\n </Box>\n <Box>\n <SelectInput\n items={[\n { label: 'Yes — add another', value: 'yes' },\n { label: 'No — continue', value: 'no' },\n ]}\n indicatorComponent={({ isSelected }) => <Text color=\"magenta\">{isSelected ? '❯ ' : ' '}</Text>}\n itemComponent={({ isSelected, label }) => <Text color={isSelected ? 'magenta' : 'white'}>{label}</Text>}\n onSelect={(item) => {\n if (item.value === 'yes') {\n if (isAzure) dispatch({ type: 'ADD_AZURE' });\n else dispatch({ type: 'ADD_COMPAT' });\n setFieldStage(isAzure ? 'deploymentName' : 'label');\n setFieldBuffer('');\n } else {\n dispatch({ type: 'NEXT_ENTRY' });\n setFieldStage('apiKey');\n setFieldBuffer('');\n }\n }}\n />\n </Box>\n </Box>\n );\n }\n\n const prompt =\n isAzure && fieldStage === 'deploymentName' ? `Azure deployment name (${currentEntry.label})` :\n isAzure && fieldStage === 'baseUrl' ? `Azure endpoint URL` :\n isCompat && fieldStage === 'label' ? `Name for this endpoint (e.g. Groq)` :\n isCompat && fieldStage === 'baseUrl' ? `Base URL (e.g. https://api.groq.com/openai/v1)` :\n isOllama ? `Ollama URL (Enter for http://localhost:11434)` :\n `${currentEntry.label} API Key`;\n\n const isMasked = fieldStage === 'apiKey';\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color=\"magenta\" bold>? </Text>\n <Text bold>{prompt}</Text>\n </Box>\n <Box>\n <Text color=\"magenta\">❯ </Text>\n <SafeTextInput\n value={fieldBuffer}\n onChange={setFieldBuffer}\n onSubmit={handleFieldSubmit}\n {...(isMasked ? { mask: '*' } : {})}\n placeholder={isOllama ? 'http://localhost:11434' : ''}\n />\n </Box>\n {isMasked && (\n <Box marginTop={1}>\n <Text dimColor>\n Tip: Ctrl+V pastes from clipboard. Most terminals also support right-click paste.\n </Text>\n </Box>\n )}\n {state.error && <Text color=\"red\">{state.error}</Text>}\n </Box>\n );\n }\n\n if (state.step === 'FETCH_MODELS') {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color=\"magenta\" bold>? </Text>\n <Text bold>Connecting to providers and fetching models...</Text>\n </Box>\n <Box flexDirection=\"column\">\n {state.fetchLog.map((line, i) => <Text key={i}>{line}</Text>)}\n {state.fetchedModels.length === 0 && (\n <Box>\n <Spinner type=\"dots\" />\n </Box>\n )}\n </Box>\n </Box>\n );\n }\n\n if (state.step === 'TIER_ASSIGN') {\n const modelOptions = [\n { label: 'Auto — let Cascade choose best available', value: 'auto' },\n ...state.fetchedModels.map(m => ({\n label: `${m.name} [${m.providerLabel}]`,\n value: m.id,\n })),\n ];\n\n const tierLabel = (tier: 'T1' | 'T2' | 'T3', hint: string) => {\n const isFocused = state.tierSelectFocus === tier;\n const current = tier === 'T1' ? state.tierT1 : tier === 'T2' ? state.tierT2 : state.tierT3;\n \n if (!isFocused) {\n return (\n <Box key={tier}>\n <Text color=\"green\" bold>✔ </Text>\n <Text bold>{tier} {hint}: </Text>\n <Text color=\"magenta\">{current === 'auto' ? 'Auto — let Cascade choose best available' : state.fetchedModels.find(m => m.id === current)?.name || current}</Text>\n </Box>\n );\n }\n \n return (\n <Box flexDirection=\"column\" marginBottom={1} key={tier}>\n <Box>\n <Text color=\"magenta\" bold>? </Text>\n <Text bold>{tier} {hint}: </Text>\n </Box>\n <Box>\n <SelectInput\n items={modelOptions}\n onSelect={(item) => dispatch({ type: 'SET_TIER', tier, value: item.value })}\n indicatorComponent={({ isSelected }) => <Text color=\"magenta\">{isSelected ? '❯ ' : ' '}</Text>}\n itemComponent={({ isSelected, label }) => <Text color={isSelected ? 'magenta' : 'white'}>{label}</Text>}\n />\n </Box>\n </Box>\n );\n };\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box flexDirection=\"column\">\n {tierLabel('T1', '(Administrator — complex reasoning, runs once per task)')}\n {tierLabel('T2', '(Manager — runs per section)')}\n {tierLabel('T3', '(Worker — high volume, many parallel runs)')}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>(Tab/Arrow Down to skip tier, Enter to select or save)</Text>\n </Box>\n {state.error && <Text color=\"red\">{state.error}</Text>}\n </Box>\n );\n }\n\n if (state.step === 'SAVE') {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box>\n <Text color=\"green\" bold>✔ </Text>\n <Text bold>Setup complete!</Text>\n </Box>\n <Box marginTop={1}>\n <Spinner type=\"dots\" />\n <Text> Writing .cascade/config.json...</Text>\n </Box>\n {state.error && <Text color=\"red\">Error: {state.error}</Text>}\n </Box>\n );\n }\n\n return <Box />;\n}\n\n// ── Exported runner ───────────────────────────\n\nexport async function runSetupWizard(workspacePath: string): Promise<CascadeConfig> {\n // Prominent telemetry notice — shown on every first-run setup so users\n // understand the default is OFF and they can revisit the decision later.\n printTelemetryBanner();\n return new Promise((resolve) => {\n const { unmount } = render(\n React.createElement(SetupWizard, {\n workspacePath,\n onComplete: (config) => {\n unmount();\n resolve(config);\n },\n }),\n { exitOnCtrlC: true },\n );\n });\n}\n\nfunction printTelemetryBanner(): void {\n // Plain console output (outside Ink) so it survives re-mounts.\n // eslint-disable-next-line no-console\n console.log();\n // eslint-disable-next-line no-console\n console.log(' ┌──────────────────────────────────────────────────────────────┐');\n // eslint-disable-next-line no-console\n console.log(' │ Telemetry: OFF by default. │');\n // eslint-disable-next-line no-console\n console.log(' │ Toggle anytime with: cascade telemetry on | off | status │');\n // eslint-disable-next-line no-console\n console.log(' │ Anonymous session metadata only — never prompts or output. │');\n // eslint-disable-next-line no-console\n console.log(' └──────────────────────────────────────────────────────────────┘');\n // eslint-disable-next-line no-console\n console.log();\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — `cascade doctor` Command\n// ─────────────────────────────────────────────\n\nimport axios from 'axios';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { CASCADE_CONFIG_FILE, LM_STUDIO_BASE_URL, OLLAMA_BASE_URL } from '../../constants.js';\nimport { ConfigManager } from '../../config/index.js';\n\ninterface CheckResult {\n label: string;\n ok: boolean;\n detail?: string;\n}\n\nexport async function doctorCommand(): Promise<void> {\n console.log(chalk.magenta('\\n ◈ Cascade Doctor — System Diagnostics\\n'));\n\n const checks: CheckResult[] = [];\n\n // Node version\n const nodeVersion = process.versions.node;\n const [major] = nodeVersion.split('.').map(Number);\n checks.push({\n label: `Node.js ${nodeVersion}`,\n ok: (major ?? 0) >= 18,\n detail: (major ?? 0) < 18 ? 'Requires Node.js ≥ 18' : undefined,\n });\n\n const cm = new ConfigManager(process.cwd());\n await cm.load();\n const config = cm.getConfig();\n\n checks.push({\n label: 'Cascade config',\n ok: true,\n detail: `Loaded ${path.join(process.cwd(), CASCADE_CONFIG_FILE)}`,\n });\n\n // API keys from config/env/keystore\n const providers: Array<{ type: string; name: string }> = [\n { type: 'anthropic', name: 'Anthropic' },\n { type: 'openai', name: 'OpenAI' },\n { type: 'gemini', name: 'Google Gemini' },\n { type: 'azure', name: 'Azure OpenAI' },\n ];\n\n for (const { type, name } of providers) {\n const key = cm.getApiKey(type);\n checks.push({\n label: `${name} API key`,\n ok: Boolean(key),\n detail: key ? 'Set' : 'Missing',\n });\n }\n\n // Ollama\n const ollamaOk = await checkEndpoint(OLLAMA_BASE_URL + '/api/tags');\n checks.push({ label: 'Ollama (localhost:11434)', ok: ollamaOk, detail: ollamaOk ? 'Running' : 'Not running' });\n\n // LM Studio\n const lmOk = await checkEndpoint(LM_STUDIO_BASE_URL + '/v1/models');\n checks.push({ label: 'LM Studio (localhost:1234)', ok: lmOk, detail: lmOk ? 'Running' : 'Not running' });\n\n // Playwright\n let playwrightOk = false;\n try {\n await import('playwright');\n playwrightOk = true;\n } catch { /* not installed */ }\n checks.push({ label: 'Playwright (browser automation)', ok: playwrightOk, detail: playwrightOk ? 'Installed' : 'Optional — npm install playwright' });\n\n const hasOpenAICompatible = config.providers.some((provider) => provider.type === 'openai-compatible');\n if (hasOpenAICompatible) {\n checks.push({\n label: 'OpenAI-compatible endpoint',\n ok: config.providers.some((provider) => provider.type === 'openai-compatible' && Boolean(provider.baseUrl)),\n detail: 'Configured in .cascade/config.json',\n });\n }\n\n const dashboardPasswordConfigured = Boolean(process.env['CASCADE_DASHBOARD_PASSWORD']);\n checks.push({\n label: 'Dashboard auth',\n ok: !config.dashboard.auth || dashboardPasswordConfigured,\n detail: config.dashboard.auth\n ? (dashboardPasswordConfigured ? 'Password configured' : 'Missing CASCADE_DASHBOARD_PASSWORD')\n : 'Disabled',\n });\n\n const dashboardSecretConfigured = Boolean(config.dashboard.secret || process.env['CASCADE_DASHBOARD_SECRET']);\n checks.push({\n label: 'Dashboard JWT secret',\n ok: !config.dashboard.auth || dashboardSecretConfigured,\n detail: config.dashboard.auth\n ? (dashboardSecretConfigured ? 'Configured' : 'Persisted at .cascade/dashboard-secret (0600)')\n : 'Not required',\n });\n\n // Keystore backend (keytar if available, encrypted file otherwise)\n let keystoreBackend = 'file (AES-256-GCM)';\n try {\n await import('keytar');\n keystoreBackend = 'keytar (OS keychain)';\n } catch {\n // keytar not installed or failed to load (Alpine, headless)\n }\n checks.push({\n label: 'Keystore backend',\n ok: true,\n detail: keystoreBackend,\n });\n\n // Telemetry — opt-in only, displayed prominently so users can audit it.\n const telemetryEnabled = Boolean(config.telemetry?.enabled);\n checks.push({\n label: 'Telemetry',\n ok: true,\n detail: telemetryEnabled\n ? 'ON — toggle with `cascade telemetry off`'\n : 'OFF (default) — toggle with `cascade telemetry on`',\n });\n\n // Print results\n for (const c of checks) {\n const icon = c.ok ? chalk.green(' ✓') : chalk.yellow(' ○');\n const label = c.ok ? chalk.white(c.label) : chalk.gray(c.label);\n const detail = c.detail ? chalk.gray(` — ${c.detail}`) : '';\n console.log(`${icon} ${label}${detail}`);\n }\n\n const failures = checks.filter((c) => !c.ok);\n console.log();\n\n if (failures.length === 0) {\n console.log(chalk.green(' All checks passed!\\n'));\n } else {\n const critical = failures.filter((c) => c.label.includes('Node') || c.label.includes('API key'));\n if (critical.length) {\n console.log(chalk.yellow(` ${critical.length} issue(s) need attention.\\n`));\n } else {\n console.log(chalk.gray(` ${failures.length} optional item(s) not configured.\\n`));\n }\n }\n}\n\nasync function checkEndpoint(url: string): Promise<boolean> {\n try {\n await axios.get(url, { timeout: 2000 });\n return true;\n } catch {\n return false;\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — `cascade update` Command\n// ─────────────────────────────────────────────\n\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { CASCADE_VERSION } from '../../constants.js';\n\nconst execAsync = promisify(exec);\n\nexport async function updateCommand(): Promise<void> {\n const spin = ora({ text: 'Checking for updates…', color: 'magenta' }).start();\n\n try {\n const { stdout } = await execAsync('npm show cascade-ai version', { timeout: 10_000 });\n const latest = stdout.trim();\n\n if (latest === CASCADE_VERSION) {\n spin.succeed(chalk.green(`Already up to date (v${CASCADE_VERSION})`));\n return;\n }\n\n spin.text = `Updating cascade-ai ${CASCADE_VERSION} → ${latest}…`;\n await execAsync('npm install -g cascade-ai@latest', { timeout: 60_000 });\n spin.succeed(chalk.green(`Updated to v${latest}! Restart your terminal.`));\n } catch (err) {\n spin.fail(chalk.red(`Update failed: ${err instanceof Error ? err.message : String(err)}`));\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 — 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 — `cascade dashboard` Command\n// ─────────────────────────────────────────────\n\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'node:path';\nimport type { CascadeConfig } from '../../types.js';\nimport { DashboardServer } from '../../dashboard/server.js';\nimport { MemoryStore } from '../../memory/store.js';\nimport { CASCADE_DB_FILE, DEFAULT_DASHBOARD_PORT } from '../../constants.js';\n\nexport async function dashboardCommand(\n config: CascadeConfig,\n workspacePath = process.cwd(),\n): Promise<void> {\n const port = config.dashboard.port ?? DEFAULT_DASHBOARD_PORT;\n const spin = ora({ text: `Starting dashboard on port ${port}…`, color: 'magenta' }).start();\n\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n const server = new DashboardServer(config, store, workspacePath);\n server.watchRuntimeChanges();\n (globalThis as typeof globalThis & { cascadeDashboardServer?: DashboardServer }).cascadeDashboardServer = server;\n\n try {\n await server.start();\n\n spin.succeed(chalk.green(`Dashboard running at http://localhost:${port}`));\n server.refreshRuntime('workspace');\n server.refreshRuntime('global');\n console.log(chalk.gray(` Press Ctrl+C to stop\\n`));\n\n process.on('SIGINT', async () => {\n await server.stop();\n process.exit(0);\n });\n\n // Keep alive\n await new Promise(() => {});\n } catch (err) {\n await server.stop().catch(() => {});\n store.close();\n spin.fail(chalk.red(`Dashboard failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n } finally {\n delete (globalThis as typeof globalThis & { cascadeDashboardServer?: DashboardServer }).cascadeDashboardServer;\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { MemoryStore } from '../../memory/store.js';\nimport { CASCADE_DB_FILE } from '../../constants.js';\n\nexport function makeIdentityCommand(workspacePath = process.cwd()): Command {\n const identity = new Command('identity')\n .alias('id')\n .description('Manage Cascade identities');\n\n identity\n .command('list')\n .description('List all available identities')\n .action(() => {\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n const identities = store.listIdentities();\n \n console.log(chalk.bold('\\n Identities:'));\n if (identities.length === 0) {\n console.log(chalk.gray(' No identities found.'));\n } else {\n identities.forEach(id => {\n const defaultLabel = id.isDefault ? chalk.green(' [Default]') : '';\n console.log(` - ${chalk.cyan(id.name)}${defaultLabel}`);\n console.log(chalk.gray(` ID: ${id.id}`));\n if (id.description) console.log(chalk.gray(` ${id.description}`));\n });\n }\n console.log();\n });\n\n identity\n .command('create <name>')\n .description('Create a new identity')\n .option('-d, --desc <text>', 'Description of the identity')\n .option('-s, --system <text>', 'System prompt')\n .option('--default', 'Set as default identity')\n .action((name, options) => {\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n \n if (options.default) {\n // Clear existing default\n const existingDefault = store.getDefaultIdentity();\n if (existingDefault) {\n store.updateIdentity(existingDefault.id, { isDefault: false });\n }\n }\n\n const id = randomUUID();\n store.createIdentity({\n id,\n name,\n description: options.desc,\n systemPrompt: options.system,\n isDefault: !!options.default,\n createdAt: new Date().toISOString()\n });\n\n console.log(chalk.green(`\\n Successfully created identity: ${name} (${id})`));\n if (options.default) console.log(chalk.green(' Set as default.'));\n console.log();\n });\n\n identity\n .command('set-default <name>')\n .description('Set an identity as default by name or ID')\n .action((query) => {\n const store = new MemoryStore(path.join(workspacePath, CASCADE_DB_FILE));\n const identities = store.listIdentities();\n const match = identities.find(i => i.id === query || i.name.toLowerCase() === query.toLowerCase());\n\n if (!match) {\n console.log(chalk.red(`\\n Identity '${query}' not found.\\n`));\n return;\n }\n\n const existingDefault = store.getDefaultIdentity();\n if (existingDefault && existingDefault.id !== match.id) {\n store.updateIdentity(existingDefault.id, { isDefault: false });\n }\n\n store.updateIdentity(match.id, { isDefault: true });\n console.log(chalk.green(`\\n Identity ${match.name} is now the default.\\n`));\n });\n\n return identity;\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — `cascade models` Command\n// ─────────────────────────────────────────────\n\nimport chalk from 'chalk';\nimport { ConfigManager } from '../../config/index.js';\nimport { CascadeRouter } from '../../core/router/index.js';\n\nexport async function modelsCommand(options: { verbose?: boolean } = {}): Promise<void> {\n console.log(chalk.magenta('\\n ◈ Cascade Models\\n'));\n\n const cm = new ConfigManager(process.cwd());\n await cm.load();\n const config = cm.getConfig();\n\n const router = new CascadeRouter();\n try {\n await router.init(config);\n } catch (err) {\n console.error(chalk.red(` Failed to initialize router: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tiers: Array<{ tier: 'T1' | 'T2' | 'T3'; label: string; color: any }> = [\n { tier: 'T1', label: 'T1 Administrator', color: chalk.hex('#7C6AF7') },\n { tier: 'T2', label: 'T2 Manager', color: chalk.hex('#5AB4E8') },\n { tier: 'T3', label: 'T3 Worker', color: chalk.hex('#5AE8A4') },\n ];\n\n let anyMissing = false;\n\n for (const { tier, label, color } of tiers) {\n const model = router.getTierModel(tier);\n if (model) {\n const costIn = model.inputCostPer1kTokens === 0 ? 'free' : `$${model.inputCostPer1kTokens.toFixed(4)}/1K in`;\n const costOut = model.outputCostPer1kTokens === 0 ? 'free' : `$${model.outputCostPer1kTokens.toFixed(4)}/1K out`;\n const ctx = model.contextWindow >= 1_000_000\n ? `${(model.contextWindow / 1_000_000).toFixed(1)}M ctx`\n : `${(model.contextWindow / 1_000).toFixed(0)}K ctx`;\n const local = model.isLocal ? chalk.gray(' [local]') : '';\n const vision = model.isVisionCapable ? chalk.gray(' 👁') : '';\n\n console.log(\n ` ${color.bold(tier)} ${chalk.white(model.name.padEnd(24))}` +\n `${chalk.gray(model.provider.padEnd(16))}` +\n (options.verbose\n ? `${chalk.gray(ctx.padEnd(12))}${chalk.gray(`${costIn}, ${costOut}`)}`\n : `${chalk.gray(ctx)}`) +\n local + vision,\n );\n } else {\n console.log(` ${color.bold(tier)} ${chalk.red('No model available')} ${chalk.gray(`(check provider config for ${label})`)}`);\n anyMissing = true;\n }\n }\n\n console.log();\n\n // Configured providers\n const providers = config.providers.map((p) => p.type).join(', ') || '(none)';\n console.log(chalk.gray(` Configured providers: ${providers}`));\n\n if (options.verbose) {\n // Show all available models grouped by provider\n console.log();\n console.log(chalk.white(' Available models by provider:\\n'));\n const allProviderTypes = [...new Set(config.providers.map((p) => p.type))];\n for (const providerType of allProviderTypes) {\n const available = router.getModelsForProvider(providerType as Parameters<typeof router.getModelsForProvider>[0]);\n if (available.length === 0) continue;\n console.log(chalk.gray(` ${providerType}:`));\n for (const m of available) {\n const override = config.models.t1 === m.id ? ' ← T1'\n : config.models.t2 === m.id ? ' ← T2'\n : config.models.t3 === m.id ? ' ← T3'\n : '';\n console.log(` ${chalk.white(m.name.padEnd(28))}${chalk.gray(m.id)}${chalk.yellow(override)}`);\n }\n console.log();\n }\n }\n\n if (anyMissing) {\n console.log(chalk.yellow(' Some tiers have no available model. Run `cascade doctor` for details.\\n'));\n } else {\n console.log(chalk.green(' All tiers are configured.\\n'));\n }\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — `cascade export` Command\n// ─────────────────────────────────────────────\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { MemoryStore } from '../../memory/store.js';\nimport { GLOBAL_CONFIG_DIR, GLOBAL_DB_FILE } from '../../constants.js';\nimport type { Session, StoredMessage } from '../../types.js';\n\nexport interface ExportOptions {\n sessionId?: string;\n format?: 'markdown' | 'json';\n output?: string;\n last?: number;\n}\n\nexport async function exportCommand(options: ExportOptions = {}): Promise<void> {\n const format = options.format ?? 'markdown';\n const spin = ora({ text: 'Loading sessions…', color: 'magenta' }).start();\n\n let store: MemoryStore;\n try {\n const dbPath = path.join(process.env['HOME'] ?? '~', GLOBAL_CONFIG_DIR, GLOBAL_DB_FILE);\n store = new MemoryStore(dbPath);\n } catch (err) {\n spin.fail(chalk.red(`Cannot open memory store: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n\n try {\n let sessions: Session[];\n\n if (options.sessionId) {\n const session = store.getSession(options.sessionId);\n if (!session) {\n spin.fail(chalk.red(`Session \"${options.sessionId}\" not found.`));\n process.exit(1);\n }\n sessions = [session];\n } else {\n const limit = options.last ?? 10;\n sessions = store.listSessions(undefined, limit);\n if (sessions.length === 0) {\n spin.warn(chalk.yellow('No sessions found.'));\n return;\n }\n\n // If no specific session requested, let the user know we'll export the most recent\n if (!options.sessionId) {\n const latest = sessions[0]!;\n const full = store.getSession(latest.id);\n sessions = full ? [full] : [];\n if (sessions.length === 0) {\n spin.fail(chalk.red('Could not load latest session.'));\n process.exit(1);\n }\n }\n }\n\n const session = sessions[0]!;\n spin.text = `Exporting session \"${session.title}\"…`;\n\n const content = format === 'json'\n ? buildJsonExport(session)\n : buildMarkdownExport(session);\n\n const ext = format === 'json' ? '.json' : '.md';\n const safeName = session.title.replace(/[^\\w\\s-]/g, '').replace(/\\s+/g, '-').slice(0, 60);\n const defaultFile = `cascade-export-${safeName}${ext}`;\n const outPath = options.output\n ? path.resolve(options.output)\n : path.join(process.cwd(), defaultFile);\n\n await fs.writeFile(outPath, content, 'utf-8');\n spin.succeed(chalk.green(`Exported to ${chalk.white(outPath)}`));\n\n // Print summary\n const messageCount = Array.isArray(session.messages) ? session.messages.length : 0;\n console.log();\n console.log(chalk.gray(` Session: ${session.title}`));\n console.log(chalk.gray(` Messages: ${messageCount}`));\n console.log(chalk.gray(` Format: ${format}`));\n console.log();\n } catch (err) {\n spin.fail(chalk.red(`Export failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\n// ── Formatters ────────────────────────────────\n\nfunction buildMarkdownExport(session: Session): string {\n const lines: string[] = [];\n\n lines.push(`# ${session.title}`);\n lines.push('');\n lines.push(`> **Session ID:** \\`${session.id}\\` `);\n lines.push(`> **Created:** ${new Date(session.createdAt).toLocaleString()} `);\n lines.push(`> **Updated:** ${new Date(session.updatedAt).toLocaleString()}`);\n lines.push('');\n lines.push('---');\n lines.push('');\n\n const messages: StoredMessage[] = Array.isArray(session.messages) ? session.messages : [];\n\n for (const msg of messages) {\n const role = msg.role;\n if (!msg.content.trim()) continue;\n\n if (role === 'user') {\n lines.push(`## 👤 User`);\n } else if (role === 'assistant') {\n lines.push(`## 🤖 Assistant`);\n } else if (role === 'system') {\n lines.push(`## ⚙️ System`);\n } else {\n lines.push(`## 🔧 Tool`);\n }\n\n lines.push('');\n lines.push(msg.content);\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction buildJsonExport(session: Session): string {\n const messages: StoredMessage[] = Array.isArray(session.messages) ? session.messages : [];\n const payload = {\n id: session.id,\n title: session.title,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n workspacePath: session.workspacePath,\n messageCount: messages.length,\n messages: messages.map((m) => ({\n id: m.id,\n role: m.role,\n content: m.content,\n timestamp: m.timestamp,\n tokens: m.tokens,\n })),\n };\n return JSON.stringify(payload, null, 2);\n}\n","// ─────────────────────────────────────────────\n// Cascade AI — `cascade telemetry on|off` Command\n// ─────────────────────────────────────────────\n\nimport chalk from 'chalk';\nimport { ConfigManager } from '../../config/index.js';\n\ntype TelemetryAction = 'on' | 'off' | 'status';\n\nexport async function telemetryCommand(action: TelemetryAction): Promise<void> {\n const cm = new ConfigManager(process.cwd());\n await cm.load();\n const config = cm.getConfig();\n\n if (action === 'status') {\n const state = config.telemetry?.enabled ? 'ON' : 'OFF';\n console.log();\n console.log(chalk.magenta(' ◈ Cascade Telemetry'));\n console.log();\n console.log(` Status: ${config.telemetry?.enabled ? chalk.green(state) : chalk.gray(state)}`);\n console.log(chalk.gray(' Scope: anonymous session metadata only (no prompts/outputs)'));\n console.log();\n console.log(chalk.gray(' Toggle with: cascade telemetry on | cascade telemetry off'));\n console.log();\n return;\n }\n\n const enabled = action === 'on';\n await cm.updateConfig({\n ...config,\n telemetry: {\n ...config.telemetry,\n enabled,\n },\n });\n\n console.log();\n if (enabled) {\n console.log(chalk.green(` ✓ Telemetry enabled.`));\n console.log(chalk.gray(' Anonymous session metadata (no prompts, no outputs) will be sent.'));\n } else {\n console.log(chalk.yellow(` ✓ Telemetry disabled.`));\n console.log(chalk.gray(' No events will be transmitted from this workspace.'));\n }\n console.log();\n}\n"]}
|