@gemdoq/codi 0.1.2 → 0.1.4

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/ui/renderer.ts","../src/tools/tool.ts","../src/tools/task-tools.ts","../src/cli.ts","../src/setup-wizard.ts","../src/config/config.ts","../src/repl.ts","../src/ui/keybindings.ts","../src/ui/status-line.ts","../src/ui/completer.ts","../src/agent/agent-loop.ts","../src/agent/conversation.ts","../src/tools/executor.ts","../src/agent/token-tracker.ts","../src/llm/types.ts","../src/ui/spinner.ts","../src/agent/system-prompt.ts","../src/agent/context-compressor.ts","../src/agent/memory.ts","../src/agent/session.ts","../src/agent/checkpoint.ts","../src/agent/codi-md.ts","../src/agent/mode-manager.ts","../src/tools/registry.ts","../src/security/permission-manager.ts","../src/config/permissions.ts","../src/hooks/hook-manager.ts","../src/mcp/mcp-manager.ts","../src/agent/sub-agent.ts","../src/tools/sub-agent-tool.ts","../src/config/slash-commands.ts","../src/tools/file-read.ts","../src/tools/file-write.ts","../src/tools/file-edit.ts","../src/tools/file-multi-edit.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/bash.ts","../src/tools/list-dir.ts","../src/tools/git.ts","../src/tools/web-fetch.ts","../src/tools/web-search.ts","../src/tools/notebook-edit.ts","../src/tools/ask-user.ts","../src/llm/anthropic.ts","../src/llm/openai.ts","../src/llm/ollama.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import chalk from 'chalk';\nimport { marked } from 'marked';\nimport TerminalRenderer from 'marked-terminal';\nimport { highlight } from 'cli-highlight';\nimport { createTwoFilesPatch } from 'diff';\n\n// marked-terminal exports a constructor that creates a marked renderer\nconst renderer = new (TerminalRenderer as any)({\n codespan: chalk.cyan,\n strong: chalk.bold,\n em: chalk.italic,\n heading: chalk.green.bold,\n firstHeading: chalk.magenta.underline.bold,\n code: chalk.yellow,\n link: chalk.blue,\n href: chalk.blue.underline,\n unescape: true,\n emoji: false,\n width: process.stdout.columns || 100,\n tab: 2,\n});\n\nmarked.setOptions({ renderer });\n\nexport function renderMarkdown(text: string): string {\n try {\n const rendered = marked.parse(text);\n return (typeof rendered === 'string' ? rendered : '').trimEnd();\n } catch {\n return text;\n }\n}\n\nexport function renderDiff(filePath: string, oldContent: string, newContent: string): string {\n // If all three params are strings and oldContent/newContent look like a diff, render directly\n if (!filePath && !oldContent && newContent) {\n return colorDiffLines(newContent);\n }\n\n const patch = createTwoFilesPatch(\n `a/${filePath}`,\n `b/${filePath}`,\n oldContent,\n newContent,\n '',\n '',\n { context: 3 }\n );\n\n return colorDiffLines(patch);\n}\n\nfunction colorDiffLines(text: string): string {\n return text\n .split('\\n')\n .map((line) => {\n if (line.startsWith('+++') || line.startsWith('---')) {\n return chalk.bold(line);\n }\n if (line.startsWith('+')) {\n return chalk.green(line);\n }\n if (line.startsWith('-')) {\n return chalk.red(line);\n }\n if (line.startsWith('@@')) {\n return chalk.cyan(line);\n }\n return chalk.dim(line);\n })\n .join('\\n');\n}\n\nexport function renderCodeBlock(code: string, language?: string): string {\n try {\n return highlight(code, { language, ignoreIllegals: true });\n } catch {\n return chalk.cyan(code);\n }\n}\n\nexport function renderToolCall(toolName: string, args: Record<string, unknown>): string {\n const header = chalk.yellow(`⚡ ${toolName}`);\n const argStr = Object.entries(args)\n .map(([k, v]) => {\n const val = typeof v === 'string' && v.length > 100 ? v.slice(0, 100) + '...' : String(v);\n return chalk.dim(` ${k}: `) + val;\n })\n .join('\\n');\n return `${header}\\n${argStr}`;\n}\n\nexport function renderToolResult(toolName: string, result: string, isError: boolean): string {\n const icon = isError ? chalk.red('✗') : chalk.green('✓');\n const header = `${icon} ${chalk.yellow(toolName)}`;\n const content = isError ? chalk.red(result) : chalk.dim(result);\n const maxLen = 500;\n const truncated = content.length > maxLen ? content.slice(0, maxLen) + chalk.dim('\\n... (truncated)') : content;\n return `${header}\\n${truncated}`;\n}\n\nexport function renderError(message: string): string {\n return chalk.red(`✗ ${message}`);\n}\n\nexport function renderWarning(message: string): string {\n return chalk.yellow(`⚠ ${message}`);\n}\n\nexport function renderInfo(message: string): string {\n return chalk.blue(`ℹ ${message}`);\n}\n\nexport function renderSuccess(message: string): string {\n return chalk.green(`✓ ${message}`);\n}\n\nexport function renderUserMessage(message: string): string {\n return chalk.white(message);\n}\n\nexport function renderAssistantPrefix(): string {\n return chalk.green.bold('codi');\n}\n\nexport function renderPrompt(): string {\n return chalk.cyan.bold('codi > ');\n}\n","export interface ToolResult {\n success: boolean;\n output: string;\n error?: string;\n metadata?: {\n filePath?: string;\n linesChanged?: number;\n tokensUsed?: number;\n isImage?: boolean;\n imageData?: string;\n imageMimeType?: string;\n };\n}\n\nexport interface Tool {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n dangerous: boolean;\n readOnly: boolean;\n execute(input: Record<string, unknown>): Promise<ToolResult>;\n}\n\nexport function makeToolResult(output: string, metadata?: ToolResult['metadata']): ToolResult {\n return { success: true, output, metadata };\n}\n\nexport function makeToolError(error: string, metadata?: ToolResult['metadata']): ToolResult {\n return { success: false, output: error, error, metadata };\n}\n","import type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport interface Task {\n id: string;\n subject: string;\n description: string;\n activeForm?: string;\n status: 'pending' | 'in_progress' | 'completed' | 'deleted';\n owner?: string;\n blocks: string[];\n blockedBy: string[];\n metadata: Record<string, unknown>;\n createdAt: number;\n updatedAt: number;\n}\n\nclass TaskManager {\n private tasks: Map<string, Task> = new Map();\n private nextId = 1;\n\n create(subject: string, description: string, activeForm?: string): Task {\n const id = String(this.nextId++);\n const task: Task = {\n id,\n subject,\n description,\n activeForm,\n status: 'pending',\n blocks: [],\n blockedBy: [],\n metadata: {},\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n this.tasks.set(id, task);\n return task;\n }\n\n get(id: string): Task | undefined {\n return this.tasks.get(id);\n }\n\n update(id: string, updates: Partial<Task> & {\n addBlocks?: string[];\n addBlockedBy?: string[];\n }): Task | undefined {\n const task = this.tasks.get(id);\n if (!task) return undefined;\n\n if (updates.status) task.status = updates.status;\n if (updates.subject) task.subject = updates.subject;\n if (updates.description) task.description = updates.description;\n if (updates.activeForm) task.activeForm = updates.activeForm;\n if (updates.owner) task.owner = updates.owner;\n if (updates.metadata) Object.assign(task.metadata, updates.metadata);\n\n if (updates.addBlocks) {\n task.blocks = [...new Set([...task.blocks, ...updates.addBlocks])];\n }\n if (updates.addBlockedBy) {\n task.blockedBy = [...new Set([...task.blockedBy, ...updates.addBlockedBy])];\n }\n\n if (updates.status === 'deleted') {\n this.tasks.delete(id);\n }\n\n task.updatedAt = Date.now();\n return task;\n }\n\n list(): Task[] {\n return [...this.tasks.values()].filter((t) => t.status !== 'deleted');\n }\n}\n\nexport const taskManager = new TaskManager();\n\nfunction formatTask(task: Task): string {\n const lines = [\n `#${task.id} [${task.status}] ${task.subject}`,\n ];\n if (task.description) lines.push(` ${task.description}`);\n if (task.owner) lines.push(` Owner: ${task.owner}`);\n if (task.blocks.length) lines.push(` Blocks: ${task.blocks.join(', ')}`);\n if (task.blockedBy.length) lines.push(` Blocked by: ${task.blockedBy.join(', ')}`);\n return lines.join('\\n');\n}\n\nexport const taskCreateTool: Tool = {\n name: 'task_create',\n description: `Create a new task to track work.`,\n inputSchema: {\n type: 'object',\n properties: {\n subject: { type: 'string', description: 'Brief task title' },\n description: { type: 'string', description: 'Detailed description' },\n activeForm: { type: 'string', description: 'Present continuous form (e.g., \"Running tests\")' },\n },\n required: ['subject', 'description'],\n },\n dangerous: false,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const task = taskManager.create(\n String(input['subject']),\n String(input['description']),\n input['activeForm'] ? String(input['activeForm']) : undefined\n );\n return makeToolResult(`Task #${task.id} created: ${task.subject}`);\n },\n};\n\nexport const taskUpdateTool: Tool = {\n name: 'task_update',\n description: `Update a task's status, description, or dependencies.`,\n inputSchema: {\n type: 'object',\n properties: {\n taskId: { type: 'string', description: 'Task ID' },\n status: { type: 'string', enum: ['pending', 'in_progress', 'completed', 'deleted'] },\n subject: { type: 'string' },\n description: { type: 'string' },\n activeForm: { type: 'string' },\n owner: { type: 'string' },\n addBlocks: { type: 'array', items: { type: 'string' } },\n addBlockedBy: { type: 'array', items: { type: 'string' } },\n },\n required: ['taskId'],\n },\n dangerous: false,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const task = taskManager.update(String(input['taskId']), input as any);\n if (!task) return makeToolError(`Task not found: ${input['taskId']}`);\n return makeToolResult(`Task #${task.id} updated: ${formatTask(task)}`);\n },\n};\n\nexport const taskListTool: Tool = {\n name: 'task_list',\n description: `List all tasks with their status.`,\n inputSchema: {\n type: 'object',\n properties: {},\n required: [],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(): Promise<ToolResult> {\n const tasks = taskManager.list();\n if (tasks.length === 0) {\n return makeToolResult('No tasks.');\n }\n return makeToolResult(tasks.map(formatTask).join('\\n\\n'));\n },\n};\n\nexport const taskGetTool: Tool = {\n name: 'task_get',\n description: `Get full details of a specific task.`,\n inputSchema: {\n type: 'object',\n properties: {\n taskId: { type: 'string', description: 'Task ID' },\n },\n required: ['taskId'],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const task = taskManager.get(String(input['taskId']));\n if (!task) return makeToolError(`Task not found: ${input['taskId']}`);\n return makeToolResult(formatTask(task));\n },\n};\n","#!/usr/bin/env node\n\nimport chalk from 'chalk';\nimport { needsSetup, runSetupWizard } from './setup-wizard.js';\nimport { configManager } from './config/config.js';\nimport { Repl } from './repl.js';\nimport { agentLoop } from './agent/agent-loop.js';\nimport { Conversation } from './agent/conversation.js';\nimport { buildSystemPrompt, type PromptContext } from './agent/system-prompt.js';\nimport { tokenTracker } from './agent/token-tracker.js';\nimport { statusLine } from './ui/status-line.js';\nimport { ContextCompressor } from './agent/context-compressor.js';\nimport { memoryManager } from './agent/memory.js';\nimport { sessionManager } from './agent/session.js';\nimport { checkpointManager } from './agent/checkpoint.js';\nimport { loadCodiMd } from './agent/codi-md.js';\nimport { setMode, getMode } from './agent/mode-manager.js';\nimport { ToolRegistry } from './tools/registry.js';\nimport { checkPermission, setPermissionMode } from './security/permission-manager.js';\nimport { hookManager } from './hooks/hook-manager.js';\nimport { mcpManager } from './mcp/mcp-manager.js';\nimport { createSubAgentHandler } from './agent/sub-agent.js';\nimport { setSubAgentHandler } from './tools/sub-agent-tool.js';\nimport { stopSpinner } from './ui/spinner.js';\nimport {\n createBuiltinCommands,\n loadCustomCommands,\n type SlashCommandContext,\n} from './config/slash-commands.js';\n\n// Import all tools\nimport { fileReadTool } from './tools/file-read.js';\nimport { fileWriteTool } from './tools/file-write.js';\nimport { fileEditTool } from './tools/file-edit.js';\nimport { fileMultiEditTool } from './tools/file-multi-edit.js';\nimport { globTool } from './tools/glob.js';\nimport { grepTool } from './tools/grep.js';\nimport { bashTool } from './tools/bash.js';\nimport { listDirTool } from './tools/list-dir.js';\nimport { gitTool } from './tools/git.js';\nimport { webFetchTool } from './tools/web-fetch.js';\nimport { webSearchTool } from './tools/web-search.js';\nimport { notebookEditTool } from './tools/notebook-edit.js';\nimport { subAgentTool } from './tools/sub-agent-tool.js';\nimport { taskCreateTool, taskUpdateTool, taskListTool, taskGetTool } from './tools/task-tools.js';\nimport { askUserTool } from './tools/ask-user.js';\n\n// Import providers\nimport { AnthropicProvider } from './llm/anthropic.js';\nimport { OpenAIProvider } from './llm/openai.js';\nimport { OllamaProvider } from './llm/ollama.js';\nimport type { LlmProvider } from './llm/provider.js';\n\n// ─── CLI Argument Parsing ────────────────────────────────────────────\n\ninterface CliArgs {\n model?: string;\n provider?: string;\n prompt?: string;\n continue?: boolean;\n resume?: string;\n help?: boolean;\n version?: boolean;\n plan?: boolean;\n yolo?: boolean;\n}\n\nfunction parseArgs(argv: string[]): CliArgs {\n const args: CliArgs = {};\n let i = 2; // Skip node and script path\n\n while (i < argv.length) {\n const arg = argv[i]!;\n switch (arg) {\n case '--model':\n case '-m':\n args.model = argv[++i];\n break;\n case '--provider':\n args.provider = argv[++i];\n break;\n case '-p':\n args.prompt = argv.slice(i + 1).join(' ');\n i = argv.length;\n break;\n case '-c':\n case '--continue':\n args.continue = true;\n break;\n case '-r':\n case '--resume':\n args.resume = argv[++i];\n break;\n case '--help':\n case '-h':\n args.help = true;\n break;\n case '--version':\n case '-v':\n args.version = true;\n break;\n case '--plan':\n args.plan = true;\n break;\n case '--yolo':\n args.yolo = true;\n break;\n default:\n // Treat as prompt if no flag\n if (!arg.startsWith('-')) {\n args.prompt = argv.slice(i).join(' ');\n i = argv.length;\n }\n break;\n }\n i++;\n }\n\n return args;\n}\n\nfunction printHelp(): void {\n console.log(`\n${chalk.cyan.bold('Codi (코디)')} - AI Code Agent for Terminal\n\n${chalk.bold('Usage:')}\n codi [options] [prompt]\n\n${chalk.bold('Options:')}\n -m, --model <model> Set the model (default: gemini-2.5-flash)\n --provider <name> Set the provider (openai, anthropic, ollama)\n -p <prompt> Run a single prompt and exit\n -c, --continue Continue the last session\n -r, --resume <id> Resume a specific session\n --plan Start in plan mode (read-only)\n --yolo Skip all permission checks\n -h, --help Show this help\n -v, --version Show version\n\n${chalk.bold('Environment:')}\n GEMINI_API_KEY Google Gemini API key (default provider)\n OPENAI_API_KEY OpenAI API key\n ANTHROPIC_API_KEY Anthropic API key\n\n${chalk.bold('Examples:')}\n codi # Start interactive session\n codi -p \"explain main.ts\" # Single prompt\n codi --provider anthropic # Use Anthropic Claude\n codi --model gpt-4o --provider openai # Use OpenAI GPT-4o\n codi -c # Continue last session\n`);\n}\n\n// ─── Main ────────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv);\n\n if (args.help) {\n printHelp();\n process.exit(0);\n }\n\n if (args.version) {\n console.log('codi v0.1.0');\n process.exit(0);\n }\n\n // First-time setup wizard\n if (await needsSetup()) {\n const result = await runSetupWizard();\n if (result) {\n // Reload config after setup\n configManager.reload();\n }\n }\n\n // Load config\n const config = configManager.get();\n const providerName = args.provider || config.provider;\n const modelName = args.model || config.model;\n\n // Create LLM provider\n let provider: LlmProvider;\n switch (providerName) {\n case 'anthropic':\n provider = new AnthropicProvider({\n apiKey: config.apiKeys.anthropic,\n model: modelName,\n maxTokens: config.maxTokens,\n baseUrl: config.baseUrls.anthropic,\n });\n break;\n case 'ollama':\n provider = new OllamaProvider({\n model: modelName,\n maxTokens: config.maxTokens,\n baseUrl: config.baseUrls.ollama,\n });\n break;\n case 'openai':\n default:\n provider = new OpenAIProvider({\n apiKey: config.apiKeys.openai || process.env['GEMINI_API_KEY'],\n model: modelName,\n maxTokens: config.maxTokens,\n baseUrl: config.baseUrls.openai,\n });\n break;\n }\n\n // Setup token tracker\n tokenTracker.setModel(modelName);\n statusLine.update({ model: modelName, provider: providerName });\n\n // Setup tool registry\n const registry = new ToolRegistry();\n registry.registerAll([\n fileReadTool,\n fileWriteTool,\n fileEditTool,\n fileMultiEditTool,\n globTool,\n grepTool,\n bashTool,\n listDirTool,\n gitTool,\n webFetchTool,\n webSearchTool,\n notebookEditTool,\n subAgentTool,\n taskCreateTool,\n taskUpdateTool,\n taskListTool,\n taskGetTool,\n askUserTool,\n ]);\n\n // Setup sub-agent handler\n const subAgentHandler = createSubAgentHandler(provider, registry);\n setSubAgentHandler(subAgentHandler);\n\n // Initialize MCP\n try {\n await mcpManager.initialize(registry);\n } catch {\n // MCP initialization failure is non-fatal\n }\n\n // Setup conversation\n const conversation = new Conversation();\n const compressor = new ContextCompressor({\n threshold: config.autoCompactThreshold,\n });\n\n // Load CODI.md and memory\n const codiMd = loadCodiMd();\n const memory = config.memoryEnabled ? memoryManager.buildMemoryPrompt() : '';\n\n function buildPrompt(): string {\n const context: PromptContext = {\n model: provider.model,\n provider: provider.name,\n cwd: process.cwd(),\n codiMd: codiMd || undefined,\n memory: memory || undefined,\n planMode: getMode() === 'plan',\n };\n return buildSystemPrompt(context);\n }\n\n conversation.setSystemPrompt(buildPrompt());\n\n // Set permission mode\n if (args.yolo) {\n setPermissionMode('yolo');\n } else if (args.plan) {\n setPermissionMode('plan');\n setMode('plan');\n statusLine.update({ mode: 'plan' });\n }\n\n // Resume session if requested\n if (args.continue || args.resume) {\n const id = args.resume || sessionManager.getLatest()?.id;\n if (id) {\n const session = sessionManager.load(id);\n if (session) {\n const data = session.conversation.serialize();\n for (const msg of data.messages) {\n if (msg.role === 'user') conversation.addUserMessage(msg.content);\n else if (msg.role === 'assistant') conversation.addAssistantMessage(msg.content);\n }\n console.log(chalk.dim(`Resumed session: ${id}`));\n }\n }\n }\n\n // Run hooks - session start\n await hookManager.runHooks('SessionStart', { cwd: process.cwd() });\n\n // Single prompt mode\n if (args.prompt) {\n await agentLoop(args.prompt, {\n provider,\n conversation,\n registry,\n systemPrompt: conversation.getSystemPrompt(),\n permissionCheck: checkPermission,\n preHook: async (toolName, input) => hookManager.runHooks('PreToolUse', { tool: toolName, args: input }),\n postHook: async (toolName, input, result) => { await hookManager.runHooks('PostToolUse', { tool: toolName, args: input, result }); },\n planMode: getMode() === 'plan',\n });\n await hookManager.runHooks('SessionEnd', {});\n await mcpManager.disconnectAll();\n process.exit(0);\n }\n\n // Interactive REPL mode\n const slashCommands = [...createBuiltinCommands(), ...loadCustomCommands()];\n\n const cmdCtx: SlashCommandContext = {\n conversation,\n provider,\n compressor,\n exitFn: async () => {\n stopSpinner();\n console.log(chalk.dim('\\nSaving session...'));\n sessionManager.save(conversation, undefined, provider.model);\n await hookManager.runHooks('SessionEnd', {});\n await mcpManager.disconnectAll();\n },\n setProvider: (name: string, model: string) => {\n const newProvider = name || providerName;\n switch (newProvider) {\n case 'openai':\n provider = new OpenAIProvider({ model, maxTokens: config.maxTokens });\n break;\n case 'ollama':\n provider = new OllamaProvider({ model, maxTokens: config.maxTokens });\n break;\n default:\n provider = new AnthropicProvider({ model, maxTokens: config.maxTokens });\n break;\n }\n tokenTracker.setModel(model);\n statusLine.update({ model, provider: newProvider });\n },\n reloadSystemPrompt: () => {\n conversation.setSystemPrompt(buildPrompt());\n },\n };\n\n const repl = new Repl({\n onMessage: async (message: string) => {\n // Create checkpoint before each turn\n checkpointManager.create(conversation, message.slice(0, 50));\n\n // Auto-compact if needed\n if (compressor.shouldCompress(conversation)) {\n console.log(chalk.dim('Auto-compacting conversation...'));\n await compressor.compress(conversation, provider);\n conversation.setSystemPrompt(buildPrompt());\n }\n\n await agentLoop(message, {\n provider,\n conversation,\n registry,\n systemPrompt: conversation.getSystemPrompt(),\n permissionCheck: checkPermission,\n preHook: async (toolName, input) => hookManager.runHooks('PreToolUse', { tool: toolName, args: input }),\n postHook: async (toolName, input, result) => { await hookManager.runHooks('PostToolUse', { tool: toolName, args: input, result }); },\n planMode: getMode() === 'plan',\n });\n },\n\n onSlashCommand: async (command: string, args: string): Promise<boolean> => {\n // Find matching command\n const cmd = slashCommands.find(\n (c) => c.name === command || c.aliases?.includes(command)\n );\n if (!cmd) return false;\n return cmd.handler(args, cmdCtx);\n },\n\n onInterrupt: () => {\n stopSpinner();\n },\n\n onExit: async () => {\n stopSpinner();\n console.log(chalk.dim('\\nSaving session...'));\n sessionManager.save(conversation, undefined, provider.model);\n await hookManager.runHooks('SessionEnd', {});\n await mcpManager.disconnectAll();\n },\n });\n\n // SIGTERM (Docker, etc.)\n process.on('SIGTERM', async () => {\n stopSpinner();\n sessionManager.save(conversation, undefined, provider.model);\n await hookManager.runHooks('SessionEnd', {});\n await mcpManager.disconnectAll();\n process.exit(0);\n });\n\n await repl.start();\n}\n\nmain().catch((err) => {\n console.error(chalk.red(`Fatal error: ${err.message}`));\n console.error(err.stack);\n process.exit(1);\n});\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport * as readline from 'node:readline/promises';\nimport { stdin as input, stdout as output } from 'process';\n\nconst SETTINGS_DIR = path.join(\n process.env['HOME'] || process.env['USERPROFILE'] || '~',\n '.codi'\n);\nconst SETTINGS_PATH = path.join(SETTINGS_DIR, 'settings.json');\n\ninterface SetupResult {\n apiKey: string;\n provider: string;\n}\n\nexport async function needsSetup(): Promise<boolean> {\n // Check if any API key is available\n if (process.env['GEMINI_API_KEY']) return false;\n if (process.env['OPENAI_API_KEY']) return false;\n if (process.env['ANTHROPIC_API_KEY']) return false;\n\n // Check settings file\n if (fs.existsSync(SETTINGS_PATH)) {\n try {\n const content = fs.readFileSync(SETTINGS_PATH, 'utf-8');\n const settings = JSON.parse(content);\n if (settings.apiKeys?.openai || settings.apiKeys?.anthropic) {\n return false;\n }\n } catch {\n // Invalid settings file\n }\n }\n\n return true;\n}\n\nexport async function runSetupWizard(): Promise<SetupResult | null> {\n const rl = readline.createInterface({ input, output });\n\n console.log('');\n console.log(chalk.cyan.bold(' ╭─────────────────────────────────────╮'));\n console.log(chalk.cyan.bold(' │') + chalk.white.bold(' Codi (코디) - First Time Setup ') + chalk.cyan.bold('│'));\n console.log(chalk.cyan.bold(' ╰─────────────────────────────────────╯'));\n console.log('');\n console.log(chalk.dim(' API key not found. Let\\'s set one up!'));\n console.log('');\n\n // Provider selection\n console.log(chalk.bold(' Which AI provider would you like to use?'));\n console.log('');\n console.log(` ${chalk.cyan('1.')} Google Gemini ${chalk.green('(Free tier available)')}`);\n console.log(` ${chalk.cyan('2.')} OpenAI (GPT-4o, etc.)`);\n console.log(` ${chalk.cyan('3.')} Anthropic (Claude)`);\n console.log(` ${chalk.cyan('4.')} Ollama ${chalk.green('(Free, local)')}`);\n console.log('');\n\n const choice = await rl.question(chalk.cyan(' Choice [1]: '));\n const providerChoice = choice.trim() || '1';\n\n let provider = 'openai';\n let envVarName = 'GEMINI_API_KEY';\n let keyName = 'openai';\n let signupUrl = '';\n let model = 'gemini-2.5-flash';\n\n switch (providerChoice) {\n case '1':\n provider = 'openai';\n envVarName = 'GEMINI_API_KEY';\n keyName = 'openai';\n signupUrl = 'https://aistudio.google.com/apikey';\n model = 'gemini-2.5-flash';\n break;\n case '2':\n provider = 'openai';\n envVarName = 'OPENAI_API_KEY';\n keyName = 'openai';\n signupUrl = 'https://platform.openai.com/api-keys';\n model = 'gpt-4o';\n break;\n case '3':\n provider = 'anthropic';\n envVarName = 'ANTHROPIC_API_KEY';\n keyName = 'anthropic';\n signupUrl = 'https://console.anthropic.com/settings/keys';\n model = 'claude-sonnet-4-20250514';\n break;\n case '4':\n console.log('');\n console.log(chalk.green(' ✓ Ollama selected! No API key needed.'));\n console.log(chalk.dim(' Make sure Ollama is running: ollama serve'));\n console.log(chalk.dim(' And pull a model: ollama pull llama3.1'));\n console.log('');\n console.log(chalk.dim(' Start Codi with:'));\n console.log(chalk.cyan(' codi --provider ollama --model llama3.1'));\n console.log('');\n rl.close();\n return null;\n default:\n console.log(chalk.yellow(' Invalid choice. Using Gemini (default).'));\n break;\n }\n\n // API key input\n if (signupUrl) {\n console.log('');\n console.log(chalk.bold(' Get your API key:'));\n console.log(chalk.cyan(` → ${signupUrl}`));\n console.log('');\n }\n\n const apiKey = await rl.question(chalk.cyan(' Paste your API key: '));\n rl.close();\n\n if (!apiKey.trim()) {\n console.log(chalk.yellow('\\n No API key provided. Setup cancelled.'));\n console.log(chalk.dim(` You can set it later: export ${envVarName}=your-key\\n`));\n return null;\n }\n\n // Save method selection\n const rl2 = readline.createInterface({ input, output });\n console.log('');\n console.log(chalk.bold(' How would you like to save it?'));\n console.log('');\n console.log(` ${chalk.cyan('1.')} Save to ~/.codi/settings.json ${chalk.green('(Recommended)')}`);\n console.log(` ${chalk.cyan('2.')} Show export command (manual setup)`);\n console.log('');\n\n const saveChoice = await rl2.question(chalk.cyan(' Choice [1]: '));\n rl2.close();\n\n const trimmedKey = apiKey.trim();\n\n if (saveChoice.trim() === '2') {\n console.log('');\n console.log(chalk.bold(' Add this to your shell profile (~/.zshrc or ~/.bashrc):'));\n console.log('');\n console.log(chalk.cyan(` export ${envVarName}=${trimmedKey}`));\n console.log('');\n console.log(chalk.dim(' Then restart your terminal or run: source ~/.zshrc'));\n console.log('');\n return { apiKey: trimmedKey, provider };\n }\n\n // Save to settings file\n try {\n if (!fs.existsSync(SETTINGS_DIR)) {\n fs.mkdirSync(SETTINGS_DIR, { recursive: true });\n }\n\n let settings: Record<string, unknown> = {};\n if (fs.existsSync(SETTINGS_PATH)) {\n try {\n settings = JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf-8'));\n } catch {\n settings = {};\n }\n }\n\n if (!settings['apiKeys'] || typeof settings['apiKeys'] !== 'object') {\n settings['apiKeys'] = {};\n }\n (settings['apiKeys'] as Record<string, string>)[keyName] = trimmedKey;\n\n if (providerChoice === '2') {\n settings['provider'] = 'openai';\n settings['model'] = model;\n settings['baseUrls'] = {};\n } else if (providerChoice === '3') {\n settings['provider'] = 'anthropic';\n settings['model'] = model;\n }\n\n fs.writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2), 'utf-8');\n\n console.log('');\n console.log(chalk.green(' ✓ Settings saved to ~/.codi/settings.json'));\n console.log(chalk.dim(` Provider: ${provider} | Model: ${model}`));\n console.log('');\n } catch (err) {\n console.log(chalk.red(`\\n Failed to save settings: ${err}`));\n console.log(chalk.dim(` Set manually: export ${envVarName}=${trimmedKey}\\n`));\n }\n\n return { apiKey: trimmedKey, provider };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { ProviderName } from '../llm/provider.js';\n\nexport interface CodiConfig {\n provider: ProviderName;\n model: string;\n maxTokens: number;\n temperature?: number;\n apiKeys: {\n anthropic?: string;\n openai?: string;\n };\n baseUrls: {\n anthropic?: string;\n openai?: string;\n ollama?: string;\n };\n permissions: {\n allow: string[];\n deny: string[];\n ask: string[];\n };\n hooks: Record<string, HookConfig[]>;\n mcpServers: Record<string, McpServerConfig>;\n customCommands: string[];\n sandbox: boolean;\n autoCompactThreshold: number; // 0-1, fraction of context window\n memoryEnabled: boolean;\n}\n\nexport interface HookConfig {\n matcher: string;\n hooks: Array<{\n type: 'command' | 'prompt';\n command?: string;\n prompt?: string;\n timeout?: number;\n }>;\n}\n\nexport interface McpServerConfig {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nconst DEFAULT_CONFIG: CodiConfig = {\n provider: 'openai',\n model: 'gemini-2.5-flash',\n maxTokens: 8192,\n apiKeys: {},\n baseUrls: {\n openai: 'https://generativelanguage.googleapis.com/v1beta/openai',\n },\n permissions: {\n allow: ['read_file', 'glob', 'grep', 'list_dir', 'ask_user'],\n deny: [],\n ask: ['write_file', 'edit_file', 'multi_edit', 'bash', 'git', 'web_fetch', 'web_search', 'notebook_edit'],\n },\n hooks: {},\n mcpServers: {},\n customCommands: [],\n sandbox: false,\n autoCompactThreshold: 0.7,\n memoryEnabled: true,\n};\n\nexport class ConfigManager {\n private config: CodiConfig;\n private configPaths: string[] = [];\n\n constructor() {\n this.config = { ...DEFAULT_CONFIG };\n this.loadAll();\n }\n\n private loadAll(): void {\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n\n // User global config\n this.loadFile(path.join(home, '.codi', 'settings.json'));\n\n // Project config\n this.loadFile(path.join(process.cwd(), '.codi', 'settings.json'));\n\n // Project local config (gitignored)\n this.loadFile(path.join(process.cwd(), '.codi', 'settings.local.json'));\n\n // Environment variables override\n if (process.env['GEMINI_API_KEY']) {\n this.config.apiKeys.openai = process.env['GEMINI_API_KEY'];\n }\n if (process.env['ANTHROPIC_API_KEY']) {\n this.config.apiKeys.anthropic = process.env['ANTHROPIC_API_KEY'];\n }\n if (process.env['OPENAI_API_KEY']) {\n this.config.apiKeys.openai = process.env['OPENAI_API_KEY'];\n }\n if (process.env['CODI_MODEL']) {\n this.config.model = process.env['CODI_MODEL'];\n }\n if (process.env['CODI_PROVIDER']) {\n this.config.provider = process.env['CODI_PROVIDER'] as ProviderName;\n }\n }\n\n private loadFile(filePath: string): void {\n try {\n if (!fs.existsSync(filePath)) return;\n const content = fs.readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(content);\n this.configPaths.push(filePath);\n this.mergeConfig(parsed);\n } catch {\n // Skip invalid config files\n }\n }\n\n private mergeConfig(partial: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(partial)) {\n if (key === 'permissions' && typeof value === 'object' && value !== null) {\n const perms = value as Record<string, unknown>;\n if (Array.isArray(perms['allow'])) {\n this.config.permissions.allow = [\n ...new Set([...this.config.permissions.allow, ...perms['allow']]),\n ];\n }\n if (Array.isArray(perms['deny'])) {\n this.config.permissions.deny = [\n ...new Set([...this.config.permissions.deny, ...perms['deny']]),\n ];\n }\n if (Array.isArray(perms['ask'])) {\n this.config.permissions.ask = [\n ...new Set([...this.config.permissions.ask, ...perms['ask']]),\n ];\n }\n } else if (key === 'hooks' && typeof value === 'object' && value !== null) {\n Object.assign(this.config.hooks, value);\n } else if (key === 'mcpServers' && typeof value === 'object' && value !== null) {\n Object.assign(this.config.mcpServers, value);\n } else if (key === 'apiKeys' && typeof value === 'object' && value !== null) {\n Object.assign(this.config.apiKeys, value);\n } else if (key === 'baseUrls' && typeof value === 'object' && value !== null) {\n Object.assign(this.config.baseUrls, value);\n } else if (key in this.config) {\n (this.config as any)[key] = value;\n }\n }\n }\n\n get(): CodiConfig {\n return this.config;\n }\n\n reload(): void {\n this.config = { ...DEFAULT_CONFIG };\n this.configPaths = [];\n this.loadAll();\n }\n\n set(key: string, value: unknown): void {\n (this.config as any)[key] = value;\n }\n\n getConfigPaths(): string[] {\n return this.configPaths;\n }\n\n save(scope: 'user' | 'project' | 'local'): void {\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n let filePath: string;\n\n switch (scope) {\n case 'user':\n filePath = path.join(home, '.codi', 'settings.json');\n break;\n case 'project':\n filePath = path.join(process.cwd(), '.codi', 'settings.json');\n break;\n case 'local':\n filePath = path.join(process.cwd(), '.codi', 'settings.local.json');\n break;\n }\n\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.writeFileSync(filePath, JSON.stringify(this.config, null, 2), 'utf-8');\n }\n}\n\nexport const configManager = new ConfigManager();\n","import * as readline from 'node:readline/promises';\nimport { stdin as input, stdout as output } from 'process';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { edit } from 'external-editor';\nimport { KeyBindingManager } from './ui/keybindings.js';\nimport { renderPrompt, renderMarkdown, renderError, renderInfo } from './ui/renderer.js';\nimport { statusLine } from './ui/status-line.js';\nimport { completer } from './ui/completer.js';\n\nexport interface ReplOptions {\n onMessage: (message: string) => Promise<void>;\n onSlashCommand: (command: string, args: string) => Promise<boolean>;\n onInterrupt: () => void;\n onExit?: () => Promise<void>;\n}\n\nexport class Repl {\n private rl: readline.Interface | null = null;\n private keyBindings = new KeyBindingManager();\n private running = false;\n private multilineBuffer: string[] = [];\n private inMultiline = false;\n private pasteMode = false;\n private options: ReplOptions;\n private lastInterruptTime = 0;\n\n constructor(options: ReplOptions) {\n this.options = options;\n this.setupKeyBindings();\n }\n\n private setupKeyBindings(): void {\n this.keyBindings.register({\n key: 'l',\n ctrl: true,\n handler: () => {\n process.stdout.write('\\x1B[2J\\x1B[0f');\n },\n description: 'Clear screen',\n });\n }\n\n async start(): Promise<void> {\n this.running = true;\n\n this.rl = readline.createInterface({\n input,\n output,\n prompt: renderPrompt(),\n completer: (line: string) => completer(line),\n terminal: true,\n });\n\n // Setup bracket paste mode detection\n if (process.stdin.isTTY) {\n process.stdout.write('\\x1B[?2004h'); // Enable bracket paste\n }\n\n this.printWelcome();\n\n while (this.running) {\n try {\n const statusStr = statusLine.render();\n if (statusStr) {\n output.write(chalk.dim(statusStr) + '\\n');\n }\n\n this.rl.setPrompt(renderPrompt());\n this.rl.prompt();\n\n const line = await new Promise<string>((resolve, reject) => {\n const onLine = (data: string) => {\n cleanup();\n resolve(data);\n };\n const onClose = () => {\n cleanup();\n reject(new Error('closed'));\n };\n const onSigint = () => {\n cleanup();\n const now = Date.now();\n // Double Ctrl+C within 2 seconds → exit\n if (now - this.lastInterruptTime < 2000) {\n this.gracefulExit().catch(() => process.exit(1));\n return;\n }\n this.lastInterruptTime = now;\n this.options.onInterrupt();\n console.log(chalk.dim('\\n(Press Ctrl+C again to exit)'));\n resolve('');\n };\n const cleanup = () => {\n this.rl!.removeListener('line', onLine);\n this.rl!.removeListener('close', onClose);\n this.rl!.removeListener('SIGINT', onSigint);\n };\n this.rl!.on('line', onLine);\n this.rl!.on('close', onClose);\n this.rl!.on('SIGINT', onSigint);\n });\n\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // Multiline: line ending with \\\n if (trimmed.endsWith('\\\\')) {\n this.multilineBuffer.push(trimmed.slice(0, -1));\n this.inMultiline = true;\n this.rl.setPrompt(chalk.dim('... '));\n continue;\n }\n\n let fullInput: string;\n if (this.inMultiline) {\n this.multilineBuffer.push(trimmed);\n fullInput = this.multilineBuffer.join('\\n');\n this.multilineBuffer = [];\n this.inMultiline = false;\n } else {\n fullInput = trimmed;\n }\n\n await this.processInput(fullInput);\n } catch (err) {\n if (err instanceof Error && err.message === 'closed') {\n // Ctrl+D or readline closed\n await this.gracefulExit();\n return;\n }\n }\n }\n\n if (process.stdin.isTTY) {\n process.stdout.write('\\x1B[?2004l'); // Disable bracket paste\n }\n }\n\n private async processInput(input: string): Promise<void> {\n // Direct exit commands (without slash)\n const lower = input.toLowerCase();\n if (lower === 'exit' || lower === 'quit' || lower === 'q') {\n await this.gracefulExit();\n return;\n }\n\n // Slash commands\n if (input.startsWith('/')) {\n const spaceIdx = input.indexOf(' ');\n const command = spaceIdx === -1 ? input : input.slice(0, spaceIdx);\n const args = spaceIdx === -1 ? '' : input.slice(spaceIdx + 1).trim();\n const handled = await this.options.onSlashCommand(command, args);\n if (handled) return;\n console.log(renderError(`Unknown command: ${command}. Type /help for available commands.`));\n return;\n }\n\n // Bang prefix → direct bash execution\n if (input.startsWith('!')) {\n const cmd = input.slice(1).trim();\n if (!cmd) return;\n try {\n const result = execSync(cmd, {\n encoding: 'utf-8',\n stdio: ['inherit', 'pipe', 'pipe'],\n timeout: 30_000,\n });\n console.log(result);\n } catch (err: any) {\n if (err.stderr) console.error(chalk.red(err.stderr));\n else if (err.stdout) console.log(err.stdout);\n else console.error(renderError(String(err.message)));\n }\n return;\n }\n\n // @ prefix → file reference (prepend file content)\n let message = input;\n const atMatches = input.match(/@([\\w./-]+)/g);\n if (atMatches) {\n for (const match of atMatches) {\n const filePath = match.slice(1);\n try {\n const { readFileSync } = await import('fs');\n const content = readFileSync(filePath, 'utf-8');\n message = message.replace(match, `\\n[File: ${filePath}]\\n\\`\\`\\`\\n${content}\\n\\`\\`\\`\\n`);\n } catch {\n // Leave as-is if file doesn't exist\n }\n }\n }\n\n await this.options.onMessage(message);\n }\n\n openEditor(): string | null {\n try {\n const text = edit('', { postfix: '.md' });\n return text.trim() || null;\n } catch {\n return null;\n }\n }\n\n stop(): void {\n this.running = false;\n if (this.rl) {\n this.rl.close();\n this.rl = null;\n }\n }\n\n async gracefulExit(): Promise<void> {\n this.stop();\n if (this.options.onExit) {\n await this.options.onExit();\n }\n console.log(chalk.dim('\\nGoodbye!\\n'));\n process.exit(0);\n }\n\n private printWelcome(): void {\n console.log('');\n console.log(chalk.cyan.bold(' ╭─────────────────────────────╮'));\n console.log(chalk.cyan.bold(' │') + chalk.white.bold(' Codi (코디) v0.1.0 ') + chalk.cyan.bold('│'));\n console.log(chalk.cyan.bold(' │') + chalk.dim(' AI Code Agent for Terminal ') + chalk.cyan.bold('│'));\n console.log(chalk.cyan.bold(' ╰─────────────────────────────╯'));\n console.log('');\n console.log(chalk.dim(' Type /help for commands, Ctrl+D to quit'));\n console.log(chalk.dim(' Use \\\\ at end of line for multiline input'));\n console.log('');\n }\n}\n","import type { Key } from 'readline';\n\nexport interface KeyBinding {\n key: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n handler: () => void | Promise<void>;\n description: string;\n}\n\nexport class KeyBindingManager {\n private bindings: Map<string, KeyBinding> = new Map();\n\n register(binding: KeyBinding): void {\n const id = this.makeId(binding);\n this.bindings.set(id, binding);\n }\n\n private makeId(binding: Pick<KeyBinding, 'key' | 'ctrl' | 'meta' | 'shift'>): string {\n const parts: string[] = [];\n if (binding.ctrl) parts.push('ctrl');\n if (binding.meta) parts.push('meta');\n if (binding.shift) parts.push('shift');\n parts.push(binding.key);\n return parts.join('+');\n }\n\n async handle(str: string, key: Key): Promise<boolean> {\n const id = this.makeId({\n key: key.name ?? str,\n ctrl: key.ctrl,\n meta: key.meta,\n shift: key.shift,\n });\n\n const binding = this.bindings.get(id);\n if (binding) {\n await binding.handler();\n return true;\n }\n return false;\n }\n\n listBindings(): KeyBinding[] {\n return [...this.bindings.values()];\n }\n}\n","import chalk from 'chalk';\n\nexport interface StatusInfo {\n model: string;\n provider: string;\n inputTokens: number;\n outputTokens: number;\n cost: number;\n mode?: 'plan' | 'execute';\n}\n\nexport class StatusLine {\n private info: StatusInfo = {\n model: '',\n provider: '',\n inputTokens: 0,\n outputTokens: 0,\n cost: 0,\n };\n private enabled: boolean = true;\n\n update(partial: Partial<StatusInfo>): void {\n Object.assign(this.info, partial);\n }\n\n setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n render(): string {\n if (!this.enabled) return '';\n const { model, inputTokens, outputTokens, cost, mode } = this.info;\n\n const parts: string[] = [];\n if (model) parts.push(chalk.cyan(`[${model}]`));\n if (mode === 'plan') parts.push(chalk.yellow('[PLAN]'));\n parts.push(chalk.dim(`in:${this.formatTokens(inputTokens)}`));\n parts.push(chalk.dim(`out:${this.formatTokens(outputTokens)}`));\n if (cost > 0) parts.push(chalk.green(`$${cost.toFixed(4)}`));\n\n return parts.join(chalk.dim(' | '));\n }\n\n private formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return String(n);\n }\n\n getInfo(): StatusInfo {\n return { ...this.info };\n }\n}\n\nexport const statusLine = new StatusLine();\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nconst SLASH_COMMANDS = [\n '/help', '/quit', '/exit', '/clear', '/reset', '/new',\n '/model', '/compact', '/cost', '/config', '/permissions',\n '/diff', '/save', '/resume', '/continue', '/fork',\n '/plan', '/memory', '/init', '/export', '/tasks',\n '/status', '/context', '/rewind', '/mcp',\n];\n\nexport function completer(line: string): [string[], string] {\n // Slash command completion\n if (line.startsWith('/')) {\n const matches = SLASH_COMMANDS.filter((cmd) => cmd.startsWith(line));\n return [matches, line];\n }\n\n // File path completion (after @)\n if (line.includes('@')) {\n const atIndex = line.lastIndexOf('@');\n const partial = line.slice(atIndex + 1);\n const dir = path.dirname(partial) || '.';\n const base = path.basename(partial);\n\n try {\n const entries = fs.readdirSync(dir === '' ? '.' : dir);\n const matches = entries\n .filter((e) => e.startsWith(base))\n .map((e) => {\n const full = dir === '.' ? e : path.join(dir, e);\n try {\n return fs.statSync(full).isDirectory() ? full + '/' : full;\n } catch {\n return full;\n }\n })\n .map((p) => line.slice(0, atIndex + 1) + p);\n return [matches, line];\n } catch {\n return [[], line];\n }\n }\n\n return [[], line];\n}\n","import type { LlmProvider } from '../llm/provider.js';\nimport type { ContentBlock, ToolCall, LlmResponse } from '../llm/types.js';\nimport { Conversation } from './conversation.js';\nimport { ToolExecutor } from '../tools/executor.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport { tokenTracker } from './token-tracker.js';\nimport { statusLine } from '../ui/status-line.js';\nimport { startSpinner, stopSpinner, updateSpinner } from '../ui/spinner.js';\nimport { renderMarkdown, renderAssistantPrefix } from '../ui/renderer.js';\nimport chalk from 'chalk';\n\nexport interface AgentLoopOptions {\n provider: LlmProvider;\n conversation?: Conversation;\n registry: ToolRegistry;\n systemPrompt?: string;\n maxIterations?: number;\n stream?: boolean;\n showOutput?: boolean;\n onToken?: (text: string) => void;\n permissionCheck?: (tool: any, input: Record<string, unknown>) => Promise<boolean>;\n preHook?: (toolName: string, input: Record<string, unknown>) => Promise<{ proceed: boolean; updatedInput?: Record<string, unknown> }>;\n postHook?: (toolName: string, input: Record<string, unknown>, result: any) => Promise<void>;\n planMode?: boolean;\n}\n\nconst MAX_RETRIES = 3;\nconst RETRY_DELAYS = [1000, 2000, 4000];\n\nexport async function agentLoop(\n userMessage: string | ContentBlock[],\n options: AgentLoopOptions\n): Promise<string> {\n const {\n provider,\n registry,\n maxIterations = 25,\n stream = true,\n showOutput = true,\n } = options;\n\n const conversation = options.conversation ?? new Conversation();\n if (options.systemPrompt) {\n conversation.setSystemPrompt(options.systemPrompt);\n }\n\n const executor = new ToolExecutor(registry, {\n permissionCheck: options.permissionCheck,\n preHook: options.preHook,\n postHook: options.postHook,\n planMode: options.planMode,\n showToolCalls: showOutput,\n });\n\n // Add user message\n conversation.addUserMessage(userMessage);\n\n let iterations = 0;\n let finalText = '';\n\n while (iterations < maxIterations) {\n iterations++;\n\n // Call LLM\n let response: LlmResponse;\n const spinner = showOutput ? startSpinner('Thinking...') : null;\n\n try {\n response = await callLlmWithRetry(provider, conversation, registry, stream, options, showOutput);\n } catch (err) {\n stopSpinner();\n const errMsg = err instanceof Error ? err.message : String(err);\n if (showOutput) {\n console.error(chalk.red(`\\nLLM Error: ${errMsg}`));\n }\n return `Error communicating with LLM: ${errMsg}`;\n }\n\n stopSpinner();\n\n // Track tokens\n if (response.usage) {\n tokenTracker.track(response.usage);\n const stats = tokenTracker.getStats();\n statusLine.update({\n inputTokens: stats.inputTokens,\n outputTokens: stats.outputTokens,\n cost: stats.cost,\n });\n }\n\n // Add assistant message to conversation\n conversation.addAssistantMessage(response.content);\n\n // Collect text\n const wasStreamed = (response as any)._streamed === true;\n if (response.text) {\n finalText = response.text;\n }\n\n // Check stop reason\n if (response.stopReason === 'end_turn' || !response.toolCalls || response.toolCalls.length === 0) {\n // Only render if not already streamed to terminal\n if (showOutput && finalText && !wasStreamed) {\n console.log('');\n console.log(renderAssistantPrefix());\n console.log(renderMarkdown(finalText));\n console.log('');\n }\n if (wasStreamed && showOutput) {\n console.log('');\n }\n break;\n }\n\n if (response.stopReason === 'max_tokens') {\n if (showOutput) {\n console.log(chalk.yellow('\\n⚠ Response truncated (max tokens reached)'));\n }\n }\n\n // Execute tools\n if (response.toolCalls && response.toolCalls.length > 0) {\n if (showOutput) {\n console.log('');\n }\n\n const results = await executor.executeMany(response.toolCalls);\n\n // Add tool results to conversation\n const toolResults = results.map((r) => ({\n tool_use_id: r.toolUseId,\n content: r.result.output,\n is_error: !r.result.success,\n }));\n\n conversation.addToolResults(toolResults);\n }\n }\n\n if (iterations >= maxIterations) {\n if (showOutput) {\n console.log(chalk.yellow(`\\n⚠ Agent loop reached maximum iterations (${maxIterations})`));\n }\n }\n\n return finalText;\n}\n\nasync function callLlmWithRetry(\n provider: LlmProvider,\n conversation: Conversation,\n registry: ToolRegistry,\n stream: boolean,\n options: AgentLoopOptions,\n showOutput: boolean\n): Promise<LlmResponse> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n let streamedText = '';\n\n const response = await provider.chat({\n messages: conversation.getMessages(),\n systemPrompt: conversation.getSystemPrompt(),\n tools: registry.getToolDefinitions(options.planMode ? { readOnly: true } : undefined),\n stream,\n callbacks: stream\n ? {\n onToken: (text) => {\n stopSpinner();\n if (showOutput && !streamedText) {\n process.stdout.write('\\n' + renderAssistantPrefix() + '\\n');\n }\n streamedText += text;\n if (showOutput) {\n process.stdout.write(text);\n }\n options.onToken?.(text);\n },\n }\n : undefined,\n });\n\n // If we streamed text, add newline and mark as already displayed\n if (streamedText) {\n if (showOutput) {\n process.stdout.write('\\n');\n }\n // Text was already displayed during streaming — do not render again\n return { ...response, _streamed: true } as any;\n }\n\n return response;\n } catch (err: any) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n // Check if retryable\n const status = err.status || err.statusCode;\n if (status === 429 || (status >= 500 && status < 600)) {\n const delay = RETRY_DELAYS[attempt] || 4000;\n if (showOutput) {\n updateSpinner(`API error (${status}), retrying in ${delay / 1000}s...`);\n }\n await sleep(delay);\n continue;\n }\n\n // Non-retryable error\n throw lastError;\n }\n }\n\n throw lastError || new Error('Max retries exceeded');\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport { Conversation };\n","import type { Message, ContentBlock } from '../llm/types.js';\n\nexport class Conversation {\n private messages: Message[] = [];\n private systemPrompt: string = '';\n\n setSystemPrompt(prompt: string): void {\n this.systemPrompt = prompt;\n }\n\n getSystemPrompt(): string {\n return this.systemPrompt;\n }\n\n addUserMessage(content: string | ContentBlock[]): void {\n this.messages.push({ role: 'user', content });\n }\n\n addAssistantMessage(content: string | ContentBlock[]): void {\n this.messages.push({ role: 'assistant', content });\n }\n\n addToolResults(results: Array<{ tool_use_id: string; content: string; is_error?: boolean }>): void {\n const blocks: ContentBlock[] = results.map((r) => ({\n type: 'tool_result' as const,\n tool_use_id: r.tool_use_id,\n content: r.content,\n is_error: r.is_error,\n }));\n this.messages.push({ role: 'user', content: blocks });\n }\n\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n getLastMessage(): Message | undefined {\n return this.messages[this.messages.length - 1];\n }\n\n getMessageCount(): number {\n return this.messages.length;\n }\n\n clear(): void {\n this.messages = [];\n }\n\n /**\n * Replace old messages with a summary, keeping recent messages intact.\n */\n compact(summary: string, keepRecent: number = 4): void {\n if (this.messages.length <= keepRecent) return;\n\n const recent = this.messages.slice(-keepRecent);\n this.messages = [\n { role: 'user', content: `[Previous conversation summary]\\n${summary}` },\n { role: 'assistant', content: 'Understood. I have the context from our previous conversation.' },\n ...recent,\n ];\n }\n\n /**\n * Fork the conversation at the current point.\n */\n fork(): Conversation {\n const forked = new Conversation();\n forked.systemPrompt = this.systemPrompt;\n forked.messages = [...this.messages.map((m) => ({ ...m }))];\n return forked;\n }\n\n /**\n * Truncate to a specific number of messages from the end.\n */\n truncateTo(count: number): void {\n if (this.messages.length > count) {\n this.messages = this.messages.slice(-count);\n }\n }\n\n /**\n * Serialize for session saving.\n */\n serialize(): { systemPrompt: string; messages: Message[] } {\n return {\n systemPrompt: this.systemPrompt,\n messages: this.messages,\n };\n }\n\n /**\n * Restore from serialized data.\n */\n static deserialize(data: { systemPrompt: string; messages: Message[] }): Conversation {\n const conv = new Conversation();\n conv.systemPrompt = data.systemPrompt;\n conv.messages = data.messages;\n return conv;\n }\n\n /**\n * Estimate rough token count (very approximate).\n */\n estimateTokens(): number {\n let chars = this.systemPrompt.length;\n for (const msg of this.messages) {\n if (typeof msg.content === 'string') {\n chars += msg.content.length;\n } else {\n for (const block of msg.content) {\n if (block.type === 'text') chars += block.text.length;\n else if (block.type === 'tool_use') chars += JSON.stringify(block.input).length;\n else if (block.type === 'tool_result') {\n chars += typeof block.content === 'string' ? block.content.length : JSON.stringify(block.content).length;\n }\n }\n }\n }\n // Rough estimate: ~4 chars per token\n return Math.ceil(chars / 4);\n }\n}\n","import type { Tool, ToolResult } from './tool.js';\nimport type { ToolRegistry } from './registry.js';\nimport type { ToolCall } from '../llm/types.js';\nimport { makeToolError } from './tool.js';\nimport { renderToolCall, renderToolResult } from '../ui/renderer.js';\nimport chalk from 'chalk';\n\nexport interface ExecutorOptions {\n permissionCheck?: (tool: Tool, input: Record<string, unknown>) => Promise<boolean>;\n preHook?: (toolName: string, input: Record<string, unknown>) => Promise<{ proceed: boolean; updatedInput?: Record<string, unknown> }>;\n postHook?: (toolName: string, input: Record<string, unknown>, result: ToolResult) => Promise<void>;\n planMode?: boolean;\n showToolCalls?: boolean;\n}\n\nexport interface ExecutionResult {\n toolUseId: string;\n toolName: string;\n result: ToolResult;\n}\n\nexport class ToolExecutor {\n constructor(\n private registry: ToolRegistry,\n private options: ExecutorOptions = {}\n ) {}\n\n async executeOne(toolCall: ToolCall): Promise<ExecutionResult> {\n const tool = this.registry.get(toolCall.name);\n\n if (!tool) {\n return {\n toolUseId: toolCall.id,\n toolName: toolCall.name,\n result: makeToolError(`Unknown tool: ${toolCall.name}. Available tools: ${this.registry.listNames().join(', ')}`),\n };\n }\n\n // Plan mode check\n if (this.options.planMode && !tool.readOnly) {\n return {\n toolUseId: toolCall.id,\n toolName: toolCall.name,\n result: makeToolError(`Tool '${toolCall.name}' is not available in plan mode (read-only). Use only read-only tools.`),\n };\n }\n\n // Permission check\n if (tool.dangerous && this.options.permissionCheck) {\n const allowed = await this.options.permissionCheck(tool, toolCall.input);\n if (!allowed) {\n return {\n toolUseId: toolCall.id,\n toolName: toolCall.name,\n result: makeToolError(`Permission denied for tool: ${toolCall.name}`),\n };\n }\n }\n\n // Pre-hook\n let input = toolCall.input;\n if (this.options.preHook) {\n try {\n const hookResult = await this.options.preHook(toolCall.name, input);\n if (!hookResult.proceed) {\n return {\n toolUseId: toolCall.id,\n toolName: toolCall.name,\n result: makeToolError(`Tool execution blocked by hook for: ${toolCall.name}`),\n };\n }\n if (hookResult.updatedInput) {\n input = hookResult.updatedInput;\n }\n } catch (err) {\n // Hook errors don't block execution, just warn\n console.error(chalk.yellow(`Hook error for ${toolCall.name}: ${err}`));\n }\n }\n\n // Display tool call\n if (this.options.showToolCalls) {\n console.log(renderToolCall(toolCall.name, input));\n }\n\n // Execute\n let result: ToolResult;\n try {\n result = await tool.execute(input);\n } catch (err) {\n result = makeToolError(\n `Tool '${toolCall.name}' threw an error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n // Display result\n if (this.options.showToolCalls) {\n console.log(renderToolResult(toolCall.name, result.output, !result.success));\n }\n\n // Post-hook\n if (this.options.postHook) {\n try {\n await this.options.postHook(toolCall.name, input, result);\n } catch {\n // Post-hook errors are silently ignored\n }\n }\n\n return {\n toolUseId: toolCall.id,\n toolName: toolCall.name,\n result,\n };\n }\n\n async executeMany(toolCalls: ToolCall[]): Promise<ExecutionResult[]> {\n // Separate safe and dangerous tools\n const safeCalls: ToolCall[] = [];\n const dangerousCalls: ToolCall[] = [];\n\n for (const tc of toolCalls) {\n const tool = this.registry.get(tc.name);\n if (tool?.dangerous) {\n dangerousCalls.push(tc);\n } else {\n safeCalls.push(tc);\n }\n }\n\n // Execute safe tools in parallel\n const safePromises = safeCalls.map((tc) => this.executeOne(tc));\n\n // Execute dangerous tools sequentially\n const dangerousResults: ExecutionResult[] = [];\n for (const tc of dangerousCalls) {\n const result = await this.executeOne(tc);\n dangerousResults.push(result);\n }\n\n const safeResults = await Promise.allSettled(safePromises);\n\n const results: ExecutionResult[] = [];\n\n // Collect safe results\n for (let i = 0; i < safeResults.length; i++) {\n const r = safeResults[i]!;\n if (r.status === 'fulfilled') {\n results.push(r.value);\n } else {\n results.push({\n toolUseId: safeCalls[i]!.id,\n toolName: safeCalls[i]!.name,\n result: makeToolError(`Tool execution failed: ${r.reason}`),\n });\n }\n }\n\n results.push(...dangerousResults);\n\n // Sort by original order\n const orderMap = new Map(toolCalls.map((tc, i) => [tc.id, i]));\n results.sort((a, b) => (orderMap.get(a.toolUseId) ?? 0) - (orderMap.get(b.toolUseId) ?? 0));\n\n return results;\n }\n\n setOptions(options: Partial<ExecutorOptions>): void {\n Object.assign(this.options, options);\n }\n}\n","import type { LlmUsage } from '../llm/types.js';\nimport { getModelCost } from '../llm/types.js';\n\nexport interface TokenStats {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n cost: number;\n requests: number;\n}\n\nexport class TokenTracker {\n private inputTokens = 0;\n private outputTokens = 0;\n private requests = 0;\n private model = '';\n\n setModel(model: string): void {\n this.model = model;\n }\n\n track(usage: LlmUsage): void {\n this.inputTokens += usage.input_tokens;\n this.outputTokens += usage.output_tokens;\n this.requests++;\n }\n\n getStats(): TokenStats {\n const costs = getModelCost(this.model);\n const cost =\n (this.inputTokens / 1000) * costs.input + (this.outputTokens / 1000) * costs.output;\n\n return {\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n totalTokens: this.inputTokens + this.outputTokens,\n cost,\n requests: this.requests,\n };\n }\n\n getCost(): number {\n return this.getStats().cost;\n }\n\n reset(): void {\n this.inputTokens = 0;\n this.outputTokens = 0;\n this.requests = 0;\n }\n\n format(): string {\n const stats = this.getStats();\n const parts = [\n `Requests: ${stats.requests}`,\n `Input: ${this.formatTokens(stats.inputTokens)}`,\n `Output: ${this.formatTokens(stats.outputTokens)}`,\n `Total: ${this.formatTokens(stats.totalTokens)}`,\n ];\n if (stats.cost > 0) {\n parts.push(`Cost: $${stats.cost.toFixed(4)}`);\n }\n return parts.join(' | ');\n }\n\n private formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return String(n);\n }\n}\n\nexport const tokenTracker = new TokenTracker();\n","export type ContentBlock =\n | { type: 'text'; text: string }\n | { type: 'image'; source: { type: 'base64'; media_type: string; data: string } }\n | { type: 'tool_use'; id: string; name: string; input: Record<string, unknown> }\n | { type: 'tool_result'; tool_use_id: string; content: string | ContentBlock[]; is_error?: boolean };\n\nexport interface Message {\n role: 'user' | 'assistant' | 'system';\n content: string | ContentBlock[];\n}\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\nexport interface ToolCall {\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\nexport interface LlmUsage {\n input_tokens: number;\n output_tokens: number;\n}\n\nexport type StopReason = 'end_turn' | 'tool_use' | 'max_tokens';\n\nexport interface LlmResponse {\n content: ContentBlock[];\n text?: string;\n toolCalls?: ToolCall[];\n usage?: LlmUsage;\n stopReason?: StopReason;\n}\n\nexport interface StreamCallbacks {\n onToken?: (text: string) => void;\n onToolUse?: (toolCall: ToolCall) => void;\n}\n\nexport interface LlmRequestOptions {\n messages: Message[];\n systemPrompt?: string;\n tools?: ToolDefinition[];\n maxTokens?: number;\n temperature?: number;\n stream?: boolean;\n callbacks?: StreamCallbacks;\n}\n\n// Cost per 1K tokens for known models\nexport const MODEL_COSTS: Record<string, { input: number; output: number }> = {\n 'claude-sonnet-4-20250514': { input: 0.003, output: 0.015 },\n 'claude-opus-4-20250514': { input: 0.015, output: 0.075 },\n 'claude-haiku-3-5-20241022': { input: 0.0008, output: 0.004 },\n 'gpt-4o': { input: 0.0025, output: 0.01 },\n 'gpt-4o-mini': { input: 0.00015, output: 0.0006 },\n 'gpt-4.1': { input: 0.002, output: 0.008 },\n 'gpt-4.1-mini': { input: 0.0004, output: 0.0016 },\n 'gpt-4.1-nano': { input: 0.0001, output: 0.0004 },\n};\n\nexport function getModelCost(model: string): { input: number; output: number } {\n return MODEL_COSTS[model] ?? { input: 0, output: 0 };\n}\n","import ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\n\nlet currentSpinner: Ora | null = null;\n\nexport function startSpinner(text: string): Ora {\n stopSpinner();\n currentSpinner = ora({\n text: chalk.dim(text),\n spinner: 'dots',\n color: 'cyan',\n }).start();\n return currentSpinner;\n}\n\nexport function updateSpinner(text: string): void {\n if (currentSpinner) {\n currentSpinner.text = chalk.dim(text);\n }\n}\n\nexport function stopSpinner(symbol?: string): void {\n if (currentSpinner) {\n if (symbol) {\n currentSpinner.stopAndPersist({ symbol });\n } else {\n currentSpinner.stop();\n }\n currentSpinner = null;\n }\n}\n\nexport function succeedSpinner(text?: string): void {\n if (currentSpinner) {\n currentSpinner.succeed(text ? chalk.dim(text) : undefined);\n currentSpinner = null;\n }\n}\n\nexport function failSpinner(text?: string): void {\n if (currentSpinner) {\n currentSpinner.fail(text ? chalk.red(text) : undefined);\n currentSpinner = null;\n }\n}\n","import * as os from 'os';\nimport { execSync } from 'child_process';\n\nexport interface PromptContext {\n model: string;\n provider: string;\n cwd: string;\n codiMd?: string;\n memory?: string;\n gitStatus?: string;\n planMode?: boolean;\n}\n\nconst ROLE_DEFINITION = `You are Codi (코디), a terminal-based AI coding agent. You help users with software engineering tasks including writing code, debugging, refactoring, and explaining code. You have access to tools for file manipulation, code search, shell execution, and more.`;\n\nconst TOOL_HIERARCHY = `# Tool Usage Rules\n- Use read_file instead of bash cat/head/tail\n- Use edit_file instead of bash sed/awk\n- Use write_file instead of bash echo/cat heredoc\n- Use glob instead of bash find/ls for file search\n- Use grep instead of bash grep/rg for content search\n- Reserve bash for system commands that have no dedicated tool\n- Use sub_agent for complex multi-step exploration tasks\n- Call multiple tools in parallel when they are independent`;\n\nconst CODE_RULES = `# Code Modification Rules\n- ALWAYS read a file before editing it\n- Prefer edit_file over write_file for existing files\n- Make only the changes that are directly requested\n- Do NOT add unnecessary docstrings, comments, type annotations, or error handling\n- Do NOT over-engineer or add features beyond what was asked\n- Be careful about security vulnerabilities (XSS, SQL injection, command injection)\n- Avoid backwards-compatibility hacks for removed code`;\n\nconst GIT_SAFETY = `# Git Safety\n- NEVER amend existing commits - create new commits\n- NEVER force push\n- NEVER skip hooks (--no-verify)\n- NEVER use interactive mode (-i)\n- NEVER use destructive operations (reset --hard, clean -f, checkout .) without explicit user request\n- Always create new commits rather than amending\n- Stage specific files instead of using 'git add -A'\n- Only commit when explicitly asked`;\n\nconst RESPONSE_STYLE = `# Response Style\n- Keep responses short and concise\n- Reference code with file_path:line_number format\n- Do NOT use emojis unless the user requests them\n- Do NOT create documentation files unless requested\n- Do NOT give time estimates\n- If blocked, try alternative approaches rather than retrying the same thing`;\n\nconst SAFETY_RULES = `# Safety & Caution\n- For irreversible or destructive operations, confirm with the user first\n- Do NOT brute-force solutions - if something fails, try a different approach\n- Be careful with operations that affect shared state (push, PR creation, etc.)\n- Investigate unexpected state before deleting or overwriting\n- Measure twice, cut once`;\n\nexport function buildSystemPrompt(context: PromptContext): string {\n const fragments: string[] = [];\n\n // Role definition\n fragments.push(ROLE_DEFINITION);\n\n // Environment info\n fragments.push(buildEnvironmentInfo(context));\n\n // Tool usage rules\n fragments.push(TOOL_HIERARCHY);\n\n // Code modification rules\n fragments.push(CODE_RULES);\n\n // Git safety\n fragments.push(GIT_SAFETY);\n\n // Response style\n fragments.push(RESPONSE_STYLE);\n\n // Safety rules\n fragments.push(SAFETY_RULES);\n\n // Plan mode\n if (context.planMode) {\n fragments.push(`# Plan Mode\nYou are in PLAN MODE (read-only). You can only use read-only tools (read_file, glob, grep, list_dir, ask_user).\nYou CANNOT modify files, run commands, or make any changes.\nAnalyze the codebase and create a detailed plan for the user to approve.`);\n }\n\n // CODI.md project context\n if (context.codiMd) {\n fragments.push(`# Project Instructions (CODI.md)\\n${context.codiMd}`);\n }\n\n // Auto memory\n if (context.memory) {\n fragments.push(`# Auto Memory\\n${context.memory}`);\n }\n\n // Git status\n if (context.gitStatus) {\n fragments.push(`# Current Git Status\\n${context.gitStatus}`);\n }\n\n return fragments.join('\\n\\n---\\n\\n');\n}\n\nfunction buildEnvironmentInfo(context: PromptContext): string {\n const lines = [\n '# Environment',\n `- Date: ${new Date().toISOString().split('T')[0]}`,\n `- OS: ${os.platform()} ${os.release()}`,\n `- Shell: ${process.env['SHELL'] || 'unknown'}`,\n `- Working Directory: ${context.cwd}`,\n `- Model: ${context.model}`,\n `- Provider: ${context.provider}`,\n ];\n\n // Check if git repo\n try {\n execSync('git rev-parse --is-inside-work-tree', { cwd: context.cwd, stdio: 'pipe' });\n const branch = execSync('git branch --show-current', { cwd: context.cwd, encoding: 'utf-8' }).trim();\n lines.push(`- Git Branch: ${branch}`);\n lines.push(`- Is Git Repo: true`);\n } catch {\n lines.push(`- Is Git Repo: false`);\n }\n\n return lines.join('\\n');\n}\n\n// Sub-agent system prompts\nexport const EXPLORE_SYSTEM_PROMPT = `You are an Explore agent - a fast, read-only agent specialized for codebase exploration. Your job is to quickly find files, search code, and answer questions about the codebase. You have access to: read_file, glob, grep, list_dir. Be thorough but efficient. Return your findings concisely.`;\n\nexport const PLAN_SYSTEM_PROMPT = `You are a Plan agent - a software architect agent for designing implementation plans. Analyze the codebase, identify critical files, consider trade-offs, and return a step-by-step implementation plan. You have access to: read_file, glob, grep, list_dir, web_fetch. Be thorough in your analysis.`;\n\nexport const GENERAL_SYSTEM_PROMPT = `You are a General sub-agent handling a specific task autonomously. Complete the task fully and return a concise summary of what you did. You have access to all tools except creating more sub-agents.`;\n","import type { LlmProvider } from '../llm/provider.js';\nimport type { Conversation } from './conversation.js';\n\nexport interface CompressorOptions {\n threshold: number; // 0-1, fraction of context window to trigger\n maxContextTokens: number; // Model's context window size\n keepRecentMessages: number; // Number of recent messages to preserve\n}\n\nconst DEFAULT_OPTIONS: CompressorOptions = {\n threshold: 0.7,\n maxContextTokens: 200_000,\n keepRecentMessages: 6,\n};\n\nexport class ContextCompressor {\n private options: CompressorOptions;\n\n constructor(options?: Partial<CompressorOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n shouldCompress(conversation: Conversation): boolean {\n const estimatedTokens = conversation.estimateTokens();\n return estimatedTokens > this.options.maxContextTokens * this.options.threshold;\n }\n\n async compress(\n conversation: Conversation,\n provider: LlmProvider,\n focusHint?: string\n ): Promise<void> {\n const messages = conversation.getMessages();\n if (messages.length <= this.options.keepRecentMessages) return;\n\n // Get messages to summarize (everything except recent)\n const toSummarize = messages.slice(0, -this.options.keepRecentMessages);\n\n // Build summary prompt\n const summaryContent = toSummarize\n .map((m) => {\n const role = m.role;\n const content = typeof m.content === 'string'\n ? m.content\n : m.content\n .map((b) => {\n if (b.type === 'text') return b.text;\n if (b.type === 'tool_use') return `[Tool: ${b.name}]`;\n if (b.type === 'tool_result') return `[Result: ${typeof b.content === 'string' ? b.content.slice(0, 200) : '...'}]`;\n return '';\n })\n .filter(Boolean)\n .join('\\n');\n return `${role}: ${content}`;\n })\n .join('\\n\\n');\n\n const prompt = focusHint\n ? `Summarize this conversation concisely, focusing on: ${focusHint}\\n\\n${summaryContent}`\n : `Summarize this conversation concisely, preserving key decisions, code changes, file paths, and important context:\\n\\n${summaryContent}`;\n\n try {\n const response = await provider.chat({\n messages: [{ role: 'user', content: prompt }],\n systemPrompt: 'You are a conversation summarizer. Create a concise but complete summary that preserves all important technical details, file paths, decisions made, and context needed to continue the conversation.',\n maxTokens: 2000,\n });\n\n const summary = response.text || 'Previous conversation context.';\n conversation.compact(summary, this.options.keepRecentMessages);\n } catch {\n // If summarization fails, just truncate\n conversation.truncateTo(this.options.keepRecentMessages + 2);\n }\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\n\nexport class MemoryManager {\n private memoryDir: string;\n\n constructor() {\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n const projectHash = crypto.createHash('md5').update(process.cwd()).digest('hex').slice(0, 8);\n const projectName = path.basename(process.cwd());\n this.memoryDir = path.join(home, '.codi', 'projects', `${projectName}-${projectHash}`, 'memory');\n }\n\n ensureDir(): void {\n if (!fs.existsSync(this.memoryDir)) {\n fs.mkdirSync(this.memoryDir, { recursive: true });\n }\n }\n\n getMemoryDir(): string {\n return this.memoryDir;\n }\n\n loadIndex(): string {\n const indexPath = path.join(this.memoryDir, 'MEMORY.md');\n if (!fs.existsSync(indexPath)) return '';\n\n const content = fs.readFileSync(indexPath, 'utf-8');\n // Only load first 200 lines\n const lines = content.split('\\n');\n return lines.slice(0, 200).join('\\n');\n }\n\n saveIndex(content: string): void {\n this.ensureDir();\n const indexPath = path.join(this.memoryDir, 'MEMORY.md');\n fs.writeFileSync(indexPath, content, 'utf-8');\n }\n\n loadTopic(name: string): string | null {\n const topicPath = path.join(this.memoryDir, `${name}.md`);\n if (!fs.existsSync(topicPath)) return null;\n return fs.readFileSync(topicPath, 'utf-8');\n }\n\n saveTopic(name: string, content: string): void {\n this.ensureDir();\n const topicPath = path.join(this.memoryDir, `${name}.md`);\n fs.writeFileSync(topicPath, content, 'utf-8');\n }\n\n listTopics(): string[] {\n if (!fs.existsSync(this.memoryDir)) return [];\n return fs\n .readdirSync(this.memoryDir)\n .filter((f) => f.endsWith('.md') && f !== 'MEMORY.md')\n .map((f) => f.replace('.md', ''));\n }\n\n buildMemoryPrompt(): string {\n const index = this.loadIndex();\n if (!index) return '';\n\n const lines = [\n `You have a persistent memory directory at ${this.memoryDir}.`,\n 'Use write_file/edit_file to update memory files as you learn patterns.',\n '',\n 'Current MEMORY.md:',\n index,\n ];\n\n return lines.join('\\n');\n }\n}\n\nexport const memoryManager = new MemoryManager();\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport type { Message } from '../llm/types.js';\nimport { Conversation } from './conversation.js';\n\nexport interface SessionInfo {\n id: string;\n name?: string;\n createdAt: number;\n updatedAt: number;\n messageCount: number;\n cwd: string;\n model: string;\n}\n\nexport class SessionManager {\n private sessionsDir: string;\n\n constructor() {\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n this.sessionsDir = path.join(home, '.codi', 'sessions');\n }\n\n private ensureDir(): void {\n if (!fs.existsSync(this.sessionsDir)) {\n fs.mkdirSync(this.sessionsDir, { recursive: true });\n }\n }\n\n save(conversation: Conversation, name?: string, model?: string): string {\n this.ensureDir();\n const id = name || crypto.randomUUID().slice(0, 8);\n const filePath = path.join(this.sessionsDir, `${id}.jsonl`);\n\n const data = conversation.serialize();\n const meta: SessionInfo = {\n id,\n name,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messageCount: data.messages.length,\n cwd: process.cwd(),\n model: model || 'unknown',\n };\n\n const lines = [\n JSON.stringify({ type: 'meta', ...meta }),\n JSON.stringify({ type: 'system', content: data.systemPrompt }),\n ...data.messages.map((m) => JSON.stringify({ type: 'message', ...m })),\n ];\n\n fs.writeFileSync(filePath, lines.join('\\n') + '\\n', 'utf-8');\n return id;\n }\n\n load(id: string): { conversation: Conversation; meta: SessionInfo } | null {\n const filePath = path.join(this.sessionsDir, `${id}.jsonl`);\n if (!fs.existsSync(filePath)) return null;\n\n const content = fs.readFileSync(filePath, 'utf-8');\n const lines = content.trim().split('\\n').filter(Boolean);\n\n let meta: SessionInfo | null = null;\n let systemPrompt = '';\n const messages: Message[] = [];\n\n for (const line of lines) {\n try {\n const obj = JSON.parse(line);\n if (obj.type === 'meta') {\n meta = obj as SessionInfo;\n } else if (obj.type === 'system') {\n systemPrompt = obj.content;\n } else if (obj.type === 'message') {\n messages.push({ role: obj.role, content: obj.content });\n }\n } catch {\n continue;\n }\n }\n\n if (!meta) return null;\n\n const conversation = Conversation.deserialize({ systemPrompt, messages });\n return { conversation, meta };\n }\n\n list(): SessionInfo[] {\n this.ensureDir();\n const files = fs.readdirSync(this.sessionsDir).filter((f) => f.endsWith('.jsonl'));\n const sessions: SessionInfo[] = [];\n\n for (const file of files) {\n const filePath = path.join(this.sessionsDir, file);\n try {\n const firstLine = fs.readFileSync(filePath, 'utf-8').split('\\n')[0];\n if (firstLine) {\n const meta = JSON.parse(firstLine);\n if (meta.type === 'meta') {\n sessions.push(meta as SessionInfo);\n }\n }\n } catch {\n continue;\n }\n }\n\n return sessions.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n getLatest(): SessionInfo | null {\n const sessions = this.list();\n return sessions[0] ?? null;\n }\n\n delete(id: string): boolean {\n const filePath = path.join(this.sessionsDir, `${id}.jsonl`);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n return true;\n }\n return false;\n }\n\n cleanup(maxAgeDays: number = 30): number {\n const cutoff = Date.now() - maxAgeDays * 24 * 60 * 60 * 1000;\n const sessions = this.list();\n let deleted = 0;\n\n for (const session of sessions) {\n if (session.updatedAt < cutoff) {\n this.delete(session.id);\n deleted++;\n }\n }\n\n return deleted;\n }\n}\n\nexport const sessionManager = new SessionManager();\n","import { execSync } from 'child_process';\nimport { Conversation } from './conversation.js';\n\nexport interface Checkpoint {\n id: number;\n timestamp: number;\n conversation: ReturnType<Conversation['serialize']>;\n gitRef?: string;\n description?: string;\n}\n\nexport class CheckpointManager {\n private checkpoints: Checkpoint[] = [];\n private nextId = 1;\n private isGitRepo: boolean;\n\n constructor() {\n try {\n execSync('git rev-parse --is-inside-work-tree', { stdio: 'pipe' });\n this.isGitRepo = true;\n } catch {\n this.isGitRepo = false;\n }\n }\n\n create(conversation: Conversation, description?: string): number {\n const checkpoint: Checkpoint = {\n id: this.nextId++,\n timestamp: Date.now(),\n conversation: conversation.serialize(),\n description,\n };\n\n if (this.isGitRepo) {\n try {\n // Save git state\n execSync('git stash push -m \"codi-checkpoint\" --include-untracked', {\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n const ref = execSync('git stash list --format=%H', {\n encoding: 'utf-8',\n }).split('\\n')[0]?.trim();\n\n if (ref) {\n checkpoint.gitRef = ref;\n }\n\n // Immediately restore the stash (we just want the ref)\n try {\n execSync('git stash pop', { stdio: 'pipe' });\n } catch {\n // If pop fails, there's nothing to pop\n }\n } catch {\n // Git operations may fail, that's OK\n }\n }\n\n this.checkpoints.push(checkpoint);\n\n // Keep only last 20 checkpoints\n if (this.checkpoints.length > 20) {\n this.checkpoints = this.checkpoints.slice(-20);\n }\n\n return checkpoint.id;\n }\n\n rewind(id?: number): { conversation: Conversation; description?: string } | null {\n let checkpoint: Checkpoint | undefined;\n\n if (id !== undefined) {\n checkpoint = this.checkpoints.find((cp) => cp.id === id);\n } else {\n // Rewind to previous checkpoint\n checkpoint = this.checkpoints[this.checkpoints.length - 2];\n }\n\n if (!checkpoint) return null;\n\n // Restore git state if available\n if (checkpoint.gitRef && this.isGitRepo) {\n try {\n execSync(`git checkout ${checkpoint.gitRef} -- .`, { stdio: 'pipe' });\n } catch {\n // Git restore may fail\n }\n }\n\n // Remove all checkpoints after this one\n const idx = this.checkpoints.indexOf(checkpoint);\n if (idx >= 0) {\n this.checkpoints = this.checkpoints.slice(0, idx + 1);\n }\n\n return {\n conversation: Conversation.deserialize(checkpoint.conversation),\n description: checkpoint.description,\n };\n }\n\n list(): Array<{ id: number; timestamp: number; description?: string }> {\n return this.checkpoints.map((cp) => ({\n id: cp.id,\n timestamp: cp.timestamp,\n description: cp.description,\n }));\n }\n}\n\nexport const checkpointManager = new CheckpointManager();\n","import * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Load CODI.md files hierarchically from CWD up to root,\n * plus CODI.local.md and .codi/rules/*.\n */\nexport function loadCodiMd(): string {\n const fragments: string[] = [];\n let dir = process.cwd();\n const root = path.parse(dir).root;\n\n // Walk up directories\n while (dir !== root) {\n loadFromDir(dir, fragments);\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return fragments.join('\\n\\n---\\n\\n');\n}\n\nfunction loadFromDir(dir: string, fragments: string[]): void {\n // CODI.md\n const codiPath = path.join(dir, 'CODI.md');\n if (fs.existsSync(codiPath)) {\n try {\n let content = fs.readFileSync(codiPath, 'utf-8');\n content = processImports(content, dir);\n fragments.push(`[CODI.md from ${dir}]\\n${content}`);\n } catch {\n // Skip unreadable files\n }\n }\n\n // CODI.local.md (local overrides, gitignored)\n const localPath = path.join(dir, 'CODI.local.md');\n if (fs.existsSync(localPath)) {\n try {\n const content = fs.readFileSync(localPath, 'utf-8');\n fragments.push(`[CODI.local.md from ${dir}]\\n${content}`);\n } catch {\n // Skip\n }\n }\n\n // .codi/rules/*.md\n const rulesDir = path.join(dir, '.codi', 'rules');\n if (fs.existsSync(rulesDir)) {\n try {\n const files = fs.readdirSync(rulesDir).filter((f) => f.endsWith('.md')).sort();\n for (const file of files) {\n const content = fs.readFileSync(path.join(rulesDir, file), 'utf-8');\n fragments.push(`[Rule: ${file}]\\n${content}`);\n }\n } catch {\n // Skip\n }\n }\n}\n\n/**\n * Process @path/to/import directives in CODI.md\n */\nfunction processImports(content: string, baseDir: string): string {\n return content.replace(/@([\\w./-]+)/g, (match, importPath) => {\n const resolved = path.resolve(baseDir, importPath);\n if (fs.existsSync(resolved)) {\n try {\n return fs.readFileSync(resolved, 'utf-8');\n } catch {\n return match;\n }\n }\n return match;\n });\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nexport type AgentMode = 'plan' | 'execute';\n\nlet currentMode: AgentMode = 'execute';\n\nexport function getMode(): AgentMode {\n return currentMode;\n}\n\nexport function setMode(mode: AgentMode): void {\n currentMode = mode;\n}\n\nexport function isPlanMode(): boolean {\n return currentMode === 'plan';\n}\n\nexport function savePlan(name: string, content: string): string {\n const planDir = path.join(process.cwd(), '.codi', 'plans');\n if (!fs.existsSync(planDir)) {\n fs.mkdirSync(planDir, { recursive: true });\n }\n\n const planPath = path.join(planDir, `${name}.md`);\n fs.writeFileSync(planPath, content, 'utf-8');\n return planPath;\n}\n\nexport function loadPlan(name: string): string | null {\n const planPath = path.join(process.cwd(), '.codi', 'plans', `${name}.md`);\n if (!fs.existsSync(planPath)) return null;\n return fs.readFileSync(planPath, 'utf-8');\n}\n\nexport function listPlans(): string[] {\n const planDir = path.join(process.cwd(), '.codi', 'plans');\n if (!fs.existsSync(planDir)) return [];\n return fs.readdirSync(planDir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.replace('.md', ''));\n}\n","import type { Tool } from './tool.js';\nimport type { ToolDefinition } from '../llm/types.js';\n\nexport class ToolRegistry {\n private tools: Map<string, Tool> = new Map();\n\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n registerAll(tools: Tool[]): void {\n for (const tool of tools) {\n this.register(tool);\n }\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n remove(name: string): boolean {\n return this.tools.delete(name);\n }\n\n list(): Tool[] {\n return [...this.tools.values()];\n }\n\n listNames(): string[] {\n return [...this.tools.keys()];\n }\n\n getToolDefinitions(options?: { readOnly?: boolean; names?: string[] }): ToolDefinition[] {\n let tools = [...this.tools.values()];\n\n if (options?.readOnly) {\n tools = tools.filter((t) => t.readOnly);\n }\n\n if (options?.names) {\n const nameSet = new Set(options.names);\n tools = tools.filter((t) => nameSet.has(t.name));\n }\n\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema,\n }));\n }\n\n clone(): ToolRegistry {\n const newRegistry = new ToolRegistry();\n for (const [, tool] of this.tools) {\n newRegistry.register(tool);\n }\n return newRegistry;\n }\n\n subset(names: string[]): ToolRegistry {\n const newRegistry = new ToolRegistry();\n for (const name of names) {\n const tool = this.tools.get(name);\n if (tool) newRegistry.register(tool);\n }\n return newRegistry;\n }\n}\n","import * as readline from 'node:readline/promises';\nimport chalk from 'chalk';\nimport type { Tool } from '../tools/tool.js';\nimport { evaluatePermission } from '../config/permissions.js';\nimport { configManager } from '../config/config.js';\n\nexport type PermissionMode = 'default' | 'acceptEdits' | 'plan' | 'yolo';\n\nconst sessionAllowed: Set<string> = new Set();\nconst sessionDenied: Set<string> = new Set();\n\nlet currentMode: PermissionMode = 'default';\n\nexport function setPermissionMode(mode: PermissionMode): void {\n currentMode = mode;\n}\n\nexport function getPermissionMode(): PermissionMode {\n return currentMode;\n}\n\nexport async function checkPermission(\n tool: Tool,\n input: Record<string, unknown>\n): Promise<boolean> {\n // Non-dangerous tools are always allowed\n if (!tool.dangerous) return true;\n\n // YOLO mode allows everything\n if (currentMode === 'yolo') return true;\n\n // Accept edits mode auto-approves file modifications\n if (currentMode === 'acceptEdits' && ['write_file', 'edit_file', 'multi_edit'].includes(tool.name)) {\n return true;\n }\n\n // Plan mode blocks non-readOnly tools\n if (currentMode === 'plan' && !tool.readOnly) {\n return false;\n }\n\n const config = configManager.get();\n const decision = evaluatePermission(tool.name, input, config.permissions);\n\n if (decision === 'allow') return true;\n if (decision === 'deny') {\n console.log(chalk.red(`✗ Permission denied for ${tool.name} (denied by rule)`));\n return false;\n }\n\n // Check session memory\n const key = `${tool.name}:${JSON.stringify(input)}`;\n if (sessionAllowed.has(tool.name)) return true;\n if (sessionDenied.has(tool.name)) return false;\n\n // Ask user\n return promptUser(tool, input);\n}\n\nasync function promptUser(tool: Tool, input: Record<string, unknown>): Promise<boolean> {\n console.log('');\n console.log(chalk.yellow.bold(`⚠ Permission Required: ${tool.name}`));\n\n // Show relevant input parameters\n const relevantParams = Object.entries(input).filter(([, v]) => v !== undefined);\n for (const [key, value] of relevantParams) {\n const displayValue = typeof value === 'string' && value.length > 200\n ? value.slice(0, 200) + '...'\n : String(value);\n console.log(chalk.dim(` ${key}: `) + displayValue);\n }\n console.log('');\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const answer = await rl.question(\n chalk.yellow(`Allow? [${chalk.bold('Y')}es / ${chalk.bold('n')}o / ${chalk.bold('a')}lways for this tool] `)\n );\n rl.close();\n\n const choice = answer.trim().toLowerCase();\n\n if (choice === 'a' || choice === 'always') {\n sessionAllowed.add(tool.name);\n return true;\n }\n\n if (choice === 'n' || choice === 'no') {\n return false;\n }\n\n // Default to yes\n return true;\n } catch {\n rl.close();\n return false;\n }\n}\n\nexport function resetSessionPermissions(): void {\n sessionAllowed.clear();\n sessionDenied.clear();\n}\n","export interface PermissionRule {\n tool: string;\n pattern?: string; // Optional argument pattern\n}\n\nexport type PermissionDecision = 'allow' | 'deny' | 'ask';\n\nexport function parseRule(rule: string): PermissionRule {\n const match = rule.match(/^(\\w+)(?:\\((.+)\\))?$/);\n if (match) {\n return { tool: match[1]!, pattern: match[2] };\n }\n return { tool: rule };\n}\n\nexport function matchesRule(rule: PermissionRule, toolName: string, input: Record<string, unknown>): boolean {\n if (rule.tool !== toolName) return false;\n\n if (!rule.pattern) return true;\n\n // Check if any input value matches the pattern\n const pattern = new RegExp(rule.pattern.replace(/\\*/g, '.*'));\n for (const value of Object.values(input)) {\n if (typeof value === 'string' && pattern.test(value)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function evaluatePermission(\n toolName: string,\n input: Record<string, unknown>,\n rules: { allow: string[]; deny: string[]; ask: string[] }\n): PermissionDecision {\n // Deny takes precedence\n for (const rule of rules.deny) {\n if (matchesRule(parseRule(rule), toolName, input)) {\n return 'deny';\n }\n }\n\n // Then ask\n for (const rule of rules.ask) {\n if (matchesRule(parseRule(rule), toolName, input)) {\n return 'ask';\n }\n }\n\n // Then allow\n for (const rule of rules.allow) {\n if (matchesRule(parseRule(rule), toolName, input)) {\n return 'allow';\n }\n }\n\n // Default: ask for dangerous tools, allow for safe\n return 'ask';\n}\n","import { exec } from 'child_process';\nimport type { ToolResult } from '../tools/tool.js';\nimport { configManager, type HookConfig } from '../config/config.js';\n\nexport type HookEvent = 'PreToolUse' | 'PostToolUse' | 'SessionStart' | 'SessionEnd' | 'PreCompact' | 'Stop';\n\nexport interface HookResult {\n proceed: boolean;\n reason?: string;\n updatedInput?: Record<string, unknown>;\n}\n\nexport class HookManager {\n async runHooks(\n event: HookEvent,\n context: {\n tool?: string;\n args?: Record<string, unknown>;\n result?: ToolResult;\n sessionId?: string;\n cwd?: string;\n }\n ): Promise<HookResult> {\n const config = configManager.get();\n const hookConfigs = config.hooks[event];\n if (!hookConfigs || hookConfigs.length === 0) {\n return { proceed: true };\n }\n\n for (const hookConfig of hookConfigs) {\n // Check matcher\n if (context.tool && hookConfig.matcher) {\n const matcher = new RegExp(hookConfig.matcher);\n if (!matcher.test(context.tool)) continue;\n }\n\n for (const hook of hookConfig.hooks) {\n if (hook.type === 'command' && hook.command) {\n const result = await this.runCommandHook(hook.command, context, hook.timeout);\n if (!result.proceed) return result;\n if (result.updatedInput) {\n context.args = result.updatedInput;\n }\n }\n }\n }\n\n return { proceed: true };\n }\n\n private async runCommandHook(\n command: string,\n context: Record<string, unknown>,\n timeout?: number\n ): Promise<HookResult> {\n return new Promise((resolve) => {\n const stdinData = JSON.stringify({\n tool: context['tool'],\n args: context['args'],\n session_id: context['sessionId'],\n cwd: context['cwd'] || process.cwd(),\n });\n\n const proc = exec(command, {\n timeout: timeout || 5000,\n cwd: process.cwd(),\n env: { ...process.env },\n }, (err, stdout, stderr) => {\n if (err) {\n // Exit code 2 means block\n if ((err as any).code === 2) {\n resolve({\n proceed: false,\n reason: stderr || stdout || 'Blocked by hook',\n });\n return;\n }\n // Other errors: warn but proceed\n resolve({ proceed: true });\n return;\n }\n\n // Try to parse JSON output\n try {\n const output = JSON.parse(stdout);\n resolve({\n proceed: output.decision !== 'block',\n reason: output.reason,\n updatedInput: output.updatedInput,\n });\n } catch {\n resolve({ proceed: true });\n }\n });\n\n // Send context via stdin\n if (proc.stdin) {\n proc.stdin.write(stdinData);\n proc.stdin.end();\n }\n });\n }\n}\n\nexport const hookManager = new HookManager();\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { Tool, ToolResult } from '../tools/tool.js';\nimport { makeToolResult, makeToolError } from '../tools/tool.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport { configManager } from '../config/config.js';\nimport chalk from 'chalk';\n\ninterface McpServer {\n name: string;\n client: Client;\n transport: StdioClientTransport;\n tools: string[];\n}\n\nexport class McpManager {\n private servers: Map<string, McpServer> = new Map();\n\n async initialize(registry: ToolRegistry): Promise<void> {\n const config = configManager.get();\n\n // Also check for mcp.json files\n const mcpConfigs = this.loadMcpConfigs();\n const allServers = { ...mcpConfigs, ...config.mcpServers };\n\n for (const [name, serverConfig] of Object.entries(allServers)) {\n try {\n await this.connectServer(name, serverConfig, registry);\n } catch (err) {\n console.error(chalk.yellow(` ⚠ Failed to connect MCP server '${name}': ${err instanceof Error ? err.message : String(err)}`));\n }\n }\n }\n\n private loadMcpConfigs(): Record<string, { command: string; args?: string[]; env?: Record<string, string> }> {\n const configs: Record<string, any> = {};\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n\n const paths = [\n path.join(home, '.codi', 'mcp.json'),\n path.join(process.cwd(), '.codi', 'mcp.json'),\n ];\n\n for (const p of paths) {\n try {\n if (fs.existsSync(p)) {\n const content = JSON.parse(fs.readFileSync(p, 'utf-8'));\n if (content.mcpServers) {\n Object.assign(configs, content.mcpServers);\n }\n }\n } catch {\n // Skip invalid configs\n }\n }\n\n return configs;\n }\n\n private async connectServer(\n name: string,\n config: { command: string; args?: string[]; env?: Record<string, string> },\n registry: ToolRegistry\n ): Promise<void> {\n const transport = new StdioClientTransport({\n command: config.command,\n args: config.args,\n env: { ...process.env, ...(config.env || {}) } as Record<string, string>,\n });\n\n const client = new Client({\n name: 'codi',\n version: '0.1.0',\n });\n\n await client.connect(transport);\n\n // Discover tools\n const toolsResult = await client.listTools();\n const toolNames: string[] = [];\n\n for (const mcpTool of toolsResult.tools) {\n const toolName = `mcp__${name}__${mcpTool.name}`;\n toolNames.push(toolName);\n\n const tool: Tool = {\n name: toolName,\n description: `[MCP:${name}] ${mcpTool.description || mcpTool.name}`,\n inputSchema: (mcpTool.inputSchema as Record<string, unknown>) || { type: 'object', properties: {} },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n try {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: input,\n });\n\n const contentArr = Array.isArray(result.content) ? result.content : [];\n const text = contentArr\n .map((c: any) => {\n if (c.type === 'text') return c.text;\n return JSON.stringify(c);\n })\n .join('\\n') || '';\n\n return makeToolResult(text);\n } catch (err) {\n return makeToolError(`MCP tool error: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n };\n\n registry.register(tool);\n }\n\n this.servers.set(name, { name, client, transport, tools: toolNames });\n console.log(chalk.dim(` ✓ MCP server '${name}' connected (${toolNames.length} tools)`));\n }\n\n async disconnect(name: string): Promise<void> {\n const server = this.servers.get(name);\n if (!server) return;\n\n try {\n await server.transport.close();\n } catch {\n // Ignore disconnect errors\n }\n this.servers.delete(name);\n }\n\n async disconnectAll(): Promise<void> {\n for (const [name] of this.servers) {\n await this.disconnect(name);\n }\n }\n\n listServers(): Array<{ name: string; tools: string[] }> {\n return [...this.servers.values()].map((s) => ({\n name: s.name,\n tools: s.tools,\n }));\n }\n\n getServerCount(): number {\n return this.servers.size;\n }\n}\n\nexport const mcpManager = new McpManager();\n","import type { LlmProvider } from '../llm/provider.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type { ToolResult } from '../tools/tool.js';\nimport { makeToolResult, makeToolError } from '../tools/tool.js';\nimport { agentLoop } from './agent-loop.js';\nimport { Conversation } from './conversation.js';\nimport { EXPLORE_SYSTEM_PROMPT, PLAN_SYSTEM_PROMPT, GENERAL_SYSTEM_PROMPT } from './system-prompt.js';\nimport chalk from 'chalk';\n\nexport interface SubAgentConfig {\n type: 'explore' | 'plan' | 'general';\n task: string;\n tools?: string[];\n model?: string;\n maxIterations?: number;\n background?: boolean;\n}\n\nconst AGENT_PRESETS: Record<string, {\n tools: string[];\n systemPrompt: string;\n maxIterations: number;\n}> = {\n explore: {\n tools: ['read_file', 'glob', 'grep', 'list_dir'],\n systemPrompt: EXPLORE_SYSTEM_PROMPT,\n maxIterations: 15,\n },\n plan: {\n tools: ['read_file', 'glob', 'grep', 'list_dir', 'web_fetch'],\n systemPrompt: PLAN_SYSTEM_PROMPT,\n maxIterations: 20,\n },\n general: {\n tools: [], // Empty means all tools except sub_agent\n systemPrompt: GENERAL_SYSTEM_PROMPT,\n maxIterations: 25,\n },\n};\n\n// Background tasks\nconst backgroundAgents: Map<string, { promise: Promise<string>; status: string; result?: string }> = new Map();\nlet bgCounter = 0;\n\nexport function createSubAgentHandler(\n provider: LlmProvider,\n mainRegistry: ToolRegistry\n): (input: Record<string, unknown>) => Promise<ToolResult> {\n return async (input: Record<string, unknown>): Promise<ToolResult> => {\n const type = String(input['type']) as SubAgentConfig['type'];\n const task = String(input['task']);\n const background = input['background'] === true;\n\n const preset = AGENT_PRESETS[type];\n if (!preset) {\n return makeToolError(`Unknown agent type: ${type}. Use 'explore', 'plan', or 'general'.`);\n }\n\n // Create restricted registry\n let registry: ToolRegistry;\n if (preset.tools.length > 0) {\n registry = mainRegistry.subset(preset.tools);\n } else {\n // General: all tools except sub_agent (prevent nesting)\n registry = mainRegistry.clone();\n registry.remove('sub_agent');\n }\n\n const conversation = new Conversation();\n const maxIterations = (input['maxIterations'] as number) || preset.maxIterations;\n\n console.log(chalk.dim(`\\n ▸ Launching ${type} agent: ${task.slice(0, 80)}...`));\n\n const runAgent = async (): Promise<string> => {\n const result = await agentLoop(task, {\n provider,\n conversation,\n registry,\n systemPrompt: preset.systemPrompt,\n maxIterations,\n stream: false,\n showOutput: false,\n });\n return result;\n };\n\n if (background) {\n const taskId = `agent_${++bgCounter}`;\n const entry: { promise: Promise<string>; status: string; result?: string } = { promise: runAgent(), status: 'running', result: undefined };\n backgroundAgents.set(taskId, entry);\n\n entry.promise\n .then((result) => {\n entry.status = 'done';\n entry.result = result;\n })\n .catch((err) => {\n entry.status = 'error';\n entry.result = String(err);\n });\n\n return makeToolResult(`Background agent started with ID: ${taskId}. Use task output to check results.`);\n }\n\n try {\n const result = await runAgent();\n console.log(chalk.dim(` ▸ ${type} agent completed.`));\n return makeToolResult(result);\n } catch (err) {\n return makeToolError(`Sub-agent failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n };\n}\n\nexport function getBackgroundAgentResult(taskId: string): { status: string; result?: string } | null {\n const entry = backgroundAgents.get(taskId);\n if (!entry) return null;\n return { status: entry.status, result: entry.result };\n}\n","import type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\n// Forward reference - will be connected in stage 10\nlet subAgentHandler: ((input: Record<string, unknown>) => Promise<ToolResult>) | null = null;\n\nexport function setSubAgentHandler(handler: (input: Record<string, unknown>) => Promise<ToolResult>): void {\n subAgentHandler = handler;\n}\n\nexport const subAgentTool: Tool = {\n name: 'sub_agent',\n description: `Launch a sub-agent to handle complex tasks autonomously. Types: 'explore' (read-only codebase exploration), 'plan' (architecture planning), 'general' (full capabilities). Sub-agents run in independent contexts.`,\n inputSchema: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: ['explore', 'plan', 'general'],\n description: 'Agent type: explore (fast, read-only), plan (analysis), general (full access)',\n },\n task: { type: 'string', description: 'Detailed task description for the agent' },\n model: { type: 'string', description: 'Optional model override' },\n background: { type: 'boolean', description: 'Run in background and return task ID' },\n },\n required: ['type', 'task'],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n if (!subAgentHandler) {\n return makeToolError('Sub-agent system not initialized. This feature will be available after setup.');\n }\n return subAgentHandler(input);\n },\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport { tokenTracker } from '../agent/token-tracker.js';\nimport { sessionManager } from '../agent/session.js';\nimport { memoryManager } from '../agent/memory.js';\nimport { checkpointManager } from '../agent/checkpoint.js';\nimport { setMode, getMode, listPlans } from '../agent/mode-manager.js';\nimport { statusLine } from '../ui/status-line.js';\nimport { mcpManager } from '../mcp/mcp-manager.js';\nimport { configManager } from './config.js';\nimport type { Conversation } from '../agent/conversation.js';\nimport type { LlmProvider } from '../llm/provider.js';\nimport type { ContextCompressor } from '../agent/context-compressor.js';\n\nexport interface SlashCommandContext {\n conversation: Conversation;\n provider: LlmProvider;\n compressor: ContextCompressor;\n setProvider: (name: string, model: string) => void;\n reloadSystemPrompt: () => void;\n exitFn?: () => Promise<void>;\n}\n\nexport interface SlashCommand {\n name: string;\n aliases?: string[];\n description: string;\n handler: (args: string, ctx: SlashCommandContext) => Promise<boolean>;\n}\n\nexport function createBuiltinCommands(): SlashCommand[] {\n return [\n {\n name: '/help',\n description: 'Show available commands',\n handler: async () => {\n const commands = createBuiltinCommands();\n console.log(chalk.bold('\\nAvailable Commands:\\n'));\n for (const cmd of commands) {\n const aliases = cmd.aliases ? chalk.dim(` (${cmd.aliases.join(', ')})`) : '';\n console.log(` ${chalk.cyan(cmd.name)}${aliases} - ${cmd.description}`);\n }\n console.log('');\n console.log(chalk.dim(' Prefixes: ! (bash), @ (file reference)'));\n console.log(chalk.dim(' Use \\\\ at end of line for multiline input'));\n console.log('');\n return true;\n },\n },\n {\n name: '/quit',\n aliases: ['/exit'],\n description: 'Exit Codi',\n handler: async (_args, ctx) => {\n if (ctx.exitFn) {\n await ctx.exitFn();\n }\n console.log(chalk.dim('\\nGoodbye!\\n'));\n process.exit(0);\n },\n },\n {\n name: '/clear',\n aliases: ['/reset', '/new'],\n description: 'Clear conversation history',\n handler: async (_args, ctx) => {\n ctx.conversation.clear();\n ctx.reloadSystemPrompt();\n console.log(chalk.green('✓ Conversation cleared'));\n return true;\n },\n },\n {\n name: '/model',\n description: 'Switch model or provider (e.g., /model gpt-4o, /model ollama:llama3.1)',\n handler: async (args, ctx) => {\n if (!args) {\n const info = statusLine.getInfo();\n console.log(chalk.cyan(`Current model: ${info.model} (${info.provider})`));\n return true;\n }\n\n if (args.includes(':')) {\n const [provider, model] = args.split(':');\n ctx.setProvider(provider!, model!);\n } else {\n ctx.setProvider('', args);\n }\n console.log(chalk.green(`✓ Model switched to: ${args}`));\n return true;\n },\n },\n {\n name: '/compact',\n description: 'Compress conversation history (optional: focus hint)',\n handler: async (args, ctx) => {\n console.log(chalk.dim('Compressing conversation...'));\n await ctx.compressor.compress(ctx.conversation, ctx.provider, args || undefined);\n ctx.reloadSystemPrompt();\n console.log(chalk.green('✓ Conversation compressed'));\n return true;\n },\n },\n {\n name: '/cost',\n description: 'Show token usage and cost',\n handler: async () => {\n console.log(chalk.cyan(`\\n${tokenTracker.format()}\\n`));\n return true;\n },\n },\n {\n name: '/config',\n description: 'Show current configuration',\n handler: async () => {\n const config = configManager.get();\n console.log(chalk.bold('\\nConfiguration:\\n'));\n console.log(chalk.dim(JSON.stringify(config, null, 2)));\n console.log(chalk.dim(`\\nConfig files: ${configManager.getConfigPaths().join(', ') || '(none)'}`));\n console.log('');\n return true;\n },\n },\n {\n name: '/permissions',\n description: 'Show permission rules',\n handler: async () => {\n const config = configManager.get();\n console.log(chalk.bold('\\nPermission Rules:\\n'));\n console.log(chalk.green(' Allow: ') + config.permissions.allow.join(', '));\n console.log(chalk.red(' Deny: ') + (config.permissions.deny.join(', ') || '(none)'));\n console.log(chalk.yellow(' Ask: ') + config.permissions.ask.join(', '));\n console.log('');\n return true;\n },\n },\n {\n name: '/save',\n description: 'Save current session',\n handler: async (args, ctx) => {\n const name = args || undefined;\n const id = sessionManager.save(ctx.conversation, name, statusLine.getInfo().model);\n console.log(chalk.green(`✓ Session saved: ${id}`));\n return true;\n },\n },\n {\n name: '/resume',\n aliases: ['/continue'],\n description: 'Resume a saved session',\n handler: async (args, ctx) => {\n const id = args || sessionManager.getLatest()?.id;\n if (!id) {\n console.log(chalk.yellow('No sessions found. Use /save to save a session first.'));\n return true;\n }\n\n const session = sessionManager.load(id);\n if (!session) {\n console.log(chalk.red(`Session not found: ${id}`));\n return true;\n }\n\n // Replace current conversation\n const data = session.conversation.serialize();\n ctx.conversation.clear();\n ctx.conversation.setSystemPrompt(data.systemPrompt);\n for (const msg of data.messages) {\n if (msg.role === 'user') ctx.conversation.addUserMessage(msg.content);\n else if (msg.role === 'assistant') ctx.conversation.addAssistantMessage(msg.content);\n }\n\n console.log(chalk.green(`✓ Resumed session: ${id} (${session.meta.messageCount} messages)`));\n return true;\n },\n },\n {\n name: '/fork',\n description: 'Fork current conversation into a new session',\n handler: async (args, ctx) => {\n const name = args || `fork-${Date.now()}`;\n const id = sessionManager.save(ctx.conversation, name, statusLine.getInfo().model);\n console.log(chalk.green(`✓ Conversation forked: ${id}`));\n return true;\n },\n },\n {\n name: '/plan',\n description: 'Toggle plan mode (read-only analysis)',\n handler: async () => {\n const current = getMode();\n const newMode = current === 'plan' ? 'execute' : 'plan';\n setMode(newMode);\n statusLine.update({ mode: newMode });\n console.log(chalk.cyan(`Mode: ${newMode === 'plan' ? 'PLAN (read-only)' : 'EXECUTE'}`));\n return true;\n },\n },\n {\n name: '/memory',\n description: 'Show or edit auto memory',\n handler: async () => {\n const index = memoryManager.loadIndex();\n const topics = memoryManager.listTopics();\n\n console.log(chalk.bold('\\nAuto Memory:\\n'));\n console.log(chalk.dim(`Directory: ${memoryManager.getMemoryDir()}`));\n\n if (index) {\n console.log(chalk.dim('\\nMEMORY.md:'));\n console.log(index);\n } else {\n console.log(chalk.dim('\\nNo memory saved yet.'));\n }\n\n if (topics.length > 0) {\n console.log(chalk.dim(`\\nTopics: ${topics.join(', ')}`));\n }\n console.log('');\n return true;\n },\n },\n {\n name: '/init',\n description: 'Initialize CODI.md in the current project',\n handler: async () => {\n const codiPath = path.join(process.cwd(), 'CODI.md');\n if (fs.existsSync(codiPath)) {\n console.log(chalk.yellow('CODI.md already exists'));\n return true;\n }\n\n const content = `# Project: ${path.basename(process.cwd())}\n\n## Overview\n<!-- Describe your project here -->\n\n## Architecture\n<!-- Key architectural decisions -->\n\n## Development\n<!-- Development guidelines, commands, etc. -->\n\n## Conventions\n<!-- Code style, naming conventions, etc. -->\n`;\n fs.writeFileSync(codiPath, content, 'utf-8');\n console.log(chalk.green('✓ Created CODI.md'));\n return true;\n },\n },\n {\n name: '/export',\n description: 'Export conversation to a file',\n handler: async (args, ctx) => {\n const filePath = args || `conversation-${Date.now()}.md`;\n const messages = ctx.conversation.getMessages();\n\n let md = `# Codi Conversation Export\\n\\nDate: ${new Date().toISOString()}\\n\\n---\\n\\n`;\n for (const msg of messages) {\n const role = msg.role === 'user' ? 'User' : msg.role === 'assistant' ? 'Codi' : 'System';\n const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content, null, 2);\n md += `## ${role}\\n\\n${content}\\n\\n---\\n\\n`;\n }\n\n fs.writeFileSync(filePath, md, 'utf-8');\n console.log(chalk.green(`✓ Exported to ${filePath}`));\n return true;\n },\n },\n {\n name: '/tasks',\n description: 'Show task list',\n handler: async () => {\n const { taskManager } = await import('../tools/task-tools.js');\n const tasks = taskManager.list();\n if (tasks.length === 0) {\n console.log(chalk.dim('\\nNo tasks.\\n'));\n return true;\n }\n console.log(chalk.bold('\\nTasks:\\n'));\n for (const task of tasks) {\n const statusIcon = task.status === 'completed' ? chalk.green('✓') :\n task.status === 'in_progress' ? chalk.yellow('⟳') : chalk.dim('○');\n console.log(` ${statusIcon} #${task.id} ${task.subject} [${task.status}]`);\n }\n console.log('');\n return true;\n },\n },\n {\n name: '/status',\n description: 'Show system status',\n handler: async () => {\n const config = configManager.get();\n const info = statusLine.getInfo();\n const stats = tokenTracker.getStats();\n const mcpServers = mcpManager.listServers();\n\n console.log(chalk.bold('\\nCodi Status:\\n'));\n console.log(` Version: 0.1.0`);\n console.log(` Model: ${info.model}`);\n console.log(` Provider: ${config.provider}`);\n console.log(` Mode: ${getMode()}`);\n console.log(` Tokens: ${tokenTracker.format()}`);\n console.log(` MCP: ${mcpServers.length} server(s)`);\n for (const s of mcpServers) {\n console.log(` - ${s.name} (${s.tools.length} tools)`);\n }\n console.log('');\n return true;\n },\n },\n {\n name: '/context',\n description: 'Show context window usage',\n handler: async (_args, ctx) => {\n const estimated = ctx.conversation.estimateTokens();\n const max = 200_000;\n const pct = Math.round((estimated / max) * 100);\n const bar = '█'.repeat(Math.round(pct / 5)) + '░'.repeat(20 - Math.round(pct / 5));\n\n console.log(chalk.bold('\\nContext Window:\\n'));\n console.log(` ${bar} ${pct}%`);\n console.log(` ~${estimated.toLocaleString()} / ${max.toLocaleString()} tokens`);\n console.log(` Messages: ${ctx.conversation.getMessageCount()}`);\n console.log('');\n return true;\n },\n },\n {\n name: '/rewind',\n description: 'Rewind to a previous checkpoint',\n handler: async (_args, ctx) => {\n const checkpoints = checkpointManager.list();\n if (checkpoints.length === 0) {\n console.log(chalk.yellow('No checkpoints available.'));\n return true;\n }\n\n const result = checkpointManager.rewind();\n if (!result) {\n console.log(chalk.yellow('No checkpoint to rewind to.'));\n return true;\n }\n\n // Restore conversation\n const data = result.conversation.serialize();\n ctx.conversation.clear();\n ctx.conversation.setSystemPrompt(data.systemPrompt);\n for (const msg of data.messages) {\n if (msg.role === 'user') ctx.conversation.addUserMessage(msg.content);\n else if (msg.role === 'assistant') ctx.conversation.addAssistantMessage(msg.content);\n }\n\n console.log(chalk.green(`✓ Rewound to checkpoint${result.description ? `: ${result.description}` : ''}`));\n return true;\n },\n },\n {\n name: '/diff',\n description: 'Show git diff of current changes',\n handler: async () => {\n try {\n const { execSync } = await import('child_process');\n const diff = execSync('git diff', { encoding: 'utf-8', cwd: process.cwd() });\n if (!diff.trim()) {\n console.log(chalk.dim('\\nNo changes.\\n'));\n } else {\n const { renderDiff } = await import('../ui/renderer.js');\n console.log('\\n' + renderDiff('', '', diff) + '\\n');\n }\n } catch {\n console.log(chalk.yellow('Not a git repository or git not available.'));\n }\n return true;\n },\n },\n {\n name: '/mcp',\n description: 'Show MCP server status',\n handler: async () => {\n const servers = mcpManager.listServers();\n if (servers.length === 0) {\n console.log(chalk.dim('\\nNo MCP servers connected.\\n'));\n console.log(chalk.dim('Add servers in .codi/mcp.json or ~/.codi/mcp.json'));\n return true;\n }\n\n console.log(chalk.bold('\\nMCP Servers:\\n'));\n for (const s of servers) {\n console.log(` ${chalk.green('●')} ${s.name}`);\n for (const t of s.tools) {\n console.log(chalk.dim(` - ${t}`));\n }\n }\n console.log('');\n return true;\n },\n },\n ];\n}\n\n// Custom slash commands from .codi/commands/\nexport function loadCustomCommands(): SlashCommand[] {\n const commands: SlashCommand[] = [];\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n\n const dirs = [\n path.join(home, '.codi', 'commands'),\n path.join(process.cwd(), '.codi', 'commands'),\n ];\n\n for (const dir of dirs) {\n if (!fs.existsSync(dir)) continue;\n const files = fs.readdirSync(dir).filter((f) => f.endsWith('.md'));\n\n for (const file of files) {\n const name = '/' + file.replace('.md', '');\n const filePath = path.join(dir, file);\n\n commands.push({\n name,\n description: `Custom command from ${path.relative(process.cwd(), filePath)}`,\n handler: async (_args, ctx) => {\n let content = fs.readFileSync(filePath, 'utf-8');\n\n // Variable substitution\n content = content\n .replace(/\\{\\{cwd\\}\\}/g, process.cwd())\n .replace(/\\{\\{date\\}\\}/g, new Date().toISOString().split('T')[0]!)\n .replace(/\\{\\{file_path\\}\\}/g, _args || '');\n\n // Inject as a user message\n await ctx.conversation.addUserMessage(content);\n return false; // Don't consume - let the agent process it\n },\n });\n }\n }\n\n return commands;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const fileReadTool: Tool = {\n name: 'read_file',\n description: `Read a file from the filesystem. Supports text files with line numbers (cat -n format), PDF files, images (returns base64 for multimodal), and Jupyter notebooks (.ipynb). Use offset/limit for large files.`,\n inputSchema: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Absolute or relative path to the file' },\n offset: { type: 'number', description: 'Line number to start reading from (1-based)' },\n limit: { type: 'number', description: 'Number of lines to read' },\n pages: { type: 'string', description: 'Page range for PDF files (e.g., \"1-5\")' },\n },\n required: ['file_path'],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const filePath = String(input['file_path']);\n const offset = input['offset'] as number | undefined;\n const limit = input['limit'] as number | undefined;\n\n const resolved = path.resolve(filePath);\n\n if (!fs.existsSync(resolved)) {\n return makeToolError(`File not found: ${resolved}`);\n }\n\n const stat = fs.statSync(resolved);\n if (stat.isDirectory()) {\n return makeToolError(`Path is a directory, not a file: ${resolved}. Use list_dir instead.`);\n }\n\n const ext = path.extname(resolved).toLowerCase();\n\n // Image files\n if (['.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp', '.svg'].includes(ext)) {\n const data = fs.readFileSync(resolved);\n const base64 = data.toString('base64');\n const mimeMap: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.bmp': 'image/bmp',\n '.svg': 'image/svg+xml',\n };\n return makeToolResult(`[Image: ${path.basename(resolved)}]`, {\n filePath: resolved,\n isImage: true,\n imageData: base64,\n imageMimeType: mimeMap[ext] || 'image/png',\n });\n }\n\n // PDF files\n if (ext === '.pdf') {\n try {\n const pdfModule = await import('pdf-parse');\n const pdfParse = (pdfModule as any).default || pdfModule;\n const buffer = fs.readFileSync(resolved);\n const data = await pdfParse(buffer);\n const pages = input['pages'] as string | undefined;\n\n let text = data.text;\n if (pages) {\n // Basic page range support - split by form feeds\n const allPages = text.split('\\f');\n const [start, end] = pages.split('-').map(Number);\n const s = (start || 1) - 1;\n const e = end || start || allPages.length;\n text = allPages.slice(s, e).join('\\n\\n--- Page Break ---\\n\\n');\n }\n\n return makeToolResult(text, { filePath: resolved });\n } catch (err) {\n return makeToolError(`Failed to parse PDF: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Jupyter notebooks\n if (ext === '.ipynb') {\n try {\n const content = fs.readFileSync(resolved, 'utf-8');\n const nb = JSON.parse(content);\n const output: string[] = [];\n\n for (let i = 0; i < (nb.cells || []).length; i++) {\n const cell = nb.cells[i];\n const cellType = cell.cell_type || 'code';\n const source = Array.isArray(cell.source) ? cell.source.join('') : cell.source || '';\n\n output.push(`--- Cell ${i + 1} [${cellType}] ---`);\n output.push(source);\n\n if (cell.outputs && cell.outputs.length > 0) {\n output.push('--- Output ---');\n for (const out of cell.outputs) {\n if (out.text) {\n output.push(Array.isArray(out.text) ? out.text.join('') : out.text);\n } else if (out.data?.['text/plain']) {\n const plain = out.data['text/plain'];\n output.push(Array.isArray(plain) ? plain.join('') : plain);\n }\n }\n }\n output.push('');\n }\n\n return makeToolResult(output.join('\\n'), { filePath: resolved });\n } catch (err) {\n return makeToolError(`Failed to parse notebook: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Text files\n try {\n const content = fs.readFileSync(resolved, 'utf-8');\n const lines = content.split('\\n');\n const totalLines = lines.length;\n\n const startLine = Math.max(1, offset || 1);\n const endLine = limit ? Math.min(startLine + limit - 1, totalLines) : Math.min(startLine + 1999, totalLines);\n\n const selectedLines = lines.slice(startLine - 1, endLine);\n const numbered = selectedLines.map((line, i) => {\n const lineNum = startLine + i;\n const numStr = String(lineNum).padStart(String(endLine).length, ' ');\n return `${numStr}\\t${line}`;\n });\n\n let result = numbered.join('\\n');\n if (endLine < totalLines) {\n result += `\\n\\n... (${totalLines - endLine} more lines)`;\n }\n\n return makeToolResult(result, { filePath: resolved });\n } catch (err) {\n return makeToolError(`Failed to read file: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const fileWriteTool: Tool = {\n name: 'write_file',\n description: `Create a new file or overwrite an existing file. Creates parent directories if needed. For modifying existing files, prefer edit_file instead.`,\n inputSchema: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Absolute or relative path to the file' },\n content: { type: 'string', description: 'The content to write to the file' },\n },\n required: ['file_path', 'content'],\n },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const filePath = String(input['file_path']);\n const content = String(input['content']);\n const resolved = path.resolve(filePath);\n\n try {\n const dir = path.dirname(resolved);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const existed = fs.existsSync(resolved);\n fs.writeFileSync(resolved, content, 'utf-8');\n\n const lines = content.split('\\n').length;\n const action = existed ? 'Overwrote' : 'Created';\n return makeToolResult(`${action} ${resolved} (${lines} lines)`, {\n filePath: resolved,\n linesChanged: lines,\n });\n } catch (err) {\n return makeToolError(`Failed to write file: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const fileEditTool: Tool = {\n name: 'edit_file',\n description: `Perform exact string replacement in a file. The old_string must be unique in the file unless replace_all is true. Preserves indentation exactly.`,\n inputSchema: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Path to the file to edit' },\n old_string: { type: 'string', description: 'The exact text to find and replace' },\n new_string: { type: 'string', description: 'The replacement text' },\n replace_all: { type: 'boolean', description: 'Replace all occurrences (default: false)', default: false },\n },\n required: ['file_path', 'old_string', 'new_string'],\n },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const filePath = String(input['file_path']);\n const oldString = String(input['old_string']);\n const newString = String(input['new_string']);\n const replaceAll = input['replace_all'] === true;\n\n const resolved = path.resolve(filePath);\n\n if (!fs.existsSync(resolved)) {\n return makeToolError(`File not found: ${resolved}`);\n }\n\n try {\n let content = fs.readFileSync(resolved, 'utf-8');\n\n if (oldString === newString) {\n return makeToolError('old_string and new_string are identical. No changes needed.');\n }\n\n if (!content.includes(oldString)) {\n // Try to find similar text for helpful error\n const lines = content.split('\\n');\n const oldLines = oldString.split('\\n');\n const firstOldLine = oldLines[0]?.trim();\n const similar = firstOldLine\n ? lines.find((l) => l.trim().includes(firstOldLine))\n : undefined;\n\n let errMsg = `old_string not found in ${resolved}.`;\n if (similar) {\n errMsg += `\\nDid you mean this line?\\n ${similar.trim()}`;\n }\n errMsg += '\\nMake sure old_string matches exactly including whitespace and indentation.';\n return makeToolError(errMsg);\n }\n\n if (!replaceAll) {\n const count = content.split(oldString).length - 1;\n if (count > 1) {\n return makeToolError(\n `old_string appears ${count} times in the file. Use replace_all: true to replace all, or provide more context to make it unique.`\n );\n }\n }\n\n if (replaceAll) {\n content = content.split(oldString).join(newString);\n } else {\n const idx = content.indexOf(oldString);\n content = content.slice(0, idx) + newString + content.slice(idx + oldString.length);\n }\n\n fs.writeFileSync(resolved, content, 'utf-8');\n\n const linesChanged = Math.max(\n oldString.split('\\n').length,\n newString.split('\\n').length\n );\n\n return makeToolResult(`Edited ${resolved}`, {\n filePath: resolved,\n linesChanged,\n });\n } catch (err) {\n return makeToolError(`Failed to edit file: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const fileMultiEditTool: Tool = {\n name: 'multi_edit',\n description: `Apply multiple edits to a single file atomically. Each edit is an old_string → new_string replacement. All edits are validated before any are applied.`,\n inputSchema: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Path to the file to edit' },\n edits: {\n type: 'array',\n description: 'Array of edits to apply',\n items: {\n type: 'object',\n properties: {\n old_string: { type: 'string', description: 'Text to find' },\n new_string: { type: 'string', description: 'Replacement text' },\n },\n required: ['old_string', 'new_string'],\n },\n },\n },\n required: ['file_path', 'edits'],\n },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const filePath = String(input['file_path']);\n const edits = input['edits'] as Array<{ old_string: string; new_string: string }>;\n const resolved = path.resolve(filePath);\n\n if (!fs.existsSync(resolved)) {\n return makeToolError(`File not found: ${resolved}`);\n }\n\n if (!Array.isArray(edits) || edits.length === 0) {\n return makeToolError('edits must be a non-empty array of {old_string, new_string} objects');\n }\n\n try {\n let content = fs.readFileSync(resolved, 'utf-8');\n\n // Validate all edits first\n for (let i = 0; i < edits.length; i++) {\n const edit = edits[i]!;\n if (!content.includes(edit.old_string)) {\n return makeToolError(\n `Edit ${i + 1}/${edits.length}: old_string not found in file. No edits applied.\\nSearching for: ${edit.old_string.slice(0, 100)}...`\n );\n }\n }\n\n // Apply edits sequentially\n let totalLinesChanged = 0;\n for (const edit of edits) {\n const idx = content.indexOf(edit.old_string);\n if (idx === -1) {\n return makeToolError(`Edit validation passed but old_string disappeared during application. This may happen if edits overlap.`);\n }\n content = content.slice(0, idx) + edit.new_string + content.slice(idx + edit.old_string.length);\n totalLinesChanged += Math.max(\n edit.old_string.split('\\n').length,\n edit.new_string.split('\\n').length\n );\n }\n\n fs.writeFileSync(resolved, content, 'utf-8');\n\n return makeToolResult(`Applied ${edits.length} edits to ${resolved}`, {\n filePath: resolved,\n linesChanged: totalLinesChanged,\n });\n } catch (err) {\n return makeToolError(`Failed to multi-edit: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { globby } from 'globby';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const globTool: Tool = {\n name: 'glob',\n description: `Fast file pattern matching. Supports glob patterns like \"**/*.ts\". Respects .gitignore. Returns matching file paths sorted by modification time.`,\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Glob pattern to match files (e.g., \"**/*.ts\", \"src/**/*.tsx\")' },\n path: { type: 'string', description: 'Directory to search in. Defaults to current working directory.' },\n },\n required: ['pattern'],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const pattern = String(input['pattern']);\n const searchPath = input['path'] ? String(input['path']) : process.cwd();\n const resolved = path.resolve(searchPath);\n\n try {\n const files = await globby(pattern, {\n cwd: resolved,\n gitignore: true,\n ignore: ['node_modules/**', '.git/**'],\n absolute: true,\n onlyFiles: true,\n });\n\n // Sort by modification time (most recent first)\n const withStats = files.map((f) => {\n try {\n const stat = fs.statSync(f);\n return { path: f, mtime: stat.mtimeMs };\n } catch {\n return { path: f, mtime: 0 };\n }\n });\n withStats.sort((a, b) => b.mtime - a.mtime);\n\n const result = withStats.map((f) => f.path);\n\n if (result.length === 0) {\n return makeToolResult(`No files matched pattern: ${pattern} in ${resolved}`);\n }\n\n return makeToolResult(\n `Found ${result.length} file(s):\\n${result.join('\\n')}`\n );\n } catch (err) {\n return makeToolError(`Glob failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import { execFile } from 'child_process';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const grepTool: Tool = {\n name: 'grep',\n description: `Search file contents using regex patterns. Uses ripgrep (rg) if available, falls back to grep. Supports context lines, file type filters, and multiple output modes.`,\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Regex pattern to search for' },\n path: { type: 'string', description: 'File or directory to search in' },\n glob: { type: 'string', description: 'Glob pattern to filter files (e.g., \"*.ts\")' },\n type: { type: 'string', description: 'File type filter (e.g., \"ts\", \"py\", \"js\")' },\n output_mode: {\n type: 'string',\n enum: ['content', 'files_with_matches', 'count'],\n description: 'Output mode: content (matching lines), files_with_matches (file paths only), count (match counts)',\n },\n '-A': { type: 'number', description: 'Lines to show after match' },\n '-B': { type: 'number', description: 'Lines to show before match' },\n '-C': { type: 'number', description: 'Context lines (before and after)' },\n '-i': { type: 'boolean', description: 'Case insensitive search' },\n '-n': { type: 'boolean', description: 'Show line numbers' },\n multiline: { type: 'boolean', description: 'Enable multiline matching' },\n head_limit: { type: 'number', description: 'Limit output to first N entries' },\n },\n required: ['pattern'],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const pattern = String(input['pattern']);\n const searchPath = path.resolve(input['path'] ? String(input['path']) : process.cwd());\n const outputMode = (input['output_mode'] as string) || 'files_with_matches';\n const headLimit = (input['head_limit'] as number) || 0;\n\n const args: string[] = [];\n\n // Try ripgrep first, fall back to grep\n const useRg = await hasCommand('rg');\n const cmd = useRg ? 'rg' : 'grep';\n\n if (!useRg) {\n args.push('-r'); // recursive for grep\n }\n\n // Output mode\n if (outputMode === 'files_with_matches') {\n args.push(useRg ? '-l' : '-l');\n } else if (outputMode === 'count') {\n args.push(useRg ? '-c' : '-c');\n }\n\n // Case insensitive\n if (input['-i']) args.push('-i');\n\n // Line numbers\n if (input['-n'] !== false && outputMode === 'content') {\n args.push('-n');\n }\n\n // Context\n if (input['-C']) args.push('-C', String(input['-C']));\n else if (input['-A']) args.push('-A', String(input['-A']));\n if (input['-B']) args.push('-B', String(input['-B']));\n\n // Multiline (rg only)\n if (input['multiline'] && useRg) {\n args.push('-U', '--multiline-dotall');\n }\n\n // File type filter\n if (input['type'] && useRg) {\n args.push('--type', String(input['type']));\n }\n\n // Glob filter\n if (input['glob'] && useRg) {\n args.push('--glob', String(input['glob']));\n }\n\n // Ignore common dirs\n if (useRg) {\n args.push('--no-ignore-vcs');\n args.push('-g', '!node_modules');\n args.push('-g', '!.git');\n }\n\n args.push(pattern, searchPath);\n\n try {\n const result = await runCommand(cmd, args);\n\n if (!result.trim()) {\n return makeToolResult(`No matches found for pattern: ${pattern}`);\n }\n\n let output = result;\n if (headLimit > 0) {\n const lines = output.split('\\n');\n output = lines.slice(0, headLimit).join('\\n');\n if (lines.length > headLimit) {\n output += `\\n... (${lines.length - headLimit} more results)`;\n }\n }\n\n return makeToolResult(output);\n } catch (err: any) {\n // grep/rg exit 1 means no matches\n if (err.code === 1) {\n return makeToolResult(`No matches found for pattern: ${pattern}`);\n }\n return makeToolError(`Search failed: ${err.message || String(err)}`);\n }\n },\n};\n\nfunction hasCommand(cmd: string): Promise<boolean> {\n return new Promise((resolve) => {\n execFile('which', [cmd], (err) => resolve(!err));\n });\n}\n\nfunction runCommand(cmd: string, args: string[]): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile(cmd, args, { maxBuffer: 10 * 1024 * 1024, timeout: 30_000 }, (err, stdout, stderr) => {\n if (err) {\n (err as any).code = err.code;\n reject(err);\n return;\n }\n resolve(stdout);\n });\n });\n}\n","import { exec, spawn } from 'child_process';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\n// Background tasks storage\nconst backgroundTasks: Map<string, {\n process: ReturnType<typeof spawn>;\n output: string;\n status: string;\n exitCode?: number;\n}> = new Map();\n\nlet taskCounter = 0;\n\nexport const bashTool: Tool = {\n name: 'bash',\n description: `Execute a bash command. Supports timeout (max 600s, default 120s) and background execution. The working directory persists between calls.`,\n inputSchema: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'The bash command to execute' },\n description: { type: 'string', description: 'Brief description of what the command does' },\n timeout: { type: 'number', description: 'Timeout in milliseconds (max 600000, default 120000)' },\n run_in_background: { type: 'boolean', description: 'Run in background and return a task ID' },\n },\n required: ['command'],\n },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const command = String(input['command']);\n const timeout = Math.min(Number(input['timeout']) || 120_000, 600_000);\n const runInBackground = input['run_in_background'] === true;\n\n if (!command.trim()) {\n return makeToolError('Command cannot be empty');\n }\n\n if (runInBackground) {\n return runBackgroundTask(command);\n }\n\n return new Promise((resolve) => {\n exec(command, {\n timeout,\n maxBuffer: 10 * 1024 * 1024,\n shell: process.env['SHELL'] || '/bin/bash',\n cwd: process.cwd(),\n env: { ...process.env },\n }, (err, stdout, stderr) => {\n if (err) {\n const exitCode = err.code;\n const output = [\n stdout ? `stdout:\\n${stdout}` : '',\n stderr ? `stderr:\\n${stderr}` : '',\n `Exit code: ${exitCode}`,\n ].filter(Boolean).join('\\n\\n');\n\n if ((err as any).killed) {\n resolve(makeToolError(`Command timed out after ${timeout / 1000}s\\n${output}`));\n } else {\n resolve(makeToolResult(output || `Command failed with exit code ${exitCode}`));\n }\n return;\n }\n\n const output = [\n stdout ? stdout : '',\n stderr ? `stderr:\\n${stderr}` : '',\n ].filter(Boolean).join('\\n');\n\n resolve(makeToolResult(output || '(no output)'));\n });\n });\n },\n};\n\nfunction runBackgroundTask(command: string): ToolResult {\n const taskId = `bg_${++taskCounter}`;\n\n const proc = spawn(command, {\n shell: process.env['SHELL'] || '/bin/bash',\n cwd: process.cwd(),\n env: { ...process.env },\n stdio: ['ignore', 'pipe', 'pipe'],\n detached: false,\n });\n\n const task: { process: ReturnType<typeof spawn>; output: string; status: string; exitCode?: number } = { process: proc, output: '', status: 'running', exitCode: undefined };\n backgroundTasks.set(taskId, task);\n\n proc.stdout?.on('data', (data) => {\n task.output += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n task.output += data.toString();\n });\n\n proc.on('close', (code) => {\n task.status = code === 0 ? 'done' : 'error';\n task.exitCode = code ?? 1;\n });\n\n proc.on('error', (err) => {\n task.status = 'error';\n task.output += `\\nProcess error: ${err.message}`;\n });\n\n return makeToolResult(`Background task started with ID: ${taskId}\\nUse task_output tool to check results.`);\n}\n\n// Utility to get background task output\nexport function getBackgroundTaskOutput(taskId: string): { status: string; output: string } | null {\n const task = backgroundTasks.get(taskId);\n if (!task) return null;\n return { status: task.status, output: task.output };\n}\n\nexport function stopBackgroundTask(taskId: string): boolean {\n const task = backgroundTasks.get(taskId);\n if (!task || task.status !== 'running') return false;\n try {\n task.process.kill('SIGTERM');\n task.status = 'done';\n return true;\n } catch {\n return false;\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const listDirTool: Tool = {\n name: 'list_dir',\n description: `List directory contents with file/folder distinction and basic metadata.`,\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Directory path to list (defaults to cwd)' },\n },\n required: [],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const dirPath = path.resolve(input['path'] ? String(input['path']) : process.cwd());\n\n if (!fs.existsSync(dirPath)) {\n return makeToolError(`Directory not found: ${dirPath}`);\n }\n\n const stat = fs.statSync(dirPath);\n if (!stat.isDirectory()) {\n return makeToolError(`Not a directory: ${dirPath}`);\n }\n\n try {\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\n const IGNORE = new Set(['.git', 'node_modules', '.DS_Store', '__pycache__', '.next', 'dist', 'build']);\n\n const lines: string[] = [];\n const dirs: string[] = [];\n const files: string[] = [];\n\n for (const entry of entries) {\n if (IGNORE.has(entry.name)) continue;\n\n if (entry.isDirectory()) {\n dirs.push(`${entry.name}/`);\n } else if (entry.isSymbolicLink()) {\n try {\n const target = fs.readlinkSync(path.join(dirPath, entry.name));\n files.push(`${entry.name} -> ${target}`);\n } catch {\n files.push(`${entry.name} -> (broken link)`);\n }\n } else {\n files.push(entry.name);\n }\n }\n\n // Directories first, then files\n dirs.sort();\n files.sort();\n lines.push(...dirs, ...files);\n\n if (lines.length === 0) {\n return makeToolResult(`Directory is empty: ${dirPath}`);\n }\n\n return makeToolResult(`${dirPath}\\n${lines.join('\\n')}`);\n } catch (err) {\n return makeToolError(`Failed to list directory: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import { execSync } from 'child_process';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const gitTool: Tool = {\n name: 'git',\n description: `Execute git commands with safety checks. Blocks dangerous operations like force push, hard reset, and amend. Use for status, diff, log, commit, branch operations.`,\n inputSchema: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Git subcommand and arguments (e.g., \"status\", \"diff HEAD\", \"log --oneline -10\")' },\n },\n required: ['command'],\n },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const command = String(input['command']).trim();\n\n // Safety checks\n const blocked = [\n { pattern: /push\\s+.*--force/, msg: 'Force push is blocked for safety. Use regular push.' },\n { pattern: /push\\s+.*-f\\b/, msg: 'Force push (-f) is blocked for safety.' },\n { pattern: /reset\\s+--hard/, msg: 'Hard reset is blocked. Use soft reset or create a new commit.' },\n { pattern: /clean\\s+-f/, msg: 'git clean -f is blocked. Manually review files to remove.' },\n { pattern: /checkout\\s+\\.\\s*$/, msg: 'git checkout . discards all changes. Use more specific paths.' },\n { pattern: /branch\\s+-D/, msg: 'Force branch deletion is blocked. Use -d for safe deletion.' },\n { pattern: /\\b-i\\b/, msg: 'Interactive mode (-i) is not supported in non-interactive context.' },\n { pattern: /commit\\s+.*--amend/, msg: 'Amending commits is blocked. Create a new commit instead.' },\n { pattern: /--no-verify/, msg: 'Skipping hooks (--no-verify) is blocked.' },\n ];\n\n for (const check of blocked) {\n if (check.pattern.test(command)) {\n return makeToolError(check.msg);\n }\n }\n\n // Read-only commands don't need special handling\n const readOnlyPrefixes = ['status', 'diff', 'log', 'show', 'branch', 'tag', 'remote', 'stash list', 'ls-files'];\n const isReadOnly = readOnlyPrefixes.some((p) => command.startsWith(p));\n\n try {\n const result = execSync(`git ${command}`, {\n encoding: 'utf-8',\n maxBuffer: 10 * 1024 * 1024,\n timeout: 30_000,\n cwd: process.cwd(),\n });\n\n return makeToolResult(result || '(no output)');\n } catch (err: any) {\n const output = [err.stdout, err.stderr].filter(Boolean).join('\\n');\n return makeToolError(`git ${command} failed:\\n${output || err.message}`);\n }\n },\n};\n","import type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\n// Simple in-memory cache\nconst cache: Map<string, { content: string; timestamp: number }> = new Map();\nconst CACHE_TTL = 15 * 60 * 1000; // 15 minutes\n\nexport const webFetchTool: Tool = {\n name: 'web_fetch',\n description: `Fetch content from a URL, convert HTML to text, and return the content. Includes a 15-minute cache. HTTP URLs are upgraded to HTTPS.`,\n inputSchema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'URL to fetch' },\n prompt: { type: 'string', description: 'What information to extract from the page' },\n },\n required: ['url', 'prompt'],\n },\n dangerous: true,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n let url = String(input['url']);\n const prompt = String(input['prompt'] || '');\n\n // Upgrade HTTP to HTTPS\n if (url.startsWith('http://')) {\n url = url.replace('http://', 'https://');\n }\n\n // Check cache\n const cached = cache.get(url);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n return makeToolResult(`[Cached] ${prompt ? `Query: ${prompt}\\n\\n` : ''}${cached.content}`);\n }\n\n try {\n const response = await fetch(url, {\n headers: {\n 'User-Agent': 'Codi/0.1 (AI Code Agent)',\n 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',\n },\n redirect: 'follow',\n signal: AbortSignal.timeout(30_000),\n });\n\n if (!response.ok) {\n return makeToolError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const contentType = response.headers.get('content-type') || '';\n let text: string;\n\n if (contentType.includes('text/html') || contentType.includes('application/xhtml')) {\n const html = await response.text();\n const { load } = await import('cheerio');\n const $ = load(html);\n\n // Remove script, style, nav, header, footer\n $('script, style, nav, header, footer, iframe, noscript').remove();\n\n // Extract text from main content\n const main = $('main, article, .content, #content, .main').first();\n text = (main.length ? main.text() : $('body').text())\n .replace(/\\s+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n } else {\n text = await response.text();\n }\n\n // Truncate if too long\n const MAX_LEN = 50_000;\n if (text.length > MAX_LEN) {\n text = text.slice(0, MAX_LEN) + '\\n\\n... (truncated)';\n }\n\n // Cache the result\n cache.set(url, { content: text, timestamp: Date.now() });\n\n return makeToolResult(prompt ? `URL: ${url}\\nQuery: ${prompt}\\n\\n${text}` : text);\n } catch (err) {\n return makeToolError(`Failed to fetch URL: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const webSearchTool: Tool = {\n name: 'web_search',\n description: `Search the web for information. Returns search results with titles, URLs, and snippets. Uses DuckDuckGo as the search engine.`,\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n },\n required: ['query'],\n },\n dangerous: true,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const query = String(input['query']);\n\n try {\n // Use DuckDuckGo HTML search\n const encoded = encodeURIComponent(query);\n const url = `https://html.duckduckgo.com/html/?q=${encoded}`;\n\n const response = await fetch(url, {\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; Codi/0.1)',\n },\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!response.ok) {\n return makeToolError(`Search failed: HTTP ${response.status}`);\n }\n\n const html = await response.text();\n const { load } = await import('cheerio');\n const $ = load(html);\n\n const results: Array<{ title: string; url: string; snippet: string }> = [];\n\n $('.result').each((i, el) => {\n if (i >= 10) return false;\n const $el = $(el);\n const title = $el.find('.result__title a').text().trim();\n const href = $el.find('.result__title a').attr('href') || '';\n const snippet = $el.find('.result__snippet').text().trim();\n\n if (title && href) {\n // Extract actual URL from DuckDuckGo redirect\n let actualUrl = href;\n try {\n const urlObj = new URL(href, 'https://duckduckgo.com');\n actualUrl = urlObj.searchParams.get('uddg') || href;\n } catch {\n actualUrl = href;\n }\n results.push({ title, url: actualUrl, snippet });\n }\n });\n\n if (results.length === 0) {\n return makeToolResult(`No results found for: ${query}`);\n }\n\n const formatted = results\n .map((r, i) => `${i + 1}. ${r.title}\\n ${r.url}\\n ${r.snippet}`)\n .join('\\n\\n');\n\n return makeToolResult(`Search results for: ${query}\\n\\n${formatted}`);\n } catch (err) {\n return makeToolError(`Search failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const notebookEditTool: Tool = {\n name: 'notebook_edit',\n description: `Edit Jupyter notebook (.ipynb) cells. Supports replacing, inserting, and deleting cells.`,\n inputSchema: {\n type: 'object',\n properties: {\n notebook_path: { type: 'string', description: 'Path to the .ipynb file' },\n cell_number: { type: 'number', description: 'Cell index (0-based)' },\n new_source: { type: 'string', description: 'New source content for the cell' },\n cell_type: { type: 'string', enum: ['code', 'markdown'], description: 'Cell type (for insert)' },\n edit_mode: { type: 'string', enum: ['replace', 'insert', 'delete'], description: 'Edit mode (default: replace)' },\n },\n required: ['notebook_path', 'new_source'],\n },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const nbPath = path.resolve(String(input['notebook_path']));\n const cellNumber = input['cell_number'] as number | undefined;\n const newSource = String(input['new_source']);\n const cellType = (input['cell_type'] as string) || 'code';\n const editMode = (input['edit_mode'] as string) || 'replace';\n\n if (!fs.existsSync(nbPath)) {\n return makeToolError(`Notebook not found: ${nbPath}`);\n }\n\n try {\n const content = fs.readFileSync(nbPath, 'utf-8');\n const nb = JSON.parse(content);\n\n if (!nb.cells || !Array.isArray(nb.cells)) {\n return makeToolError('Invalid notebook format: no cells array');\n }\n\n const sourceLines = newSource.split('\\n').map((l, i, arr) =>\n i < arr.length - 1 ? l + '\\n' : l\n );\n\n switch (editMode) {\n case 'replace': {\n const idx = cellNumber ?? 0;\n if (idx < 0 || idx >= nb.cells.length) {\n return makeToolError(`Cell index ${idx} out of range (0-${nb.cells.length - 1})`);\n }\n nb.cells[idx].source = sourceLines;\n if (input['cell_type']) {\n nb.cells[idx].cell_type = cellType;\n }\n break;\n }\n case 'insert': {\n const idx = cellNumber !== undefined ? cellNumber + 1 : nb.cells.length;\n const newCell: Record<string, unknown> = {\n cell_type: cellType,\n source: sourceLines,\n metadata: {},\n };\n if (cellType === 'code') {\n newCell['execution_count'] = null;\n newCell['outputs'] = [];\n }\n nb.cells.splice(idx, 0, newCell);\n break;\n }\n case 'delete': {\n const idx = cellNumber ?? 0;\n if (idx < 0 || idx >= nb.cells.length) {\n return makeToolError(`Cell index ${idx} out of range (0-${nb.cells.length - 1})`);\n }\n nb.cells.splice(idx, 1);\n break;\n }\n default:\n return makeToolError(`Unknown edit_mode: ${editMode}`);\n }\n\n fs.writeFileSync(nbPath, JSON.stringify(nb, null, 1), 'utf-8');\n return makeToolResult(`Notebook ${editMode}d cell in ${nbPath} (${nb.cells.length} cells total)`);\n } catch (err) {\n return makeToolError(`Notebook edit failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import * as readline from 'node:readline/promises';\nimport chalk from 'chalk';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const askUserTool: Tool = {\n name: 'ask_user',\n description: `Ask the user a question with optional choices. Use to gather preferences, clarify requirements, or get decisions.`,\n inputSchema: {\n type: 'object',\n properties: {\n question: { type: 'string', description: 'The question to ask' },\n options: {\n type: 'array',\n description: 'Optional choices for the user',\n items: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Option label' },\n description: { type: 'string', description: 'Option description' },\n },\n required: ['label'],\n },\n },\n multiSelect: { type: 'boolean', description: 'Allow multiple selections' },\n },\n required: ['question'],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const question = String(input['question']);\n const options = input['options'] as Array<{ label: string; description?: string }> | undefined;\n const multiSelect = input['multiSelect'] === true;\n\n console.log('');\n console.log(chalk.cyan.bold('? ') + chalk.bold(question));\n\n if (options && options.length > 0) {\n console.log('');\n for (let i = 0; i < options.length; i++) {\n const opt = options[i]!;\n console.log(chalk.cyan(` ${i + 1}.`) + ` ${opt.label}${opt.description ? chalk.dim(` - ${opt.description}`) : ''}`);\n }\n console.log(chalk.dim(` ${options.length + 1}. Other (type custom response)`));\n console.log('');\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const prompt = multiSelect\n ? chalk.dim('Enter numbers separated by commas: ')\n : chalk.dim('Enter number or type response: ');\n\n const answer = await rl.question(prompt);\n rl.close();\n\n if (multiSelect) {\n const indices = answer.split(',').map((s) => parseInt(s.trim()) - 1);\n const selected = indices\n .filter((i) => i >= 0 && i < options.length)\n .map((i) => options[i]!.label);\n\n if (selected.length === 0) {\n return makeToolResult(`User response: ${answer}`);\n }\n return makeToolResult(`User selected: ${selected.join(', ')}`);\n }\n\n const idx = parseInt(answer) - 1;\n if (idx >= 0 && idx < options.length) {\n return makeToolResult(`User selected: ${options[idx]!.label}`);\n }\n\n return makeToolResult(`User response: ${answer}`);\n } catch {\n rl.close();\n return makeToolError('Failed to get user input');\n }\n }\n\n // Free-form question\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const answer = await rl.question(chalk.dim('> '));\n rl.close();\n return makeToolResult(`User response: ${answer}`);\n } catch {\n rl.close();\n return makeToolError('Failed to get user input');\n }\n },\n};\n","import Anthropic from '@anthropic-ai/sdk';\nimport type { LlmProvider } from './provider.js';\nimport type {\n LlmRequestOptions,\n LlmResponse,\n ContentBlock,\n ToolCall,\n Message,\n} from './types.js';\n\nexport class AnthropicProvider implements LlmProvider {\n readonly name = 'anthropic';\n model: string;\n private client: Anthropic;\n private maxTokens: number;\n\n constructor(config: { apiKey?: string; model?: string; maxTokens?: number; baseUrl?: string }) {\n this.client = new Anthropic({\n apiKey: config.apiKey || process.env['ANTHROPIC_API_KEY'],\n ...(config.baseUrl ? { baseURL: config.baseUrl } : {}),\n });\n this.model = config.model || 'claude-sonnet-4-20250514';\n this.maxTokens = config.maxTokens || 8192;\n }\n\n setModel(model: string): void {\n this.model = model;\n }\n\n async listModels(): Promise<string[]> {\n return [\n 'claude-opus-4-20250514',\n 'claude-sonnet-4-20250514',\n 'claude-haiku-3-5-20241022',\n ];\n }\n\n async chat(options: LlmRequestOptions): Promise<LlmResponse> {\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.input_schema as Anthropic.Tool.InputSchema,\n }));\n\n if (options.stream && options.callbacks) {\n return this.streamChat(messages, options);\n }\n\n const response = await this.client.messages.create({\n model: this.model,\n max_tokens: options.maxTokens || this.maxTokens,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options.systemPrompt ? { system: options.systemPrompt } : {}),\n messages,\n ...(tools && tools.length > 0 ? { tools } : {}),\n });\n\n return this.parseResponse(response);\n }\n\n private async streamChat(\n messages: Anthropic.MessageParam[],\n options: LlmRequestOptions\n ): Promise<LlmResponse> {\n const tools = options.tools?.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema as Anthropic.Tool.InputSchema,\n }));\n\n const stream = this.client.messages.stream({\n model: this.model,\n max_tokens: options.maxTokens || this.maxTokens,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options.systemPrompt ? { system: options.systemPrompt } : {}),\n messages,\n ...(tools && tools.length > 0 ? { tools } : {}),\n });\n\n stream.on('text', (text) => {\n options.callbacks?.onToken?.(text);\n });\n\n const response = await stream.finalMessage();\n return this.parseResponse(response);\n }\n\n private convertMessages(messages: Message[]): 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\n const blocks: Anthropic.ContentBlockParam[] = m.content.map((block) => {\n switch (block.type) {\n case 'text':\n return { type: 'text' as const, text: block.text };\n case 'image':\n return {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: block.source.media_type as 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp',\n data: block.source.data,\n },\n };\n case 'tool_use':\n return {\n type: 'tool_use' as const,\n id: block.id,\n name: block.name,\n input: block.input,\n };\n case 'tool_result':\n return {\n type: 'tool_result' as const,\n tool_use_id: block.tool_use_id,\n content: typeof block.content === 'string' ? block.content : JSON.stringify(block.content),\n ...(block.is_error ? { is_error: true } : {}),\n };\n default:\n return { type: 'text' as const, text: JSON.stringify(block) };\n }\n });\n\n return { role: m.role as 'user' | 'assistant', content: blocks };\n });\n }\n\n private parseResponse(response: Anthropic.Message): LlmResponse {\n const content: ContentBlock[] = [];\n const toolCalls: ToolCall[] = [];\n let text = '';\n\n for (const block of response.content) {\n if (block.type === 'text') {\n content.push({ type: 'text', text: block.text });\n text += block.text;\n } else if (block.type === 'tool_use') {\n const tc: ToolCall = {\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n };\n content.push({\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n });\n toolCalls.push(tc);\n }\n }\n\n return {\n content,\n text: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n usage: {\n input_tokens: response.usage.input_tokens,\n output_tokens: response.usage.output_tokens,\n },\n stopReason: response.stop_reason as LlmResponse['stopReason'],\n };\n }\n}\n","import OpenAI from 'openai';\nimport type { LlmProvider } from './provider.js';\nimport type {\n LlmRequestOptions,\n LlmResponse,\n ContentBlock,\n ToolCall,\n Message,\n} from './types.js';\n\nexport class OpenAIProvider implements LlmProvider {\n readonly name = 'openai';\n model: string;\n private client: OpenAI;\n private maxTokens: number;\n\n constructor(config: { apiKey?: string; model?: string; maxTokens?: number; baseUrl?: string }) {\n this.client = new OpenAI({\n apiKey: config.apiKey || process.env['OPENAI_API_KEY'],\n ...(config.baseUrl ? { baseURL: config.baseUrl } : {}),\n });\n this.model = config.model || 'gpt-4o';\n this.maxTokens = config.maxTokens || 8192;\n }\n\n setModel(model: string): void {\n this.model = model;\n }\n\n async listModels(): Promise<string[]> {\n try {\n const models = await this.client.models.list();\n return models.data\n .filter((m) => m.id.startsWith('gpt-'))\n .map((m) => m.id)\n .sort();\n } catch {\n return ['gpt-4o', 'gpt-4o-mini', 'gpt-4.1', 'gpt-4.1-mini', 'gpt-4.1-nano'];\n }\n }\n\n async chat(options: LlmRequestOptions): Promise<LlmResponse> {\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.input_schema,\n },\n }));\n\n if (options.stream && options.callbacks) {\n return this.streamChat(messages, tools, options);\n }\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n max_tokens: options.maxTokens || this.maxTokens,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(tools && tools.length > 0 ? { tools } : {}),\n });\n\n return this.parseResponse(response);\n }\n\n private async streamChat(\n messages: OpenAI.ChatCompletionMessageParam[],\n tools: OpenAI.ChatCompletionTool[] | undefined,\n options: LlmRequestOptions\n ): Promise<LlmResponse> {\n const stream = await this.client.chat.completions.create({\n model: this.model,\n messages,\n max_tokens: options.maxTokens || this.maxTokens,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(tools && tools.length > 0 ? { tools } : {}),\n stream: true,\n });\n\n const content: ContentBlock[] = [];\n const toolCalls: ToolCall[] = [];\n let text = '';\n const toolCallAccumulator: Map<number, { id: string; name: string; args: string }> = new Map();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n text += delta.content;\n options.callbacks?.onToken?.(delta.content);\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n if (!toolCallAccumulator.has(idx)) {\n toolCallAccumulator.set(idx, { id: tc.id || '', name: tc.function?.name || '', args: '' });\n }\n const acc = toolCallAccumulator.get(idx)!;\n if (tc.id) acc.id = tc.id;\n if (tc.function?.name) acc.name = tc.function.name;\n if (tc.function?.arguments) acc.args += tc.function.arguments;\n }\n }\n }\n\n if (text) {\n content.push({ type: 'text', text });\n }\n\n for (const [, acc] of toolCallAccumulator) {\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(acc.args);\n } catch {}\n const tc: ToolCall = { id: acc.id, name: acc.name, input };\n toolCalls.push(tc);\n content.push({ type: 'tool_use', id: acc.id, name: acc.name, input });\n }\n\n return {\n content,\n text: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n stopReason: toolCalls.length > 0 ? 'tool_use' : 'end_turn',\n };\n }\n\n private convertMessages(\n messages: Message[],\n systemPrompt?: string\n ): OpenAI.ChatCompletionMessageParam[] {\n const result: OpenAI.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 : JSON.stringify(m.content) });\n continue;\n }\n\n if (typeof m.content === 'string') {\n result.push({ role: m.role as 'user' | 'assistant', content: m.content });\n continue;\n }\n\n // Handle content blocks\n const hasToolResults = m.content.some((b) => b.type === 'tool_result');\n if (hasToolResults) {\n for (const block of m.content) {\n if (block.type === 'tool_result') {\n result.push({\n role: 'tool',\n tool_call_id: block.tool_use_id,\n content: typeof block.content === 'string' ? block.content : JSON.stringify(block.content),\n });\n }\n }\n continue;\n }\n\n const hasToolUse = m.content.some((b) => b.type === 'tool_use');\n if (hasToolUse) {\n const toolCalls: OpenAI.ChatCompletionMessageToolCall[] = [];\n let textContent = '';\n for (const block of m.content) {\n if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n type: 'function',\n function: {\n name: block.name,\n arguments: JSON.stringify(block.input),\n },\n });\n } else if (block.type === 'text') {\n textContent += block.text;\n }\n }\n result.push({\n role: 'assistant',\n content: textContent || null,\n tool_calls: toolCalls,\n });\n continue;\n }\n\n // Regular content blocks\n const parts: OpenAI.ChatCompletionContentPart[] = m.content\n .filter((b): b is Extract<ContentBlock, { type: 'text' | 'image' }> =>\n b.type === 'text' || b.type === 'image'\n )\n .map((b) => {\n if (b.type === 'text') return { type: 'text' as const, text: b.text };\n return {\n type: 'image_url' as const,\n image_url: { url: `data:${b.source.media_type};base64,${b.source.data}` },\n };\n });\n\n if (m.role === 'user') {\n result.push({ role: 'user' as const, content: parts });\n } else {\n const textContent = parts.filter((p): p is OpenAI.ChatCompletionContentPartText => p.type === 'text').map(p => p.text).join('');\n result.push({ role: 'assistant' as const, content: textContent || null });\n }\n }\n\n return result;\n }\n\n private parseResponse(response: OpenAI.ChatCompletion): LlmResponse {\n const choice = response.choices[0];\n if (!choice) {\n return { content: [], stopReason: 'end_turn' };\n }\n\n const content: ContentBlock[] = [];\n const toolCalls: ToolCall[] = [];\n let text = '';\n\n if (choice.message.content) {\n text = choice.message.content;\n content.push({ type: 'text', text });\n }\n\n if (choice.message.tool_calls) {\n for (const tc of choice.message.tool_calls) {\n if (tc.type !== 'function') continue;\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {}\n toolCalls.push({ id: tc.id, name: tc.function.name, input });\n content.push({ type: 'tool_use', id: tc.id, name: tc.function.name, input });\n }\n }\n\n return {\n content,\n text: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n usage: response.usage\n ? {\n input_tokens: response.usage.prompt_tokens,\n output_tokens: response.usage.completion_tokens,\n }\n : undefined,\n stopReason: choice.finish_reason === 'tool_calls' ? 'tool_use' : choice.finish_reason === 'length' ? 'max_tokens' : 'end_turn',\n };\n }\n}\n","import { Ollama } from 'ollama';\nimport type { LlmProvider } from './provider.js';\nimport type {\n LlmRequestOptions,\n LlmResponse,\n ContentBlock,\n ToolCall,\n Message,\n} from './types.js';\n\nexport class OllamaProvider implements LlmProvider {\n readonly name = 'ollama';\n model: string;\n private client: Ollama;\n private maxTokens: number;\n\n constructor(config: { model?: string; maxTokens?: number; baseUrl?: string }) {\n this.client = new Ollama({\n host: config.baseUrl || process.env['OLLAMA_HOST'] || 'http://localhost:11434',\n });\n this.model = config.model || 'llama3.1';\n this.maxTokens = config.maxTokens || 4096;\n }\n\n setModel(model: string): void {\n this.model = model;\n }\n\n async listModels(): Promise<string[]> {\n try {\n const models = await this.client.list();\n return models.models.map((m) => m.name);\n } catch {\n return [];\n }\n }\n\n async chat(options: LlmRequestOptions): Promise<LlmResponse> {\n const messages = this.convertMessages(options.messages, options.systemPrompt);\n\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.input_schema,\n },\n }));\n\n if (options.stream && options.callbacks) {\n return this.streamChat(messages, tools, options);\n }\n\n const response = await this.client.chat({\n model: this.model,\n messages,\n ...(tools && tools.length > 0 ? { tools } : {}),\n options: {\n num_predict: options.maxTokens || this.maxTokens,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n },\n });\n\n return this.parseResponse(response);\n }\n\n private async streamChat(\n messages: any[],\n tools: any[] | undefined,\n options: LlmRequestOptions\n ): Promise<LlmResponse> {\n const response = await this.client.chat({\n model: this.model,\n messages,\n ...(tools && tools.length > 0 ? { tools } : {}),\n stream: true,\n options: {\n num_predict: options.maxTokens || this.maxTokens,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n },\n });\n\n let text = '';\n const toolCalls: ToolCall[] = [];\n\n for await (const chunk of response) {\n if (chunk.message?.content) {\n text += chunk.message.content;\n options.callbacks?.onToken?.(chunk.message.content);\n }\n\n if (chunk.message?.tool_calls) {\n for (const tc of chunk.message.tool_calls) {\n toolCalls.push({\n id: `ollama_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n name: tc.function.name,\n input: tc.function.arguments as Record<string, unknown>,\n });\n }\n }\n }\n\n const content: ContentBlock[] = [];\n if (text) content.push({ type: 'text', text });\n for (const tc of toolCalls) {\n content.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.input });\n }\n\n return {\n content,\n text: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n stopReason: toolCalls.length > 0 ? 'tool_use' : 'end_turn',\n };\n }\n\n private convertMessages(messages: Message[], systemPrompt?: string): any[] {\n const result: any[] = [];\n\n if (systemPrompt) {\n result.push({ role: 'system', content: systemPrompt });\n }\n\n for (const m of messages) {\n if (typeof m.content === 'string') {\n result.push({ role: m.role, content: m.content });\n continue;\n }\n\n // Flatten content blocks for Ollama\n const textParts: string[] = [];\n const images: string[] = [];\n\n for (const block of m.content) {\n if (block.type === 'text') {\n textParts.push(block.text);\n } else if (block.type === 'image') {\n images.push(block.source.data);\n } else if (block.type === 'tool_result') {\n textParts.push(`[Tool Result: ${typeof block.content === 'string' ? block.content : JSON.stringify(block.content)}]`);\n } else if (block.type === 'tool_use') {\n textParts.push(`[Tool Call: ${block.name}(${JSON.stringify(block.input)})]`);\n }\n }\n\n result.push({\n role: m.role,\n content: textParts.join('\\n'),\n ...(images.length > 0 ? { images } : {}),\n });\n }\n\n return result;\n }\n\n private parseResponse(response: any): LlmResponse {\n const content: ContentBlock[] = [];\n const toolCalls: ToolCall[] = [];\n let text = '';\n\n if (response.message?.content) {\n text = response.message.content;\n content.push({ type: 'text', text });\n }\n\n if (response.message?.tool_calls) {\n for (const tc of response.message.tool_calls) {\n const toolCall: ToolCall = {\n id: `ollama_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n name: tc.function.name,\n input: tc.function.arguments as Record<string, unknown>,\n };\n toolCalls.push(toolCall);\n content.push({ type: 'tool_use', ...toolCall });\n }\n }\n\n return {\n content,\n text: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n usage: response.eval_count\n ? { input_tokens: response.prompt_eval_count ?? 0, output_tokens: response.eval_count }\n : undefined,\n stopReason: toolCalls.length > 0 ? 'tool_use' : 'end_turn',\n };\n }\n}\n"],"mappings":"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","names":["chalk","output","input","chalk","path","fs","path","readline","input","output","chalk","chalk","fs","path","input","output","chalk","resolve","readFileSync","chalk","input","chalk","chalk","resolve","execSync","fs","path","fs","path","crypto","execSync","execSync","fs","path","readline","chalk","input","currentMode","input","currentMode","chalk","resolve","output","fs","path","chalk","input","chalk","input","input","fs","path","chalk","chalk","taskManager","execSync","renderDiff","fs","path","input","output","fs","path","input","fs","path","input","fs","path","input","edit","fs","path","input","path","input","output","resolve","exec","input","resolve","output","fs","path","input","execSync","input","output","input","main","input","fs","path","input","readline","chalk","input","rl","input","chalk","subAgentHandler","input","args"]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/ui/renderer.ts","../src/tools/tool.ts","../src/tools/task-tools.ts","../src/cli.ts","../src/setup-wizard.ts","../src/config/config.ts","../src/repl.ts","../src/ui/keybindings.ts","../src/ui/status-line.ts","../src/ui/completer.ts","../src/agent/agent-loop.ts","../src/agent/conversation.ts","../src/tools/executor.ts","../src/agent/token-tracker.ts","../src/llm/types.ts","../src/ui/spinner.ts","../src/agent/system-prompt.ts","../src/agent/context-compressor.ts","../src/agent/memory.ts","../src/agent/session.ts","../src/agent/checkpoint.ts","../src/agent/codi-md.ts","../src/agent/mode-manager.ts","../src/tools/registry.ts","../src/security/permission-manager.ts","../src/config/permissions.ts","../src/hooks/hook-manager.ts","../src/mcp/mcp-manager.ts","../src/agent/sub-agent.ts","../src/tools/sub-agent-tool.ts","../src/config/slash-commands.ts","../src/tools/file-read.ts","../src/tools/file-write.ts","../src/tools/file-edit.ts","../src/tools/file-multi-edit.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/bash.ts","../src/tools/list-dir.ts","../src/tools/git.ts","../src/tools/web-fetch.ts","../src/tools/web-search.ts","../src/tools/notebook-edit.ts","../src/tools/ask-user.ts","../src/llm/anthropic.ts","../src/llm/openai.ts","../src/llm/ollama.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import chalk from 'chalk';\nimport { marked } from 'marked';\nimport TerminalRenderer from 'marked-terminal';\nimport { highlight } from 'cli-highlight';\nimport { createTwoFilesPatch } from 'diff';\n\n// marked-terminal exports a constructor that creates a marked renderer\nconst renderer = new (TerminalRenderer as any)({\n codespan: chalk.cyan,\n strong: chalk.bold,\n em: chalk.italic,\n heading: chalk.green.bold,\n firstHeading: chalk.magenta.underline.bold,\n code: chalk.yellow,\n link: chalk.blue,\n href: chalk.blue.underline,\n unescape: true,\n emoji: false,\n width: process.stdout.columns || 100,\n tab: 2,\n});\n\nmarked.setOptions({ renderer });\n\nexport function renderMarkdown(text: string): string {\n try {\n const rendered = marked.parse(text);\n return (typeof rendered === 'string' ? rendered : '').trimEnd();\n } catch {\n return text;\n }\n}\n\nexport function renderDiff(filePath: string, oldContent: string, newContent: string): string {\n // If all three params are strings and oldContent/newContent look like a diff, render directly\n if (!filePath && !oldContent && newContent) {\n return colorDiffLines(newContent);\n }\n\n const patch = createTwoFilesPatch(\n `a/${filePath}`,\n `b/${filePath}`,\n oldContent,\n newContent,\n '',\n '',\n { context: 3 }\n );\n\n return colorDiffLines(patch);\n}\n\nfunction colorDiffLines(text: string): string {\n return text\n .split('\\n')\n .map((line) => {\n if (line.startsWith('+++') || line.startsWith('---')) {\n return chalk.bold(line);\n }\n if (line.startsWith('+')) {\n return chalk.green(line);\n }\n if (line.startsWith('-')) {\n return chalk.red(line);\n }\n if (line.startsWith('@@')) {\n return chalk.cyan(line);\n }\n return chalk.dim(line);\n })\n .join('\\n');\n}\n\nexport function renderCodeBlock(code: string, language?: string): string {\n try {\n return highlight(code, { language, ignoreIllegals: true });\n } catch {\n return chalk.cyan(code);\n }\n}\n\nexport function renderToolCall(toolName: string, args: Record<string, unknown>): string {\n const header = chalk.yellow(`⚡ ${toolName}`);\n const argStr = Object.entries(args)\n .map(([k, v]) => {\n const val = typeof v === 'string' && v.length > 100 ? v.slice(0, 100) + '...' : String(v);\n return chalk.dim(` ${k}: `) + val;\n })\n .join('\\n');\n return `${header}\\n${argStr}`;\n}\n\nexport function renderToolResult(toolName: string, result: string, isError: boolean): string {\n const icon = isError ? chalk.red('✗') : chalk.green('✓');\n const header = `${icon} ${chalk.yellow(toolName)}`;\n const content = isError ? chalk.red(result) : chalk.dim(result);\n const maxLen = 500;\n const truncated = content.length > maxLen ? content.slice(0, maxLen) + chalk.dim('\\n... (truncated)') : content;\n return `${header}\\n${truncated}`;\n}\n\nexport function renderError(message: string): string {\n return chalk.red(`✗ ${message}`);\n}\n\nexport function renderWarning(message: string): string {\n return chalk.yellow(`⚠ ${message}`);\n}\n\nexport function renderInfo(message: string): string {\n return chalk.blue(`ℹ ${message}`);\n}\n\nexport function renderSuccess(message: string): string {\n return chalk.green(`✓ ${message}`);\n}\n\nexport function renderUserMessage(message: string): string {\n return chalk.white(message);\n}\n\nexport function renderAssistantPrefix(): string {\n return chalk.green.bold('codi');\n}\n\nexport function renderPrompt(): string {\n return chalk.cyan.bold('codi > ');\n}\n","export interface ToolResult {\n success: boolean;\n output: string;\n error?: string;\n metadata?: {\n filePath?: string;\n linesChanged?: number;\n tokensUsed?: number;\n isImage?: boolean;\n imageData?: string;\n imageMimeType?: string;\n };\n}\n\nexport interface Tool {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n dangerous: boolean;\n readOnly: boolean;\n execute(input: Record<string, unknown>): Promise<ToolResult>;\n}\n\nexport function makeToolResult(output: string, metadata?: ToolResult['metadata']): ToolResult {\n return { success: true, output, metadata };\n}\n\nexport function makeToolError(error: string, metadata?: ToolResult['metadata']): ToolResult {\n return { success: false, output: error, error, metadata };\n}\n","import type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport interface Task {\n id: string;\n subject: string;\n description: string;\n activeForm?: string;\n status: 'pending' | 'in_progress' | 'completed' | 'deleted';\n owner?: string;\n blocks: string[];\n blockedBy: string[];\n metadata: Record<string, unknown>;\n createdAt: number;\n updatedAt: number;\n}\n\nclass TaskManager {\n private tasks: Map<string, Task> = new Map();\n private nextId = 1;\n\n create(subject: string, description: string, activeForm?: string): Task {\n const id = String(this.nextId++);\n const task: Task = {\n id,\n subject,\n description,\n activeForm,\n status: 'pending',\n blocks: [],\n blockedBy: [],\n metadata: {},\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n this.tasks.set(id, task);\n return task;\n }\n\n get(id: string): Task | undefined {\n return this.tasks.get(id);\n }\n\n update(id: string, updates: Partial<Task> & {\n addBlocks?: string[];\n addBlockedBy?: string[];\n }): Task | undefined {\n const task = this.tasks.get(id);\n if (!task) return undefined;\n\n if (updates.status) task.status = updates.status;\n if (updates.subject) task.subject = updates.subject;\n if (updates.description) task.description = updates.description;\n if (updates.activeForm) task.activeForm = updates.activeForm;\n if (updates.owner) task.owner = updates.owner;\n if (updates.metadata) Object.assign(task.metadata, updates.metadata);\n\n if (updates.addBlocks) {\n task.blocks = [...new Set([...task.blocks, ...updates.addBlocks])];\n }\n if (updates.addBlockedBy) {\n task.blockedBy = [...new Set([...task.blockedBy, ...updates.addBlockedBy])];\n }\n\n if (updates.status === 'deleted') {\n this.tasks.delete(id);\n }\n\n task.updatedAt = Date.now();\n return task;\n }\n\n list(): Task[] {\n return [...this.tasks.values()].filter((t) => t.status !== 'deleted');\n }\n}\n\nexport const taskManager = new TaskManager();\n\nfunction formatTask(task: Task): string {\n const lines = [\n `#${task.id} [${task.status}] ${task.subject}`,\n ];\n if (task.description) lines.push(` ${task.description}`);\n if (task.owner) lines.push(` Owner: ${task.owner}`);\n if (task.blocks.length) lines.push(` Blocks: ${task.blocks.join(', ')}`);\n if (task.blockedBy.length) lines.push(` Blocked by: ${task.blockedBy.join(', ')}`);\n return lines.join('\\n');\n}\n\nexport const taskCreateTool: Tool = {\n name: 'task_create',\n description: `Create a new task to track work.`,\n inputSchema: {\n type: 'object',\n properties: {\n subject: { type: 'string', description: 'Brief task title' },\n description: { type: 'string', description: 'Detailed description' },\n activeForm: { type: 'string', description: 'Present continuous form (e.g., \"Running tests\")' },\n },\n required: ['subject', 'description'],\n },\n dangerous: false,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const task = taskManager.create(\n String(input['subject']),\n String(input['description']),\n input['activeForm'] ? String(input['activeForm']) : undefined\n );\n return makeToolResult(`Task #${task.id} created: ${task.subject}`);\n },\n};\n\nexport const taskUpdateTool: Tool = {\n name: 'task_update',\n description: `Update a task's status, description, or dependencies.`,\n inputSchema: {\n type: 'object',\n properties: {\n taskId: { type: 'string', description: 'Task ID' },\n status: { type: 'string', enum: ['pending', 'in_progress', 'completed', 'deleted'] },\n subject: { type: 'string' },\n description: { type: 'string' },\n activeForm: { type: 'string' },\n owner: { type: 'string' },\n addBlocks: { type: 'array', items: { type: 'string' } },\n addBlockedBy: { type: 'array', items: { type: 'string' } },\n },\n required: ['taskId'],\n },\n dangerous: false,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const task = taskManager.update(String(input['taskId']), input as any);\n if (!task) return makeToolError(`Task not found: ${input['taskId']}`);\n return makeToolResult(`Task #${task.id} updated: ${formatTask(task)}`);\n },\n};\n\nexport const taskListTool: Tool = {\n name: 'task_list',\n description: `List all tasks with their status.`,\n inputSchema: {\n type: 'object',\n properties: {},\n required: [],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(): Promise<ToolResult> {\n const tasks = taskManager.list();\n if (tasks.length === 0) {\n return makeToolResult('No tasks.');\n }\n return makeToolResult(tasks.map(formatTask).join('\\n\\n'));\n },\n};\n\nexport const taskGetTool: Tool = {\n name: 'task_get',\n description: `Get full details of a specific task.`,\n inputSchema: {\n type: 'object',\n properties: {\n taskId: { type: 'string', description: 'Task ID' },\n },\n required: ['taskId'],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const task = taskManager.get(String(input['taskId']));\n if (!task) return makeToolError(`Task not found: ${input['taskId']}`);\n return makeToolResult(formatTask(task));\n },\n};\n","#!/usr/bin/env node\n\nimport chalk from 'chalk';\nimport { needsSetup, runSetupWizard } from './setup-wizard.js';\nimport { configManager } from './config/config.js';\nimport { Repl } from './repl.js';\nimport { agentLoop } from './agent/agent-loop.js';\nimport { Conversation } from './agent/conversation.js';\nimport { buildSystemPrompt, type PromptContext } from './agent/system-prompt.js';\nimport { tokenTracker } from './agent/token-tracker.js';\nimport { statusLine } from './ui/status-line.js';\nimport { ContextCompressor } from './agent/context-compressor.js';\nimport { memoryManager } from './agent/memory.js';\nimport { sessionManager } from './agent/session.js';\nimport { checkpointManager } from './agent/checkpoint.js';\nimport { loadCodiMd } from './agent/codi-md.js';\nimport { setMode, getMode } from './agent/mode-manager.js';\nimport { ToolRegistry } from './tools/registry.js';\nimport { checkPermission, setPermissionMode } from './security/permission-manager.js';\nimport { hookManager } from './hooks/hook-manager.js';\nimport { mcpManager } from './mcp/mcp-manager.js';\nimport { createSubAgentHandler } from './agent/sub-agent.js';\nimport { setSubAgentHandler } from './tools/sub-agent-tool.js';\nimport { stopSpinner } from './ui/spinner.js';\nimport {\n createBuiltinCommands,\n loadCustomCommands,\n type SlashCommandContext,\n} from './config/slash-commands.js';\n\n// Import all tools\nimport { fileReadTool } from './tools/file-read.js';\nimport { fileWriteTool } from './tools/file-write.js';\nimport { fileEditTool } from './tools/file-edit.js';\nimport { fileMultiEditTool } from './tools/file-multi-edit.js';\nimport { globTool } from './tools/glob.js';\nimport { grepTool } from './tools/grep.js';\nimport { bashTool } from './tools/bash.js';\nimport { listDirTool } from './tools/list-dir.js';\nimport { gitTool } from './tools/git.js';\nimport { webFetchTool } from './tools/web-fetch.js';\nimport { webSearchTool } from './tools/web-search.js';\nimport { notebookEditTool } from './tools/notebook-edit.js';\nimport { subAgentTool } from './tools/sub-agent-tool.js';\nimport { taskCreateTool, taskUpdateTool, taskListTool, taskGetTool } from './tools/task-tools.js';\nimport { askUserTool } from './tools/ask-user.js';\n\n// Import providers\nimport { AnthropicProvider } from './llm/anthropic.js';\nimport { OpenAIProvider } from './llm/openai.js';\nimport { OllamaProvider } from './llm/ollama.js';\nimport type { LlmProvider } from './llm/provider.js';\n\n// ─── CLI Argument Parsing ────────────────────────────────────────────\n\ninterface CliArgs {\n model?: string;\n provider?: string;\n prompt?: string;\n continue?: boolean;\n resume?: string;\n help?: boolean;\n version?: boolean;\n plan?: boolean;\n yolo?: boolean;\n}\n\nfunction parseArgs(argv: string[]): CliArgs {\n const args: CliArgs = {};\n let i = 2; // Skip node and script path\n\n while (i < argv.length) {\n const arg = argv[i]!;\n switch (arg) {\n case '--model':\n case '-m':\n args.model = argv[++i];\n break;\n case '--provider':\n args.provider = argv[++i];\n break;\n case '-p':\n args.prompt = argv.slice(i + 1).join(' ');\n i = argv.length;\n break;\n case '-c':\n case '--continue':\n args.continue = true;\n break;\n case '-r':\n case '--resume':\n args.resume = argv[++i];\n break;\n case '--help':\n case '-h':\n args.help = true;\n break;\n case '--version':\n case '-v':\n args.version = true;\n break;\n case '--plan':\n args.plan = true;\n break;\n case '--yolo':\n args.yolo = true;\n break;\n default:\n // Treat as prompt if no flag\n if (!arg.startsWith('-')) {\n args.prompt = argv.slice(i).join(' ');\n i = argv.length;\n }\n break;\n }\n i++;\n }\n\n return args;\n}\n\nfunction printHelp(): void {\n console.log(`\n${chalk.cyan.bold('Codi (코디)')} - AI Code Agent for Terminal\n\n${chalk.bold('Usage:')}\n codi [options] [prompt]\n\n${chalk.bold('Options:')}\n -m, --model <model> Set the model (default: gemini-2.5-flash)\n --provider <name> Set the provider (openai, anthropic, ollama)\n -p <prompt> Run a single prompt and exit\n -c, --continue Continue the last session\n -r, --resume <id> Resume a specific session\n --plan Start in plan mode (read-only)\n --yolo Skip all permission checks\n -h, --help Show this help\n -v, --version Show version\n\n${chalk.bold('Environment:')}\n GEMINI_API_KEY Google Gemini API key (default provider)\n OPENAI_API_KEY OpenAI API key\n ANTHROPIC_API_KEY Anthropic API key\n\n${chalk.bold('Examples:')}\n codi # Start interactive session\n codi -p \"explain main.ts\" # Single prompt\n codi --provider anthropic # Use Anthropic Claude\n codi --model gpt-4o --provider openai # Use OpenAI GPT-4o\n codi -c # Continue last session\n`);\n}\n\n// ─── Main ────────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv);\n\n if (args.help) {\n printHelp();\n process.exit(0);\n }\n\n if (args.version) {\n console.log('codi v0.1.0');\n process.exit(0);\n }\n\n // First-time setup wizard\n if (await needsSetup()) {\n const result = await runSetupWizard();\n if (result) {\n // Reload config after setup\n configManager.reload();\n }\n }\n\n // Load config\n const config = configManager.get();\n const providerName = args.provider || config.provider;\n const modelName = args.model || config.model;\n\n // Create LLM provider\n let provider: LlmProvider;\n switch (providerName) {\n case 'anthropic':\n provider = new AnthropicProvider({\n apiKey: config.apiKeys.anthropic,\n model: modelName,\n maxTokens: config.maxTokens,\n baseUrl: config.baseUrls.anthropic,\n });\n break;\n case 'ollama':\n provider = new OllamaProvider({\n model: modelName,\n maxTokens: config.maxTokens,\n baseUrl: config.baseUrls.ollama,\n });\n break;\n case 'openai':\n default:\n provider = new OpenAIProvider({\n apiKey: config.apiKeys.openai || process.env['GEMINI_API_KEY'],\n model: modelName,\n maxTokens: config.maxTokens,\n baseUrl: config.baseUrls.openai,\n });\n break;\n }\n\n // Setup token tracker\n tokenTracker.setModel(modelName);\n statusLine.update({ model: modelName, provider: providerName });\n\n // Setup tool registry\n const registry = new ToolRegistry();\n registry.registerAll([\n fileReadTool,\n fileWriteTool,\n fileEditTool,\n fileMultiEditTool,\n globTool,\n grepTool,\n bashTool,\n listDirTool,\n gitTool,\n webFetchTool,\n webSearchTool,\n notebookEditTool,\n subAgentTool,\n taskCreateTool,\n taskUpdateTool,\n taskListTool,\n taskGetTool,\n askUserTool,\n ]);\n\n // Setup sub-agent handler\n const subAgentHandler = createSubAgentHandler(provider, registry);\n setSubAgentHandler(subAgentHandler);\n\n // Initialize MCP\n try {\n await mcpManager.initialize(registry);\n } catch {\n // MCP initialization failure is non-fatal\n }\n\n // Setup conversation\n const conversation = new Conversation();\n const compressor = new ContextCompressor({\n threshold: config.autoCompactThreshold,\n });\n\n // Load CODI.md and memory\n const codiMd = loadCodiMd();\n const memory = config.memoryEnabled ? memoryManager.buildMemoryPrompt() : '';\n\n function buildPrompt(): string {\n const context: PromptContext = {\n model: provider.model,\n provider: provider.name,\n cwd: process.cwd(),\n codiMd: codiMd || undefined,\n memory: memory || undefined,\n planMode: getMode() === 'plan',\n };\n return buildSystemPrompt(context);\n }\n\n conversation.setSystemPrompt(buildPrompt());\n\n // Set permission mode\n if (args.yolo) {\n setPermissionMode('yolo');\n } else if (args.plan) {\n setPermissionMode('plan');\n setMode('plan');\n statusLine.update({ mode: 'plan' });\n }\n\n // Resume session if requested\n if (args.continue || args.resume) {\n const id = args.resume || sessionManager.getLatest()?.id;\n if (id) {\n const session = sessionManager.load(id);\n if (session) {\n const data = session.conversation.serialize();\n for (const msg of data.messages) {\n if (msg.role === 'user') conversation.addUserMessage(msg.content);\n else if (msg.role === 'assistant') conversation.addAssistantMessage(msg.content);\n }\n console.log(chalk.dim(`Resumed session: ${id}`));\n }\n }\n }\n\n // Run hooks - session start\n await hookManager.runHooks('SessionStart', { cwd: process.cwd() });\n\n // Single prompt mode\n if (args.prompt) {\n await agentLoop(args.prompt, {\n provider,\n conversation,\n registry,\n systemPrompt: conversation.getSystemPrompt(),\n permissionCheck: checkPermission,\n preHook: async (toolName, input) => hookManager.runHooks('PreToolUse', { tool: toolName, args: input }),\n postHook: async (toolName, input, result) => { await hookManager.runHooks('PostToolUse', { tool: toolName, args: input, result }); },\n planMode: getMode() === 'plan',\n });\n await hookManager.runHooks('SessionEnd', {});\n await mcpManager.disconnectAll();\n process.exit(0);\n }\n\n // Interactive REPL mode\n const slashCommands = [...createBuiltinCommands(), ...loadCustomCommands()];\n\n const cmdCtx: SlashCommandContext = {\n conversation,\n provider,\n compressor,\n exitFn: async () => {\n stopSpinner();\n console.log(chalk.dim('\\nSaving session...'));\n sessionManager.save(conversation, undefined, provider.model);\n await hookManager.runHooks('SessionEnd', {});\n await mcpManager.disconnectAll();\n },\n setProvider: (name: string, model: string) => {\n const newProvider = name || providerName;\n switch (newProvider) {\n case 'openai':\n provider = new OpenAIProvider({ model, maxTokens: config.maxTokens });\n break;\n case 'ollama':\n provider = new OllamaProvider({ model, maxTokens: config.maxTokens });\n break;\n default:\n provider = new AnthropicProvider({ model, maxTokens: config.maxTokens });\n break;\n }\n tokenTracker.setModel(model);\n statusLine.update({ model, provider: newProvider });\n },\n reloadSystemPrompt: () => {\n conversation.setSystemPrompt(buildPrompt());\n },\n };\n\n const repl = new Repl({\n onMessage: async (message: string) => {\n // Create checkpoint before each turn\n checkpointManager.create(conversation, message.slice(0, 50));\n\n // Auto-compact if needed\n if (compressor.shouldCompress(conversation)) {\n console.log(chalk.dim('Auto-compacting conversation...'));\n await compressor.compress(conversation, provider);\n conversation.setSystemPrompt(buildPrompt());\n }\n\n await agentLoop(message, {\n provider,\n conversation,\n registry,\n systemPrompt: conversation.getSystemPrompt(),\n permissionCheck: checkPermission,\n preHook: async (toolName, input) => hookManager.runHooks('PreToolUse', { tool: toolName, args: input }),\n postHook: async (toolName, input, result) => { await hookManager.runHooks('PostToolUse', { tool: toolName, args: input, result }); },\n planMode: getMode() === 'plan',\n });\n },\n\n onSlashCommand: async (command: string, args: string): Promise<boolean> => {\n // Find matching command\n const cmd = slashCommands.find(\n (c) => c.name === command || c.aliases?.includes(command)\n );\n if (!cmd) return false;\n return cmd.handler(args, cmdCtx);\n },\n\n onInterrupt: () => {\n stopSpinner();\n },\n\n onExit: async () => {\n stopSpinner();\n console.log(chalk.dim('\\nSaving session...'));\n sessionManager.save(conversation, undefined, provider.model);\n await hookManager.runHooks('SessionEnd', {});\n await mcpManager.disconnectAll();\n },\n });\n\n // SIGTERM (Docker, etc.)\n process.on('SIGTERM', async () => {\n stopSpinner();\n sessionManager.save(conversation, undefined, provider.model);\n await hookManager.runHooks('SessionEnd', {});\n await mcpManager.disconnectAll();\n process.exit(0);\n });\n\n await repl.start();\n}\n\nmain().catch((err) => {\n console.error(chalk.red(`Fatal error: ${err.message}`));\n console.error(err.stack);\n process.exit(1);\n});\n","import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport * as readline from 'node:readline/promises';\nimport { stdin as input, stdout as output } from 'process';\n\nconst isWindows = os.platform() === 'win32';\n\nconst SETTINGS_DIR = path.join(\n process.env['HOME'] || process.env['USERPROFILE'] || '~',\n '.codi'\n);\nconst SETTINGS_PATH = path.join(SETTINGS_DIR, 'settings.json');\n\ninterface SetupResult {\n apiKey: string;\n provider: string;\n}\n\nexport async function needsSetup(): Promise<boolean> {\n // Check if any API key is available\n if (process.env['GEMINI_API_KEY']) return false;\n if (process.env['OPENAI_API_KEY']) return false;\n if (process.env['ANTHROPIC_API_KEY']) return false;\n\n // Check settings file\n if (fs.existsSync(SETTINGS_PATH)) {\n try {\n const content = fs.readFileSync(SETTINGS_PATH, 'utf-8');\n const settings = JSON.parse(content);\n if (settings.apiKeys?.openai || settings.apiKeys?.anthropic) {\n return false;\n }\n } catch {\n // Invalid settings file\n }\n }\n\n return true;\n}\n\nexport async function runSetupWizard(): Promise<SetupResult | null> {\n const rl = readline.createInterface({ input, output });\n\n console.log('');\n console.log(chalk.cyan.bold(' ╭─────────────────────────────────────╮'));\n console.log(chalk.cyan.bold(' │') + chalk.white.bold(' Codi (코디) - First Time Setup ') + chalk.cyan.bold('│'));\n console.log(chalk.cyan.bold(' ╰─────────────────────────────────────╯'));\n console.log('');\n console.log(chalk.dim(' API key not found. Let\\'s set one up!'));\n console.log('');\n\n // Provider selection\n console.log(chalk.bold(' Which AI provider would you like to use?'));\n console.log('');\n console.log(` ${chalk.cyan('1.')} Google Gemini ${chalk.green('(Free tier available)')}`);\n console.log(` ${chalk.cyan('2.')} OpenAI (GPT-4o, etc.)`);\n console.log(` ${chalk.cyan('3.')} Anthropic (Claude)`);\n console.log(` ${chalk.cyan('4.')} Ollama ${chalk.green('(Free, local)')}`);\n console.log('');\n\n const choice = await rl.question(chalk.cyan(' Choice [1]: '));\n const providerChoice = choice.trim() || '1';\n\n let provider = 'openai';\n let envVarName = 'GEMINI_API_KEY';\n let keyName = 'openai';\n let signupUrl = '';\n let model = 'gemini-2.5-flash';\n\n switch (providerChoice) {\n case '1':\n provider = 'openai';\n envVarName = 'GEMINI_API_KEY';\n keyName = 'openai';\n signupUrl = 'https://aistudio.google.com/apikey';\n model = 'gemini-2.5-flash';\n break;\n case '2':\n provider = 'openai';\n envVarName = 'OPENAI_API_KEY';\n keyName = 'openai';\n signupUrl = 'https://platform.openai.com/api-keys';\n model = 'gpt-4o';\n break;\n case '3':\n provider = 'anthropic';\n envVarName = 'ANTHROPIC_API_KEY';\n keyName = 'anthropic';\n signupUrl = 'https://console.anthropic.com/settings/keys';\n model = 'claude-sonnet-4-20250514';\n break;\n case '4':\n console.log('');\n console.log(chalk.green(' ✓ Ollama selected! No API key needed.'));\n console.log(chalk.dim(' Make sure Ollama is running: ollama serve'));\n console.log(chalk.dim(' And pull a model: ollama pull llama3.1'));\n console.log('');\n console.log(chalk.dim(' Start Codi with:'));\n console.log(chalk.cyan(' codi --provider ollama --model llama3.1'));\n console.log('');\n rl.close();\n return null;\n default:\n console.log(chalk.yellow(' Invalid choice. Using Gemini (default).'));\n break;\n }\n\n // API key input\n if (signupUrl) {\n console.log('');\n console.log(chalk.bold(' Get your API key:'));\n console.log(chalk.cyan(` → ${signupUrl}`));\n console.log('');\n }\n\n const apiKey = await rl.question(chalk.cyan(' Paste your API key: '));\n rl.close();\n\n if (!apiKey.trim()) {\n console.log(chalk.yellow('\\n No API key provided. Setup cancelled.'));\n const laterCmd = isWindows\n ? `$env:${envVarName}=\"your-key\"`\n : `export ${envVarName}=your-key`;\n console.log(chalk.dim(` You can set it later: ${laterCmd}\\n`));\n return null;\n }\n\n // Save method selection\n const rl2 = readline.createInterface({ input, output });\n console.log('');\n console.log(chalk.bold(' How would you like to save it?'));\n console.log('');\n console.log(` ${chalk.cyan('1.')} Save to ~/.codi/settings.json ${chalk.green('(Recommended)')}`);\n console.log(` ${chalk.cyan('2.')} Show export command (manual setup)`);\n console.log('');\n\n const saveChoice = await rl2.question(chalk.cyan(' Choice [1]: '));\n rl2.close();\n\n const trimmedKey = apiKey.trim();\n\n if (saveChoice.trim() === '2') {\n console.log('');\n if (isWindows) {\n console.log(chalk.bold(' Run this command in PowerShell (admin) to set permanently:'));\n console.log('');\n console.log(chalk.cyan(` [System.Environment]::SetEnvironmentVariable('${envVarName}', '${trimmedKey}', 'User')`));\n console.log('');\n console.log(chalk.dim(' Or set temporarily for this session:'));\n console.log(chalk.cyan(` $env:${envVarName}=\"${trimmedKey}\"`));\n } else {\n console.log(chalk.bold(' Add this to your shell profile (~/.zshrc or ~/.bashrc):'));\n console.log('');\n console.log(chalk.cyan(` export ${envVarName}=${trimmedKey}`));\n console.log('');\n console.log(chalk.dim(' Then restart your terminal or run: source ~/.zshrc'));\n }\n console.log('');\n return { apiKey: trimmedKey, provider };\n }\n\n // Save to settings file\n try {\n if (!fs.existsSync(SETTINGS_DIR)) {\n fs.mkdirSync(SETTINGS_DIR, { recursive: true });\n }\n\n let settings: Record<string, unknown> = {};\n if (fs.existsSync(SETTINGS_PATH)) {\n try {\n settings = JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf-8'));\n } catch {\n settings = {};\n }\n }\n\n if (!settings['apiKeys'] || typeof settings['apiKeys'] !== 'object') {\n settings['apiKeys'] = {};\n }\n (settings['apiKeys'] as Record<string, string>)[keyName] = trimmedKey;\n\n if (providerChoice === '2') {\n settings['provider'] = 'openai';\n settings['model'] = model;\n settings['baseUrls'] = {};\n } else if (providerChoice === '3') {\n settings['provider'] = 'anthropic';\n settings['model'] = model;\n }\n\n fs.writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2), 'utf-8');\n\n console.log('');\n console.log(chalk.green(' ✓ Settings saved to ~/.codi/settings.json'));\n console.log(chalk.dim(` Provider: ${provider} | Model: ${model}`));\n console.log('');\n } catch (err) {\n console.log(chalk.red(`\\n Failed to save settings: ${err}`));\n const manualCmd = isWindows\n ? `$env:${envVarName}=\"${trimmedKey}\"`\n : `export ${envVarName}=${trimmedKey}`;\n console.log(chalk.dim(` Set manually: ${manualCmd}\\n`));\n }\n\n return { apiKey: trimmedKey, provider };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { ProviderName } from '../llm/provider.js';\n\nexport interface CodiConfig {\n provider: ProviderName;\n model: string;\n maxTokens: number;\n temperature?: number;\n apiKeys: {\n anthropic?: string;\n openai?: string;\n };\n baseUrls: {\n anthropic?: string;\n openai?: string;\n ollama?: string;\n };\n permissions: {\n allow: string[];\n deny: string[];\n ask: string[];\n };\n hooks: Record<string, HookConfig[]>;\n mcpServers: Record<string, McpServerConfig>;\n customCommands: string[];\n sandbox: boolean;\n autoCompactThreshold: number; // 0-1, fraction of context window\n memoryEnabled: boolean;\n}\n\nexport interface HookConfig {\n matcher: string;\n hooks: Array<{\n type: 'command' | 'prompt';\n command?: string;\n prompt?: string;\n timeout?: number;\n }>;\n}\n\nexport interface McpServerConfig {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nconst DEFAULT_CONFIG: CodiConfig = {\n provider: 'openai',\n model: 'gemini-2.5-flash',\n maxTokens: 8192,\n apiKeys: {},\n baseUrls: {\n openai: 'https://generativelanguage.googleapis.com/v1beta/openai',\n },\n permissions: {\n allow: ['read_file', 'glob', 'grep', 'list_dir', 'ask_user'],\n deny: [],\n ask: ['write_file', 'edit_file', 'multi_edit', 'bash', 'git', 'web_fetch', 'web_search', 'notebook_edit'],\n },\n hooks: {},\n mcpServers: {},\n customCommands: [],\n sandbox: false,\n autoCompactThreshold: 0.7,\n memoryEnabled: true,\n};\n\nexport class ConfigManager {\n private config: CodiConfig;\n private configPaths: string[] = [];\n\n constructor() {\n this.config = { ...DEFAULT_CONFIG };\n this.loadAll();\n }\n\n private loadAll(): void {\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n\n // User global config\n this.loadFile(path.join(home, '.codi', 'settings.json'));\n\n // Project config\n this.loadFile(path.join(process.cwd(), '.codi', 'settings.json'));\n\n // Project local config (gitignored)\n this.loadFile(path.join(process.cwd(), '.codi', 'settings.local.json'));\n\n // Environment variables override\n if (process.env['GEMINI_API_KEY']) {\n this.config.apiKeys.openai = process.env['GEMINI_API_KEY'];\n }\n if (process.env['ANTHROPIC_API_KEY']) {\n this.config.apiKeys.anthropic = process.env['ANTHROPIC_API_KEY'];\n }\n if (process.env['OPENAI_API_KEY']) {\n this.config.apiKeys.openai = process.env['OPENAI_API_KEY'];\n }\n if (process.env['CODI_MODEL']) {\n this.config.model = process.env['CODI_MODEL'];\n }\n if (process.env['CODI_PROVIDER']) {\n this.config.provider = process.env['CODI_PROVIDER'] as ProviderName;\n }\n }\n\n private loadFile(filePath: string): void {\n try {\n if (!fs.existsSync(filePath)) return;\n const content = fs.readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(content);\n this.configPaths.push(filePath);\n this.mergeConfig(parsed);\n } catch {\n // Skip invalid config files\n }\n }\n\n private mergeConfig(partial: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(partial)) {\n if (key === 'permissions' && typeof value === 'object' && value !== null) {\n const perms = value as Record<string, unknown>;\n if (Array.isArray(perms['allow'])) {\n this.config.permissions.allow = [\n ...new Set([...this.config.permissions.allow, ...perms['allow']]),\n ];\n }\n if (Array.isArray(perms['deny'])) {\n this.config.permissions.deny = [\n ...new Set([...this.config.permissions.deny, ...perms['deny']]),\n ];\n }\n if (Array.isArray(perms['ask'])) {\n this.config.permissions.ask = [\n ...new Set([...this.config.permissions.ask, ...perms['ask']]),\n ];\n }\n } else if (key === 'hooks' && typeof value === 'object' && value !== null) {\n Object.assign(this.config.hooks, value);\n } else if (key === 'mcpServers' && typeof value === 'object' && value !== null) {\n Object.assign(this.config.mcpServers, value);\n } else if (key === 'apiKeys' && typeof value === 'object' && value !== null) {\n Object.assign(this.config.apiKeys, value);\n } else if (key === 'baseUrls' && typeof value === 'object' && value !== null) {\n Object.assign(this.config.baseUrls, value);\n } else if (key in this.config) {\n (this.config as any)[key] = value;\n }\n }\n }\n\n get(): CodiConfig {\n return this.config;\n }\n\n reload(): void {\n this.config = { ...DEFAULT_CONFIG };\n this.configPaths = [];\n this.loadAll();\n }\n\n set(key: string, value: unknown): void {\n (this.config as any)[key] = value;\n }\n\n getConfigPaths(): string[] {\n return this.configPaths;\n }\n\n save(scope: 'user' | 'project' | 'local'): void {\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n let filePath: string;\n\n switch (scope) {\n case 'user':\n filePath = path.join(home, '.codi', 'settings.json');\n break;\n case 'project':\n filePath = path.join(process.cwd(), '.codi', 'settings.json');\n break;\n case 'local':\n filePath = path.join(process.cwd(), '.codi', 'settings.local.json');\n break;\n }\n\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.writeFileSync(filePath, JSON.stringify(this.config, null, 2), 'utf-8');\n }\n}\n\nexport const configManager = new ConfigManager();\n","import * as readline from 'node:readline/promises';\nimport { stdin as input, stdout as output } from 'process';\nimport * as os from 'os';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { edit } from 'external-editor';\nimport { KeyBindingManager } from './ui/keybindings.js';\nimport { renderPrompt, renderMarkdown, renderError, renderInfo } from './ui/renderer.js';\nimport { statusLine } from './ui/status-line.js';\nimport { completer } from './ui/completer.js';\n\nexport interface ReplOptions {\n onMessage: (message: string) => Promise<void>;\n onSlashCommand: (command: string, args: string) => Promise<boolean>;\n onInterrupt: () => void;\n onExit?: () => Promise<void>;\n}\n\nexport class Repl {\n private rl: readline.Interface | null = null;\n private keyBindings = new KeyBindingManager();\n private running = false;\n private multilineBuffer: string[] = [];\n private inMultiline = false;\n private pasteMode = false;\n private options: ReplOptions;\n private lastInterruptTime = 0;\n\n constructor(options: ReplOptions) {\n this.options = options;\n this.setupKeyBindings();\n }\n\n private setupKeyBindings(): void {\n this.keyBindings.register({\n key: 'l',\n ctrl: true,\n handler: () => {\n process.stdout.write('\\x1B[2J\\x1B[0f');\n },\n description: 'Clear screen',\n });\n }\n\n async start(): Promise<void> {\n this.running = true;\n\n this.rl = readline.createInterface({\n input,\n output,\n prompt: renderPrompt(),\n completer: (line: string) => completer(line),\n terminal: true,\n });\n\n // Setup bracket paste mode detection\n if (process.stdin.isTTY) {\n process.stdout.write('\\x1B[?2004h'); // Enable bracket paste\n }\n\n this.printWelcome();\n\n while (this.running) {\n try {\n const statusStr = statusLine.render();\n if (statusStr) {\n output.write(chalk.dim(statusStr) + '\\n');\n }\n\n this.rl.setPrompt(renderPrompt());\n this.rl.prompt();\n\n const line = await new Promise<string>((resolve, reject) => {\n const onLine = (data: string) => {\n cleanup();\n resolve(data);\n };\n const onClose = () => {\n cleanup();\n reject(new Error('closed'));\n };\n const onSigint = () => {\n cleanup();\n const now = Date.now();\n // Double Ctrl+C within 2 seconds → exit\n if (now - this.lastInterruptTime < 2000) {\n this.gracefulExit().catch(() => process.exit(1));\n return;\n }\n this.lastInterruptTime = now;\n this.options.onInterrupt();\n console.log(chalk.dim('\\n(Press Ctrl+C again to exit)'));\n resolve('');\n };\n const cleanup = () => {\n this.rl!.removeListener('line', onLine);\n this.rl!.removeListener('close', onClose);\n this.rl!.removeListener('SIGINT', onSigint);\n };\n this.rl!.on('line', onLine);\n this.rl!.on('close', onClose);\n this.rl!.on('SIGINT', onSigint);\n });\n\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // Multiline: line ending with \\\n if (trimmed.endsWith('\\\\')) {\n this.multilineBuffer.push(trimmed.slice(0, -1));\n this.inMultiline = true;\n this.rl.setPrompt(chalk.dim('... '));\n continue;\n }\n\n let fullInput: string;\n if (this.inMultiline) {\n this.multilineBuffer.push(trimmed);\n fullInput = this.multilineBuffer.join('\\n');\n this.multilineBuffer = [];\n this.inMultiline = false;\n } else {\n fullInput = trimmed;\n }\n\n await this.processInput(fullInput);\n } catch (err) {\n if (err instanceof Error && err.message === 'closed') {\n // Ctrl+D or readline closed\n await this.gracefulExit();\n return;\n }\n }\n }\n\n if (process.stdin.isTTY) {\n process.stdout.write('\\x1B[?2004l'); // Disable bracket paste\n }\n }\n\n private async processInput(input: string): Promise<void> {\n // Direct exit commands (without slash)\n const lower = input.toLowerCase();\n if (lower === 'exit' || lower === 'quit' || lower === 'q') {\n await this.gracefulExit();\n return;\n }\n\n // Slash commands\n if (input.startsWith('/')) {\n const spaceIdx = input.indexOf(' ');\n const command = spaceIdx === -1 ? input : input.slice(0, spaceIdx);\n const args = spaceIdx === -1 ? '' : input.slice(spaceIdx + 1).trim();\n const handled = await this.options.onSlashCommand(command, args);\n if (handled) return;\n console.log(renderError(`Unknown command: ${command}. Type /help for available commands.`));\n return;\n }\n\n // Bang prefix → direct bash execution\n if (input.startsWith('!')) {\n const cmd = input.slice(1).trim();\n if (!cmd) return;\n try {\n const shell = os.platform() === 'win32' ? 'powershell.exe' : undefined;\n const result = execSync(cmd, {\n encoding: 'utf-8',\n stdio: ['inherit', 'pipe', 'pipe'],\n timeout: 30_000,\n shell,\n });\n console.log(result);\n } catch (err: any) {\n if (err.stderr) console.error(chalk.red(err.stderr));\n else if (err.stdout) console.log(err.stdout);\n else console.error(renderError(String(err.message)));\n }\n return;\n }\n\n // @ prefix → file reference (prepend file content)\n let message = input;\n const atMatches = input.match(/@([\\w./-]+)/g);\n if (atMatches) {\n for (const match of atMatches) {\n const filePath = match.slice(1);\n try {\n const { readFileSync } = await import('fs');\n const content = readFileSync(filePath, 'utf-8');\n message = message.replace(match, `\\n[File: ${filePath}]\\n\\`\\`\\`\\n${content}\\n\\`\\`\\`\\n`);\n } catch {\n // Leave as-is if file doesn't exist\n }\n }\n }\n\n await this.options.onMessage(message);\n }\n\n openEditor(): string | null {\n try {\n const text = edit('', { postfix: '.md' });\n return text.trim() || null;\n } catch {\n return null;\n }\n }\n\n stop(): void {\n this.running = false;\n if (this.rl) {\n this.rl.close();\n this.rl = null;\n }\n }\n\n async gracefulExit(): Promise<void> {\n this.stop();\n if (this.options.onExit) {\n await this.options.onExit();\n }\n console.log(chalk.dim('\\nGoodbye!\\n'));\n process.exit(0);\n }\n\n private printWelcome(): void {\n console.log('');\n console.log(chalk.cyan.bold(' ╭─────────────────────────────╮'));\n console.log(chalk.cyan.bold(' │') + chalk.white.bold(' Codi (코디) v0.1.0 ') + chalk.cyan.bold('│'));\n console.log(chalk.cyan.bold(' │') + chalk.dim(' AI Code Agent for Terminal ') + chalk.cyan.bold('│'));\n console.log(chalk.cyan.bold(' ╰─────────────────────────────╯'));\n console.log('');\n console.log(chalk.dim(' Type /help for commands, Ctrl+D to quit'));\n console.log(chalk.dim(' Use \\\\ at end of line for multiline input'));\n console.log('');\n }\n}\n","import type { Key } from 'readline';\n\nexport interface KeyBinding {\n key: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n handler: () => void | Promise<void>;\n description: string;\n}\n\nexport class KeyBindingManager {\n private bindings: Map<string, KeyBinding> = new Map();\n\n register(binding: KeyBinding): void {\n const id = this.makeId(binding);\n this.bindings.set(id, binding);\n }\n\n private makeId(binding: Pick<KeyBinding, 'key' | 'ctrl' | 'meta' | 'shift'>): string {\n const parts: string[] = [];\n if (binding.ctrl) parts.push('ctrl');\n if (binding.meta) parts.push('meta');\n if (binding.shift) parts.push('shift');\n parts.push(binding.key);\n return parts.join('+');\n }\n\n async handle(str: string, key: Key): Promise<boolean> {\n const id = this.makeId({\n key: key.name ?? str,\n ctrl: key.ctrl,\n meta: key.meta,\n shift: key.shift,\n });\n\n const binding = this.bindings.get(id);\n if (binding) {\n await binding.handler();\n return true;\n }\n return false;\n }\n\n listBindings(): KeyBinding[] {\n return [...this.bindings.values()];\n }\n}\n","import chalk from 'chalk';\n\nexport interface StatusInfo {\n model: string;\n provider: string;\n inputTokens: number;\n outputTokens: number;\n cost: number;\n mode?: 'plan' | 'execute';\n}\n\nexport class StatusLine {\n private info: StatusInfo = {\n model: '',\n provider: '',\n inputTokens: 0,\n outputTokens: 0,\n cost: 0,\n };\n private enabled: boolean = true;\n\n update(partial: Partial<StatusInfo>): void {\n Object.assign(this.info, partial);\n }\n\n setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n render(): string {\n if (!this.enabled) return '';\n const { model, inputTokens, outputTokens, cost, mode } = this.info;\n\n const parts: string[] = [];\n if (model) parts.push(chalk.cyan(`[${model}]`));\n if (mode === 'plan') parts.push(chalk.yellow('[PLAN]'));\n parts.push(chalk.dim(`in:${this.formatTokens(inputTokens)}`));\n parts.push(chalk.dim(`out:${this.formatTokens(outputTokens)}`));\n if (cost > 0) parts.push(chalk.green(`$${cost.toFixed(4)}`));\n\n return parts.join(chalk.dim(' | '));\n }\n\n private formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return String(n);\n }\n\n getInfo(): StatusInfo {\n return { ...this.info };\n }\n}\n\nexport const statusLine = new StatusLine();\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nconst SLASH_COMMANDS = [\n '/help', '/quit', '/exit', '/clear', '/reset', '/new',\n '/model', '/compact', '/cost', '/config', '/permissions',\n '/diff', '/save', '/resume', '/continue', '/fork',\n '/plan', '/memory', '/init', '/export', '/tasks',\n '/status', '/context', '/rewind', '/mcp',\n];\n\nexport function completer(line: string): [string[], string] {\n // Slash command completion\n if (line.startsWith('/')) {\n const matches = SLASH_COMMANDS.filter((cmd) => cmd.startsWith(line));\n return [matches, line];\n }\n\n // File path completion (after @)\n if (line.includes('@')) {\n const atIndex = line.lastIndexOf('@');\n const partial = line.slice(atIndex + 1);\n const dir = path.dirname(partial) || '.';\n const base = path.basename(partial);\n\n try {\n const entries = fs.readdirSync(dir === '' ? '.' : dir);\n const matches = entries\n .filter((e) => e.startsWith(base))\n .map((e) => {\n const full = dir === '.' ? e : path.join(dir, e);\n try {\n return fs.statSync(full).isDirectory() ? full + '/' : full;\n } catch {\n return full;\n }\n })\n .map((p) => line.slice(0, atIndex + 1) + p);\n return [matches, line];\n } catch {\n return [[], line];\n }\n }\n\n return [[], line];\n}\n","import type { LlmProvider } from '../llm/provider.js';\nimport type { ContentBlock, ToolCall, LlmResponse } from '../llm/types.js';\nimport { Conversation } from './conversation.js';\nimport { ToolExecutor } from '../tools/executor.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport { tokenTracker } from './token-tracker.js';\nimport { statusLine } from '../ui/status-line.js';\nimport { startSpinner, stopSpinner, updateSpinner } from '../ui/spinner.js';\nimport { renderMarkdown, renderAssistantPrefix } from '../ui/renderer.js';\nimport chalk from 'chalk';\n\nexport interface AgentLoopOptions {\n provider: LlmProvider;\n conversation?: Conversation;\n registry: ToolRegistry;\n systemPrompt?: string;\n maxIterations?: number;\n stream?: boolean;\n showOutput?: boolean;\n onToken?: (text: string) => void;\n permissionCheck?: (tool: any, input: Record<string, unknown>) => Promise<boolean>;\n preHook?: (toolName: string, input: Record<string, unknown>) => Promise<{ proceed: boolean; updatedInput?: Record<string, unknown> }>;\n postHook?: (toolName: string, input: Record<string, unknown>, result: any) => Promise<void>;\n planMode?: boolean;\n}\n\nconst MAX_RETRIES = 3;\nconst RETRY_DELAYS = [1000, 2000, 4000];\n\nexport async function agentLoop(\n userMessage: string | ContentBlock[],\n options: AgentLoopOptions\n): Promise<string> {\n const {\n provider,\n registry,\n maxIterations = 25,\n stream = true,\n showOutput = true,\n } = options;\n\n const conversation = options.conversation ?? new Conversation();\n if (options.systemPrompt) {\n conversation.setSystemPrompt(options.systemPrompt);\n }\n\n const executor = new ToolExecutor(registry, {\n permissionCheck: options.permissionCheck,\n preHook: options.preHook,\n postHook: options.postHook,\n planMode: options.planMode,\n showToolCalls: showOutput,\n });\n\n // Add user message\n conversation.addUserMessage(userMessage);\n\n let iterations = 0;\n let finalText = '';\n\n while (iterations < maxIterations) {\n iterations++;\n\n // Call LLM\n let response: LlmResponse;\n const spinner = showOutput ? startSpinner('Thinking...') : null;\n\n try {\n response = await callLlmWithRetry(provider, conversation, registry, stream, options, showOutput);\n } catch (err) {\n stopSpinner();\n const errMsg = err instanceof Error ? err.message : String(err);\n if (showOutput) {\n console.error(chalk.red(`\\nLLM Error: ${errMsg}`));\n }\n return `Error communicating with LLM: ${errMsg}`;\n }\n\n stopSpinner();\n\n // Track tokens\n if (response.usage) {\n tokenTracker.track(response.usage);\n const stats = tokenTracker.getStats();\n statusLine.update({\n inputTokens: stats.inputTokens,\n outputTokens: stats.outputTokens,\n cost: stats.cost,\n });\n }\n\n // Add assistant message to conversation\n conversation.addAssistantMessage(response.content);\n\n // Collect text\n const wasStreamed = (response as any)._streamed === true;\n if (response.text) {\n finalText = response.text;\n }\n\n // Check stop reason\n if (response.stopReason === 'end_turn' || !response.toolCalls || response.toolCalls.length === 0) {\n // Only render if not already streamed to terminal\n if (showOutput && finalText && !wasStreamed) {\n console.log('');\n console.log(renderAssistantPrefix());\n console.log(renderMarkdown(finalText));\n console.log('');\n }\n if (wasStreamed && showOutput) {\n console.log('');\n }\n break;\n }\n\n if (response.stopReason === 'max_tokens') {\n if (showOutput) {\n console.log(chalk.yellow('\\n⚠ Response truncated (max tokens reached)'));\n }\n }\n\n // Execute tools\n if (response.toolCalls && response.toolCalls.length > 0) {\n if (showOutput) {\n console.log('');\n }\n\n const results = await executor.executeMany(response.toolCalls);\n\n // Add tool results to conversation\n const toolResults = results.map((r) => ({\n tool_use_id: r.toolUseId,\n content: r.result.output,\n is_error: !r.result.success,\n }));\n\n conversation.addToolResults(toolResults);\n }\n }\n\n if (iterations >= maxIterations) {\n if (showOutput) {\n console.log(chalk.yellow(`\\n⚠ Agent loop reached maximum iterations (${maxIterations})`));\n }\n }\n\n return finalText;\n}\n\nasync function callLlmWithRetry(\n provider: LlmProvider,\n conversation: Conversation,\n registry: ToolRegistry,\n stream: boolean,\n options: AgentLoopOptions,\n showOutput: boolean\n): Promise<LlmResponse> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n let streamedText = '';\n\n const response = await provider.chat({\n messages: conversation.getMessages(),\n systemPrompt: conversation.getSystemPrompt(),\n tools: registry.getToolDefinitions(options.planMode ? { readOnly: true } : undefined),\n stream,\n callbacks: stream\n ? {\n onToken: (text) => {\n stopSpinner();\n if (showOutput && !streamedText) {\n process.stdout.write('\\n' + renderAssistantPrefix() + '\\n');\n }\n streamedText += text;\n if (showOutput) {\n process.stdout.write(text);\n }\n options.onToken?.(text);\n },\n }\n : undefined,\n });\n\n // If we streamed text, add newline and mark as already displayed\n if (streamedText) {\n if (showOutput) {\n process.stdout.write('\\n');\n }\n // Text was already displayed during streaming — do not render again\n return { ...response, _streamed: true } as any;\n }\n\n return response;\n } catch (err: any) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n // Check if retryable\n const status = err.status || err.statusCode;\n if (status === 429 || (status >= 500 && status < 600)) {\n const delay = RETRY_DELAYS[attempt] || 4000;\n if (showOutput) {\n updateSpinner(`API error (${status}), retrying in ${delay / 1000}s...`);\n }\n await sleep(delay);\n continue;\n }\n\n // Non-retryable error\n throw lastError;\n }\n }\n\n throw lastError || new Error('Max retries exceeded');\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport { Conversation };\n","import type { Message, ContentBlock } from '../llm/types.js';\n\nexport class Conversation {\n private messages: Message[] = [];\n private systemPrompt: string = '';\n\n setSystemPrompt(prompt: string): void {\n this.systemPrompt = prompt;\n }\n\n getSystemPrompt(): string {\n return this.systemPrompt;\n }\n\n addUserMessage(content: string | ContentBlock[]): void {\n this.messages.push({ role: 'user', content });\n }\n\n addAssistantMessage(content: string | ContentBlock[]): void {\n this.messages.push({ role: 'assistant', content });\n }\n\n addToolResults(results: Array<{ tool_use_id: string; content: string; is_error?: boolean }>): void {\n const blocks: ContentBlock[] = results.map((r) => ({\n type: 'tool_result' as const,\n tool_use_id: r.tool_use_id,\n content: r.content,\n is_error: r.is_error,\n }));\n this.messages.push({ role: 'user', content: blocks });\n }\n\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n getLastMessage(): Message | undefined {\n return this.messages[this.messages.length - 1];\n }\n\n getMessageCount(): number {\n return this.messages.length;\n }\n\n clear(): void {\n this.messages = [];\n }\n\n /**\n * Replace old messages with a summary, keeping recent messages intact.\n */\n compact(summary: string, keepRecent: number = 4): void {\n if (this.messages.length <= keepRecent) return;\n\n const recent = this.messages.slice(-keepRecent);\n this.messages = [\n { role: 'user', content: `[Previous conversation summary]\\n${summary}` },\n { role: 'assistant', content: 'Understood. I have the context from our previous conversation.' },\n ...recent,\n ];\n }\n\n /**\n * Fork the conversation at the current point.\n */\n fork(): Conversation {\n const forked = new Conversation();\n forked.systemPrompt = this.systemPrompt;\n forked.messages = [...this.messages.map((m) => ({ ...m }))];\n return forked;\n }\n\n /**\n * Truncate to a specific number of messages from the end.\n */\n truncateTo(count: number): void {\n if (this.messages.length > count) {\n this.messages = this.messages.slice(-count);\n }\n }\n\n /**\n * Serialize for session saving.\n */\n serialize(): { systemPrompt: string; messages: Message[] } {\n return {\n systemPrompt: this.systemPrompt,\n messages: this.messages,\n };\n }\n\n /**\n * Restore from serialized data.\n */\n static deserialize(data: { systemPrompt: string; messages: Message[] }): Conversation {\n const conv = new Conversation();\n conv.systemPrompt = data.systemPrompt;\n conv.messages = data.messages;\n return conv;\n }\n\n /**\n * Estimate rough token count (very approximate).\n */\n estimateTokens(): number {\n let chars = this.systemPrompt.length;\n for (const msg of this.messages) {\n if (typeof msg.content === 'string') {\n chars += msg.content.length;\n } else {\n for (const block of msg.content) {\n if (block.type === 'text') chars += block.text.length;\n else if (block.type === 'tool_use') chars += JSON.stringify(block.input).length;\n else if (block.type === 'tool_result') {\n chars += typeof block.content === 'string' ? block.content.length : JSON.stringify(block.content).length;\n }\n }\n }\n }\n // Rough estimate: ~4 chars per token\n return Math.ceil(chars / 4);\n }\n}\n","import type { Tool, ToolResult } from './tool.js';\nimport type { ToolRegistry } from './registry.js';\nimport type { ToolCall } from '../llm/types.js';\nimport { makeToolError } from './tool.js';\nimport { renderToolCall, renderToolResult } from '../ui/renderer.js';\nimport chalk from 'chalk';\n\nexport interface ExecutorOptions {\n permissionCheck?: (tool: Tool, input: Record<string, unknown>) => Promise<boolean>;\n preHook?: (toolName: string, input: Record<string, unknown>) => Promise<{ proceed: boolean; updatedInput?: Record<string, unknown> }>;\n postHook?: (toolName: string, input: Record<string, unknown>, result: ToolResult) => Promise<void>;\n planMode?: boolean;\n showToolCalls?: boolean;\n}\n\nexport interface ExecutionResult {\n toolUseId: string;\n toolName: string;\n result: ToolResult;\n}\n\nexport class ToolExecutor {\n constructor(\n private registry: ToolRegistry,\n private options: ExecutorOptions = {}\n ) {}\n\n async executeOne(toolCall: ToolCall): Promise<ExecutionResult> {\n const tool = this.registry.get(toolCall.name);\n\n if (!tool) {\n return {\n toolUseId: toolCall.id,\n toolName: toolCall.name,\n result: makeToolError(`Unknown tool: ${toolCall.name}. Available tools: ${this.registry.listNames().join(', ')}`),\n };\n }\n\n // Plan mode check\n if (this.options.planMode && !tool.readOnly) {\n return {\n toolUseId: toolCall.id,\n toolName: toolCall.name,\n result: makeToolError(`Tool '${toolCall.name}' is not available in plan mode (read-only). Use only read-only tools.`),\n };\n }\n\n // Permission check\n if (tool.dangerous && this.options.permissionCheck) {\n const allowed = await this.options.permissionCheck(tool, toolCall.input);\n if (!allowed) {\n return {\n toolUseId: toolCall.id,\n toolName: toolCall.name,\n result: makeToolError(`Permission denied for tool: ${toolCall.name}`),\n };\n }\n }\n\n // Pre-hook\n let input = toolCall.input;\n if (this.options.preHook) {\n try {\n const hookResult = await this.options.preHook(toolCall.name, input);\n if (!hookResult.proceed) {\n return {\n toolUseId: toolCall.id,\n toolName: toolCall.name,\n result: makeToolError(`Tool execution blocked by hook for: ${toolCall.name}`),\n };\n }\n if (hookResult.updatedInput) {\n input = hookResult.updatedInput;\n }\n } catch (err) {\n // Hook errors don't block execution, just warn\n console.error(chalk.yellow(`Hook error for ${toolCall.name}: ${err}`));\n }\n }\n\n // Display tool call\n if (this.options.showToolCalls) {\n console.log(renderToolCall(toolCall.name, input));\n }\n\n // Execute\n let result: ToolResult;\n try {\n result = await tool.execute(input);\n } catch (err) {\n result = makeToolError(\n `Tool '${toolCall.name}' threw an error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n // Display result\n if (this.options.showToolCalls) {\n console.log(renderToolResult(toolCall.name, result.output, !result.success));\n }\n\n // Post-hook\n if (this.options.postHook) {\n try {\n await this.options.postHook(toolCall.name, input, result);\n } catch {\n // Post-hook errors are silently ignored\n }\n }\n\n return {\n toolUseId: toolCall.id,\n toolName: toolCall.name,\n result,\n };\n }\n\n async executeMany(toolCalls: ToolCall[]): Promise<ExecutionResult[]> {\n // Separate safe and dangerous tools\n const safeCalls: ToolCall[] = [];\n const dangerousCalls: ToolCall[] = [];\n\n for (const tc of toolCalls) {\n const tool = this.registry.get(tc.name);\n if (tool?.dangerous) {\n dangerousCalls.push(tc);\n } else {\n safeCalls.push(tc);\n }\n }\n\n // Execute safe tools in parallel\n const safePromises = safeCalls.map((tc) => this.executeOne(tc));\n\n // Execute dangerous tools sequentially\n const dangerousResults: ExecutionResult[] = [];\n for (const tc of dangerousCalls) {\n const result = await this.executeOne(tc);\n dangerousResults.push(result);\n }\n\n const safeResults = await Promise.allSettled(safePromises);\n\n const results: ExecutionResult[] = [];\n\n // Collect safe results\n for (let i = 0; i < safeResults.length; i++) {\n const r = safeResults[i]!;\n if (r.status === 'fulfilled') {\n results.push(r.value);\n } else {\n results.push({\n toolUseId: safeCalls[i]!.id,\n toolName: safeCalls[i]!.name,\n result: makeToolError(`Tool execution failed: ${r.reason}`),\n });\n }\n }\n\n results.push(...dangerousResults);\n\n // Sort by original order\n const orderMap = new Map(toolCalls.map((tc, i) => [tc.id, i]));\n results.sort((a, b) => (orderMap.get(a.toolUseId) ?? 0) - (orderMap.get(b.toolUseId) ?? 0));\n\n return results;\n }\n\n setOptions(options: Partial<ExecutorOptions>): void {\n Object.assign(this.options, options);\n }\n}\n","import type { LlmUsage } from '../llm/types.js';\nimport { getModelCost } from '../llm/types.js';\n\nexport interface TokenStats {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n cost: number;\n requests: number;\n}\n\nexport class TokenTracker {\n private inputTokens = 0;\n private outputTokens = 0;\n private requests = 0;\n private model = '';\n\n setModel(model: string): void {\n this.model = model;\n }\n\n track(usage: LlmUsage): void {\n this.inputTokens += usage.input_tokens;\n this.outputTokens += usage.output_tokens;\n this.requests++;\n }\n\n getStats(): TokenStats {\n const costs = getModelCost(this.model);\n const cost =\n (this.inputTokens / 1000) * costs.input + (this.outputTokens / 1000) * costs.output;\n\n return {\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n totalTokens: this.inputTokens + this.outputTokens,\n cost,\n requests: this.requests,\n };\n }\n\n getCost(): number {\n return this.getStats().cost;\n }\n\n reset(): void {\n this.inputTokens = 0;\n this.outputTokens = 0;\n this.requests = 0;\n }\n\n format(): string {\n const stats = this.getStats();\n const parts = [\n `Requests: ${stats.requests}`,\n `Input: ${this.formatTokens(stats.inputTokens)}`,\n `Output: ${this.formatTokens(stats.outputTokens)}`,\n `Total: ${this.formatTokens(stats.totalTokens)}`,\n ];\n if (stats.cost > 0) {\n parts.push(`Cost: $${stats.cost.toFixed(4)}`);\n }\n return parts.join(' | ');\n }\n\n private formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return String(n);\n }\n}\n\nexport const tokenTracker = new TokenTracker();\n","export type ContentBlock =\n | { type: 'text'; text: string }\n | { type: 'image'; source: { type: 'base64'; media_type: string; data: string } }\n | { type: 'tool_use'; id: string; name: string; input: Record<string, unknown> }\n | { type: 'tool_result'; tool_use_id: string; content: string | ContentBlock[]; is_error?: boolean };\n\nexport interface Message {\n role: 'user' | 'assistant' | 'system';\n content: string | ContentBlock[];\n}\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\nexport interface ToolCall {\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\nexport interface LlmUsage {\n input_tokens: number;\n output_tokens: number;\n}\n\nexport type StopReason = 'end_turn' | 'tool_use' | 'max_tokens';\n\nexport interface LlmResponse {\n content: ContentBlock[];\n text?: string;\n toolCalls?: ToolCall[];\n usage?: LlmUsage;\n stopReason?: StopReason;\n}\n\nexport interface StreamCallbacks {\n onToken?: (text: string) => void;\n onToolUse?: (toolCall: ToolCall) => void;\n}\n\nexport interface LlmRequestOptions {\n messages: Message[];\n systemPrompt?: string;\n tools?: ToolDefinition[];\n maxTokens?: number;\n temperature?: number;\n stream?: boolean;\n callbacks?: StreamCallbacks;\n}\n\n// Cost per 1K tokens for known models\nexport const MODEL_COSTS: Record<string, { input: number; output: number }> = {\n 'claude-sonnet-4-20250514': { input: 0.003, output: 0.015 },\n 'claude-opus-4-20250514': { input: 0.015, output: 0.075 },\n 'claude-haiku-3-5-20241022': { input: 0.0008, output: 0.004 },\n 'gpt-4o': { input: 0.0025, output: 0.01 },\n 'gpt-4o-mini': { input: 0.00015, output: 0.0006 },\n 'gpt-4.1': { input: 0.002, output: 0.008 },\n 'gpt-4.1-mini': { input: 0.0004, output: 0.0016 },\n 'gpt-4.1-nano': { input: 0.0001, output: 0.0004 },\n};\n\nexport function getModelCost(model: string): { input: number; output: number } {\n return MODEL_COSTS[model] ?? { input: 0, output: 0 };\n}\n","import ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\n\nlet currentSpinner: Ora | null = null;\n\nexport function startSpinner(text: string): Ora {\n stopSpinner();\n currentSpinner = ora({\n text: chalk.dim(text),\n spinner: 'dots',\n color: 'cyan',\n }).start();\n return currentSpinner;\n}\n\nexport function updateSpinner(text: string): void {\n if (currentSpinner) {\n currentSpinner.text = chalk.dim(text);\n }\n}\n\nexport function stopSpinner(symbol?: string): void {\n if (currentSpinner) {\n if (symbol) {\n currentSpinner.stopAndPersist({ symbol });\n } else {\n currentSpinner.stop();\n }\n currentSpinner = null;\n }\n}\n\nexport function succeedSpinner(text?: string): void {\n if (currentSpinner) {\n currentSpinner.succeed(text ? chalk.dim(text) : undefined);\n currentSpinner = null;\n }\n}\n\nexport function failSpinner(text?: string): void {\n if (currentSpinner) {\n currentSpinner.fail(text ? chalk.red(text) : undefined);\n currentSpinner = null;\n }\n}\n","import * as os from 'os';\nimport { execSync } from 'child_process';\n\nexport interface PromptContext {\n model: string;\n provider: string;\n cwd: string;\n codiMd?: string;\n memory?: string;\n gitStatus?: string;\n planMode?: boolean;\n}\n\nconst ROLE_DEFINITION = `You are Codi (코디), a terminal-based AI coding agent. You help users with software engineering tasks including writing code, debugging, refactoring, and explaining code. You have access to tools for file manipulation, code search, shell execution, and more.`;\n\nconst TOOL_HIERARCHY = `# Tool Usage Rules\n- Use read_file instead of bash cat/head/tail\n- Use edit_file instead of bash sed/awk\n- Use write_file instead of bash echo/cat heredoc\n- Use glob instead of bash find/ls for file search\n- Use grep instead of bash grep/rg for content search\n- Reserve bash for system commands that have no dedicated tool\n- Use sub_agent for complex multi-step exploration tasks\n- Call multiple tools in parallel when they are independent`;\n\nconst WINDOWS_RULES = `# Windows Shell Rules\nYou are running on Windows. The shell is PowerShell. Follow these rules:\n- Use PowerShell syntax, NOT bash/sh syntax\n- Path separators: use \\\\\\\\ or / (PowerShell accepts both)\n- mkdir works without -p flag (PowerShell creates parent directories automatically)\n- Use gradlew.bat instead of ./gradlew for Gradle projects\n- Use mvnw.cmd instead of ./mvnw for Maven projects\n- Do NOT use chmod (not available on Windows)\n- Do NOT use HEREDOC (cat <<EOF) — use write_file tool instead\n- Use Remove-Item instead of rm -rf\n- Use Get-ChildItem instead of ls -la\n- Use Invoke-WebRequest or curl.exe instead of curl\n- Environment variables: use $env:VAR_NAME instead of $VAR_NAME\n- Use semicolons (;) or separate commands instead of && for chaining\n- Scripts: use .ps1 files instead of .sh files`;\n\nconst CODE_RULES = `# Code Modification Rules\n- ALWAYS read a file before editing it\n- Prefer edit_file over write_file for existing files\n- Make only the changes that are directly requested\n- Do NOT add unnecessary docstrings, comments, type annotations, or error handling\n- Do NOT over-engineer or add features beyond what was asked\n- Be careful about security vulnerabilities (XSS, SQL injection, command injection)\n- Avoid backwards-compatibility hacks for removed code`;\n\nconst GIT_SAFETY = `# Git Safety\n- NEVER amend existing commits - create new commits\n- NEVER force push\n- NEVER skip hooks (--no-verify)\n- NEVER use interactive mode (-i)\n- NEVER use destructive operations (reset --hard, clean -f, checkout .) without explicit user request\n- Always create new commits rather than amending\n- Stage specific files instead of using 'git add -A'\n- Only commit when explicitly asked`;\n\nconst RESPONSE_STYLE = `# Response Style\n- Keep responses short and concise\n- Reference code with file_path:line_number format\n- Do NOT use emojis unless the user requests them\n- Do NOT create documentation files unless requested\n- Do NOT give time estimates\n- If blocked, try alternative approaches rather than retrying the same thing`;\n\nconst SAFETY_RULES = `# Safety & Caution\n- For irreversible or destructive operations, confirm with the user first\n- Do NOT brute-force solutions - if something fails, try a different approach\n- Be careful with operations that affect shared state (push, PR creation, etc.)\n- Investigate unexpected state before deleting or overwriting\n- Measure twice, cut once`;\n\nexport function buildSystemPrompt(context: PromptContext): string {\n const fragments: string[] = [];\n\n // Role definition\n fragments.push(ROLE_DEFINITION);\n\n // Environment info\n fragments.push(buildEnvironmentInfo(context));\n\n // Tool usage rules\n fragments.push(TOOL_HIERARCHY);\n\n // Windows-specific rules\n if (os.platform() === 'win32') {\n fragments.push(WINDOWS_RULES);\n }\n\n // Code modification rules\n fragments.push(CODE_RULES);\n\n // Git safety\n fragments.push(GIT_SAFETY);\n\n // Response style\n fragments.push(RESPONSE_STYLE);\n\n // Safety rules\n fragments.push(SAFETY_RULES);\n\n // Plan mode\n if (context.planMode) {\n fragments.push(`# Plan Mode\nYou are in PLAN MODE (read-only). You can only use read-only tools (read_file, glob, grep, list_dir, ask_user).\nYou CANNOT modify files, run commands, or make any changes.\nAnalyze the codebase and create a detailed plan for the user to approve.`);\n }\n\n // CODI.md project context\n if (context.codiMd) {\n fragments.push(`# Project Instructions (CODI.md)\\n${context.codiMd}`);\n }\n\n // Auto memory\n if (context.memory) {\n fragments.push(`# Auto Memory\\n${context.memory}`);\n }\n\n // Git status\n if (context.gitStatus) {\n fragments.push(`# Current Git Status\\n${context.gitStatus}`);\n }\n\n return fragments.join('\\n\\n---\\n\\n');\n}\n\nfunction buildEnvironmentInfo(context: PromptContext): string {\n const lines = [\n '# Environment',\n `- Date: ${new Date().toISOString().split('T')[0]}`,\n `- OS: ${os.platform()} ${os.release()}`,\n `- Shell: ${process.env['SHELL'] || process.env['COMSPEC'] || 'unknown'}`,\n `- Working Directory: ${context.cwd}`,\n `- Model: ${context.model}`,\n `- Provider: ${context.provider}`,\n ];\n\n // Check if git repo\n try {\n execSync('git rev-parse --is-inside-work-tree', { cwd: context.cwd, stdio: 'pipe' });\n const branch = execSync('git branch --show-current', { cwd: context.cwd, encoding: 'utf-8' }).trim();\n lines.push(`- Git Branch: ${branch}`);\n lines.push(`- Is Git Repo: true`);\n } catch {\n lines.push(`- Is Git Repo: false`);\n }\n\n return lines.join('\\n');\n}\n\n// Sub-agent system prompts\nexport const EXPLORE_SYSTEM_PROMPT = `You are an Explore agent - a fast, read-only agent specialized for codebase exploration. Your job is to quickly find files, search code, and answer questions about the codebase. You have access to: read_file, glob, grep, list_dir. Be thorough but efficient. Return your findings concisely.`;\n\nexport const PLAN_SYSTEM_PROMPT = `You are a Plan agent - a software architect agent for designing implementation plans. Analyze the codebase, identify critical files, consider trade-offs, and return a step-by-step implementation plan. You have access to: read_file, glob, grep, list_dir, web_fetch. Be thorough in your analysis.`;\n\nexport const GENERAL_SYSTEM_PROMPT = `You are a General sub-agent handling a specific task autonomously. Complete the task fully and return a concise summary of what you did. You have access to all tools except creating more sub-agents.`;\n","import type { LlmProvider } from '../llm/provider.js';\nimport type { Conversation } from './conversation.js';\n\nexport interface CompressorOptions {\n threshold: number; // 0-1, fraction of context window to trigger\n maxContextTokens: number; // Model's context window size\n keepRecentMessages: number; // Number of recent messages to preserve\n}\n\nconst DEFAULT_OPTIONS: CompressorOptions = {\n threshold: 0.7,\n maxContextTokens: 200_000,\n keepRecentMessages: 6,\n};\n\nexport class ContextCompressor {\n private options: CompressorOptions;\n\n constructor(options?: Partial<CompressorOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n shouldCompress(conversation: Conversation): boolean {\n const estimatedTokens = conversation.estimateTokens();\n return estimatedTokens > this.options.maxContextTokens * this.options.threshold;\n }\n\n async compress(\n conversation: Conversation,\n provider: LlmProvider,\n focusHint?: string\n ): Promise<void> {\n const messages = conversation.getMessages();\n if (messages.length <= this.options.keepRecentMessages) return;\n\n // Get messages to summarize (everything except recent)\n const toSummarize = messages.slice(0, -this.options.keepRecentMessages);\n\n // Build summary prompt\n const summaryContent = toSummarize\n .map((m) => {\n const role = m.role;\n const content = typeof m.content === 'string'\n ? m.content\n : m.content\n .map((b) => {\n if (b.type === 'text') return b.text;\n if (b.type === 'tool_use') return `[Tool: ${b.name}]`;\n if (b.type === 'tool_result') return `[Result: ${typeof b.content === 'string' ? b.content.slice(0, 200) : '...'}]`;\n return '';\n })\n .filter(Boolean)\n .join('\\n');\n return `${role}: ${content}`;\n })\n .join('\\n\\n');\n\n const prompt = focusHint\n ? `Summarize this conversation concisely, focusing on: ${focusHint}\\n\\n${summaryContent}`\n : `Summarize this conversation concisely, preserving key decisions, code changes, file paths, and important context:\\n\\n${summaryContent}`;\n\n try {\n const response = await provider.chat({\n messages: [{ role: 'user', content: prompt }],\n systemPrompt: 'You are a conversation summarizer. Create a concise but complete summary that preserves all important technical details, file paths, decisions made, and context needed to continue the conversation.',\n maxTokens: 2000,\n });\n\n const summary = response.text || 'Previous conversation context.';\n conversation.compact(summary, this.options.keepRecentMessages);\n } catch {\n // If summarization fails, just truncate\n conversation.truncateTo(this.options.keepRecentMessages + 2);\n }\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\n\nexport class MemoryManager {\n private memoryDir: string;\n\n constructor() {\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n const projectHash = crypto.createHash('md5').update(process.cwd()).digest('hex').slice(0, 8);\n const projectName = path.basename(process.cwd());\n this.memoryDir = path.join(home, '.codi', 'projects', `${projectName}-${projectHash}`, 'memory');\n }\n\n ensureDir(): void {\n if (!fs.existsSync(this.memoryDir)) {\n fs.mkdirSync(this.memoryDir, { recursive: true });\n }\n }\n\n getMemoryDir(): string {\n return this.memoryDir;\n }\n\n loadIndex(): string {\n const indexPath = path.join(this.memoryDir, 'MEMORY.md');\n if (!fs.existsSync(indexPath)) return '';\n\n const content = fs.readFileSync(indexPath, 'utf-8');\n // Only load first 200 lines\n const lines = content.split('\\n');\n return lines.slice(0, 200).join('\\n');\n }\n\n saveIndex(content: string): void {\n this.ensureDir();\n const indexPath = path.join(this.memoryDir, 'MEMORY.md');\n fs.writeFileSync(indexPath, content, 'utf-8');\n }\n\n loadTopic(name: string): string | null {\n const topicPath = path.join(this.memoryDir, `${name}.md`);\n if (!fs.existsSync(topicPath)) return null;\n return fs.readFileSync(topicPath, 'utf-8');\n }\n\n saveTopic(name: string, content: string): void {\n this.ensureDir();\n const topicPath = path.join(this.memoryDir, `${name}.md`);\n fs.writeFileSync(topicPath, content, 'utf-8');\n }\n\n listTopics(): string[] {\n if (!fs.existsSync(this.memoryDir)) return [];\n return fs\n .readdirSync(this.memoryDir)\n .filter((f) => f.endsWith('.md') && f !== 'MEMORY.md')\n .map((f) => f.replace('.md', ''));\n }\n\n buildMemoryPrompt(): string {\n const index = this.loadIndex();\n if (!index) return '';\n\n const lines = [\n `You have a persistent memory directory at ${this.memoryDir}.`,\n 'Use write_file/edit_file to update memory files as you learn patterns.',\n '',\n 'Current MEMORY.md:',\n index,\n ];\n\n return lines.join('\\n');\n }\n}\n\nexport const memoryManager = new MemoryManager();\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport type { Message } from '../llm/types.js';\nimport { Conversation } from './conversation.js';\n\nexport interface SessionInfo {\n id: string;\n name?: string;\n createdAt: number;\n updatedAt: number;\n messageCount: number;\n cwd: string;\n model: string;\n}\n\nexport class SessionManager {\n private sessionsDir: string;\n\n constructor() {\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n this.sessionsDir = path.join(home, '.codi', 'sessions');\n }\n\n private ensureDir(): void {\n if (!fs.existsSync(this.sessionsDir)) {\n fs.mkdirSync(this.sessionsDir, { recursive: true });\n }\n }\n\n save(conversation: Conversation, name?: string, model?: string): string {\n this.ensureDir();\n const id = name || crypto.randomUUID().slice(0, 8);\n const filePath = path.join(this.sessionsDir, `${id}.jsonl`);\n\n const data = conversation.serialize();\n const meta: SessionInfo = {\n id,\n name,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messageCount: data.messages.length,\n cwd: process.cwd(),\n model: model || 'unknown',\n };\n\n const lines = [\n JSON.stringify({ type: 'meta', ...meta }),\n JSON.stringify({ type: 'system', content: data.systemPrompt }),\n ...data.messages.map((m) => JSON.stringify({ type: 'message', ...m })),\n ];\n\n fs.writeFileSync(filePath, lines.join('\\n') + '\\n', 'utf-8');\n return id;\n }\n\n load(id: string): { conversation: Conversation; meta: SessionInfo } | null {\n const filePath = path.join(this.sessionsDir, `${id}.jsonl`);\n if (!fs.existsSync(filePath)) return null;\n\n const content = fs.readFileSync(filePath, 'utf-8');\n const lines = content.trim().split('\\n').filter(Boolean);\n\n let meta: SessionInfo | null = null;\n let systemPrompt = '';\n const messages: Message[] = [];\n\n for (const line of lines) {\n try {\n const obj = JSON.parse(line);\n if (obj.type === 'meta') {\n meta = obj as SessionInfo;\n } else if (obj.type === 'system') {\n systemPrompt = obj.content;\n } else if (obj.type === 'message') {\n messages.push({ role: obj.role, content: obj.content });\n }\n } catch {\n continue;\n }\n }\n\n if (!meta) return null;\n\n const conversation = Conversation.deserialize({ systemPrompt, messages });\n return { conversation, meta };\n }\n\n list(): SessionInfo[] {\n this.ensureDir();\n const files = fs.readdirSync(this.sessionsDir).filter((f) => f.endsWith('.jsonl'));\n const sessions: SessionInfo[] = [];\n\n for (const file of files) {\n const filePath = path.join(this.sessionsDir, file);\n try {\n const firstLine = fs.readFileSync(filePath, 'utf-8').split('\\n')[0];\n if (firstLine) {\n const meta = JSON.parse(firstLine);\n if (meta.type === 'meta') {\n sessions.push(meta as SessionInfo);\n }\n }\n } catch {\n continue;\n }\n }\n\n return sessions.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n getLatest(): SessionInfo | null {\n const sessions = this.list();\n return sessions[0] ?? null;\n }\n\n delete(id: string): boolean {\n const filePath = path.join(this.sessionsDir, `${id}.jsonl`);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n return true;\n }\n return false;\n }\n\n cleanup(maxAgeDays: number = 30): number {\n const cutoff = Date.now() - maxAgeDays * 24 * 60 * 60 * 1000;\n const sessions = this.list();\n let deleted = 0;\n\n for (const session of sessions) {\n if (session.updatedAt < cutoff) {\n this.delete(session.id);\n deleted++;\n }\n }\n\n return deleted;\n }\n}\n\nexport const sessionManager = new SessionManager();\n","import { execSync } from 'child_process';\nimport { Conversation } from './conversation.js';\n\nexport interface Checkpoint {\n id: number;\n timestamp: number;\n conversation: ReturnType<Conversation['serialize']>;\n gitRef?: string;\n description?: string;\n}\n\nexport class CheckpointManager {\n private checkpoints: Checkpoint[] = [];\n private nextId = 1;\n private isGitRepo: boolean;\n\n constructor() {\n try {\n execSync('git rev-parse --is-inside-work-tree', { stdio: 'pipe' });\n this.isGitRepo = true;\n } catch {\n this.isGitRepo = false;\n }\n }\n\n create(conversation: Conversation, description?: string): number {\n const checkpoint: Checkpoint = {\n id: this.nextId++,\n timestamp: Date.now(),\n conversation: conversation.serialize(),\n description,\n };\n\n if (this.isGitRepo) {\n try {\n // Save git state\n execSync('git stash push -m \"codi-checkpoint\" --include-untracked', {\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n const ref = execSync('git stash list --format=%H', {\n encoding: 'utf-8',\n }).split('\\n')[0]?.trim();\n\n if (ref) {\n checkpoint.gitRef = ref;\n }\n\n // Immediately restore the stash (we just want the ref)\n try {\n execSync('git stash pop', { stdio: 'pipe' });\n } catch {\n // If pop fails, there's nothing to pop\n }\n } catch {\n // Git operations may fail, that's OK\n }\n }\n\n this.checkpoints.push(checkpoint);\n\n // Keep only last 20 checkpoints\n if (this.checkpoints.length > 20) {\n this.checkpoints = this.checkpoints.slice(-20);\n }\n\n return checkpoint.id;\n }\n\n rewind(id?: number): { conversation: Conversation; description?: string } | null {\n let checkpoint: Checkpoint | undefined;\n\n if (id !== undefined) {\n checkpoint = this.checkpoints.find((cp) => cp.id === id);\n } else {\n // Rewind to previous checkpoint\n checkpoint = this.checkpoints[this.checkpoints.length - 2];\n }\n\n if (!checkpoint) return null;\n\n // Restore git state if available\n if (checkpoint.gitRef && this.isGitRepo) {\n try {\n execSync(`git checkout ${checkpoint.gitRef} -- .`, { stdio: 'pipe' });\n } catch {\n // Git restore may fail\n }\n }\n\n // Remove all checkpoints after this one\n const idx = this.checkpoints.indexOf(checkpoint);\n if (idx >= 0) {\n this.checkpoints = this.checkpoints.slice(0, idx + 1);\n }\n\n return {\n conversation: Conversation.deserialize(checkpoint.conversation),\n description: checkpoint.description,\n };\n }\n\n list(): Array<{ id: number; timestamp: number; description?: string }> {\n return this.checkpoints.map((cp) => ({\n id: cp.id,\n timestamp: cp.timestamp,\n description: cp.description,\n }));\n }\n}\n\nexport const checkpointManager = new CheckpointManager();\n","import * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Load CODI.md files hierarchically from CWD up to root,\n * plus CODI.local.md and .codi/rules/*.\n */\nexport function loadCodiMd(): string {\n const fragments: string[] = [];\n let dir = process.cwd();\n const root = path.parse(dir).root;\n\n // Walk up directories\n while (dir !== root) {\n loadFromDir(dir, fragments);\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return fragments.join('\\n\\n---\\n\\n');\n}\n\nfunction loadFromDir(dir: string, fragments: string[]): void {\n // CODI.md\n const codiPath = path.join(dir, 'CODI.md');\n if (fs.existsSync(codiPath)) {\n try {\n let content = fs.readFileSync(codiPath, 'utf-8');\n content = processImports(content, dir);\n fragments.push(`[CODI.md from ${dir}]\\n${content}`);\n } catch {\n // Skip unreadable files\n }\n }\n\n // CODI.local.md (local overrides, gitignored)\n const localPath = path.join(dir, 'CODI.local.md');\n if (fs.existsSync(localPath)) {\n try {\n const content = fs.readFileSync(localPath, 'utf-8');\n fragments.push(`[CODI.local.md from ${dir}]\\n${content}`);\n } catch {\n // Skip\n }\n }\n\n // .codi/rules/*.md\n const rulesDir = path.join(dir, '.codi', 'rules');\n if (fs.existsSync(rulesDir)) {\n try {\n const files = fs.readdirSync(rulesDir).filter((f) => f.endsWith('.md')).sort();\n for (const file of files) {\n const content = fs.readFileSync(path.join(rulesDir, file), 'utf-8');\n fragments.push(`[Rule: ${file}]\\n${content}`);\n }\n } catch {\n // Skip\n }\n }\n}\n\n/**\n * Process @path/to/import directives in CODI.md\n */\nfunction processImports(content: string, baseDir: string): string {\n return content.replace(/@([\\w./-]+)/g, (match, importPath) => {\n const resolved = path.resolve(baseDir, importPath);\n if (fs.existsSync(resolved)) {\n try {\n return fs.readFileSync(resolved, 'utf-8');\n } catch {\n return match;\n }\n }\n return match;\n });\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nexport type AgentMode = 'plan' | 'execute';\n\nlet currentMode: AgentMode = 'execute';\n\nexport function getMode(): AgentMode {\n return currentMode;\n}\n\nexport function setMode(mode: AgentMode): void {\n currentMode = mode;\n}\n\nexport function isPlanMode(): boolean {\n return currentMode === 'plan';\n}\n\nexport function savePlan(name: string, content: string): string {\n const planDir = path.join(process.cwd(), '.codi', 'plans');\n if (!fs.existsSync(planDir)) {\n fs.mkdirSync(planDir, { recursive: true });\n }\n\n const planPath = path.join(planDir, `${name}.md`);\n fs.writeFileSync(planPath, content, 'utf-8');\n return planPath;\n}\n\nexport function loadPlan(name: string): string | null {\n const planPath = path.join(process.cwd(), '.codi', 'plans', `${name}.md`);\n if (!fs.existsSync(planPath)) return null;\n return fs.readFileSync(planPath, 'utf-8');\n}\n\nexport function listPlans(): string[] {\n const planDir = path.join(process.cwd(), '.codi', 'plans');\n if (!fs.existsSync(planDir)) return [];\n return fs.readdirSync(planDir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.replace('.md', ''));\n}\n","import type { Tool } from './tool.js';\nimport type { ToolDefinition } from '../llm/types.js';\n\nexport class ToolRegistry {\n private tools: Map<string, Tool> = new Map();\n\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n registerAll(tools: Tool[]): void {\n for (const tool of tools) {\n this.register(tool);\n }\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n remove(name: string): boolean {\n return this.tools.delete(name);\n }\n\n list(): Tool[] {\n return [...this.tools.values()];\n }\n\n listNames(): string[] {\n return [...this.tools.keys()];\n }\n\n getToolDefinitions(options?: { readOnly?: boolean; names?: string[] }): ToolDefinition[] {\n let tools = [...this.tools.values()];\n\n if (options?.readOnly) {\n tools = tools.filter((t) => t.readOnly);\n }\n\n if (options?.names) {\n const nameSet = new Set(options.names);\n tools = tools.filter((t) => nameSet.has(t.name));\n }\n\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema,\n }));\n }\n\n clone(): ToolRegistry {\n const newRegistry = new ToolRegistry();\n for (const [, tool] of this.tools) {\n newRegistry.register(tool);\n }\n return newRegistry;\n }\n\n subset(names: string[]): ToolRegistry {\n const newRegistry = new ToolRegistry();\n for (const name of names) {\n const tool = this.tools.get(name);\n if (tool) newRegistry.register(tool);\n }\n return newRegistry;\n }\n}\n","import * as readline from 'node:readline/promises';\nimport chalk from 'chalk';\nimport type { Tool } from '../tools/tool.js';\nimport { evaluatePermission } from '../config/permissions.js';\nimport { configManager } from '../config/config.js';\n\nexport type PermissionMode = 'default' | 'acceptEdits' | 'plan' | 'yolo';\n\nconst sessionAllowed: Set<string> = new Set();\nconst sessionDenied: Set<string> = new Set();\n\nlet currentMode: PermissionMode = 'default';\n\nexport function setPermissionMode(mode: PermissionMode): void {\n currentMode = mode;\n}\n\nexport function getPermissionMode(): PermissionMode {\n return currentMode;\n}\n\nexport async function checkPermission(\n tool: Tool,\n input: Record<string, unknown>\n): Promise<boolean> {\n // Non-dangerous tools are always allowed\n if (!tool.dangerous) return true;\n\n // YOLO mode allows everything\n if (currentMode === 'yolo') return true;\n\n // Accept edits mode auto-approves file modifications\n if (currentMode === 'acceptEdits' && ['write_file', 'edit_file', 'multi_edit'].includes(tool.name)) {\n return true;\n }\n\n // Plan mode blocks non-readOnly tools\n if (currentMode === 'plan' && !tool.readOnly) {\n return false;\n }\n\n const config = configManager.get();\n const decision = evaluatePermission(tool.name, input, config.permissions);\n\n if (decision === 'allow') return true;\n if (decision === 'deny') {\n console.log(chalk.red(`✗ Permission denied for ${tool.name} (denied by rule)`));\n return false;\n }\n\n // Check session memory\n const key = `${tool.name}:${JSON.stringify(input)}`;\n if (sessionAllowed.has(tool.name)) return true;\n if (sessionDenied.has(tool.name)) return false;\n\n // Ask user\n return promptUser(tool, input);\n}\n\nasync function promptUser(tool: Tool, input: Record<string, unknown>): Promise<boolean> {\n console.log('');\n console.log(chalk.yellow.bold(`⚠ Permission Required: ${tool.name}`));\n\n // Show relevant input parameters\n const relevantParams = Object.entries(input).filter(([, v]) => v !== undefined);\n for (const [key, value] of relevantParams) {\n const displayValue = typeof value === 'string' && value.length > 200\n ? value.slice(0, 200) + '...'\n : String(value);\n console.log(chalk.dim(` ${key}: `) + displayValue);\n }\n console.log('');\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const answer = await rl.question(\n chalk.yellow(`Allow? [${chalk.bold('Y')}es / ${chalk.bold('n')}o / ${chalk.bold('a')}lways for this tool] `)\n );\n rl.close();\n\n const choice = answer.trim().toLowerCase();\n\n if (choice === 'a' || choice === 'always') {\n sessionAllowed.add(tool.name);\n return true;\n }\n\n if (choice === 'n' || choice === 'no') {\n return false;\n }\n\n // Default to yes\n return true;\n } catch {\n rl.close();\n return false;\n }\n}\n\nexport function resetSessionPermissions(): void {\n sessionAllowed.clear();\n sessionDenied.clear();\n}\n","export interface PermissionRule {\n tool: string;\n pattern?: string; // Optional argument pattern\n}\n\nexport type PermissionDecision = 'allow' | 'deny' | 'ask';\n\nexport function parseRule(rule: string): PermissionRule {\n const match = rule.match(/^(\\w+)(?:\\((.+)\\))?$/);\n if (match) {\n return { tool: match[1]!, pattern: match[2] };\n }\n return { tool: rule };\n}\n\nexport function matchesRule(rule: PermissionRule, toolName: string, input: Record<string, unknown>): boolean {\n if (rule.tool !== toolName) return false;\n\n if (!rule.pattern) return true;\n\n // Check if any input value matches the pattern\n const pattern = new RegExp(rule.pattern.replace(/\\*/g, '.*'));\n for (const value of Object.values(input)) {\n if (typeof value === 'string' && pattern.test(value)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function evaluatePermission(\n toolName: string,\n input: Record<string, unknown>,\n rules: { allow: string[]; deny: string[]; ask: string[] }\n): PermissionDecision {\n // Deny takes precedence\n for (const rule of rules.deny) {\n if (matchesRule(parseRule(rule), toolName, input)) {\n return 'deny';\n }\n }\n\n // Then ask\n for (const rule of rules.ask) {\n if (matchesRule(parseRule(rule), toolName, input)) {\n return 'ask';\n }\n }\n\n // Then allow\n for (const rule of rules.allow) {\n if (matchesRule(parseRule(rule), toolName, input)) {\n return 'allow';\n }\n }\n\n // Default: ask for dangerous tools, allow for safe\n return 'ask';\n}\n","import { exec } from 'child_process';\nimport * as os from 'os';\nimport type { ToolResult } from '../tools/tool.js';\nimport { configManager, type HookConfig } from '../config/config.js';\n\nfunction getDefaultShell(): string | undefined {\n if (os.platform() === 'win32') {\n return 'powershell.exe';\n }\n return undefined; // let Node.js use system default on Unix\n}\n\nexport type HookEvent = 'PreToolUse' | 'PostToolUse' | 'SessionStart' | 'SessionEnd' | 'PreCompact' | 'Stop';\n\nexport interface HookResult {\n proceed: boolean;\n reason?: string;\n updatedInput?: Record<string, unknown>;\n}\n\nexport class HookManager {\n async runHooks(\n event: HookEvent,\n context: {\n tool?: string;\n args?: Record<string, unknown>;\n result?: ToolResult;\n sessionId?: string;\n cwd?: string;\n }\n ): Promise<HookResult> {\n const config = configManager.get();\n const hookConfigs = config.hooks[event];\n if (!hookConfigs || hookConfigs.length === 0) {\n return { proceed: true };\n }\n\n for (const hookConfig of hookConfigs) {\n // Check matcher\n if (context.tool && hookConfig.matcher) {\n const matcher = new RegExp(hookConfig.matcher);\n if (!matcher.test(context.tool)) continue;\n }\n\n for (const hook of hookConfig.hooks) {\n if (hook.type === 'command' && hook.command) {\n const result = await this.runCommandHook(hook.command, context, hook.timeout);\n if (!result.proceed) return result;\n if (result.updatedInput) {\n context.args = result.updatedInput;\n }\n }\n }\n }\n\n return { proceed: true };\n }\n\n private async runCommandHook(\n command: string,\n context: Record<string, unknown>,\n timeout?: number\n ): Promise<HookResult> {\n return new Promise((resolve) => {\n const stdinData = JSON.stringify({\n tool: context['tool'],\n args: context['args'],\n session_id: context['sessionId'],\n cwd: context['cwd'] || process.cwd(),\n });\n\n const proc = exec(command, {\n timeout: timeout || 5000,\n cwd: process.cwd(),\n env: { ...process.env },\n shell: getDefaultShell(),\n }, (err, stdout, stderr) => {\n if (err) {\n // Exit code 2 means block\n if ((err as any).code === 2) {\n resolve({\n proceed: false,\n reason: stderr || stdout || 'Blocked by hook',\n });\n return;\n }\n // Other errors: warn but proceed\n resolve({ proceed: true });\n return;\n }\n\n // Try to parse JSON output\n try {\n const output = JSON.parse(stdout);\n resolve({\n proceed: output.decision !== 'block',\n reason: output.reason,\n updatedInput: output.updatedInput,\n });\n } catch {\n resolve({ proceed: true });\n }\n });\n\n // Send context via stdin\n if (proc.stdin) {\n proc.stdin.write(stdinData);\n proc.stdin.end();\n }\n });\n }\n}\n\nexport const hookManager = new HookManager();\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { Tool, ToolResult } from '../tools/tool.js';\nimport { makeToolResult, makeToolError } from '../tools/tool.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport { configManager } from '../config/config.js';\nimport chalk from 'chalk';\n\ninterface McpServer {\n name: string;\n client: Client;\n transport: StdioClientTransport;\n tools: string[];\n}\n\nexport class McpManager {\n private servers: Map<string, McpServer> = new Map();\n\n async initialize(registry: ToolRegistry): Promise<void> {\n const config = configManager.get();\n\n // Also check for mcp.json files\n const mcpConfigs = this.loadMcpConfigs();\n const allServers = { ...mcpConfigs, ...config.mcpServers };\n\n for (const [name, serverConfig] of Object.entries(allServers)) {\n try {\n await this.connectServer(name, serverConfig, registry);\n } catch (err) {\n console.error(chalk.yellow(` ⚠ Failed to connect MCP server '${name}': ${err instanceof Error ? err.message : String(err)}`));\n }\n }\n }\n\n private loadMcpConfigs(): Record<string, { command: string; args?: string[]; env?: Record<string, string> }> {\n const configs: Record<string, any> = {};\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n\n const paths = [\n path.join(home, '.codi', 'mcp.json'),\n path.join(process.cwd(), '.codi', 'mcp.json'),\n ];\n\n for (const p of paths) {\n try {\n if (fs.existsSync(p)) {\n const content = JSON.parse(fs.readFileSync(p, 'utf-8'));\n if (content.mcpServers) {\n Object.assign(configs, content.mcpServers);\n }\n }\n } catch {\n // Skip invalid configs\n }\n }\n\n return configs;\n }\n\n private async connectServer(\n name: string,\n config: { command: string; args?: string[]; env?: Record<string, string> },\n registry: ToolRegistry\n ): Promise<void> {\n const transport = new StdioClientTransport({\n command: config.command,\n args: config.args,\n env: { ...process.env, ...(config.env || {}) } as Record<string, string>,\n });\n\n const client = new Client({\n name: 'codi',\n version: '0.1.0',\n });\n\n await client.connect(transport);\n\n // Discover tools\n const toolsResult = await client.listTools();\n const toolNames: string[] = [];\n\n for (const mcpTool of toolsResult.tools) {\n const toolName = `mcp__${name}__${mcpTool.name}`;\n toolNames.push(toolName);\n\n const tool: Tool = {\n name: toolName,\n description: `[MCP:${name}] ${mcpTool.description || mcpTool.name}`,\n inputSchema: (mcpTool.inputSchema as Record<string, unknown>) || { type: 'object', properties: {} },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n try {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: input,\n });\n\n const contentArr = Array.isArray(result.content) ? result.content : [];\n const text = contentArr\n .map((c: any) => {\n if (c.type === 'text') return c.text;\n return JSON.stringify(c);\n })\n .join('\\n') || '';\n\n return makeToolResult(text);\n } catch (err) {\n return makeToolError(`MCP tool error: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n };\n\n registry.register(tool);\n }\n\n this.servers.set(name, { name, client, transport, tools: toolNames });\n console.log(chalk.dim(` ✓ MCP server '${name}' connected (${toolNames.length} tools)`));\n }\n\n async disconnect(name: string): Promise<void> {\n const server = this.servers.get(name);\n if (!server) return;\n\n try {\n await server.transport.close();\n } catch {\n // Ignore disconnect errors\n }\n this.servers.delete(name);\n }\n\n async disconnectAll(): Promise<void> {\n for (const [name] of this.servers) {\n await this.disconnect(name);\n }\n }\n\n listServers(): Array<{ name: string; tools: string[] }> {\n return [...this.servers.values()].map((s) => ({\n name: s.name,\n tools: s.tools,\n }));\n }\n\n getServerCount(): number {\n return this.servers.size;\n }\n}\n\nexport const mcpManager = new McpManager();\n","import type { LlmProvider } from '../llm/provider.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type { ToolResult } from '../tools/tool.js';\nimport { makeToolResult, makeToolError } from '../tools/tool.js';\nimport { agentLoop } from './agent-loop.js';\nimport { Conversation } from './conversation.js';\nimport { EXPLORE_SYSTEM_PROMPT, PLAN_SYSTEM_PROMPT, GENERAL_SYSTEM_PROMPT } from './system-prompt.js';\nimport chalk from 'chalk';\n\nexport interface SubAgentConfig {\n type: 'explore' | 'plan' | 'general';\n task: string;\n tools?: string[];\n model?: string;\n maxIterations?: number;\n background?: boolean;\n}\n\nconst AGENT_PRESETS: Record<string, {\n tools: string[];\n systemPrompt: string;\n maxIterations: number;\n}> = {\n explore: {\n tools: ['read_file', 'glob', 'grep', 'list_dir'],\n systemPrompt: EXPLORE_SYSTEM_PROMPT,\n maxIterations: 15,\n },\n plan: {\n tools: ['read_file', 'glob', 'grep', 'list_dir', 'web_fetch'],\n systemPrompt: PLAN_SYSTEM_PROMPT,\n maxIterations: 20,\n },\n general: {\n tools: [], // Empty means all tools except sub_agent\n systemPrompt: GENERAL_SYSTEM_PROMPT,\n maxIterations: 25,\n },\n};\n\n// Background tasks\nconst backgroundAgents: Map<string, { promise: Promise<string>; status: string; result?: string }> = new Map();\nlet bgCounter = 0;\n\nexport function createSubAgentHandler(\n provider: LlmProvider,\n mainRegistry: ToolRegistry\n): (input: Record<string, unknown>) => Promise<ToolResult> {\n return async (input: Record<string, unknown>): Promise<ToolResult> => {\n const type = String(input['type']) as SubAgentConfig['type'];\n const task = String(input['task']);\n const background = input['background'] === true;\n\n const preset = AGENT_PRESETS[type];\n if (!preset) {\n return makeToolError(`Unknown agent type: ${type}. Use 'explore', 'plan', or 'general'.`);\n }\n\n // Create restricted registry\n let registry: ToolRegistry;\n if (preset.tools.length > 0) {\n registry = mainRegistry.subset(preset.tools);\n } else {\n // General: all tools except sub_agent (prevent nesting)\n registry = mainRegistry.clone();\n registry.remove('sub_agent');\n }\n\n const conversation = new Conversation();\n const maxIterations = (input['maxIterations'] as number) || preset.maxIterations;\n\n console.log(chalk.dim(`\\n ▸ Launching ${type} agent: ${task.slice(0, 80)}...`));\n\n const runAgent = async (): Promise<string> => {\n const result = await agentLoop(task, {\n provider,\n conversation,\n registry,\n systemPrompt: preset.systemPrompt,\n maxIterations,\n stream: false,\n showOutput: false,\n });\n return result;\n };\n\n if (background) {\n const taskId = `agent_${++bgCounter}`;\n const entry: { promise: Promise<string>; status: string; result?: string } = { promise: runAgent(), status: 'running', result: undefined };\n backgroundAgents.set(taskId, entry);\n\n entry.promise\n .then((result) => {\n entry.status = 'done';\n entry.result = result;\n })\n .catch((err) => {\n entry.status = 'error';\n entry.result = String(err);\n });\n\n return makeToolResult(`Background agent started with ID: ${taskId}. Use task output to check results.`);\n }\n\n try {\n const result = await runAgent();\n console.log(chalk.dim(` ▸ ${type} agent completed.`));\n return makeToolResult(result);\n } catch (err) {\n return makeToolError(`Sub-agent failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n };\n}\n\nexport function getBackgroundAgentResult(taskId: string): { status: string; result?: string } | null {\n const entry = backgroundAgents.get(taskId);\n if (!entry) return null;\n return { status: entry.status, result: entry.result };\n}\n","import type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\n// Forward reference - will be connected in stage 10\nlet subAgentHandler: ((input: Record<string, unknown>) => Promise<ToolResult>) | null = null;\n\nexport function setSubAgentHandler(handler: (input: Record<string, unknown>) => Promise<ToolResult>): void {\n subAgentHandler = handler;\n}\n\nexport const subAgentTool: Tool = {\n name: 'sub_agent',\n description: `Launch a sub-agent to handle complex tasks autonomously. Types: 'explore' (read-only codebase exploration), 'plan' (architecture planning), 'general' (full capabilities). Sub-agents run in independent contexts.`,\n inputSchema: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: ['explore', 'plan', 'general'],\n description: 'Agent type: explore (fast, read-only), plan (analysis), general (full access)',\n },\n task: { type: 'string', description: 'Detailed task description for the agent' },\n model: { type: 'string', description: 'Optional model override' },\n background: { type: 'boolean', description: 'Run in background and return task ID' },\n },\n required: ['type', 'task'],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n if (!subAgentHandler) {\n return makeToolError('Sub-agent system not initialized. This feature will be available after setup.');\n }\n return subAgentHandler(input);\n },\n};\n","import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport { tokenTracker } from '../agent/token-tracker.js';\nimport { sessionManager } from '../agent/session.js';\nimport { memoryManager } from '../agent/memory.js';\nimport { checkpointManager } from '../agent/checkpoint.js';\nimport { setMode, getMode, listPlans } from '../agent/mode-manager.js';\nimport { statusLine } from '../ui/status-line.js';\nimport { mcpManager } from '../mcp/mcp-manager.js';\nimport { configManager } from './config.js';\nimport type { Conversation } from '../agent/conversation.js';\nimport type { LlmProvider } from '../llm/provider.js';\nimport type { ContextCompressor } from '../agent/context-compressor.js';\n\nexport interface SlashCommandContext {\n conversation: Conversation;\n provider: LlmProvider;\n compressor: ContextCompressor;\n setProvider: (name: string, model: string) => void;\n reloadSystemPrompt: () => void;\n exitFn?: () => Promise<void>;\n}\n\nexport interface SlashCommand {\n name: string;\n aliases?: string[];\n description: string;\n handler: (args: string, ctx: SlashCommandContext) => Promise<boolean>;\n}\n\nexport function createBuiltinCommands(): SlashCommand[] {\n return [\n {\n name: '/help',\n description: 'Show available commands',\n handler: async () => {\n const commands = createBuiltinCommands();\n console.log(chalk.bold('\\nAvailable Commands:\\n'));\n for (const cmd of commands) {\n const aliases = cmd.aliases ? chalk.dim(` (${cmd.aliases.join(', ')})`) : '';\n console.log(` ${chalk.cyan(cmd.name)}${aliases} - ${cmd.description}`);\n }\n console.log('');\n console.log(chalk.dim(' Prefixes: ! (bash), @ (file reference)'));\n console.log(chalk.dim(' Use \\\\ at end of line for multiline input'));\n console.log('');\n return true;\n },\n },\n {\n name: '/quit',\n aliases: ['/exit'],\n description: 'Exit Codi',\n handler: async (_args, ctx) => {\n if (ctx.exitFn) {\n await ctx.exitFn();\n }\n console.log(chalk.dim('\\nGoodbye!\\n'));\n process.exit(0);\n },\n },\n {\n name: '/clear',\n aliases: ['/reset', '/new'],\n description: 'Clear conversation history',\n handler: async (_args, ctx) => {\n ctx.conversation.clear();\n ctx.reloadSystemPrompt();\n console.log(chalk.green('✓ Conversation cleared'));\n return true;\n },\n },\n {\n name: '/model',\n description: 'Switch model or provider (e.g., /model gpt-4o, /model ollama:llama3.1)',\n handler: async (args, ctx) => {\n if (!args) {\n const info = statusLine.getInfo();\n console.log(chalk.cyan(`Current model: ${info.model} (${info.provider})`));\n return true;\n }\n\n if (args.includes(':')) {\n const [provider, model] = args.split(':');\n ctx.setProvider(provider!, model!);\n } else {\n ctx.setProvider('', args);\n }\n console.log(chalk.green(`✓ Model switched to: ${args}`));\n return true;\n },\n },\n {\n name: '/compact',\n description: 'Compress conversation history (optional: focus hint)',\n handler: async (args, ctx) => {\n console.log(chalk.dim('Compressing conversation...'));\n await ctx.compressor.compress(ctx.conversation, ctx.provider, args || undefined);\n ctx.reloadSystemPrompt();\n console.log(chalk.green('✓ Conversation compressed'));\n return true;\n },\n },\n {\n name: '/cost',\n description: 'Show token usage and cost',\n handler: async () => {\n console.log(chalk.cyan(`\\n${tokenTracker.format()}\\n`));\n return true;\n },\n },\n {\n name: '/config',\n description: 'Show current configuration',\n handler: async () => {\n const config = configManager.get();\n console.log(chalk.bold('\\nConfiguration:\\n'));\n console.log(chalk.dim(JSON.stringify(config, null, 2)));\n console.log(chalk.dim(`\\nConfig files: ${configManager.getConfigPaths().join(', ') || '(none)'}`));\n console.log('');\n return true;\n },\n },\n {\n name: '/permissions',\n description: 'Show permission rules',\n handler: async () => {\n const config = configManager.get();\n console.log(chalk.bold('\\nPermission Rules:\\n'));\n console.log(chalk.green(' Allow: ') + config.permissions.allow.join(', '));\n console.log(chalk.red(' Deny: ') + (config.permissions.deny.join(', ') || '(none)'));\n console.log(chalk.yellow(' Ask: ') + config.permissions.ask.join(', '));\n console.log('');\n return true;\n },\n },\n {\n name: '/save',\n description: 'Save current session',\n handler: async (args, ctx) => {\n const name = args || undefined;\n const id = sessionManager.save(ctx.conversation, name, statusLine.getInfo().model);\n console.log(chalk.green(`✓ Session saved: ${id}`));\n return true;\n },\n },\n {\n name: '/resume',\n aliases: ['/continue'],\n description: 'Resume a saved session',\n handler: async (args, ctx) => {\n const id = args || sessionManager.getLatest()?.id;\n if (!id) {\n console.log(chalk.yellow('No sessions found. Use /save to save a session first.'));\n return true;\n }\n\n const session = sessionManager.load(id);\n if (!session) {\n console.log(chalk.red(`Session not found: ${id}`));\n return true;\n }\n\n // Replace current conversation\n const data = session.conversation.serialize();\n ctx.conversation.clear();\n ctx.conversation.setSystemPrompt(data.systemPrompt);\n for (const msg of data.messages) {\n if (msg.role === 'user') ctx.conversation.addUserMessage(msg.content);\n else if (msg.role === 'assistant') ctx.conversation.addAssistantMessage(msg.content);\n }\n\n console.log(chalk.green(`✓ Resumed session: ${id} (${session.meta.messageCount} messages)`));\n return true;\n },\n },\n {\n name: '/fork',\n description: 'Fork current conversation into a new session',\n handler: async (args, ctx) => {\n const name = args || `fork-${Date.now()}`;\n const id = sessionManager.save(ctx.conversation, name, statusLine.getInfo().model);\n console.log(chalk.green(`✓ Conversation forked: ${id}`));\n return true;\n },\n },\n {\n name: '/plan',\n description: 'Toggle plan mode (read-only analysis)',\n handler: async () => {\n const current = getMode();\n const newMode = current === 'plan' ? 'execute' : 'plan';\n setMode(newMode);\n statusLine.update({ mode: newMode });\n console.log(chalk.cyan(`Mode: ${newMode === 'plan' ? 'PLAN (read-only)' : 'EXECUTE'}`));\n return true;\n },\n },\n {\n name: '/memory',\n description: 'Show or edit auto memory',\n handler: async () => {\n const index = memoryManager.loadIndex();\n const topics = memoryManager.listTopics();\n\n console.log(chalk.bold('\\nAuto Memory:\\n'));\n console.log(chalk.dim(`Directory: ${memoryManager.getMemoryDir()}`));\n\n if (index) {\n console.log(chalk.dim('\\nMEMORY.md:'));\n console.log(index);\n } else {\n console.log(chalk.dim('\\nNo memory saved yet.'));\n }\n\n if (topics.length > 0) {\n console.log(chalk.dim(`\\nTopics: ${topics.join(', ')}`));\n }\n console.log('');\n return true;\n },\n },\n {\n name: '/init',\n description: 'Initialize CODI.md in the current project',\n handler: async () => {\n const codiPath = path.join(process.cwd(), 'CODI.md');\n if (fs.existsSync(codiPath)) {\n console.log(chalk.yellow('CODI.md already exists'));\n return true;\n }\n\n const content = `# Project: ${path.basename(process.cwd())}\n\n## Overview\n<!-- Describe your project here -->\n\n## Architecture\n<!-- Key architectural decisions -->\n\n## Development\n<!-- Development guidelines, commands, etc. -->\n\n## Conventions\n<!-- Code style, naming conventions, etc. -->\n`;\n fs.writeFileSync(codiPath, content, 'utf-8');\n console.log(chalk.green('✓ Created CODI.md'));\n return true;\n },\n },\n {\n name: '/export',\n description: 'Export conversation to a file',\n handler: async (args, ctx) => {\n const filePath = args || `conversation-${Date.now()}.md`;\n const messages = ctx.conversation.getMessages();\n\n let md = `# Codi Conversation Export\\n\\nDate: ${new Date().toISOString()}\\n\\n---\\n\\n`;\n for (const msg of messages) {\n const role = msg.role === 'user' ? 'User' : msg.role === 'assistant' ? 'Codi' : 'System';\n const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content, null, 2);\n md += `## ${role}\\n\\n${content}\\n\\n---\\n\\n`;\n }\n\n fs.writeFileSync(filePath, md, 'utf-8');\n console.log(chalk.green(`✓ Exported to ${filePath}`));\n return true;\n },\n },\n {\n name: '/tasks',\n description: 'Show task list',\n handler: async () => {\n const { taskManager } = await import('../tools/task-tools.js');\n const tasks = taskManager.list();\n if (tasks.length === 0) {\n console.log(chalk.dim('\\nNo tasks.\\n'));\n return true;\n }\n console.log(chalk.bold('\\nTasks:\\n'));\n for (const task of tasks) {\n const statusIcon = task.status === 'completed' ? chalk.green('✓') :\n task.status === 'in_progress' ? chalk.yellow('⟳') : chalk.dim('○');\n console.log(` ${statusIcon} #${task.id} ${task.subject} [${task.status}]`);\n }\n console.log('');\n return true;\n },\n },\n {\n name: '/status',\n description: 'Show system status',\n handler: async () => {\n const config = configManager.get();\n const info = statusLine.getInfo();\n const stats = tokenTracker.getStats();\n const mcpServers = mcpManager.listServers();\n\n console.log(chalk.bold('\\nCodi Status:\\n'));\n console.log(` Version: 0.1.0`);\n console.log(` Model: ${info.model}`);\n console.log(` Provider: ${config.provider}`);\n console.log(` Mode: ${getMode()}`);\n console.log(` Tokens: ${tokenTracker.format()}`);\n console.log(` MCP: ${mcpServers.length} server(s)`);\n for (const s of mcpServers) {\n console.log(` - ${s.name} (${s.tools.length} tools)`);\n }\n console.log('');\n return true;\n },\n },\n {\n name: '/context',\n description: 'Show context window usage',\n handler: async (_args, ctx) => {\n const estimated = ctx.conversation.estimateTokens();\n const max = 200_000;\n const pct = Math.round((estimated / max) * 100);\n const bar = '█'.repeat(Math.round(pct / 5)) + '░'.repeat(20 - Math.round(pct / 5));\n\n console.log(chalk.bold('\\nContext Window:\\n'));\n console.log(` ${bar} ${pct}%`);\n console.log(` ~${estimated.toLocaleString()} / ${max.toLocaleString()} tokens`);\n console.log(` Messages: ${ctx.conversation.getMessageCount()}`);\n console.log('');\n return true;\n },\n },\n {\n name: '/rewind',\n description: 'Rewind to a previous checkpoint',\n handler: async (_args, ctx) => {\n const checkpoints = checkpointManager.list();\n if (checkpoints.length === 0) {\n console.log(chalk.yellow('No checkpoints available.'));\n return true;\n }\n\n const result = checkpointManager.rewind();\n if (!result) {\n console.log(chalk.yellow('No checkpoint to rewind to.'));\n return true;\n }\n\n // Restore conversation\n const data = result.conversation.serialize();\n ctx.conversation.clear();\n ctx.conversation.setSystemPrompt(data.systemPrompt);\n for (const msg of data.messages) {\n if (msg.role === 'user') ctx.conversation.addUserMessage(msg.content);\n else if (msg.role === 'assistant') ctx.conversation.addAssistantMessage(msg.content);\n }\n\n console.log(chalk.green(`✓ Rewound to checkpoint${result.description ? `: ${result.description}` : ''}`));\n return true;\n },\n },\n {\n name: '/diff',\n description: 'Show git diff of current changes',\n handler: async () => {\n try {\n const { execSync } = await import('child_process');\n const diff = execSync('git diff', { encoding: 'utf-8', cwd: process.cwd() });\n if (!diff.trim()) {\n console.log(chalk.dim('\\nNo changes.\\n'));\n } else {\n const { renderDiff } = await import('../ui/renderer.js');\n console.log('\\n' + renderDiff('', '', diff) + '\\n');\n }\n } catch {\n console.log(chalk.yellow('Not a git repository or git not available.'));\n }\n return true;\n },\n },\n {\n name: '/commit',\n description: 'Generate commit message and commit with AI',\n handler: async (_args, ctx) => {\n const { execSync } = await import('child_process');\n try {\n const staged = execSync('git diff --cached', { encoding: 'utf-8', cwd: process.cwd() });\n const unstaged = execSync('git diff', { encoding: 'utf-8', cwd: process.cwd() });\n const diff = staged + unstaged;\n if (!diff.trim()) {\n console.log(chalk.dim('\\nNo changes to commit.\\n'));\n return true;\n }\n ctx.conversation.addUserMessage(\n `다음 git diff를 분석해서 적절한 커밋 메시지를 생성하고, git 도구로 변경된 파일을 add하고 커밋해줘.\\n\\n\\`\\`\\`diff\\n${diff}\\n\\`\\`\\``\n );\n return false;\n } catch {\n console.log(chalk.yellow('Not a git repository or git not available.'));\n return true;\n }\n },\n },\n {\n name: '/review',\n description: 'AI code review of current changes',\n handler: async (_args, ctx) => {\n const { execSync } = await import('child_process');\n try {\n const staged = execSync('git diff --cached', { encoding: 'utf-8', cwd: process.cwd() });\n const unstaged = execSync('git diff', { encoding: 'utf-8', cwd: process.cwd() });\n const diff = staged + unstaged;\n if (!diff.trim()) {\n console.log(chalk.dim('\\nNo changes to review.\\n'));\n return true;\n }\n ctx.conversation.addUserMessage(\n `다음 git diff를 코드 리뷰해줘. 보안 취약점, 버그, 성능, 코드 스타일 관점에서 분석하고 개선 사항을 알려줘.\\n\\n\\`\\`\\`diff\\n${diff}\\n\\`\\`\\``\n );\n return false;\n } catch {\n console.log(chalk.yellow('Not a git repository or git not available.'));\n return true;\n }\n },\n },\n {\n name: '/search',\n description: 'Search past conversation sessions',\n handler: async (args) => {\n if (!args) {\n console.log(chalk.yellow('Usage: /search <keyword>'));\n return true;\n }\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n const sessionsDir = path.join(home, '.codi', 'sessions');\n if (!fs.existsSync(sessionsDir)) {\n console.log(chalk.dim('\\nNo sessions found.\\n'));\n return true;\n }\n const files = fs.readdirSync(sessionsDir).filter((f) => f.endsWith('.jsonl'));\n const results: { sessionId: string; date: string; preview: string }[] = [];\n const keyword = args.toLowerCase();\n\n for (const file of files) {\n if (results.length >= 10) break;\n const filePath = path.join(sessionsDir, file);\n const lines = fs.readFileSync(filePath, 'utf-8').split('\\n').filter(Boolean);\n for (const line of lines) {\n if (results.length >= 10) break;\n if (line.toLowerCase().includes(keyword)) {\n const sessionId = file.replace('.jsonl', '');\n const stat = fs.statSync(filePath);\n const date = stat.mtime.toISOString().split('T')[0]!;\n const preview = line.length > 100 ? line.slice(0, 100) + '...' : line;\n results.push({ sessionId, date, preview });\n break; // one match per session\n }\n }\n }\n\n if (results.length === 0) {\n console.log(chalk.dim(`\\nNo results for \"${args}\".\\n`));\n } else {\n console.log(chalk.bold(`\\nSearch results for \"${args}\":\\n`));\n for (const r of results) {\n console.log(` ${chalk.cyan(r.sessionId)} ${chalk.dim(r.date)}`);\n console.log(` ${chalk.dim(r.preview)}`);\n }\n console.log('');\n }\n return true;\n },\n },\n {\n name: '/fix',\n description: 'Run a command and auto-fix errors (e.g., /fix npm run build)',\n handler: async (args, ctx) => {\n if (!args) {\n console.log(chalk.yellow('Usage: /fix <command>'));\n return true;\n }\n const { execSync } = await import('child_process');\n try {\n const shell = os.platform() === 'win32' ? 'powershell.exe' : undefined;\n const output = execSync(args, { encoding: 'utf-8', cwd: process.cwd(), stdio: 'pipe', shell });\n console.log(chalk.green(`\\n✓ Command succeeded. No errors to fix.\\n`));\n if (output.trim()) console.log(chalk.dim(output));\n return true;\n } catch (err: unknown) {\n const error = err as { stdout?: string; stderr?: string };\n const errorOutput = (error.stderr || '') + (error.stdout || '');\n console.log(chalk.red(`\\nCommand failed: ${args}\\n`));\n ctx.conversation.addUserMessage(\n `다음 명령어를 실행했더니 에러가 발생했어. 에러를 분석하고 코드를 수정해줘.\\n\\nCommand: ${args}\\n\\n\\`\\`\\`\\n${errorOutput}\\n\\`\\`\\``\n );\n return false;\n }\n },\n },\n {\n name: '/mcp',\n description: 'Show MCP server status',\n handler: async () => {\n const servers = mcpManager.listServers();\n if (servers.length === 0) {\n console.log(chalk.dim('\\nNo MCP servers connected.\\n'));\n console.log(chalk.dim('Add servers in .codi/mcp.json or ~/.codi/mcp.json'));\n return true;\n }\n\n console.log(chalk.bold('\\nMCP Servers:\\n'));\n for (const s of servers) {\n console.log(` ${chalk.green('●')} ${s.name}`);\n for (const t of s.tools) {\n console.log(chalk.dim(` - ${t}`));\n }\n }\n console.log('');\n return true;\n },\n },\n ];\n}\n\n// Custom slash commands from .codi/commands/\nexport function loadCustomCommands(): SlashCommand[] {\n const commands: SlashCommand[] = [];\n const home = process.env['HOME'] || process.env['USERPROFILE'] || '~';\n\n const dirs = [\n path.join(home, '.codi', 'commands'),\n path.join(process.cwd(), '.codi', 'commands'),\n ];\n\n for (const dir of dirs) {\n if (!fs.existsSync(dir)) continue;\n const files = fs.readdirSync(dir).filter((f) => f.endsWith('.md'));\n\n for (const file of files) {\n const name = '/' + file.replace('.md', '');\n const filePath = path.join(dir, file);\n\n commands.push({\n name,\n description: `Custom command from ${path.relative(process.cwd(), filePath)}`,\n handler: async (_args, ctx) => {\n let content = fs.readFileSync(filePath, 'utf-8');\n\n // Variable substitution\n content = content\n .replace(/\\{\\{cwd\\}\\}/g, process.cwd())\n .replace(/\\{\\{date\\}\\}/g, new Date().toISOString().split('T')[0]!)\n .replace(/\\{\\{file_path\\}\\}/g, _args || '');\n\n // Inject as a user message\n await ctx.conversation.addUserMessage(content);\n return false; // Don't consume - let the agent process it\n },\n });\n }\n }\n\n return commands;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const fileReadTool: Tool = {\n name: 'read_file',\n description: `Read a file from the filesystem. Supports text files with line numbers (cat -n format), PDF files, images (returns base64 for multimodal), and Jupyter notebooks (.ipynb). Use offset/limit for large files.`,\n inputSchema: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Absolute or relative path to the file' },\n offset: { type: 'number', description: 'Line number to start reading from (1-based)' },\n limit: { type: 'number', description: 'Number of lines to read' },\n pages: { type: 'string', description: 'Page range for PDF files (e.g., \"1-5\")' },\n },\n required: ['file_path'],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const filePath = String(input['file_path']);\n const offset = input['offset'] as number | undefined;\n const limit = input['limit'] as number | undefined;\n\n const resolved = path.resolve(filePath);\n\n if (!fs.existsSync(resolved)) {\n return makeToolError(`File not found: ${resolved}`);\n }\n\n const stat = fs.statSync(resolved);\n if (stat.isDirectory()) {\n return makeToolError(`Path is a directory, not a file: ${resolved}. Use list_dir instead.`);\n }\n\n const ext = path.extname(resolved).toLowerCase();\n\n // Image files\n if (['.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp', '.svg'].includes(ext)) {\n const data = fs.readFileSync(resolved);\n const base64 = data.toString('base64');\n const mimeMap: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.bmp': 'image/bmp',\n '.svg': 'image/svg+xml',\n };\n return makeToolResult(`[Image: ${path.basename(resolved)}]`, {\n filePath: resolved,\n isImage: true,\n imageData: base64,\n imageMimeType: mimeMap[ext] || 'image/png',\n });\n }\n\n // PDF files\n if (ext === '.pdf') {\n try {\n const pdfModule = await import('pdf-parse');\n const pdfParse = (pdfModule as any).default || pdfModule;\n const buffer = fs.readFileSync(resolved);\n const data = await pdfParse(buffer);\n const pages = input['pages'] as string | undefined;\n\n let text = data.text;\n if (pages) {\n // Basic page range support - split by form feeds\n const allPages = text.split('\\f');\n const [start, end] = pages.split('-').map(Number);\n const s = (start || 1) - 1;\n const e = end || start || allPages.length;\n text = allPages.slice(s, e).join('\\n\\n--- Page Break ---\\n\\n');\n }\n\n return makeToolResult(text, { filePath: resolved });\n } catch (err) {\n return makeToolError(`Failed to parse PDF: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Jupyter notebooks\n if (ext === '.ipynb') {\n try {\n const content = fs.readFileSync(resolved, 'utf-8');\n const nb = JSON.parse(content);\n const output: string[] = [];\n\n for (let i = 0; i < (nb.cells || []).length; i++) {\n const cell = nb.cells[i];\n const cellType = cell.cell_type || 'code';\n const source = Array.isArray(cell.source) ? cell.source.join('') : cell.source || '';\n\n output.push(`--- Cell ${i + 1} [${cellType}] ---`);\n output.push(source);\n\n if (cell.outputs && cell.outputs.length > 0) {\n output.push('--- Output ---');\n for (const out of cell.outputs) {\n if (out.text) {\n output.push(Array.isArray(out.text) ? out.text.join('') : out.text);\n } else if (out.data?.['text/plain']) {\n const plain = out.data['text/plain'];\n output.push(Array.isArray(plain) ? plain.join('') : plain);\n }\n }\n }\n output.push('');\n }\n\n return makeToolResult(output.join('\\n'), { filePath: resolved });\n } catch (err) {\n return makeToolError(`Failed to parse notebook: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Text files\n try {\n const raw = fs.readFileSync(resolved, 'utf-8');\n // Normalize CRLF → LF for consistent display across platforms\n const content = raw.replace(/\\r\\n/g, '\\n');\n const lines = content.split('\\n');\n const totalLines = lines.length;\n\n const startLine = Math.max(1, offset || 1);\n const endLine = limit ? Math.min(startLine + limit - 1, totalLines) : Math.min(startLine + 1999, totalLines);\n\n const selectedLines = lines.slice(startLine - 1, endLine);\n const numbered = selectedLines.map((line, i) => {\n const lineNum = startLine + i;\n const numStr = String(lineNum).padStart(String(endLine).length, ' ');\n return `${numStr}\\t${line}`;\n });\n\n let result = numbered.join('\\n');\n if (endLine < totalLines) {\n result += `\\n\\n... (${totalLines - endLine} more lines)`;\n }\n\n return makeToolResult(result, { filePath: resolved });\n } catch (err) {\n return makeToolError(`Failed to read file: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const fileWriteTool: Tool = {\n name: 'write_file',\n description: `Create a new file or overwrite an existing file. Creates parent directories if needed. For modifying existing files, prefer edit_file instead.`,\n inputSchema: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Absolute or relative path to the file' },\n content: { type: 'string', description: 'The content to write to the file' },\n },\n required: ['file_path', 'content'],\n },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const filePath = String(input['file_path']);\n const content = String(input['content']);\n const resolved = path.resolve(filePath);\n\n try {\n const dir = path.dirname(resolved);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const existed = fs.existsSync(resolved);\n fs.writeFileSync(resolved, content, 'utf-8');\n\n const lines = content.split('\\n').length;\n const action = existed ? 'Overwrote' : 'Created';\n return makeToolResult(`${action} ${resolved} (${lines} lines)`, {\n filePath: resolved,\n linesChanged: lines,\n });\n } catch (err) {\n return makeToolError(`Failed to write file: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const fileEditTool: Tool = {\n name: 'edit_file',\n description: `Perform exact string replacement in a file. The old_string must be unique in the file unless replace_all is true. Preserves indentation exactly.`,\n inputSchema: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Path to the file to edit' },\n old_string: { type: 'string', description: 'The exact text to find and replace' },\n new_string: { type: 'string', description: 'The replacement text' },\n replace_all: { type: 'boolean', description: 'Replace all occurrences (default: false)', default: false },\n },\n required: ['file_path', 'old_string', 'new_string'],\n },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const filePath = String(input['file_path']);\n const oldString = String(input['old_string']);\n const newString = String(input['new_string']);\n const replaceAll = input['replace_all'] === true;\n\n const resolved = path.resolve(filePath);\n\n if (!fs.existsSync(resolved)) {\n return makeToolError(`File not found: ${resolved}`);\n }\n\n try {\n const raw = fs.readFileSync(resolved, 'utf-8');\n const hasCrlf = raw.includes('\\r\\n');\n // Normalize CRLF → LF for matching, preserve original line endings on write\n let content = hasCrlf ? raw.replace(/\\r\\n/g, '\\n') : raw;\n\n if (oldString === newString) {\n return makeToolError('old_string and new_string are identical. No changes needed.');\n }\n\n if (!content.includes(oldString)) {\n // Try to find similar text for helpful error\n const lines = content.split('\\n');\n const oldLines = oldString.split('\\n');\n const firstOldLine = oldLines[0]?.trim();\n const similar = firstOldLine\n ? lines.find((l) => l.trim().includes(firstOldLine))\n : undefined;\n\n let errMsg = `old_string not found in ${resolved}.`;\n if (similar) {\n errMsg += `\\nDid you mean this line?\\n ${similar.trim()}`;\n }\n errMsg += '\\nMake sure old_string matches exactly including whitespace and indentation.';\n return makeToolError(errMsg);\n }\n\n if (!replaceAll) {\n const count = content.split(oldString).length - 1;\n if (count > 1) {\n return makeToolError(\n `old_string appears ${count} times in the file. Use replace_all: true to replace all, or provide more context to make it unique.`\n );\n }\n }\n\n if (replaceAll) {\n content = content.split(oldString).join(newString);\n } else {\n const idx = content.indexOf(oldString);\n content = content.slice(0, idx) + newString + content.slice(idx + oldString.length);\n }\n\n // Restore original line endings if file used CRLF\n const output = hasCrlf ? content.replace(/\\n/g, '\\r\\n') : content;\n fs.writeFileSync(resolved, output, 'utf-8');\n\n const linesChanged = Math.max(\n oldString.split('\\n').length,\n newString.split('\\n').length\n );\n\n return makeToolResult(`Edited ${resolved}`, {\n filePath: resolved,\n linesChanged,\n });\n } catch (err) {\n return makeToolError(`Failed to edit file: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const fileMultiEditTool: Tool = {\n name: 'multi_edit',\n description: `Apply multiple edits to a single file atomically. Each edit is an old_string → new_string replacement. All edits are validated before any are applied.`,\n inputSchema: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Path to the file to edit' },\n edits: {\n type: 'array',\n description: 'Array of edits to apply',\n items: {\n type: 'object',\n properties: {\n old_string: { type: 'string', description: 'Text to find' },\n new_string: { type: 'string', description: 'Replacement text' },\n },\n required: ['old_string', 'new_string'],\n },\n },\n },\n required: ['file_path', 'edits'],\n },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const filePath = String(input['file_path']);\n const edits = input['edits'] as Array<{ old_string: string; new_string: string }>;\n const resolved = path.resolve(filePath);\n\n if (!fs.existsSync(resolved)) {\n return makeToolError(`File not found: ${resolved}`);\n }\n\n if (!Array.isArray(edits) || edits.length === 0) {\n return makeToolError('edits must be a non-empty array of {old_string, new_string} objects');\n }\n\n try {\n const raw = fs.readFileSync(resolved, 'utf-8');\n const hasCrlf = raw.includes('\\r\\n');\n // Normalize CRLF → LF for matching, preserve original line endings on write\n let content = hasCrlf ? raw.replace(/\\r\\n/g, '\\n') : raw;\n\n // Validate all edits first\n for (let i = 0; i < edits.length; i++) {\n const edit = edits[i]!;\n if (!content.includes(edit.old_string)) {\n return makeToolError(\n `Edit ${i + 1}/${edits.length}: old_string not found in file. No edits applied.\\nSearching for: ${edit.old_string.slice(0, 100)}...`\n );\n }\n }\n\n // Apply edits sequentially\n let totalLinesChanged = 0;\n for (const edit of edits) {\n const idx = content.indexOf(edit.old_string);\n if (idx === -1) {\n return makeToolError(`Edit validation passed but old_string disappeared during application. This may happen if edits overlap.`);\n }\n content = content.slice(0, idx) + edit.new_string + content.slice(idx + edit.old_string.length);\n totalLinesChanged += Math.max(\n edit.old_string.split('\\n').length,\n edit.new_string.split('\\n').length\n );\n }\n\n // Restore original line endings if file used CRLF\n const output = hasCrlf ? content.replace(/\\n/g, '\\r\\n') : content;\n fs.writeFileSync(resolved, output, 'utf-8');\n\n return makeToolResult(`Applied ${edits.length} edits to ${resolved}`, {\n filePath: resolved,\n linesChanged: totalLinesChanged,\n });\n } catch (err) {\n return makeToolError(`Failed to multi-edit: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { globby } from 'globby';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const globTool: Tool = {\n name: 'glob',\n description: `Fast file pattern matching. Supports glob patterns like \"**/*.ts\". Respects .gitignore. Returns matching file paths sorted by modification time.`,\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Glob pattern to match files (e.g., \"**/*.ts\", \"src/**/*.tsx\")' },\n path: { type: 'string', description: 'Directory to search in. Defaults to current working directory.' },\n },\n required: ['pattern'],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const pattern = String(input['pattern']);\n const searchPath = input['path'] ? String(input['path']) : process.cwd();\n const resolved = path.resolve(searchPath);\n\n try {\n const files = await globby(pattern, {\n cwd: resolved,\n gitignore: true,\n ignore: ['node_modules/**', '.git/**'],\n absolute: true,\n onlyFiles: true,\n });\n\n // Sort by modification time (most recent first)\n const withStats = files.map((f) => {\n try {\n const stat = fs.statSync(f);\n return { path: f, mtime: stat.mtimeMs };\n } catch {\n return { path: f, mtime: 0 };\n }\n });\n withStats.sort((a, b) => b.mtime - a.mtime);\n\n const result = withStats.map((f) => f.path);\n\n if (result.length === 0) {\n return makeToolResult(`No files matched pattern: ${pattern} in ${resolved}`);\n }\n\n return makeToolResult(\n `Found ${result.length} file(s):\\n${result.join('\\n')}`\n );\n } catch (err) {\n return makeToolError(`Glob failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import { execFile } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const grepTool: Tool = {\n name: 'grep',\n description: `Search file contents using regex patterns. Uses ripgrep (rg) if available, falls back to grep, then to a built-in Node.js search. Supports context lines, file type filters, and multiple output modes.`,\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Regex pattern to search for' },\n path: { type: 'string', description: 'File or directory to search in' },\n glob: { type: 'string', description: 'Glob pattern to filter files (e.g., \"*.ts\")' },\n type: { type: 'string', description: 'File type filter (e.g., \"ts\", \"py\", \"js\")' },\n output_mode: {\n type: 'string',\n enum: ['content', 'files_with_matches', 'count'],\n description: 'Output mode: content (matching lines), files_with_matches (file paths only), count (match counts)',\n },\n '-A': { type: 'number', description: 'Lines to show after match' },\n '-B': { type: 'number', description: 'Lines to show before match' },\n '-C': { type: 'number', description: 'Context lines (before and after)' },\n '-i': { type: 'boolean', description: 'Case insensitive search' },\n '-n': { type: 'boolean', description: 'Show line numbers' },\n multiline: { type: 'boolean', description: 'Enable multiline matching' },\n head_limit: { type: 'number', description: 'Limit output to first N entries' },\n },\n required: ['pattern'],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const pattern = String(input['pattern']);\n const searchPath = path.resolve(input['path'] ? String(input['path']) : process.cwd());\n const outputMode = (input['output_mode'] as string) || 'files_with_matches';\n const headLimit = (input['head_limit'] as number) || 0;\n\n // Try ripgrep first, then grep, then built-in fallback\n const hasRg = await hasCommand('rg');\n const hasGrep = !hasRg && await hasCommand('grep');\n\n if (!hasRg && !hasGrep) {\n // Pure Node.js fallback — works on all platforms without external tools\n return builtinSearch(pattern, searchPath, input, outputMode, headLimit);\n }\n\n const cmd = hasRg ? 'rg' : 'grep';\n const args: string[] = [];\n\n if (!hasRg) {\n args.push('-r'); // recursive for grep\n }\n\n // Output mode\n if (outputMode === 'files_with_matches') {\n args.push('-l');\n } else if (outputMode === 'count') {\n args.push('-c');\n }\n\n // Case insensitive\n if (input['-i']) args.push('-i');\n\n // Line numbers\n if (input['-n'] !== false && outputMode === 'content') {\n args.push('-n');\n }\n\n // Context\n if (input['-C']) args.push('-C', String(input['-C']));\n else if (input['-A']) args.push('-A', String(input['-A']));\n if (input['-B']) args.push('-B', String(input['-B']));\n\n // Multiline (rg only)\n if (input['multiline'] && hasRg) {\n args.push('-U', '--multiline-dotall');\n }\n\n // File type filter\n if (input['type'] && hasRg) {\n args.push('--type', String(input['type']));\n }\n\n // Glob filter\n if (input['glob'] && hasRg) {\n args.push('--glob', String(input['glob']));\n }\n\n // Ignore common dirs\n if (hasRg) {\n args.push('--no-ignore-vcs');\n args.push('-g', '!node_modules');\n args.push('-g', '!.git');\n }\n\n args.push(pattern, searchPath);\n\n try {\n const result = await runCommand(cmd, args);\n\n if (!result.trim()) {\n return makeToolResult(`No matches found for pattern: ${pattern}`);\n }\n\n let output = result;\n if (headLimit > 0) {\n const lines = output.split('\\n');\n output = lines.slice(0, headLimit).join('\\n');\n if (lines.length > headLimit) {\n output += `\\n... (${lines.length - headLimit} more results)`;\n }\n }\n\n return makeToolResult(output);\n } catch (err: any) {\n // grep/rg exit 1 means no matches\n if (err.code === 1) {\n return makeToolResult(`No matches found for pattern: ${pattern}`);\n }\n return makeToolError(`Search failed: ${err.message || String(err)}`);\n }\n },\n};\n\nfunction hasCommand(cmd: string): Promise<boolean> {\n const checkCmd = process.platform === 'win32' ? 'where' : 'which';\n return new Promise((resolve) => {\n execFile(checkCmd, [cmd], (err) => resolve(!err));\n });\n}\n\nfunction runCommand(cmd: string, args: string[]): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile(cmd, args, { maxBuffer: 10 * 1024 * 1024, timeout: 30_000 }, (err, stdout, stderr) => {\n if (err) {\n (err as any).code = err.code;\n reject(err);\n return;\n }\n resolve(stdout);\n });\n });\n}\n\n// ─── Built-in Node.js search fallback ────────────────────────────────\n\nconst IGNORE_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next', '__pycache__', '.cache', 'coverage']);\nconst BINARY_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.ico', '.woff', '.woff2', '.ttf', '.eot', '.pdf', '.zip', '.tar', '.gz', '.exe', '.dll', '.so', '.dylib']);\n\nconst TYPE_EXTENSIONS: Record<string, string[]> = {\n ts: ['.ts', '.tsx'],\n js: ['.js', '.jsx', '.mjs', '.cjs'],\n py: ['.py'],\n java: ['.java'],\n kt: ['.kt', '.kts'],\n go: ['.go'],\n rs: ['.rs'],\n rb: ['.rb'],\n css: ['.css', '.scss', '.less'],\n html: ['.html', '.htm'],\n json: ['.json'],\n yaml: ['.yaml', '.yml'],\n md: ['.md'],\n xml: ['.xml'],\n};\n\nasync function builtinSearch(\n pattern: string,\n searchPath: string,\n input: Record<string, unknown>,\n outputMode: string,\n headLimit: number,\n): Promise<ToolResult> {\n const caseInsensitive = input['-i'] === true;\n const showLineNumbers = input['-n'] !== false && outputMode === 'content';\n const contextBefore = Number(input['-C'] || input['-B'] || 0);\n const contextAfter = Number(input['-C'] || input['-A'] || 0);\n const typeFilter = input['type'] ? String(input['type']) : undefined;\n const globFilter = input['glob'] ? String(input['glob']) : undefined;\n\n let regex: RegExp;\n try {\n regex = new RegExp(pattern, caseInsensitive ? 'gi' : 'g');\n } catch {\n return makeToolError(`Invalid regex pattern: ${pattern}`);\n }\n\n const files = collectFiles(searchPath, typeFilter, globFilter);\n const results: string[] = [];\n const fileCounts: Map<string, number> = new Map();\n let entryCount = 0;\n\n for (const filePath of files) {\n if (headLimit > 0 && entryCount >= headLimit) break;\n\n let content: string;\n try {\n content = fs.readFileSync(filePath, 'utf-8');\n } catch {\n continue;\n }\n\n const lines = content.split('\\n');\n const matchedLineIndices: Set<number> = new Set();\n let fileMatchCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i]!)) {\n matchedLineIndices.add(i);\n fileMatchCount++;\n }\n regex.lastIndex = 0; // Reset regex state for global flag\n }\n\n if (fileMatchCount === 0) continue;\n\n if (outputMode === 'files_with_matches') {\n results.push(filePath);\n entryCount++;\n } else if (outputMode === 'count') {\n fileCounts.set(filePath, fileMatchCount);\n entryCount++;\n } else {\n // content mode — collect matched lines with context\n const outputLines: Set<number> = new Set();\n for (const idx of matchedLineIndices) {\n for (let j = Math.max(0, idx - contextBefore); j <= Math.min(lines.length - 1, idx + contextAfter); j++) {\n outputLines.add(j);\n }\n }\n\n const sortedIndices = [...outputLines].sort((a, b) => a - b);\n let lastIdx = -2;\n for (const idx of sortedIndices) {\n if (headLimit > 0 && entryCount >= headLimit) break;\n\n if (idx > lastIdx + 1 && lastIdx >= 0) {\n results.push('--'); // separator between non-contiguous groups\n }\n const prefix = showLineNumbers ? `${filePath}:${idx + 1}:` : `${filePath}:`;\n results.push(`${prefix}${lines[idx]}`);\n entryCount++;\n lastIdx = idx;\n }\n }\n }\n\n if (outputMode === 'count') {\n for (const [file, count] of fileCounts) {\n results.push(`${file}:${count}`);\n }\n }\n\n if (results.length === 0) {\n return makeToolResult(`No matches found for pattern: ${pattern}`);\n }\n\n return makeToolResult(results.join('\\n'));\n}\n\nfunction collectFiles(dirPath: string, typeFilter?: string, globFilter?: string): string[] {\n const files: string[] = [];\n const allowedExtensions = typeFilter && TYPE_EXTENSIONS[typeFilter] ? new Set(TYPE_EXTENSIONS[typeFilter]) : null;\n\n // Convert simple glob to regex (e.g., \"*.ts\" → /\\.ts$/)\n let globRegex: RegExp | null = null;\n if (globFilter) {\n const escaped = globFilter\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n globRegex = new RegExp(`^${escaped}$`);\n }\n\n function walk(dir: string): void {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (IGNORE_DIRS.has(entry.name)) continue;\n if (entry.name.startsWith('.') && entry.name !== '.') continue;\n\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n walk(fullPath);\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (BINARY_EXTENSIONS.has(ext)) continue;\n if (allowedExtensions && !allowedExtensions.has(ext)) continue;\n if (globRegex && !globRegex.test(entry.name)) continue;\n files.push(fullPath);\n }\n }\n }\n\n // If searchPath is a file, just search that file\n try {\n const stat = fs.statSync(dirPath);\n if (stat.isFile()) {\n return [dirPath];\n }\n } catch {\n return [];\n }\n\n walk(dirPath);\n return files;\n}\n","import { exec, spawn } from 'child_process';\nimport * as os from 'os';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nfunction getDefaultShell(): string {\n if (os.platform() === 'win32') {\n // PowerShell is preferred on Windows — it supports many Unix-like commands\n // (mkdir, rm, cat, curl, etc.) and handles paths more gracefully than cmd.exe\n return 'powershell.exe';\n }\n return process.env['SHELL'] || '/bin/bash';\n}\n\n// Background tasks storage\nconst backgroundTasks: Map<string, {\n process: ReturnType<typeof spawn>;\n output: string;\n status: string;\n exitCode?: number;\n}> = new Map();\n\nlet taskCounter = 0;\n\nexport const bashTool: Tool = {\n name: 'bash',\n description: `Execute a shell command. Supports timeout (max 600s, default 120s) and background execution. The working directory persists between calls. Uses the platform default shell (bash on Unix, cmd.exe on Windows).`,\n inputSchema: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'The bash command to execute' },\n description: { type: 'string', description: 'Brief description of what the command does' },\n timeout: { type: 'number', description: 'Timeout in milliseconds (max 600000, default 120000)' },\n run_in_background: { type: 'boolean', description: 'Run in background and return a task ID' },\n },\n required: ['command'],\n },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const command = String(input['command']);\n const timeout = Math.min(Number(input['timeout']) || 120_000, 600_000);\n const runInBackground = input['run_in_background'] === true;\n\n if (!command.trim()) {\n return makeToolError('Command cannot be empty');\n }\n\n if (runInBackground) {\n return runBackgroundTask(command);\n }\n\n return new Promise((resolve) => {\n exec(command, {\n timeout,\n maxBuffer: 10 * 1024 * 1024,\n shell: getDefaultShell(),\n cwd: process.cwd(),\n env: { ...process.env },\n }, (err, stdout, stderr) => {\n if (err) {\n const exitCode = err.code;\n const output = [\n stdout ? `stdout:\\n${stdout}` : '',\n stderr ? `stderr:\\n${stderr}` : '',\n `Exit code: ${exitCode}`,\n ].filter(Boolean).join('\\n\\n');\n\n if ((err as any).killed) {\n resolve(makeToolError(`Command timed out after ${timeout / 1000}s\\n${output}`));\n } else {\n resolve(makeToolResult(output || `Command failed with exit code ${exitCode}`));\n }\n return;\n }\n\n const output = [\n stdout ? stdout : '',\n stderr ? `stderr:\\n${stderr}` : '',\n ].filter(Boolean).join('\\n');\n\n resolve(makeToolResult(output || '(no output)'));\n });\n });\n },\n};\n\nfunction runBackgroundTask(command: string): ToolResult {\n const taskId = `bg_${++taskCounter}`;\n\n const proc = spawn(command, {\n shell: getDefaultShell(),\n cwd: process.cwd(),\n env: { ...process.env },\n stdio: ['ignore', 'pipe', 'pipe'],\n detached: false,\n });\n\n const task: { process: ReturnType<typeof spawn>; output: string; status: string; exitCode?: number } = { process: proc, output: '', status: 'running', exitCode: undefined };\n backgroundTasks.set(taskId, task);\n\n proc.stdout?.on('data', (data) => {\n task.output += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n task.output += data.toString();\n });\n\n proc.on('close', (code) => {\n task.status = code === 0 ? 'done' : 'error';\n task.exitCode = code ?? 1;\n });\n\n proc.on('error', (err) => {\n task.status = 'error';\n task.output += `\\nProcess error: ${err.message}`;\n });\n\n return makeToolResult(`Background task started with ID: ${taskId}\\nUse task_output tool to check results.`);\n}\n\n// Utility to get background task output\nexport function getBackgroundTaskOutput(taskId: string): { status: string; output: string } | null {\n const task = backgroundTasks.get(taskId);\n if (!task) return null;\n return { status: task.status, output: task.output };\n}\n\nexport function stopBackgroundTask(taskId: string): boolean {\n const task = backgroundTasks.get(taskId);\n if (!task || task.status !== 'running') return false;\n try {\n task.process.kill();\n task.status = 'done';\n return true;\n } catch {\n return false;\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const listDirTool: Tool = {\n name: 'list_dir',\n description: `List directory contents with file/folder distinction and basic metadata.`,\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Directory path to list (defaults to cwd)' },\n },\n required: [],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const dirPath = path.resolve(input['path'] ? String(input['path']) : process.cwd());\n\n if (!fs.existsSync(dirPath)) {\n return makeToolError(`Directory not found: ${dirPath}`);\n }\n\n const stat = fs.statSync(dirPath);\n if (!stat.isDirectory()) {\n return makeToolError(`Not a directory: ${dirPath}`);\n }\n\n try {\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\n const IGNORE = new Set(['.git', 'node_modules', '.DS_Store', '__pycache__', '.next', 'dist', 'build']);\n\n const lines: string[] = [];\n const dirs: string[] = [];\n const files: string[] = [];\n\n for (const entry of entries) {\n if (IGNORE.has(entry.name)) continue;\n\n if (entry.isDirectory()) {\n dirs.push(`${entry.name}/`);\n } else if (entry.isSymbolicLink()) {\n try {\n const target = fs.readlinkSync(path.join(dirPath, entry.name));\n files.push(`${entry.name} -> ${target}`);\n } catch {\n files.push(`${entry.name} -> (broken link)`);\n }\n } else {\n files.push(entry.name);\n }\n }\n\n // Directories first, then files\n dirs.sort();\n files.sort();\n lines.push(...dirs, ...files);\n\n if (lines.length === 0) {\n return makeToolResult(`Directory is empty: ${dirPath}`);\n }\n\n return makeToolResult(`${dirPath}\\n${lines.join('\\n')}`);\n } catch (err) {\n return makeToolError(`Failed to list directory: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import { execSync } from 'child_process';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const gitTool: Tool = {\n name: 'git',\n description: `Execute git commands with safety checks. Blocks dangerous operations like force push, hard reset, and amend. Use for status, diff, log, commit, branch operations.`,\n inputSchema: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Git subcommand and arguments (e.g., \"status\", \"diff HEAD\", \"log --oneline -10\")' },\n },\n required: ['command'],\n },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const command = String(input['command']).trim();\n\n // Safety checks\n const blocked = [\n { pattern: /push\\s+.*--force/, msg: 'Force push is blocked for safety. Use regular push.' },\n { pattern: /push\\s+.*-f\\b/, msg: 'Force push (-f) is blocked for safety.' },\n { pattern: /reset\\s+--hard/, msg: 'Hard reset is blocked. Use soft reset or create a new commit.' },\n { pattern: /clean\\s+-f/, msg: 'git clean -f is blocked. Manually review files to remove.' },\n { pattern: /checkout\\s+\\.\\s*$/, msg: 'git checkout . discards all changes. Use more specific paths.' },\n { pattern: /branch\\s+-D/, msg: 'Force branch deletion is blocked. Use -d for safe deletion.' },\n { pattern: /\\b-i\\b/, msg: 'Interactive mode (-i) is not supported in non-interactive context.' },\n { pattern: /commit\\s+.*--amend/, msg: 'Amending commits is blocked. Create a new commit instead.' },\n { pattern: /--no-verify/, msg: 'Skipping hooks (--no-verify) is blocked.' },\n ];\n\n for (const check of blocked) {\n if (check.pattern.test(command)) {\n return makeToolError(check.msg);\n }\n }\n\n // Read-only commands don't need special handling\n const readOnlyPrefixes = ['status', 'diff', 'log', 'show', 'branch', 'tag', 'remote', 'stash list', 'ls-files'];\n const isReadOnly = readOnlyPrefixes.some((p) => command.startsWith(p));\n\n try {\n const result = execSync(`git ${command}`, {\n encoding: 'utf-8',\n maxBuffer: 10 * 1024 * 1024,\n timeout: 30_000,\n cwd: process.cwd(),\n });\n\n return makeToolResult(result || '(no output)');\n } catch (err: any) {\n const output = [err.stdout, err.stderr].filter(Boolean).join('\\n');\n return makeToolError(`git ${command} failed:\\n${output || err.message}`);\n }\n },\n};\n","import type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\n// Simple in-memory cache\nconst cache: Map<string, { content: string; timestamp: number }> = new Map();\nconst CACHE_TTL = 15 * 60 * 1000; // 15 minutes\n\nexport const webFetchTool: Tool = {\n name: 'web_fetch',\n description: `Fetch content from a URL, convert HTML to text, and return the content. Includes a 15-minute cache. HTTP URLs are upgraded to HTTPS.`,\n inputSchema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'URL to fetch' },\n prompt: { type: 'string', description: 'What information to extract from the page' },\n },\n required: ['url', 'prompt'],\n },\n dangerous: true,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n let url = String(input['url']);\n const prompt = String(input['prompt'] || '');\n\n // Upgrade HTTP to HTTPS\n if (url.startsWith('http://')) {\n url = url.replace('http://', 'https://');\n }\n\n // Check cache\n const cached = cache.get(url);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n return makeToolResult(`[Cached] ${prompt ? `Query: ${prompt}\\n\\n` : ''}${cached.content}`);\n }\n\n try {\n const response = await fetch(url, {\n headers: {\n 'User-Agent': 'Codi/0.1 (AI Code Agent)',\n 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',\n },\n redirect: 'follow',\n signal: AbortSignal.timeout(30_000),\n });\n\n if (!response.ok) {\n return makeToolError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const contentType = response.headers.get('content-type') || '';\n let text: string;\n\n if (contentType.includes('text/html') || contentType.includes('application/xhtml')) {\n const html = await response.text();\n const { load } = await import('cheerio');\n const $ = load(html);\n\n // Remove script, style, nav, header, footer\n $('script, style, nav, header, footer, iframe, noscript').remove();\n\n // Extract text from main content\n const main = $('main, article, .content, #content, .main').first();\n text = (main.length ? main.text() : $('body').text())\n .replace(/\\s+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n } else {\n text = await response.text();\n }\n\n // Truncate if too long\n const MAX_LEN = 50_000;\n if (text.length > MAX_LEN) {\n text = text.slice(0, MAX_LEN) + '\\n\\n... (truncated)';\n }\n\n // Cache the result\n cache.set(url, { content: text, timestamp: Date.now() });\n\n return makeToolResult(prompt ? `URL: ${url}\\nQuery: ${prompt}\\n\\n${text}` : text);\n } catch (err) {\n return makeToolError(`Failed to fetch URL: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const webSearchTool: Tool = {\n name: 'web_search',\n description: `Search the web for information. Returns search results with titles, URLs, and snippets. Uses DuckDuckGo as the search engine.`,\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n },\n required: ['query'],\n },\n dangerous: true,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const query = String(input['query']);\n\n try {\n // Use DuckDuckGo HTML search\n const encoded = encodeURIComponent(query);\n const url = `https://html.duckduckgo.com/html/?q=${encoded}`;\n\n const response = await fetch(url, {\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; Codi/0.1)',\n },\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!response.ok) {\n return makeToolError(`Search failed: HTTP ${response.status}`);\n }\n\n const html = await response.text();\n const { load } = await import('cheerio');\n const $ = load(html);\n\n const results: Array<{ title: string; url: string; snippet: string }> = [];\n\n $('.result').each((i, el) => {\n if (i >= 10) return false;\n const $el = $(el);\n const title = $el.find('.result__title a').text().trim();\n const href = $el.find('.result__title a').attr('href') || '';\n const snippet = $el.find('.result__snippet').text().trim();\n\n if (title && href) {\n // Extract actual URL from DuckDuckGo redirect\n let actualUrl = href;\n try {\n const urlObj = new URL(href, 'https://duckduckgo.com');\n actualUrl = urlObj.searchParams.get('uddg') || href;\n } catch {\n actualUrl = href;\n }\n results.push({ title, url: actualUrl, snippet });\n }\n });\n\n if (results.length === 0) {\n return makeToolResult(`No results found for: ${query}`);\n }\n\n const formatted = results\n .map((r, i) => `${i + 1}. ${r.title}\\n ${r.url}\\n ${r.snippet}`)\n .join('\\n\\n');\n\n return makeToolResult(`Search results for: ${query}\\n\\n${formatted}`);\n } catch (err) {\n return makeToolError(`Search failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const notebookEditTool: Tool = {\n name: 'notebook_edit',\n description: `Edit Jupyter notebook (.ipynb) cells. Supports replacing, inserting, and deleting cells.`,\n inputSchema: {\n type: 'object',\n properties: {\n notebook_path: { type: 'string', description: 'Path to the .ipynb file' },\n cell_number: { type: 'number', description: 'Cell index (0-based)' },\n new_source: { type: 'string', description: 'New source content for the cell' },\n cell_type: { type: 'string', enum: ['code', 'markdown'], description: 'Cell type (for insert)' },\n edit_mode: { type: 'string', enum: ['replace', 'insert', 'delete'], description: 'Edit mode (default: replace)' },\n },\n required: ['notebook_path', 'new_source'],\n },\n dangerous: true,\n readOnly: false,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const nbPath = path.resolve(String(input['notebook_path']));\n const cellNumber = input['cell_number'] as number | undefined;\n const newSource = String(input['new_source']);\n const cellType = (input['cell_type'] as string) || 'code';\n const editMode = (input['edit_mode'] as string) || 'replace';\n\n if (!fs.existsSync(nbPath)) {\n return makeToolError(`Notebook not found: ${nbPath}`);\n }\n\n try {\n const content = fs.readFileSync(nbPath, 'utf-8');\n const nb = JSON.parse(content);\n\n if (!nb.cells || !Array.isArray(nb.cells)) {\n return makeToolError('Invalid notebook format: no cells array');\n }\n\n const sourceLines = newSource.split('\\n').map((l, i, arr) =>\n i < arr.length - 1 ? l + '\\n' : l\n );\n\n switch (editMode) {\n case 'replace': {\n const idx = cellNumber ?? 0;\n if (idx < 0 || idx >= nb.cells.length) {\n return makeToolError(`Cell index ${idx} out of range (0-${nb.cells.length - 1})`);\n }\n nb.cells[idx].source = sourceLines;\n if (input['cell_type']) {\n nb.cells[idx].cell_type = cellType;\n }\n break;\n }\n case 'insert': {\n const idx = cellNumber !== undefined ? cellNumber + 1 : nb.cells.length;\n const newCell: Record<string, unknown> = {\n cell_type: cellType,\n source: sourceLines,\n metadata: {},\n };\n if (cellType === 'code') {\n newCell['execution_count'] = null;\n newCell['outputs'] = [];\n }\n nb.cells.splice(idx, 0, newCell);\n break;\n }\n case 'delete': {\n const idx = cellNumber ?? 0;\n if (idx < 0 || idx >= nb.cells.length) {\n return makeToolError(`Cell index ${idx} out of range (0-${nb.cells.length - 1})`);\n }\n nb.cells.splice(idx, 1);\n break;\n }\n default:\n return makeToolError(`Unknown edit_mode: ${editMode}`);\n }\n\n fs.writeFileSync(nbPath, JSON.stringify(nb, null, 1), 'utf-8');\n return makeToolResult(`Notebook ${editMode}d cell in ${nbPath} (${nb.cells.length} cells total)`);\n } catch (err) {\n return makeToolError(`Notebook edit failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n};\n","import * as readline from 'node:readline/promises';\nimport chalk from 'chalk';\nimport type { Tool, ToolResult } from './tool.js';\nimport { makeToolResult, makeToolError } from './tool.js';\n\nexport const askUserTool: Tool = {\n name: 'ask_user',\n description: `Ask the user a question with optional choices. Use to gather preferences, clarify requirements, or get decisions.`,\n inputSchema: {\n type: 'object',\n properties: {\n question: { type: 'string', description: 'The question to ask' },\n options: {\n type: 'array',\n description: 'Optional choices for the user',\n items: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Option label' },\n description: { type: 'string', description: 'Option description' },\n },\n required: ['label'],\n },\n },\n multiSelect: { type: 'boolean', description: 'Allow multiple selections' },\n },\n required: ['question'],\n },\n dangerous: false,\n readOnly: true,\n\n async execute(input: Record<string, unknown>): Promise<ToolResult> {\n const question = String(input['question']);\n const options = input['options'] as Array<{ label: string; description?: string }> | undefined;\n const multiSelect = input['multiSelect'] === true;\n\n console.log('');\n console.log(chalk.cyan.bold('? ') + chalk.bold(question));\n\n if (options && options.length > 0) {\n console.log('');\n for (let i = 0; i < options.length; i++) {\n const opt = options[i]!;\n console.log(chalk.cyan(` ${i + 1}.`) + ` ${opt.label}${opt.description ? chalk.dim(` - ${opt.description}`) : ''}`);\n }\n console.log(chalk.dim(` ${options.length + 1}. Other (type custom response)`));\n console.log('');\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const prompt = multiSelect\n ? chalk.dim('Enter numbers separated by commas: ')\n : chalk.dim('Enter number or type response: ');\n\n const answer = await rl.question(prompt);\n rl.close();\n\n if (multiSelect) {\n const indices = answer.split(',').map((s) => parseInt(s.trim()) - 1);\n const selected = indices\n .filter((i) => i >= 0 && i < options.length)\n .map((i) => options[i]!.label);\n\n if (selected.length === 0) {\n return makeToolResult(`User response: ${answer}`);\n }\n return makeToolResult(`User selected: ${selected.join(', ')}`);\n }\n\n const idx = parseInt(answer) - 1;\n if (idx >= 0 && idx < options.length) {\n return makeToolResult(`User selected: ${options[idx]!.label}`);\n }\n\n return makeToolResult(`User response: ${answer}`);\n } catch {\n rl.close();\n return makeToolError('Failed to get user input');\n }\n }\n\n // Free-form question\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const answer = await rl.question(chalk.dim('> '));\n rl.close();\n return makeToolResult(`User response: ${answer}`);\n } catch {\n rl.close();\n return makeToolError('Failed to get user input');\n }\n },\n};\n","import Anthropic from '@anthropic-ai/sdk';\nimport type { LlmProvider } from './provider.js';\nimport type {\n LlmRequestOptions,\n LlmResponse,\n ContentBlock,\n ToolCall,\n Message,\n} from './types.js';\n\nexport class AnthropicProvider implements LlmProvider {\n readonly name = 'anthropic';\n model: string;\n private client: Anthropic;\n private maxTokens: number;\n\n constructor(config: { apiKey?: string; model?: string; maxTokens?: number; baseUrl?: string }) {\n this.client = new Anthropic({\n apiKey: config.apiKey || process.env['ANTHROPIC_API_KEY'],\n ...(config.baseUrl ? { baseURL: config.baseUrl } : {}),\n });\n this.model = config.model || 'claude-sonnet-4-20250514';\n this.maxTokens = config.maxTokens || 8192;\n }\n\n setModel(model: string): void {\n this.model = model;\n }\n\n async listModels(): Promise<string[]> {\n return [\n 'claude-opus-4-20250514',\n 'claude-sonnet-4-20250514',\n 'claude-haiku-3-5-20241022',\n ];\n }\n\n async chat(options: LlmRequestOptions): Promise<LlmResponse> {\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.input_schema as Anthropic.Tool.InputSchema,\n }));\n\n if (options.stream && options.callbacks) {\n return this.streamChat(messages, options);\n }\n\n const response = await this.client.messages.create({\n model: this.model,\n max_tokens: options.maxTokens || this.maxTokens,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options.systemPrompt ? { system: options.systemPrompt } : {}),\n messages,\n ...(tools && tools.length > 0 ? { tools } : {}),\n });\n\n return this.parseResponse(response);\n }\n\n private async streamChat(\n messages: Anthropic.MessageParam[],\n options: LlmRequestOptions\n ): Promise<LlmResponse> {\n const tools = options.tools?.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema as Anthropic.Tool.InputSchema,\n }));\n\n const stream = this.client.messages.stream({\n model: this.model,\n max_tokens: options.maxTokens || this.maxTokens,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options.systemPrompt ? { system: options.systemPrompt } : {}),\n messages,\n ...(tools && tools.length > 0 ? { tools } : {}),\n });\n\n stream.on('text', (text) => {\n options.callbacks?.onToken?.(text);\n });\n\n const response = await stream.finalMessage();\n return this.parseResponse(response);\n }\n\n private convertMessages(messages: Message[]): 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\n const blocks: Anthropic.ContentBlockParam[] = m.content.map((block) => {\n switch (block.type) {\n case 'text':\n return { type: 'text' as const, text: block.text };\n case 'image':\n return {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: block.source.media_type as 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp',\n data: block.source.data,\n },\n };\n case 'tool_use':\n return {\n type: 'tool_use' as const,\n id: block.id,\n name: block.name,\n input: block.input,\n };\n case 'tool_result':\n return {\n type: 'tool_result' as const,\n tool_use_id: block.tool_use_id,\n content: typeof block.content === 'string' ? block.content : JSON.stringify(block.content),\n ...(block.is_error ? { is_error: true } : {}),\n };\n default:\n return { type: 'text' as const, text: JSON.stringify(block) };\n }\n });\n\n return { role: m.role as 'user' | 'assistant', content: blocks };\n });\n }\n\n private parseResponse(response: Anthropic.Message): LlmResponse {\n const content: ContentBlock[] = [];\n const toolCalls: ToolCall[] = [];\n let text = '';\n\n for (const block of response.content) {\n if (block.type === 'text') {\n content.push({ type: 'text', text: block.text });\n text += block.text;\n } else if (block.type === 'tool_use') {\n const tc: ToolCall = {\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n };\n content.push({\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n });\n toolCalls.push(tc);\n }\n }\n\n return {\n content,\n text: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n usage: {\n input_tokens: response.usage.input_tokens,\n output_tokens: response.usage.output_tokens,\n },\n stopReason: response.stop_reason as LlmResponse['stopReason'],\n };\n }\n}\n","import OpenAI from 'openai';\nimport type { LlmProvider } from './provider.js';\nimport type {\n LlmRequestOptions,\n LlmResponse,\n ContentBlock,\n ToolCall,\n Message,\n} from './types.js';\n\nexport class OpenAIProvider implements LlmProvider {\n readonly name = 'openai';\n model: string;\n private client: OpenAI;\n private maxTokens: number;\n private isGemini: boolean;\n\n constructor(config: { apiKey?: string; model?: string; maxTokens?: number; baseUrl?: string }) {\n this.client = new OpenAI({\n apiKey: config.apiKey || process.env['OPENAI_API_KEY'],\n ...(config.baseUrl ? { baseURL: config.baseUrl } : {}),\n });\n this.model = config.model || 'gpt-4o';\n this.maxTokens = config.maxTokens || 8192;\n this.isGemini = !!(config.baseUrl && config.baseUrl.includes('generativelanguage.googleapis.com'));\n }\n\n setModel(model: string): void {\n this.model = model;\n }\n\n async listModels(): Promise<string[]> {\n try {\n const models = await this.client.models.list();\n return models.data\n .filter((m) => m.id.startsWith('gpt-'))\n .map((m) => m.id)\n .sort();\n } catch {\n return ['gpt-4o', 'gpt-4o-mini', 'gpt-4.1', 'gpt-4.1-mini', 'gpt-4.1-nano'];\n }\n }\n\n async chat(options: LlmRequestOptions): Promise<LlmResponse> {\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: this.cleanSchema(t.input_schema),\n },\n }));\n\n try {\n if (options.stream && options.callbacks) {\n return await this.streamChat(messages, tools, options);\n }\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n max_tokens: options.maxTokens || this.maxTokens,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(tools && tools.length > 0 ? { tools } : {}),\n });\n\n return this.parseResponse(response);\n } catch (err: any) {\n // Extract detailed error info for better debugging\n const status = err.status || err.statusCode || '';\n const body = err.error || err.body || err.response?.body || '';\n const detail = body ? JSON.stringify(body) : err.message || String(err);\n throw new Error(`${status} ${detail}`.trim());\n }\n }\n\n private async streamChat(\n messages: OpenAI.ChatCompletionMessageParam[],\n tools: OpenAI.ChatCompletionTool[] | undefined,\n options: LlmRequestOptions\n ): Promise<LlmResponse> {\n let stream;\n try {\n stream = await this.client.chat.completions.create({\n model: this.model,\n messages,\n max_tokens: options.maxTokens || this.maxTokens,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(tools && tools.length > 0 ? { tools } : {}),\n stream: true,\n });\n } catch (err: any) {\n const status = err.status || err.statusCode || '';\n const body = err.error || err.body || err.response?.body || '';\n const detail = body ? JSON.stringify(body) : err.message || String(err);\n throw new Error(`${status} ${detail}`.trim());\n }\n\n const content: ContentBlock[] = [];\n const toolCalls: ToolCall[] = [];\n let text = '';\n const toolCallAccumulator: Map<number, { id: string; name: string; args: string }> = new Map();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n text += delta.content;\n options.callbacks?.onToken?.(delta.content);\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n if (!toolCallAccumulator.has(idx)) {\n toolCallAccumulator.set(idx, { id: tc.id || '', name: tc.function?.name || '', args: '' });\n }\n const acc = toolCallAccumulator.get(idx)!;\n if (tc.id) acc.id = tc.id;\n if (tc.function?.name) acc.name = tc.function.name;\n if (tc.function?.arguments) acc.args += tc.function.arguments;\n }\n }\n }\n\n if (text) {\n content.push({ type: 'text', text });\n }\n\n for (const [, acc] of toolCallAccumulator) {\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(acc.args);\n } catch {}\n const tc: ToolCall = { id: acc.id, name: acc.name, input };\n toolCalls.push(tc);\n content.push({ type: 'tool_use', id: acc.id, name: acc.name, input });\n }\n\n return {\n content,\n text: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n stopReason: toolCalls.length > 0 ? 'tool_use' : 'end_turn',\n };\n }\n\n /**\n * Clean JSON Schema for Gemini compatibility.\n * Gemini's OpenAI-compatible API rejects some valid JSON Schema features:\n * - Empty `required` arrays\n * - `default` values in properties\n * - `additionalProperties` at top level\n */\n private cleanSchema(schema: Record<string, unknown>): Record<string, unknown> {\n const cleaned = { ...schema };\n\n // Remove empty required arrays\n if (Array.isArray(cleaned['required']) && (cleaned['required'] as unknown[]).length === 0) {\n delete cleaned['required'];\n }\n\n // Clean properties recursively\n if (cleaned['properties'] && typeof cleaned['properties'] === 'object') {\n const props = { ...cleaned['properties'] as Record<string, unknown> };\n for (const [key, val] of Object.entries(props)) {\n if (val && typeof val === 'object') {\n const prop = { ...val as Record<string, unknown> };\n // Remove default values (Gemini doesn't support them in tool schemas)\n delete prop['default'];\n props[key] = prop;\n }\n }\n cleaned['properties'] = props;\n }\n\n return cleaned;\n }\n\n private convertMessages(\n messages: Message[],\n systemPrompt?: string\n ): OpenAI.ChatCompletionMessageParam[] {\n const result: OpenAI.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 : JSON.stringify(m.content) });\n continue;\n }\n\n if (typeof m.content === 'string') {\n result.push({ role: m.role as 'user' | 'assistant', content: m.content });\n continue;\n }\n\n // Handle content blocks\n const hasToolResults = m.content.some((b) => b.type === 'tool_result');\n if (hasToolResults) {\n for (const block of m.content) {\n if (block.type === 'tool_result') {\n result.push({\n role: 'tool',\n tool_call_id: block.tool_use_id,\n content: typeof block.content === 'string' ? block.content : JSON.stringify(block.content),\n });\n }\n }\n continue;\n }\n\n const hasToolUse = m.content.some((b) => b.type === 'tool_use');\n if (hasToolUse) {\n const toolCalls: OpenAI.ChatCompletionMessageToolCall[] = [];\n let textContent = '';\n for (const block of m.content) {\n if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n type: 'function',\n function: {\n name: block.name,\n arguments: JSON.stringify(block.input),\n },\n });\n } else if (block.type === 'text') {\n textContent += block.text;\n }\n }\n result.push({\n role: 'assistant',\n content: textContent || null,\n tool_calls: toolCalls,\n });\n continue;\n }\n\n // Regular content blocks\n const parts: OpenAI.ChatCompletionContentPart[] = m.content\n .filter((b): b is Extract<ContentBlock, { type: 'text' | 'image' }> =>\n b.type === 'text' || b.type === 'image'\n )\n .map((b) => {\n if (b.type === 'text') return { type: 'text' as const, text: b.text };\n return {\n type: 'image_url' as const,\n image_url: { url: `data:${b.source.media_type};base64,${b.source.data}` },\n };\n });\n\n if (m.role === 'user') {\n result.push({ role: 'user' as const, content: parts });\n } else {\n const textContent = parts.filter((p): p is OpenAI.ChatCompletionContentPartText => p.type === 'text').map(p => p.text).join('');\n result.push({ role: 'assistant' as const, content: textContent || null });\n }\n }\n\n return result;\n }\n\n private parseResponse(response: OpenAI.ChatCompletion): LlmResponse {\n const choice = response.choices[0];\n if (!choice) {\n return { content: [], stopReason: 'end_turn' };\n }\n\n const content: ContentBlock[] = [];\n const toolCalls: ToolCall[] = [];\n let text = '';\n\n if (choice.message.content) {\n text = choice.message.content;\n content.push({ type: 'text', text });\n }\n\n if (choice.message.tool_calls) {\n for (const tc of choice.message.tool_calls) {\n if (tc.type !== 'function') continue;\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {}\n toolCalls.push({ id: tc.id, name: tc.function.name, input });\n content.push({ type: 'tool_use', id: tc.id, name: tc.function.name, input });\n }\n }\n\n return {\n content,\n text: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n usage: response.usage\n ? {\n input_tokens: response.usage.prompt_tokens,\n output_tokens: response.usage.completion_tokens,\n }\n : undefined,\n stopReason: choice.finish_reason === 'tool_calls' ? 'tool_use' : choice.finish_reason === 'length' ? 'max_tokens' : 'end_turn',\n };\n }\n}\n","import { Ollama } from 'ollama';\nimport type { LlmProvider } from './provider.js';\nimport type {\n LlmRequestOptions,\n LlmResponse,\n ContentBlock,\n ToolCall,\n Message,\n} from './types.js';\n\nexport class OllamaProvider implements LlmProvider {\n readonly name = 'ollama';\n model: string;\n private client: Ollama;\n private maxTokens: number;\n\n constructor(config: { model?: string; maxTokens?: number; baseUrl?: string }) {\n this.client = new Ollama({\n host: config.baseUrl || process.env['OLLAMA_HOST'] || 'http://localhost:11434',\n });\n this.model = config.model || 'llama3.1';\n this.maxTokens = config.maxTokens || 4096;\n }\n\n setModel(model: string): void {\n this.model = model;\n }\n\n async listModels(): Promise<string[]> {\n try {\n const models = await this.client.list();\n return models.models.map((m) => m.name);\n } catch {\n return [];\n }\n }\n\n async chat(options: LlmRequestOptions): Promise<LlmResponse> {\n const messages = this.convertMessages(options.messages, options.systemPrompt);\n\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.input_schema,\n },\n }));\n\n if (options.stream && options.callbacks) {\n return this.streamChat(messages, tools, options);\n }\n\n const response = await this.client.chat({\n model: this.model,\n messages,\n ...(tools && tools.length > 0 ? { tools } : {}),\n options: {\n num_predict: options.maxTokens || this.maxTokens,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n },\n });\n\n return this.parseResponse(response);\n }\n\n private async streamChat(\n messages: any[],\n tools: any[] | undefined,\n options: LlmRequestOptions\n ): Promise<LlmResponse> {\n const response = await this.client.chat({\n model: this.model,\n messages,\n ...(tools && tools.length > 0 ? { tools } : {}),\n stream: true,\n options: {\n num_predict: options.maxTokens || this.maxTokens,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n },\n });\n\n let text = '';\n const toolCalls: ToolCall[] = [];\n\n for await (const chunk of response) {\n if (chunk.message?.content) {\n text += chunk.message.content;\n options.callbacks?.onToken?.(chunk.message.content);\n }\n\n if (chunk.message?.tool_calls) {\n for (const tc of chunk.message.tool_calls) {\n toolCalls.push({\n id: `ollama_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n name: tc.function.name,\n input: tc.function.arguments as Record<string, unknown>,\n });\n }\n }\n }\n\n const content: ContentBlock[] = [];\n if (text) content.push({ type: 'text', text });\n for (const tc of toolCalls) {\n content.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.input });\n }\n\n return {\n content,\n text: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n stopReason: toolCalls.length > 0 ? 'tool_use' : 'end_turn',\n };\n }\n\n private convertMessages(messages: Message[], systemPrompt?: string): any[] {\n const result: any[] = [];\n\n if (systemPrompt) {\n result.push({ role: 'system', content: systemPrompt });\n }\n\n for (const m of messages) {\n if (typeof m.content === 'string') {\n result.push({ role: m.role, content: m.content });\n continue;\n }\n\n // Flatten content blocks for Ollama\n const textParts: string[] = [];\n const images: string[] = [];\n\n for (const block of m.content) {\n if (block.type === 'text') {\n textParts.push(block.text);\n } else if (block.type === 'image') {\n images.push(block.source.data);\n } else if (block.type === 'tool_result') {\n textParts.push(`[Tool Result: ${typeof block.content === 'string' ? block.content : JSON.stringify(block.content)}]`);\n } else if (block.type === 'tool_use') {\n textParts.push(`[Tool Call: ${block.name}(${JSON.stringify(block.input)})]`);\n }\n }\n\n result.push({\n role: m.role,\n content: textParts.join('\\n'),\n ...(images.length > 0 ? { images } : {}),\n });\n }\n\n return result;\n }\n\n private parseResponse(response: any): LlmResponse {\n const content: ContentBlock[] = [];\n const toolCalls: ToolCall[] = [];\n let text = '';\n\n if (response.message?.content) {\n text = response.message.content;\n content.push({ type: 'text', text });\n }\n\n if (response.message?.tool_calls) {\n for (const tc of response.message.tool_calls) {\n const toolCall: ToolCall = {\n id: `ollama_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n name: tc.function.name,\n input: tc.function.arguments as Record<string, unknown>,\n };\n toolCalls.push(toolCall);\n content.push({ type: 'tool_use', ...toolCall });\n }\n }\n\n return {\n content,\n text: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n usage: response.eval_count\n ? { input_tokens: response.prompt_eval_count ?? 0, output_tokens: response.eval_count }\n : undefined,\n stopReason: toolCalls.length > 0 ? 'tool_use' : 'end_turn',\n };\n }\n}\n"],"mappings":"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","names":["chalk","output","input","chalk","path","fs","path","readline","input","output","os","chalk","chalk","fs","path","input","output","chalk","resolve","readFileSync","chalk","input","chalk","chalk","resolve","os","execSync","fs","path","fs","path","crypto","execSync","execSync","fs","path","readline","chalk","input","currentMode","input","currentMode","chalk","os","resolve","output","fs","path","chalk","input","chalk","input","input","fs","os","path","chalk","chalk","taskManager","execSync","renderDiff","output","fs","path","input","output","fs","path","input","fs","path","input","output","fs","path","input","edit","output","fs","path","input","fs","path","input","output","resolve","exec","os","getDefaultShell","input","resolve","output","fs","path","input","execSync","input","output","input","main","input","fs","path","input","readline","chalk","input","rl","input","chalk","subAgentHandler","input","args"]}