@avasis-ai/synthcode 1.0.6 → 1.0.8
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/{chunk-F34HO4RA.js → chunk-KPJDLUMB.js} +338 -1
- package/dist/chunk-KPJDLUMB.js.map +1 -0
- package/dist/index.cjs +339 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/index.cjs +339 -0
- package/dist/llm/index.cjs.map +1 -1
- package/dist/llm/index.d.cts +36 -1
- package/dist/llm/index.d.ts +36 -1
- package/dist/llm/index.js +5 -1
- package/package.json +1 -1
- package/dist/chunk-F34HO4RA.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/index.ts","../src/types.ts","../src/tools/orchestrator.ts","../src/hooks.ts","../src/loop.ts","../src/tools/registry.ts","../src/tools/tool.ts","../src/context/tokenizer.ts","../src/context/manager.ts","../src/permissions/engine.ts","../src/cost/tracker.ts","../src/agent.ts","../src/tools/bash.ts","../src/tools/file-read.ts","../src/tools/file-write.ts","../src/tools/file-edit.ts","../src/tools/fuzzy-edit.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/web-fetch.ts","../src/llm/provider.ts","../src/llm/anthropic.ts","../src/llm/openai.ts","../src/llm/ollama.ts","../src/llm/index.ts","../src/stream.ts","../src/memory/store.ts","../src/memory/sqlite.ts","../src/mcp/client.ts","../src/mcp/adapter.ts","../src/cli/init.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport function globToRegExp(pattern: string): RegExp {\n const parts = pattern.split(\"/\");\n let regex = \"\";\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === \"**\") {\n regex += \"(?:[^/]*(?:\\\\/|$))*\";\n } else {\n const escaped = part\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\?/g, \"[^/]\");\n regex += escaped + \"\\\\/\";\n }\n }\n\n regex = regex.replace(/\\\\\\//g, \"/\").replace(/\\/$/, \"\");\n return new RegExp(`(^|/)${regex}(/|$)`);\n}\n\nexport interface WalkEntry {\n path: string;\n stat: fs.Stats;\n}\n\nexport async function walkDir(dir: string, options?: { maxDepth?: number; followSymlinks?: boolean }): Promise<WalkEntry[]> {\n const maxDepth = options?.maxDepth ?? Infinity;\n const followSymlinks = options?.followSymlinks ?? false;\n const results: WalkEntry[] = [];\n\n async function walk(current: string, depth: number): Promise<void> {\n if (depth > maxDepth) return;\n\n let entries: fs.Dirent[];\n try {\n entries = await fs.promises.readdir(current, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name);\n\n if (entry.name === \"node_modules\" || entry.name === \".git\") continue;\n\n try {\n let stat: fs.Stats;\n if (entry.isSymbolicLink() && !followSymlinks) continue;\n stat = await fs.promises.stat(fullPath);\n\n if (stat.isFile()) {\n results.push({ path: fullPath, stat });\n } else if (stat.isDirectory()) {\n await walk(fullPath, depth + 1);\n }\n } catch {\n continue;\n }\n }\n }\n\n await walk(dir, 0);\n return results;\n}\n","export { Agent } from \"./agent.js\";\nexport type { AgentConfigV2 } from \"./agent.js\";\nexport { agentLoop } from \"./loop.js\";\nexport type { AgentLoopConfig } from \"./loop.js\";\n\nexport {\n defineTool,\n defineToolFromClass,\n} from \"./tools/tool.js\";\nexport { ToolRegistry } from \"./tools/registry.js\";\nexport { orchestrateTools } from \"./tools/orchestrator.js\";\nexport type { Tool, ToolExecuteOptions, APIToolDefinition } from \"./tools/tool.js\";\nexport type { ToolExecutionResult } from \"./tools/orchestrator.js\";\nexport { BashTool } from \"./tools/bash.js\";\nexport { FileReadTool } from \"./tools/file-read.js\";\nexport { FileWriteTool } from \"./tools/file-write.js\";\nexport { FileEditTool } from \"./tools/file-edit.js\";\nexport { GlobTool } from \"./tools/glob.js\";\nexport { GrepTool } from \"./tools/grep.js\";\nexport { WebFetchTool } from \"./tools/web-fetch.js\";\n\nexport { ContextManager } from \"./context/manager.js\";\nexport { estimateTokens, estimateMessageTokens, estimateConversationTokens } from \"./context/tokenizer.js\";\nexport type { TokenCount } from \"./context/tokenizer.js\";\nexport type { ContextCheck } from \"./context/manager.js\";\n\nexport { PermissionEngine } from \"./permissions/engine.js\";\nexport type { PermissionResult } from \"./permissions/engine.js\";\nexport type { PermissionConfig } from \"./types.js\";\n\nexport { createProvider, BaseProvider, RetryableError } from \"./llm/index.js\";\nexport { AnthropicProvider, OpenAIProvider, OllamaProvider } from \"./llm/index.js\";\nexport { anthropic, openai, ollama } from \"./llm/index.js\";\nexport type { Provider, ChatRequest, ChatMessage } from \"./llm/index.js\";\n\nexport { HookRunner } from \"./hooks.js\";\nexport type { AgentHooks } from \"./hooks.js\";\n\nexport { createStreamAggregator } from \"./stream.js\";\nexport type { StreamEvent } from \"./stream.js\";\n\nexport { InMemoryStore } from \"./memory/index.js\";\nexport { SQLiteStore } from \"./memory/index.js\";\nexport type { MemoryStore } from \"./memory/index.js\";\n\nexport { CostTracker } from \"./cost/index.js\";\nexport { DEFAULT_PRICING } from \"./cost/index.js\";\nexport type { CostRecord, ModelPricing } from \"./cost/index.js\";\n\nexport { MCPClient, loadMCPTools } from \"./mcp/index.js\";\nexport type { MCPServerConfig, MCPToolDefinition } from \"./mcp/index.js\";\n\nexport { init } from \"./cli/index.js\";\nexport type { InitOptions } from \"./cli/init.js\";\n\nexport type {\n Message,\n UserMessage,\n AssistantMessage,\n ToolResultMessage,\n ContentBlock,\n TextBlock,\n ToolUseBlock,\n ThinkingBlock,\n LoopEvent,\n TokenUsage,\n ModelResponse,\n ToolContext,\n AgentConfig,\n ContextConfig,\n CompactionResult,\n} from \"./types.js\";\n\nexport {\n DEFAULT_CONTEXT_WINDOW,\n DEFAULT_MAX_OUTPUT_TOKENS,\n DEFAULT_COMPACT_THRESHOLD,\n DEFAULT_MAX_TURNS,\n MAX_CONCURRENT_TOOLS,\n} from \"./types.js\";\n","export type Message = UserMessage | AssistantMessage | ToolResultMessage;\n\nexport interface UserMessage {\n role: \"user\";\n content: string;\n}\n\nexport interface AssistantMessage {\n role: \"assistant\";\n content: ContentBlock[];\n}\n\nexport interface ToolResultMessage {\n role: \"tool\";\n tool_use_id: string;\n content: string;\n is_error?: boolean;\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ThinkingBlock;\n\nexport interface TextBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface ToolUseBlock {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\nexport interface ThinkingBlock {\n type: \"thinking\";\n thinking: string;\n}\n\nexport type LoopEvent =\n | { type: \"text\"; text: string }\n | { type: \"thinking\"; thinking: string }\n | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n | { type: \"tool_result\"; id: string; name: string; output: string; isError: boolean }\n | { type: \"error\"; error: Error }\n | { type: \"done\"; usage: TokenUsage; messages: Message[] };\n\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n}\n\nexport interface ModelResponse {\n content: ContentBlock[];\n usage: TokenUsage;\n stopReason: \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\";\n}\n\nexport interface ToolContext {\n cwd: string;\n env: Record<string, string>;\n abortSignal?: AbortSignal;\n}\n\nexport interface ProviderConfig {\n model: string;\n maxOutputTokens?: number;\n temperature?: number;\n}\n\nexport interface AgentConfig {\n model: import(\"./llm/provider.js\").Provider;\n tools?: import(\"./tools/tool.js\").Tool[];\n systemPrompt?: string;\n maxTurns?: number;\n context?: ContextConfig;\n permissions?: PermissionConfig;\n cwd?: string;\n maxRetries?: number;\n}\n\nexport interface ContextConfig {\n maxTokens?: number;\n compactThreshold?: number;\n maxOutputTokens?: number;\n}\n\nexport interface PermissionConfig {\n allowedTools?: string[];\n deniedTools?: string[];\n askTools?: string[];\n defaultAction?: \"allow\" | \"deny\" | \"ask\";\n}\n\nexport interface CompactionResult {\n messages: Message[];\n tokensSaved: number;\n method: \"snip\" | \"compact\" | \"none\";\n}\n\nexport const DEFAULT_CONTEXT_WINDOW = 200_000;\nexport const DEFAULT_MAX_OUTPUT_TOKENS = 16_384;\nexport const DEFAULT_COMPACT_THRESHOLD = 0.85;\nexport const DEFAULT_MAX_TURNS = 100;\nexport const MAX_CONCURRENT_TOOLS = 10;\n","import type { ToolContext, ToolUseBlock } from '../types.js';\nimport type { Tool } from './tool.js';\nimport { ToolRegistry } from './registry.js';\n\n/** Result of a single tool execution. */\nexport interface ToolExecutionResult {\n id: string;\n name: string;\n output: string;\n isError: boolean;\n durationMs: number;\n}\n\nclass Semaphore {\n private current = 0;\n private queue: (() => void)[] = [];\n\n constructor(private readonly max: number) {}\n\n acquire(): Promise<void> {\n if (this.current < this.max) {\n this.current++;\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n release(): void {\n this.current--;\n const next = this.queue.shift();\n if (next) {\n this.current++;\n next();\n }\n }\n}\n\nfunction partitionToolCalls(\n toolCalls: ToolUseBlock[],\n registry: ToolRegistry,\n): ToolUseBlock[][] {\n const batches: ToolUseBlock[][] = [];\n let currentBatch: ToolUseBlock[] = [];\n let currentBatchIsConcurrent = false;\n\n for (const call of toolCalls) {\n const tool = registry.get(call.name);\n const isConcurrent = tool ? tool.isReadOnly && tool.isConcurrencySafe : false;\n\n if (isConcurrent && currentBatchIsConcurrent) {\n currentBatch.push(call);\n } else {\n if (currentBatch.length > 0) {\n batches.push(currentBatch);\n }\n currentBatch = [call];\n currentBatchIsConcurrent = isConcurrent;\n }\n }\n\n if (currentBatch.length > 0) {\n batches.push(currentBatch);\n }\n\n return batches;\n}\n\nasync function executeToolCall(\n call: ToolUseBlock,\n registry: ToolRegistry,\n context: ToolContext,\n permissionCheck?: (name: string, input: Record<string, unknown>) => Promise<boolean>,\n abortSignal?: AbortSignal,\n): Promise<ToolExecutionResult> {\n if (abortSignal?.aborted) {\n return {\n id: call.id,\n name: call.name,\n output: 'Execution aborted',\n isError: true,\n durationMs: 0,\n };\n }\n\n const tool = registry.get(call.name);\n if (!tool) {\n return {\n id: call.id,\n name: call.name,\n output: `Unknown tool: ${call.name}`,\n isError: true,\n durationMs: 0,\n };\n }\n\n const start = performance.now();\n\n try {\n const parseResult = tool.inputSchema.safeParse(call.input);\n if (!parseResult.success) {\n return {\n id: call.id,\n name: call.name,\n output: `Invalid input for ${call.name}: ${parseResult.error.issues.map((i) => i.message).join(', ')}`,\n isError: true,\n durationMs: Math.round(performance.now() - start),\n };\n }\n\n if (permissionCheck) {\n const allowed = await permissionCheck(call.name, call.input);\n if (!allowed) {\n return {\n id: call.id,\n name: call.name,\n output: `Permission denied for tool: ${call.name}`,\n isError: true,\n durationMs: Math.round(performance.now() - start),\n };\n }\n }\n\n const output = await tool.execute(parseResult.data, context);\n\n return {\n id: call.id,\n name: call.name,\n output,\n isError: false,\n durationMs: Math.round(performance.now() - start),\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n id: call.id,\n name: call.name,\n output: `Error executing ${call.name}: ${message}`,\n isError: true,\n durationMs: Math.round(performance.now() - start),\n };\n }\n}\n\n/**\n * Orchestrate execution of multiple tool calls with partition-based concurrency.\n *\n * Read-only, concurrency-safe tools are grouped into concurrent batches (max 10 parallel).\n * Non-safe tools are executed serially in their own batches.\n * Results are returned in the original call order.\n */\nexport async function orchestrateTools(\n tools: ToolRegistry,\n toolCalls: ToolUseBlock[],\n context: ToolContext,\n permissionCheck?: (name: string, input: Record<string, unknown>) => Promise<boolean>,\n abortSignal?: AbortSignal,\n): Promise<ToolExecutionResult[]> {\n const batches = partitionToolCalls(toolCalls, tools);\n const results: ToolExecutionResult[] = [];\n\n for (const batch of batches) {\n if (abortSignal?.aborted) {\n for (const call of batch) {\n results.push({\n id: call.id,\n name: call.name,\n output: 'Execution aborted',\n isError: true,\n durationMs: 0,\n });\n }\n continue;\n }\n\n if (batch.length > 1) {\n const semaphore = new Semaphore(10);\n const promises = batch.map((call) =>\n semaphore.acquire().then(async () => {\n try {\n return await executeToolCall(call, tools, context, permissionCheck, abortSignal);\n } finally {\n semaphore.release();\n }\n }),\n );\n const settled = await Promise.allSettled(promises);\n for (let i = 0; i < settled.length; i++) {\n const s = settled[i];\n if (s.status === 'fulfilled') {\n results.push(s.value);\n } else {\n results.push({\n id: batch[i].id,\n name: batch[i].name,\n output: `Unexpected error: ${s.reason instanceof Error ? s.reason.message : String(s.reason)}`,\n isError: true,\n durationMs: 0,\n });\n }\n }\n } else {\n const result = await executeToolCall(batch[0], tools, context, permissionCheck, abortSignal);\n results.push(result);\n }\n }\n\n return results;\n}\n","import type { Message, CompactionResult } from \"./types.js\";\n\nexport interface AgentHooks {\n onTurnStart?: (turn: number, messages: Message[]) => Promise<Message[] | void>;\n onTurnEnd?: (turn: number, messages: Message[]) => Promise<void>;\n onToolUse?: (\n name: string,\n input: Record<string, unknown>,\n ) => Promise<{ allow?: boolean; input?: Record<string, unknown> } | void>;\n onToolResult?: (result: {\n id: string;\n name: string;\n output: string;\n isError: boolean;\n durationMs: number;\n }) => Promise<string | void>;\n onError?: (error: Error, turn: number) => Promise<{ retry?: boolean; message?: string } | void>;\n onCompact?: (result: CompactionResult) => Promise<void>;\n}\n\nexport class HookRunner {\n private hooks: AgentHooks;\n\n constructor(hooks?: AgentHooks) {\n this.hooks = hooks ?? {};\n }\n\n async runOnTurnStart(turn: number, messages: Message[]): Promise<Message[]> {\n if (!this.hooks.onTurnStart) return messages;\n const result = await this.hooks.onTurnStart(turn, messages);\n return Array.isArray(result) ? result : messages;\n }\n\n async runOnTurnEnd(turn: number, messages: Message[]): Promise<void> {\n await this.hooks.onTurnEnd?.(turn, messages);\n }\n\n async runOnToolUse(\n name: string,\n input: Record<string, unknown>,\n ): Promise<{ allow: boolean; input: Record<string, unknown> }> {\n if (!this.hooks.onToolUse) return { allow: true, input };\n const result = await this.hooks.onToolUse(name, input);\n return {\n allow: result?.allow ?? true,\n input: result?.input ?? input,\n };\n }\n\n async runOnToolResult(result: {\n id: string;\n name: string;\n output: string;\n isError: boolean;\n durationMs: number;\n }): Promise<string> {\n if (!this.hooks.onToolResult) return result.output;\n const modified = await this.hooks.onToolResult(result);\n return modified ?? result.output;\n }\n\n async runOnError(error: Error, turn: number): Promise<{ retry: boolean; message?: string }> {\n if (!this.hooks.onError) return { retry: false };\n const result = await this.hooks.onError(error, turn);\n return { retry: result?.retry ?? false, message: result?.message };\n }\n\n async runOnCompact(result: CompactionResult): Promise<void> {\n await this.hooks.onCompact?.(result);\n }\n}\n","import type { Message, ContentBlock, ToolUseBlock, LoopEvent, ToolContext, TokenUsage } from \"./types.js\";\nimport { DEFAULT_MAX_TURNS } from \"./types.js\";\nimport { ToolRegistry } from \"./tools/registry.js\";\nimport { orchestrateTools } from \"./tools/orchestrator.js\";\nimport { ContextManager } from \"./context/manager.js\";\nimport { PermissionEngine } from \"./permissions/engine.js\";\nimport type { Provider } from \"./llm/provider.js\";\nimport type { AgentHooks } from \"./hooks.js\";\nimport { HookRunner } from \"./hooks.js\";\nimport type { CostTracker } from \"./cost/tracker.js\";\n\nconst DEFAULT_MAX_RETRIES = 5;\nconst INITIAL_RETRY_DELAY_MS = 1000;\nconst MAX_RETRY_DELAY_MS = 30000;\nconst DOOM_LOOP_THRESHOLD = 3;\nconst PRE_OVERFLOW_BUFFER = 20_000;\nconst OUTPUT_MAX_LINES = 2000;\nconst OUTPUT_MAX_BYTES = 50_000;\n\nexport interface AgentLoopConfig {\n model: Provider;\n tools: ToolRegistry;\n messages: Message[];\n systemPrompt?: string;\n maxTurns?: number;\n contextManager: ContextManager;\n permissionEngine: PermissionEngine;\n cwd?: string;\n abortSignal?: AbortSignal;\n maxRetries?: number;\n hooks?: AgentHooks;\n costTracker?: CostTracker;\n}\n\nfunction parseRetryAfterMs(error: Error): number | null {\n const msg = error.message ?? \"\";\n const retryAfterMsMatch = msg.match(/retry-after-ms:\\s*(\\d+)/i);\n if (retryAfterMsMatch) return parseInt(retryAfterMsMatch[1], 10);\n const retryAfterMatch = msg.match(/retry-after:\\s*(\\d+)/i);\n if (retryAfterMatch) return parseInt(retryAfterMatch[1], 10) * 1000;\n return null;\n}\n\nfunction truncateOutput(output: string, toolName: string, hasSubAgent: boolean): string {\n const lines = output.split(\"\\n\");\n if (lines.length <= OUTPUT_MAX_LINES && output.length <= OUTPUT_MAX_BYTES) return output;\n\n let truncated = \"\";\n let byteCount = 0;\n for (const line of lines) {\n if (byteCount + line.length > OUTPUT_MAX_BYTES) break;\n truncated += line + \"\\n\";\n byteCount += line.length;\n if (byteCount > OUTPUT_MAX_BYTES) break;\n }\n\n const lineCount = truncated.split(\"\\n\").filter(l => l.length > 0).length;\n const suffix = hasSubAgent\n ? `\\n\\n[Output truncated: ${lineCount}/${lines.length} lines shown. Use the Task tool to have a sub-agent process the full output.]`\n : `\\n\\n[Output truncated: ${lineCount}/${lines.length} lines shown. Use Grep to search or Read with offset/limit for the full content.]`;\n\n return truncated.trimEnd() + suffix;\n}\n\nfunction detectDoomLoop(messages: Message[]): ToolUseBlock | null {\n const recentToolCalls: ToolUseBlock[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role !== \"assistant\") continue;\n if (typeof msg.content === \"string\") continue;\n for (const block of msg.content) {\n if (block.type === \"tool_use\") recentToolCalls.push(block);\n }\n if (recentToolCalls.length >= DOOM_LOOP_THRESHOLD) break;\n }\n\n if (recentToolCalls.length < DOOM_LOOP_THRESHOLD) return null;\n\n const last = recentToolCalls[0];\n return recentToolCalls.every(\n tc => tc.name === last.name && JSON.stringify(tc.input) === JSON.stringify(last.input),\n )\n ? last\n : null;\n}\n\nexport async function* agentLoop(config: AgentLoopConfig): AsyncGenerator<LoopEvent> {\n const {\n model,\n tools,\n messages,\n systemPrompt,\n maxTurns = DEFAULT_MAX_TURNS,\n contextManager,\n permissionEngine,\n cwd = process.cwd(),\n abortSignal,\n hooks,\n costTracker,\n } = config;\n\n const hookRunner = new HookRunner(hooks);\n const context: ToolContext = { cwd, env: { ...process.env } as Record<string, string> };\n let turns = 0;\n let consecutiveRetries = 0;\n const maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n let totalUsage = { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 };\n let inFlightText = \"\";\n let inFlightReasoning = \"\";\n let inFlightToolCalls: ToolUseBlock[] = [];\n\n while (turns < maxTurns) {\n if (abortSignal?.aborted) {\n yield finalizeLoop(\"Aborted\");\n return;\n }\n\n const messagesAfterHook = await hookRunner.runOnTurnStart(turns + 1, messages);\n if (messagesAfterHook !== messages) {\n messages.length = 0;\n messages.push(...messagesAfterHook);\n }\n\n const contextCheck = contextManager.check(messages);\n if (contextCheck.needsCompact) {\n const result = await contextManager.compact(messages);\n messages.length = 0;\n messages.push(...result.messages);\n if (result.tokensSaved > 0) {\n const thinking = `Context ${result.method}: saved ~${result.tokensSaved} tokens (${contextCheck.totalTokens} → ${contextCheck.totalTokens - result.tokensSaved})`;\n yield { type: \"thinking\", thinking };\n await hookRunner.runOnCompact(result);\n }\n const pruned = contextManager.pruneToolOutputs(messages);\n if (pruned.length !== messages.length) {\n messages.length = 0;\n messages.push(...pruned);\n yield { type: \"thinking\", thinking: \"Pruned large tool outputs to free additional context\" };\n }\n }\n\n const estimatedTotal = totalUsage.inputTokens + totalUsage.outputTokens\n + (totalUsage.cacheReadTokens ?? 0) + (totalUsage.cacheWriteTokens ?? 0);\n const maxContext = contextManager.maxTokens;\n const maxOutput = contextManager.maxOutputTokens;\n if (maxContext > 0 && estimatedTotal + maxOutput + PRE_OVERFLOW_BUFFER >= maxContext) {\n yield { type: \"thinking\", thinking: \"Approaching context limit, compacting preemptively...\" };\n const result = await contextManager.compact(messages);\n messages.length = 0;\n messages.push(...result.messages);\n if (result.tokensSaved > 0) {\n yield { type: \"thinking\", thinking: `Pre-overflow compact: freed ~${result.tokensSaved} tokens` };\n }\n }\n\n const available = contextManager.getAvailableTokens(messages);\n const maxTokens = Math.min(available, contextManager.maxOutputTokens);\n if (maxTokens < 1024) {\n yield finalizeLoop(\"Insufficient context window for next turn\");\n return;\n }\n\n inFlightText = \"\";\n inFlightReasoning = \"\";\n inFlightToolCalls = [];\n\n let response;\n try {\n const mappedMessages = messages.map((m) => {\n if (m.role === \"tool\") {\n const toolCall = inFlightToolCalls.find(tc => tc.id === (m as { tool_use_id?: string }).tool_use_id);\n if (toolCall) {\n return {\n role: \"tool\" as const,\n tool_use_id: m.role === \"tool\" ? (m as { tool_use_id: string }).tool_use_id : undefined,\n is_error: m.role === \"tool\" ? (m as { is_error?: boolean }).is_error : undefined,\n content: truncateOutput(\n (m as { content: string }).content,\n toolCall.name,\n tools.has(\"delegate_agent\"),\n ),\n };\n }\n }\n return {\n role: m.role,\n content: m.role === \"tool\"\n ? (m as { content: string }).content\n : m.role === \"user\"\n ? (m as { content: string }).content\n : (m as { content: ContentBlock[] }).content,\n tool_use_id: m.role === \"tool\" ? (m as { tool_use_id: string }).tool_use_id : undefined,\n is_error: m.role === \"tool\" ? (m as { is_error?: boolean }).is_error : undefined,\n };\n });\n\n response = await model.chat({\n messages: mappedMessages,\n tools: tools.getAPI(),\n systemPrompt,\n maxOutputTokens: maxTokens,\n abortSignal,\n });\n } catch (err) {\n yield* flushInFlight();\n const error = err instanceof Error ? err : new Error(String(err));\n\n const hookResult = await hookRunner.runOnError(error, turns + 1);\n if (hookResult.retry && hookResult.message) {\n messages.push({ role: \"user\", content: hookResult.message });\n turns++;\n continue;\n }\n\n if (error.message.includes(\"429\") || error.message.includes(\"529\") || error.message.includes(\"overloaded\")) {\n consecutiveRetries++;\n if (consecutiveRetries > maxRetries) {\n yield { type: \"error\", error: new Error(`Max retries (${maxRetries}) exceeded`) };\n return;\n }\n const headerDelay = parseRetryAfterMs(error);\n const backoffDelay = headerDelay\n ?? Math.min(INITIAL_RETRY_DELAY_MS * 2 ** (consecutiveRetries - 1) + Math.random() * 500, MAX_RETRY_DELAY_MS);\n yield { type: \"thinking\", thinking: `Rate limited, retry ${consecutiveRetries}/${maxRetries} in ${Math.round(backoffDelay)}ms...` };\n await new Promise((r) => setTimeout(r, backoffDelay));\n continue;\n }\n\n yield { type: \"error\", error };\n return;\n }\n\n totalUsage.inputTokens += response.usage.inputTokens;\n totalUsage.outputTokens += response.usage.outputTokens;\n totalUsage.cacheReadTokens = (totalUsage.cacheReadTokens ?? 0) + (response.usage.cacheReadTokens ?? 0);\n totalUsage.cacheWriteTokens = (totalUsage.cacheWriteTokens ?? 0) + (response.usage.cacheWriteTokens ?? 0);\n\n if (costTracker) {\n costTracker.record(model.model, response.usage, turns + 1);\n }\n\n const toolCalls: ToolUseBlock[] = [];\n for (const block of response.content) {\n if (block.type === \"text\") {\n inFlightText += block.text;\n yield { type: \"text\", text: block.text };\n } else if (block.type === \"thinking\") {\n inFlightReasoning += block.thinking;\n yield { type: \"thinking\", thinking: block.thinking };\n } else if (block.type === \"tool_use\") {\n const resolvedName = tools.has(block.name) ? block.name : tools.findCaseInsensitive(block.name);\n if (!resolvedName) {\n yield { type: \"tool_result\", id: block.id, name: block.name, output: `Unknown tool: ${block.name}. Available: ${tools.listNames().join(\", \")}`, isError: true };\n messages.push({ role: \"assistant\", content: response.content });\n messages.push({ role: \"tool\", tool_use_id: block.id, content: `Unknown tool: ${block.name}`, is_error: true });\n continue;\n }\n const modifiedBlock: ToolUseBlock = resolvedName !== block.name ? { ...block, name: resolvedName } : block;\n\n const hookToolResult = await hookRunner.runOnToolUse(modifiedBlock.name, modifiedBlock.input);\n if (!hookToolResult.allow) {\n yield { type: \"tool_result\", id: modifiedBlock.id, name: modifiedBlock.name, output: \"Tool denied by hook\", isError: true };\n messages.push({ role: \"assistant\", content: response.content });\n messages.push({ role: \"tool\", tool_use_id: modifiedBlock.id, content: \"Tool denied by hook\", is_error: true });\n continue;\n }\n const finalBlock: ToolUseBlock = { ...modifiedBlock, input: hookToolResult.input };\n toolCalls.push(finalBlock);\n inFlightToolCalls.push(finalBlock);\n yield { type: \"tool_use\", id: finalBlock.id, name: finalBlock.name, input: finalBlock.input };\n }\n }\n\n const hasNonToolContent = inFlightText.length > 0 || inFlightReasoning.length > 0;\n if (!hasNonToolContent && toolCalls.length === 0) {\n yield finalizeLoop(\"Assistant produced no content\");\n return;\n }\n\n const assistantContent = response.content.filter(b => {\n if (b.type !== \"tool_use\") return true;\n return toolCalls.some(tc => tc.id === b.id);\n });\n\n messages.push({ role: \"assistant\", content: assistantContent });\n turns++;\n consecutiveRetries = 0;\n inFlightText = \"\";\n inFlightReasoning = \"\";\n inFlightToolCalls = [];\n\n await hookRunner.runOnTurnEnd(turns, messages);\n\n if (response.stopReason !== \"tool_use\" || toolCalls.length === 0) {\n yield {\n type: \"done\",\n usage: {\n inputTokens: totalUsage.inputTokens,\n outputTokens: totalUsage.outputTokens,\n cacheReadTokens: totalUsage.cacheReadTokens,\n cacheWriteTokens: totalUsage.cacheWriteTokens,\n },\n messages: [...messages],\n };\n return;\n }\n\n const doomLoopCall = detectDoomLoop(messages);\n if (doomLoopCall) {\n yield { type: \"thinking\", thinking: `Detected repetitive tool calls: ${doomLoopCall.name} called ${DOOM_LOOP_THRESHOLD} times with identical input. Breaking the loop.` };\n messages.push({ role: \"user\", content: `STOP. You have called ${doomLoopCall.name} ${DOOM_LOOP_THRESHOLD} times in a row with the same input. This indicates a loop. Try a different approach or tool.` });\n turns++;\n continue;\n }\n\n const results = await orchestrateTools(\n tools,\n toolCalls,\n context,\n async (name, _input) => {\n const perm = permissionEngine.check(name);\n return perm.allowed;\n },\n abortSignal,\n );\n\n for (const result of results) {\n let output = truncateOutput(result.output, result.name, tools.has(\"delegate_agent\"));\n const toolResult = await hookRunner.runOnToolResult({\n id: result.id,\n name: result.name,\n output: result.output,\n isError: result.isError,\n durationMs: result.durationMs,\n });\n output = toolResult;\n\n messages.push({\n role: \"tool\",\n tool_use_id: result.id,\n content: output,\n is_error: result.isError,\n });\n yield {\n type: \"tool_result\",\n id: result.id,\n name: result.name,\n output,\n isError: result.isError,\n };\n }\n }\n\n yield { type: \"error\", error: new Error(`Max turns (${maxTurns}) reached`) };\n\n function* flushInFlight(): Generator<LoopEvent, void, unknown> {\n if (inFlightText.length > 0) {\n yield { type: \"text\", text: inFlightText };\n }\n if (inFlightReasoning.length > 0) {\n yield { type: \"thinking\", thinking: inFlightReasoning };\n }\n for (const tc of inFlightToolCalls) {\n yield { type: \"tool_result\", id: tc.id, name: tc.name, output: \"[Tool execution was interrupted]\", isError: true };\n messages.push({ role: \"assistant\", content: [{ type: \"tool_use\" as const, id: tc.id, name: tc.name, input: tc.input }] });\n messages.push({ role: \"tool\", tool_use_id: tc.id, content: \"[Tool execution was interrupted]\", is_error: true });\n }\n }\n\n function finalizeLoop(reason: string): LoopEvent {\n if (totalUsage.inputTokens > 0 || totalUsage.outputTokens > 0) {\n return {\n type: \"done\",\n usage: {\n inputTokens: totalUsage.inputTokens,\n outputTokens: totalUsage.outputTokens,\n cacheReadTokens: totalUsage.cacheReadTokens,\n cacheWriteTokens: totalUsage.cacheWriteTokens,\n },\n messages: [...messages],\n };\n }\n return { type: \"error\", error: new Error(reason) };\n }\n}\n","import type { Tool, APIToolDefinition } from './tool.js';\n\n/** Registry for managing tool lookup and deduplication. */\nexport class ToolRegistry {\n private readonly tools = new Map<string, Tool>();\n\n constructor(tools?: Tool[]) {\n if (tools) {\n for (const tool of tools) {\n this.add(tool);\n }\n }\n }\n\n /** Add a tool to the registry. Duplicate names are ignored (first one wins). */\n add(tool: Tool): void {\n if (this.tools.has(tool.name)) {\n console.warn(`[ToolRegistry] Duplicate tool \"${tool.name}\" ignored (first one wins)`);\n return;\n }\n this.tools.set(tool.name, tool);\n }\n\n /** Get a tool by name. */\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n /** Check if a tool exists by name. */\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n /** Find tool by case-insensitive name. Returns undefined if not found. */\n findCaseInsensitive(name: string): string | undefined {\n const lower = name.toLowerCase();\n if (this.tools.has(name)) return name;\n for (const key of this.tools.keys()) {\n if (key.toLowerCase() === lower) return key;\n }\n return undefined;\n }\n\n /** List all registered tool names. */\n listNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n /** Get all registered tools. */\n getAll(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n /** Get all tools in API format, sorted by name for cache stability. */\n getAPI(): APIToolDefinition[] {\n return this.getAll()\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((t) => t.toAPI());\n }\n\n /** Number of registered tools. */\n get size(): number {\n return this.tools.size;\n }\n}\n","import type { ZodSchema } from 'zod';\nimport type { ToolContext } from '../types.js';\n\n/** JSON Schema representation of a tool for LLM function calling APIs. */\nexport interface APIToolDefinition {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\n/** Core tool abstraction that every tool must implement. */\nexport interface Tool<P = unknown> {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: ZodSchema<P>;\n readonly isReadOnly: boolean;\n readonly isConcurrencySafe: boolean;\n\n execute(input: P, context: ToolContext): Promise<string>;\n toAPI(): APIToolDefinition;\n toString(input: P): string;\n}\n\n/** Configuration object for defining a tool. */\nexport interface ToolExecuteOptions<P = unknown> {\n name: string;\n description: string;\n inputSchema: ZodSchema<P>;\n isReadOnly?: boolean;\n isConcurrencySafe?: boolean;\n execute: (input: P, context: ToolContext) => Promise<string>;\n}\n\nfunction zodToJsonSchema(schema: unknown): Record<string, unknown> {\n const s = schema as { _def: Record<string, unknown> };\n const def = s._def;\n const typeName = def.typeName as string;\n const description = def.description as string | undefined;\n\n const base: Record<string, unknown> = {};\n if (description) base.description = description;\n\n switch (typeName) {\n case 'ZodString':\n return { ...base, type: 'string' };\n case 'ZodNumber':\n return { ...base, type: 'number' };\n case 'ZodBoolean':\n return { ...base, type: 'boolean' };\n case 'ZodNull':\n return { ...base, type: 'null' };\n case 'ZodArray': {\n const items = zodToJsonSchema(def.element);\n return { ...base, type: 'array', items };\n }\n case 'ZodObject': {\n const shapeFn = def.shape as () => Record<string, unknown>;\n const shape = shapeFn();\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodToJsonSchema(value);\n const propDef = (value as { _def: Record<string, unknown> })._def;\n if (\n propDef.typeName !== 'ZodOptional' &&\n propDef.typeName !== 'ZodNullish' &&\n propDef.typeName !== 'ZodDefault'\n ) {\n required.push(key);\n }\n }\n const result: Record<string, unknown> = { ...base, type: 'object', properties };\n if (required.length > 0) result.required = required;\n return result;\n }\n case 'ZodEnum':\n return { ...base, enum: def.values };\n case 'ZodLiteral':\n return { ...base, const: def.value };\n case 'ZodUnion': {\n const options = (def.options as unknown[]).map((o) => zodToJsonSchema(o));\n return { ...base, anyOf: options };\n }\n case 'ZodDiscriminatedUnion': {\n const options = (def.options as unknown[]).map((o) => zodToJsonSchema(o));\n return { ...base, anyOf: options };\n }\n case 'ZodOptional':\n return zodToJsonSchema(def.innerType);\n case 'ZodNullable': {\n const inner = zodToJsonSchema(def.innerType);\n inner.nullable = true;\n return inner;\n }\n case 'ZodNullish': {\n const inner = zodToJsonSchema(def.innerType);\n inner.nullable = true;\n return inner;\n }\n case 'ZodDefault':\n return zodToJsonSchema(def.innerType);\n case 'ZodRecord': {\n const valueSchema = zodToJsonSchema(def.valueType);\n return { ...base, type: 'object', additionalProperties: valueSchema };\n }\n case 'ZodTuple': {\n const items = (def.items as unknown[]).map((o) => zodToJsonSchema(o));\n return { ...base, type: 'array', items, minItems: items.length, maxItems: items.length };\n }\n case 'ZodEffects': {\n return zodToJsonSchema(def.innerType);\n }\n case 'ZodAny':\n return {};\n case 'ZodUnknown':\n return {};\n case 'ZodVoid':\n return { ...base, type: 'null' };\n case 'ZodNever':\n return { ...base, not: {} };\n default:\n return { ...base, type: 'string' };\n }\n}\n\n/** Define a tool from a configuration object. */\nexport function defineTool<P = unknown>(config: ToolExecuteOptions<P>): Tool<P> {\n const tool: Tool<P> = {\n name: config.name,\n description: config.description,\n inputSchema: config.inputSchema,\n isReadOnly: config.isReadOnly ?? false,\n isConcurrencySafe: config.isConcurrencySafe ?? false,\n execute: config.execute,\n toAPI(): APIToolDefinition {\n return {\n name: config.name,\n description: config.description,\n input_schema: zodToJsonSchema(config.inputSchema),\n };\n },\n toString(input: P): string {\n const entries = Object.entries(input as Record<string, unknown>)\n .map(([k, v]) => {\n if (typeof v === 'string') return `${k}: \"${v}\"`;\n if (v === undefined) return `${k}: undefined`;\n if (v === null) return `${k}: null`;\n return `${k}: ${String(v)}`;\n })\n .join(', ');\n return `${config.name}({ ${entries} })`;\n },\n };\n return tool;\n}\n\n/** Wrap a class-based tool into the standard Tool interface. */\nexport function defineToolFromClass(ctor: new () => Tool): Tool {\n const instance = new ctor();\n return {\n name: instance.name,\n description: instance.description,\n inputSchema: instance.inputSchema,\n isReadOnly: instance.isReadOnly,\n isConcurrencySafe: instance.isConcurrencySafe,\n execute: (input, context) => instance.execute(input, context),\n toAPI: () => instance.toAPI(),\n toString: (input) => instance.toString(input),\n };\n}\n","import type { Message } from \"../types.js\";\n\nexport interface TokenCount {\n total: number;\n byRole: Record<string, number>;\n}\n\nexport function estimateTokens(text: string): number {\n const chars = text.length;\n const words = text.split(/\\s+/).filter(Boolean).length;\n return Math.max(Math.ceil(chars / 4), Math.ceil(words * 1.3));\n}\n\nexport function estimateMessageTokens(message: Message): number {\n if (message.role === \"user\") {\n return estimateTokens(message.content) + 4;\n }\n\n if (message.role === \"tool\") {\n return estimateTokens(message.content) + 4;\n }\n\n let tokens = 0;\n for (const block of message.content) {\n if (block.type === \"text\") {\n tokens += estimateTokens(block.text) + 4;\n } else if (block.type === \"tool_use\") {\n tokens += estimateTokens(block.name) + estimateTokens(JSON.stringify(block.input)) + 4;\n } else if (block.type === \"thinking\") {\n tokens += estimateTokens(block.thinking) + 4;\n }\n }\n return tokens;\n}\n\nexport function estimateConversationTokens(messages: Message[]): TokenCount {\n const byRole: Record<string, number> = {};\n\n let total = 0;\n for (const message of messages) {\n const msgTokens = estimateMessageTokens(message) + 10;\n total += msgTokens;\n byRole[message.role] = (byRole[message.role] ?? 0) + msgTokens;\n }\n\n return { total, byRole };\n}\n","import type { Message, ContentBlock, ContextConfig, CompactionResult } from \"../types.js\";\nimport { DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_OUTPUT_TOKENS, DEFAULT_COMPACT_THRESHOLD } from \"../types.js\";\nimport { estimateConversationTokens, estimateMessageTokens } from \"./tokenizer.js\";\n\nconst PRUNE_MINIMUM = 20_000;\nconst PRUNE_PROTECT_TOKENS = 40_000;\nconst PROTECTED_TOOL_TYPES = new Set([\"skill\", \"delegate_agent\"]);\nconst RECENT_TURNS_TO_PROTECT = 2;\n\nexport interface ContextCheck {\n totalTokens: number;\n availableTokens: number;\n usagePercent: number;\n needsCompact: boolean;\n recommendedMethod: \"snip\" | \"compact\";\n}\n\nexport class ContextManager {\n readonly maxTokens: number;\n readonly maxOutputTokens: number;\n readonly compactThreshold: number;\n\n constructor(config?: ContextConfig) {\n this.maxTokens = config?.maxTokens ?? DEFAULT_CONTEXT_WINDOW;\n this.maxOutputTokens = config?.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS;\n this.compactThreshold = config?.compactThreshold ?? DEFAULT_COMPACT_THRESHOLD;\n }\n\n check(messages: Message[]): ContextCheck {\n const { total: totalTokens } = estimateConversationTokens(messages);\n const availableTokens = this.maxTokens - totalTokens - this.maxOutputTokens;\n const usagePercent = totalTokens / this.maxTokens;\n const needsCompact = usagePercent >= this.compactThreshold;\n let recommendedMethod: \"snip\" | \"compact\";\n\n if (usagePercent > 0.95) {\n recommendedMethod = \"compact\";\n } else {\n recommendedMethod = \"snip\";\n }\n\n return { totalTokens, availableTokens, usagePercent, needsCompact, recommendedMethod };\n }\n\n async compact(messages: Message[], summaryFn?: (messages: Message[]) => Promise<string>): Promise<CompactionResult> {\n const contextCheck = this.check(messages);\n\n if (!contextCheck.needsCompact) {\n return { messages: [...messages], tokensSaved: 0, method: \"none\" };\n }\n\n const originalTokens = contextCheck.totalTokens;\n\n if (summaryFn && contextCheck.recommendedMethod === \"compact\") {\n const recentCount = Math.max(Math.ceil(messages.length * 0.2), 1);\n const cutoffIndex = messages.length - recentCount;\n const oldMessages = messages.slice(0, cutoffIndex);\n const recentMessages = messages.slice(cutoffIndex);\n\n const summary = await summaryFn(oldMessages);\n const summaryMessage: Message = {\n role: \"user\",\n content: `Here is a summary of our previous conversation:\\n${summary}`,\n };\n\n const compacted = [summaryMessage, ...recentMessages];\n const newTokens = estimateConversationTokens(compacted).total;\n\n return {\n messages: compacted,\n tokensSaved: originalTokens - newTokens,\n method: \"compact\",\n };\n }\n\n const keepFirst = 1;\n const keepLast = 20;\n const keepMin = keepFirst + keepLast;\n\n if (messages.length <= keepMin) {\n return { messages: [...messages], tokensSaved: 0, method: \"none\" };\n }\n\n let result = [...messages];\n const targetUsage = 0.6;\n\n while (result.length > keepMin) {\n const { total } = estimateConversationTokens(result);\n if (total / this.maxTokens < targetUsage) break;\n\n const removeCount = Math.max(1, Math.floor((result.length - keepMin) * 0.3));\n const removeEnd = Math.min(keepFirst + removeCount, result.length - keepLast);\n result = [result[0], ...result.slice(removeEnd)];\n }\n\n const newTokens = estimateConversationTokens(result).total;\n\n return {\n messages: result,\n tokensSaved: originalTokens - newTokens,\n method: \"snip\",\n };\n }\n\n pruneToolOutputs(messages: Message[]): Message[] {\n let totalPruned = 0;\n let turnCount = 0;\n const result = [...messages];\n\n for (let i = result.length - 1; i >= 0; i--) {\n const msg = result[i];\n if (msg.role === \"user\") {\n turnCount++;\n if (turnCount <= RECENT_TURNS_TO_PROTECT) continue;\n }\n if (msg.role !== \"assistant\" || !Array.isArray(msg.content)) continue;\n\n for (const block of msg.content) {\n if (block.type !== \"tool_use\") continue;\n if (PROTECTED_TOOL_TYPES.has(block.name)) continue;\n\n const toolResultIdx = result.findIndex(\n (m, j) => j > i && m.role === \"tool\" && (m as { tool_use_id?: string }).tool_use_id === block.id,\n );\n if (toolResultIdx === -1) continue;\n\n const toolResult = result[toolResultIdx];\n const output = (toolResult as { content: string }).content;\n const estTokens = Math.ceil(output.length / 4);\n\n if (totalPruned + estTokens >= PRUNE_MINIMUM && totalPruned >= PRUNE_PROTECT_TOKENS) {\n return result;\n }\n\n totalPruned += estTokens;\n result[toolResultIdx] = {\n ...(toolResult as unknown as Record<string, unknown>),\n content: `[Output pruned: ${estTokens} tokens saved]`,\n is_error: false,\n } as typeof toolResult;\n }\n }\n\n return result;\n }\n\n getAvailableTokens(messages: Message[]): number {\n return this.maxTokens - estimateConversationTokens(messages).total - this.maxOutputTokens;\n }\n\n getUsagePercent(messages: Message[]): number {\n return estimateConversationTokens(messages).total / this.maxTokens;\n }\n}\n","import type { PermissionConfig } from \"../types.js\";\n\nexport interface PermissionResult {\n allowed: boolean;\n reason?: string;\n}\n\nfunction matchPattern(pattern: string, toolName: string): boolean {\n if (!pattern.includes(\"*\")) {\n return pattern === toolName;\n }\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n const regex = new RegExp(`^${escaped}$`);\n return regex.test(toolName);\n}\n\nexport class PermissionEngine {\n private allowedPatterns: string[];\n private deniedPatterns: string[];\n private askPatterns: string[];\n private defaultAction: \"allow\" | \"deny\" | \"ask\";\n\n constructor(config?: PermissionConfig) {\n this.allowedPatterns = config?.allowedTools ?? [];\n this.deniedPatterns = config?.deniedTools ?? [];\n this.askPatterns = config?.askTools ?? [];\n this.defaultAction = config?.defaultAction ?? \"allow\";\n }\n\n check(toolName: string, _input?: Record<string, unknown>): PermissionResult {\n for (const pattern of this.deniedPatterns) {\n if (matchPattern(pattern, toolName)) {\n return { allowed: false, reason: `Tool '${toolName}' matches denied pattern '${pattern}'` };\n }\n }\n\n for (const pattern of this.allowedPatterns) {\n if (matchPattern(pattern, toolName)) {\n return { allowed: true };\n }\n }\n\n for (const pattern of this.askPatterns) {\n if (matchPattern(pattern, toolName)) {\n return { allowed: false, reason: \"ask\" };\n }\n }\n\n if (this.defaultAction === \"deny\") {\n return { allowed: false, reason: `Tool '${toolName}' not explicitly allowed` };\n }\n\n if (this.defaultAction === \"ask\") {\n return { allowed: false, reason: \"ask\" };\n }\n\n return { allowed: true };\n }\n\n addAllowed(pattern: string): void {\n this.allowedPatterns.push(pattern);\n }\n\n addDenied(pattern: string): void {\n this.deniedPatterns.push(pattern);\n }\n\n addAsk(pattern: string): void {\n this.askPatterns.push(pattern);\n }\n}\n","export interface CostRecord {\n model: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n inputCost: number;\n outputCost: number;\n timestamp: number;\n turn: number;\n toolName?: string;\n}\n\nexport interface ModelPricing {\n inputCostPer1k: number;\n outputCostPer1k: number;\n}\n\nexport const DEFAULT_PRICING: Record<string, ModelPricing> = {\n \"claude-sonnet-4-20250514\": { inputCostPer1k: 0.003, outputCostPer1k: 0.015 },\n \"claude-3-5-sonnet-20241022\": { inputCostPer1k: 0.003, outputCostPer1k: 0.015 },\n \"claude-3-5-haiku-20241022\": { inputCostPer1k: 0.0008, outputCostPer1k: 0.004 },\n \"claude-opus-4-20250514\": { inputCostPer1k: 0.015, outputCostPer1k: 0.075 },\n \"gpt-4o\": { inputCostPer1k: 0.0025, outputCostPer1k: 0.01 },\n \"gpt-4o-mini\": { inputCostPer1k: 0.00015, outputCostPer1k: 0.0006 },\n \"gpt-4-turbo\": { inputCostPer1k: 0.01, outputCostPer1k: 0.03 },\n};\n\nexport class CostTracker {\n private records: CostRecord[] = [];\n private pricing: Record<string, ModelPricing>;\n\n constructor(customPricing?: Record<string, ModelPricing>) {\n this.pricing = { ...DEFAULT_PRICING, ...customPricing };\n }\n\n record(\n model: string,\n usage: { inputTokens: number; outputTokens: number; cacheReadTokens?: number; cacheWriteTokens?: number },\n turn: number,\n toolName?: string,\n ): void {\n const pricing = this.pricing[model] ?? { inputCostPer1k: 0.001, outputCostPer1k: 0.003 };\n this.records.push({\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n cacheReadTokens: usage.cacheReadTokens ?? 0,\n cacheWriteTokens: usage.cacheWriteTokens ?? 0,\n inputCost: (usage.inputTokens / 1000) * pricing.inputCostPer1k,\n outputCost: (usage.outputTokens / 1000) * pricing.outputCostPer1k,\n timestamp: Date.now(),\n turn,\n toolName,\n });\n }\n\n getTotal(): {\n cost: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n } {\n let cost = 0;\n let input = 0;\n let output = 0;\n let cacheRead = 0;\n let cacheWrite = 0;\n for (const r of this.records) {\n cost += r.inputCost + r.outputCost;\n input += r.inputTokens;\n output += r.outputTokens;\n cacheRead += r.cacheReadTokens;\n cacheWrite += r.cacheWriteTokens;\n }\n return { cost, inputTokens: input, outputTokens: output, cacheReadTokens: cacheRead, cacheWriteTokens: cacheWrite };\n }\n\n getByModel(): Record<string, { cost: number; calls: number }> {\n const byModel: Record<string, { cost: number; calls: number }> = {};\n for (const r of this.records) {\n if (!byModel[r.model]) byModel[r.model] = { cost: 0, calls: 0 };\n byModel[r.model].cost += r.inputCost + r.outputCost;\n byModel[r.model].calls++;\n }\n return byModel;\n }\n\n getByTool(): Record<string, { cost: number; calls: number }> {\n const byTool: Record<string, { cost: number; calls: number }> = {};\n for (const r of this.records) {\n const key = r.toolName ?? \"llm\";\n if (!byTool[key]) byTool[key] = { cost: 0, calls: 0 };\n byTool[key].cost += r.inputCost + r.outputCost;\n byTool[key].calls++;\n }\n return byTool;\n }\n\n getRecords(): CostRecord[] {\n return [...this.records];\n }\n\n reset(): void {\n this.records = [];\n }\n\n setPricing(model: string, pricing: ModelPricing): void {\n this.pricing[model] = pricing;\n }\n}\n","import type { Message, LoopEvent, AgentConfig, PermissionConfig } from \"./types.js\";\nimport { DEFAULT_MAX_TURNS, DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_OUTPUT_TOKENS, DEFAULT_COMPACT_THRESHOLD } from \"./types.js\";\nimport { agentLoop } from \"./loop.js\";\nimport { ToolRegistry } from \"./tools/registry.js\";\nimport { defineTool } from \"./tools/tool.js\";\nimport type { Tool } from \"./tools/tool.js\";\nimport { ContextManager } from \"./context/manager.js\";\nimport { PermissionEngine } from \"./permissions/engine.js\";\nimport type { Provider } from \"./llm/provider.js\";\nimport type { AgentHooks } from \"./hooks.js\";\nimport { HookRunner } from \"./hooks.js\";\nimport type { MemoryStore } from \"./memory/store.js\";\nimport type { CostTracker } from \"./cost/tracker.js\";\nimport { CostTracker as CostTrackerImpl } from \"./cost/tracker.js\";\n\nexport interface AgentConfigV2 extends AgentConfig {\n hooks?: AgentHooks;\n memory?: MemoryStore;\n threadId?: string;\n costTracker?: CostTracker;\n title?: string;\n disableTitle?: boolean;\n}\n\nexport class Agent {\n private model: Provider;\n private tools: ToolRegistry;\n private systemPrompt: string;\n private maxTurns: number;\n private contextManager: ContextManager;\n private permissionEngine: PermissionEngine;\n private permissionConfig?: PermissionConfig;\n private cwd: string;\n private maxRetries: number;\n private messages: Message[] = [];\n private hooks?: AgentHooks;\n private memory?: MemoryStore;\n private threadId?: string;\n private costTracker: CostTracker;\n private _loaded = false;\n private _title?: string;\n private _titleFetched = false;\n private _disableTitle = false;\n\n constructor(config: AgentConfig | AgentConfigV2) {\n this.model = config.model;\n this.tools = new ToolRegistry(config.tools ?? []);\n this.systemPrompt = config.systemPrompt ?? \"\";\n this.maxTurns = config.maxTurns ?? DEFAULT_MAX_TURNS;\n this.contextManager = new ContextManager({\n maxTokens: config.context?.maxTokens ?? DEFAULT_CONTEXT_WINDOW,\n maxOutputTokens: config.context?.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS,\n compactThreshold: config.context?.compactThreshold ?? DEFAULT_COMPACT_THRESHOLD,\n });\n this.permissionEngine = new PermissionEngine(config.permissions);\n this.permissionConfig = config.permissions;\n this.cwd = config.cwd ?? process.cwd();\n this.maxRetries = config.maxRetries ?? 5;\n\n const v2 = config as AgentConfigV2;\n this.hooks = v2.hooks;\n this.memory = v2.memory;\n this.threadId = v2.threadId;\n this.costTracker = v2.costTracker ?? new CostTrackerImpl();\n this._title = v2.title;\n this._disableTitle = v2.disableTitle ?? false;\n }\n\n addTool(tool: Tool): void {\n this.tools.add(tool);\n }\n\n addMessage(message: Message): void {\n this.messages.push(message);\n }\n\n reset(): void {\n this.messages = [];\n this._titleFetched = false;\n }\n\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n getCostTracker(): CostTracker {\n return this.costTracker;\n }\n\n get title(): string | undefined {\n return this._title;\n }\n\n private async loadMemory(): Promise<void> {\n if (this._loaded || !this.memory || !this.threadId) return;\n const stored = await this.memory.getThread(this.threadId);\n if (stored.length > 0) {\n this.messages = stored;\n }\n this._loaded = true;\n }\n\n private async saveMemory(): Promise<void> {\n if (!this.memory || !this.threadId) return;\n await this.memory.saveThread(this.threadId, this.messages);\n }\n\n fork(newThreadId?: string): Agent {\n const forked = new Agent({\n model: this.model,\n tools: this.tools.getAll(),\n systemPrompt: this.systemPrompt,\n maxTurns: this.maxTurns,\n cwd: this.cwd,\n maxRetries: this.maxRetries,\n permissions: this.permissionConfig,\n hooks: this.hooks,\n memory: this.memory,\n threadId: newThreadId,\n costTracker: this.costTracker,\n title: this._title,\n context: {\n maxTokens: this.contextManager.maxTokens,\n maxOutputTokens: this.contextManager.maxOutputTokens,\n compactThreshold: this.contextManager.compactThreshold,\n },\n });\n forked.messages = [...this.messages];\n return forked;\n }\n\n async *run(prompt: string, options?: { abortSignal?: AbortSignal }): AsyncGenerator<LoopEvent> {\n await this.loadMemory();\n const loopMessages = [...this.messages, { role: \"user\" as const, content: prompt }];\n\n if (!this._titleFetched && this.messages.length === 0 && !this._disableTitle) {\n this._titleFetched = true;\n this.generateTitle(prompt).catch(() => {});\n }\n\n const loop = agentLoop({\n model: this.model,\n tools: this.tools,\n messages: loopMessages,\n systemPrompt: this.systemPrompt || undefined,\n maxTurns: this.maxTurns,\n contextManager: this.contextManager,\n permissionEngine: this.permissionEngine,\n cwd: this.cwd,\n abortSignal: options?.abortSignal,\n maxRetries: this.maxRetries,\n hooks: this.hooks,\n costTracker: this.costTracker,\n });\n\n const finalMessages: Message[] = [];\n for await (const event of loop) {\n yield event;\n if (event.type === \"done\") {\n finalMessages.length = 0;\n finalMessages.push(...event.messages);\n }\n }\n\n if (finalMessages.length > 0) {\n this.messages = finalMessages;\n await this.saveMemory();\n }\n }\n\n async chat(prompt: string, options?: { abortSignal?: AbortSignal }): Promise<{\n text: string;\n usage: { inputTokens: number; outputTokens: number };\n messages: Message[];\n cost: number;\n }> {\n let text = \"\";\n let usage = { inputTokens: 0, outputTokens: 0 };\n\n for await (const event of this.run(prompt, options)) {\n if (event.type === \"text\") {\n text += event.text;\n }\n if (event.type === \"done\") {\n usage = {\n inputTokens: event.usage.inputTokens,\n outputTokens: event.usage.outputTokens,\n };\n }\n }\n\n const total = this.costTracker.getTotal();\n return { text, usage, messages: this.getMessages(), cost: total.cost };\n }\n\n async structured<T>(\n prompt: string,\n schema: { safeParse: (data: unknown) => { success: boolean; data?: T; error?: { issues: Array<{ path: (string | number)[]; message: string }> } } },\n options?: { abortSignal?: AbortSignal; maxRetries?: number },\n ): Promise<T> {\n const maxRetries = options?.maxRetries ?? 3;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n const currentPrompt = attempt === 0\n ? prompt\n : `${prompt}\\n\\nPrevious attempt returned invalid JSON. Please fix and respond with valid JSON only.`;\n\n const agent = new Agent({\n model: this.model,\n tools: [],\n systemPrompt: \"You must respond with valid JSON matching the requested schema.\",\n maxTurns: 1,\n cwd: this.cwd,\n permissions: this.permissionConfig,\n context: {\n maxTokens: this.contextManager.maxTokens,\n maxOutputTokens: this.contextManager.maxOutputTokens,\n compactThreshold: this.contextManager.compactThreshold,\n },\n costTracker: this.costTracker,\n disableTitle: true,\n } as AgentConfigV2);\n\n const result = await agent.chat(currentPrompt, options);\n const jsonMatch = result.text.match(/```(?:json)?\\s*([\\s\\S]*?)```/) ?? [null, result.text];\n const jsonStr = jsonMatch[1] ?? result.text;\n\n try {\n const parsed = JSON.parse(jsonStr);\n const validated = schema.safeParse(parsed);\n if (validated.success && validated.data !== undefined) {\n return validated.data as T;\n }\n } catch {\n continue;\n }\n }\n\n throw new Error(`Failed to get valid structured output after ${maxRetries} attempts`);\n }\n\n async structuredViaTool<T>(\n prompt: string,\n schema: { safeParse: (data: unknown) => { success: boolean; data?: T; error?: { issues: Array<{ path: (string | number)[]; message: string }> } } },\n options?: { abortSignal?: AbortSignal; maxRetries?: number },\n ): Promise<T> {\n const { z } = await import(\"zod\");\n const maxRetries = options?.maxRetries ?? 3;\n\n let captured: T | undefined;\n\n const structTool = defineTool({\n name: \"structured_output\",\n description: \"Return your final response in the required structured format.\",\n inputSchema: z.object({\n response: z.unknown().describe(\"The structured JSON response\"),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async (input: Record<string, unknown>) => {\n captured = input.response as T;\n return \"Structured output captured.\";\n },\n });\n\n const agent = new Agent({\n model: this.model,\n tools: [structTool],\n systemPrompt: [\n this.systemPrompt,\n \"You MUST call the structured_output tool with your response. Do not return plain text.\",\n ].filter(Boolean).join(\"\\n\\n\"),\n maxTurns: 1,\n cwd: this.cwd,\n permissions: this.permissionConfig,\n context: {\n maxTokens: this.contextManager.maxTokens,\n maxOutputTokens: this.contextManager.maxOutputTokens,\n compactThreshold: this.contextManager.compactThreshold,\n },\n costTracker: this.costTracker,\n disableTitle: true,\n } as AgentConfigV2);\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n captured = undefined;\n const currentPrompt = attempt === 0\n ? prompt\n : `${prompt}\\n\\nPrevious attempt failed validation. Fix your structured output and call the structured_output tool again.`;\n\n await agent.chat(currentPrompt, options);\n\n if (captured !== undefined) {\n const validated = schema.safeParse(captured);\n if (validated.success && validated.data !== undefined) {\n return validated.data as T;\n }\n }\n }\n\n throw new Error(`Failed to get valid structured output via tool after ${maxRetries} attempts`);\n }\n\n async asTool(options?: { allowSubAgents?: boolean; name?: string; description?: string }): Promise<Tool> {\n const { z } = await import(\"zod\");\n const allowSubAgents = options?.allowSubAgents ?? false;\n return defineTool({\n name: options?.name ?? \"delegate_agent\",\n description: options?.description ?? `Delegate a task to a sub-agent with system prompt: ${this.systemPrompt?.slice(0, 100) ?? \"none\"}`,\n inputSchema: z.object({\n prompt: z.string().describe(\"The task to delegate\"),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async (input: Record<string, unknown>) => {\n const subAgent = this.fork();\n if (!allowSubAgents) {\n const forbiddenTools = [\"delegate_agent\", \"task\", \"todowrite\"];\n const allowed = this.tools.getAll().filter((t) => !forbiddenTools.includes(t.name));\n for (const tool of allowed) {\n subAgent.addTool(tool);\n }\n }\n const result = await subAgent.chat(input.prompt as string);\n return result.text;\n },\n });\n }\n\n private async generateTitle(prompt: string): Promise<void> {\n try {\n const firstLine = prompt.split(\"\\n\")[0].slice(0, 200);\n const titleAgent = new Agent({\n model: this.model,\n tools: [],\n systemPrompt: \"Generate a short, descriptive title (max 10 words) for a conversation that starts with this message. Return ONLY the title, nothing else.\",\n maxTurns: 1,\n cwd: this.cwd,\n costTracker: this.costTracker,\n disableTitle: true,\n } as AgentConfigV2);\n const result = await titleAgent.chat(firstLine);\n const title = result.text.trim().replace(/^[\"']|[\"']$/g, \"\").slice(0, 80);\n if (title.length > 0) {\n this._title = title;\n }\n } catch {\n this._title = prompt.slice(0, 50);\n }\n }\n}\n","import { exec } from 'node:child_process';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\n\nconst MAX_OUTPUT = 50 * 1024;\nconst TRUNCATE_HALF = 25 * 1024;\n\nfunction truncateOutput(output: string): string {\n if (output.length <= MAX_OUTPUT) return output;\n const notice = `\\n\\n... [output truncated: showing first ${TRUNCATE_HALF} and last ${TRUNCATE_HALF} of ${output.length} characters] ...\\n\\n`;\n return output.slice(0, TRUNCATE_HALF) + notice + output.slice(-TRUNCATE_HALF);\n}\n\nexport const BashTool = defineTool({\n name: 'bash',\n description:\n 'Execute a shell command. Returns stdout and stderr. Use for running build commands, git operations, package managers, and other CLI tools.',\n inputSchema: z.object({\n command: z.string().describe('The shell command to execute'),\n timeout: z.number().optional().describe('Timeout in milliseconds (default 120000)'),\n workdir: z.string().optional().describe('Working directory for the command'),\n }),\n isReadOnly: false,\n isConcurrencySafe: false,\n execute: async ({ command, timeout = 120000, workdir }, context) => {\n return new Promise<string>((resolve) => {\n let settled = false;\n const done = (result: string) => {\n if (settled) return;\n settled = true;\n resolve(result);\n };\n\n if (context.abortSignal?.aborted) {\n done('Command aborted before execution');\n return;\n }\n\n const child = exec(\n command,\n {\n cwd: workdir ?? context.cwd,\n timeout,\n maxBuffer: 10 * 1024 * 1024,\n killSignal: 'SIGKILL',\n },\n (error, stdout, stderr) => {\n let output = '';\n if (stdout) output += `STDOUT:\\n${stdout}\\n\\n`;\n if (stderr) output += `STDERR:\\n${stderr}\\n\\n`;\n output += `Exit code: ${error?.code ?? 0}`;\n if (error && error.killed) {\n output = `Command timed out after ${timeout}ms\\n\\n${output}`;\n }\n done(truncateOutput(output));\n },\n );\n\n child.on('error', (err) => {\n done(`Failed to execute command: ${err.message}`);\n });\n\n if (context.abortSignal) {\n context.abortSignal.addEventListener(\n 'abort',\n () => {\n child.kill('SIGKILL');\n done('Command aborted');\n },\n { once: true },\n );\n }\n });\n },\n});\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\n\nconst MAX_LINE_LENGTH = 2000;\n\nexport const FileReadTool = defineTool({\n name: 'file_read',\n description:\n 'Read the contents of a file. Returns the file content with line numbers. Use GlobTool to find files first.',\n inputSchema: z.object({\n path: z.string().describe('Absolute or relative path to the file'),\n offset: z.number().optional().describe('Line number to start reading from (1-indexed)'),\n limit: z.number().optional().describe('Maximum number of lines to read'),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async ({ path: filePath, offset, limit }, context) => {\n try {\n const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(context.cwd, filePath);\n\n const content = await fs.readFile(resolved, 'utf-8');\n const lines = content.split('\\n');\n\n const startLine = offset ? Math.max(1, offset) : 1;\n const startIndex = startLine - 1;\n const endIndex = limit != null ? startIndex + limit : lines.length;\n const selected = lines.slice(startIndex, endIndex);\n\n const formatted = selected\n .map((line, i) => {\n const lineNum = startLine + i;\n const truncated = line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) + '...' : line;\n return `${lineNum}: ${truncated}`;\n })\n .join('\\n');\n\n return formatted;\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return `Error: File not found: ${filePath}`;\n }\n if ((err as NodeJS.ErrnoException).code === 'EISDIR') {\n return `Error: Path is a directory: ${filePath}`;\n }\n return `Error reading file: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n});\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\n\nexport const FileWriteTool = defineTool({\n name: 'file_write',\n description:\n \"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Parent directories are created automatically.\",\n inputSchema: z.object({\n path: z.string().describe('Path to the file'),\n content: z.string().describe('Content to write'),\n }),\n isReadOnly: false,\n isConcurrencySafe: false,\n execute: async ({ path: filePath, content }, context) => {\n try {\n const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(context.cwd, filePath);\n const dir = path.dirname(resolved);\n\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(resolved, content, 'utf-8');\n\n return `Wrote ${content.length} characters to ${filePath}`;\n } catch (err: unknown) {\n return `Error writing file: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n});\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\nimport { fuzzyReplace } from './fuzzy-edit.js';\n\nexport const FileEditTool = defineTool({\n name: 'file_edit',\n description:\n 'Edit an existing file by replacing a string match with new content. Uses 9-strategy fuzzy matching (exact, line-trimmed, block-anchor with Levenshtein, whitespace-normalized, indentation-flexible, escape-normalized, trimmed-boundary, context-aware, multi-occurrence) so the oldString does not need to be a perfect character-for-character match. For multi-line edits, include enough surrounding context to ensure uniqueness.',\n inputSchema: z.object({\n path: z.string().describe('Path to the file'),\n oldString: z.string().describe('The string to find and replace (fuzzy-matched)'),\n newString: z.string().describe('The replacement string'),\n replaceAll: z.boolean().optional().describe('Replace all occurrences instead of just the first'),\n }),\n isReadOnly: false,\n isConcurrencySafe: false,\n execute: async ({ path: filePath, oldString, newString, replaceAll = false }, context) => {\n try {\n const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(context.cwd, filePath);\n\n const content = await fs.readFile(resolved, 'utf-8');\n\n let newContent: string;\n let count = 0;\n\n if (replaceAll) {\n const occurrences = content.split(oldString).length - 1;\n if (occurrences === 0) {\n try {\n newContent = fuzzyReplace(content, oldString, newString, true);\n count = 1;\n } catch {\n return `Error: oldString not found in ${filePath} (tried 9 fuzzy strategies)`;\n }\n } else {\n newContent = content.split(oldString).join(newString);\n count = occurrences;\n }\n } else {\n try {\n newContent = fuzzyReplace(content, oldString, newString, false);\n count = 1;\n } catch (err) {\n const kind = (err as { kind?: string }).kind;\n if (kind === \"ambiguous\") {\n return `Error: Multiple matches for oldString in ${filePath}. Provide more surrounding context or set replaceAll to true.`;\n }\n return `Error: oldString not found in ${filePath} (tried 9 fuzzy strategies)`;\n }\n }\n\n await fs.writeFile(resolved, newContent, 'utf-8');\n\n return `Replaced ${count} occurrence(s) in ${filePath}`;\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return `Error: File not found: ${filePath}`;\n }\n return `Error editing file: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n});\n","import type { ToolUseBlock } from \"../types.js\";\n\nexport type ReplacerFn = (content: string, find: string) => Generator<string, void, unknown>;\n\nexport class FuzzyEditError extends Error {\n constructor(public readonly kind: \"not_found\" | \"ambiguous\", message: string) {\n super(message);\n this.name = \"FuzzyEditError\";\n }\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (m === 0) return n;\n if (n === 0) return m;\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);\n }\n }\n return dp[m][n];\n}\n\nfunction similarity(a: string, b: string): number {\n if (a.length > 1000 || b.length > 1000) return a === b ? 1 : 0;\n const maxLen = Math.max(a.length, b.length);\n if (maxLen === 0) return 1;\n return 1 - levenshtein(a, b) / maxLen;\n}\n\nfunction* simpleReplacer(content: string, find: string): Generator<string, void, unknown> {\n if (content.includes(find)) yield find;\n}\n\nfunction* lineTrimmedReplacer(content: string, find: string): Generator<string, void, unknown> {\n const lines = find.split(\"\\n\").map(l => l.trim());\n const contentLines = content.split(\"\\n\");\n for (let i = 0; i <= contentLines.length - lines.length; i++) {\n if (contentLines.slice(i, i + lines.length).every((cl, idx) => cl.trim() === lines[idx])) {\n yield contentLines.slice(i, i + lines.length).join(\"\\n\");\n }\n }\n}\n\nfunction* blockAnchorReplacer(content: string, find: string): Generator<string, void, unknown> {\n const findLines = find.split(\"\\n\");\n const contentLines = content.split(\"\\n\");\n\n if (findLines.length < 2) return;\n\n const firstLine = findLines[0];\n const lastLine = findLines[findLines.length - 1];\n const middleLines = findLines.slice(1, -1);\n\n for (let i = 0; i <= contentLines.length - findLines.length; i++) {\n if (contentLines[i] !== firstLine) continue;\n const endIdx = i + findLines.length - 1;\n if (contentLines[endIdx] !== lastLine) continue;\n\n const candidates: { idx: number; score: number }[] = [];\n\n for (let j = i + 1; j < endIdx; j++) {\n candidates.push({ idx: j, score: 0 });\n }\n\n let totalScore = 0;\n for (let k = 0; k < middleLines.length; k++) {\n const contentLine = contentLines[i + 1 + k];\n const sim = similarity(middleLines[k], contentLine);\n totalScore += sim;\n if (candidates[k]) candidates[k].score = sim;\n }\n\n const avgScore = totalScore / middleLines.length;\n const threshold = candidates.length > 1 ? 0.3 : 0.0;\n\n if (avgScore >= threshold) {\n yield contentLines.slice(i, i + findLines.length).join(\"\\n\");\n }\n }\n}\n\nfunction* whitespaceNormalizedReplacer(content: string, find: string): Generator<string, void, unknown> {\n const normFind = find.replace(/\\s+/g, \" \").trim();\n if (!normFind) return;\n const normContent = content.replace(/\\s+/g, \" \").trim();\n const idx = normContent.indexOf(normFind);\n if (idx === -1) return;\n\n const firstWord = normFind.split(\" \")[0];\n const lastWord = normFind.split(\" \").filter(Boolean).pop()!;\n const firstIdx = content.indexOf(firstWord);\n const lastIdx = content.lastIndexOf(lastWord);\n if (firstIdx === -1 || lastIdx === -1 || lastIdx < firstIdx) return;\n\n yield content.substring(firstIdx, lastIdx + lastWord.length);\n}\n\nfunction* indentationFlexibleReplacer(content: string, find: string): Generator<string, void, unknown> {\n const lines = find.split(\"\\n\");\n const minIndent = Math.min(...lines.filter(l => l.trim().length > 0).map(l => l.match(/^(\\s*)/)?.[1].length ?? 0));\n const dedented = lines.map(l => l.substring(minIndent)).join(\"\\n\");\n if (content.includes(dedented)) yield dedented;\n}\n\nfunction* escapeNormalizedReplacer(content: string, find: string): Generator<string, void, unknown> {\n const normalized = find\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\'/g, \"'\");\n if (content.includes(normalized)) yield normalized;\n}\n\nfunction* trimmedBoundaryReplacer(content: string, find: string): Generator<string, void, unknown> {\n const trimmed = find.trim();\n if (content.includes(trimmed)) yield trimmed;\n}\n\nfunction* contextAwareReplacer(content: string, find: string): Generator<string, void, unknown> {\n const findLines = find.split(\"\\n\");\n if (findLines.length < 3) return;\n\n const firstLine = findLines[0].trim();\n const lastLine = findLines[findLines.length - 1].trim();\n const contentLines = content.split(\"\\n\");\n\n for (let i = 0; i <= contentLines.length - 3; i++) {\n if (contentLines[i].trim() !== firstLine) continue;\n\n let bestEndIdx = -1;\n let bestScore = 0;\n\n for (let j = i + 2; j < contentLines.length; j++) {\n if (contentLines[j].trim() === lastLine) {\n const middleCount = j - i - 1;\n let matchCount = 0;\n for (let k = 1; k <= middleCount; k++) {\n const fIdx = Math.floor((k / (middleCount + 1)) * (findLines.length - 2));\n if (fIdx >= 0 && fIdx < findLines.length - 2) {\n if (similarity(contentLines[i + k].trim(), findLines[fIdx + 1].trim()) > 0.5) {\n matchCount++;\n }\n }\n }\n const score = matchCount / middleCount;\n if (score > bestScore) {\n bestScore = score;\n bestEndIdx = j;\n }\n }\n }\n\n if (bestEndIdx !== -1 && bestScore > 0.5) {\n yield contentLines.slice(i, bestEndIdx + 1).join(\"\\n\");\n }\n }\n}\n\nconst REPLACERS: ReplacerFn[] = [\n simpleReplacer,\n lineTrimmedReplacer,\n blockAnchorReplacer,\n whitespaceNormalizedReplacer,\n indentationFlexibleReplacer,\n escapeNormalizedReplacer,\n trimmedBoundaryReplacer,\n contextAwareReplacer,\n];\n\nexport function fuzzyReplace(\n content: string,\n oldString: string,\n newString: string,\n replaceAll = false,\n): string {\n for (const replacer of REPLACERS) {\n for (const search of replacer(content, oldString)) {\n const idx = content.indexOf(search);\n if (idx === -1) continue;\n\n if (replaceAll) {\n return content.split(search).join(newString);\n }\n\n const firstIdx = content.indexOf(search);\n const lastIdx = content.lastIndexOf(search);\n if (firstIdx !== lastIdx) continue;\n\n return content.substring(0, firstIdx) + newString + content.substring(firstIdx + search.length);\n }\n }\n\n throw new FuzzyEditError(\"not_found\", `Could not find match for replacement (after 8 fuzzy strategies)`);\n}\n\nexport function fuzzyContains(content: string, find: string): boolean {\n try {\n fuzzyReplace(content, find, \"PLACEHOLDER_CHECK\");\n return true;\n } catch {\n return false;\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\nimport { globToRegExp } from '../utils.js';\n\nconst MAX_RESULTS = 200;\n\nasync function walkDir(dir: string): Promise<string[]> {\n const { walkDir: walk } = await import('../utils.js');\n const entries = await walk(dir);\n return entries.map((e) => e.path);\n}\n\nfunction matchInclude(filePath: string, includePattern?: string): boolean {\n if (!includePattern) return true;\n const base = path.basename(filePath);\n const re = globToRegExp(includePattern);\n return re.test(base);\n}\n\nexport const GlobTool = defineTool({\n name: 'glob',\n description:\n 'Find files matching a glob pattern. Returns matching file paths sorted by modification time.',\n inputSchema: z.object({\n pattern: z.string().describe('Glob pattern (e.g., \"**/*.ts\", \"src/**/*.tsx\")'),\n path: z.string().optional().describe('Directory to search in (default: current directory)'),\n include: z.string().optional().describe('File extension or pattern to include (e.g., \"*.ts\")'),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async ({ pattern, path: searchPath, include }, context) => {\n try {\n const searchDir = searchPath\n ? path.isAbsolute(searchPath)\n ? searchPath\n : path.resolve(context.cwd, searchPath)\n : context.cwd;\n\n const allFiles = await walkDir(searchDir);\n const re = globToRegExp(pattern);\n\n const matched: Array<{ filePath: string; mtimeMs: number }> = [];\n\n for (const filePath of allFiles) {\n const relative = path.relative(searchDir, filePath);\n if (re.test(relative) && matchInclude(relative, include)) {\n try {\n const stat = await fs.stat(filePath);\n matched.push({ filePath: relative, mtimeMs: stat.mtimeMs });\n } catch {\n matched.push({ filePath: relative, mtimeMs: 0 });\n }\n }\n }\n\n matched.sort((a, b) => b.mtimeMs - a.mtimeMs);\n const limited = matched.slice(0, MAX_RESULTS);\n return limited.map((m) => m.filePath).join('\\n');\n } catch (err: unknown) {\n return `Error searching files: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n});\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\nimport { globToRegExp } from '../utils.js';\n\nconst MAX_MATCHES = 200;\n\nasync function walkDir(dir: string): Promise<string[]> {\n const { walkDir: walk } = await import('../utils.js');\n const entries = await walk(dir);\n return entries.map((e) => e.path);\n}\n\nexport const GrepTool = defineTool({\n name: 'grep',\n description:\n 'Search file contents using a regular expression. Returns matching file paths with line numbers.',\n inputSchema: z.object({\n pattern: z.string().describe('Regular expression to search for'),\n path: z.string().optional().describe('Directory to search in'),\n include: z.string().optional().describe('File pattern to include (e.g., \"*.ts\")'),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async ({ pattern, path: searchPath, include }, context) => {\n try {\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch {\n return `Error: Invalid regular expression: ${pattern}`;\n }\n\n const searchDir = searchPath\n ? path.isAbsolute(searchPath)\n ? searchPath\n : path.resolve(context.cwd, searchPath)\n : context.cwd;\n\n const includeRe = include ? globToRegExp(include) : null;\n const allFiles = await walkDir(searchDir);\n const matches: string[] = [];\n\n for (const filePath of allFiles) {\n if (matches.length >= MAX_MATCHES) break;\n\n if (includeRe) {\n const base = path.basename(filePath);\n if (!includeRe.test(base)) continue;\n }\n\n let content: string;\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch {\n continue;\n }\n\n const lines = content.split('\\n');\n const relative = path.relative(searchDir, filePath);\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n if (matches.length >= MAX_MATCHES) break;\n const line = lines[lineIdx];\n if (regex.test(line)) {\n matches.push(`${relative}:${lineIdx + 1}: ${line}`);\n regex.lastIndex = 0;\n } else {\n regex.lastIndex = 0;\n }\n }\n }\n\n if (matches.length === 0) {\n return 'No matches found.';\n }\n\n return matches.join('\\n');\n } catch (err: unknown) {\n return `Error searching files: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n});\n","import { z } from 'zod';\nimport { defineTool } from './tool.js';\n\nconst MAX_RESPONSE_SIZE = 100 * 1024;\n\nexport const WebFetchTool = defineTool({\n name: 'web_fetch',\n description:\n 'Fetch content from a URL. Returns the response body as text. Supports HTTP and HTTPS.',\n inputSchema: z.object({\n url: z.string().url().describe('The URL to fetch'),\n method: z.enum(['GET', 'POST', 'PUT', 'DELETE']).optional().describe('HTTP method (default: GET)'),\n headers: z.record(z.string()).optional().describe('Request headers'),\n body: z.string().optional().describe('Request body (for POST/PUT)'),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async ({ url, method = 'GET', headers, body }, context) => {\n try {\n if (context.abortSignal?.aborted) {\n return 'Request aborted before execution';\n }\n\n const timeoutSignal = AbortSignal.timeout(30_000);\n let signal: AbortSignal;\n if (context.abortSignal) {\n signal = AbortSignal.any([context.abortSignal, timeoutSignal]);\n } else {\n signal = timeoutSignal;\n }\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n signal,\n redirect: 'follow',\n };\n\n if (body && method !== 'GET') {\n fetchOptions.body = body;\n }\n\n const response = await fetch(url, fetchOptions);\n const contentType = response.headers.get('content-type') ?? 'unknown';\n const status = response.status;\n\n const text = await response.text();\n\n let result = `Status: ${status}\\nContent-Type: ${contentType}\\n\\n`;\n if (text.length > MAX_RESPONSE_SIZE) {\n const half = Math.floor(MAX_RESPONSE_SIZE / 2);\n const notice = `\\n\\n... [response truncated: showing first ${half} and last ${half} of ${text.length} characters] ...\\n\\n`;\n result += text.slice(0, half) + notice + text.slice(-half);\n } else {\n result += text;\n }\n\n return result;\n } catch (err: unknown) {\n if (err instanceof Error && err.name === 'AbortError') {\n return 'Request aborted';\n }\n return `Error fetching URL: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n});\n","import type { ModelResponse, ContentBlock, TokenUsage, ProviderConfig } from '../types.js';\nimport type { APIToolDefinition } from '../tools/tool.js';\n\nexport interface Provider {\n readonly model: string;\n chat(request: ChatRequest): Promise<ModelResponse>;\n}\n\nexport interface ChatRequest {\n messages: ChatMessage[];\n tools?: APIToolDefinition[];\n systemPrompt?: string;\n maxOutputTokens?: number;\n temperature?: number;\n abortSignal?: AbortSignal;\n}\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\" | \"tool\";\n content: string | ContentBlock[];\n tool_use_id?: string;\n is_error?: boolean;\n}\n\nexport type { APIToolDefinition } from '../tools/tool.js';\n\nexport class RetryableError extends Error {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = 'RetryableError';\n this.cause = cause;\n }\n}\n\nexport abstract class BaseProvider implements Provider {\n readonly model: string;\n readonly maxOutputTokens?: number;\n readonly temperature?: number;\n\n constructor(config: ProviderConfig) {\n this.model = config.model;\n this.maxOutputTokens = config.maxOutputTokens;\n this.temperature = config.temperature;\n }\n\n abstract chat(request: ChatRequest): Promise<ModelResponse>;\n\n protected abstract mapMessages(messages: ChatMessage[]): unknown[];\n\n protected abstract mapTools(tools?: APIToolDefinition[]): unknown[] | undefined;\n\n protected abstract mapUsage(providerUsage: unknown): TokenUsage;\n\n protected mapStopReason(reason: string): ModelResponse[\"stopReason\"] {\n switch (reason) {\n case 'end_turn':\n case 'stop':\n return 'end_turn';\n case 'tool_use':\n case 'tool_calls':\n return 'tool_use';\n case 'max_tokens':\n case 'length':\n return 'max_tokens';\n case 'stop_sequence':\n return 'stop_sequence';\n default:\n return 'end_turn';\n }\n }\n}\n","import type { ModelResponse, ContentBlock, TextBlock, ToolUseBlock, ThinkingBlock, TokenUsage, ProviderConfig } from '../types.js';\nimport type { ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nimport { BaseProvider, RetryableError } from './provider.js';\n\nexport interface AnthropicProviderConfig extends ProviderConfig {\n apiKey: string;\n baseURL?: string;\n dangerouslySkipAuth?: boolean;\n enableCaching?: boolean;\n}\n\nexport class AnthropicProvider extends BaseProvider {\n private readonly apiKey: string;\n private readonly baseURL?: string;\n private readonly dangerouslySkipAuth?: boolean;\n private readonly enableCaching: boolean;\n private client: any = null;\n\n constructor(config: AnthropicProviderConfig) {\n super(config);\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL;\n this.dangerouslySkipAuth = config.dangerouslySkipAuth;\n this.enableCaching = config.enableCaching ?? false;\n }\n\n async chat(request: ChatRequest): Promise<ModelResponse> {\n const AnthropicSDK = (await import('@anthropic-ai/sdk')).default;\n\n if (!this.client) {\n const opts: Record<string, unknown> = { apiKey: this.apiKey };\n if (this.baseURL) opts.baseURL = this.baseURL;\n if (this.dangerouslySkipAuth) opts.dangerouslySkipAuth = true;\n this.client = new AnthropicSDK(opts);\n }\n\n const messages = this.mapMessages(request.messages);\n const tools = this.mapTools(request.tools);\n const maxTokens = request.maxOutputTokens ?? this.maxOutputTokens ?? 4096;\n const temperature = request.temperature ?? this.temperature;\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: maxTokens,\n messages,\n };\n\n if (request.systemPrompt) {\n if (this.enableCaching) {\n body.system = [\n { type: \"text\", text: request.systemPrompt, cache_control: { type: \"ephemeral\" } },\n ];\n } else {\n body.system = request.systemPrompt;\n }\n }\n if (tools) body.tools = tools;\n if (temperature !== undefined) body.temperature = temperature;\n\n const reqOptions: Record<string, unknown> = {};\n if (request.abortSignal) reqOptions.signal = request.abortSignal;\n\n let response: any;\n try {\n response = await this.client.messages.create(body, reqOptions);\n } catch (err: unknown) {\n const status = (err as any)?.status;\n const code = (err as any)?.code;\n const isNetwork =\n err instanceof TypeError ||\n (typeof code === 'string' &&\n ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ETIMEDOUT'].includes(code));\n\n if (status === 429 || status === 529 || isNetwork) {\n throw new RetryableError(\n err instanceof Error ? err.message : String(err),\n err instanceof Error ? err : undefined,\n );\n }\n throw new Error(\n `Anthropic API error: ${err instanceof Error ? err.message : String(err)}`,\n err instanceof Error ? { cause: err } : undefined,\n );\n }\n\n const content: ContentBlock[] = [];\n for (const block of response.content) {\n if (block.type === 'text') {\n content.push({ type: 'text', text: block.text } as TextBlock);\n } else if (block.type === 'tool_use') {\n content.push({ type: 'tool_use', id: block.id, name: block.name, input: block.input } as ToolUseBlock);\n } else if (block.type === 'thinking') {\n content.push({ type: 'thinking', thinking: block.thinking } as ThinkingBlock);\n }\n }\n\n return {\n content,\n usage: this.mapUsage(response.usage),\n stopReason: this.mapStopReason(response.stop_reason),\n };\n }\n\n protected mapMessages(messages: ChatMessage[]): unknown[] {\n return messages.map((msg) => {\n if (msg.role === 'tool') {\n const textContent =\n typeof msg.content === 'string'\n ? msg.content\n : msg.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('\\n');\n\n return {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: msg.tool_use_id ?? '',\n content: textContent,\n ...(msg.is_error ? { is_error: true } : {}),\n },\n ],\n };\n }\n\n if (msg.role === 'assistant') {\n const content =\n typeof msg.content === 'string'\n ? [{ type: 'text', text: msg.content }]\n : msg.content.map((block) => this.mapOutgoingBlock(block));\n return { role: 'assistant', content };\n }\n\n if (typeof msg.content === 'string') {\n return { role: 'user', content: msg.content };\n }\n\n return {\n role: 'user',\n content: msg.content.map((block) => this.mapOutgoingBlock(block)),\n };\n });\n }\n\n protected mapTools(tools?: APIToolDefinition[]): unknown[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.input_schema,\n type: 'tool',\n }));\n }\n\n protected mapUsage(providerUsage: unknown): TokenUsage {\n const u = providerUsage as {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n return {\n inputTokens: u.input_tokens,\n outputTokens: u.output_tokens,\n cacheReadTokens: u.cache_read_input_tokens,\n cacheWriteTokens: u.cache_creation_input_tokens,\n };\n }\n\n private mapOutgoingBlock(block: ContentBlock): Record<string, unknown> {\n switch (block.type) {\n case 'text':\n return { type: 'text', text: block.text };\n case 'tool_use':\n return { type: 'tool_use', id: block.id, name: block.name, input: block.input };\n case 'thinking':\n return { type: 'thinking', thinking: block.thinking };\n default:\n return { type: 'text', text: '' };\n }\n }\n}\n","import type { ModelResponse, ContentBlock, TextBlock, ToolUseBlock, TokenUsage, ProviderConfig } from '../types.js';\nimport type { ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nimport { BaseProvider, RetryableError } from './provider.js';\n\nexport interface OpenAIProviderConfig extends ProviderConfig {\n apiKey: string;\n baseURL?: string;\n organization?: string;\n}\n\nexport class OpenAIProvider extends BaseProvider {\n private readonly apiKey: string;\n private readonly baseURL?: string;\n private readonly organization?: string;\n private client: any = null;\n\n constructor(config: OpenAIProviderConfig) {\n super(config);\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL;\n this.organization = config.organization;\n }\n\n async chat(request: ChatRequest): Promise<ModelResponse> {\n const OpenAI = (await import('openai')).default;\n\n if (!this.client) {\n const opts: Record<string, unknown> = { apiKey: this.apiKey };\n if (this.baseURL) opts.baseURL = this.baseURL;\n if (this.organization) opts.organization = this.organization;\n this.client = new OpenAI(opts);\n }\n\n const mappedMessages = this.mapMessages(request.messages);\n const messages: unknown[] = [];\n if (request.systemPrompt) {\n messages.push({ role: 'system', content: request.systemPrompt });\n }\n messages.push(...mappedMessages);\n\n const tools = this.mapTools(request.tools);\n const maxTokens = request.maxOutputTokens ?? this.maxOutputTokens;\n const temperature = request.temperature ?? this.temperature;\n\n const body: Record<string, unknown> = {\n model: this.model,\n messages,\n stream: false,\n };\n\n if (tools) body.tools = tools;\n if (maxTokens !== undefined) body.max_tokens = maxTokens;\n if (temperature !== undefined) body.temperature = temperature;\n\n const reqOptions: Record<string, unknown> = {};\n if (request.abortSignal) reqOptions.signal = request.abortSignal;\n\n let response: any;\n try {\n response = await this.client.chat.completions.create(body, reqOptions);\n } catch (err: unknown) {\n const status = (err as any)?.status;\n const code = (err as any)?.code;\n const isNetwork =\n err instanceof TypeError ||\n (typeof code === 'string' &&\n ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ETIMEDOUT'].includes(code));\n\n if (status === 429 || isNetwork) {\n throw new RetryableError(\n err instanceof Error ? err.message : String(err),\n err instanceof Error ? err : undefined,\n );\n }\n throw new Error(\n `OpenAI API error: ${err instanceof Error ? err.message : String(err)}`,\n err instanceof Error ? { cause: err } : undefined,\n );\n }\n\n const choice = response.choices[0];\n const content: ContentBlock[] = [];\n\n if (choice.message.content) {\n content.push({ type: 'text', text: choice.message.content } as TextBlock);\n }\n\n if (choice.message.tool_calls) {\n for (const tc of choice.message.tool_calls) {\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {}\n content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.function.name,\n input,\n } as ToolUseBlock);\n }\n }\n\n return {\n content,\n usage: this.mapUsage(response.usage),\n stopReason: this.mapStopReason(choice.finish_reason),\n };\n }\n\n protected mapMessages(messages: ChatMessage[]): unknown[] {\n return messages.map((msg) => {\n if (msg.role === 'tool') {\n return {\n role: 'tool',\n tool_call_id: msg.tool_use_id ?? '',\n content:\n typeof msg.content === 'string'\n ? msg.content\n : msg.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('\\n'),\n };\n }\n\n if (msg.role === 'assistant') {\n if (typeof msg.content === 'string') {\n return { role: 'assistant', content: msg.content };\n }\n\n const textParts = msg.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('');\n const toolCalls = msg.content\n .filter((b): b is ToolUseBlock => b.type === 'tool_use')\n .map((b) => ({\n id: b.id,\n type: 'function' as const,\n function: { name: b.name, arguments: JSON.stringify(b.input) },\n }));\n\n return {\n role: 'assistant',\n content: textParts || null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n };\n }\n\n return {\n role: 'user',\n content:\n typeof msg.content === 'string'\n ? msg.content\n : msg.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('\\n'),\n };\n });\n }\n\n protected mapTools(tools?: APIToolDefinition[]): unknown[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.input_schema,\n },\n }));\n }\n\n protected mapUsage(providerUsage: unknown): TokenUsage {\n const u = providerUsage as {\n prompt_tokens: number;\n completion_tokens: number;\n prompt_tokens_details?: { cached_tokens?: number };\n };\n return {\n inputTokens: u.prompt_tokens,\n outputTokens: u.completion_tokens,\n cacheReadTokens: u.prompt_tokens_details?.cached_tokens,\n };\n }\n}\n","import type { Provider, ChatRequest } from \"./provider.js\";\nimport { RetryableError } from \"./provider.js\";\nimport type { ModelResponse, ContentBlock } from \"../types.js\";\nimport type { APIToolDefinition } from \"../tools/tool.js\";\n\nexport interface OllamaProviderConfig {\n model: string;\n baseURL?: string;\n}\n\nexport class OllamaProvider implements Provider {\n readonly model: string;\n private readonly baseURL: string;\n\n constructor(config: OllamaProviderConfig) {\n this.model = config.model;\n this.baseURL = config.baseURL ?? \"http://localhost:11434/v1\";\n }\n\n async chat(request: ChatRequest): Promise<ModelResponse> {\n const messages: any[] = [];\n\n if (request.systemPrompt) {\n messages.push({ role: \"system\", content: request.systemPrompt });\n }\n\n for (const m of request.messages) {\n if (m.role === \"tool\") {\n messages.push({\n role: \"tool\" as const,\n tool_call_id: m.tool_use_id,\n content: m.content,\n });\n continue;\n }\n if (m.role === \"assistant\" && Array.isArray(m.content)) {\n const textParts = (m.content as ContentBlock[]).filter(b => b.type === \"text\");\n const toolParts = (m.content as ContentBlock[]).filter(b => b.type === \"tool_use\");\n\n const msg: any = {};\n if (textParts.length > 0) {\n msg.content = textParts.map(p => (p as { text: string }).text).join(\"\");\n }\n if (toolParts.length > 0) {\n msg.tool_calls = toolParts.map(b => {\n const tb = b as { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> };\n return {\n id: tb.id,\n type: \"function\",\n function: { name: tb.name, arguments: JSON.stringify(tb.input) },\n };\n });\n }\n msg.role = \"assistant\";\n messages.push(msg);\n continue;\n }\n messages.push({ role: m.role, content: m.content });\n }\n\n const body: any = {\n model: this.model,\n messages,\n stream: false,\n };\n\n if (request.maxOutputTokens) {\n body.max_tokens = request.maxOutputTokens;\n }\n\n if (request.tools?.length) {\n body.tools = request.tools.map(t => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n },\n }));\n }\n\n let response;\n try {\n response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: request.abortSignal,\n });\n } catch (err) {\n if (err instanceof RetryableError) throw err;\n throw new RetryableError(\n `Ollama connection failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n if (!response.ok) {\n const text = await response.text();\n if (response.status === 429 || response.status === 503 || response.status === 529) {\n throw new RetryableError(`Ollama API error ${response.status}: ${text.slice(0, 200)}`);\n }\n throw new Error(`Ollama API error ${response.status}: ${text.slice(0, 200)}`);\n }\n\n const data = await response.json();\n const choice = data.choices?.[0];\n if (!choice) {\n throw new Error(\"Ollama returned no choices\");\n }\n\n const content: any[] = [];\n let stopReason: ModelResponse[\"stopReason\"] = \"end_turn\";\n\n if (choice.message?.content) {\n let text = choice.message.content;\n text = text.replace(/<think[^>]*>[\\s\\S]*?<\\/think>/gi, \"\").trim();\n text = text.replace(/<thinking>[\\s\\S]*?<\\/thinking>/gi, \"\").trim();\n text = text.replace(/\\[Thinking[^\\]]*\\]/gi, \"\").trim();\n if (text.length > 0) {\n content.push({ type: \"text\" as const, text });\n }\n }\n\n if (choice.message?.tool_calls?.length) {\n stopReason = \"tool_use\";\n for (const tc of choice.message.tool_calls) {\n let input: Record<string, unknown>;\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {\n input = {};\n }\n content.push({\n type: \"tool_use\" as const,\n id: tc.id,\n name: tc.function.name,\n input,\n });\n }\n }\n\n return {\n content,\n stopReason,\n usage: {\n inputTokens: data.usage?.prompt_tokens ?? 0,\n outputTokens: data.usage?.completion_tokens ?? 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n },\n };\n }\n}\n","import type { ModelResponse } from '../types.js';\nimport { BaseProvider, RetryableError } from './provider.js';\nimport type { Provider, ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nimport { AnthropicProvider } from './anthropic.js';\nimport type { AnthropicProviderConfig } from './anthropic.js';\nimport { OpenAIProvider } from './openai.js';\nimport type { OpenAIProviderConfig } from './openai.js';\nimport { OllamaProvider } from './ollama.js';\nimport type { OllamaProviderConfig } from './ollama.js';\n\nexport { BaseProvider, RetryableError } from './provider.js';\nexport type { Provider, ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nexport { AnthropicProvider } from './anthropic.js';\nexport type { AnthropicProviderConfig } from './anthropic.js';\nexport { OpenAIProvider } from './openai.js';\nexport type { OpenAIProviderConfig } from './openai.js';\nexport { OllamaProvider } from './ollama.js';\nexport type { OllamaProviderConfig } from './ollama.js';\n\nexport function anthropic(config: AnthropicProviderConfig): AnthropicProvider {\n return new AnthropicProvider(config);\n}\n\nexport function openai(config: OpenAIProviderConfig): OpenAIProvider {\n return new OpenAIProvider(config);\n}\n\nexport function ollama(config: OllamaProviderConfig): OllamaProvider {\n return new OllamaProvider(config);\n}\n\nexport interface CustomProviderConfig {\n provider: 'custom';\n model: string;\n chat: (request: ChatRequest) => Promise<ModelResponse>;\n}\n\nclass CustomProvider implements Provider {\n readonly model: string;\n private readonly chatFn: (request: ChatRequest) => Promise<ModelResponse>;\n\n constructor(config: CustomProviderConfig) {\n this.model = config.model;\n this.chatFn = config.chat;\n }\n\n chat(request: ChatRequest): Promise<ModelResponse> {\n return this.chatFn(request);\n }\n}\n\nexport type OllamaProviderConfigWithProvider = OllamaProviderConfig & { provider: 'ollama' };\n\nexport function createProvider(\n config:\n | (AnthropicProviderConfig & { provider: 'anthropic' })\n | (OpenAIProviderConfig & { provider: 'openai' })\n | OllamaProviderConfigWithProvider\n | CustomProviderConfig,\n): Provider {\n switch (config.provider) {\n case 'anthropic':\n return new AnthropicProvider(config);\n case 'openai':\n return new OpenAIProvider(config);\n case 'ollama':\n return new OllamaProvider(config);\n case 'custom':\n return new CustomProvider(config);\n }\n}\n","import type { TokenUsage } from \"./types.js\";\n\nexport interface StreamEvent {\n type: \"text_delta\" | \"tool_use_start\" | \"tool_use_delta\" | \"tool_result\" | \"done\" | \"error\";\n text?: string;\n id?: string;\n name?: string;\n input?: string;\n output?: string;\n usage?: TokenUsage;\n error?: Error;\n}\n\nexport function createStreamAggregator() {\n let text = \"\";\n const toolCalls: Map<string, { id: string; name: string; input: string }> = new Map();\n let usage: TokenUsage | undefined;\n let stopReason: \"end_turn\" | \"tool_use\" | \"max_tokens\" = \"end_turn\";\n\n function push(event: StreamEvent): void {\n switch (event.type) {\n case \"text_delta\":\n text += event.text ?? \"\";\n break;\n case \"tool_use_start\":\n if (event.id) {\n toolCalls.set(event.id, { id: event.id, name: event.name ?? \"\", input: event.input ?? \"\" });\n }\n stopReason = \"tool_use\";\n break;\n case \"tool_use_delta\":\n if (event.id && toolCalls.has(event.id)) {\n toolCalls.get(event.id)!.input += event.input ?? \"\";\n }\n break;\n case \"done\":\n usage = event.usage;\n break;\n case \"tool_result\":\n break;\n case \"error\":\n break;\n }\n }\n\n function getResponse(): {\n text: string;\n toolCalls: { id: string; name: string; input: string }[];\n usage?: TokenUsage;\n stopReason: string;\n } {\n return { text, toolCalls: Array.from(toolCalls.values()), usage, stopReason };\n }\n\n return { push, getResponse };\n}\n","import type { Message } from \"../types.js\";\n\nexport interface MemoryStore {\n getThread(threadId: string): Promise<Message[]>;\n saveThread(threadId: string, messages: Message[]): Promise<void>;\n appendMessage(threadId: string, message: Message): Promise<void>;\n listThreads(opts?: { limit?: number; before?: string }): Promise<Array<{ id: string; updatedAt: number; messageCount: number }>>;\n deleteThread(threadId: string): Promise<void>;\n}\n\nexport class InMemoryStore implements MemoryStore {\n private threads: Map<string, { messages: Message[]; updatedAt: number }> = new Map();\n\n async getThread(threadId: string): Promise<Message[]> {\n return this.threads.get(threadId)?.messages ?? [];\n }\n\n async saveThread(threadId: string, messages: Message[]): Promise<void> {\n this.threads.set(threadId, { messages, updatedAt: Date.now() });\n }\n\n async appendMessage(threadId: string, message: Message): Promise<void> {\n const thread = this.threads.get(threadId);\n if (thread) {\n thread.messages.push(message);\n thread.updatedAt = Date.now();\n } else {\n this.threads.set(threadId, { messages: [message], updatedAt: Date.now() });\n }\n }\n\n async listThreads(opts?: { limit?: number; before?: string }): Promise<Array<{ id: string; updatedAt: number; messageCount: number }>> {\n let entries = Array.from(this.threads.entries())\n .map(([id, data]) => ({ id, updatedAt: data.updatedAt, messageCount: data.messages.length }))\n .sort((a, b) => b.updatedAt - a.updatedAt);\n if (opts?.before) entries = entries.filter(e => e.updatedAt < parseInt(opts.before as string, 10));\n return entries.slice(0, opts?.limit ?? 100);\n }\n\n async deleteThread(threadId: string): Promise<void> {\n this.threads.delete(threadId);\n }\n}\n","import type { MemoryStore } from \"./store.js\";\nimport type { Message } from \"../types.js\";\nimport { InMemoryStore } from \"./store.js\";\n\nfunction jsonSerialize(messages: Message[]): string {\n return JSON.stringify(messages, (_, value) => {\n if (value === undefined) return \"__UNDEFINED__\";\n return value;\n });\n}\n\nfunction jsonDeserialize(str: string): Message[] {\n return JSON.parse(str, (_, value) => {\n if (value === \"__UNDEFINED__\") return undefined;\n return value;\n });\n}\n\nexport class SQLiteStore implements MemoryStore {\n private store: MemoryStore;\n\n constructor(dbPath?: string) {\n try {\n const Database = require(\"better-sqlite3\");\n const db = new Database(dbPath ?? \"./synth-memory.db\");\n db.pragma(\"journal_mode = WAL\");\n db.exec(`\n CREATE TABLE IF NOT EXISTS threads (\n id TEXT PRIMARY KEY,\n messages TEXT NOT NULL,\n updated_at INTEGER NOT NULL,\n message_count INTEGER NOT NULL DEFAULT 0\n )\n `);\n try {\n db.exec(\"ALTER TABLE threads ADD COLUMN message_count INTEGER NOT NULL DEFAULT 0\");\n } catch {\n // column already exists\n }\n this.store = {\n async getThread(threadId: string): Promise<Message[]> {\n const row = db.prepare(\"SELECT messages FROM threads WHERE id = ?\").get(threadId);\n if (!row) return [];\n return jsonDeserialize(row.messages);\n },\n async saveThread(threadId: string, messages: Message[]): Promise<void> {\n const now = Date.now();\n const json = jsonSerialize(messages);\n const msgCount = messages.length;\n const exists = db.prepare(\"SELECT 1 FROM threads WHERE id = ?\").get(threadId);\n const stmt = exists\n ? db.prepare(\"UPDATE threads SET messages = ?, updated_at = ?, message_count = ? WHERE id = ?\")\n : db.prepare(\"INSERT INTO threads (id, messages, updated_at, message_count) VALUES (?, ?, ?, ?)\");\n stmt.run(json, now, msgCount, threadId);\n },\n async appendMessage(threadId: string, message: Message): Promise<void> {\n const row = db.prepare(\"SELECT messages FROM threads WHERE id = ?\").get(threadId);\n const messages: Message[] = row ? jsonDeserialize(row.messages) : [];\n messages.push(message);\n const json = jsonSerialize(messages);\n const now = Date.now();\n db.prepare(\"INSERT INTO threads (id, messages, updated_at, message_count) VALUES (?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET messages = excluded.messages, updated_at = excluded.updated_at, message_count = excluded.message_count\")\n .run(threadId, json, now, messages.length);\n },\n async listThreads(opts?: { limit?: number; before?: string }): Promise<Array<{ id: string; updatedAt: number; messageCount: number }>> {\n const rows = db.prepare(\"SELECT id, updated_at, message_count FROM threads ORDER BY updated_at DESC\").all();\n let results = rows.map((r: any) => ({ id: r.id, updatedAt: r.updated_at, messageCount: r.message_count }));\n if (opts?.before) results = results.filter((e: { updatedAt: number }) => e.updatedAt < parseInt(opts.before!, 10));\n return results.slice(0, opts?.limit ?? 100);\n },\n async deleteThread(threadId: string): Promise<void> {\n db.prepare(\"DELETE FROM threads WHERE id = ?\").run(threadId);\n },\n };\n } catch {\n console.warn(\"[synth] better-sqlite3 not available, falling back to in-memory store. Install it with: npm install better-sqlite3\");\n this.store = new InMemoryStore();\n }\n }\n\n async getThread(threadId: string): Promise<Message[]> { return this.store.getThread(threadId); }\n async saveThread(threadId: string, messages: Message[]): Promise<void> { return this.store.saveThread(threadId, messages); }\n async appendMessage(threadId: string, message: Message): Promise<void> { return this.store.appendMessage(threadId, message); }\n async listThreads(opts?: { limit?: number; before?: string }): Promise<Array<{ id: string; updatedAt: number; messageCount: number }>> { return this.store.listThreads(opts); }\n async deleteThread(threadId: string): Promise<void> { return this.store.deleteThread(threadId); }\n}\n","import type { ChildProcess } from \"node:child_process\";\n\nexport interface MCPToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nexport interface MCPServerConfig {\n type: \"stdio\" | \"sse\";\n command?: string;\n args?: string[];\n url?: string;\n env?: Record<string, string>;\n}\n\nexport class MCPClient {\n private config: MCPServerConfig;\n private tools: MCPToolDefinition[] = [];\n private proc: ChildProcess | null = null;\n private initialized = false;\n private nextId = 1;\n private messageBuffer = \"\";\n private pendingHandlers: Map<number, (msg: unknown) => void> = new Map();\n\n constructor(config: MCPServerConfig) {\n this.config = config;\n }\n\n private send(proc: ChildProcess, method: string, params: Record<string, unknown>, id?: number): number {\n const msgId = id ?? this.nextId++;\n const msg = JSON.stringify({ jsonrpc: \"2.0\", id: msgId, method, params });\n proc.stdin!.write(msg + \"\\n\");\n return msgId;\n }\n\n private setupMessageHandler(proc: ChildProcess): void {\n proc.stdout!.on(\"data\", (data: Buffer) => {\n this.messageBuffer += data.toString();\n const lines = this.messageBuffer.split(\"\\n\");\n this.messageBuffer = lines.pop() ?? \"\";\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const msg = JSON.parse(line);\n if (msg.id !== undefined && this.pendingHandlers.has(msg.id)) {\n const handler = this.pendingHandlers.get(msg.id)!;\n this.pendingHandlers.delete(msg.id);\n handler(msg);\n } else if (msg.method === \"initialize\" && msg.id) {\n proc.stdin!.write(JSON.stringify({\n jsonrpc: \"2.0\",\n id: msg.id,\n result: { protocolVersion: \"2024-11-05\", capabilities: {}, serverInfo: { name: \"synthcode-mcp-proxy\", version: \"0.6.0\" } },\n }) + \"\\n\");\n }\n } catch {}\n }\n });\n proc.stderr!.on(\"data\", () => {});\n }\n\n async connect(): Promise<void> {\n if (this.config.type === \"stdio\") {\n const { spawn } = await import(\"node:child_process\");\n const proc = spawn(this.config.command!, this.config.args ?? [], {\n env: { ...process.env, ...this.config.env },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n proc.on(\"error\", (err) => { throw err; });\n proc.on(\"close\", () => { this.initialized = false; });\n this.proc = proc;\n this.setupMessageHandler(proc);\n await new Promise<void>((resolve) => {\n const handler = (_data: Buffer) => {\n proc.stdout!.off(\"data\", handler);\n resolve();\n };\n proc.stdout!.on(\"data\", handler);\n setTimeout(() => {\n proc.stdout!.off(\"data\", handler);\n resolve();\n }, 2000);\n });\n this.initialized = true;\n }\n if (this.config.type === \"sse\") {\n if (!this.config.url) throw new Error(\"SSE MCP server requires a url\");\n this.initialized = true;\n }\n }\n\n async listTools(): Promise<MCPToolDefinition[]> {\n if (this.config.type === \"stdio\" && this.proc) {\n const id = this.nextId++;\n const tools = await new Promise<MCPToolDefinition[]>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingHandlers.delete(id);\n reject(new Error(\"MCP listTools timeout\"));\n }, 10000);\n this.pendingHandlers.set(id, (msg: unknown) => {\n clearTimeout(timeout);\n const m = msg as Record<string, unknown>;\n if ((m.result as Record<string, unknown>)?.tools) {\n resolve(\n ((m.result as Record<string, unknown>).tools as Record<string, unknown>[]).map((t) => ({\n name: t.name as string,\n description: (t.description as string) ?? \"\",\n inputSchema: (t.inputSchema as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n })),\n );\n } else {\n resolve([]);\n }\n });\n });\n this.send(this.proc!, \"tools/list\", {}, id);\n this.tools = tools;\n return tools;\n }\n return [];\n }\n\n async callTool(\n name: string,\n input: Record<string, unknown>,\n ): Promise<string> {\n if (this.config.type === \"stdio\" && this.proc) {\n const id = this.nextId++;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingHandlers.delete(id);\n reject(new Error(\"MCP callTool timeout\"));\n }, 30000);\n this.pendingHandlers.set(id, (msg: unknown) => {\n clearTimeout(timeout);\n const m = msg as Record<string, unknown>;\n if (m.result) {\n resolve(typeof m.result === \"string\" ? m.result : JSON.stringify(m.result));\n } else if (m.error) {\n reject(\n new Error(\n ((m.error as Record<string, unknown>).message as string) ?? \"MCP tool error\",\n ),\n );\n }\n });\n this.send(this.proc!, \"tools/call\", { name, arguments: input }, id);\n });\n }\n throw new Error(\"MCP callTool not implemented for SSE type\");\n }\n\n async disconnect(): Promise<void> {\n if (this.proc) {\n this.proc.kill();\n this.proc = null;\n }\n }\n\n getTools(): MCPToolDefinition[] {\n return this.tools;\n }\n}\n","import { defineTool } from \"../tools/tool.js\";\nimport type { Tool } from \"../tools/tool.js\";\nimport type { ToolContext } from \"../types.js\";\nimport { MCPClient } from \"./client.js\";\nimport type { MCPToolDefinition, MCPServerConfig } from \"./client.js\";\n\nexport async function loadMCPTools(\n config: MCPServerConfig,\n): Promise<{ tools: Tool[]; client: MCPClient }> {\n const { z } = await import(\"zod\");\n\n const client = new MCPClient(config);\n await client.connect();\n const definitions = await client.listTools();\n\n const tools = definitions.map((def: MCPToolDefinition) =>\n defineTool({\n name: def.name,\n description: def.description,\n inputSchema: z.object({}).passthrough(),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async (input: Record<string, unknown>, _context: ToolContext) => {\n const result = await client.callTool(def.name, input);\n return result;\n },\n }),\n );\n\n return { tools, client };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\n\nexport interface InitOptions {\n projectName?: string;\n cwd?: string;\n skipInstall?: boolean;\n}\n\nconst PACKAGE_JSON = JSON.stringify(\n {\n name: \"my-agent\",\n version: \"1.0.0\",\n type: \"module\",\n scripts: {\n start: \"npx tsx src/index.ts\",\n test: \"npx vitest run\",\n typecheck: \"tsc --noEmit\",\n },\n dependencies: {\n \"@avasis-ai/synthcode\": \"^0.6.0\",\n zod: \"^3.24.0\",\n },\n devDependencies: {\n typescript: \"^5.7.0\",\n tsx: \"^4.19.0\",\n vitest: \"^2.1.0\",\n },\n },\n null,\n 2,\n);\n\nconst TSCONFIG_JSON = JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: \"./dist\",\n rootDir: \"./src\",\n declaration: true,\n },\n include: [\"src\"],\n },\n null,\n 2,\n);\n\nconst ENV_EXAMPLE = `# Pick one provider and set its key:\n# ANTHROPIC_API_KEY=your-key-here\n# OPENAI_API_KEY=your-key-here\n# For Ollama (local, zero API costs): no key needed\n`;\n\nconst INDEX_TS = `import { Agent, BashTool, FileReadTool, FileWriteTool, FileEditTool, GlobTool, GrepTool, WebFetchTool } from \"@avasis-ai/synthcode\";\nimport { defineTool } from \"@avasis-ai/synthcode/tools\";\nimport { z } from \"zod\";\n\nconst agent = new Agent({\n model: process.env.OLLAMA_MODEL\n ? await import(\"@avasis-ai/synthcode/llm\").then(m => new m.OllamaProvider({ model: process.env.OLLAMA_MODEL }))\n : process.env.OPENAI_API_KEY\n ? await import(\"@avasis-ai/synthcode/llm\").then(m => new m.OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }))\n : await import(\"@avasis-ai/synthcode/llm\").then(m => new m.AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY! })),\n tools: [\n BashTool,\n FileReadTool,\n FileWriteTool,\n FileEditTool,\n GlobTool,\n GrepTool,\n WebFetchTool,\n ],\n systemPrompt: \"You are a helpful AI coding assistant with shell and file access.\",\n});\n\nconst prompt = process.argv[2] || \"Hello! What can I help you with?\";\n\nfor await (const event of agent.run(prompt)) {\n if (event.type === \"text\") process.stdout.write(event.text);\n if (event.type === \"tool_use\") console.log(\\`\\\\n [\\${event.name}]\\`);\n if (event.type === \"tool_result\") {\n if (event.isError) console.log(\\`\\\\n [\\${event.name}] FAILED\\`);\n }\n if (event.type === \"thinking\") process.stderr.write(\\`\\\\x1b[90m\\${event.thinking}\\\\x1b[0m\\`);\n if (event.type === \"done\") console.log(\\`\\\\n\\\\nTokens: \\${event.usage.inputTokens} in, \\${event.usage.outputTokens} out\\`);\n if (event.type === \"error\") {\n console.error(\\`\\\\nError: \\${event.error.message}\\`);\n process.exit(1);\n }\n}\n`;\n\nexport async function init(opts?: InitOptions): Promise<void> {\n const name = opts?.projectName ?? \"my-agent\";\n const cwd = opts?.cwd ?? process.cwd();\n const dir = path.join(cwd, name);\n\n fs.mkdirSync(path.join(dir, \"src\", \"tools\"), { recursive: true });\n fs.mkdirSync(path.join(dir, \"tests\"), { recursive: true });\n\n fs.writeFileSync(path.join(dir, \"package.json\"), PACKAGE_JSON, \"utf-8\");\n fs.writeFileSync(path.join(dir, \"tsconfig.json\"), TSCONFIG_JSON, \"utf-8\");\n fs.writeFileSync(path.join(dir, \".env.example\"), ENV_EXAMPLE, \"utf-8\");\n fs.writeFileSync(path.join(dir, \"src\", \"index.ts\"), INDEX_TS, \"utf-8\");\n fs.writeFileSync(path.join(dir, \"tests\", \"agent.test.ts\"), `import { describe, it, expect } from \"vitest\";\\ndescribe(\"Agent\", () => { it(\"should have tools registered\", () => { expect(true).toBe(true); }); });\\n`, \"utf-8\");\n\n if (!opts?.skipInstall) {\n console.log(\"Installing dependencies...\");\n execSync(\"npm install\", { cwd: dir, stdio: \"inherit\" });\n }\n\n console.log(`\\n Created ${name}/`);\n console.log(` cd ${name} && npm start \"your prompt here\"\\n`);\n}\n"],"mappings":"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","names":["fs","path","promises","newTokens","z","truncateOutput","import_zod","path","fs","import_promises","import_node_path","import_zod","path","fs","import_promises","import_node_path","import_zod","path","fs","import_promises","import_node_path","import_zod","walkDir","path","fs","import_promises","import_node_path","import_zod","walkDir","path","fs","import_zod","z","fs","path","import_node_child_process"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/index.ts","../src/types.ts","../src/tools/orchestrator.ts","../src/hooks.ts","../src/loop.ts","../src/tools/registry.ts","../src/tools/tool.ts","../src/context/tokenizer.ts","../src/context/manager.ts","../src/permissions/engine.ts","../src/cost/tracker.ts","../src/agent.ts","../src/tools/bash.ts","../src/tools/file-read.ts","../src/tools/file-write.ts","../src/tools/file-edit.ts","../src/tools/fuzzy-edit.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/web-fetch.ts","../src/llm/provider.ts","../src/llm/anthropic.ts","../src/llm/openai.ts","../src/llm/ollama.ts","../src/llm/cluster.ts","../src/llm/index.ts","../src/stream.ts","../src/memory/store.ts","../src/memory/sqlite.ts","../src/mcp/client.ts","../src/mcp/adapter.ts","../src/cli/init.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport function globToRegExp(pattern: string): RegExp {\n const parts = pattern.split(\"/\");\n let regex = \"\";\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === \"**\") {\n regex += \"(?:[^/]*(?:\\\\/|$))*\";\n } else {\n const escaped = part\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\?/g, \"[^/]\");\n regex += escaped + \"\\\\/\";\n }\n }\n\n regex = regex.replace(/\\\\\\//g, \"/\").replace(/\\/$/, \"\");\n return new RegExp(`(^|/)${regex}(/|$)`);\n}\n\nexport interface WalkEntry {\n path: string;\n stat: fs.Stats;\n}\n\nexport async function walkDir(dir: string, options?: { maxDepth?: number; followSymlinks?: boolean }): Promise<WalkEntry[]> {\n const maxDepth = options?.maxDepth ?? Infinity;\n const followSymlinks = options?.followSymlinks ?? false;\n const results: WalkEntry[] = [];\n\n async function walk(current: string, depth: number): Promise<void> {\n if (depth > maxDepth) return;\n\n let entries: fs.Dirent[];\n try {\n entries = await fs.promises.readdir(current, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name);\n\n if (entry.name === \"node_modules\" || entry.name === \".git\") continue;\n\n try {\n let stat: fs.Stats;\n if (entry.isSymbolicLink() && !followSymlinks) continue;\n stat = await fs.promises.stat(fullPath);\n\n if (stat.isFile()) {\n results.push({ path: fullPath, stat });\n } else if (stat.isDirectory()) {\n await walk(fullPath, depth + 1);\n }\n } catch {\n continue;\n }\n }\n }\n\n await walk(dir, 0);\n return results;\n}\n","export { Agent } from \"./agent.js\";\nexport type { AgentConfigV2 } from \"./agent.js\";\nexport { agentLoop } from \"./loop.js\";\nexport type { AgentLoopConfig } from \"./loop.js\";\n\nexport {\n defineTool,\n defineToolFromClass,\n} from \"./tools/tool.js\";\nexport { ToolRegistry } from \"./tools/registry.js\";\nexport { orchestrateTools } from \"./tools/orchestrator.js\";\nexport type { Tool, ToolExecuteOptions, APIToolDefinition } from \"./tools/tool.js\";\nexport type { ToolExecutionResult } from \"./tools/orchestrator.js\";\nexport { BashTool } from \"./tools/bash.js\";\nexport { FileReadTool } from \"./tools/file-read.js\";\nexport { FileWriteTool } from \"./tools/file-write.js\";\nexport { FileEditTool } from \"./tools/file-edit.js\";\nexport { GlobTool } from \"./tools/glob.js\";\nexport { GrepTool } from \"./tools/grep.js\";\nexport { WebFetchTool } from \"./tools/web-fetch.js\";\n\nexport { ContextManager } from \"./context/manager.js\";\nexport { estimateTokens, estimateMessageTokens, estimateConversationTokens } from \"./context/tokenizer.js\";\nexport type { TokenCount } from \"./context/tokenizer.js\";\nexport type { ContextCheck } from \"./context/manager.js\";\n\nexport { PermissionEngine } from \"./permissions/engine.js\";\nexport type { PermissionResult } from \"./permissions/engine.js\";\nexport type { PermissionConfig } from \"./types.js\";\n\nexport { createProvider, BaseProvider, RetryableError } from \"./llm/index.js\";\nexport { AnthropicProvider, OpenAIProvider, OllamaProvider, ClusterProvider } from \"./llm/index.js\";\nexport { anthropic, openai, ollama, cluster } from \"./llm/index.js\";\nexport type { Provider, ChatRequest, ChatMessage, ClusterConfig, ClusterSlot } from \"./llm/index.js\";\n\nexport { HookRunner } from \"./hooks.js\";\nexport type { AgentHooks } from \"./hooks.js\";\n\nexport { createStreamAggregator } from \"./stream.js\";\nexport type { StreamEvent } from \"./stream.js\";\n\nexport { InMemoryStore } from \"./memory/index.js\";\nexport { SQLiteStore } from \"./memory/index.js\";\nexport type { MemoryStore } from \"./memory/index.js\";\n\nexport { CostTracker } from \"./cost/index.js\";\nexport { DEFAULT_PRICING } from \"./cost/index.js\";\nexport type { CostRecord, ModelPricing } from \"./cost/index.js\";\n\nexport { MCPClient, loadMCPTools } from \"./mcp/index.js\";\nexport type { MCPServerConfig, MCPToolDefinition } from \"./mcp/index.js\";\n\nexport { init } from \"./cli/index.js\";\nexport type { InitOptions } from \"./cli/init.js\";\n\nexport type {\n Message,\n UserMessage,\n AssistantMessage,\n ToolResultMessage,\n ContentBlock,\n TextBlock,\n ToolUseBlock,\n ThinkingBlock,\n LoopEvent,\n TokenUsage,\n ModelResponse,\n ToolContext,\n AgentConfig,\n ContextConfig,\n CompactionResult,\n} from \"./types.js\";\n\nexport {\n DEFAULT_CONTEXT_WINDOW,\n DEFAULT_MAX_OUTPUT_TOKENS,\n DEFAULT_COMPACT_THRESHOLD,\n DEFAULT_MAX_TURNS,\n MAX_CONCURRENT_TOOLS,\n} from \"./types.js\";\n","export type Message = UserMessage | AssistantMessage | ToolResultMessage;\n\nexport interface UserMessage {\n role: \"user\";\n content: string;\n}\n\nexport interface AssistantMessage {\n role: \"assistant\";\n content: ContentBlock[];\n}\n\nexport interface ToolResultMessage {\n role: \"tool\";\n tool_use_id: string;\n content: string;\n is_error?: boolean;\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ThinkingBlock;\n\nexport interface TextBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface ToolUseBlock {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\nexport interface ThinkingBlock {\n type: \"thinking\";\n thinking: string;\n}\n\nexport type LoopEvent =\n | { type: \"text\"; text: string }\n | { type: \"thinking\"; thinking: string }\n | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n | { type: \"tool_result\"; id: string; name: string; output: string; isError: boolean }\n | { type: \"error\"; error: Error }\n | { type: \"done\"; usage: TokenUsage; messages: Message[] };\n\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n}\n\nexport interface ModelResponse {\n content: ContentBlock[];\n usage: TokenUsage;\n stopReason: \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\";\n}\n\nexport interface ToolContext {\n cwd: string;\n env: Record<string, string>;\n abortSignal?: AbortSignal;\n}\n\nexport interface ProviderConfig {\n model: string;\n maxOutputTokens?: number;\n temperature?: number;\n}\n\nexport interface AgentConfig {\n model: import(\"./llm/provider.js\").Provider;\n tools?: import(\"./tools/tool.js\").Tool[];\n systemPrompt?: string;\n maxTurns?: number;\n context?: ContextConfig;\n permissions?: PermissionConfig;\n cwd?: string;\n maxRetries?: number;\n}\n\nexport interface ContextConfig {\n maxTokens?: number;\n compactThreshold?: number;\n maxOutputTokens?: number;\n}\n\nexport interface PermissionConfig {\n allowedTools?: string[];\n deniedTools?: string[];\n askTools?: string[];\n defaultAction?: \"allow\" | \"deny\" | \"ask\";\n}\n\nexport interface CompactionResult {\n messages: Message[];\n tokensSaved: number;\n method: \"snip\" | \"compact\" | \"none\";\n}\n\nexport const DEFAULT_CONTEXT_WINDOW = 200_000;\nexport const DEFAULT_MAX_OUTPUT_TOKENS = 16_384;\nexport const DEFAULT_COMPACT_THRESHOLD = 0.85;\nexport const DEFAULT_MAX_TURNS = 100;\nexport const MAX_CONCURRENT_TOOLS = 10;\n","import type { ToolContext, ToolUseBlock } from '../types.js';\nimport type { Tool } from './tool.js';\nimport { ToolRegistry } from './registry.js';\n\n/** Result of a single tool execution. */\nexport interface ToolExecutionResult {\n id: string;\n name: string;\n output: string;\n isError: boolean;\n durationMs: number;\n}\n\nclass Semaphore {\n private current = 0;\n private queue: (() => void)[] = [];\n\n constructor(private readonly max: number) {}\n\n acquire(): Promise<void> {\n if (this.current < this.max) {\n this.current++;\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n release(): void {\n this.current--;\n const next = this.queue.shift();\n if (next) {\n this.current++;\n next();\n }\n }\n}\n\nfunction partitionToolCalls(\n toolCalls: ToolUseBlock[],\n registry: ToolRegistry,\n): ToolUseBlock[][] {\n const batches: ToolUseBlock[][] = [];\n let currentBatch: ToolUseBlock[] = [];\n let currentBatchIsConcurrent = false;\n\n for (const call of toolCalls) {\n const tool = registry.get(call.name);\n const isConcurrent = tool ? tool.isReadOnly && tool.isConcurrencySafe : false;\n\n if (isConcurrent && currentBatchIsConcurrent) {\n currentBatch.push(call);\n } else {\n if (currentBatch.length > 0) {\n batches.push(currentBatch);\n }\n currentBatch = [call];\n currentBatchIsConcurrent = isConcurrent;\n }\n }\n\n if (currentBatch.length > 0) {\n batches.push(currentBatch);\n }\n\n return batches;\n}\n\nasync function executeToolCall(\n call: ToolUseBlock,\n registry: ToolRegistry,\n context: ToolContext,\n permissionCheck?: (name: string, input: Record<string, unknown>) => Promise<boolean>,\n abortSignal?: AbortSignal,\n): Promise<ToolExecutionResult> {\n if (abortSignal?.aborted) {\n return {\n id: call.id,\n name: call.name,\n output: 'Execution aborted',\n isError: true,\n durationMs: 0,\n };\n }\n\n const tool = registry.get(call.name);\n if (!tool) {\n return {\n id: call.id,\n name: call.name,\n output: `Unknown tool: ${call.name}`,\n isError: true,\n durationMs: 0,\n };\n }\n\n const start = performance.now();\n\n try {\n const parseResult = tool.inputSchema.safeParse(call.input);\n if (!parseResult.success) {\n return {\n id: call.id,\n name: call.name,\n output: `Invalid input for ${call.name}: ${parseResult.error.issues.map((i) => i.message).join(', ')}`,\n isError: true,\n durationMs: Math.round(performance.now() - start),\n };\n }\n\n if (permissionCheck) {\n const allowed = await permissionCheck(call.name, call.input);\n if (!allowed) {\n return {\n id: call.id,\n name: call.name,\n output: `Permission denied for tool: ${call.name}`,\n isError: true,\n durationMs: Math.round(performance.now() - start),\n };\n }\n }\n\n const output = await tool.execute(parseResult.data, context);\n\n return {\n id: call.id,\n name: call.name,\n output,\n isError: false,\n durationMs: Math.round(performance.now() - start),\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n id: call.id,\n name: call.name,\n output: `Error executing ${call.name}: ${message}`,\n isError: true,\n durationMs: Math.round(performance.now() - start),\n };\n }\n}\n\n/**\n * Orchestrate execution of multiple tool calls with partition-based concurrency.\n *\n * Read-only, concurrency-safe tools are grouped into concurrent batches (max 10 parallel).\n * Non-safe tools are executed serially in their own batches.\n * Results are returned in the original call order.\n */\nexport async function orchestrateTools(\n tools: ToolRegistry,\n toolCalls: ToolUseBlock[],\n context: ToolContext,\n permissionCheck?: (name: string, input: Record<string, unknown>) => Promise<boolean>,\n abortSignal?: AbortSignal,\n): Promise<ToolExecutionResult[]> {\n const batches = partitionToolCalls(toolCalls, tools);\n const results: ToolExecutionResult[] = [];\n\n for (const batch of batches) {\n if (abortSignal?.aborted) {\n for (const call of batch) {\n results.push({\n id: call.id,\n name: call.name,\n output: 'Execution aborted',\n isError: true,\n durationMs: 0,\n });\n }\n continue;\n }\n\n if (batch.length > 1) {\n const semaphore = new Semaphore(10);\n const promises = batch.map((call) =>\n semaphore.acquire().then(async () => {\n try {\n return await executeToolCall(call, tools, context, permissionCheck, abortSignal);\n } finally {\n semaphore.release();\n }\n }),\n );\n const settled = await Promise.allSettled(promises);\n for (let i = 0; i < settled.length; i++) {\n const s = settled[i];\n if (s.status === 'fulfilled') {\n results.push(s.value);\n } else {\n results.push({\n id: batch[i].id,\n name: batch[i].name,\n output: `Unexpected error: ${s.reason instanceof Error ? s.reason.message : String(s.reason)}`,\n isError: true,\n durationMs: 0,\n });\n }\n }\n } else {\n const result = await executeToolCall(batch[0], tools, context, permissionCheck, abortSignal);\n results.push(result);\n }\n }\n\n return results;\n}\n","import type { Message, CompactionResult } from \"./types.js\";\n\nexport interface AgentHooks {\n onTurnStart?: (turn: number, messages: Message[]) => Promise<Message[] | void>;\n onTurnEnd?: (turn: number, messages: Message[]) => Promise<void>;\n onToolUse?: (\n name: string,\n input: Record<string, unknown>,\n ) => Promise<{ allow?: boolean; input?: Record<string, unknown> } | void>;\n onToolResult?: (result: {\n id: string;\n name: string;\n output: string;\n isError: boolean;\n durationMs: number;\n }) => Promise<string | void>;\n onError?: (error: Error, turn: number) => Promise<{ retry?: boolean; message?: string } | void>;\n onCompact?: (result: CompactionResult) => Promise<void>;\n}\n\nexport class HookRunner {\n private hooks: AgentHooks;\n\n constructor(hooks?: AgentHooks) {\n this.hooks = hooks ?? {};\n }\n\n async runOnTurnStart(turn: number, messages: Message[]): Promise<Message[]> {\n if (!this.hooks.onTurnStart) return messages;\n const result = await this.hooks.onTurnStart(turn, messages);\n return Array.isArray(result) ? result : messages;\n }\n\n async runOnTurnEnd(turn: number, messages: Message[]): Promise<void> {\n await this.hooks.onTurnEnd?.(turn, messages);\n }\n\n async runOnToolUse(\n name: string,\n input: Record<string, unknown>,\n ): Promise<{ allow: boolean; input: Record<string, unknown> }> {\n if (!this.hooks.onToolUse) return { allow: true, input };\n const result = await this.hooks.onToolUse(name, input);\n return {\n allow: result?.allow ?? true,\n input: result?.input ?? input,\n };\n }\n\n async runOnToolResult(result: {\n id: string;\n name: string;\n output: string;\n isError: boolean;\n durationMs: number;\n }): Promise<string> {\n if (!this.hooks.onToolResult) return result.output;\n const modified = await this.hooks.onToolResult(result);\n return modified ?? result.output;\n }\n\n async runOnError(error: Error, turn: number): Promise<{ retry: boolean; message?: string }> {\n if (!this.hooks.onError) return { retry: false };\n const result = await this.hooks.onError(error, turn);\n return { retry: result?.retry ?? false, message: result?.message };\n }\n\n async runOnCompact(result: CompactionResult): Promise<void> {\n await this.hooks.onCompact?.(result);\n }\n}\n","import type { Message, ContentBlock, ToolUseBlock, LoopEvent, ToolContext, TokenUsage } from \"./types.js\";\nimport { DEFAULT_MAX_TURNS } from \"./types.js\";\nimport { ToolRegistry } from \"./tools/registry.js\";\nimport { orchestrateTools } from \"./tools/orchestrator.js\";\nimport { ContextManager } from \"./context/manager.js\";\nimport { PermissionEngine } from \"./permissions/engine.js\";\nimport type { Provider } from \"./llm/provider.js\";\nimport type { AgentHooks } from \"./hooks.js\";\nimport { HookRunner } from \"./hooks.js\";\nimport type { CostTracker } from \"./cost/tracker.js\";\n\nconst DEFAULT_MAX_RETRIES = 5;\nconst INITIAL_RETRY_DELAY_MS = 1000;\nconst MAX_RETRY_DELAY_MS = 30000;\nconst DOOM_LOOP_THRESHOLD = 3;\nconst PRE_OVERFLOW_BUFFER = 20_000;\nconst OUTPUT_MAX_LINES = 2000;\nconst OUTPUT_MAX_BYTES = 50_000;\n\nexport interface AgentLoopConfig {\n model: Provider;\n tools: ToolRegistry;\n messages: Message[];\n systemPrompt?: string;\n maxTurns?: number;\n contextManager: ContextManager;\n permissionEngine: PermissionEngine;\n cwd?: string;\n abortSignal?: AbortSignal;\n maxRetries?: number;\n hooks?: AgentHooks;\n costTracker?: CostTracker;\n}\n\nfunction parseRetryAfterMs(error: Error): number | null {\n const msg = error.message ?? \"\";\n const retryAfterMsMatch = msg.match(/retry-after-ms:\\s*(\\d+)/i);\n if (retryAfterMsMatch) return parseInt(retryAfterMsMatch[1], 10);\n const retryAfterMatch = msg.match(/retry-after:\\s*(\\d+)/i);\n if (retryAfterMatch) return parseInt(retryAfterMatch[1], 10) * 1000;\n return null;\n}\n\nfunction truncateOutput(output: string, toolName: string, hasSubAgent: boolean): string {\n const lines = output.split(\"\\n\");\n if (lines.length <= OUTPUT_MAX_LINES && output.length <= OUTPUT_MAX_BYTES) return output;\n\n let truncated = \"\";\n let byteCount = 0;\n for (const line of lines) {\n if (byteCount + line.length > OUTPUT_MAX_BYTES) break;\n truncated += line + \"\\n\";\n byteCount += line.length;\n if (byteCount > OUTPUT_MAX_BYTES) break;\n }\n\n const lineCount = truncated.split(\"\\n\").filter(l => l.length > 0).length;\n const suffix = hasSubAgent\n ? `\\n\\n[Output truncated: ${lineCount}/${lines.length} lines shown. Use the Task tool to have a sub-agent process the full output.]`\n : `\\n\\n[Output truncated: ${lineCount}/${lines.length} lines shown. Use Grep to search or Read with offset/limit for the full content.]`;\n\n return truncated.trimEnd() + suffix;\n}\n\nfunction detectDoomLoop(messages: Message[]): ToolUseBlock | null {\n const recentToolCalls: ToolUseBlock[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role !== \"assistant\") continue;\n if (typeof msg.content === \"string\") continue;\n for (const block of msg.content) {\n if (block.type === \"tool_use\") recentToolCalls.push(block);\n }\n if (recentToolCalls.length >= DOOM_LOOP_THRESHOLD) break;\n }\n\n if (recentToolCalls.length < DOOM_LOOP_THRESHOLD) return null;\n\n const last = recentToolCalls[0];\n return recentToolCalls.every(\n tc => tc.name === last.name && JSON.stringify(tc.input) === JSON.stringify(last.input),\n )\n ? last\n : null;\n}\n\nexport async function* agentLoop(config: AgentLoopConfig): AsyncGenerator<LoopEvent> {\n const {\n model,\n tools,\n messages,\n systemPrompt,\n maxTurns = DEFAULT_MAX_TURNS,\n contextManager,\n permissionEngine,\n cwd = process.cwd(),\n abortSignal,\n hooks,\n costTracker,\n } = config;\n\n const hookRunner = new HookRunner(hooks);\n const context: ToolContext = { cwd, env: { ...process.env } as Record<string, string> };\n let turns = 0;\n let consecutiveRetries = 0;\n const maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n let totalUsage = { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 };\n let inFlightText = \"\";\n let inFlightReasoning = \"\";\n let inFlightToolCalls: ToolUseBlock[] = [];\n\n while (turns < maxTurns) {\n if (abortSignal?.aborted) {\n yield finalizeLoop(\"Aborted\");\n return;\n }\n\n const messagesAfterHook = await hookRunner.runOnTurnStart(turns + 1, messages);\n if (messagesAfterHook !== messages) {\n messages.length = 0;\n messages.push(...messagesAfterHook);\n }\n\n const contextCheck = contextManager.check(messages);\n if (contextCheck.needsCompact) {\n const result = await contextManager.compact(messages);\n messages.length = 0;\n messages.push(...result.messages);\n if (result.tokensSaved > 0) {\n const thinking = `Context ${result.method}: saved ~${result.tokensSaved} tokens (${contextCheck.totalTokens} → ${contextCheck.totalTokens - result.tokensSaved})`;\n yield { type: \"thinking\", thinking };\n await hookRunner.runOnCompact(result);\n }\n const pruned = contextManager.pruneToolOutputs(messages);\n if (pruned.length !== messages.length) {\n messages.length = 0;\n messages.push(...pruned);\n yield { type: \"thinking\", thinking: \"Pruned large tool outputs to free additional context\" };\n }\n }\n\n const estimatedTotal = totalUsage.inputTokens + totalUsage.outputTokens\n + (totalUsage.cacheReadTokens ?? 0) + (totalUsage.cacheWriteTokens ?? 0);\n const maxContext = contextManager.maxTokens;\n const maxOutput = contextManager.maxOutputTokens;\n if (maxContext > 0 && estimatedTotal + maxOutput + PRE_OVERFLOW_BUFFER >= maxContext) {\n yield { type: \"thinking\", thinking: \"Approaching context limit, compacting preemptively...\" };\n const result = await contextManager.compact(messages);\n messages.length = 0;\n messages.push(...result.messages);\n if (result.tokensSaved > 0) {\n yield { type: \"thinking\", thinking: `Pre-overflow compact: freed ~${result.tokensSaved} tokens` };\n }\n }\n\n const available = contextManager.getAvailableTokens(messages);\n const maxTokens = Math.min(available, contextManager.maxOutputTokens);\n if (maxTokens < 1024) {\n yield finalizeLoop(\"Insufficient context window for next turn\");\n return;\n }\n\n inFlightText = \"\";\n inFlightReasoning = \"\";\n inFlightToolCalls = [];\n\n let response;\n try {\n const mappedMessages = messages.map((m) => {\n if (m.role === \"tool\") {\n const toolCall = inFlightToolCalls.find(tc => tc.id === (m as { tool_use_id?: string }).tool_use_id);\n if (toolCall) {\n return {\n role: \"tool\" as const,\n tool_use_id: m.role === \"tool\" ? (m as { tool_use_id: string }).tool_use_id : undefined,\n is_error: m.role === \"tool\" ? (m as { is_error?: boolean }).is_error : undefined,\n content: truncateOutput(\n (m as { content: string }).content,\n toolCall.name,\n tools.has(\"delegate_agent\"),\n ),\n };\n }\n }\n return {\n role: m.role,\n content: m.role === \"tool\"\n ? (m as { content: string }).content\n : m.role === \"user\"\n ? (m as { content: string }).content\n : (m as { content: ContentBlock[] }).content,\n tool_use_id: m.role === \"tool\" ? (m as { tool_use_id: string }).tool_use_id : undefined,\n is_error: m.role === \"tool\" ? (m as { is_error?: boolean }).is_error : undefined,\n };\n });\n\n response = await model.chat({\n messages: mappedMessages,\n tools: tools.getAPI(),\n systemPrompt,\n maxOutputTokens: maxTokens,\n abortSignal,\n });\n } catch (err) {\n yield* flushInFlight();\n const error = err instanceof Error ? err : new Error(String(err));\n\n const hookResult = await hookRunner.runOnError(error, turns + 1);\n if (hookResult.retry && hookResult.message) {\n messages.push({ role: \"user\", content: hookResult.message });\n turns++;\n continue;\n }\n\n if (error.message.includes(\"429\") || error.message.includes(\"529\") || error.message.includes(\"overloaded\")) {\n consecutiveRetries++;\n if (consecutiveRetries > maxRetries) {\n yield { type: \"error\", error: new Error(`Max retries (${maxRetries}) exceeded`) };\n return;\n }\n const headerDelay = parseRetryAfterMs(error);\n const backoffDelay = headerDelay\n ?? Math.min(INITIAL_RETRY_DELAY_MS * 2 ** (consecutiveRetries - 1) + Math.random() * 500, MAX_RETRY_DELAY_MS);\n yield { type: \"thinking\", thinking: `Rate limited, retry ${consecutiveRetries}/${maxRetries} in ${Math.round(backoffDelay)}ms...` };\n await new Promise((r) => setTimeout(r, backoffDelay));\n continue;\n }\n\n yield { type: \"error\", error };\n return;\n }\n\n totalUsage.inputTokens += response.usage.inputTokens;\n totalUsage.outputTokens += response.usage.outputTokens;\n totalUsage.cacheReadTokens = (totalUsage.cacheReadTokens ?? 0) + (response.usage.cacheReadTokens ?? 0);\n totalUsage.cacheWriteTokens = (totalUsage.cacheWriteTokens ?? 0) + (response.usage.cacheWriteTokens ?? 0);\n\n if (costTracker) {\n costTracker.record(model.model, response.usage, turns + 1);\n }\n\n const toolCalls: ToolUseBlock[] = [];\n for (const block of response.content) {\n if (block.type === \"text\") {\n inFlightText += block.text;\n yield { type: \"text\", text: block.text };\n } else if (block.type === \"thinking\") {\n inFlightReasoning += block.thinking;\n yield { type: \"thinking\", thinking: block.thinking };\n } else if (block.type === \"tool_use\") {\n const resolvedName = tools.has(block.name) ? block.name : tools.findCaseInsensitive(block.name);\n if (!resolvedName) {\n yield { type: \"tool_result\", id: block.id, name: block.name, output: `Unknown tool: ${block.name}. Available: ${tools.listNames().join(\", \")}`, isError: true };\n messages.push({ role: \"assistant\", content: response.content });\n messages.push({ role: \"tool\", tool_use_id: block.id, content: `Unknown tool: ${block.name}`, is_error: true });\n continue;\n }\n const modifiedBlock: ToolUseBlock = resolvedName !== block.name ? { ...block, name: resolvedName } : block;\n\n const hookToolResult = await hookRunner.runOnToolUse(modifiedBlock.name, modifiedBlock.input);\n if (!hookToolResult.allow) {\n yield { type: \"tool_result\", id: modifiedBlock.id, name: modifiedBlock.name, output: \"Tool denied by hook\", isError: true };\n messages.push({ role: \"assistant\", content: response.content });\n messages.push({ role: \"tool\", tool_use_id: modifiedBlock.id, content: \"Tool denied by hook\", is_error: true });\n continue;\n }\n const finalBlock: ToolUseBlock = { ...modifiedBlock, input: hookToolResult.input };\n toolCalls.push(finalBlock);\n inFlightToolCalls.push(finalBlock);\n yield { type: \"tool_use\", id: finalBlock.id, name: finalBlock.name, input: finalBlock.input };\n }\n }\n\n const hasNonToolContent = inFlightText.length > 0 || inFlightReasoning.length > 0;\n if (!hasNonToolContent && toolCalls.length === 0) {\n yield finalizeLoop(\"Assistant produced no content\");\n return;\n }\n\n const assistantContent = response.content.filter(b => {\n if (b.type !== \"tool_use\") return true;\n return toolCalls.some(tc => tc.id === b.id);\n });\n\n messages.push({ role: \"assistant\", content: assistantContent });\n turns++;\n consecutiveRetries = 0;\n inFlightText = \"\";\n inFlightReasoning = \"\";\n inFlightToolCalls = [];\n\n await hookRunner.runOnTurnEnd(turns, messages);\n\n if (response.stopReason !== \"tool_use\" || toolCalls.length === 0) {\n yield {\n type: \"done\",\n usage: {\n inputTokens: totalUsage.inputTokens,\n outputTokens: totalUsage.outputTokens,\n cacheReadTokens: totalUsage.cacheReadTokens,\n cacheWriteTokens: totalUsage.cacheWriteTokens,\n },\n messages: [...messages],\n };\n return;\n }\n\n const doomLoopCall = detectDoomLoop(messages);\n if (doomLoopCall) {\n yield { type: \"thinking\", thinking: `Detected repetitive tool calls: ${doomLoopCall.name} called ${DOOM_LOOP_THRESHOLD} times with identical input. Breaking the loop.` };\n messages.push({ role: \"user\", content: `STOP. You have called ${doomLoopCall.name} ${DOOM_LOOP_THRESHOLD} times in a row with the same input. This indicates a loop. Try a different approach or tool.` });\n turns++;\n continue;\n }\n\n const results = await orchestrateTools(\n tools,\n toolCalls,\n context,\n async (name, _input) => {\n const perm = permissionEngine.check(name);\n return perm.allowed;\n },\n abortSignal,\n );\n\n for (const result of results) {\n let output = truncateOutput(result.output, result.name, tools.has(\"delegate_agent\"));\n const toolResult = await hookRunner.runOnToolResult({\n id: result.id,\n name: result.name,\n output: result.output,\n isError: result.isError,\n durationMs: result.durationMs,\n });\n output = toolResult;\n\n messages.push({\n role: \"tool\",\n tool_use_id: result.id,\n content: output,\n is_error: result.isError,\n });\n yield {\n type: \"tool_result\",\n id: result.id,\n name: result.name,\n output,\n isError: result.isError,\n };\n }\n }\n\n yield { type: \"error\", error: new Error(`Max turns (${maxTurns}) reached`) };\n\n function* flushInFlight(): Generator<LoopEvent, void, unknown> {\n if (inFlightText.length > 0) {\n yield { type: \"text\", text: inFlightText };\n }\n if (inFlightReasoning.length > 0) {\n yield { type: \"thinking\", thinking: inFlightReasoning };\n }\n for (const tc of inFlightToolCalls) {\n yield { type: \"tool_result\", id: tc.id, name: tc.name, output: \"[Tool execution was interrupted]\", isError: true };\n messages.push({ role: \"assistant\", content: [{ type: \"tool_use\" as const, id: tc.id, name: tc.name, input: tc.input }] });\n messages.push({ role: \"tool\", tool_use_id: tc.id, content: \"[Tool execution was interrupted]\", is_error: true });\n }\n }\n\n function finalizeLoop(reason: string): LoopEvent {\n if (totalUsage.inputTokens > 0 || totalUsage.outputTokens > 0) {\n return {\n type: \"done\",\n usage: {\n inputTokens: totalUsage.inputTokens,\n outputTokens: totalUsage.outputTokens,\n cacheReadTokens: totalUsage.cacheReadTokens,\n cacheWriteTokens: totalUsage.cacheWriteTokens,\n },\n messages: [...messages],\n };\n }\n return { type: \"error\", error: new Error(reason) };\n }\n}\n","import type { Tool, APIToolDefinition } from './tool.js';\n\n/** Registry for managing tool lookup and deduplication. */\nexport class ToolRegistry {\n private readonly tools = new Map<string, Tool>();\n\n constructor(tools?: Tool[]) {\n if (tools) {\n for (const tool of tools) {\n this.add(tool);\n }\n }\n }\n\n /** Add a tool to the registry. Duplicate names are ignored (first one wins). */\n add(tool: Tool): void {\n if (this.tools.has(tool.name)) {\n console.warn(`[ToolRegistry] Duplicate tool \"${tool.name}\" ignored (first one wins)`);\n return;\n }\n this.tools.set(tool.name, tool);\n }\n\n /** Get a tool by name. */\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n /** Check if a tool exists by name. */\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n /** Find tool by case-insensitive name. Returns undefined if not found. */\n findCaseInsensitive(name: string): string | undefined {\n const lower = name.toLowerCase();\n if (this.tools.has(name)) return name;\n for (const key of this.tools.keys()) {\n if (key.toLowerCase() === lower) return key;\n }\n return undefined;\n }\n\n /** List all registered tool names. */\n listNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n /** Get all registered tools. */\n getAll(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n /** Get all tools in API format, sorted by name for cache stability. */\n getAPI(): APIToolDefinition[] {\n return this.getAll()\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((t) => t.toAPI());\n }\n\n /** Number of registered tools. */\n get size(): number {\n return this.tools.size;\n }\n}\n","import type { ZodSchema } from 'zod';\nimport type { ToolContext } from '../types.js';\n\n/** JSON Schema representation of a tool for LLM function calling APIs. */\nexport interface APIToolDefinition {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\n/** Core tool abstraction that every tool must implement. */\nexport interface Tool<P = unknown> {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: ZodSchema<P>;\n readonly isReadOnly: boolean;\n readonly isConcurrencySafe: boolean;\n\n execute(input: P, context: ToolContext): Promise<string>;\n toAPI(): APIToolDefinition;\n toString(input: P): string;\n}\n\n/** Configuration object for defining a tool. */\nexport interface ToolExecuteOptions<P = unknown> {\n name: string;\n description: string;\n inputSchema: ZodSchema<P>;\n isReadOnly?: boolean;\n isConcurrencySafe?: boolean;\n execute: (input: P, context: ToolContext) => Promise<string>;\n}\n\nfunction zodToJsonSchema(schema: unknown): Record<string, unknown> {\n const s = schema as { _def: Record<string, unknown> };\n const def = s._def;\n const typeName = def.typeName as string;\n const description = def.description as string | undefined;\n\n const base: Record<string, unknown> = {};\n if (description) base.description = description;\n\n switch (typeName) {\n case 'ZodString':\n return { ...base, type: 'string' };\n case 'ZodNumber':\n return { ...base, type: 'number' };\n case 'ZodBoolean':\n return { ...base, type: 'boolean' };\n case 'ZodNull':\n return { ...base, type: 'null' };\n case 'ZodArray': {\n const items = zodToJsonSchema(def.element);\n return { ...base, type: 'array', items };\n }\n case 'ZodObject': {\n const shapeFn = def.shape as () => Record<string, unknown>;\n const shape = shapeFn();\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodToJsonSchema(value);\n const propDef = (value as { _def: Record<string, unknown> })._def;\n if (\n propDef.typeName !== 'ZodOptional' &&\n propDef.typeName !== 'ZodNullish' &&\n propDef.typeName !== 'ZodDefault'\n ) {\n required.push(key);\n }\n }\n const result: Record<string, unknown> = { ...base, type: 'object', properties };\n if (required.length > 0) result.required = required;\n return result;\n }\n case 'ZodEnum':\n return { ...base, enum: def.values };\n case 'ZodLiteral':\n return { ...base, const: def.value };\n case 'ZodUnion': {\n const options = (def.options as unknown[]).map((o) => zodToJsonSchema(o));\n return { ...base, anyOf: options };\n }\n case 'ZodDiscriminatedUnion': {\n const options = (def.options as unknown[]).map((o) => zodToJsonSchema(o));\n return { ...base, anyOf: options };\n }\n case 'ZodOptional':\n return zodToJsonSchema(def.innerType);\n case 'ZodNullable': {\n const inner = zodToJsonSchema(def.innerType);\n inner.nullable = true;\n return inner;\n }\n case 'ZodNullish': {\n const inner = zodToJsonSchema(def.innerType);\n inner.nullable = true;\n return inner;\n }\n case 'ZodDefault':\n return zodToJsonSchema(def.innerType);\n case 'ZodRecord': {\n const valueSchema = zodToJsonSchema(def.valueType);\n return { ...base, type: 'object', additionalProperties: valueSchema };\n }\n case 'ZodTuple': {\n const items = (def.items as unknown[]).map((o) => zodToJsonSchema(o));\n return { ...base, type: 'array', items, minItems: items.length, maxItems: items.length };\n }\n case 'ZodEffects': {\n return zodToJsonSchema(def.innerType);\n }\n case 'ZodAny':\n return {};\n case 'ZodUnknown':\n return {};\n case 'ZodVoid':\n return { ...base, type: 'null' };\n case 'ZodNever':\n return { ...base, not: {} };\n default:\n return { ...base, type: 'string' };\n }\n}\n\n/** Define a tool from a configuration object. */\nexport function defineTool<P = unknown>(config: ToolExecuteOptions<P>): Tool<P> {\n const tool: Tool<P> = {\n name: config.name,\n description: config.description,\n inputSchema: config.inputSchema,\n isReadOnly: config.isReadOnly ?? false,\n isConcurrencySafe: config.isConcurrencySafe ?? false,\n execute: config.execute,\n toAPI(): APIToolDefinition {\n return {\n name: config.name,\n description: config.description,\n input_schema: zodToJsonSchema(config.inputSchema),\n };\n },\n toString(input: P): string {\n const entries = Object.entries(input as Record<string, unknown>)\n .map(([k, v]) => {\n if (typeof v === 'string') return `${k}: \"${v}\"`;\n if (v === undefined) return `${k}: undefined`;\n if (v === null) return `${k}: null`;\n return `${k}: ${String(v)}`;\n })\n .join(', ');\n return `${config.name}({ ${entries} })`;\n },\n };\n return tool;\n}\n\n/** Wrap a class-based tool into the standard Tool interface. */\nexport function defineToolFromClass(ctor: new () => Tool): Tool {\n const instance = new ctor();\n return {\n name: instance.name,\n description: instance.description,\n inputSchema: instance.inputSchema,\n isReadOnly: instance.isReadOnly,\n isConcurrencySafe: instance.isConcurrencySafe,\n execute: (input, context) => instance.execute(input, context),\n toAPI: () => instance.toAPI(),\n toString: (input) => instance.toString(input),\n };\n}\n","import type { Message } from \"../types.js\";\n\nexport interface TokenCount {\n total: number;\n byRole: Record<string, number>;\n}\n\nexport function estimateTokens(text: string): number {\n const chars = text.length;\n const words = text.split(/\\s+/).filter(Boolean).length;\n return Math.max(Math.ceil(chars / 4), Math.ceil(words * 1.3));\n}\n\nexport function estimateMessageTokens(message: Message): number {\n if (message.role === \"user\") {\n return estimateTokens(message.content) + 4;\n }\n\n if (message.role === \"tool\") {\n return estimateTokens(message.content) + 4;\n }\n\n let tokens = 0;\n for (const block of message.content) {\n if (block.type === \"text\") {\n tokens += estimateTokens(block.text) + 4;\n } else if (block.type === \"tool_use\") {\n tokens += estimateTokens(block.name) + estimateTokens(JSON.stringify(block.input)) + 4;\n } else if (block.type === \"thinking\") {\n tokens += estimateTokens(block.thinking) + 4;\n }\n }\n return tokens;\n}\n\nexport function estimateConversationTokens(messages: Message[]): TokenCount {\n const byRole: Record<string, number> = {};\n\n let total = 0;\n for (const message of messages) {\n const msgTokens = estimateMessageTokens(message) + 10;\n total += msgTokens;\n byRole[message.role] = (byRole[message.role] ?? 0) + msgTokens;\n }\n\n return { total, byRole };\n}\n","import type { Message, ContentBlock, ContextConfig, CompactionResult } from \"../types.js\";\nimport { DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_OUTPUT_TOKENS, DEFAULT_COMPACT_THRESHOLD } from \"../types.js\";\nimport { estimateConversationTokens, estimateMessageTokens } from \"./tokenizer.js\";\n\nconst PRUNE_MINIMUM = 20_000;\nconst PRUNE_PROTECT_TOKENS = 40_000;\nconst PROTECTED_TOOL_TYPES = new Set([\"skill\", \"delegate_agent\"]);\nconst RECENT_TURNS_TO_PROTECT = 2;\n\nexport interface ContextCheck {\n totalTokens: number;\n availableTokens: number;\n usagePercent: number;\n needsCompact: boolean;\n recommendedMethod: \"snip\" | \"compact\";\n}\n\nexport class ContextManager {\n readonly maxTokens: number;\n readonly maxOutputTokens: number;\n readonly compactThreshold: number;\n\n constructor(config?: ContextConfig) {\n this.maxTokens = config?.maxTokens ?? DEFAULT_CONTEXT_WINDOW;\n this.maxOutputTokens = config?.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS;\n this.compactThreshold = config?.compactThreshold ?? DEFAULT_COMPACT_THRESHOLD;\n }\n\n check(messages: Message[]): ContextCheck {\n const { total: totalTokens } = estimateConversationTokens(messages);\n const availableTokens = this.maxTokens - totalTokens - this.maxOutputTokens;\n const usagePercent = totalTokens / this.maxTokens;\n const needsCompact = usagePercent >= this.compactThreshold;\n let recommendedMethod: \"snip\" | \"compact\";\n\n if (usagePercent > 0.95) {\n recommendedMethod = \"compact\";\n } else {\n recommendedMethod = \"snip\";\n }\n\n return { totalTokens, availableTokens, usagePercent, needsCompact, recommendedMethod };\n }\n\n async compact(messages: Message[], summaryFn?: (messages: Message[]) => Promise<string>): Promise<CompactionResult> {\n const contextCheck = this.check(messages);\n\n if (!contextCheck.needsCompact) {\n return { messages: [...messages], tokensSaved: 0, method: \"none\" };\n }\n\n const originalTokens = contextCheck.totalTokens;\n\n if (summaryFn && contextCheck.recommendedMethod === \"compact\") {\n const recentCount = Math.max(Math.ceil(messages.length * 0.2), 1);\n const cutoffIndex = messages.length - recentCount;\n const oldMessages = messages.slice(0, cutoffIndex);\n const recentMessages = messages.slice(cutoffIndex);\n\n const summary = await summaryFn(oldMessages);\n const summaryMessage: Message = {\n role: \"user\",\n content: `Here is a summary of our previous conversation:\\n${summary}`,\n };\n\n const compacted = [summaryMessage, ...recentMessages];\n const newTokens = estimateConversationTokens(compacted).total;\n\n return {\n messages: compacted,\n tokensSaved: originalTokens - newTokens,\n method: \"compact\",\n };\n }\n\n const keepFirst = 1;\n const keepLast = 20;\n const keepMin = keepFirst + keepLast;\n\n if (messages.length <= keepMin) {\n return { messages: [...messages], tokensSaved: 0, method: \"none\" };\n }\n\n let result = [...messages];\n const targetUsage = 0.6;\n\n while (result.length > keepMin) {\n const { total } = estimateConversationTokens(result);\n if (total / this.maxTokens < targetUsage) break;\n\n const removeCount = Math.max(1, Math.floor((result.length - keepMin) * 0.3));\n const removeEnd = Math.min(keepFirst + removeCount, result.length - keepLast);\n result = [result[0], ...result.slice(removeEnd)];\n }\n\n const newTokens = estimateConversationTokens(result).total;\n\n return {\n messages: result,\n tokensSaved: originalTokens - newTokens,\n method: \"snip\",\n };\n }\n\n pruneToolOutputs(messages: Message[]): Message[] {\n let totalPruned = 0;\n let turnCount = 0;\n const result = [...messages];\n\n for (let i = result.length - 1; i >= 0; i--) {\n const msg = result[i];\n if (msg.role === \"user\") {\n turnCount++;\n if (turnCount <= RECENT_TURNS_TO_PROTECT) continue;\n }\n if (msg.role !== \"assistant\" || !Array.isArray(msg.content)) continue;\n\n for (const block of msg.content) {\n if (block.type !== \"tool_use\") continue;\n if (PROTECTED_TOOL_TYPES.has(block.name)) continue;\n\n const toolResultIdx = result.findIndex(\n (m, j) => j > i && m.role === \"tool\" && (m as { tool_use_id?: string }).tool_use_id === block.id,\n );\n if (toolResultIdx === -1) continue;\n\n const toolResult = result[toolResultIdx];\n const output = (toolResult as { content: string }).content;\n const estTokens = Math.ceil(output.length / 4);\n\n if (totalPruned + estTokens >= PRUNE_MINIMUM && totalPruned >= PRUNE_PROTECT_TOKENS) {\n return result;\n }\n\n totalPruned += estTokens;\n result[toolResultIdx] = {\n ...(toolResult as unknown as Record<string, unknown>),\n content: `[Output pruned: ${estTokens} tokens saved]`,\n is_error: false,\n } as typeof toolResult;\n }\n }\n\n return result;\n }\n\n getAvailableTokens(messages: Message[]): number {\n return this.maxTokens - estimateConversationTokens(messages).total - this.maxOutputTokens;\n }\n\n getUsagePercent(messages: Message[]): number {\n return estimateConversationTokens(messages).total / this.maxTokens;\n }\n}\n","import type { PermissionConfig } from \"../types.js\";\n\nexport interface PermissionResult {\n allowed: boolean;\n reason?: string;\n}\n\nfunction matchPattern(pattern: string, toolName: string): boolean {\n if (!pattern.includes(\"*\")) {\n return pattern === toolName;\n }\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n const regex = new RegExp(`^${escaped}$`);\n return regex.test(toolName);\n}\n\nexport class PermissionEngine {\n private allowedPatterns: string[];\n private deniedPatterns: string[];\n private askPatterns: string[];\n private defaultAction: \"allow\" | \"deny\" | \"ask\";\n\n constructor(config?: PermissionConfig) {\n this.allowedPatterns = config?.allowedTools ?? [];\n this.deniedPatterns = config?.deniedTools ?? [];\n this.askPatterns = config?.askTools ?? [];\n this.defaultAction = config?.defaultAction ?? \"allow\";\n }\n\n check(toolName: string, _input?: Record<string, unknown>): PermissionResult {\n for (const pattern of this.deniedPatterns) {\n if (matchPattern(pattern, toolName)) {\n return { allowed: false, reason: `Tool '${toolName}' matches denied pattern '${pattern}'` };\n }\n }\n\n for (const pattern of this.allowedPatterns) {\n if (matchPattern(pattern, toolName)) {\n return { allowed: true };\n }\n }\n\n for (const pattern of this.askPatterns) {\n if (matchPattern(pattern, toolName)) {\n return { allowed: false, reason: \"ask\" };\n }\n }\n\n if (this.defaultAction === \"deny\") {\n return { allowed: false, reason: `Tool '${toolName}' not explicitly allowed` };\n }\n\n if (this.defaultAction === \"ask\") {\n return { allowed: false, reason: \"ask\" };\n }\n\n return { allowed: true };\n }\n\n addAllowed(pattern: string): void {\n this.allowedPatterns.push(pattern);\n }\n\n addDenied(pattern: string): void {\n this.deniedPatterns.push(pattern);\n }\n\n addAsk(pattern: string): void {\n this.askPatterns.push(pattern);\n }\n}\n","export interface CostRecord {\n model: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n inputCost: number;\n outputCost: number;\n timestamp: number;\n turn: number;\n toolName?: string;\n}\n\nexport interface ModelPricing {\n inputCostPer1k: number;\n outputCostPer1k: number;\n}\n\nexport const DEFAULT_PRICING: Record<string, ModelPricing> = {\n \"claude-sonnet-4-20250514\": { inputCostPer1k: 0.003, outputCostPer1k: 0.015 },\n \"claude-3-5-sonnet-20241022\": { inputCostPer1k: 0.003, outputCostPer1k: 0.015 },\n \"claude-3-5-haiku-20241022\": { inputCostPer1k: 0.0008, outputCostPer1k: 0.004 },\n \"claude-opus-4-20250514\": { inputCostPer1k: 0.015, outputCostPer1k: 0.075 },\n \"gpt-4o\": { inputCostPer1k: 0.0025, outputCostPer1k: 0.01 },\n \"gpt-4o-mini\": { inputCostPer1k: 0.00015, outputCostPer1k: 0.0006 },\n \"gpt-4-turbo\": { inputCostPer1k: 0.01, outputCostPer1k: 0.03 },\n};\n\nexport class CostTracker {\n private records: CostRecord[] = [];\n private pricing: Record<string, ModelPricing>;\n\n constructor(customPricing?: Record<string, ModelPricing>) {\n this.pricing = { ...DEFAULT_PRICING, ...customPricing };\n }\n\n record(\n model: string,\n usage: { inputTokens: number; outputTokens: number; cacheReadTokens?: number; cacheWriteTokens?: number },\n turn: number,\n toolName?: string,\n ): void {\n const pricing = this.pricing[model] ?? { inputCostPer1k: 0.001, outputCostPer1k: 0.003 };\n this.records.push({\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n cacheReadTokens: usage.cacheReadTokens ?? 0,\n cacheWriteTokens: usage.cacheWriteTokens ?? 0,\n inputCost: (usage.inputTokens / 1000) * pricing.inputCostPer1k,\n outputCost: (usage.outputTokens / 1000) * pricing.outputCostPer1k,\n timestamp: Date.now(),\n turn,\n toolName,\n });\n }\n\n getTotal(): {\n cost: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n } {\n let cost = 0;\n let input = 0;\n let output = 0;\n let cacheRead = 0;\n let cacheWrite = 0;\n for (const r of this.records) {\n cost += r.inputCost + r.outputCost;\n input += r.inputTokens;\n output += r.outputTokens;\n cacheRead += r.cacheReadTokens;\n cacheWrite += r.cacheWriteTokens;\n }\n return { cost, inputTokens: input, outputTokens: output, cacheReadTokens: cacheRead, cacheWriteTokens: cacheWrite };\n }\n\n getByModel(): Record<string, { cost: number; calls: number }> {\n const byModel: Record<string, { cost: number; calls: number }> = {};\n for (const r of this.records) {\n if (!byModel[r.model]) byModel[r.model] = { cost: 0, calls: 0 };\n byModel[r.model].cost += r.inputCost + r.outputCost;\n byModel[r.model].calls++;\n }\n return byModel;\n }\n\n getByTool(): Record<string, { cost: number; calls: number }> {\n const byTool: Record<string, { cost: number; calls: number }> = {};\n for (const r of this.records) {\n const key = r.toolName ?? \"llm\";\n if (!byTool[key]) byTool[key] = { cost: 0, calls: 0 };\n byTool[key].cost += r.inputCost + r.outputCost;\n byTool[key].calls++;\n }\n return byTool;\n }\n\n getRecords(): CostRecord[] {\n return [...this.records];\n }\n\n reset(): void {\n this.records = [];\n }\n\n setPricing(model: string, pricing: ModelPricing): void {\n this.pricing[model] = pricing;\n }\n}\n","import type { Message, LoopEvent, AgentConfig, PermissionConfig } from \"./types.js\";\nimport { DEFAULT_MAX_TURNS, DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_OUTPUT_TOKENS, DEFAULT_COMPACT_THRESHOLD } from \"./types.js\";\nimport { agentLoop } from \"./loop.js\";\nimport { ToolRegistry } from \"./tools/registry.js\";\nimport { defineTool } from \"./tools/tool.js\";\nimport type { Tool } from \"./tools/tool.js\";\nimport { ContextManager } from \"./context/manager.js\";\nimport { PermissionEngine } from \"./permissions/engine.js\";\nimport type { Provider } from \"./llm/provider.js\";\nimport type { AgentHooks } from \"./hooks.js\";\nimport { HookRunner } from \"./hooks.js\";\nimport type { MemoryStore } from \"./memory/store.js\";\nimport type { CostTracker } from \"./cost/tracker.js\";\nimport { CostTracker as CostTrackerImpl } from \"./cost/tracker.js\";\n\nexport interface AgentConfigV2 extends AgentConfig {\n hooks?: AgentHooks;\n memory?: MemoryStore;\n threadId?: string;\n costTracker?: CostTracker;\n title?: string;\n disableTitle?: boolean;\n}\n\nexport class Agent {\n private model: Provider;\n private tools: ToolRegistry;\n private systemPrompt: string;\n private maxTurns: number;\n private contextManager: ContextManager;\n private permissionEngine: PermissionEngine;\n private permissionConfig?: PermissionConfig;\n private cwd: string;\n private maxRetries: number;\n private messages: Message[] = [];\n private hooks?: AgentHooks;\n private memory?: MemoryStore;\n private threadId?: string;\n private costTracker: CostTracker;\n private _loaded = false;\n private _title?: string;\n private _titleFetched = false;\n private _disableTitle = false;\n\n constructor(config: AgentConfig | AgentConfigV2) {\n this.model = config.model;\n this.tools = new ToolRegistry(config.tools ?? []);\n this.systemPrompt = config.systemPrompt ?? \"\";\n this.maxTurns = config.maxTurns ?? DEFAULT_MAX_TURNS;\n this.contextManager = new ContextManager({\n maxTokens: config.context?.maxTokens ?? DEFAULT_CONTEXT_WINDOW,\n maxOutputTokens: config.context?.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS,\n compactThreshold: config.context?.compactThreshold ?? DEFAULT_COMPACT_THRESHOLD,\n });\n this.permissionEngine = new PermissionEngine(config.permissions);\n this.permissionConfig = config.permissions;\n this.cwd = config.cwd ?? process.cwd();\n this.maxRetries = config.maxRetries ?? 5;\n\n const v2 = config as AgentConfigV2;\n this.hooks = v2.hooks;\n this.memory = v2.memory;\n this.threadId = v2.threadId;\n this.costTracker = v2.costTracker ?? new CostTrackerImpl();\n this._title = v2.title;\n this._disableTitle = v2.disableTitle ?? false;\n }\n\n addTool(tool: Tool): void {\n this.tools.add(tool);\n }\n\n addMessage(message: Message): void {\n this.messages.push(message);\n }\n\n reset(): void {\n this.messages = [];\n this._titleFetched = false;\n }\n\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n getCostTracker(): CostTracker {\n return this.costTracker;\n }\n\n get title(): string | undefined {\n return this._title;\n }\n\n private async loadMemory(): Promise<void> {\n if (this._loaded || !this.memory || !this.threadId) return;\n const stored = await this.memory.getThread(this.threadId);\n if (stored.length > 0) {\n this.messages = stored;\n }\n this._loaded = true;\n }\n\n private async saveMemory(): Promise<void> {\n if (!this.memory || !this.threadId) return;\n await this.memory.saveThread(this.threadId, this.messages);\n }\n\n fork(newThreadId?: string): Agent {\n const forked = new Agent({\n model: this.model,\n tools: this.tools.getAll(),\n systemPrompt: this.systemPrompt,\n maxTurns: this.maxTurns,\n cwd: this.cwd,\n maxRetries: this.maxRetries,\n permissions: this.permissionConfig,\n hooks: this.hooks,\n memory: this.memory,\n threadId: newThreadId,\n costTracker: this.costTracker,\n title: this._title,\n context: {\n maxTokens: this.contextManager.maxTokens,\n maxOutputTokens: this.contextManager.maxOutputTokens,\n compactThreshold: this.contextManager.compactThreshold,\n },\n });\n forked.messages = [...this.messages];\n return forked;\n }\n\n async *run(prompt: string, options?: { abortSignal?: AbortSignal }): AsyncGenerator<LoopEvent> {\n await this.loadMemory();\n const loopMessages = [...this.messages, { role: \"user\" as const, content: prompt }];\n\n if (!this._titleFetched && this.messages.length === 0 && !this._disableTitle) {\n this._titleFetched = true;\n this.generateTitle(prompt).catch(() => {});\n }\n\n const loop = agentLoop({\n model: this.model,\n tools: this.tools,\n messages: loopMessages,\n systemPrompt: this.systemPrompt || undefined,\n maxTurns: this.maxTurns,\n contextManager: this.contextManager,\n permissionEngine: this.permissionEngine,\n cwd: this.cwd,\n abortSignal: options?.abortSignal,\n maxRetries: this.maxRetries,\n hooks: this.hooks,\n costTracker: this.costTracker,\n });\n\n const finalMessages: Message[] = [];\n for await (const event of loop) {\n yield event;\n if (event.type === \"done\") {\n finalMessages.length = 0;\n finalMessages.push(...event.messages);\n }\n }\n\n if (finalMessages.length > 0) {\n this.messages = finalMessages;\n await this.saveMemory();\n }\n }\n\n async chat(prompt: string, options?: { abortSignal?: AbortSignal }): Promise<{\n text: string;\n usage: { inputTokens: number; outputTokens: number };\n messages: Message[];\n cost: number;\n }> {\n let text = \"\";\n let usage = { inputTokens: 0, outputTokens: 0 };\n\n for await (const event of this.run(prompt, options)) {\n if (event.type === \"text\") {\n text += event.text;\n }\n if (event.type === \"done\") {\n usage = {\n inputTokens: event.usage.inputTokens,\n outputTokens: event.usage.outputTokens,\n };\n }\n }\n\n const total = this.costTracker.getTotal();\n return { text, usage, messages: this.getMessages(), cost: total.cost };\n }\n\n async structured<T>(\n prompt: string,\n schema: { safeParse: (data: unknown) => { success: boolean; data?: T; error?: { issues: Array<{ path: (string | number)[]; message: string }> } } },\n options?: { abortSignal?: AbortSignal; maxRetries?: number },\n ): Promise<T> {\n const maxRetries = options?.maxRetries ?? 3;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n const currentPrompt = attempt === 0\n ? prompt\n : `${prompt}\\n\\nPrevious attempt returned invalid JSON. Please fix and respond with valid JSON only.`;\n\n const agent = new Agent({\n model: this.model,\n tools: [],\n systemPrompt: \"You must respond with valid JSON matching the requested schema.\",\n maxTurns: 1,\n cwd: this.cwd,\n permissions: this.permissionConfig,\n context: {\n maxTokens: this.contextManager.maxTokens,\n maxOutputTokens: this.contextManager.maxOutputTokens,\n compactThreshold: this.contextManager.compactThreshold,\n },\n costTracker: this.costTracker,\n disableTitle: true,\n } as AgentConfigV2);\n\n const result = await agent.chat(currentPrompt, options);\n const jsonMatch = result.text.match(/```(?:json)?\\s*([\\s\\S]*?)```/) ?? [null, result.text];\n const jsonStr = jsonMatch[1] ?? result.text;\n\n try {\n const parsed = JSON.parse(jsonStr);\n const validated = schema.safeParse(parsed);\n if (validated.success && validated.data !== undefined) {\n return validated.data as T;\n }\n } catch {\n continue;\n }\n }\n\n throw new Error(`Failed to get valid structured output after ${maxRetries} attempts`);\n }\n\n async structuredViaTool<T>(\n prompt: string,\n schema: { safeParse: (data: unknown) => { success: boolean; data?: T; error?: { issues: Array<{ path: (string | number)[]; message: string }> } } },\n options?: { abortSignal?: AbortSignal; maxRetries?: number },\n ): Promise<T> {\n const { z } = await import(\"zod\");\n const maxRetries = options?.maxRetries ?? 3;\n\n let captured: T | undefined;\n\n const structTool = defineTool({\n name: \"structured_output\",\n description: \"Return your final response in the required structured format.\",\n inputSchema: z.object({\n response: z.unknown().describe(\"The structured JSON response\"),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async (input: Record<string, unknown>) => {\n captured = input.response as T;\n return \"Structured output captured.\";\n },\n });\n\n const agent = new Agent({\n model: this.model,\n tools: [structTool],\n systemPrompt: [\n this.systemPrompt,\n \"You MUST call the structured_output tool with your response. Do not return plain text.\",\n ].filter(Boolean).join(\"\\n\\n\"),\n maxTurns: 1,\n cwd: this.cwd,\n permissions: this.permissionConfig,\n context: {\n maxTokens: this.contextManager.maxTokens,\n maxOutputTokens: this.contextManager.maxOutputTokens,\n compactThreshold: this.contextManager.compactThreshold,\n },\n costTracker: this.costTracker,\n disableTitle: true,\n } as AgentConfigV2);\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n captured = undefined;\n const currentPrompt = attempt === 0\n ? prompt\n : `${prompt}\\n\\nPrevious attempt failed validation. Fix your structured output and call the structured_output tool again.`;\n\n await agent.chat(currentPrompt, options);\n\n if (captured !== undefined) {\n const validated = schema.safeParse(captured);\n if (validated.success && validated.data !== undefined) {\n return validated.data as T;\n }\n }\n }\n\n throw new Error(`Failed to get valid structured output via tool after ${maxRetries} attempts`);\n }\n\n async asTool(options?: { allowSubAgents?: boolean; name?: string; description?: string }): Promise<Tool> {\n const { z } = await import(\"zod\");\n const allowSubAgents = options?.allowSubAgents ?? false;\n return defineTool({\n name: options?.name ?? \"delegate_agent\",\n description: options?.description ?? `Delegate a task to a sub-agent with system prompt: ${this.systemPrompt?.slice(0, 100) ?? \"none\"}`,\n inputSchema: z.object({\n prompt: z.string().describe(\"The task to delegate\"),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async (input: Record<string, unknown>) => {\n const subAgent = this.fork();\n if (!allowSubAgents) {\n const forbiddenTools = [\"delegate_agent\", \"task\", \"todowrite\"];\n const allowed = this.tools.getAll().filter((t) => !forbiddenTools.includes(t.name));\n for (const tool of allowed) {\n subAgent.addTool(tool);\n }\n }\n const result = await subAgent.chat(input.prompt as string);\n return result.text;\n },\n });\n }\n\n private async generateTitle(prompt: string): Promise<void> {\n try {\n const firstLine = prompt.split(\"\\n\")[0].slice(0, 200);\n const titleAgent = new Agent({\n model: this.model,\n tools: [],\n systemPrompt: \"Generate a short, descriptive title (max 10 words) for a conversation that starts with this message. Return ONLY the title, nothing else.\",\n maxTurns: 1,\n cwd: this.cwd,\n costTracker: this.costTracker,\n disableTitle: true,\n } as AgentConfigV2);\n const result = await titleAgent.chat(firstLine);\n const title = result.text.trim().replace(/^[\"']|[\"']$/g, \"\").slice(0, 80);\n if (title.length > 0) {\n this._title = title;\n }\n } catch {\n this._title = prompt.slice(0, 50);\n }\n }\n}\n","import { exec } from 'node:child_process';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\n\nconst MAX_OUTPUT = 50 * 1024;\nconst TRUNCATE_HALF = 25 * 1024;\n\nfunction truncateOutput(output: string): string {\n if (output.length <= MAX_OUTPUT) return output;\n const notice = `\\n\\n... [output truncated: showing first ${TRUNCATE_HALF} and last ${TRUNCATE_HALF} of ${output.length} characters] ...\\n\\n`;\n return output.slice(0, TRUNCATE_HALF) + notice + output.slice(-TRUNCATE_HALF);\n}\n\nexport const BashTool = defineTool({\n name: 'bash',\n description:\n 'Execute a shell command. Returns stdout and stderr. Use for running build commands, git operations, package managers, and other CLI tools.',\n inputSchema: z.object({\n command: z.string().describe('The shell command to execute'),\n timeout: z.number().optional().describe('Timeout in milliseconds (default 120000)'),\n workdir: z.string().optional().describe('Working directory for the command'),\n }),\n isReadOnly: false,\n isConcurrencySafe: false,\n execute: async ({ command, timeout = 120000, workdir }, context) => {\n return new Promise<string>((resolve) => {\n let settled = false;\n const done = (result: string) => {\n if (settled) return;\n settled = true;\n resolve(result);\n };\n\n if (context.abortSignal?.aborted) {\n done('Command aborted before execution');\n return;\n }\n\n const child = exec(\n command,\n {\n cwd: workdir ?? context.cwd,\n timeout,\n maxBuffer: 10 * 1024 * 1024,\n killSignal: 'SIGKILL',\n },\n (error, stdout, stderr) => {\n let output = '';\n if (stdout) output += `STDOUT:\\n${stdout}\\n\\n`;\n if (stderr) output += `STDERR:\\n${stderr}\\n\\n`;\n output += `Exit code: ${error?.code ?? 0}`;\n if (error && error.killed) {\n output = `Command timed out after ${timeout}ms\\n\\n${output}`;\n }\n done(truncateOutput(output));\n },\n );\n\n child.on('error', (err) => {\n done(`Failed to execute command: ${err.message}`);\n });\n\n if (context.abortSignal) {\n context.abortSignal.addEventListener(\n 'abort',\n () => {\n child.kill('SIGKILL');\n done('Command aborted');\n },\n { once: true },\n );\n }\n });\n },\n});\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\n\nconst MAX_LINE_LENGTH = 2000;\n\nexport const FileReadTool = defineTool({\n name: 'file_read',\n description:\n 'Read the contents of a file. Returns the file content with line numbers. Use GlobTool to find files first.',\n inputSchema: z.object({\n path: z.string().describe('Absolute or relative path to the file'),\n offset: z.number().optional().describe('Line number to start reading from (1-indexed)'),\n limit: z.number().optional().describe('Maximum number of lines to read'),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async ({ path: filePath, offset, limit }, context) => {\n try {\n const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(context.cwd, filePath);\n\n const content = await fs.readFile(resolved, 'utf-8');\n const lines = content.split('\\n');\n\n const startLine = offset ? Math.max(1, offset) : 1;\n const startIndex = startLine - 1;\n const endIndex = limit != null ? startIndex + limit : lines.length;\n const selected = lines.slice(startIndex, endIndex);\n\n const formatted = selected\n .map((line, i) => {\n const lineNum = startLine + i;\n const truncated = line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) + '...' : line;\n return `${lineNum}: ${truncated}`;\n })\n .join('\\n');\n\n return formatted;\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return `Error: File not found: ${filePath}`;\n }\n if ((err as NodeJS.ErrnoException).code === 'EISDIR') {\n return `Error: Path is a directory: ${filePath}`;\n }\n return `Error reading file: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n});\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\n\nexport const FileWriteTool = defineTool({\n name: 'file_write',\n description:\n \"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Parent directories are created automatically.\",\n inputSchema: z.object({\n path: z.string().describe('Path to the file'),\n content: z.string().describe('Content to write'),\n }),\n isReadOnly: false,\n isConcurrencySafe: false,\n execute: async ({ path: filePath, content }, context) => {\n try {\n const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(context.cwd, filePath);\n const dir = path.dirname(resolved);\n\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(resolved, content, 'utf-8');\n\n return `Wrote ${content.length} characters to ${filePath}`;\n } catch (err: unknown) {\n return `Error writing file: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n});\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\nimport { fuzzyReplace } from './fuzzy-edit.js';\n\nexport const FileEditTool = defineTool({\n name: 'file_edit',\n description:\n 'Edit an existing file by replacing a string match with new content. Uses 9-strategy fuzzy matching (exact, line-trimmed, block-anchor with Levenshtein, whitespace-normalized, indentation-flexible, escape-normalized, trimmed-boundary, context-aware, multi-occurrence) so the oldString does not need to be a perfect character-for-character match. For multi-line edits, include enough surrounding context to ensure uniqueness.',\n inputSchema: z.object({\n path: z.string().describe('Path to the file'),\n oldString: z.string().describe('The string to find and replace (fuzzy-matched)'),\n newString: z.string().describe('The replacement string'),\n replaceAll: z.boolean().optional().describe('Replace all occurrences instead of just the first'),\n }),\n isReadOnly: false,\n isConcurrencySafe: false,\n execute: async ({ path: filePath, oldString, newString, replaceAll = false }, context) => {\n try {\n const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(context.cwd, filePath);\n\n const content = await fs.readFile(resolved, 'utf-8');\n\n let newContent: string;\n let count = 0;\n\n if (replaceAll) {\n const occurrences = content.split(oldString).length - 1;\n if (occurrences === 0) {\n try {\n newContent = fuzzyReplace(content, oldString, newString, true);\n count = 1;\n } catch {\n return `Error: oldString not found in ${filePath} (tried 9 fuzzy strategies)`;\n }\n } else {\n newContent = content.split(oldString).join(newString);\n count = occurrences;\n }\n } else {\n try {\n newContent = fuzzyReplace(content, oldString, newString, false);\n count = 1;\n } catch (err) {\n const kind = (err as { kind?: string }).kind;\n if (kind === \"ambiguous\") {\n return `Error: Multiple matches for oldString in ${filePath}. Provide more surrounding context or set replaceAll to true.`;\n }\n return `Error: oldString not found in ${filePath} (tried 9 fuzzy strategies)`;\n }\n }\n\n await fs.writeFile(resolved, newContent, 'utf-8');\n\n return `Replaced ${count} occurrence(s) in ${filePath}`;\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return `Error: File not found: ${filePath}`;\n }\n return `Error editing file: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n});\n","import type { ToolUseBlock } from \"../types.js\";\n\nexport type ReplacerFn = (content: string, find: string) => Generator<string, void, unknown>;\n\nexport class FuzzyEditError extends Error {\n constructor(public readonly kind: \"not_found\" | \"ambiguous\", message: string) {\n super(message);\n this.name = \"FuzzyEditError\";\n }\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (m === 0) return n;\n if (n === 0) return m;\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);\n }\n }\n return dp[m][n];\n}\n\nfunction similarity(a: string, b: string): number {\n if (a.length > 1000 || b.length > 1000) return a === b ? 1 : 0;\n const maxLen = Math.max(a.length, b.length);\n if (maxLen === 0) return 1;\n return 1 - levenshtein(a, b) / maxLen;\n}\n\nfunction* simpleReplacer(content: string, find: string): Generator<string, void, unknown> {\n if (content.includes(find)) yield find;\n}\n\nfunction* lineTrimmedReplacer(content: string, find: string): Generator<string, void, unknown> {\n const lines = find.split(\"\\n\").map(l => l.trim());\n const contentLines = content.split(\"\\n\");\n for (let i = 0; i <= contentLines.length - lines.length; i++) {\n if (contentLines.slice(i, i + lines.length).every((cl, idx) => cl.trim() === lines[idx])) {\n yield contentLines.slice(i, i + lines.length).join(\"\\n\");\n }\n }\n}\n\nfunction* blockAnchorReplacer(content: string, find: string): Generator<string, void, unknown> {\n const findLines = find.split(\"\\n\");\n const contentLines = content.split(\"\\n\");\n\n if (findLines.length < 2) return;\n\n const firstLine = findLines[0];\n const lastLine = findLines[findLines.length - 1];\n const middleLines = findLines.slice(1, -1);\n\n for (let i = 0; i <= contentLines.length - findLines.length; i++) {\n if (contentLines[i] !== firstLine) continue;\n const endIdx = i + findLines.length - 1;\n if (contentLines[endIdx] !== lastLine) continue;\n\n const candidates: { idx: number; score: number }[] = [];\n\n for (let j = i + 1; j < endIdx; j++) {\n candidates.push({ idx: j, score: 0 });\n }\n\n let totalScore = 0;\n for (let k = 0; k < middleLines.length; k++) {\n const contentLine = contentLines[i + 1 + k];\n const sim = similarity(middleLines[k], contentLine);\n totalScore += sim;\n if (candidates[k]) candidates[k].score = sim;\n }\n\n const avgScore = totalScore / middleLines.length;\n const threshold = candidates.length > 1 ? 0.3 : 0.0;\n\n if (avgScore >= threshold) {\n yield contentLines.slice(i, i + findLines.length).join(\"\\n\");\n }\n }\n}\n\nfunction* whitespaceNormalizedReplacer(content: string, find: string): Generator<string, void, unknown> {\n const normFind = find.replace(/\\s+/g, \" \").trim();\n if (!normFind) return;\n const normContent = content.replace(/\\s+/g, \" \").trim();\n const idx = normContent.indexOf(normFind);\n if (idx === -1) return;\n\n const firstWord = normFind.split(\" \")[0];\n const lastWord = normFind.split(\" \").filter(Boolean).pop()!;\n const firstIdx = content.indexOf(firstWord);\n const lastIdx = content.lastIndexOf(lastWord);\n if (firstIdx === -1 || lastIdx === -1 || lastIdx < firstIdx) return;\n\n yield content.substring(firstIdx, lastIdx + lastWord.length);\n}\n\nfunction* indentationFlexibleReplacer(content: string, find: string): Generator<string, void, unknown> {\n const lines = find.split(\"\\n\");\n const minIndent = Math.min(...lines.filter(l => l.trim().length > 0).map(l => l.match(/^(\\s*)/)?.[1].length ?? 0));\n const dedented = lines.map(l => l.substring(minIndent)).join(\"\\n\");\n if (content.includes(dedented)) yield dedented;\n}\n\nfunction* escapeNormalizedReplacer(content: string, find: string): Generator<string, void, unknown> {\n const normalized = find\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\'/g, \"'\");\n if (content.includes(normalized)) yield normalized;\n}\n\nfunction* trimmedBoundaryReplacer(content: string, find: string): Generator<string, void, unknown> {\n const trimmed = find.trim();\n if (content.includes(trimmed)) yield trimmed;\n}\n\nfunction* contextAwareReplacer(content: string, find: string): Generator<string, void, unknown> {\n const findLines = find.split(\"\\n\");\n if (findLines.length < 3) return;\n\n const firstLine = findLines[0].trim();\n const lastLine = findLines[findLines.length - 1].trim();\n const contentLines = content.split(\"\\n\");\n\n for (let i = 0; i <= contentLines.length - 3; i++) {\n if (contentLines[i].trim() !== firstLine) continue;\n\n let bestEndIdx = -1;\n let bestScore = 0;\n\n for (let j = i + 2; j < contentLines.length; j++) {\n if (contentLines[j].trim() === lastLine) {\n const middleCount = j - i - 1;\n let matchCount = 0;\n for (let k = 1; k <= middleCount; k++) {\n const fIdx = Math.floor((k / (middleCount + 1)) * (findLines.length - 2));\n if (fIdx >= 0 && fIdx < findLines.length - 2) {\n if (similarity(contentLines[i + k].trim(), findLines[fIdx + 1].trim()) > 0.5) {\n matchCount++;\n }\n }\n }\n const score = matchCount / middleCount;\n if (score > bestScore) {\n bestScore = score;\n bestEndIdx = j;\n }\n }\n }\n\n if (bestEndIdx !== -1 && bestScore > 0.5) {\n yield contentLines.slice(i, bestEndIdx + 1).join(\"\\n\");\n }\n }\n}\n\nconst REPLACERS: ReplacerFn[] = [\n simpleReplacer,\n lineTrimmedReplacer,\n blockAnchorReplacer,\n whitespaceNormalizedReplacer,\n indentationFlexibleReplacer,\n escapeNormalizedReplacer,\n trimmedBoundaryReplacer,\n contextAwareReplacer,\n];\n\nexport function fuzzyReplace(\n content: string,\n oldString: string,\n newString: string,\n replaceAll = false,\n): string {\n for (const replacer of REPLACERS) {\n for (const search of replacer(content, oldString)) {\n const idx = content.indexOf(search);\n if (idx === -1) continue;\n\n if (replaceAll) {\n return content.split(search).join(newString);\n }\n\n const firstIdx = content.indexOf(search);\n const lastIdx = content.lastIndexOf(search);\n if (firstIdx !== lastIdx) continue;\n\n return content.substring(0, firstIdx) + newString + content.substring(firstIdx + search.length);\n }\n }\n\n throw new FuzzyEditError(\"not_found\", `Could not find match for replacement (after 8 fuzzy strategies)`);\n}\n\nexport function fuzzyContains(content: string, find: string): boolean {\n try {\n fuzzyReplace(content, find, \"PLACEHOLDER_CHECK\");\n return true;\n } catch {\n return false;\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\nimport { globToRegExp } from '../utils.js';\n\nconst MAX_RESULTS = 200;\n\nasync function walkDir(dir: string): Promise<string[]> {\n const { walkDir: walk } = await import('../utils.js');\n const entries = await walk(dir);\n return entries.map((e) => e.path);\n}\n\nfunction matchInclude(filePath: string, includePattern?: string): boolean {\n if (!includePattern) return true;\n const base = path.basename(filePath);\n const re = globToRegExp(includePattern);\n return re.test(base);\n}\n\nexport const GlobTool = defineTool({\n name: 'glob',\n description:\n 'Find files matching a glob pattern. Returns matching file paths sorted by modification time.',\n inputSchema: z.object({\n pattern: z.string().describe('Glob pattern (e.g., \"**/*.ts\", \"src/**/*.tsx\")'),\n path: z.string().optional().describe('Directory to search in (default: current directory)'),\n include: z.string().optional().describe('File extension or pattern to include (e.g., \"*.ts\")'),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async ({ pattern, path: searchPath, include }, context) => {\n try {\n const searchDir = searchPath\n ? path.isAbsolute(searchPath)\n ? searchPath\n : path.resolve(context.cwd, searchPath)\n : context.cwd;\n\n const allFiles = await walkDir(searchDir);\n const re = globToRegExp(pattern);\n\n const matched: Array<{ filePath: string; mtimeMs: number }> = [];\n\n for (const filePath of allFiles) {\n const relative = path.relative(searchDir, filePath);\n if (re.test(relative) && matchInclude(relative, include)) {\n try {\n const stat = await fs.stat(filePath);\n matched.push({ filePath: relative, mtimeMs: stat.mtimeMs });\n } catch {\n matched.push({ filePath: relative, mtimeMs: 0 });\n }\n }\n }\n\n matched.sort((a, b) => b.mtimeMs - a.mtimeMs);\n const limited = matched.slice(0, MAX_RESULTS);\n return limited.map((m) => m.filePath).join('\\n');\n } catch (err: unknown) {\n return `Error searching files: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n});\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\nimport { globToRegExp } from '../utils.js';\n\nconst MAX_MATCHES = 200;\n\nasync function walkDir(dir: string): Promise<string[]> {\n const { walkDir: walk } = await import('../utils.js');\n const entries = await walk(dir);\n return entries.map((e) => e.path);\n}\n\nexport const GrepTool = defineTool({\n name: 'grep',\n description:\n 'Search file contents using a regular expression. Returns matching file paths with line numbers.',\n inputSchema: z.object({\n pattern: z.string().describe('Regular expression to search for'),\n path: z.string().optional().describe('Directory to search in'),\n include: z.string().optional().describe('File pattern to include (e.g., \"*.ts\")'),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async ({ pattern, path: searchPath, include }, context) => {\n try {\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch {\n return `Error: Invalid regular expression: ${pattern}`;\n }\n\n const searchDir = searchPath\n ? path.isAbsolute(searchPath)\n ? searchPath\n : path.resolve(context.cwd, searchPath)\n : context.cwd;\n\n const includeRe = include ? globToRegExp(include) : null;\n const allFiles = await walkDir(searchDir);\n const matches: string[] = [];\n\n for (const filePath of allFiles) {\n if (matches.length >= MAX_MATCHES) break;\n\n if (includeRe) {\n const base = path.basename(filePath);\n if (!includeRe.test(base)) continue;\n }\n\n let content: string;\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch {\n continue;\n }\n\n const lines = content.split('\\n');\n const relative = path.relative(searchDir, filePath);\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n if (matches.length >= MAX_MATCHES) break;\n const line = lines[lineIdx];\n if (regex.test(line)) {\n matches.push(`${relative}:${lineIdx + 1}: ${line}`);\n regex.lastIndex = 0;\n } else {\n regex.lastIndex = 0;\n }\n }\n }\n\n if (matches.length === 0) {\n return 'No matches found.';\n }\n\n return matches.join('\\n');\n } catch (err: unknown) {\n return `Error searching files: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n});\n","import { z } from 'zod';\nimport { defineTool } from './tool.js';\n\nconst MAX_RESPONSE_SIZE = 100 * 1024;\n\nexport const WebFetchTool = defineTool({\n name: 'web_fetch',\n description:\n 'Fetch content from a URL. Returns the response body as text. Supports HTTP and HTTPS.',\n inputSchema: z.object({\n url: z.string().url().describe('The URL to fetch'),\n method: z.enum(['GET', 'POST', 'PUT', 'DELETE']).optional().describe('HTTP method (default: GET)'),\n headers: z.record(z.string()).optional().describe('Request headers'),\n body: z.string().optional().describe('Request body (for POST/PUT)'),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async ({ url, method = 'GET', headers, body }, context) => {\n try {\n if (context.abortSignal?.aborted) {\n return 'Request aborted before execution';\n }\n\n const timeoutSignal = AbortSignal.timeout(30_000);\n let signal: AbortSignal;\n if (context.abortSignal) {\n signal = AbortSignal.any([context.abortSignal, timeoutSignal]);\n } else {\n signal = timeoutSignal;\n }\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n signal,\n redirect: 'follow',\n };\n\n if (body && method !== 'GET') {\n fetchOptions.body = body;\n }\n\n const response = await fetch(url, fetchOptions);\n const contentType = response.headers.get('content-type') ?? 'unknown';\n const status = response.status;\n\n const text = await response.text();\n\n let result = `Status: ${status}\\nContent-Type: ${contentType}\\n\\n`;\n if (text.length > MAX_RESPONSE_SIZE) {\n const half = Math.floor(MAX_RESPONSE_SIZE / 2);\n const notice = `\\n\\n... [response truncated: showing first ${half} and last ${half} of ${text.length} characters] ...\\n\\n`;\n result += text.slice(0, half) + notice + text.slice(-half);\n } else {\n result += text;\n }\n\n return result;\n } catch (err: unknown) {\n if (err instanceof Error && err.name === 'AbortError') {\n return 'Request aborted';\n }\n return `Error fetching URL: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n});\n","import type { ModelResponse, ContentBlock, TokenUsage, ProviderConfig } from '../types.js';\nimport type { APIToolDefinition } from '../tools/tool.js';\n\nexport interface Provider {\n readonly model: string;\n chat(request: ChatRequest): Promise<ModelResponse>;\n}\n\nexport interface ChatRequest {\n messages: ChatMessage[];\n tools?: APIToolDefinition[];\n systemPrompt?: string;\n maxOutputTokens?: number;\n temperature?: number;\n abortSignal?: AbortSignal;\n}\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\" | \"tool\";\n content: string | ContentBlock[];\n tool_use_id?: string;\n is_error?: boolean;\n}\n\nexport type { APIToolDefinition } from '../tools/tool.js';\n\nexport class RetryableError extends Error {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = 'RetryableError';\n this.cause = cause;\n }\n}\n\nexport abstract class BaseProvider implements Provider {\n readonly model: string;\n readonly maxOutputTokens?: number;\n readonly temperature?: number;\n\n constructor(config: ProviderConfig) {\n this.model = config.model;\n this.maxOutputTokens = config.maxOutputTokens;\n this.temperature = config.temperature;\n }\n\n abstract chat(request: ChatRequest): Promise<ModelResponse>;\n\n protected abstract mapMessages(messages: ChatMessage[]): unknown[];\n\n protected abstract mapTools(tools?: APIToolDefinition[]): unknown[] | undefined;\n\n protected abstract mapUsage(providerUsage: unknown): TokenUsage;\n\n protected mapStopReason(reason: string): ModelResponse[\"stopReason\"] {\n switch (reason) {\n case 'end_turn':\n case 'stop':\n return 'end_turn';\n case 'tool_use':\n case 'tool_calls':\n return 'tool_use';\n case 'max_tokens':\n case 'length':\n return 'max_tokens';\n case 'stop_sequence':\n return 'stop_sequence';\n default:\n return 'end_turn';\n }\n }\n}\n","import type { ModelResponse, ContentBlock, TextBlock, ToolUseBlock, ThinkingBlock, TokenUsage, ProviderConfig } from '../types.js';\nimport type { ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nimport { BaseProvider, RetryableError } from './provider.js';\n\nexport interface AnthropicProviderConfig extends ProviderConfig {\n apiKey: string;\n baseURL?: string;\n dangerouslySkipAuth?: boolean;\n enableCaching?: boolean;\n}\n\nexport class AnthropicProvider extends BaseProvider {\n private readonly apiKey: string;\n private readonly baseURL?: string;\n private readonly dangerouslySkipAuth?: boolean;\n private readonly enableCaching: boolean;\n private client: any = null;\n\n constructor(config: AnthropicProviderConfig) {\n super(config);\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL;\n this.dangerouslySkipAuth = config.dangerouslySkipAuth;\n this.enableCaching = config.enableCaching ?? false;\n }\n\n async chat(request: ChatRequest): Promise<ModelResponse> {\n const AnthropicSDK = (await import('@anthropic-ai/sdk')).default;\n\n if (!this.client) {\n const opts: Record<string, unknown> = { apiKey: this.apiKey };\n if (this.baseURL) opts.baseURL = this.baseURL;\n if (this.dangerouslySkipAuth) opts.dangerouslySkipAuth = true;\n this.client = new AnthropicSDK(opts);\n }\n\n const messages = this.mapMessages(request.messages);\n const tools = this.mapTools(request.tools);\n const maxTokens = request.maxOutputTokens ?? this.maxOutputTokens ?? 4096;\n const temperature = request.temperature ?? this.temperature;\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: maxTokens,\n messages,\n };\n\n if (request.systemPrompt) {\n if (this.enableCaching) {\n body.system = [\n { type: \"text\", text: request.systemPrompt, cache_control: { type: \"ephemeral\" } },\n ];\n } else {\n body.system = request.systemPrompt;\n }\n }\n if (tools) body.tools = tools;\n if (temperature !== undefined) body.temperature = temperature;\n\n const reqOptions: Record<string, unknown> = {};\n if (request.abortSignal) reqOptions.signal = request.abortSignal;\n\n let response: any;\n try {\n response = await this.client.messages.create(body, reqOptions);\n } catch (err: unknown) {\n const status = (err as any)?.status;\n const code = (err as any)?.code;\n const isNetwork =\n err instanceof TypeError ||\n (typeof code === 'string' &&\n ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ETIMEDOUT'].includes(code));\n\n if (status === 429 || status === 529 || isNetwork) {\n throw new RetryableError(\n err instanceof Error ? err.message : String(err),\n err instanceof Error ? err : undefined,\n );\n }\n throw new Error(\n `Anthropic API error: ${err instanceof Error ? err.message : String(err)}`,\n err instanceof Error ? { cause: err } : undefined,\n );\n }\n\n const content: ContentBlock[] = [];\n for (const block of response.content) {\n if (block.type === 'text') {\n content.push({ type: 'text', text: block.text } as TextBlock);\n } else if (block.type === 'tool_use') {\n content.push({ type: 'tool_use', id: block.id, name: block.name, input: block.input } as ToolUseBlock);\n } else if (block.type === 'thinking') {\n content.push({ type: 'thinking', thinking: block.thinking } as ThinkingBlock);\n }\n }\n\n return {\n content,\n usage: this.mapUsage(response.usage),\n stopReason: this.mapStopReason(response.stop_reason),\n };\n }\n\n protected mapMessages(messages: ChatMessage[]): unknown[] {\n return messages.map((msg) => {\n if (msg.role === 'tool') {\n const textContent =\n typeof msg.content === 'string'\n ? msg.content\n : msg.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('\\n');\n\n return {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: msg.tool_use_id ?? '',\n content: textContent,\n ...(msg.is_error ? { is_error: true } : {}),\n },\n ],\n };\n }\n\n if (msg.role === 'assistant') {\n const content =\n typeof msg.content === 'string'\n ? [{ type: 'text', text: msg.content }]\n : msg.content.map((block) => this.mapOutgoingBlock(block));\n return { role: 'assistant', content };\n }\n\n if (typeof msg.content === 'string') {\n return { role: 'user', content: msg.content };\n }\n\n return {\n role: 'user',\n content: msg.content.map((block) => this.mapOutgoingBlock(block)),\n };\n });\n }\n\n protected mapTools(tools?: APIToolDefinition[]): unknown[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.input_schema,\n type: 'tool',\n }));\n }\n\n protected mapUsage(providerUsage: unknown): TokenUsage {\n const u = providerUsage as {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n return {\n inputTokens: u.input_tokens,\n outputTokens: u.output_tokens,\n cacheReadTokens: u.cache_read_input_tokens,\n cacheWriteTokens: u.cache_creation_input_tokens,\n };\n }\n\n private mapOutgoingBlock(block: ContentBlock): Record<string, unknown> {\n switch (block.type) {\n case 'text':\n return { type: 'text', text: block.text };\n case 'tool_use':\n return { type: 'tool_use', id: block.id, name: block.name, input: block.input };\n case 'thinking':\n return { type: 'thinking', thinking: block.thinking };\n default:\n return { type: 'text', text: '' };\n }\n }\n}\n","import type { ModelResponse, ContentBlock, TextBlock, ToolUseBlock, TokenUsage, ProviderConfig } from '../types.js';\nimport type { ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nimport { BaseProvider, RetryableError } from './provider.js';\n\nexport interface OpenAIProviderConfig extends ProviderConfig {\n apiKey: string;\n baseURL?: string;\n organization?: string;\n}\n\nexport class OpenAIProvider extends BaseProvider {\n private readonly apiKey: string;\n private readonly baseURL?: string;\n private readonly organization?: string;\n private client: any = null;\n\n constructor(config: OpenAIProviderConfig) {\n super(config);\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL;\n this.organization = config.organization;\n }\n\n async chat(request: ChatRequest): Promise<ModelResponse> {\n const OpenAI = (await import('openai')).default;\n\n if (!this.client) {\n const opts: Record<string, unknown> = { apiKey: this.apiKey };\n if (this.baseURL) opts.baseURL = this.baseURL;\n if (this.organization) opts.organization = this.organization;\n this.client = new OpenAI(opts);\n }\n\n const mappedMessages = this.mapMessages(request.messages);\n const messages: unknown[] = [];\n if (request.systemPrompt) {\n messages.push({ role: 'system', content: request.systemPrompt });\n }\n messages.push(...mappedMessages);\n\n const tools = this.mapTools(request.tools);\n const maxTokens = request.maxOutputTokens ?? this.maxOutputTokens;\n const temperature = request.temperature ?? this.temperature;\n\n const body: Record<string, unknown> = {\n model: this.model,\n messages,\n stream: false,\n };\n\n if (tools) body.tools = tools;\n if (maxTokens !== undefined) body.max_tokens = maxTokens;\n if (temperature !== undefined) body.temperature = temperature;\n\n const reqOptions: Record<string, unknown> = {};\n if (request.abortSignal) reqOptions.signal = request.abortSignal;\n\n let response: any;\n try {\n response = await this.client.chat.completions.create(body, reqOptions);\n } catch (err: unknown) {\n const status = (err as any)?.status;\n const code = (err as any)?.code;\n const isNetwork =\n err instanceof TypeError ||\n (typeof code === 'string' &&\n ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ETIMEDOUT'].includes(code));\n\n if (status === 429 || isNetwork) {\n throw new RetryableError(\n err instanceof Error ? err.message : String(err),\n err instanceof Error ? err : undefined,\n );\n }\n throw new Error(\n `OpenAI API error: ${err instanceof Error ? err.message : String(err)}`,\n err instanceof Error ? { cause: err } : undefined,\n );\n }\n\n const choice = response.choices[0];\n const content: ContentBlock[] = [];\n\n if (choice.message.content) {\n content.push({ type: 'text', text: choice.message.content } as TextBlock);\n }\n\n if (choice.message.tool_calls) {\n for (const tc of choice.message.tool_calls) {\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {}\n content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.function.name,\n input,\n } as ToolUseBlock);\n }\n }\n\n return {\n content,\n usage: this.mapUsage(response.usage),\n stopReason: this.mapStopReason(choice.finish_reason),\n };\n }\n\n protected mapMessages(messages: ChatMessage[]): unknown[] {\n return messages.map((msg) => {\n if (msg.role === 'tool') {\n return {\n role: 'tool',\n tool_call_id: msg.tool_use_id ?? '',\n content:\n typeof msg.content === 'string'\n ? msg.content\n : msg.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('\\n'),\n };\n }\n\n if (msg.role === 'assistant') {\n if (typeof msg.content === 'string') {\n return { role: 'assistant', content: msg.content };\n }\n\n const textParts = msg.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('');\n const toolCalls = msg.content\n .filter((b): b is ToolUseBlock => b.type === 'tool_use')\n .map((b) => ({\n id: b.id,\n type: 'function' as const,\n function: { name: b.name, arguments: JSON.stringify(b.input) },\n }));\n\n return {\n role: 'assistant',\n content: textParts || null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n };\n }\n\n return {\n role: 'user',\n content:\n typeof msg.content === 'string'\n ? msg.content\n : msg.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('\\n'),\n };\n });\n }\n\n protected mapTools(tools?: APIToolDefinition[]): unknown[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.input_schema,\n },\n }));\n }\n\n protected mapUsage(providerUsage: unknown): TokenUsage {\n const u = providerUsage as {\n prompt_tokens: number;\n completion_tokens: number;\n prompt_tokens_details?: { cached_tokens?: number };\n };\n return {\n inputTokens: u.prompt_tokens,\n outputTokens: u.completion_tokens,\n cacheReadTokens: u.prompt_tokens_details?.cached_tokens,\n };\n }\n}\n","import type { Provider, ChatRequest } from \"./provider.js\";\nimport { RetryableError } from \"./provider.js\";\nimport type { ModelResponse, ContentBlock } from \"../types.js\";\nimport type { APIToolDefinition } from \"../tools/tool.js\";\n\nexport interface OllamaProviderConfig {\n model: string;\n baseURL?: string;\n}\n\nexport class OllamaProvider implements Provider {\n readonly model: string;\n private readonly baseURL: string;\n\n constructor(config: OllamaProviderConfig) {\n this.model = config.model;\n this.baseURL = config.baseURL ?? \"http://localhost:11434/v1\";\n }\n\n async chat(request: ChatRequest): Promise<ModelResponse> {\n const messages: any[] = [];\n\n if (request.systemPrompt) {\n messages.push({ role: \"system\", content: request.systemPrompt });\n }\n\n for (const m of request.messages) {\n if (m.role === \"tool\") {\n messages.push({\n role: \"tool\" as const,\n tool_call_id: m.tool_use_id,\n content: m.content,\n });\n continue;\n }\n if (m.role === \"assistant\" && Array.isArray(m.content)) {\n const textParts = (m.content as ContentBlock[]).filter(b => b.type === \"text\");\n const toolParts = (m.content as ContentBlock[]).filter(b => b.type === \"tool_use\");\n\n const msg: any = {};\n if (textParts.length > 0) {\n msg.content = textParts.map(p => (p as { text: string }).text).join(\"\");\n }\n if (toolParts.length > 0) {\n msg.tool_calls = toolParts.map(b => {\n const tb = b as { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> };\n return {\n id: tb.id,\n type: \"function\",\n function: { name: tb.name, arguments: JSON.stringify(tb.input) },\n };\n });\n }\n msg.role = \"assistant\";\n messages.push(msg);\n continue;\n }\n messages.push({ role: m.role, content: m.content });\n }\n\n const body: any = {\n model: this.model,\n messages,\n stream: false,\n };\n\n if (request.maxOutputTokens) {\n body.max_tokens = request.maxOutputTokens;\n }\n\n if (request.tools?.length) {\n body.tools = request.tools.map(t => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n },\n }));\n }\n\n let response;\n try {\n response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: request.abortSignal,\n });\n } catch (err) {\n if (err instanceof RetryableError) throw err;\n throw new RetryableError(\n `Ollama connection failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n if (!response.ok) {\n const text = await response.text();\n if (response.status === 429 || response.status === 503 || response.status === 529) {\n throw new RetryableError(`Ollama API error ${response.status}: ${text.slice(0, 200)}`);\n }\n throw new Error(`Ollama API error ${response.status}: ${text.slice(0, 200)}`);\n }\n\n const data = await response.json();\n const choice = data.choices?.[0];\n if (!choice) {\n throw new Error(\"Ollama returned no choices\");\n }\n\n const content: any[] = [];\n let stopReason: ModelResponse[\"stopReason\"] = \"end_turn\";\n\n if (choice.message?.content) {\n let text = choice.message.content;\n text = text.replace(/<think[^>]*>[\\s\\S]*?<\\/think>/gi, \"\").trim();\n text = text.replace(/<thinking>[\\s\\S]*?<\\/thinking>/gi, \"\").trim();\n text = text.replace(/\\[Thinking[^\\]]*\\]/gi, \"\").trim();\n if (text.length > 0) {\n content.push({ type: \"text\" as const, text });\n }\n }\n\n if (choice.message?.tool_calls?.length) {\n stopReason = \"tool_use\";\n for (const tc of choice.message.tool_calls) {\n let input: Record<string, unknown>;\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {\n input = {};\n }\n content.push({\n type: \"tool_use\" as const,\n id: tc.id,\n name: tc.function.name,\n input,\n });\n }\n }\n\n return {\n content,\n stopReason,\n usage: {\n inputTokens: data.usage?.prompt_tokens ?? 0,\n outputTokens: data.usage?.completion_tokens ?? 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n },\n };\n }\n}\n","import type { Provider, ChatRequest, ChatMessage } from \"./provider.js\";\nimport { RetryableError } from \"./provider.js\";\nimport type { ModelResponse, ContentBlock, TokenUsage } from \"../types.js\";\n\nexport interface ClusterSlot {\n model: string;\n role: \"planner\" | \"worker\" | \"reviewer\" | \"drafter\";\n baseURL?: string;\n maxTokens?: number;\n temperature?: number;\n}\n\nexport interface ClusterConfig {\n slots: ClusterSlot[];\n baseURL?: string;\n timeoutMs?: number;\n strategy?: \"auto\" | \"draft-verify\" | \"debate\" | \"majority\" | \"single\";\n draftCount?: number;\n debateRounds?: number;\n}\n\ninterface CallResult {\n content: string;\n usage: TokenUsage;\n stopReason: ModelResponse[\"stopReason\"];\n model: string;\n durationMs: number;\n}\n\ntype Complexity = \"simple\" | \"medium\" | \"complex\";\n\nconst DEFAULT_BASE = \"http://localhost:11434/v1\";\n\nfunction defaultCluster(baseURL?: string): ClusterSlot[] {\n const url = baseURL || DEFAULT_BASE;\n return [\n { model: \"gemma4:31b\", role: \"planner\", baseURL: url, temperature: 0.3 },\n { model: \"gemma4:26b\", role: \"worker\", baseURL: url, temperature: 0.3 },\n { model: \"gemma4:26b\", role: \"worker\", baseURL: url, temperature: 0.35 },\n { model: \"gemma4:26b\", role: \"reviewer\", baseURL: url, temperature: 0.3 },\n { model: \"gemma4:e4b\", role: \"drafter\", baseURL: url, temperature: 0.3 },\n ];\n}\n\nfunction classifyComplexity(messages: ChatMessage[], hasTools: boolean): Complexity {\n let totalTokens = 0;\n let turns = messages.length;\n let hasToolResults = false;\n let hasCode = false;\n let hasErrors = false;\n\n for (const m of messages) {\n const text = typeof m.content === \"string\" ? m.content : JSON.stringify(m.content);\n totalTokens += text.length / 4;\n if (m.role === \"tool\") hasToolResults = true;\n if (text.includes(\"```\") || text.includes(\"function \") || text.includes(\"class \")) hasCode = true;\n if (text.includes(\"error\") || text.includes(\"Error\") || text.includes(\"FAIL\")) hasErrors = true;\n }\n\n if (totalTokens > 10000 || (hasToolResults && hasErrors)) return \"complex\";\n if (totalTokens > 2000 || hasTools || hasCode || hasErrors || turns > 4) return \"medium\";\n return \"simple\";\n}\n\nfunction selectSlots(config: ClusterConfig, complexity: Complexity): { planner?: ClusterSlot; workers: ClusterSlot[]; reviewers: ClusterSlot[]; drafters?: ClusterSlot } {\n const planners = config.slots.filter(s => s.role === \"planner\");\n const workers = config.slots.filter(s => s.role === \"worker\");\n const reviewers = config.slots.filter(s => s.role === \"reviewer\");\n const drafters = config.slots.filter(s => s.role === \"drafter\");\n\n switch (complexity) {\n case \"complex\":\n return { planner: planners[0], workers, reviewers, drafters: drafters[0] };\n case \"medium\":\n return { planner: planners[0], workers: workers.slice(0, 1), reviewers: reviewers.slice(0, 1), drafters: drafters[0] };\n case \"simple\":\n default:\n return { planner: planners[0], workers: workers.slice(0, 1), reviewers: reviewers.slice(0, 1), drafters: drafters[0] };\n }\n}\n\nasync function callModel(slot: ClusterSlot, request: ChatRequest, baseURL: string, timeoutMs: number, extraOpts?: Record<string, unknown>): Promise<CallResult> {\n const url = (slot.baseURL || baseURL) + \"/chat/completions\";\n const messages: any[] = [];\n\n if (request.systemPrompt) {\n messages.push({ role: \"system\", content: request.systemPrompt });\n }\n\n for (const m of request.messages) {\n if (m.role === \"tool\") {\n messages.push({ role: \"tool\", tool_call_id: m.tool_use_id, content: m.content });\n continue;\n }\n if (m.role === \"assistant\" && Array.isArray(m.content)) {\n const textParts = (m.content as ContentBlock[]).filter(b => b.type === \"text\");\n const toolParts = (m.content as ContentBlock[]).filter(b => b.type === \"tool_use\");\n const msg: any = {};\n if (textParts.length) msg.content = textParts.map(p => (p as { text: string }).text).join(\"\");\n if (toolParts.length) {\n msg.tool_calls = toolParts.map(b => {\n const tb = b as { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> };\n return { id: tb.id, type: \"function\", function: { name: tb.name, arguments: JSON.stringify(tb.input) } };\n });\n }\n msg.role = \"assistant\";\n messages.push(msg);\n continue;\n }\n messages.push({ role: m.role, content: m.content });\n }\n\n const body: any = {\n model: slot.model,\n messages,\n stream: false,\n options: {\n num_predict: request.maxOutputTokens || slot.maxTokens || 4096,\n temperature: request.temperature ?? slot.temperature ?? 0.3,\n top_p: 0.95,\n top_k: 64,\n },\n ...extraOpts,\n };\n\n if (request.tools?.length) {\n body.tools = request.tools.map(t => ({\n type: \"function\",\n function: { name: t.name, description: t.description, parameters: t.input_schema },\n }));\n }\n\n const start = Date.now();\n let response;\n try {\n response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (err) {\n if (err instanceof RetryableError) throw err;\n throw new RetryableError(`Cluster slot ${slot.model} connection failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n if (!response.ok) {\n const text = await response.text();\n if (response.status === 429 || response.status === 503 || response.status === 529) {\n throw new RetryableError(`Cluster slot ${slot.model} rate limited: ${response.status}`);\n }\n throw new Error(`Cluster slot ${slot.model} error ${response.status}: ${text.slice(0, 200)}`);\n }\n\n const data = await response.json();\n const choice = data.choices?.[0];\n if (!choice) throw new Error(`Cluster slot ${slot.model} returned no choices`);\n\n let text = choice.message?.content || \"\";\n text = text.replace(/<think[^>]*>[\\s\\S]*?<\\/think>/gi, \"\").trim();\n text = text.replace(/<thinking>[\\s\\S]*?<\\/thinking>/gi, \"\").trim();\n text = text.replace(/<channel>thought[\\s\\S]*?<channel|>/gi, \"\").trim();\n text = text.replace(/\\[Thinking[^\\]]*\\]/gi, \"\").trim();\n\n return {\n content: text,\n usage: {\n inputTokens: data.usage?.prompt_tokens ?? 0,\n outputTokens: data.usage?.completion_tokens ?? 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n },\n stopReason: choice.finish_reason === \"tool_calls\" ? \"tool_use\" : \"end_turn\",\n model: slot.model,\n durationMs: Date.now() - start,\n };\n}\n\nfunction mergeUsage(...usages: TokenUsage[]): TokenUsage {\n return {\n inputTokens: usages.reduce((s, u) => s + u.inputTokens, 0),\n outputTokens: usages.reduce((s, u) => s + u.outputTokens, 0),\n cacheReadTokens: usages.reduce((s, u) => s + (u.cacheReadTokens || 0), 0),\n cacheWriteTokens: usages.reduce((s, u) => s + (u.cacheWriteTokens || 0), 0),\n };\n}\n\nexport class ClusterProvider implements Provider {\n readonly model: string;\n private config: ClusterConfig;\n private stats: { calls: number; tokensIn: number; tokensOut: number; byModel: Record<string, number> };\n\n constructor(config?: Partial<ClusterConfig>) {\n this.config = {\n baseURL: DEFAULT_BASE,\n timeoutMs: 180_000,\n strategy: \"auto\",\n draftCount: 1,\n debateRounds: 1,\n slots: defaultCluster(config?.baseURL),\n ...config,\n };\n const models = [...new Set(this.config.slots.map(s => s.model))];\n this.model = `cluster[${models.join(\",\")}]`;\n this.stats = { calls: 0, tokensIn: 0, tokensOut: 0, byModel: {} };\n for (const m of models) this.stats.byModel[m] = 0;\n }\n\n getStats() { return { ...this.stats }; }\n\n async chat(request: ChatRequest): Promise<ModelResponse> {\n const strategy = this.config.strategy || \"auto\";\n const complexity = strategy === \"auto\" ? classifyComplexity(request.messages, !!request.tools?.length) : \"medium\";\n\n let result: CallResult;\n switch (strategy === \"auto\" ? complexity : \"simple\") {\n case \"simple\":\n result = await this.speculative(request);\n break;\n case \"complex\":\n result = await this.debate(request);\n break;\n default:\n result = await this.draftVerify(request);\n break;\n }\n\n const content: ContentBlock[] = [];\n if (result.content) {\n content.push({ type: \"text\", text: result.content });\n }\n\n return {\n content,\n stopReason: result.stopReason,\n usage: result.usage,\n };\n }\n\n private async speculative(request: ChatRequest): Promise<CallResult> {\n const slots = selectSlots(this.config, \"simple\");\n const drafter = slots.drafters;\n const worker = slots.workers[0];\n\n if (!drafter || !worker) {\n return this.fallback(request);\n }\n\n const draft = await this.safeCall(drafter, request, { num_predict: (request.maxOutputTokens || 4096) });\n\n if (!draft || draft.content.length < 20) {\n const fb = await this.safeCall(worker, request);\n return fb || this.fallback(request);\n }\n\n const verifyMessages: ChatMessage[] = [\n ...request.messages.slice(0, -1),\n { role: \"user\" as const, content: `${typeof request.messages[request.messages.length - 1].content === \"string\" ? request.messages[request.messages.length - 1].content : \"\"}\\n\\nHere is a draft response. Review it. If it is correct and complete, return exactly the same text. If it has errors, fix them. Return ONLY the final corrected text, nothing else.\\n\\nDRAFT:\\n${draft.content.slice(0, 8000)}` },\n ];\n\n const verifyRequest: ChatRequest = { ...request, messages: verifyMessages };\n const verified = await this.safeCall(worker, verifyRequest);\n\n if (!verified) return { ...draft, model: this.model };\n\n const similarity = jaccardSimilarity(draft.content, verified.content);\n if (similarity > 0.7) {\n return { ...draft, usage: mergeUsage(draft.usage) };\n }\n\n return { ...verified, usage: mergeUsage(draft.usage, verified.usage) };\n }\n\n private async draftVerify(request: ChatRequest): Promise<CallResult> {\n const slots = selectSlots(this.config, \"medium\");\n const worker = slots.workers[0];\n const reviewer = slots.reviewers[0];\n\n if (!worker) return this.fallback(request);\n\n const primary = await this.safeCall(worker, request);\n if (!primary) return this.fallback(request);\n\n if (!reviewer || primary.content.length < 50) {\n return primary;\n }\n\n const reviewMessages: ChatMessage[] = [\n { role: \"user\" as const, content: `Review this response for correctness. Fix any errors. Return ONLY the corrected text.\\n\\nORIGINAL REQUEST:\\n${typeof request.messages[request.messages.length - 1].content === \"string\" ? request.messages[request.messages.length - 1].content : \"\"}\\n\\nRESPONSE TO REVIEW:\\n${primary.content.slice(0, 6000)}` },\n ];\n\n const reviewed = await this.safeCall(reviewer, { ...request, messages: reviewMessages, maxOutputTokens: request.maxOutputTokens });\n if (!reviewed) return primary;\n\n return { ...reviewed, usage: mergeUsage(primary.usage, reviewed.usage) };\n }\n\n private async debate(request: ChatRequest): Promise<CallResult> {\n const slots = selectSlots(this.config, \"complex\");\n const workers = slots.workers;\n const planner = slots.planner;\n\n if (!workers.length) return this.fallback(request);\n\n const roundRounds = this.config.debateRounds || 1;\n let currentContent = \"\";\n\n for (let round = 0; round < roundRounds; round++) {\n const workerSlot = workers[round % workers.length];\n const implMessages: ChatMessage[] = round === 0\n ? request.messages\n : [\n ...request.messages.slice(0, -1),\n {\n role: \"user\" as const,\n content: `${typeof request.messages[request.messages.length - 1].content === \"string\" ? request.messages[request.messages.length - 1].content : \"\"}\\n\\nPREVIOUS ATTEMPT (Round ${round}):\\n${currentContent.slice(0, 4000)}\\n\\nImprove this. Fix any issues.`,\n },\n ];\n\n const impl = await this.safeCall(workerSlot, { ...request, messages: implMessages });\n if (!impl) continue;\n currentContent = impl.content;\n }\n\n if (!currentContent) return this.fallback(request);\n\n if (planner && workers.length > 1) {\n const candidates: CallResult[] = [];\n for (const w of workers) {\n const c = await this.safeCall(w, request);\n if (c && c.content.length > 30) candidates.push(c);\n }\n\n if (candidates.length > 1) {\n const best = candidates.sort((a, b) => b.content.length - a.content.length)[0];\n const arbMessages: ChatMessage[] = [\n {\n role: \"user\" as const,\n content: `Select the best response or synthesize a better one. Return ONLY the final text.\\n\\nTASK:\\n${typeof request.messages[request.messages.length - 1].content === \"string\" ? request.messages[request.messages.length - 1].content : \"\"}\\n\\nCANDIDATES:\\n${candidates.map((c, i) => `--- Candidate ${i + 1} (${c.model}) ---\\n${c.content.slice(0, 3000)}`).join(\"\\n\\n\")}`,\n },\n ];\n\n const arbitrated = await this.safeCall(planner, { ...request, messages: arbMessages, maxOutputTokens: request.maxOutputTokens });\n if (arbitrated && arbitrated.content.length > 20) {\n const allUsages = candidates.map(c => c.usage).concat(arbitrated.usage);\n return { ...arbitrated, usage: mergeUsage(...allUsages) };\n }\n }\n }\n\n return {\n content: currentContent,\n usage: { inputTokens: 0, outputTokens: 0 },\n stopReason: \"end_turn\",\n model: this.model,\n durationMs: 0,\n };\n }\n\n private async safeCall(slot: ClusterSlot, request: ChatRequest, extraOpts?: Record<string, unknown>): Promise<CallResult | null> {\n try {\n const result = await callModel(slot, request, this.config.baseURL || DEFAULT_BASE, this.config.timeoutMs || 180_000, extraOpts);\n this.stats.calls++;\n this.stats.tokensIn += result.usage.inputTokens;\n this.stats.tokensOut += result.usage.outputTokens;\n this.stats.byModel[slot.model] = (this.stats.byModel[slot.model] || 0) + 1;\n return result;\n } catch (e) {\n return null;\n }\n }\n\n private async fallback(request: ChatRequest): Promise<CallResult> {\n const anySlot = this.config.slots[0];\n const result = await callModel(anySlot, request, this.config.baseURL || DEFAULT_BASE, this.config.timeoutMs || 180_000);\n this.stats.calls++;\n this.stats.tokensIn += result.usage.inputTokens;\n this.stats.tokensOut += result.usage.outputTokens;\n this.stats.byModel[anySlot.model] = (this.stats.byModel[anySlot.model] || 0) + 1;\n return result;\n }\n}\n\nfunction jaccardSimilarity(a: string, b: string): number {\n const aWords = new Set(a.toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n const bWords = new Set(b.toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n if (aWords.size === 0 && bWords.size === 0) return 1;\n const intersection = [...aWords].filter(w => bWords.has(w)).length;\n const union = new Set([...aWords, ...bWords]).size;\n return union > 0 ? intersection / union : 0;\n}\n","import type { ModelResponse } from '../types.js';\nimport { BaseProvider, RetryableError } from './provider.js';\nimport type { Provider, ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nimport { AnthropicProvider } from './anthropic.js';\nimport type { AnthropicProviderConfig } from './anthropic.js';\nimport { OpenAIProvider } from './openai.js';\nimport type { OpenAIProviderConfig } from './openai.js';\nimport { OllamaProvider } from './ollama.js';\nimport type { OllamaProviderConfig } from './ollama.js';\nimport { ClusterProvider } from './cluster.js';\nimport type { ClusterConfig, ClusterSlot } from './cluster.js';\n\nexport { BaseProvider, RetryableError } from './provider.js';\nexport type { Provider, ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nexport { AnthropicProvider } from './anthropic.js';\nexport type { AnthropicProviderConfig } from './anthropic.js';\nexport { OpenAIProvider } from './openai.js';\nexport type { OpenAIProviderConfig } from './openai.js';\nexport { OllamaProvider } from './ollama.js';\nexport type { OllamaProviderConfig } from './ollama.js';\nexport { ClusterProvider } from './cluster.js';\nexport type { ClusterConfig, ClusterSlot } from './cluster.js';\n\nexport function anthropic(config: AnthropicProviderConfig): AnthropicProvider {\n return new AnthropicProvider(config);\n}\n\nexport function openai(config: OpenAIProviderConfig): OpenAIProvider {\n return new OpenAIProvider(config);\n}\n\nexport function ollama(config: OllamaProviderConfig): OllamaProvider {\n return new OllamaProvider(config);\n}\n\nexport function cluster(config?: Partial<ClusterConfig>): ClusterProvider {\n return new ClusterProvider(config);\n}\n\nexport interface CustomProviderConfig {\n provider: 'custom';\n model: string;\n chat: (request: ChatRequest) => Promise<ModelResponse>;\n}\n\nclass CustomProvider implements Provider {\n readonly model: string;\n private readonly chatFn: (request: ChatRequest) => Promise<ModelResponse>;\n\n constructor(config: CustomProviderConfig) {\n this.model = config.model;\n this.chatFn = config.chat;\n }\n\n chat(request: ChatRequest): Promise<ModelResponse> {\n return this.chatFn(request);\n }\n}\n\nexport type OllamaProviderConfigWithProvider = OllamaProviderConfig & { provider: 'ollama' };\n\nexport function createProvider(\n config:\n | (AnthropicProviderConfig & { provider: 'anthropic' })\n | (OpenAIProviderConfig & { provider: 'openai' })\n | OllamaProviderConfigWithProvider\n | CustomProviderConfig,\n): Provider {\n switch (config.provider) {\n case 'anthropic':\n return new AnthropicProvider(config);\n case 'openai':\n return new OpenAIProvider(config);\n case 'ollama':\n return new OllamaProvider(config);\n case 'custom':\n return new CustomProvider(config);\n }\n}\n","import type { TokenUsage } from \"./types.js\";\n\nexport interface StreamEvent {\n type: \"text_delta\" | \"tool_use_start\" | \"tool_use_delta\" | \"tool_result\" | \"done\" | \"error\";\n text?: string;\n id?: string;\n name?: string;\n input?: string;\n output?: string;\n usage?: TokenUsage;\n error?: Error;\n}\n\nexport function createStreamAggregator() {\n let text = \"\";\n const toolCalls: Map<string, { id: string; name: string; input: string }> = new Map();\n let usage: TokenUsage | undefined;\n let stopReason: \"end_turn\" | \"tool_use\" | \"max_tokens\" = \"end_turn\";\n\n function push(event: StreamEvent): void {\n switch (event.type) {\n case \"text_delta\":\n text += event.text ?? \"\";\n break;\n case \"tool_use_start\":\n if (event.id) {\n toolCalls.set(event.id, { id: event.id, name: event.name ?? \"\", input: event.input ?? \"\" });\n }\n stopReason = \"tool_use\";\n break;\n case \"tool_use_delta\":\n if (event.id && toolCalls.has(event.id)) {\n toolCalls.get(event.id)!.input += event.input ?? \"\";\n }\n break;\n case \"done\":\n usage = event.usage;\n break;\n case \"tool_result\":\n break;\n case \"error\":\n break;\n }\n }\n\n function getResponse(): {\n text: string;\n toolCalls: { id: string; name: string; input: string }[];\n usage?: TokenUsage;\n stopReason: string;\n } {\n return { text, toolCalls: Array.from(toolCalls.values()), usage, stopReason };\n }\n\n return { push, getResponse };\n}\n","import type { Message } from \"../types.js\";\n\nexport interface MemoryStore {\n getThread(threadId: string): Promise<Message[]>;\n saveThread(threadId: string, messages: Message[]): Promise<void>;\n appendMessage(threadId: string, message: Message): Promise<void>;\n listThreads(opts?: { limit?: number; before?: string }): Promise<Array<{ id: string; updatedAt: number; messageCount: number }>>;\n deleteThread(threadId: string): Promise<void>;\n}\n\nexport class InMemoryStore implements MemoryStore {\n private threads: Map<string, { messages: Message[]; updatedAt: number }> = new Map();\n\n async getThread(threadId: string): Promise<Message[]> {\n return this.threads.get(threadId)?.messages ?? [];\n }\n\n async saveThread(threadId: string, messages: Message[]): Promise<void> {\n this.threads.set(threadId, { messages, updatedAt: Date.now() });\n }\n\n async appendMessage(threadId: string, message: Message): Promise<void> {\n const thread = this.threads.get(threadId);\n if (thread) {\n thread.messages.push(message);\n thread.updatedAt = Date.now();\n } else {\n this.threads.set(threadId, { messages: [message], updatedAt: Date.now() });\n }\n }\n\n async listThreads(opts?: { limit?: number; before?: string }): Promise<Array<{ id: string; updatedAt: number; messageCount: number }>> {\n let entries = Array.from(this.threads.entries())\n .map(([id, data]) => ({ id, updatedAt: data.updatedAt, messageCount: data.messages.length }))\n .sort((a, b) => b.updatedAt - a.updatedAt);\n if (opts?.before) entries = entries.filter(e => e.updatedAt < parseInt(opts.before as string, 10));\n return entries.slice(0, opts?.limit ?? 100);\n }\n\n async deleteThread(threadId: string): Promise<void> {\n this.threads.delete(threadId);\n }\n}\n","import type { MemoryStore } from \"./store.js\";\nimport type { Message } from \"../types.js\";\nimport { InMemoryStore } from \"./store.js\";\n\nfunction jsonSerialize(messages: Message[]): string {\n return JSON.stringify(messages, (_, value) => {\n if (value === undefined) return \"__UNDEFINED__\";\n return value;\n });\n}\n\nfunction jsonDeserialize(str: string): Message[] {\n return JSON.parse(str, (_, value) => {\n if (value === \"__UNDEFINED__\") return undefined;\n return value;\n });\n}\n\nexport class SQLiteStore implements MemoryStore {\n private store: MemoryStore;\n\n constructor(dbPath?: string) {\n try {\n const Database = require(\"better-sqlite3\");\n const db = new Database(dbPath ?? \"./synth-memory.db\");\n db.pragma(\"journal_mode = WAL\");\n db.exec(`\n CREATE TABLE IF NOT EXISTS threads (\n id TEXT PRIMARY KEY,\n messages TEXT NOT NULL,\n updated_at INTEGER NOT NULL,\n message_count INTEGER NOT NULL DEFAULT 0\n )\n `);\n try {\n db.exec(\"ALTER TABLE threads ADD COLUMN message_count INTEGER NOT NULL DEFAULT 0\");\n } catch {\n // column already exists\n }\n this.store = {\n async getThread(threadId: string): Promise<Message[]> {\n const row = db.prepare(\"SELECT messages FROM threads WHERE id = ?\").get(threadId);\n if (!row) return [];\n return jsonDeserialize(row.messages);\n },\n async saveThread(threadId: string, messages: Message[]): Promise<void> {\n const now = Date.now();\n const json = jsonSerialize(messages);\n const msgCount = messages.length;\n const exists = db.prepare(\"SELECT 1 FROM threads WHERE id = ?\").get(threadId);\n const stmt = exists\n ? db.prepare(\"UPDATE threads SET messages = ?, updated_at = ?, message_count = ? WHERE id = ?\")\n : db.prepare(\"INSERT INTO threads (id, messages, updated_at, message_count) VALUES (?, ?, ?, ?)\");\n stmt.run(json, now, msgCount, threadId);\n },\n async appendMessage(threadId: string, message: Message): Promise<void> {\n const row = db.prepare(\"SELECT messages FROM threads WHERE id = ?\").get(threadId);\n const messages: Message[] = row ? jsonDeserialize(row.messages) : [];\n messages.push(message);\n const json = jsonSerialize(messages);\n const now = Date.now();\n db.prepare(\"INSERT INTO threads (id, messages, updated_at, message_count) VALUES (?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET messages = excluded.messages, updated_at = excluded.updated_at, message_count = excluded.message_count\")\n .run(threadId, json, now, messages.length);\n },\n async listThreads(opts?: { limit?: number; before?: string }): Promise<Array<{ id: string; updatedAt: number; messageCount: number }>> {\n const rows = db.prepare(\"SELECT id, updated_at, message_count FROM threads ORDER BY updated_at DESC\").all();\n let results = rows.map((r: any) => ({ id: r.id, updatedAt: r.updated_at, messageCount: r.message_count }));\n if (opts?.before) results = results.filter((e: { updatedAt: number }) => e.updatedAt < parseInt(opts.before!, 10));\n return results.slice(0, opts?.limit ?? 100);\n },\n async deleteThread(threadId: string): Promise<void> {\n db.prepare(\"DELETE FROM threads WHERE id = ?\").run(threadId);\n },\n };\n } catch {\n console.warn(\"[synth] better-sqlite3 not available, falling back to in-memory store. Install it with: npm install better-sqlite3\");\n this.store = new InMemoryStore();\n }\n }\n\n async getThread(threadId: string): Promise<Message[]> { return this.store.getThread(threadId); }\n async saveThread(threadId: string, messages: Message[]): Promise<void> { return this.store.saveThread(threadId, messages); }\n async appendMessage(threadId: string, message: Message): Promise<void> { return this.store.appendMessage(threadId, message); }\n async listThreads(opts?: { limit?: number; before?: string }): Promise<Array<{ id: string; updatedAt: number; messageCount: number }>> { return this.store.listThreads(opts); }\n async deleteThread(threadId: string): Promise<void> { return this.store.deleteThread(threadId); }\n}\n","import type { ChildProcess } from \"node:child_process\";\n\nexport interface MCPToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nexport interface MCPServerConfig {\n type: \"stdio\" | \"sse\";\n command?: string;\n args?: string[];\n url?: string;\n env?: Record<string, string>;\n}\n\nexport class MCPClient {\n private config: MCPServerConfig;\n private tools: MCPToolDefinition[] = [];\n private proc: ChildProcess | null = null;\n private initialized = false;\n private nextId = 1;\n private messageBuffer = \"\";\n private pendingHandlers: Map<number, (msg: unknown) => void> = new Map();\n\n constructor(config: MCPServerConfig) {\n this.config = config;\n }\n\n private send(proc: ChildProcess, method: string, params: Record<string, unknown>, id?: number): number {\n const msgId = id ?? this.nextId++;\n const msg = JSON.stringify({ jsonrpc: \"2.0\", id: msgId, method, params });\n proc.stdin!.write(msg + \"\\n\");\n return msgId;\n }\n\n private setupMessageHandler(proc: ChildProcess): void {\n proc.stdout!.on(\"data\", (data: Buffer) => {\n this.messageBuffer += data.toString();\n const lines = this.messageBuffer.split(\"\\n\");\n this.messageBuffer = lines.pop() ?? \"\";\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const msg = JSON.parse(line);\n if (msg.id !== undefined && this.pendingHandlers.has(msg.id)) {\n const handler = this.pendingHandlers.get(msg.id)!;\n this.pendingHandlers.delete(msg.id);\n handler(msg);\n } else if (msg.method === \"initialize\" && msg.id) {\n proc.stdin!.write(JSON.stringify({\n jsonrpc: \"2.0\",\n id: msg.id,\n result: { protocolVersion: \"2024-11-05\", capabilities: {}, serverInfo: { name: \"synthcode-mcp-proxy\", version: \"0.6.0\" } },\n }) + \"\\n\");\n }\n } catch {}\n }\n });\n proc.stderr!.on(\"data\", () => {});\n }\n\n async connect(): Promise<void> {\n if (this.config.type === \"stdio\") {\n const { spawn } = await import(\"node:child_process\");\n const proc = spawn(this.config.command!, this.config.args ?? [], {\n env: { ...process.env, ...this.config.env },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n proc.on(\"error\", (err) => { throw err; });\n proc.on(\"close\", () => { this.initialized = false; });\n this.proc = proc;\n this.setupMessageHandler(proc);\n await new Promise<void>((resolve) => {\n const handler = (_data: Buffer) => {\n proc.stdout!.off(\"data\", handler);\n resolve();\n };\n proc.stdout!.on(\"data\", handler);\n setTimeout(() => {\n proc.stdout!.off(\"data\", handler);\n resolve();\n }, 2000);\n });\n this.initialized = true;\n }\n if (this.config.type === \"sse\") {\n if (!this.config.url) throw new Error(\"SSE MCP server requires a url\");\n this.initialized = true;\n }\n }\n\n async listTools(): Promise<MCPToolDefinition[]> {\n if (this.config.type === \"stdio\" && this.proc) {\n const id = this.nextId++;\n const tools = await new Promise<MCPToolDefinition[]>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingHandlers.delete(id);\n reject(new Error(\"MCP listTools timeout\"));\n }, 10000);\n this.pendingHandlers.set(id, (msg: unknown) => {\n clearTimeout(timeout);\n const m = msg as Record<string, unknown>;\n if ((m.result as Record<string, unknown>)?.tools) {\n resolve(\n ((m.result as Record<string, unknown>).tools as Record<string, unknown>[]).map((t) => ({\n name: t.name as string,\n description: (t.description as string) ?? \"\",\n inputSchema: (t.inputSchema as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n })),\n );\n } else {\n resolve([]);\n }\n });\n });\n this.send(this.proc!, \"tools/list\", {}, id);\n this.tools = tools;\n return tools;\n }\n return [];\n }\n\n async callTool(\n name: string,\n input: Record<string, unknown>,\n ): Promise<string> {\n if (this.config.type === \"stdio\" && this.proc) {\n const id = this.nextId++;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingHandlers.delete(id);\n reject(new Error(\"MCP callTool timeout\"));\n }, 30000);\n this.pendingHandlers.set(id, (msg: unknown) => {\n clearTimeout(timeout);\n const m = msg as Record<string, unknown>;\n if (m.result) {\n resolve(typeof m.result === \"string\" ? m.result : JSON.stringify(m.result));\n } else if (m.error) {\n reject(\n new Error(\n ((m.error as Record<string, unknown>).message as string) ?? \"MCP tool error\",\n ),\n );\n }\n });\n this.send(this.proc!, \"tools/call\", { name, arguments: input }, id);\n });\n }\n throw new Error(\"MCP callTool not implemented for SSE type\");\n }\n\n async disconnect(): Promise<void> {\n if (this.proc) {\n this.proc.kill();\n this.proc = null;\n }\n }\n\n getTools(): MCPToolDefinition[] {\n return this.tools;\n }\n}\n","import { defineTool } from \"../tools/tool.js\";\nimport type { Tool } from \"../tools/tool.js\";\nimport type { ToolContext } from \"../types.js\";\nimport { MCPClient } from \"./client.js\";\nimport type { MCPToolDefinition, MCPServerConfig } from \"./client.js\";\n\nexport async function loadMCPTools(\n config: MCPServerConfig,\n): Promise<{ tools: Tool[]; client: MCPClient }> {\n const { z } = await import(\"zod\");\n\n const client = new MCPClient(config);\n await client.connect();\n const definitions = await client.listTools();\n\n const tools = definitions.map((def: MCPToolDefinition) =>\n defineTool({\n name: def.name,\n description: def.description,\n inputSchema: z.object({}).passthrough(),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async (input: Record<string, unknown>, _context: ToolContext) => {\n const result = await client.callTool(def.name, input);\n return result;\n },\n }),\n );\n\n return { tools, client };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\n\nexport interface InitOptions {\n projectName?: string;\n cwd?: string;\n skipInstall?: boolean;\n}\n\nconst PACKAGE_JSON = JSON.stringify(\n {\n name: \"my-agent\",\n version: \"1.0.0\",\n type: \"module\",\n scripts: {\n start: \"npx tsx src/index.ts\",\n test: \"npx vitest run\",\n typecheck: \"tsc --noEmit\",\n },\n dependencies: {\n \"@avasis-ai/synthcode\": \"^0.6.0\",\n zod: \"^3.24.0\",\n },\n devDependencies: {\n typescript: \"^5.7.0\",\n tsx: \"^4.19.0\",\n vitest: \"^2.1.0\",\n },\n },\n null,\n 2,\n);\n\nconst TSCONFIG_JSON = JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: \"./dist\",\n rootDir: \"./src\",\n declaration: true,\n },\n include: [\"src\"],\n },\n null,\n 2,\n);\n\nconst ENV_EXAMPLE = `# Pick one provider and set its key:\n# ANTHROPIC_API_KEY=your-key-here\n# OPENAI_API_KEY=your-key-here\n# For Ollama (local, zero API costs): no key needed\n`;\n\nconst INDEX_TS = `import { Agent, BashTool, FileReadTool, FileWriteTool, FileEditTool, GlobTool, GrepTool, WebFetchTool } from \"@avasis-ai/synthcode\";\nimport { defineTool } from \"@avasis-ai/synthcode/tools\";\nimport { z } from \"zod\";\n\nconst agent = new Agent({\n model: process.env.OLLAMA_MODEL\n ? await import(\"@avasis-ai/synthcode/llm\").then(m => new m.OllamaProvider({ model: process.env.OLLAMA_MODEL }))\n : process.env.OPENAI_API_KEY\n ? await import(\"@avasis-ai/synthcode/llm\").then(m => new m.OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }))\n : await import(\"@avasis-ai/synthcode/llm\").then(m => new m.AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY! })),\n tools: [\n BashTool,\n FileReadTool,\n FileWriteTool,\n FileEditTool,\n GlobTool,\n GrepTool,\n WebFetchTool,\n ],\n systemPrompt: \"You are a helpful AI coding assistant with shell and file access.\",\n});\n\nconst prompt = process.argv[2] || \"Hello! What can I help you with?\";\n\nfor await (const event of agent.run(prompt)) {\n if (event.type === \"text\") process.stdout.write(event.text);\n if (event.type === \"tool_use\") console.log(\\`\\\\n [\\${event.name}]\\`);\n if (event.type === \"tool_result\") {\n if (event.isError) console.log(\\`\\\\n [\\${event.name}] FAILED\\`);\n }\n if (event.type === \"thinking\") process.stderr.write(\\`\\\\x1b[90m\\${event.thinking}\\\\x1b[0m\\`);\n if (event.type === \"done\") console.log(\\`\\\\n\\\\nTokens: \\${event.usage.inputTokens} in, \\${event.usage.outputTokens} out\\`);\n if (event.type === \"error\") {\n console.error(\\`\\\\nError: \\${event.error.message}\\`);\n process.exit(1);\n }\n}\n`;\n\nexport async function init(opts?: InitOptions): Promise<void> {\n const name = opts?.projectName ?? \"my-agent\";\n const cwd = opts?.cwd ?? process.cwd();\n const dir = path.join(cwd, name);\n\n fs.mkdirSync(path.join(dir, \"src\", \"tools\"), { recursive: true });\n fs.mkdirSync(path.join(dir, \"tests\"), { recursive: true });\n\n fs.writeFileSync(path.join(dir, \"package.json\"), PACKAGE_JSON, \"utf-8\");\n fs.writeFileSync(path.join(dir, \"tsconfig.json\"), TSCONFIG_JSON, \"utf-8\");\n fs.writeFileSync(path.join(dir, \".env.example\"), ENV_EXAMPLE, \"utf-8\");\n fs.writeFileSync(path.join(dir, \"src\", \"index.ts\"), INDEX_TS, \"utf-8\");\n fs.writeFileSync(path.join(dir, \"tests\", \"agent.test.ts\"), `import { describe, it, expect } from \"vitest\";\\ndescribe(\"Agent\", () => { it(\"should have tools registered\", () => { expect(true).toBe(true); }); });\\n`, \"utf-8\");\n\n if (!opts?.skipInstall) {\n console.log(\"Installing dependencies...\");\n execSync(\"npm install\", { cwd: dir, stdio: \"inherit\" });\n }\n\n console.log(`\\n Created ${name}/`);\n console.log(` cd ${name} && npm start \"your prompt here\"\\n`);\n}\n"],"mappings":"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","names":["fs","path","promises","newTokens","z","truncateOutput","import_zod","path","fs","import_promises","import_node_path","import_zod","path","fs","import_promises","import_node_path","import_zod","path","fs","import_promises","import_node_path","import_zod","walkDir","path","fs","import_promises","import_node_path","import_zod","walkDir","path","fs","import_zod","text","similarity","z","fs","path","import_node_child_process"]}
|