@samrahimi/smol-js 0.6.3 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +6 -4
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
#!/usr/bin/env node
|
|
3
2
|
"use strict";
|
|
4
3
|
var __create = Object.create;
|
|
5
4
|
var __defProp = Object.defineProperty;
|
|
@@ -3048,6 +3047,8 @@ async function main() {
|
|
|
3048
3047
|
await runCommand(args.slice(1));
|
|
3049
3048
|
} else if (command === "validate") {
|
|
3050
3049
|
await validateCommand(args.slice(1));
|
|
3050
|
+
} else if (command.endsWith(".yaml") || command.endsWith(".yml")) {
|
|
3051
|
+
await runCommand(args);
|
|
3051
3052
|
} else {
|
|
3052
3053
|
console.error(import_chalk3.default.red(`Unknown command: ${command}`));
|
|
3053
3054
|
printUsage();
|
|
@@ -3057,7 +3058,8 @@ async function main() {
|
|
|
3057
3058
|
function printUsage() {
|
|
3058
3059
|
console.log(import_chalk3.default.cyan.bold("\nsmol-js CLI - YAML Agent Orchestrator\n"));
|
|
3059
3060
|
console.log("Usage:");
|
|
3060
|
-
console.log(" smol-js
|
|
3061
|
+
console.log(" smol-js <workflow.yaml> [options] Run a workflow (auto-detect)");
|
|
3062
|
+
console.log(" smol-js run <workflow.yaml> [options] Run a workflow (explicit)");
|
|
3061
3063
|
console.log(" smol-js validate <workflow.yaml> Validate a workflow file");
|
|
3062
3064
|
console.log("");
|
|
3063
3065
|
console.log("Options:");
|
|
@@ -3066,8 +3068,8 @@ function printUsage() {
|
|
|
3066
3068
|
console.log(" --help, -h Show this help message");
|
|
3067
3069
|
console.log("");
|
|
3068
3070
|
console.log("Examples:");
|
|
3069
|
-
console.log(' smol-js
|
|
3070
|
-
console.log(' smol-js
|
|
3071
|
+
console.log(' npx @samrahimi/smol-js workflow.yaml --task "Research AI safety"');
|
|
3072
|
+
console.log(' smol-js research-agent.yaml -t "Write a summary of quantum computing"');
|
|
3071
3073
|
console.log(" smol-js validate my-workflow.yaml");
|
|
3072
3074
|
}
|
|
3073
3075
|
async function runCommand(args) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/orchestrator/Orchestrator.ts","../src/orchestrator/YAMLLoader.ts","../src/memory/AgentMemory.ts","../src/logging/AgentLogger.ts","../src/agents/Agent.ts","../src/executor/LocalExecutor.ts","../src/tools/Tool.ts","../src/tools/defaultTools.ts","../src/prompts/codeAgent.ts","../src/agents/CodeAgent.ts","../src/prompts/toolUseAgent.ts","../src/agents/ToolUseAgent.ts","../src/tools/AgentTool.ts","../src/models/OpenAIModel.ts","../src/models/Model.ts","../src/tools/ReadFileTool.ts","../src/tools/WriteFileTool.ts","../src/tools/CurlTool.ts","../src/tools/ExaSearchTool.ts","../src/tools/ExaGetContentsTool.ts","../src/tools/ExaResearchTool.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * smol-js CLI - Run YAML-defined agent workflows from the command line\n *\n * Usage:\n * smol-js run <workflow.yaml> [--task \"your task\"]\n * smol-js run <workflow.yaml> (reads task from stdin if not provided)\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as readline from 'readline';\nimport chalk from 'chalk';\nimport dotenv from 'dotenv';\nimport { Orchestrator } from './orchestrator/Orchestrator.js';\n\n// Load environment variables\ndotenv.config();\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {\n printUsage();\n process.exit(0);\n }\n\n const command = args[0];\n\n if (command === 'run') {\n await runCommand(args.slice(1));\n } else if (command === 'validate') {\n await validateCommand(args.slice(1));\n } else {\n console.error(chalk.red(`Unknown command: ${command}`));\n printUsage();\n process.exit(1);\n }\n}\n\nfunction printUsage(): void {\n console.log(chalk.cyan.bold('\\nsmol-js CLI - YAML Agent Orchestrator\\n'));\n console.log('Usage:');\n console.log(' smol-js run <workflow.yaml> [options] Run a workflow');\n console.log(' smol-js validate <workflow.yaml> Validate a workflow file');\n console.log('');\n console.log('Options:');\n console.log(' --task, -t <task> Task description (prompted if not provided)');\n console.log(' --quiet, -q Reduce output verbosity');\n console.log(' --help, -h Show this help message');\n console.log('');\n console.log('Examples:');\n console.log(' smol-js run workflow.yaml --task \"Research AI safety\"');\n console.log(' smol-js run research-agent.yaml -t \"Write a summary of quantum computing\"');\n console.log(' smol-js validate my-workflow.yaml');\n}\n\nasync function runCommand(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(chalk.red('Error: workflow file path required'));\n process.exit(1);\n }\n\n const filePath = args[0];\n let task = '';\n let quiet = false;\n\n // Parse remaining args\n for (let i = 1; i < args.length; i++) {\n if (args[i] === '--task' || args[i] === '-t') {\n task = args[i + 1] ?? '';\n i++;\n } else if (args[i] === '--quiet' || args[i] === '-q') {\n quiet = true;\n }\n }\n\n // Resolve file path\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);\n\n if (!fs.existsSync(resolvedPath)) {\n console.error(chalk.red(`Error: file not found: ${resolvedPath}`));\n process.exit(1);\n }\n\n // Get task from user if not provided\n if (!task) {\n task = await promptUser('Enter your task: ');\n if (!task.trim()) {\n console.error(chalk.red('Error: task cannot be empty'));\n process.exit(1);\n }\n }\n\n // Create orchestrator and run\n const orchestrator = new Orchestrator({ verbose: !quiet });\n\n try {\n console.log(chalk.gray(`\\nLoading workflow from: ${resolvedPath}\\n`));\n const workflow = orchestrator.loadWorkflow(resolvedPath);\n\n await orchestrator.runWorkflow(workflow, task);\n\n // Exit with success\n process.exit(0);\n } catch (error) {\n console.error(chalk.red(`\\nError: ${(error as Error).message}`));\n if (process.env.DEBUG) {\n console.error((error as Error).stack);\n }\n process.exit(1);\n }\n}\n\nasync function validateCommand(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(chalk.red('Error: workflow file path required'));\n process.exit(1);\n }\n\n const filePath = args[0];\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);\n\n if (!fs.existsSync(resolvedPath)) {\n console.error(chalk.red(`Error: file not found: ${resolvedPath}`));\n process.exit(1);\n }\n\n const orchestrator = new Orchestrator({ verbose: false });\n\n try {\n const workflow = orchestrator.loadWorkflow(resolvedPath);\n console.log(chalk.green.bold('✅ Workflow is valid'));\n console.log(chalk.green(` Name: ${workflow.name}`));\n console.log(chalk.green(` Agents: ${Array.from(workflow.agents.keys()).join(', ')}`));\n console.log(chalk.green(` Tools: ${Array.from(workflow.tools.keys()).join(', ') || '(using defaults)'}`));\n console.log(chalk.green(` Entrypoint: ${workflow.entrypointAgent.getName()}`));\n process.exit(0);\n } catch (error) {\n console.error(chalk.red(`❌ Validation failed: ${(error as Error).message}`));\n process.exit(1);\n }\n}\n\nfunction promptUser(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(chalk.cyan(question), (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n\nmain().catch((error) => {\n console.error(chalk.red(`Fatal error: ${error.message}`));\n process.exit(1);\n});\n","/**\n * Orchestrator - Loads, runs, and provides real-time visibility into agent execution\n */\n\nimport chalk from 'chalk';\nimport type { OrchestratorEvent, RunResult } from '../types.js';\nimport { Agent } from '../agents/Agent.js';\nimport { YAMLLoader, LoadedWorkflow } from './YAMLLoader.js';\n\nexport interface OrchestratorConfig {\n /** Whether to display real-time output (default: true) */\n verbose?: boolean;\n /** Callback for orchestrator events */\n onEvent?: (event: OrchestratorEvent) => void;\n}\n\nexport class Orchestrator {\n private loader: YAMLLoader;\n private config: OrchestratorConfig;\n private activeAgents: Map<string, { agent: Agent; depth: number }> = new Map();\n private eventLog: OrchestratorEvent[] = [];\n\n constructor(config: OrchestratorConfig = {}) {\n this.loader = new YAMLLoader();\n this.config = {\n verbose: config.verbose ?? true,\n onEvent: config.onEvent,\n };\n }\n\n /**\n * Load a workflow from a YAML file.\n */\n loadWorkflow(filePath: string): LoadedWorkflow {\n const workflow = this.loader.loadFromFile(filePath);\n this.displayWorkflowInfo(workflow);\n return workflow;\n }\n\n /**\n * Load a workflow from YAML string.\n */\n loadWorkflowFromString(yamlContent: string): LoadedWorkflow {\n const workflow = this.loader.loadFromString(yamlContent);\n this.displayWorkflowInfo(workflow);\n return workflow;\n }\n\n /**\n * Run a loaded workflow with a task.\n */\n async runWorkflow(workflow: LoadedWorkflow, task: string): Promise<RunResult> {\n this.displayRunStart(workflow.name, task);\n\n // Set up event tracking on the entrypoint agent\n this.instrumentAgent(workflow.entrypointAgent, workflow.entrypointAgent.getName(), 0);\n\n // Also instrument sub-agents\n for (const [name, agent] of workflow.agents) {\n if (agent !== workflow.entrypointAgent) {\n this.instrumentAgent(agent, name, 1);\n }\n }\n\n try {\n const result = await workflow.entrypointAgent.run(task);\n this.displayRunEnd(result);\n return result;\n } catch (error) {\n this.displayError(error as Error);\n throw error;\n }\n }\n\n /**\n * Run a standalone agent with a task.\n */\n async runAgent(agent: Agent, task: string): Promise<RunResult> {\n this.instrumentAgent(agent, agent.getName(), 0);\n const result = await agent.run(task);\n return result;\n }\n\n /**\n * Instrument an agent with orchestrator event tracking.\n */\n private instrumentAgent(agent: Agent, name: string, depth: number): void {\n this.activeAgents.set(name, { agent, depth });\n\n // The Agent base class supports onEvent callback through config\n // We'll add event tracking through the logging output\n }\n\n /**\n * Display workflow info at startup.\n */\n private displayWorkflowInfo(workflow: LoadedWorkflow): void {\n if (!this.config.verbose) return;\n\n const line = '═'.repeat(70);\n console.log(chalk.cyan(line));\n console.log(chalk.cyan.bold(` Workflow: ${workflow.name}`));\n if (workflow.description) {\n console.log(chalk.cyan(` ${workflow.description}`));\n }\n console.log(chalk.cyan(` Agents: ${Array.from(workflow.agents.keys()).join(', ')}`));\n console.log(chalk.cyan(` Tools: ${Array.from(workflow.tools.keys()).join(', ') || '(none defined at workflow level)'}`));\n console.log(chalk.cyan(` Entrypoint: ${workflow.entrypointAgent.getName()}`));\n console.log(chalk.cyan(line));\n console.log();\n }\n\n /**\n * Display run start info.\n */\n private displayRunStart(workflowName: string, task: string): void {\n if (!this.config.verbose) return;\n console.log(chalk.green.bold(`\\n▶ Running workflow \"${workflowName}\"`));\n console.log(chalk.green(` Task: ${task}`));\n console.log(chalk.gray('─'.repeat(70)));\n }\n\n /**\n * Display run completion info.\n */\n private displayRunEnd(result: RunResult): void {\n if (!this.config.verbose) return;\n console.log(chalk.gray('\\n' + '─'.repeat(70)));\n console.log(chalk.green.bold(`\\n✅ Workflow complete`));\n console.log(chalk.green(` Duration: ${(result.duration / 1000).toFixed(2)}s`));\n console.log(chalk.green(` Tokens: ${result.tokenUsage.totalTokens}`));\n console.log(chalk.green(` Steps: ${result.steps.length}`));\n\n const outputStr = typeof result.output === 'string'\n ? result.output\n : JSON.stringify(result.output, null, 2);\n console.log(chalk.magenta.bold('\\n Final Output:'));\n // Indent output\n const indentedOutput = outputStr.split('\\n').map(line => ` ${line}`).join('\\n');\n console.log(chalk.magenta(indentedOutput));\n console.log();\n }\n\n /**\n * Display an error.\n */\n private displayError(error: Error): void {\n if (!this.config.verbose) return;\n console.error(chalk.red.bold(`\\n❌ Workflow failed: ${error.message}`));\n if (error.stack) {\n console.error(chalk.red.dim(error.stack));\n }\n }\n\n /**\n * Log an orchestration event.\n */\n logEvent(event: OrchestratorEvent): void {\n this.eventLog.push(event);\n if (this.config.onEvent) {\n this.config.onEvent(event);\n }\n }\n\n /**\n * Get the event log.\n */\n getEventLog(): OrchestratorEvent[] {\n return [...this.eventLog];\n }\n\n /**\n * Get the YAML loader for registering custom tools.\n */\n getLoader(): YAMLLoader {\n return this.loader;\n }\n}\n","/**\n * YAMLLoader - Loads and parses YAML workflow definitions into runnable agents\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport YAML from 'yaml';\nimport type { YAMLWorkflowDefinition, YAMLAgentDefinition, YAMLModelDefinition } from '../types.js';\nimport { Agent } from '../agents/Agent.js';\nimport { CodeAgent } from '../agents/CodeAgent.js';\nimport { ToolUseAgent } from '../agents/ToolUseAgent.js';\nimport { Tool } from '../tools/Tool.js';\nimport { AgentTool } from '../tools/AgentTool.js';\nimport { OpenAIModel } from '../models/OpenAIModel.js';\nimport { ReadFileTool } from '../tools/ReadFileTool.js';\nimport { WriteFileTool } from '../tools/WriteFileTool.js';\nimport { CurlTool } from '../tools/CurlTool.js';\nimport { ExaSearchTool } from '../tools/ExaSearchTool.js';\nimport { ExaGetContentsTool } from '../tools/ExaGetContentsTool.js';\nimport { ExaResearchTool } from '../tools/ExaResearchTool.js';\nimport { FinalAnswerTool } from '../tools/defaultTools.js';\n\n// Registry of built-in tool types\nconst TOOL_REGISTRY: Record<string, new (config?: Record<string, unknown>) => Tool> = {\n read_file: ReadFileTool as unknown as new (config?: Record<string, unknown>) => Tool,\n write_file: WriteFileTool as unknown as new (config?: Record<string, unknown>) => Tool,\n curl: CurlTool as unknown as new (config?: Record<string, unknown>) => Tool,\n exa_search: ExaSearchTool as unknown as new (config?: Record<string, unknown>) => Tool,\n exa_get_contents: ExaGetContentsTool as unknown as new (config?: Record<string, unknown>) => Tool,\n exa_research: ExaResearchTool as unknown as new (config?: Record<string, unknown>) => Tool,\n final_answer: FinalAnswerTool as unknown as new (config?: Record<string, unknown>) => Tool,\n};\n\nexport interface LoadedWorkflow {\n name: string;\n description?: string;\n entrypointAgent: Agent;\n agents: Map<string, Agent>;\n tools: Map<string, Tool>;\n}\n\nexport class YAMLLoader {\n private customTools: Map<string, new (config?: Record<string, unknown>) => Tool> = new Map();\n\n /**\n * Register a custom tool type for use in YAML definitions.\n */\n registerToolType(typeName: string, toolClass: new (config?: Record<string, unknown>) => Tool): void {\n this.customTools.set(typeName, toolClass);\n }\n\n /**\n * Load a workflow from a YAML file path.\n */\n loadFromFile(filePath: string): LoadedWorkflow {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);\n\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`Workflow file not found: ${absolutePath}`);\n }\n\n const content = fs.readFileSync(absolutePath, 'utf-8');\n return this.loadFromString(content);\n }\n\n /**\n * Load a workflow from a YAML string.\n */\n loadFromString(yamlContent: string): LoadedWorkflow {\n const definition = YAML.parse(yamlContent) as YAMLWorkflowDefinition;\n return this.buildWorkflow(definition);\n }\n\n /**\n * Build a runnable workflow from a parsed definition.\n */\n private buildWorkflow(definition: YAMLWorkflowDefinition): LoadedWorkflow {\n if (!definition.name) {\n throw new Error('Workflow must have a name');\n }\n if (!definition.entrypoint) {\n throw new Error('Workflow must have an entrypoint agent');\n }\n if (!definition.agents) {\n throw new Error('Workflow must define at least one agent');\n }\n\n // Build tools\n const tools = new Map<string, Tool>();\n if (definition.tools) {\n for (const [name, toolDef] of Object.entries(definition.tools)) {\n const tool = this.buildTool(name, toolDef.type, toolDef.config);\n tools.set(name, tool);\n }\n }\n\n // Build agents (handling dependencies between agents)\n const agents = new Map<string, Agent>();\n const agentDefs = definition.agents;\n\n // Topological sort: build agents that don't depend on other agents first\n const resolved = new Set<string>();\n const maxIterations = Object.keys(agentDefs).length * 2;\n let iterations = 0;\n\n while (resolved.size < Object.keys(agentDefs).length && iterations < maxIterations) {\n iterations++;\n for (const [agentName, agentDef] of Object.entries(agentDefs)) {\n if (resolved.has(agentName)) continue;\n\n // Check if all agent dependencies are resolved\n const agentDeps = agentDef.agents ?? [];\n const allDepsResolved = agentDeps.every(dep => resolved.has(dep));\n\n if (allDepsResolved) {\n const agent = this.buildAgent(\n agentName,\n agentDef,\n definition.model,\n tools,\n agents,\n definition.globalMaxContextLength\n );\n agents.set(agentName, agent);\n resolved.add(agentName);\n }\n }\n }\n\n if (resolved.size < Object.keys(agentDefs).length) {\n const unresolved = Object.keys(agentDefs).filter(n => !resolved.has(n));\n throw new Error(`Circular or unresolvable agent dependencies: ${unresolved.join(', ')}`);\n }\n\n const entrypointAgent = agents.get(definition.entrypoint);\n if (!entrypointAgent) {\n throw new Error(`Entrypoint agent \"${definition.entrypoint}\" not found in agents`);\n }\n\n return {\n name: definition.name,\n description: definition.description,\n entrypointAgent,\n agents,\n tools,\n };\n }\n\n /**\n * Build a tool instance from a type name and config.\n */\n private buildTool(name: string, type: string, config?: Record<string, unknown>): Tool {\n const ToolClass = TOOL_REGISTRY[type] ?? this.customTools.get(type);\n\n if (!ToolClass) {\n throw new Error(`Unknown tool type: ${type}. Available types: ${[...Object.keys(TOOL_REGISTRY), ...this.customTools.keys()].join(', ')}`);\n }\n\n const tool = new ToolClass(config);\n // Override name if different from type\n if (name !== type && name !== tool.name) {\n Object.defineProperty(tool, 'name', { value: name, writable: false });\n }\n return tool;\n }\n\n /**\n * Build an agent instance from a YAML definition.\n */\n private buildAgent(\n name: string,\n definition: YAMLAgentDefinition,\n globalModel?: YAMLModelDefinition,\n availableTools?: Map<string, Tool>,\n resolvedAgents?: Map<string, Agent>,\n globalMaxContextLength?: number\n ): Agent {\n // Build model\n const modelConfig = definition.model ?? globalModel;\n const model = new OpenAIModel({\n modelId: modelConfig?.modelId,\n apiKey: modelConfig?.apiKey,\n baseUrl: modelConfig?.baseUrl,\n maxTokens: definition.maxTokens ?? modelConfig?.maxTokens,\n temperature: definition.temperature ?? modelConfig?.temperature,\n timeout: modelConfig?.timeout,\n });\n\n // Collect tools\n const agentTools: Tool[] = [];\n\n // Add referenced tools\n if (definition.tools && availableTools) {\n for (const toolName of definition.tools) {\n const tool = availableTools.get(toolName);\n if (tool) {\n agentTools.push(tool);\n } else {\n // Try to create from registry directly\n const ToolClass = TOOL_REGISTRY[toolName] ?? this.customTools.get(toolName);\n if (ToolClass) {\n agentTools.push(new ToolClass());\n } else {\n throw new Error(`Tool \"${toolName}\" not found for agent \"${name}\"`);\n }\n }\n }\n }\n\n // Add sub-agents as tools\n if (definition.agents && resolvedAgents) {\n for (const subAgentName of definition.agents) {\n const subAgent = resolvedAgents.get(subAgentName);\n if (!subAgent) {\n throw new Error(`Sub-agent \"${subAgentName}\" not found for agent \"${name}\"`);\n }\n agentTools.push(new AgentTool({\n agent: subAgent,\n name: subAgentName,\n description: definition.description\n ? `Sub-agent: ${subAgentName}`\n : `Delegate tasks to the ${subAgentName} agent`,\n }));\n }\n }\n\n const maxContextLength = definition.maxContextLength ?? globalMaxContextLength;\n\n // Build the agent based on type\n if (definition.type === 'CodeAgent') {\n return new CodeAgent({\n model,\n tools: agentTools,\n maxSteps: definition.maxSteps,\n customInstructions: definition.customInstructions,\n persistent: definition.persistent,\n maxContextLength,\n memoryStrategy: definition.memoryStrategy,\n maxTokens: definition.maxTokens,\n temperature: definition.temperature,\n name,\n });\n } else {\n // Default: ToolUseAgent\n return new ToolUseAgent({\n model,\n tools: agentTools,\n maxSteps: definition.maxSteps,\n customInstructions: definition.customInstructions,\n persistent: definition.persistent,\n maxContextLength,\n memoryStrategy: definition.memoryStrategy,\n maxTokens: definition.maxTokens,\n temperature: definition.temperature,\n name,\n });\n }\n }\n}\n","/**\n * AgentMemory - Tracks agent execution history with context management\n */\n\nimport type {\n MemoryStep,\n SystemPromptStep,\n TaskStep,\n ActionStep,\n FinalAnswerStep,\n ChatMessage,\n TokenUsage,\n MemoryStrategy,\n Model,\n} from '../types.js';\n\nexport interface MemoryConfig {\n maxContextLength?: number;\n memoryStrategy?: MemoryStrategy;\n model?: Model;\n}\n\n// Rough token estimation: ~4 chars per token on average\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\nfunction estimateMessagesTokens(messages: ChatMessage[]): number {\n let total = 0;\n for (const msg of messages) {\n total += estimateTokens(msg.content ?? '');\n if (msg.toolCalls) {\n total += estimateTokens(JSON.stringify(msg.toolCalls));\n }\n total += 4; // overhead per message (role, etc.)\n }\n return total;\n}\n\nexport class AgentMemory {\n /** System prompt step (always first) */\n systemPrompt: SystemPromptStep;\n\n /** All execution steps */\n steps: (TaskStep | ActionStep | FinalAnswerStep)[] = [];\n\n private maxContextLength: number;\n private memoryStrategy: MemoryStrategy;\n private model?: Model;\n\n constructor(systemPrompt: string, config?: MemoryConfig) {\n this.systemPrompt = {\n type: 'system',\n content: systemPrompt,\n timestamp: Date.now(),\n };\n this.maxContextLength = config?.maxContextLength ?? 100000;\n this.memoryStrategy = config?.memoryStrategy ?? 'truncate';\n this.model = config?.model;\n }\n\n /** Reset memory, keeping only the system prompt */\n reset(): void {\n this.steps = [];\n }\n\n /** Add a task step */\n addTask(task: string): TaskStep {\n const step: TaskStep = {\n type: 'task',\n task,\n timestamp: Date.now(),\n };\n this.steps.push(step);\n return step;\n }\n\n /** Create a new action step */\n createActionStep(stepNumber: number): ActionStep {\n const step: ActionStep = {\n type: 'action',\n stepNumber,\n timing: { startTime: Date.now() },\n modelInputMessages: [],\n timestamp: Date.now(),\n };\n this.steps.push(step);\n return step;\n }\n\n /** Add a final answer step */\n addFinalAnswer(answer: unknown): FinalAnswerStep {\n const step: FinalAnswerStep = {\n type: 'final',\n answer,\n timestamp: Date.now(),\n };\n this.steps.push(step);\n return step;\n }\n\n /** Get the last step */\n getLastStep(): MemoryStep | undefined {\n return this.steps[this.steps.length - 1];\n }\n\n /** Get all action steps */\n getActionSteps(): ActionStep[] {\n return this.steps.filter((s): s is ActionStep => s.type === 'action');\n }\n\n /**\n * Convert memory to messages for LLM context.\n * Handles both CodeAgent (observation-based) and ToolUseAgent (tool_call-based) patterns.\n */\n toMessages(): ChatMessage[] {\n const messages: ChatMessage[] = [];\n\n // System prompt\n messages.push({\n role: 'system',\n content: this.systemPrompt.content,\n });\n\n for (const step of this.steps) {\n switch (step.type) {\n case 'task':\n messages.push({\n role: 'user',\n content: `Task: ${step.task}`,\n });\n break;\n\n case 'action':\n // Assistant response with tool calls (ToolUseAgent)\n if (step.toolCalls && step.toolCalls.length > 0) {\n messages.push({\n role: 'assistant',\n content: step.modelOutputMessage?.content ?? null,\n toolCalls: step.toolCalls,\n });\n\n // Add tool results\n if (step.toolResults) {\n for (const result of step.toolResults) {\n messages.push({\n role: 'tool',\n content: result.error\n ? `Error: ${result.error}`\n : typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result, null, 2),\n toolCallId: result.toolCallId,\n });\n }\n }\n } else {\n // CodeAgent pattern: assistant message + observation\n if (step.modelOutputMessage) {\n messages.push({\n role: 'assistant',\n content: step.modelOutputMessage.content,\n });\n }\n\n if (step.observation) {\n messages.push({\n role: 'user',\n content: step.observation,\n });\n }\n\n if (step.error && !step.observation) {\n messages.push({\n role: 'user',\n content: `Error: ${step.error.message}`,\n });\n }\n }\n break;\n\n case 'final':\n break;\n }\n }\n\n return messages;\n }\n\n /**\n * Manage context length - truncate or compact if exceeded.\n */\n async manageContext(): Promise<void> {\n const messages = this.toMessages();\n const tokenCount = estimateMessagesTokens(messages);\n\n if (tokenCount <= this.maxContextLength) {\n return;\n }\n\n if (this.memoryStrategy === 'truncate') {\n this.truncateOlderMessages();\n } else if (this.memoryStrategy === 'compact') {\n await this.compactMessages();\n }\n }\n\n /**\n * Truncate older action steps to fit within context.\n */\n private truncateOlderMessages(): void {\n // Keep system prompt, task, and recent steps\n const actionSteps = this.getActionSteps();\n if (actionSteps.length <= 2) return;\n\n // Remove oldest action steps until we fit\n const targetTokens = this.maxContextLength * 0.75;\n let currentTokens = estimateMessagesTokens(this.toMessages());\n\n while (currentTokens > targetTokens && this.steps.length > 2) {\n // Find first action step and remove it\n const idx = this.steps.findIndex(s => s.type === 'action');\n if (idx === -1) break;\n this.steps.splice(idx, 1);\n currentTokens = estimateMessagesTokens(this.toMessages());\n }\n }\n\n /**\n * Compact older messages into a summary.\n */\n private async compactMessages(): Promise<void> {\n if (!this.model) {\n // Fall back to truncation if no model available\n this.truncateOlderMessages();\n return;\n }\n\n const actionSteps = this.getActionSteps();\n if (actionSteps.length <= 2) return;\n\n // Summarize older steps\n const stepsToSummarize = actionSteps.slice(0, -2);\n const summaryContent = stepsToSummarize.map(step => {\n const parts: string[] = [];\n if (step.modelOutputMessage?.content) {\n parts.push(`Action: ${step.modelOutputMessage.content.slice(0, 200)}`);\n }\n if (step.observation) {\n parts.push(`Observation: ${step.observation.slice(0, 200)}`);\n }\n if (step.toolResults) {\n for (const r of step.toolResults) {\n const resultStr = typeof r.result === 'string' ? r.result : JSON.stringify(r.result);\n parts.push(`Tool ${r.toolName}: ${resultStr.slice(0, 200)}`);\n }\n }\n return parts.join('\\n');\n }).join('\\n---\\n');\n\n try {\n const summaryResponse = await this.model.generate([\n {\n role: 'system',\n content: 'Summarize the following agent execution history concisely, preserving key findings and results. Be brief but complete.',\n },\n {\n role: 'user',\n content: summaryContent,\n },\n ]);\n\n // Remove the summarized steps and replace with a summary task step\n const recentSteps = this.steps.filter(s =>\n s.type === 'task' || s.type === 'final' ||\n (s.type === 'action' && actionSteps.indexOf(s) >= actionSteps.length - 2)\n );\n\n this.steps = [\n {\n type: 'task' as const,\n task: `[Context Summary from previous steps]\\n${summaryResponse.content}`,\n timestamp: Date.now(),\n },\n ...recentSteps,\n ];\n } catch {\n // Fall back to truncation\n this.truncateOlderMessages();\n }\n }\n\n /** Get total token usage across all steps */\n getTotalTokenUsage(): TokenUsage {\n let inputTokens = 0;\n let outputTokens = 0;\n\n for (const step of this.steps) {\n if (step.type === 'action' && step.tokenUsage) {\n inputTokens += step.tokenUsage.inputTokens;\n outputTokens += step.tokenUsage.outputTokens;\n }\n }\n\n return {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n };\n }\n\n /** Get current estimated token count */\n getEstimatedTokenCount(): number {\n return estimateMessagesTokens(this.toMessages());\n }\n\n /** Get a summary of the memory for logging */\n getSummary(): string {\n const actionSteps = this.getActionSteps();\n const lines = [\n `System Prompt: ${this.systemPrompt.content.slice(0, 100)}...`,\n `Total Steps: ${this.steps.length}`,\n `Action Steps: ${actionSteps.length}`,\n ];\n\n const tokenUsage = this.getTotalTokenUsage();\n if (tokenUsage.totalTokens > 0) {\n lines.push(`Total Tokens: ${tokenUsage.totalTokens}`);\n }\n\n return lines.join('\\n');\n }\n\n /** Serialize memory to JSON */\n toJSON(): Record<string, unknown> {\n return {\n systemPrompt: this.systemPrompt,\n steps: this.steps,\n };\n }\n}\n","/**\n * AgentLogger - Color-coded console logging for agent execution\n *\n * Provides formatted output with different colors for:\n * - Headers (cyan)\n * - Reasoning/Thoughts (yellow)\n * - Code blocks (green)\n * - Output/Results (blue)\n * - Errors (red)\n */\n\nimport chalk from 'chalk';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { LogLevel } from '../types.js';\n\n// Log file directory\nconst LOG_DIR = path.join(os.homedir(), '.smol-js/logs');\n\nexport class AgentLogger {\n private level: LogLevel;\n private logFile?: fs.WriteStream;\n private sessionId: string;\n\n constructor(level: LogLevel = LogLevel.INFO) {\n this.level = level;\n this.sessionId = this.generateSessionId();\n\n // Initialize log file if logging is enabled\n if (level > LogLevel.OFF) {\n this.initLogFile();\n }\n }\n\n /**\n * Generate a unique session ID.\n */\n private generateSessionId(): string {\n const now = new Date();\n const timestamp = now.toISOString().replace(/[:.]/g, '-');\n return `session-${timestamp}`;\n }\n\n /**\n * Initialize the log file.\n */\n private initLogFile(): void {\n try {\n // Create log directory if it doesn't exist\n if (!fs.existsSync(LOG_DIR)) {\n fs.mkdirSync(LOG_DIR, { recursive: true });\n }\n\n const logPath = path.join(LOG_DIR, `${this.sessionId}.log`);\n this.logFile = fs.createWriteStream(logPath, { flags: 'a' });\n\n this.writeToFile(`=== Session Started: ${new Date().toISOString()} ===\\n\\n`);\n } catch (error) {\n console.warn('Could not create log file:', (error as Error).message);\n }\n }\n\n /**\n * Write to the log file.\n */\n private writeToFile(content: string): void {\n if (this.logFile) {\n // Strip ANSI codes for file output\n // eslint-disable-next-line no-control-regex\n const cleanContent = content.replace(/\\x1b\\[[0-9;]*m/g, '');\n this.logFile.write(cleanContent);\n }\n }\n\n /**\n * Set the log level.\n */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /**\n * Log a header (task start, step start, etc.)\n */\n header(message: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const line = '═'.repeat(60);\n const output = `\\n${chalk.cyan(line)}\\n${chalk.cyan.bold(message)}\\n${chalk.cyan(line)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n${'═'.repeat(60)}\\n${message}\\n${'═'.repeat(60)}\\n`);\n }\n\n /**\n * Log a subheader.\n */\n subheader(message: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `\\n${chalk.cyan('─'.repeat(40))}\\n${chalk.cyan(message)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n${'─'.repeat(40)}\\n${message}\\n`);\n }\n\n /**\n * Log reasoning/thought from the agent.\n */\n reasoning(content: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.yellow.bold('💭 Reasoning:')}\\n${chalk.yellow(content)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n💭 Reasoning:\\n${content}\\n`);\n }\n\n /**\n * Log code block.\n */\n code(content: string, language: string = 'javascript', level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.green.bold('📝 Code:')}\\n${chalk.green('```' + language)}\\n${chalk.green(content)}\\n${chalk.green('```')}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n📝 Code:\\n\\`\\`\\`${language}\\n${content}\\n\\`\\`\\`\\n`);\n }\n\n /**\n * Log execution output.\n */\n output(content: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.blue.bold('📤 Output:')}\\n${chalk.blue(content)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n📤 Output:\\n${content}\\n`);\n }\n\n /**\n * Log execution logs (print statements).\n */\n logs(content: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level || !content.trim()) return;\n\n const output = `${chalk.gray.bold('📋 Logs:')}\\n${chalk.gray(content)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n📋 Logs:\\n${content}\\n`);\n }\n\n /**\n * Log an error.\n */\n error(message: string, error?: Error, level: LogLevel = LogLevel.ERROR): void {\n if (this.level < level) return;\n\n const errorMessage = error ? `${message}: ${error.message}` : message;\n const output = `${chalk.red.bold('❌ Error:')}\\n${chalk.red(errorMessage)}\\n`;\n\n console.error(output);\n this.writeToFile(`\\n❌ Error:\\n${errorMessage}\\n`);\n\n if (error?.stack && this.level >= LogLevel.DEBUG) {\n console.error(chalk.red.dim(error.stack));\n this.writeToFile(`Stack: ${error.stack}\\n`);\n }\n }\n\n /**\n * Log a warning.\n */\n warn(message: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.yellow.bold('⚠️ Warning:')} ${chalk.yellow(message)}\\n`;\n\n console.warn(output);\n this.writeToFile(`\\n⚠️ Warning: ${message}\\n`);\n }\n\n /**\n * Log general info.\n */\n info(message: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.white(message)}`;\n\n console.log(output);\n this.writeToFile(`${message}\\n`);\n }\n\n /**\n * Log debug info.\n */\n debug(message: string): void {\n if (this.level < LogLevel.DEBUG) return;\n\n const output = `${chalk.dim('[DEBUG]')} ${chalk.dim(message)}`;\n\n console.log(output);\n this.writeToFile(`[DEBUG] ${message}\\n`);\n }\n\n /**\n * Log final answer.\n */\n finalAnswer(answer: unknown, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const line = '═'.repeat(60);\n const answerStr = typeof answer === 'string' ? answer : JSON.stringify(answer, null, 2);\n const output = `\\n${chalk.magenta(line)}\\n${chalk.magenta.bold('✅ Final Answer:')}\\n${chalk.magenta(answerStr)}\\n${chalk.magenta(line)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n${'═'.repeat(60)}\\n✅ Final Answer:\\n${answerStr}\\n${'═'.repeat(60)}\\n`);\n }\n\n /**\n * Log step progress.\n */\n stepProgress(current: number, max: number, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.cyan.bold(`\\n🔄 Step ${current}/${max}`)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n🔄 Step ${current}/${max}\\n`);\n }\n\n /**\n * Log waiting message for code execution delay.\n */\n waiting(seconds: number, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.yellow(`⏳ Waiting ${seconds}s before code execution (Ctrl+C to abort)...`)}`;\n\n console.log(output);\n this.writeToFile(`⏳ Waiting ${seconds}s before code execution...\\n`);\n }\n\n /**\n * Stream content character by character.\n */\n streamChar(char: string): void {\n if (this.level < LogLevel.INFO) return;\n process.stdout.write(chalk.yellow(char));\n }\n\n /**\n * End streaming (add newline).\n */\n streamEnd(): void {\n if (this.level < LogLevel.INFO) return;\n console.log();\n }\n\n /**\n * Close the log file.\n */\n close(): void {\n if (this.logFile) {\n this.writeToFile(`\\n=== Session Ended: ${new Date().toISOString()} ===\\n`);\n this.logFile.end();\n }\n }\n\n /**\n * Get the log file path.\n */\n getLogPath(): string | undefined {\n return this.logFile ? path.join(LOG_DIR, `${this.sessionId}.log`) : undefined;\n }\n}\n","/**\n * Agent - Abstract base class for all agents\n *\n * Provides the foundation for multi-step agents that follow the ReAct framework.\n * Extend this class to create specific agent implementations.\n */\n\nimport type {\n ActionStep,\n RunResult,\n LogLevel,\n ActionOutput,\n MemoryStrategy,\n} from '../types.js';\nimport { Tool } from '../tools/Tool.js';\nimport { Model } from '../models/Model.js';\nimport { AgentMemory } from '../memory/AgentMemory.js';\nimport { AgentLogger } from '../logging/AgentLogger.js';\nimport { LogLevel as LogLevelEnum } from '../types.js';\n\n// Default global max context length (in tokens, estimated)\nconst DEFAULT_MAX_CONTEXT_LENGTH = 100000;\n\nexport interface AgentConfig {\n /** The LLM model to use for generation */\n model: Model;\n\n /** Tools available to the agent */\n tools?: Tool[];\n\n /** Maximum number of steps before stopping (default: 20) */\n maxSteps?: number;\n\n /** Delay in ms before executing code (default: 5000) */\n codeExecutionDelay?: number;\n\n /** Custom instructions appended to system prompt */\n customInstructions?: string;\n\n /** Log level for output (default: INFO) */\n verboseLevel?: LogLevel;\n\n /** Whether to stream model outputs (default: true) */\n streamOutputs?: boolean;\n\n /** Whether the agent retains memory between run() calls (default: false) */\n persistent?: boolean;\n\n /** Max context length in tokens (default: 100000) */\n maxContextLength?: number;\n\n /** Memory management strategy when context is exceeded (default: 'truncate') */\n memoryStrategy?: MemoryStrategy;\n\n /** Max tokens for generation (passed to model if set) */\n maxTokens?: number;\n\n /** Temperature for generation (passed to model if set) */\n temperature?: number;\n\n /** Agent name for logging */\n name?: string;\n\n /** Callback for orchestration events */\n onEvent?: (event: { type: string; data: unknown }) => void;\n}\n\nexport abstract class Agent {\n /** The LLM model for generation */\n protected model: Model;\n\n /** Available tools mapped by name */\n protected tools: Map<string, Tool> = new Map();\n\n /** Agent memory tracking all steps */\n protected memory!: AgentMemory;\n\n /** Logger for formatted output */\n protected logger: AgentLogger;\n\n /** Configuration options */\n protected config: {\n maxSteps: number;\n codeExecutionDelay: number;\n customInstructions: string;\n verboseLevel: LogLevel;\n streamOutputs: boolean;\n persistent: boolean;\n maxContextLength: number;\n memoryStrategy: MemoryStrategy;\n maxTokens?: number;\n temperature?: number;\n name: string;\n onEvent?: (event: { type: string; data: unknown }) => void;\n };\n\n /** Current step number */\n protected currentStep: number = 0;\n\n /** Whether the agent is currently running */\n protected isRunning: boolean = false;\n\n /** Whether the agent has been initialized at least once */\n private initialized: boolean = false;\n\n constructor(config: AgentConfig) {\n this.model = config.model;\n this.logger = new AgentLogger(config.verboseLevel ?? LogLevelEnum.INFO);\n\n this.config = {\n maxSteps: config.maxSteps ?? 20,\n codeExecutionDelay: config.codeExecutionDelay ?? 5000,\n customInstructions: config.customInstructions ?? '',\n verboseLevel: config.verboseLevel ?? LogLevelEnum.INFO,\n streamOutputs: config.streamOutputs ?? true,\n persistent: config.persistent ?? false,\n maxContextLength: config.maxContextLength ?? DEFAULT_MAX_CONTEXT_LENGTH,\n memoryStrategy: config.memoryStrategy ?? 'truncate',\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n name: config.name ?? 'Agent',\n onEvent: config.onEvent,\n };\n\n // Register tools\n if (config.tools) {\n for (const tool of config.tools) {\n this.tools.set(tool.name, tool);\n }\n }\n }\n\n /**\n * Initialize the system prompt for the agent.\n * Must be implemented by subclasses.\n */\n protected abstract initializeSystemPrompt(): string;\n\n /**\n * Execute a single step in the agent loop.\n * Must be implemented by subclasses.\n */\n protected abstract executeStep(memoryStep: ActionStep): Promise<ActionOutput>;\n\n /**\n * Run the agent on a task.\n */\n async run(task: string, reset: boolean = true): Promise<RunResult> {\n const startTime = Date.now();\n\n // For persistent agents, only reset if explicitly requested or first run\n const shouldReset = !this.config.persistent ? (reset || !this.memory) : (!this.initialized);\n\n if (shouldReset) {\n const systemPrompt = this.initializeSystemPrompt();\n this.memory = new AgentMemory(systemPrompt, {\n maxContextLength: this.config.maxContextLength,\n memoryStrategy: this.config.memoryStrategy,\n model: this.model,\n });\n this.currentStep = 0;\n this.initialized = true;\n }\n\n // Add task to memory\n this.memory.addTask(task);\n\n this.isRunning = true;\n this.emitEvent('agent_start', { task, name: this.config.name });\n this.logger.header(`Starting ${this.config.name}: ${task.slice(0, 80)}${task.length > 80 ? '...' : ''}`);\n\n let finalOutput: unknown = null;\n let isFinalAnswer = false;\n\n try {\n while (this.currentStep < this.config.maxSteps && this.isRunning) {\n this.currentStep++;\n this.logger.stepProgress(this.currentStep, this.config.maxSteps);\n this.emitEvent('agent_step', { step: this.currentStep, maxSteps: this.config.maxSteps });\n\n const memoryStep = this.memory.createActionStep(this.currentStep);\n\n try {\n const actionOutput = await this.executeStep(memoryStep);\n\n memoryStep.timing.endTime = Date.now();\n memoryStep.timing.duration = memoryStep.timing.endTime - memoryStep.timing.startTime;\n memoryStep.actionOutput = actionOutput;\n memoryStep.isFinalAnswer = actionOutput.isFinalAnswer;\n\n if (actionOutput.isFinalAnswer) {\n finalOutput = actionOutput.output;\n isFinalAnswer = true;\n this.logger.finalAnswer(finalOutput);\n break;\n }\n } catch (error) {\n memoryStep.error = error as Error;\n memoryStep.timing.endTime = Date.now();\n memoryStep.timing.duration = memoryStep.timing.endTime - memoryStep.timing.startTime;\n this.logger.error('Step execution failed', error as Error);\n this.emitEvent('agent_error', { error: (error as Error).message, step: this.currentStep });\n }\n\n // Check and manage context length after each step\n await this.memory.manageContext();\n }\n\n if (!isFinalAnswer && this.currentStep >= this.config.maxSteps) {\n this.logger.warn(`Max steps (${this.config.maxSteps}) reached without final answer`);\n finalOutput = await this.provideFinalAnswer(task);\n }\n } finally {\n this.isRunning = false;\n }\n\n const duration = Date.now() - startTime;\n const tokenUsage = this.memory.getTotalTokenUsage();\n\n this.memory.addFinalAnswer(finalOutput);\n this.emitEvent('agent_end', { output: finalOutput, duration, tokenUsage });\n\n this.logger.info(`\\nTotal time: ${(duration / 1000).toFixed(2)}s`);\n this.logger.info(`Total tokens: ${tokenUsage.totalTokens}`);\n\n return {\n output: finalOutput,\n steps: this.memory.steps,\n tokenUsage,\n duration,\n };\n }\n\n /**\n * Generate a final answer when max steps is reached.\n */\n protected async provideFinalAnswer(task: string): Promise<unknown> {\n this.logger.subheader('Generating final answer from accumulated context');\n\n const messages = this.memory.toMessages();\n messages.push({\n role: 'user',\n content: `You have reached the maximum number of steps. Based on your work so far, provide the best answer you can for the original task: \"${task}\". Summarize what you accomplished and provide a final answer.`,\n });\n\n const response = await this.model.generate(messages, {\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n });\n\n return response.content;\n }\n\n /** Emit an orchestration event */\n protected emitEvent(type: string, data: unknown): void {\n if (this.config.onEvent) {\n this.config.onEvent({ type, data });\n }\n }\n\n /** Stop the agent */\n stop(): void {\n this.isRunning = false;\n this.logger.info('Agent stopped by user');\n }\n\n /** Get the current memory */\n getMemory(): AgentMemory {\n return this.memory;\n }\n\n /** Get registered tools */\n getTools(): Map<string, Tool> {\n return this.tools;\n }\n\n /** Add a tool to the agent */\n addTool(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n /** Remove a tool from the agent */\n removeTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n /** Get agent name */\n getName(): string {\n return this.config.name;\n }\n\n /** Sleep for a specified duration */\n protected sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * LocalExecutor - JavaScript code execution engine using Node's vm module\n *\n * Executes JavaScript code chunks in an isolated context with:\n * - State persistence between steps (variables carry forward)\n * - Tool injection (tools available as async functions)\n * - Dynamic imports via CDN (esm.sh)\n * - Print capture and logging\n * - Safety timeouts\n */\n\nimport * as vm from 'vm';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport type { CodeExecutionOutput } from '../types.js';\nimport { Tool as ToolClass } from '../tools/Tool.js';\n\n// Default timeout for code execution (30 seconds)\nconst DEFAULT_TIMEOUT_MS = 30000;\n\n// Maximum length of captured output\nconst MAX_OUTPUT_LENGTH = 50000;\n\n// Package cache directory\nconst PACKAGE_CACHE_DIR = path.join(os.homedir(), '.smol-js', 'packages');\n\nexport interface ExecutorConfig {\n /**\n * Maximum execution time in milliseconds\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Additional authorized imports (npm packages to allow)\n */\n authorizedImports?: string[];\n\n /**\n * Whether to allow fs module access\n * @default true\n */\n allowFs?: boolean;\n\n /**\n * Working directory for fs operations\n */\n workingDirectory?: string;\n}\n\nexport class LocalExecutor {\n private context: vm.Context;\n private state: Record<string, unknown> = {};\n private tools: Map<string, ToolClass> = new Map();\n private config: ExecutorConfig;\n private capturedLogs: string[] = [];\n\n constructor(config: ExecutorConfig = {}) {\n this.config = {\n timeout: DEFAULT_TIMEOUT_MS,\n allowFs: true,\n workingDirectory: process.cwd(),\n ...config,\n };\n\n this.context = this.createContext();\n }\n\n /**\n * Create the VM context with available globals.\n */\n private createContext(): vm.Context {\n // Create a proxy for console to capture logs\n const consoleProxy = {\n log: (...args: unknown[]) => {\n const output = args.map((arg) => this.stringify(arg)).join(' ');\n this.capturedLogs.push(output);\n },\n error: (...args: unknown[]) => {\n const output = args.map((arg) => this.stringify(arg)).join(' ');\n this.capturedLogs.push(`[ERROR] ${output}`);\n },\n warn: (...args: unknown[]) => {\n const output = args.map((arg) => this.stringify(arg)).join(' ');\n this.capturedLogs.push(`[WARN] ${output}`);\n },\n info: (...args: unknown[]) => {\n const output = args.map((arg) => this.stringify(arg)).join(' ');\n this.capturedLogs.push(output);\n },\n debug: (...args: unknown[]) => {\n const output = args.map((arg) => this.stringify(arg)).join(' ');\n this.capturedLogs.push(`[DEBUG] ${output}`);\n },\n };\n\n // Create print function (alias for console.log)\n const print = (...args: unknown[]) => consoleProxy.log(...args);\n\n // Create dynamic import function for npm packages\n const dynamicImport = async (packageName: string): Promise<unknown> => {\n // Check if it's an authorized import\n const authorized = this.config.authorizedImports ?? [];\n const basePackage = packageName.split('/')[0];\n\n if (!authorized.includes(basePackage) && !authorized.includes(packageName)) {\n throw new Error(\n `Import not authorized: ${packageName}. Add it to authorizedImports to allow.`\n );\n }\n\n try {\n // Ensure cache directory exists\n if (!fs.existsSync(PACKAGE_CACHE_DIR)) {\n fs.mkdirSync(PACKAGE_CACHE_DIR, { recursive: true });\n }\n\n // Create a safe filename from package name\n const safeFileName = packageName.replace(/[/@]/g, '_') + '.mjs';\n const cachedPath = path.join(PACKAGE_CACHE_DIR, safeFileName);\n\n // Check if already cached and valid (not a redirect stub)\n let needsFetch = !fs.existsSync(cachedPath);\n if (!needsFetch) {\n const content = fs.readFileSync(cachedPath, 'utf-8');\n // Check if it's a redirect stub that needs resolution\n if (content.includes('export * from \"/') || content.includes(\"export * from '/\")) {\n needsFetch = true;\n fs.unlinkSync(cachedPath); // Remove invalid cache\n }\n }\n\n if (needsFetch) {\n this.capturedLogs.push(`[import] Fetching ${packageName}...`);\n\n // First, get the package info to find the actual bundle URL\n // Use jsdelivr which provides proper ESM bundles\n const jsdelivrUrl = `https://cdn.jsdelivr.net/npm/${packageName}/+esm`;\n\n const response = await fetch(jsdelivrUrl);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n let code = await response.text();\n\n // jsdelivr ESM bundles may have imports from jsdelivr - rewrite them to be fetched too\n // For now, we'll inline simple packages. Complex packages with many deps may need more work.\n\n // Check if there are external imports we need to resolve\n const importMatches = code.matchAll(/from\\s+[\"'](https:\\/\\/cdn\\.jsdelivr\\.net\\/[^\"']+)[\"']/g);\n for (const match of importMatches) {\n const depUrl = match[1];\n const depName = depUrl.split('/npm/')[1]?.split('/')[0] || 'dep';\n const depFileName = depName.replace(/[/@]/g, '_') + '_dep.mjs';\n const depCachedPath = path.join(PACKAGE_CACHE_DIR, depFileName);\n\n if (!fs.existsSync(depCachedPath)) {\n this.capturedLogs.push(`[import] Fetching dependency from ${depUrl}...`);\n const depResponse = await fetch(depUrl);\n if (depResponse.ok) {\n const depCode = await depResponse.text();\n fs.writeFileSync(depCachedPath, depCode, 'utf-8');\n }\n }\n\n // Rewrite import to use local file\n code = code.replace(depUrl, `file://${depCachedPath}`);\n }\n\n // Write to cache\n fs.writeFileSync(cachedPath, code, 'utf-8');\n this.capturedLogs.push(`[import] Cached ${packageName} to ${cachedPath}`);\n } else {\n this.capturedLogs.push(`[import] Using cached ${packageName}`);\n }\n\n // Import from local cache using file:// URL\n const fileUrl = `file://${cachedPath}`;\n const module = await import(fileUrl);\n return module.default ?? module;\n } catch (error) {\n throw new Error(`Failed to import ${packageName}: ${(error as Error).message}`);\n }\n };\n\n // Build context object\n const contextObj: Record<string, unknown> = {\n // Console and print\n console: consoleProxy,\n print,\n\n // Built-in objects\n Object,\n Array,\n String,\n Number,\n Boolean,\n Date,\n Math,\n JSON,\n RegExp,\n Error,\n Map,\n Set,\n WeakMap,\n WeakSet,\n Promise,\n Symbol,\n Proxy,\n Reflect,\n\n // Type checking\n parseInt,\n parseFloat,\n isNaN,\n isFinite,\n typeof: (v: unknown) => typeof v,\n\n // Timers (promisified for async support)\n setTimeout: global.setTimeout,\n clearTimeout: global.clearTimeout,\n setInterval: global.setInterval,\n clearInterval: global.clearInterval,\n\n // Async utilities\n fetch: global.fetch,\n\n // Dynamic import for npm packages\n importPackage: dynamicImport,\n\n // URL handling\n URL,\n URLSearchParams,\n\n // Text encoding\n TextEncoder,\n TextDecoder,\n\n // Buffer (useful for many operations)\n Buffer,\n\n // State reference (variables persist here)\n __state__: this.state,\n\n // Final answer marker\n __final_answer__: null as unknown,\n __is_final_answer__: false,\n };\n\n // Add fs module if allowed\n if (this.config.allowFs) {\n contextObj.fs = {\n readFileSync: (filePath: string, encoding?: BufferEncoding) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), filePath);\n return fs.readFileSync(resolvedPath, encoding ?? 'utf-8');\n },\n writeFileSync: (filePath: string, data: string | Buffer) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), filePath);\n return fs.writeFileSync(resolvedPath, data);\n },\n existsSync: (filePath: string) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), filePath);\n return fs.existsSync(resolvedPath);\n },\n readdirSync: (dirPath: string) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), dirPath);\n return fs.readdirSync(resolvedPath);\n },\n mkdirSync: (dirPath: string, options?: fs.MakeDirectoryOptions) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), dirPath);\n return fs.mkdirSync(resolvedPath, options);\n },\n unlinkSync: (filePath: string) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), filePath);\n return fs.unlinkSync(resolvedPath);\n },\n statSync: (filePath: string) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), filePath);\n return fs.statSync(resolvedPath);\n },\n };\n\n contextObj.path = {\n join: path.join,\n resolve: (...paths: string[]) =>\n path.resolve(this.config.workingDirectory ?? process.cwd(), ...paths),\n dirname: path.dirname,\n basename: path.basename,\n extname: path.extname,\n };\n }\n\n return vm.createContext(contextObj);\n }\n\n /**\n * Add tools to the executor context.\n */\n sendTools(tools: Record<string, ToolClass>): void {\n for (const [name, tool] of Object.entries(tools)) {\n this.tools.set(name, tool);\n\n // Add tool as async function in context\n this.context[name] = async (...args: unknown[]) => {\n // Handle both positional and named arguments\n let callArgs: Record<string, unknown>;\n\n if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null) {\n // Called with named arguments object\n callArgs = args[0] as Record<string, unknown>;\n } else {\n // Called with positional arguments - map to input names\n const inputNames = Object.keys(tool.inputs);\n callArgs = {};\n args.forEach((arg, i) => {\n if (i < inputNames.length) {\n callArgs[inputNames[i]] = arg;\n }\n });\n }\n\n return tool.call(callArgs);\n };\n }\n }\n\n /**\n * Send variables to the executor state.\n */\n sendVariables(variables: Record<string, unknown>): void {\n Object.assign(this.state, variables);\n Object.assign(this.context, variables);\n }\n\n /**\n * Execute JavaScript code and return the result.\n */\n async execute(code: string): Promise<CodeExecutionOutput> {\n // Reset captured logs\n this.capturedLogs = [];\n\n // Reset final answer flag\n this.context.__is_final_answer__ = false;\n this.context.__final_answer__ = null;\n\n // Sync state to context\n Object.assign(this.context, this.state);\n\n // Wrap code to handle async and capture the last expression\n const wrappedCode = this.wrapCode(code);\n\n try {\n // Create and run the script\n const script = new vm.Script(wrappedCode, {\n filename: 'agent-code.js',\n });\n\n // Run with timeout\n const result = await script.runInContext(this.context, {\n timeout: this.config.timeout,\n displayErrors: true,\n });\n\n // Wait for the result if it's a promise\n const output = result instanceof Promise ? await result : result;\n\n // Update state with any new variables from context\n this.updateStateFromContext();\n\n // Check if final_answer was called\n const isFinalAnswer = this.context.__is_final_answer__ as boolean;\n const finalOutput = isFinalAnswer ? this.context.__final_answer__ : output;\n\n // Truncate logs if too long\n const logs = this.capturedLogs.join('\\n').slice(0, MAX_OUTPUT_LENGTH);\n\n return {\n output: finalOutput,\n logs,\n isFinalAnswer,\n };\n } catch (error) {\n // Truncate logs if too long\n const logs = this.capturedLogs.join('\\n').slice(0, MAX_OUTPUT_LENGTH);\n\n return {\n output: null,\n logs,\n isFinalAnswer: false,\n error: error as Error,\n };\n }\n }\n\n /**\n * Wrap code to handle async execution and final_answer calls.\n */\n private wrapCode(code: string): string {\n // Add final_answer function that sets the flag\n const finalAnswerFunc = `\n function final_answer(answer) {\n __is_final_answer__ = true;\n __final_answer__ = answer;\n return answer;\n }\n `;\n\n // Wrap in async IIFE to support await\n // Store result of last expression in __last_result__\n // We use a Function constructor approach to capture the last expression value\n return `\n ${finalAnswerFunc}\n (async () => {\n let __last_result__;\n ${this.instrumentCode(code)}\n return __last_result__;\n })()\n `;\n }\n\n /**\n * Instrument code to capture the last expression value and convert\n * let/const/var declarations to global assignments for state persistence.\n */\n private instrumentCode(code: string): string {\n // Split code into lines and find statements\n const lines = code.trim().split('\\n');\n\n if (lines.length === 0) {\n return code;\n }\n\n // Process the code to capture expression results\n const processedLines = lines.map((line, index) => {\n const trimmed = line.trim();\n\n // Skip empty lines and comments\n if (!trimmed ||\n trimmed.startsWith('//') ||\n trimmed.startsWith('/*') ||\n trimmed.startsWith('*') ||\n trimmed.endsWith('*/')) {\n return line;\n }\n\n // Transform variable declarations to global assignments for persistence\n // This allows variables to persist across script executions\n // Handle multiple declarations on the same line using global replacement\n let transformed = line;\n let hasDeclaration = false;\n\n // Replace all let/const/var declarations with global assignments\n transformed = transformed.replace(\n /\\b(let|const|var)\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=/g,\n (_match, _keyword, varName) => {\n hasDeclaration = true;\n return `${varName} =`;\n }\n );\n\n // Handle declarations without initialization\n transformed = transformed.replace(\n /\\b(let|const|var)\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*(?=[;,]|$)/g,\n (_match, _keyword, varName) => {\n hasDeclaration = true;\n return `${varName} = undefined`;\n }\n );\n\n if (hasDeclaration) {\n return transformed;\n }\n\n // Skip control flow statements for last-result capture\n if (trimmed.startsWith('if') ||\n trimmed.startsWith('else') ||\n trimmed.startsWith('for') ||\n trimmed.startsWith('while') ||\n trimmed.startsWith('do') ||\n trimmed.startsWith('switch') ||\n trimmed.startsWith('case') ||\n trimmed.startsWith('default') ||\n trimmed.startsWith('try') ||\n trimmed.startsWith('catch') ||\n trimmed.startsWith('finally') ||\n trimmed.startsWith('return') ||\n trimmed.startsWith('throw') ||\n trimmed.startsWith('break') ||\n trimmed.startsWith('continue') ||\n trimmed.startsWith('function') ||\n trimmed.startsWith('class') ||\n trimmed.startsWith('import') ||\n trimmed.startsWith('export') ||\n trimmed === '{' ||\n trimmed === '}' ||\n trimmed.endsWith('{') ||\n trimmed.endsWith('}')) {\n return line;\n }\n\n // For the last meaningful line, try to capture the expression value\n if (index === lines.length - 1 || this.isLastMeaningfulLine(lines, index)) {\n // If line doesn't end with semicolon, try to capture it\n if (!trimmed.endsWith(';')) {\n return `__last_result__ = ${line}`;\n } else {\n // Remove semicolon, capture, and add it back\n const withoutSemi = trimmed.slice(0, -1);\n // Check if it looks like an expression (not ending with closing brace)\n if (!withoutSemi.endsWith('}') && !withoutSemi.endsWith(')')) {\n return `__last_result__ = ${withoutSemi};`;\n }\n }\n }\n\n return line;\n });\n\n return processedLines.join('\\n');\n }\n\n /**\n * Check if this is the last meaningful line of code.\n */\n private isLastMeaningfulLine(lines: string[], currentIndex: number): boolean {\n for (let i = currentIndex + 1; i < lines.length; i++) {\n const trimmed = lines[i].trim();\n if (trimmed && !trimmed.startsWith('//') && !trimmed.startsWith('/*')) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Update internal state from context after execution.\n */\n private updateStateFromContext(): void {\n // List of keys to exclude from state (builtins and internals)\n const excludeKeys = new Set([\n 'console',\n 'print',\n 'Object',\n 'Array',\n 'String',\n 'Number',\n 'Boolean',\n 'Date',\n 'Math',\n 'JSON',\n 'RegExp',\n 'Error',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Promise',\n 'Symbol',\n 'Proxy',\n 'Reflect',\n 'parseInt',\n 'parseFloat',\n 'isNaN',\n 'isFinite',\n 'typeof',\n 'setTimeout',\n 'clearTimeout',\n 'setInterval',\n 'clearInterval',\n 'fetch',\n 'importPackage',\n 'URL',\n 'URLSearchParams',\n 'TextEncoder',\n 'TextDecoder',\n 'Buffer',\n '__state__',\n '__final_answer__',\n '__is_final_answer__',\n 'fs',\n 'path',\n 'final_answer',\n // Exclude tools\n ...this.tools.keys(),\n ]);\n\n // Copy non-builtin keys to state\n for (const key of Object.keys(this.context)) {\n if (!excludeKeys.has(key)) {\n this.state[key] = this.context[key];\n }\n }\n }\n\n /**\n * Stringify a value for logging.\n */\n private stringify(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (typeof value === 'string') return value;\n if (typeof value === 'function') return `[Function: ${value.name || 'anonymous'}]`;\n\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n\n /**\n * Reset the executor state.\n */\n reset(): void {\n this.state = {};\n this.capturedLogs = [];\n this.context = this.createContext();\n\n // Re-add tools\n const tools = Object.fromEntries(this.tools);\n this.sendTools(tools);\n }\n\n /**\n * Get the current state.\n */\n getState(): Record<string, unknown> {\n return { ...this.state };\n }\n}\n","/**\n * Tool base class for smol-js\n *\n * Tools are the primary way for agents to interact with the outside world.\n * Extend this class and implement the execute() method to create custom tools.\n */\n\nimport type { ToolInputs, ToolInputType, OpenAIToolDefinition } from '../types.js';\n\nexport abstract class Tool {\n /**\n * Unique identifier for the tool\n */\n abstract readonly name: string;\n\n /**\n * Human-readable description of what the tool does\n */\n abstract readonly description: string;\n\n /**\n * Input parameter schema\n */\n abstract readonly inputs: ToolInputs;\n\n /**\n * Output type description\n */\n abstract readonly outputType: string;\n\n /**\n * Whether the tool has been set up\n */\n protected isSetup: boolean = false;\n\n /**\n * Optional setup method called before first use.\n * Override this for expensive initialization (loading models, etc.)\n */\n async setup(): Promise<void> {\n this.isSetup = true;\n }\n\n /**\n * Execute the tool with the given arguments.\n * Must be implemented by subclasses.\n */\n abstract execute(args: Record<string, unknown>): Promise<unknown>;\n\n /**\n * Call the tool, ensuring setup is complete and validating arguments.\n */\n async call(args: Record<string, unknown>): Promise<unknown> {\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Validate arguments\n this.validateArguments(args);\n\n // Execute and return result\n return this.execute(args);\n }\n\n /**\n * Validate that provided arguments match the input schema.\n */\n protected validateArguments(args: Record<string, unknown>): void {\n const providedKeys = new Set(Object.keys(args));\n\n for (const [key, input] of Object.entries(this.inputs)) {\n // Check required arguments\n if (input.required !== false && !providedKeys.has(key)) {\n throw new Error(`Missing required argument: ${key}`);\n }\n\n // Check type if argument is provided\n if (providedKeys.has(key) && args[key] !== undefined && args[key] !== null) {\n const value = args[key];\n if (!this.checkType(value, input.type)) {\n throw new Error(\n `Argument '${key}' has invalid type. Expected ${input.type}, got ${typeof value}`\n );\n }\n }\n\n providedKeys.delete(key);\n }\n }\n\n /**\n * Check if a value matches the expected type.\n */\n protected checkType(value: unknown, expectedType: ToolInputType): boolean {\n switch (expectedType) {\n case 'string':\n return typeof value === 'string';\n case 'number':\n return typeof value === 'number';\n case 'boolean':\n return typeof value === 'boolean';\n case 'array':\n return Array.isArray(value);\n case 'object':\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n case 'any':\n return true;\n default:\n return false;\n }\n }\n\n /**\n * Generate a code-friendly prompt representation of this tool.\n * Used in the CodeAgent system prompt.\n */\n toCodePrompt(): string {\n const argsSignature = Object.entries(this.inputs)\n .map(([name, input]) => {\n const optional = input.required === false ? '?' : '';\n return `${name}${optional}: ${this.typeToJsType(input.type)}`;\n })\n .join(', ');\n\n const argsDoc = Object.entries(this.inputs)\n .map(([name, input]) => ` * @param ${name} - ${input.description}`)\n .join('\\n');\n\n return `\n/**\n * ${this.description}\n *\n${argsDoc}\n * @returns ${this.outputType}\n */\nasync function ${this.name}(${argsSignature}): Promise<${this.typeToJsType(this.outputType as ToolInputType)}> { ... }\n`.trim();\n }\n\n /**\n * Generate an OpenAI-compatible tool definition for function calling.\n */\n toOpenAITool(): OpenAIToolDefinition {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, input] of Object.entries(this.inputs)) {\n const prop: Record<string, unknown> = {\n type: this.typeToJsonSchemaType(input.type),\n description: input.description,\n };\n\n if (input.enum) {\n prop.enum = input.enum;\n }\n\n if (input.default !== undefined) {\n prop.default = input.default;\n }\n\n properties[key] = prop;\n\n if (input.required !== false) {\n required.push(key);\n }\n }\n\n return {\n type: 'function',\n function: {\n name: this.name,\n description: this.description,\n parameters: {\n type: 'object',\n properties,\n ...(required.length > 0 && { required }),\n },\n },\n };\n }\n\n /**\n * Convert tool input type to JSON Schema type.\n */\n protected typeToJsonSchemaType(type: ToolInputType): string {\n switch (type) {\n case 'string':\n return 'string';\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'array':\n return 'array';\n case 'object':\n return 'object';\n case 'any':\n return 'string';\n default:\n return 'string';\n }\n }\n\n /**\n * Convert tool input type to JS/TS type string.\n */\n protected typeToJsType(type: ToolInputType | string): string {\n switch (type) {\n case 'string':\n return 'string';\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'array':\n return 'any[]';\n case 'object':\n return 'Record<string, any>';\n case 'any':\n return 'any';\n default:\n return type;\n }\n }\n\n /**\n * Serialize the tool to a JSON-compatible object.\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n description: this.description,\n inputs: this.inputs,\n outputType: this.outputType,\n };\n }\n}\n\n/**\n * Helper function to create a tool from a function.\n * This is an alternative to extending the Tool class.\n */\nexport function createTool(config: {\n name: string;\n description: string;\n inputs: ToolInputs;\n outputType: string;\n execute: (args: Record<string, unknown>) => Promise<unknown>;\n}): Tool {\n return new (class extends Tool {\n readonly name = config.name;\n readonly description = config.description;\n readonly inputs = config.inputs;\n readonly outputType = config.outputType;\n\n async execute(args: Record<string, unknown>): Promise<unknown> {\n return config.execute(args);\n }\n })();\n}\n","/**\n * Default tools provided to all agents\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\n\n/**\n * FinalAnswerTool - Used by the agent to return the final answer.\n * This is always available to CodeAgent.\n */\nexport class FinalAnswerTool extends Tool {\n readonly name = 'final_answer';\n readonly description = 'Returns the final answer to the user query. Use this when you have completed the task and have the final result.';\n readonly inputs: ToolInputs = {\n answer: {\n type: 'any',\n description: 'The final answer to return. Can be any type (string, number, object, etc.)',\n required: true,\n },\n };\n readonly outputType = 'any';\n\n async execute(args: Record<string, unknown>): Promise<unknown> {\n return args.answer;\n }\n}\n\n/**\n * UserInputTool - Allows the agent to ask the user for input.\n */\nexport class UserInputTool extends Tool {\n readonly name = 'user_input';\n readonly description = 'Asks the user for additional input or clarification.';\n readonly inputs: ToolInputs = {\n question: {\n type: 'string',\n description: 'The question to ask the user',\n required: true,\n },\n };\n readonly outputType = 'string';\n\n private inputHandler?: (question: string) => Promise<string>;\n\n constructor(inputHandler?: (question: string) => Promise<string>) {\n super();\n this.inputHandler = inputHandler;\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const question = args.question as string;\n\n if (this.inputHandler) {\n return this.inputHandler(question);\n }\n\n // Default: use readline for terminal input\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`\\n[Agent asks]: ${question}\\nYour response: `, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n }\n}\n\n// Export singleton instances\nexport const finalAnswerTool = new FinalAnswerTool();\n","/**\n * System prompts for CodeAgent\n *\n * Adapted from smolagents Python prompts but optimized for JavaScript execution.\n */\n\nexport interface PromptVariables {\n tools: string;\n authorizedImports: string;\n customInstructions?: string;\n}\n\n/**\n * Generate the system prompt for CodeAgent.\n */\nexport function generateSystemPrompt(variables: PromptVariables): string {\n const { tools, authorizedImports, customInstructions } = variables;\n\n return `You are an expert JavaScript developer and problem-solving agent. Your role is to solve tasks by writing and executing JavaScript code step by step.\n\n## How You Work\n\nYou follow a ReAct (Reasoning + Acting) framework:\n1. **Thought**: Analyze the current situation and decide what to do next\n2. **Code**: Write JavaScript code to perform the action\n3. **Observation**: See the result of your code execution\n4. Repeat until you have the final answer\n\n## Available Tools\n\nYou have access to the following tools as async functions:\n\n${tools}\n\n## Available Imports\n\nYou can dynamically import the following npm packages using \\`await importPackage('package-name')\\`:\n${authorizedImports || '(No additional packages authorized)'}\n\n## Built-in Capabilities\n\nThe following are available in your execution environment:\n- \\`console.log()\\` / \\`print()\\` - Output text (captured in logs)\n- \\`fs\\` - File system operations (readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync)\n- \\`path\\` - Path utilities (join, resolve, dirname, basename)\n- \\`fetch()\\` - HTTP requests\n- \\`Buffer\\` - Binary data handling\n- \\`JSON\\` - JSON parsing/stringifying\n- Standard JavaScript globals (Math, Date, Array methods, etc.)\n\n## Response Format\n\nAlways respond with your thought process followed by a code block:\n\nThought: [Your reasoning about what to do]\n\n\\`\\`\\`javascript\n// Your code here\n\\`\\`\\`\n\n## Rules\n\n1. **Always use final_answer()**: When you have the complete answer, call \\`final_answer(yourResult)\\` to return it.\n\n2. **One action per step**: Execute one logical action per code block and one code block per inference step. You will be given additional steps to complete your work if it cannot be done safely in one step. Don't try to do everything at once because you need to make sure that your tools returned valid, useful data before going on to make use of that data. In particular, if you are a Manager agent who is invoking Sub-Agents as tools, do not script the entire workflow in one step, make sure that you get to review the work of your subagents at critical points before going on to the next step.\n\n3. **Handle errors gracefully**: If something fails, explain what went wrong and try a different approach.\n\n4. **Use async/await**: All tool calls and imports are async. Always use await.\n\n5. **Variables persist**: Variables you define in one step are available in the next step.\n\n6. **Be concise**: Write clean, minimal code. Don't over-engineer.\n\n7. **Print for debugging**: Use console.log() to output intermediate results you want to see.\n\n8. **No require()**: Use \\`await importPackage('name')\\` for npm packages instead of require().\n\n9. **Internet Access**: You can use fetch() to get data from the web as needed. However, if you have access to specialized tools for browsing / searching / retrieving information, use those first and fall back to fetch if they don't work\n\n## Examples\n\n### Example 1: Simple calculation\nThought: I need to calculate the sum of squares from 1 to 10.\n\n\\`\\`\\`javascript\nlet sum = 0;\nfor (let i = 1; i <= 10; i++) {\n sum += i * i;\n}\nconsole.log(\"Sum of squares:\", sum);\nfinal_answer(sum);\n\\`\\`\\`\n\n### Example 2: Using a tool\nThought: I need to search the web for current information.\n\n\\`\\`\\`javascript\nconst results = await web_search({ query: \"latest JavaScript features 2024\" });\nconsole.log(\"Search results:\", results);\n\\`\\`\\`\n\n### Example 3: Reading a file\nThought: I need to read the contents of package.json.\n\n\\`\\`\\`javascript\nconst content = fs.readFileSync('package.json', 'utf-8');\nconst pkg = JSON.parse(content);\nconsole.log(\"Package name:\", pkg.name);\nfinal_answer(pkg);\n\\`\\`\\`\n\n### Example 4: Using dynamic imports\nThought: I need to use lodash for array manipulation.\n\n\\`\\`\\`javascript\nconst _ = await importPackage('lodash');\nconst numbers = [1, 2, 3, 4, 5];\nconst chunked = _.chunk(numbers, 2);\nfinal_answer(chunked);\n\\`\\`\\`\n\n### Example 5: Multi-step task\nThought: First, I'll fetch the data from the API.\n\n\\`\\`\\`javascript\nconst response = await fetch('https://api.example.com/data');\nconst data = await response.json();\nconsole.log(\"Fetched items:\", data.length);\n\\`\\`\\`\n\n(Observation: Fetched items: 42)\n\nThought: Now I'll process the data and return the result.\n\n\\`\\`\\`javascript\nconst processed = data.filter(item => item.active).map(item => item.name);\nfinal_answer(processed);\n\\`\\`\\`\n\n${customInstructions ? `\\n## Additional Instructions\\n\\n${customInstructions}` : ''}\n\nNow, let's solve the task step by step. Remember to always call final_answer() when you have the complete answer.`;\n}\n\n/**\n * Prompt for generating a final answer when max steps is reached.\n */\nexport const FINAL_ANSWER_PROMPT = `Based on the steps you've taken so far, provide the best answer you can to the original task.\nIf you couldn't fully complete the task, explain what you accomplished and what remains to be done.\nCall final_answer() with your response.`;\n\n/**\n * Error recovery prompt.\n */\nexport function getErrorRecoveryPrompt(error: string): string {\n return `Your previous code encountered an error:\n\n${error}\n\nPlease analyze the error and try a different approach. Fix the issue and continue working on the task.`;\n}\n","/**\n * CodeAgent - Executes tasks by generating and running JavaScript code\n *\n * This is the main agent implementation for smol-js. It follows the ReAct pattern:\n * 1. Receives a task\n * 2. Generates reasoning and code\n * 3. Executes the code in a sandboxed environment\n * 4. Observes the result and continues or returns final answer\n */\n\nimport { Agent, AgentConfig } from './Agent.js';\nimport { LocalExecutor, ExecutorConfig } from '../executor/LocalExecutor.js';\nimport { FinalAnswerTool } from '../tools/defaultTools.js';\nimport { Tool } from '../tools/Tool.js';\nimport { generateSystemPrompt, getErrorRecoveryPrompt } from '../prompts/codeAgent.js';\nimport type { ActionStep, ActionOutput, ChatMessage } from '../types.js';\n\nexport interface CodeAgentConfig extends AgentConfig {\n /**\n * Additional npm packages that can be imported dynamically\n */\n additionalAuthorizedImports?: string[];\n\n /**\n * Executor configuration\n */\n executorConfig?: ExecutorConfig;\n\n /**\n * Working directory for file operations\n */\n workingDirectory?: string;\n}\n\n// Regex patterns for extracting code from LLM output\nconst CODE_BLOCK_REGEX = /```(?:javascript|js)?\\n([\\s\\S]*?)```/;\nconst THOUGHT_REGEX = /(?:Thought|Reasoning):\\s*([\\s\\S]*?)(?=```|$)/i;\n\nexport class CodeAgent extends Agent {\n /**\n * The JavaScript code executor\n */\n private executor: LocalExecutor;\n\n /**\n * Authorized imports for dynamic npm package loading\n */\n private authorizedImports: string[];\n\n constructor(config: CodeAgentConfig) {\n super(config);\n\n // Set authorized imports\n this.authorizedImports = config.additionalAuthorizedImports ?? [];\n\n // Initialize executor\n this.executor = new LocalExecutor({\n ...config.executorConfig,\n authorizedImports: this.authorizedImports,\n workingDirectory: config.workingDirectory,\n });\n\n // Always add final_answer tool\n if (!this.tools.has('final_answer')) {\n this.tools.set('final_answer', new FinalAnswerTool());\n }\n\n // Send tools to executor\n this.executor.sendTools(Object.fromEntries(this.tools));\n }\n\n /**\n * Initialize the system prompt with tool definitions.\n */\n protected initializeSystemPrompt(): string {\n // Generate tool documentation\n const toolDocs = Array.from(this.tools.values())\n .filter((tool) => tool.name !== 'final_answer') // final_answer is documented separately\n .map((tool) => tool.toCodePrompt())\n .join('\\n\\n');\n\n // Add final_answer documentation\n const finalAnswerDoc = `\n/**\n * Returns the final answer to the user. Call this when you have completed the task.\n * @param answer - The final answer (can be any type)\n */\nfunction final_answer(answer: any): void { ... }\n`.trim();\n\n const allTools = toolDocs ? `${toolDocs}\\n\\n${finalAnswerDoc}` : finalAnswerDoc;\n\n // Format authorized imports\n const importsDoc = this.authorizedImports.length > 0\n ? this.authorizedImports.map((pkg) => `- ${pkg}`).join('\\n')\n : 'None (use built-in capabilities only)';\n\n return generateSystemPrompt({\n tools: allTools,\n authorizedImports: importsDoc,\n customInstructions: this.config.customInstructions,\n });\n }\n\n /**\n * Execute a single step: get LLM response, extract code, execute it.\n */\n protected async executeStep(memoryStep: ActionStep): Promise<ActionOutput> {\n // Get messages for LLM\n const messages = this.memory.toMessages();\n memoryStep.modelInputMessages = [...messages];\n\n // Check if last step had an error - add recovery prompt\n const lastStep = this.memory.getActionSteps().slice(-2)[0]; // Get step before current\n if (lastStep?.error) {\n messages.push({\n role: 'user',\n content: getErrorRecoveryPrompt(lastStep.error.message),\n });\n }\n\n // Generate response from LLM\n const response = await this.generateResponse(messages);\n memoryStep.modelOutputMessage = response;\n memoryStep.tokenUsage = response.tokenUsage;\n\n const content = response.content ?? '';\n\n // Extract thought/reasoning\n const thoughtMatch = content.match(THOUGHT_REGEX);\n if (thoughtMatch) {\n this.logger.reasoning(thoughtMatch[1].trim());\n }\n\n // Extract code block\n const codeMatch = content.match(CODE_BLOCK_REGEX);\n\n if (!codeMatch) {\n // No code block found - this might be just reasoning\n // Feed back to LLM to generate code\n this.logger.warn('No code block found in response');\n memoryStep.observation = 'No code block was found in your response. Please provide JavaScript code in a ```javascript code block.';\n\n return {\n output: null,\n isFinalAnswer: false,\n };\n }\n\n const code = codeMatch[1].trim();\n memoryStep.codeAction = code;\n\n this.logger.code(code);\n\n // Wait before execution (allows user to interrupt)\n if (this.config.codeExecutionDelay > 0) {\n this.logger.waiting(this.config.codeExecutionDelay / 1000);\n await this.sleep(this.config.codeExecutionDelay);\n }\n\n // Execute the code\n this.logger.subheader('Executing code...');\n const result = await this.executor.execute(code);\n\n // Log execution logs\n if (result.logs) {\n this.logger.logs(result.logs);\n }\n\n // Handle execution error\n if (result.error) {\n this.logger.error('Code execution error', result.error);\n\n memoryStep.error = result.error;\n memoryStep.observation = `Error during code execution:\\n${result.error.message}`;\n\n return {\n output: null,\n isFinalAnswer: false,\n };\n }\n\n // Format observation\n const outputStr = this.formatOutput(result.output);\n this.logger.output(outputStr);\n\n memoryStep.observation = this.formatObservation(result.logs, outputStr);\n\n return {\n output: result.output,\n isFinalAnswer: result.isFinalAnswer,\n };\n }\n\n /**\n * Generate response from the LLM, optionally streaming.\n */\n private async generateResponse(messages: ChatMessage[]): Promise<ChatMessage> {\n if (this.config.streamOutputs && this.model.supportsStreaming() && this.model.generateStream) {\n // Stream the response\n this.logger.subheader('Agent thinking...');\n\n let fullContent = '';\n const generator = this.model.generateStream(messages, {\n stopSequences: ['Observation:', 'Observation:\\n'],\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n });\n\n for await (const chunk of generator) {\n this.logger.streamChar(chunk);\n fullContent += chunk;\n }\n\n this.logger.streamEnd();\n\n return {\n role: 'assistant',\n content: fullContent,\n };\n } else {\n // Non-streaming response\n this.logger.subheader('Agent thinking...');\n\n return this.model.generate(messages, {\n stopSequences: ['Observation:', 'Observation:\\n'],\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n });\n }\n }\n\n /**\n * Format output for display.\n */\n private formatOutput(output: unknown): string {\n if (output === undefined || output === null) {\n return '(no output)';\n }\n\n if (typeof output === 'string') {\n return output;\n }\n\n try {\n return JSON.stringify(output, null, 2);\n } catch {\n return String(output);\n }\n }\n\n /**\n * Format the observation to send back to the LLM.\n */\n private formatObservation(logs: string, output: string): string {\n const parts: string[] = [];\n\n if (logs.trim()) {\n parts.push(`Execution logs:\\n${logs}`);\n }\n\n parts.push(`Last output:\\n${output}`);\n\n return `Observation:\\n${parts.join('\\n\\n')}`;\n }\n\n /**\n * Reset the agent and executor state.\n */\n reset(): void {\n this.executor.reset();\n this.currentStep = 0;\n }\n\n /**\n * Get the executor instance.\n */\n getExecutor(): LocalExecutor {\n return this.executor;\n }\n\n /**\n * Override addTool to also register with executor.\n */\n addTool(tool: Tool): void {\n super.addTool(tool);\n this.executor.sendTools({ [tool.name]: tool });\n }\n}\n","/**\n * System prompts for ToolUseAgent\n */\n\nexport interface ToolUsePromptVariables {\n tools: string;\n customInstructions?: string;\n /** Whether this agent has sub-agents (AgentTool instances) */\n hasSubAgents?: boolean;\n /** Whether this agent has file tools (read_file, write_file) */\n hasFileTools?: boolean;\n}\n\n/**\n * Generate the system prompt for ToolUseAgent.\n */\nexport function generateToolUseSystemPrompt(variables: ToolUsePromptVariables): string {\n const { tools, customInstructions, hasSubAgents, hasFileTools } = variables;\n\n // Build content delegation guidelines based on agent capabilities\n let contentGuidelines = '';\n\n if (hasFileTools) {\n contentGuidelines += `\n## Content Output Guidelines\n\nWhen you produce long-form content (reports, articles, analyses, or any output longer than a few paragraphs):\n1. **Save to file**: Use \\`write_file\\` to save the full content to a descriptively-named file (e.g., \\`research_report.md\\`, \\`analysis_results.md\\`).\n2. **Return summary + filename**: In your \\`final_answer\\`, provide a brief summary of what you produced AND the filename where the full content is saved. Example: \"Completed the research report covering X, Y, Z. Full report saved to: research_report.md\"\n\nThis ensures managing agents can access your full output via \\`read_file\\` without it being truncated in message passing.\n`;\n }\n\n if (hasSubAgents) {\n contentGuidelines += `\n## Working with Sub-Agents\n\nWhen you delegate tasks to sub-agents:\n- Sub-agents return a **summary and filename** rather than the full content of long-form outputs.\n- To access the full content a sub-agent produced, use \\`read_file\\` with the filename they provide.\n- **Do NOT re-invoke a sub-agent to retrieve content it already created.** Instead, read the file directly.\n- When composing your own final output from sub-agent results, read their files as needed and synthesize.\n`;\n }\n\n if (hasSubAgents && hasFileTools) {\n contentGuidelines += `\n## When You Are Both a Manager and a Sub-Agent\n\nIf you manage sub-agents AND are yourself delegated tasks by a parent agent:\n- Follow the sub-agent content guidelines: save your own long-form output to a file, return summary + filename.\n- Follow the manager guidelines: read sub-agent output files rather than re-calling them.\n`;\n }\n\n return `You are an expert assistant and problem-solving agent. You solve tasks by reasoning step by step and using the tools available to you.\n\n## How You Work\n\nYou follow a ReAct (Reasoning + Acting) framework:\n1. **Think**: Analyze the current situation and decide what to do next\n2. **Act**: Call one or more tools to perform actions\n3. **Observe**: Review the results of your tool calls\n4. Repeat until you have the final answer\n\n## Available Tools\n\n${tools}\n\n## Rules\n\n1. **Always use final_answer**: When you have the complete answer, call the \\`final_answer\\` tool to return it. This is mandatory - you must always end by calling final_answer.\n\n2. **Think before acting**: Provide your reasoning in the content of your response before making tool calls. This helps track your thought process.\n\n3. **One logical action per step**: Focus on one logical action per step. You may call multiple tools in a single step if they are independent, but avoid chaining dependent operations without reviewing intermediate results.\n\n4. **Handle errors gracefully**: If a tool call fails, analyze the error and try a different approach.\n\n5. **Be concise**: Keep your reasoning brief and focused. Don't over-explain.\n\n6. **Use the right tool**: Choose the most appropriate tool for each action. Don't try to accomplish something a tool can do through other means.\n${contentGuidelines}\n${customInstructions ? `## Additional Instructions\\n\\n${customInstructions}` : ''}\n\nNow, let's solve the task step by step. Think carefully about what tools to use and in what order.`;\n}\n\n/**\n * Format tool descriptions for the system prompt.\n */\nexport function formatToolDescriptions(tools: Array<{ name: string; description: string; inputs: Record<string, { type: string; description: string; required?: boolean }> }>): string {\n return tools.map(tool => {\n const params = Object.entries(tool.inputs)\n .map(([name, input]) => {\n const req = input.required !== false ? ' (required)' : ' (optional)';\n return ` - ${name}${req}: ${input.description}`;\n })\n .join('\\n');\n\n return `### ${tool.name}\\n${tool.description}\\nParameters:\\n${params}`;\n }).join('\\n\\n');\n}\n","/**\n * ToolUseAgent - Executes tasks using standard OpenAI-style tool calls\n *\n * Unlike CodeAgent which generates and executes JavaScript code,\n * ToolUseAgent operates by making tool calls through the LLM's native\n * function calling capabilities, following the ReACT pattern:\n * Think -> Act (tool call) -> Observe (result) -> repeat\n */\n\nimport { Agent, AgentConfig } from './Agent.js';\nimport { FinalAnswerTool } from '../tools/defaultTools.js';\nimport { Tool } from '../tools/Tool.js';\nimport { generateToolUseSystemPrompt, formatToolDescriptions } from '../prompts/toolUseAgent.js';\nimport type { ActionStep, ActionOutput, ToolCall, ToolCallResult } from '../types.js';\n\nexport interface ToolUseAgentConfig extends AgentConfig {\n /** Whether to run independent tool calls in parallel (default: true) */\n parallelToolCalls?: boolean;\n}\n\nexport class ToolUseAgent extends Agent {\n private parallelToolCalls: boolean;\n\n constructor(config: ToolUseAgentConfig) {\n super(config);\n this.parallelToolCalls = config.parallelToolCalls ?? true;\n\n // Always add final_answer tool\n if (!this.tools.has('final_answer')) {\n this.tools.set('final_answer', new FinalAnswerTool());\n }\n }\n\n /**\n * Initialize the system prompt with tool descriptions.\n */\n protected initializeSystemPrompt(): string {\n const toolList = Array.from(this.tools.values());\n const toolDescriptions = formatToolDescriptions(\n toolList.map(t => ({\n name: t.name,\n description: t.description,\n inputs: t.inputs,\n }))\n );\n\n // Detect capabilities for content delegation guidelines\n const toolNames = new Set(Array.from(this.tools.keys()));\n const hasSubAgents = toolList.some(t => t.constructor.name === 'AgentTool');\n const hasFileTools = toolNames.has('read_file') || toolNames.has('write_file') || toolNames.has('read') || toolNames.has('write');\n\n return generateToolUseSystemPrompt({\n tools: toolDescriptions,\n customInstructions: this.config.customInstructions,\n hasSubAgents,\n hasFileTools,\n });\n }\n\n /**\n * Execute a single step: send messages with tool definitions, process tool calls.\n */\n protected async executeStep(memoryStep: ActionStep): Promise<ActionOutput> {\n const messages = this.memory.toMessages();\n memoryStep.modelInputMessages = [...messages];\n\n // Handle error recovery from previous step\n const actionSteps = this.memory.getActionSteps();\n const prevStep = actionSteps.length >= 2 ? actionSteps[actionSteps.length - 2] : undefined;\n if (prevStep?.error) {\n messages.push({\n role: 'user',\n content: `Your previous action encountered an error: ${prevStep.error.message}\\nPlease try a different approach.`,\n });\n }\n\n // Get tool definitions for the API call\n const toolDefinitions = Array.from(this.tools.values()).map(t => t.toOpenAITool());\n\n // Generate response with tool calling\n this.logger.subheader('Agent thinking...');\n const response = await this.model.generate(messages, {\n toolDefinitions,\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n });\n\n memoryStep.modelOutputMessage = response;\n memoryStep.tokenUsage = response.tokenUsage;\n\n // Log reasoning (text content)\n if (response.content && response.content.trim()) {\n this.logger.reasoning(response.content.trim());\n }\n\n // Check if model made tool calls\n if (!response.toolCalls || response.toolCalls.length === 0) {\n // No tool calls - the model just responded with text\n this.logger.warn('No tool calls in response. Prompting model to use tools.');\n memoryStep.observation = 'You must use tools to complete the task. Please call the appropriate tool(s). When you have the final answer, call the final_answer tool.';\n return { output: null, isFinalAnswer: false };\n }\n\n // Process tool calls\n memoryStep.toolCalls = response.toolCalls;\n const toolResults = await this.processToolCalls(response.toolCalls);\n memoryStep.toolResults = toolResults;\n\n // Check if final_answer was called\n for (const result of toolResults) {\n if (result.toolName === 'final_answer') {\n return { output: result.result, isFinalAnswer: true };\n }\n }\n\n // Log tool results as observations\n for (const result of toolResults) {\n if (result.error) {\n this.logger.error(`Tool ${result.toolName} failed: ${result.error}`);\n this.emitEvent('agent_error', { tool: result.toolName, error: result.error });\n } else {\n const resultStr = typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result, null, 2);\n this.logger.output(`[${result.toolName}]: ${resultStr.slice(0, 500)}${resultStr.length > 500 ? '...' : ''}`);\n this.emitEvent('agent_observation', { tool: result.toolName, result: resultStr.slice(0, 500) });\n }\n }\n\n return { output: null, isFinalAnswer: false };\n }\n\n /**\n * Process tool calls from the model response.\n */\n private async processToolCalls(toolCalls: ToolCall[]): Promise<ToolCallResult[]> {\n const results: ToolCallResult[] = [];\n\n // Execute tool calls\n const executeTool = async (tc: ToolCall): Promise<ToolCallResult> => {\n const toolName = tc.function.name;\n const tool = this.tools.get(toolName);\n\n if (!tool) {\n return {\n toolCallId: tc.id,\n toolName,\n result: null,\n error: `Unknown tool: ${toolName}. Available tools: ${Array.from(this.tools.keys()).join(', ')}`,\n };\n }\n\n // Parse arguments\n let args: Record<string, unknown>;\n try {\n args = typeof tc.function.arguments === 'string'\n ? JSON.parse(tc.function.arguments)\n : tc.function.arguments as Record<string, unknown>;\n } catch {\n return {\n toolCallId: tc.id,\n toolName,\n result: null,\n error: `Failed to parse tool arguments: ${tc.function.arguments}`,\n };\n }\n\n this.logger.info(` Calling tool: ${toolName}(${JSON.stringify(args).slice(0, 100)}...)`);\n this.emitEvent('agent_tool_call', { tool: toolName, args });\n\n try {\n const result = await tool.call(args);\n return {\n toolCallId: tc.id,\n toolName,\n result,\n };\n } catch (error) {\n return {\n toolCallId: tc.id,\n toolName,\n result: null,\n error: `Tool execution error: ${(error as Error).message}`,\n };\n }\n };\n\n if (this.parallelToolCalls) {\n const promises = toolCalls.map(tc => executeTool(tc));\n const resolvedResults = await Promise.all(promises);\n results.push(...resolvedResults);\n } else {\n for (const tc of toolCalls) {\n results.push(await executeTool(tc));\n }\n }\n\n return results;\n }\n\n /**\n * Override provideFinalAnswer to use tool calling format.\n */\n protected async provideFinalAnswer(task: string): Promise<unknown> {\n this.logger.subheader('Generating final answer from accumulated context');\n\n const messages = this.memory.toMessages();\n messages.push({\n role: 'user',\n content: `You have reached the maximum number of steps. Based on your work so far, provide the best answer for the task: \"${task}\". Call the final_answer tool with your response.`,\n });\n\n const toolDefinitions = [new FinalAnswerTool().toOpenAITool()];\n const response = await this.model.generate(messages, {\n toolDefinitions,\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n });\n\n // Try to extract from tool call\n if (response.toolCalls && response.toolCalls.length > 0) {\n const tc = response.toolCalls[0];\n try {\n const args = typeof tc.function.arguments === 'string'\n ? JSON.parse(tc.function.arguments)\n : tc.function.arguments;\n return (args as Record<string, unknown>).answer;\n } catch {\n return response.content;\n }\n }\n\n return response.content;\n }\n\n /**\n * Add a tool, which can also be an Agent instance (auto-wraps with AgentTool).\n */\n addTool(tool: Tool): void {\n super.addTool(tool);\n }\n}\n","/**\n * AgentTool - Wraps a CodeAgent as a Tool for use by other agents\n *\n * This enables nested/hierarchical agent architectures where a \"manager\" agent\n * can delegate tasks to specialized \"worker\" agents.\n *\n * Based on the ManagedAgent pattern from Python smolagents.\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\nimport type { Agent } from '../agents/Agent.js';\n\nexport interface AgentToolConfig {\n /**\n * The agent to wrap as a tool\n */\n agent: Agent;\n\n /**\n * Name for the tool (defaults to agent's name or \"managed_agent\")\n */\n name?: string;\n\n /**\n * Description of what this agent does (used in parent agent's prompt)\n */\n description?: string;\n\n /**\n * Additional context to provide to the agent with each task\n */\n additionalContext?: string;\n\n /**\n * Whether to provide the full result object or just the output\n * @default false\n */\n returnFullResult?: boolean;\n}\n\nexport class AgentTool extends Tool {\n readonly name: string;\n readonly description: string;\n readonly inputs: ToolInputs = {\n task: {\n type: 'string',\n description: 'The task or question to delegate to this agent',\n required: true,\n },\n };\n readonly outputType = 'string';\n\n private agent: Agent;\n private additionalContext?: string;\n private returnFullResult: boolean;\n\n constructor(config: AgentToolConfig) {\n super();\n this.agent = config.agent;\n this.name = config.name ?? 'managed_agent';\n this.additionalContext = config.additionalContext;\n this.returnFullResult = config.returnFullResult ?? false;\n\n // Build description from config or generate default\n this.description = config.description ?? this.generateDescription();\n }\n\n /**\n * Generate a default description based on the agent's configuration\n */\n private generateDescription(): string {\n return `Delegates a task to a specialized agent.\nThis agent can help with complex sub-tasks that require multiple steps.\nPass a clear, specific task description and the agent will work autonomously to solve it.\nReturns the agent's final answer as a string.`;\n }\n\n /**\n * Execute the agent with the given task\n */\n async execute(args: Record<string, unknown>): Promise<unknown> {\n let task = args.task as string;\n\n // Add additional context if provided\n if (this.additionalContext) {\n task = `${this.additionalContext}\\n\\nTask: ${task}`;\n }\n\n // Run the agent\n const result = await this.agent.run(task, true);\n\n // Return full result or just output\n if (this.returnFullResult) {\n return {\n output: result.output,\n steps: result.steps.length,\n duration: result.duration,\n };\n }\n\n // Convert output to string if needed\n const output = result.output;\n if (typeof output === 'string') {\n return output;\n }\n return JSON.stringify(output, null, 2);\n }\n\n /**\n * Override toCodePrompt to provide a cleaner signature for nested agents\n */\n toCodePrompt(): string {\n return `\n/**\n * ${this.description}\n *\n * @param task - The task or question to delegate to this specialized agent\n * @returns The agent's answer as a string\n */\nasync function ${this.name}(task: string): Promise<string> { ... }\n`.trim();\n }\n}\n\n/**\n * Helper function to quickly wrap an agent as a tool\n */\nexport function agentAsTool(\n agent: Agent,\n options?: Omit<AgentToolConfig, 'agent'>\n): AgentTool {\n return new AgentTool({ agent, ...options });\n}\n","/**\n * OpenAI-compatible Model implementation\n *\n * Supports any API that follows the OpenAI chat completions format,\n * including OpenRouter, Azure OpenAI, local servers, etc.\n */\n\nimport OpenAI from 'openai';\nimport { Model } from './Model.js';\nimport type { ChatMessage, GenerateOptions, TokenUsage, MessageRole } from '../types.js';\n\nexport interface OpenAIModelConfig {\n /**\n * Model identifier (e.g., \"gpt-4\", \"anthropic/claude-sonnet-4.5\")\n */\n modelId?: string;\n\n /**\n * API key for authentication\n */\n apiKey?: string;\n\n /**\n * Base URL for the API endpoint\n * @default \"https://openrouter.ai/api/v1\"\n */\n baseUrl?: string;\n\n /**\n * Maximum tokens to generate (omitted from requests by default)\n */\n maxTokens?: number;\n\n /**\n * Temperature for generation (omitted from requests by default)\n */\n temperature?: number;\n\n /**\n * Request timeout in milliseconds\n */\n timeout?: number;\n\n /**\n * Default headers to include in requests\n */\n defaultHeaders?: Record<string, string>;\n}\n\nconst DEFAULT_MODEL_ID = 'anthropic/claude-sonnet-4.5';\nconst DEFAULT_BASE_URL = 'https://openrouter.ai/api/v1';\nconst DEFAULT_TIMEOUT = 120000;\n\nexport class OpenAIModel extends Model {\n readonly modelId: string;\n private client: OpenAI;\n private config: OpenAIModelConfig;\n\n constructor(config: OpenAIModelConfig = {}) {\n super();\n\n this.config = config;\n this.modelId = config.modelId ?? DEFAULT_MODEL_ID;\n\n // Get API key from config or environment\n const apiKey = config.apiKey ?? process.env.OPENAI_API_KEY ?? process.env.OPENROUTER_API_KEY;\n\n if (!apiKey) {\n throw new Error(\n 'API key is required. Set OPENAI_API_KEY or OPENROUTER_API_KEY environment variable, or pass apiKey in config.'\n );\n }\n\n this.client = new OpenAI({\n apiKey,\n baseURL: config.baseUrl ?? DEFAULT_BASE_URL,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n defaultHeaders: config.defaultHeaders,\n });\n }\n\n /**\n * Generate a response from the model (supports tool calling).\n */\n async generate(messages: ChatMessage[], options: GenerateOptions = {}): Promise<ChatMessage> {\n const formattedMessages = this.formatMessages(messages);\n\n const requestParams: Record<string, unknown> = {\n model: this.modelId,\n messages: formattedMessages,\n };\n\n // Only include maxTokens if specified at request or model config level\n const maxTokens = options.maxTokens ?? this.config.maxTokens;\n if (maxTokens !== undefined) {\n requestParams.max_tokens = maxTokens;\n }\n\n // Only include temperature if specified at request or model config level\n const temperature = options.temperature ?? this.config.temperature;\n if (temperature !== undefined) {\n requestParams.temperature = temperature;\n }\n\n if (options.stopSequences) {\n requestParams.stop = options.stopSequences;\n }\n\n // Add tool definitions for function calling\n if (options.toolDefinitions && options.toolDefinitions.length > 0) {\n requestParams.tools = options.toolDefinitions;\n } else if (options.tools && options.tools.length > 0) {\n requestParams.tools = options.tools.map(t => t.toOpenAITool());\n }\n\n const response = await this.client.chat.completions.create({\n ...requestParams,\n model: this.modelId,\n messages: formattedMessages as OpenAI.Chat.ChatCompletionMessageParam[],\n } as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming);\n\n const choice = response.choices[0];\n const message = choice?.message;\n\n if (!message) {\n throw new Error('No response from model');\n }\n\n const tokenUsage: TokenUsage | undefined = response.usage\n ? {\n inputTokens: response.usage.prompt_tokens,\n outputTokens: response.usage.completion_tokens ?? 0,\n totalTokens: response.usage.total_tokens,\n }\n : undefined;\n\n // Map tool_calls from OpenAI format\n const toolCalls = message.tool_calls?.map((tc: OpenAI.Chat.ChatCompletionMessageToolCall) => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n }));\n\n return {\n role: 'assistant' as MessageRole,\n content: message.content ?? '',\n toolCalls,\n tokenUsage,\n };\n }\n\n /**\n * Generate a streaming response from the model.\n */\n async *generateStream(\n messages: ChatMessage[],\n options: GenerateOptions = {}\n ): AsyncGenerator<string, ChatMessage, undefined> {\n const formattedMessages = this.formatMessages(messages);\n\n const requestParams: Record<string, unknown> = {\n model: this.modelId,\n messages: formattedMessages,\n stream: true,\n };\n\n const maxTokens = options.maxTokens ?? this.config.maxTokens;\n if (maxTokens !== undefined) {\n requestParams.max_tokens = maxTokens;\n }\n\n const temperature = options.temperature ?? this.config.temperature;\n if (temperature !== undefined) {\n requestParams.temperature = temperature;\n }\n\n if (options.stopSequences) {\n requestParams.stop = options.stopSequences;\n }\n\n const stream = await this.client.chat.completions.create({\n ...requestParams,\n model: this.modelId,\n messages: formattedMessages as OpenAI.Chat.ChatCompletionMessageParam[],\n stream: true,\n } as OpenAI.Chat.ChatCompletionCreateParamsStreaming);\n\n let fullContent = '';\n\n for await (const chunk of stream as AsyncIterable<OpenAI.Chat.ChatCompletionChunk>) {\n const delta = chunk.choices[0]?.delta;\n if (delta?.content) {\n fullContent += delta.content;\n yield delta.content;\n }\n }\n\n return {\n role: 'assistant' as MessageRole,\n content: fullContent,\n };\n }\n\n /**\n * Format messages for the OpenAI API, including tool call/response messages.\n */\n protected formatMessages(messages: ChatMessage[]): OpenAI.Chat.ChatCompletionMessageParam[] {\n return messages.map((msg) => {\n // Handle tool response messages\n if (msg.role === 'tool' && msg.toolCallId) {\n return {\n role: 'tool' as const,\n content: msg.content ?? '',\n tool_call_id: msg.toolCallId,\n };\n }\n\n // Handle tool responses without toolCallId (legacy format)\n if (msg.role === 'tool') {\n return {\n role: 'user' as const,\n content: msg.content ?? '',\n };\n }\n\n // Handle assistant messages with tool calls\n if (msg.role === 'assistant' && msg.toolCalls && msg.toolCalls.length > 0) {\n return {\n role: 'assistant' as const,\n content: msg.content || null,\n tool_calls: msg.toolCalls.map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.function.name,\n arguments: typeof tc.function.arguments === 'string'\n ? tc.function.arguments\n : JSON.stringify(tc.function.arguments),\n },\n })),\n };\n }\n\n return {\n role: msg.role as 'system' | 'user' | 'assistant',\n content: msg.content ?? '',\n };\n });\n }\n}\n","/**\n * Model base class for smol-js\n *\n * Models are responsible for generating text responses from LLMs.\n * Extend this class to support different LLM providers.\n */\n\nimport type { ChatMessage, GenerateOptions, TokenUsage } from '../types.js';\n\nexport abstract class Model {\n /**\n * Model identifier (e.g., \"gpt-4\", \"claude-3-sonnet\")\n */\n abstract readonly modelId: string;\n\n /**\n * Generate a response from the model.\n */\n abstract generate(\n messages: ChatMessage[],\n options?: GenerateOptions\n ): Promise<ChatMessage>;\n\n /**\n * Optional streaming generation.\n * Yields content chunks and returns the final message.\n */\n generateStream?(\n messages: ChatMessage[],\n options?: GenerateOptions\n ): AsyncGenerator<string, ChatMessage, undefined>;\n\n /**\n * Check if the model supports streaming.\n */\n supportsStreaming(): boolean {\n return typeof this.generateStream === 'function';\n }\n\n /**\n * Extract token usage from a response message.\n */\n protected extractTokenUsage(_response: unknown): TokenUsage | undefined {\n // Override in subclasses to extract token usage from API responses\n return undefined;\n }\n\n /**\n * Convert messages to the format expected by the model's API.\n */\n protected formatMessages(messages: ChatMessage[]): unknown[] {\n // Default implementation - override for specific API formats\n return messages.map((msg) => ({\n role: msg.role,\n content: msg.content,\n ...(msg.name && { name: msg.name }),\n ...(msg.toolCallId && { tool_call_id: msg.toolCallId }),\n }));\n }\n}\n","/**\n * ReadFileTool - Read contents from a file\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport class ReadFileTool extends Tool {\n readonly name = 'read_file';\n readonly description = 'Read the contents of a file at the specified path. Returns the file content as a string.';\n readonly inputs: ToolInputs = {\n path: {\n type: 'string',\n description: 'The file path to read (absolute or relative to working directory)',\n required: true,\n },\n encoding: {\n type: 'string',\n description: 'File encoding (default: utf-8)',\n required: false,\n default: 'utf-8',\n },\n };\n readonly outputType = 'string';\n\n private workingDirectory: string;\n\n constructor(config?: { workingDirectory?: string }) {\n super();\n this.workingDirectory = config?.workingDirectory ?? process.cwd();\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const filePath = args.path as string;\n const encoding = (args.encoding as BufferEncoding) ?? 'utf-8';\n\n const resolvedPath = path.isAbsolute(filePath)\n ? filePath\n : path.resolve(this.workingDirectory, filePath);\n\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`File not found: ${resolvedPath}`);\n }\n\n const stat = fs.statSync(resolvedPath);\n if (stat.isDirectory()) {\n throw new Error(`Path is a directory, not a file: ${resolvedPath}`);\n }\n\n const content = fs.readFileSync(resolvedPath, encoding);\n\n // Truncate very large files\n const maxLength = 100000;\n if (content.length > maxLength) {\n return content.slice(0, maxLength) + `\\n\\n[... truncated, file is ${content.length} characters total]`;\n }\n\n return content;\n }\n}\n","/**\n * WriteFileTool - Write content to a file\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport class WriteFileTool extends Tool {\n readonly name = 'write_file';\n readonly description = 'Write content to a file at the specified path. Creates the file if it does not exist, and creates parent directories as needed. Overwrites existing content by default.';\n readonly inputs: ToolInputs = {\n path: {\n type: 'string',\n description: 'The file path to write to (absolute or relative to working directory)',\n required: true,\n },\n content: {\n type: 'string',\n description: 'The content to write to the file',\n required: true,\n },\n append: {\n type: 'boolean',\n description: 'If true, append to the file instead of overwriting (default: false)',\n required: false,\n default: false,\n },\n };\n readonly outputType = 'string';\n\n private workingDirectory: string;\n\n constructor(config?: { workingDirectory?: string }) {\n super();\n this.workingDirectory = config?.workingDirectory ?? process.cwd();\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const filePath = args.path as string;\n const content = args.content as string;\n const append = (args.append as boolean) ?? false;\n\n const resolvedPath = path.isAbsolute(filePath)\n ? filePath\n : path.resolve(this.workingDirectory, filePath);\n\n // Create parent directories if needed\n const dir = path.dirname(resolvedPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n if (append) {\n fs.appendFileSync(resolvedPath, content, 'utf-8');\n return `Successfully appended ${content.length} characters to ${resolvedPath}`;\n } else {\n fs.writeFileSync(resolvedPath, content, 'utf-8');\n return `Successfully wrote ${content.length} characters to ${resolvedPath}`;\n }\n }\n}\n","/**\n * CurlTool - HTTP requests (GET/POST) using fetch\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\n\nexport class CurlTool extends Tool {\n readonly name = 'curl';\n readonly description = 'Make HTTP requests to any URL. Supports GET and POST methods with custom headers and body. Returns the response body as text.';\n readonly inputs: ToolInputs = {\n url: {\n type: 'string',\n description: 'The URL to request',\n required: true,\n },\n method: {\n type: 'string',\n description: 'HTTP method: GET or POST (default: GET)',\n required: false,\n default: 'GET',\n enum: ['GET', 'POST'],\n },\n headers: {\n type: 'object',\n description: 'Optional HTTP headers as key-value pairs (e.g., {\"Content-Type\": \"application/json\"})',\n required: false,\n },\n body: {\n type: 'string',\n description: 'Request body for POST requests (typically JSON string)',\n required: false,\n },\n };\n readonly outputType = 'string';\n\n private timeout: number;\n\n constructor(config?: { timeout?: number }) {\n super();\n this.timeout = config?.timeout ?? 30000;\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const url = args.url as string;\n const method = ((args.method as string) ?? 'GET').toUpperCase();\n const headers = (args.headers as Record<string, string>) ?? {};\n const body = args.body as string | undefined;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (method === 'POST' && body) {\n fetchOptions.body = body;\n if (!headers['Content-Type'] && !headers['content-type']) {\n (fetchOptions.headers as Record<string, string>)['Content-Type'] = 'application/json';\n }\n }\n\n const response = await fetch(url, fetchOptions);\n const responseText = await response.text();\n\n const statusLine = `HTTP ${response.status} ${response.statusText}`;\n\n // Truncate very large responses\n const maxLength = 50000;\n const truncatedBody = responseText.length > maxLength\n ? responseText.slice(0, maxLength) + `\\n\\n[... truncated, response is ${responseText.length} characters total]`\n : responseText;\n\n return `${statusLine}\\n\\n${truncatedBody}`;\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n throw new Error(`Request timed out after ${this.timeout}ms: ${url}`);\n }\n throw new Error(`HTTP request failed: ${(error as Error).message}`);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n","/**\n * ExaSearchTool - Web search using the Exa.ai API\n *\n * Uses Exa's embeddings-based search for semantically intelligent results.\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\n\nexport interface ExaSearchConfig {\n apiKey?: string;\n}\n\nexport class ExaSearchTool extends Tool {\n readonly name = 'exa_search';\n readonly description = 'Search the web using Exa.ai semantic search. Returns relevant web pages with titles, URLs, and optionally content snippets. Use this for finding information, research, and fact-checking.';\n readonly inputs: ToolInputs = {\n query: {\n type: 'string',\n description: 'The search query. Be specific and descriptive for best results.',\n required: true,\n },\n numResults: {\n type: 'number',\n description: 'Number of results to return (default: 10, max: 30)',\n required: false,\n default: 10,\n },\n type: {\n type: 'string',\n description: 'Search type: \"auto\" (default), \"neural\" (embeddings-based), or \"keyword\"',\n required: false,\n default: 'auto',\n enum: ['auto', 'neural', 'keyword'],\n },\n category: {\n type: 'string',\n description: 'Optional category filter: \"research paper\", \"news\", \"pdf\", \"github\", \"tweet\", \"company\", \"blog\"',\n required: false,\n },\n includeDomains: {\n type: 'array',\n description: 'Only include results from these domains (e.g., [\"arxiv.org\", \"github.com\"])',\n required: false,\n },\n excludeDomains: {\n type: 'array',\n description: 'Exclude results from these domains',\n required: false,\n },\n startPublishedDate: {\n type: 'string',\n description: 'Filter results published after this ISO 8601 date (e.g., \"2024-01-01\")',\n required: false,\n },\n };\n readonly outputType = 'string';\n\n private apiKey: string;\n\n constructor(config?: ExaSearchConfig) {\n super();\n this.apiKey = config?.apiKey ?? process.env.EXA_API_KEY ?? '';\n }\n\n async setup(): Promise<void> {\n if (!this.apiKey) {\n throw new Error('EXA_API_KEY is required. Set it as an environment variable or pass it in the config.');\n }\n this.isSetup = true;\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const query = args.query as string;\n const numResults = Math.min((args.numResults as number) ?? 10, 30);\n const type = (args.type as string) ?? 'auto';\n\n const requestBody: Record<string, unknown> = {\n query,\n numResults,\n type,\n text: { maxCharacters: 1000 },\n };\n\n if (args.category) requestBody.category = args.category;\n if (args.includeDomains) requestBody.includeDomains = args.includeDomains;\n if (args.excludeDomains) requestBody.excludeDomains = args.excludeDomains;\n if (args.startPublishedDate) requestBody.startPublishedDate = args.startPublishedDate;\n\n const response = await fetch('https://api.exa.ai/search', {\n method: 'POST',\n headers: {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Exa search failed (${response.status}): ${errorText}`);\n }\n\n const data = await response.json() as {\n results: Array<{\n title?: string;\n url: string;\n publishedDate?: string;\n author?: string;\n text?: string;\n score?: number;\n }>;\n };\n\n if (!data.results || data.results.length === 0) {\n return 'No results found for the query.';\n }\n\n // Format results for the agent\n const formattedResults = data.results.map((result, i) => {\n const parts = [`[${i + 1}] ${result.title ?? 'Untitled'}`];\n parts.push(` URL: ${result.url}`);\n if (result.publishedDate) parts.push(` Date: ${result.publishedDate}`);\n if (result.author) parts.push(` Author: ${result.author}`);\n if (result.text) {\n const snippet = result.text.slice(0, 300).trim();\n parts.push(` Snippet: ${snippet}${result.text.length > 300 ? '...' : ''}`);\n }\n return parts.join('\\n');\n }).join('\\n\\n');\n\n return `Search results for \"${query}\" (${data.results.length} results):\\n\\n${formattedResults}`;\n }\n}\n","/**\n * ExaGetContentsTool - Get webpage contents using Exa.ai API\n *\n * Fetches and extracts clean text content from web pages.\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\n\nexport interface ExaGetContentsConfig {\n apiKey?: string;\n}\n\nexport class ExaGetContentsTool extends Tool {\n readonly name = 'exa_get_contents';\n readonly description = 'Get the full text content of one or more web pages using Exa.ai. Returns cleaned, readable text extracted from the HTML. Use this to read articles, documentation, or any web page content.';\n readonly inputs: ToolInputs = {\n urls: {\n type: 'array',\n description: 'Array of URLs to fetch content from (max 10)',\n required: true,\n },\n maxCharacters: {\n type: 'number',\n description: 'Maximum characters of content to return per page (default: 10000)',\n required: false,\n default: 10000,\n },\n livecrawl: {\n type: 'string',\n description: 'Crawl strategy: \"fallback\" (use cache, fetch live if unavailable), \"always\" (always fetch live), \"never\" (cache only). Default: \"fallback\"',\n required: false,\n default: 'fallback',\n enum: ['fallback', 'always', 'never'],\n },\n };\n readonly outputType = 'string';\n\n private apiKey: string;\n\n constructor(config?: ExaGetContentsConfig) {\n super();\n this.apiKey = config?.apiKey ?? process.env.EXA_API_KEY ?? '';\n }\n\n async setup(): Promise<void> {\n if (!this.apiKey) {\n throw new Error('EXA_API_KEY is required. Set it as an environment variable or pass it in the config.');\n }\n this.isSetup = true;\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const urls = (args.urls as string[]).slice(0, 10);\n const maxCharacters = (args.maxCharacters as number) ?? 10000;\n const livecrawl = (args.livecrawl as string) ?? 'fallback';\n\n const requestBody = {\n urls,\n text: { maxCharacters },\n livecrawl,\n };\n\n const response = await fetch('https://api.exa.ai/contents', {\n method: 'POST',\n headers: {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Exa get contents failed (${response.status}): ${errorText}`);\n }\n\n const data = await response.json() as {\n results: Array<{\n url: string;\n title?: string;\n author?: string;\n publishedDate?: string;\n text?: string;\n }>;\n };\n\n if (!data.results || data.results.length === 0) {\n return 'No content could be retrieved from the provided URLs.';\n }\n\n const formattedResults = data.results.map((result) => {\n const parts = [`## ${result.title ?? result.url}`];\n parts.push(`URL: ${result.url}`);\n if (result.author) parts.push(`Author: ${result.author}`);\n if (result.publishedDate) parts.push(`Date: ${result.publishedDate}`);\n parts.push('');\n if (result.text) {\n parts.push(result.text);\n } else {\n parts.push('[No text content available]');\n }\n return parts.join('\\n');\n }).join('\\n\\n---\\n\\n');\n\n return formattedResults;\n }\n}\n","/**\n * ExaResearchTool - Deep research on a topic using Exa.ai\n *\n * Performs multi-step research by combining search and content retrieval\n * to produce comprehensive findings on a topic.\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\n\nexport interface ExaResearchConfig {\n apiKey?: string;\n}\n\nexport class ExaResearchTool extends Tool {\n readonly name = 'exa_research';\n readonly description = 'Perform deep research on a single topic using Exa.ai. Searches for relevant sources, retrieves their content, and finds similar pages for comprehensive coverage. Returns a structured research summary with sources. Use this for thorough research on any topic.';\n readonly inputs: ToolInputs = {\n topic: {\n type: 'string',\n description: 'The research topic or question to investigate',\n required: true,\n },\n numSources: {\n type: 'number',\n description: 'Number of primary sources to retrieve (default: 5, max: 10)',\n required: false,\n default: 5,\n },\n category: {\n type: 'string',\n description: 'Optional category: \"research paper\", \"news\", \"blog\", \"company\"',\n required: false,\n },\n includeDomains: {\n type: 'array',\n description: 'Only include results from these domains',\n required: false,\n },\n startPublishedDate: {\n type: 'string',\n description: 'Only include results published after this date (ISO 8601)',\n required: false,\n },\n };\n readonly outputType = 'string';\n\n private apiKey: string;\n\n constructor(config?: ExaResearchConfig) {\n super();\n this.apiKey = config?.apiKey ?? process.env.EXA_API_KEY ?? '';\n }\n\n async setup(): Promise<void> {\n if (!this.apiKey) {\n throw new Error('EXA_API_KEY is required. Set it as an environment variable or pass it in the config.');\n }\n this.isSetup = true;\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const topic = args.topic as string;\n const numSources = Math.min((args.numSources as number) ?? 5, 10);\n\n // Step 1: Search for primary sources\n const searchBody: Record<string, unknown> = {\n query: topic,\n numResults: numSources,\n type: 'auto',\n text: { maxCharacters: 3000 },\n };\n\n if (args.category) searchBody.category = args.category;\n if (args.includeDomains) searchBody.includeDomains = args.includeDomains;\n if (args.startPublishedDate) searchBody.startPublishedDate = args.startPublishedDate;\n\n const searchResponse = await fetch('https://api.exa.ai/search', {\n method: 'POST',\n headers: {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(searchBody),\n });\n\n if (!searchResponse.ok) {\n const errorText = await searchResponse.text();\n throw new Error(`Exa research search failed (${searchResponse.status}): ${errorText}`);\n }\n\n const searchData = await searchResponse.json() as {\n results: Array<{\n title?: string;\n url: string;\n publishedDate?: string;\n author?: string;\n text?: string;\n score?: number;\n }>;\n };\n\n if (!searchData.results || searchData.results.length === 0) {\n return `No research sources found for topic: \"${topic}\"`;\n }\n\n // Step 2: Find similar pages to top result for broader coverage\n let similarResults: Array<{ title?: string; url: string; text?: string }> = [];\n if (searchData.results.length > 0) {\n try {\n const similarBody = {\n url: searchData.results[0].url,\n numResults: 3,\n text: { maxCharacters: 2000 },\n };\n\n const similarResponse = await fetch('https://api.exa.ai/findSimilar', {\n method: 'POST',\n headers: {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(similarBody),\n });\n\n if (similarResponse.ok) {\n const similarData = await similarResponse.json() as { results: typeof similarResults };\n similarResults = similarData.results ?? [];\n }\n } catch {\n // Non-critical, continue without similar results\n }\n }\n\n // Step 3: Compile research summary\n const allSources = [...searchData.results, ...similarResults];\n const seenUrls = new Set<string>();\n const uniqueSources = allSources.filter(s => {\n if (seenUrls.has(s.url)) return false;\n seenUrls.add(s.url);\n return true;\n });\n\n const sections: string[] = [];\n sections.push(`# Research: ${topic}\\n`);\n sections.push(`Found ${uniqueSources.length} sources.\\n`);\n\n sections.push('## Key Sources\\n');\n for (let i = 0; i < uniqueSources.length; i++) {\n const source = uniqueSources[i];\n sections.push(`### ${i + 1}. ${source.title ?? 'Untitled'}`);\n sections.push(`URL: ${source.url}`);\n if ('publishedDate' in source && source.publishedDate) {\n sections.push(`Date: ${source.publishedDate}`);\n }\n if ('author' in source && source.author) {\n sections.push(`Author: ${source.author}`);\n }\n if (source.text) {\n sections.push(`\\nContent:\\n${source.text.slice(0, 2000)}`);\n }\n sections.push('');\n }\n\n // Compile source list\n sections.push('## Source URLs\\n');\n uniqueSources.forEach((s, i) => {\n sections.push(`${i + 1}. ${s.url}`);\n });\n\n return sections.join('\\n');\n }\n}\n"],"mappings":"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","names":["fs","path","import_chalk","import_chalk","fs","path","chalk","resolve","fs","path","os","module","OpenAI","fs","path","fs","path","YAML","chalk","dotenv","chalk","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/orchestrator/Orchestrator.ts","../src/orchestrator/YAMLLoader.ts","../src/memory/AgentMemory.ts","../src/logging/AgentLogger.ts","../src/agents/Agent.ts","../src/executor/LocalExecutor.ts","../src/tools/Tool.ts","../src/tools/defaultTools.ts","../src/prompts/codeAgent.ts","../src/agents/CodeAgent.ts","../src/prompts/toolUseAgent.ts","../src/agents/ToolUseAgent.ts","../src/tools/AgentTool.ts","../src/models/OpenAIModel.ts","../src/models/Model.ts","../src/tools/ReadFileTool.ts","../src/tools/WriteFileTool.ts","../src/tools/CurlTool.ts","../src/tools/ExaSearchTool.ts","../src/tools/ExaGetContentsTool.ts","../src/tools/ExaResearchTool.ts"],"sourcesContent":["/**\n * smol-js CLI - Run YAML-defined agent workflows from the command line\n *\n * Usage:\n * smol-js <workflow.yaml> [--task \"your task\"] (auto-detects yaml files)\n * smol-js run <workflow.yaml> [--task \"your task\"]\n * smol-js validate <workflow.yaml>\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as readline from 'readline';\nimport chalk from 'chalk';\nimport dotenv from 'dotenv';\nimport { Orchestrator } from './orchestrator/Orchestrator.js';\n\n// Load environment variables\ndotenv.config();\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {\n printUsage();\n process.exit(0);\n }\n\n const command = args[0];\n\n if (command === 'run') {\n await runCommand(args.slice(1));\n } else if (command === 'validate') {\n await validateCommand(args.slice(1));\n } else if (command.endsWith('.yaml') || command.endsWith('.yml')) {\n // Auto-detect: if first arg is a YAML file, treat as \"run\"\n await runCommand(args);\n } else {\n console.error(chalk.red(`Unknown command: ${command}`));\n printUsage();\n process.exit(1);\n }\n}\n\nfunction printUsage(): void {\n console.log(chalk.cyan.bold('\\nsmol-js CLI - YAML Agent Orchestrator\\n'));\n console.log('Usage:');\n console.log(' smol-js <workflow.yaml> [options] Run a workflow (auto-detect)');\n console.log(' smol-js run <workflow.yaml> [options] Run a workflow (explicit)');\n console.log(' smol-js validate <workflow.yaml> Validate a workflow file');\n console.log('');\n console.log('Options:');\n console.log(' --task, -t <task> Task description (prompted if not provided)');\n console.log(' --quiet, -q Reduce output verbosity');\n console.log(' --help, -h Show this help message');\n console.log('');\n console.log('Examples:');\n console.log(' npx @samrahimi/smol-js workflow.yaml --task \"Research AI safety\"');\n console.log(' smol-js research-agent.yaml -t \"Write a summary of quantum computing\"');\n console.log(' smol-js validate my-workflow.yaml');\n}\n\nasync function runCommand(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(chalk.red('Error: workflow file path required'));\n process.exit(1);\n }\n\n const filePath = args[0];\n let task = '';\n let quiet = false;\n\n // Parse remaining args\n for (let i = 1; i < args.length; i++) {\n if (args[i] === '--task' || args[i] === '-t') {\n task = args[i + 1] ?? '';\n i++;\n } else if (args[i] === '--quiet' || args[i] === '-q') {\n quiet = true;\n }\n }\n\n // Resolve file path\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);\n\n if (!fs.existsSync(resolvedPath)) {\n console.error(chalk.red(`Error: file not found: ${resolvedPath}`));\n process.exit(1);\n }\n\n // Get task from user if not provided\n if (!task) {\n task = await promptUser('Enter your task: ');\n if (!task.trim()) {\n console.error(chalk.red('Error: task cannot be empty'));\n process.exit(1);\n }\n }\n\n // Create orchestrator and run\n const orchestrator = new Orchestrator({ verbose: !quiet });\n\n try {\n console.log(chalk.gray(`\\nLoading workflow from: ${resolvedPath}\\n`));\n const workflow = orchestrator.loadWorkflow(resolvedPath);\n\n await orchestrator.runWorkflow(workflow, task);\n\n // Exit with success\n process.exit(0);\n } catch (error) {\n console.error(chalk.red(`\\nError: ${(error as Error).message}`));\n if (process.env.DEBUG) {\n console.error((error as Error).stack);\n }\n process.exit(1);\n }\n}\n\nasync function validateCommand(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(chalk.red('Error: workflow file path required'));\n process.exit(1);\n }\n\n const filePath = args[0];\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);\n\n if (!fs.existsSync(resolvedPath)) {\n console.error(chalk.red(`Error: file not found: ${resolvedPath}`));\n process.exit(1);\n }\n\n const orchestrator = new Orchestrator({ verbose: false });\n\n try {\n const workflow = orchestrator.loadWorkflow(resolvedPath);\n console.log(chalk.green.bold('✅ Workflow is valid'));\n console.log(chalk.green(` Name: ${workflow.name}`));\n console.log(chalk.green(` Agents: ${Array.from(workflow.agents.keys()).join(', ')}`));\n console.log(chalk.green(` Tools: ${Array.from(workflow.tools.keys()).join(', ') || '(using defaults)'}`));\n console.log(chalk.green(` Entrypoint: ${workflow.entrypointAgent.getName()}`));\n process.exit(0);\n } catch (error) {\n console.error(chalk.red(`❌ Validation failed: ${(error as Error).message}`));\n process.exit(1);\n }\n}\n\nfunction promptUser(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(chalk.cyan(question), (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n\nmain().catch((error) => {\n console.error(chalk.red(`Fatal error: ${error.message}`));\n process.exit(1);\n});\n","/**\n * Orchestrator - Loads, runs, and provides real-time visibility into agent execution\n */\n\nimport chalk from 'chalk';\nimport type { OrchestratorEvent, RunResult } from '../types.js';\nimport { Agent } from '../agents/Agent.js';\nimport { YAMLLoader, LoadedWorkflow } from './YAMLLoader.js';\n\nexport interface OrchestratorConfig {\n /** Whether to display real-time output (default: true) */\n verbose?: boolean;\n /** Callback for orchestrator events */\n onEvent?: (event: OrchestratorEvent) => void;\n}\n\nexport class Orchestrator {\n private loader: YAMLLoader;\n private config: OrchestratorConfig;\n private activeAgents: Map<string, { agent: Agent; depth: number }> = new Map();\n private eventLog: OrchestratorEvent[] = [];\n\n constructor(config: OrchestratorConfig = {}) {\n this.loader = new YAMLLoader();\n this.config = {\n verbose: config.verbose ?? true,\n onEvent: config.onEvent,\n };\n }\n\n /**\n * Load a workflow from a YAML file.\n */\n loadWorkflow(filePath: string): LoadedWorkflow {\n const workflow = this.loader.loadFromFile(filePath);\n this.displayWorkflowInfo(workflow);\n return workflow;\n }\n\n /**\n * Load a workflow from YAML string.\n */\n loadWorkflowFromString(yamlContent: string): LoadedWorkflow {\n const workflow = this.loader.loadFromString(yamlContent);\n this.displayWorkflowInfo(workflow);\n return workflow;\n }\n\n /**\n * Run a loaded workflow with a task.\n */\n async runWorkflow(workflow: LoadedWorkflow, task: string): Promise<RunResult> {\n this.displayRunStart(workflow.name, task);\n\n // Set up event tracking on the entrypoint agent\n this.instrumentAgent(workflow.entrypointAgent, workflow.entrypointAgent.getName(), 0);\n\n // Also instrument sub-agents\n for (const [name, agent] of workflow.agents) {\n if (agent !== workflow.entrypointAgent) {\n this.instrumentAgent(agent, name, 1);\n }\n }\n\n try {\n const result = await workflow.entrypointAgent.run(task);\n this.displayRunEnd(result);\n return result;\n } catch (error) {\n this.displayError(error as Error);\n throw error;\n }\n }\n\n /**\n * Run a standalone agent with a task.\n */\n async runAgent(agent: Agent, task: string): Promise<RunResult> {\n this.instrumentAgent(agent, agent.getName(), 0);\n const result = await agent.run(task);\n return result;\n }\n\n /**\n * Instrument an agent with orchestrator event tracking.\n */\n private instrumentAgent(agent: Agent, name: string, depth: number): void {\n this.activeAgents.set(name, { agent, depth });\n\n // The Agent base class supports onEvent callback through config\n // We'll add event tracking through the logging output\n }\n\n /**\n * Display workflow info at startup.\n */\n private displayWorkflowInfo(workflow: LoadedWorkflow): void {\n if (!this.config.verbose) return;\n\n const line = '═'.repeat(70);\n console.log(chalk.cyan(line));\n console.log(chalk.cyan.bold(` Workflow: ${workflow.name}`));\n if (workflow.description) {\n console.log(chalk.cyan(` ${workflow.description}`));\n }\n console.log(chalk.cyan(` Agents: ${Array.from(workflow.agents.keys()).join(', ')}`));\n console.log(chalk.cyan(` Tools: ${Array.from(workflow.tools.keys()).join(', ') || '(none defined at workflow level)'}`));\n console.log(chalk.cyan(` Entrypoint: ${workflow.entrypointAgent.getName()}`));\n console.log(chalk.cyan(line));\n console.log();\n }\n\n /**\n * Display run start info.\n */\n private displayRunStart(workflowName: string, task: string): void {\n if (!this.config.verbose) return;\n console.log(chalk.green.bold(`\\n▶ Running workflow \"${workflowName}\"`));\n console.log(chalk.green(` Task: ${task}`));\n console.log(chalk.gray('─'.repeat(70)));\n }\n\n /**\n * Display run completion info.\n */\n private displayRunEnd(result: RunResult): void {\n if (!this.config.verbose) return;\n console.log(chalk.gray('\\n' + '─'.repeat(70)));\n console.log(chalk.green.bold(`\\n✅ Workflow complete`));\n console.log(chalk.green(` Duration: ${(result.duration / 1000).toFixed(2)}s`));\n console.log(chalk.green(` Tokens: ${result.tokenUsage.totalTokens}`));\n console.log(chalk.green(` Steps: ${result.steps.length}`));\n\n const outputStr = typeof result.output === 'string'\n ? result.output\n : JSON.stringify(result.output, null, 2);\n console.log(chalk.magenta.bold('\\n Final Output:'));\n // Indent output\n const indentedOutput = outputStr.split('\\n').map(line => ` ${line}`).join('\\n');\n console.log(chalk.magenta(indentedOutput));\n console.log();\n }\n\n /**\n * Display an error.\n */\n private displayError(error: Error): void {\n if (!this.config.verbose) return;\n console.error(chalk.red.bold(`\\n❌ Workflow failed: ${error.message}`));\n if (error.stack) {\n console.error(chalk.red.dim(error.stack));\n }\n }\n\n /**\n * Log an orchestration event.\n */\n logEvent(event: OrchestratorEvent): void {\n this.eventLog.push(event);\n if (this.config.onEvent) {\n this.config.onEvent(event);\n }\n }\n\n /**\n * Get the event log.\n */\n getEventLog(): OrchestratorEvent[] {\n return [...this.eventLog];\n }\n\n /**\n * Get the YAML loader for registering custom tools.\n */\n getLoader(): YAMLLoader {\n return this.loader;\n }\n}\n","/**\n * YAMLLoader - Loads and parses YAML workflow definitions into runnable agents\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport YAML from 'yaml';\nimport type { YAMLWorkflowDefinition, YAMLAgentDefinition, YAMLModelDefinition } from '../types.js';\nimport { Agent } from '../agents/Agent.js';\nimport { CodeAgent } from '../agents/CodeAgent.js';\nimport { ToolUseAgent } from '../agents/ToolUseAgent.js';\nimport { Tool } from '../tools/Tool.js';\nimport { AgentTool } from '../tools/AgentTool.js';\nimport { OpenAIModel } from '../models/OpenAIModel.js';\nimport { ReadFileTool } from '../tools/ReadFileTool.js';\nimport { WriteFileTool } from '../tools/WriteFileTool.js';\nimport { CurlTool } from '../tools/CurlTool.js';\nimport { ExaSearchTool } from '../tools/ExaSearchTool.js';\nimport { ExaGetContentsTool } from '../tools/ExaGetContentsTool.js';\nimport { ExaResearchTool } from '../tools/ExaResearchTool.js';\nimport { FinalAnswerTool } from '../tools/defaultTools.js';\n\n// Registry of built-in tool types\nconst TOOL_REGISTRY: Record<string, new (config?: Record<string, unknown>) => Tool> = {\n read_file: ReadFileTool as unknown as new (config?: Record<string, unknown>) => Tool,\n write_file: WriteFileTool as unknown as new (config?: Record<string, unknown>) => Tool,\n curl: CurlTool as unknown as new (config?: Record<string, unknown>) => Tool,\n exa_search: ExaSearchTool as unknown as new (config?: Record<string, unknown>) => Tool,\n exa_get_contents: ExaGetContentsTool as unknown as new (config?: Record<string, unknown>) => Tool,\n exa_research: ExaResearchTool as unknown as new (config?: Record<string, unknown>) => Tool,\n final_answer: FinalAnswerTool as unknown as new (config?: Record<string, unknown>) => Tool,\n};\n\nexport interface LoadedWorkflow {\n name: string;\n description?: string;\n entrypointAgent: Agent;\n agents: Map<string, Agent>;\n tools: Map<string, Tool>;\n}\n\nexport class YAMLLoader {\n private customTools: Map<string, new (config?: Record<string, unknown>) => Tool> = new Map();\n\n /**\n * Register a custom tool type for use in YAML definitions.\n */\n registerToolType(typeName: string, toolClass: new (config?: Record<string, unknown>) => Tool): void {\n this.customTools.set(typeName, toolClass);\n }\n\n /**\n * Load a workflow from a YAML file path.\n */\n loadFromFile(filePath: string): LoadedWorkflow {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);\n\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`Workflow file not found: ${absolutePath}`);\n }\n\n const content = fs.readFileSync(absolutePath, 'utf-8');\n return this.loadFromString(content);\n }\n\n /**\n * Load a workflow from a YAML string.\n */\n loadFromString(yamlContent: string): LoadedWorkflow {\n const definition = YAML.parse(yamlContent) as YAMLWorkflowDefinition;\n return this.buildWorkflow(definition);\n }\n\n /**\n * Build a runnable workflow from a parsed definition.\n */\n private buildWorkflow(definition: YAMLWorkflowDefinition): LoadedWorkflow {\n if (!definition.name) {\n throw new Error('Workflow must have a name');\n }\n if (!definition.entrypoint) {\n throw new Error('Workflow must have an entrypoint agent');\n }\n if (!definition.agents) {\n throw new Error('Workflow must define at least one agent');\n }\n\n // Build tools\n const tools = new Map<string, Tool>();\n if (definition.tools) {\n for (const [name, toolDef] of Object.entries(definition.tools)) {\n const tool = this.buildTool(name, toolDef.type, toolDef.config);\n tools.set(name, tool);\n }\n }\n\n // Build agents (handling dependencies between agents)\n const agents = new Map<string, Agent>();\n const agentDefs = definition.agents;\n\n // Topological sort: build agents that don't depend on other agents first\n const resolved = new Set<string>();\n const maxIterations = Object.keys(agentDefs).length * 2;\n let iterations = 0;\n\n while (resolved.size < Object.keys(agentDefs).length && iterations < maxIterations) {\n iterations++;\n for (const [agentName, agentDef] of Object.entries(agentDefs)) {\n if (resolved.has(agentName)) continue;\n\n // Check if all agent dependencies are resolved\n const agentDeps = agentDef.agents ?? [];\n const allDepsResolved = agentDeps.every(dep => resolved.has(dep));\n\n if (allDepsResolved) {\n const agent = this.buildAgent(\n agentName,\n agentDef,\n definition.model,\n tools,\n agents,\n definition.globalMaxContextLength\n );\n agents.set(agentName, agent);\n resolved.add(agentName);\n }\n }\n }\n\n if (resolved.size < Object.keys(agentDefs).length) {\n const unresolved = Object.keys(agentDefs).filter(n => !resolved.has(n));\n throw new Error(`Circular or unresolvable agent dependencies: ${unresolved.join(', ')}`);\n }\n\n const entrypointAgent = agents.get(definition.entrypoint);\n if (!entrypointAgent) {\n throw new Error(`Entrypoint agent \"${definition.entrypoint}\" not found in agents`);\n }\n\n return {\n name: definition.name,\n description: definition.description,\n entrypointAgent,\n agents,\n tools,\n };\n }\n\n /**\n * Build a tool instance from a type name and config.\n */\n private buildTool(name: string, type: string, config?: Record<string, unknown>): Tool {\n const ToolClass = TOOL_REGISTRY[type] ?? this.customTools.get(type);\n\n if (!ToolClass) {\n throw new Error(`Unknown tool type: ${type}. Available types: ${[...Object.keys(TOOL_REGISTRY), ...this.customTools.keys()].join(', ')}`);\n }\n\n const tool = new ToolClass(config);\n // Override name if different from type\n if (name !== type && name !== tool.name) {\n Object.defineProperty(tool, 'name', { value: name, writable: false });\n }\n return tool;\n }\n\n /**\n * Build an agent instance from a YAML definition.\n */\n private buildAgent(\n name: string,\n definition: YAMLAgentDefinition,\n globalModel?: YAMLModelDefinition,\n availableTools?: Map<string, Tool>,\n resolvedAgents?: Map<string, Agent>,\n globalMaxContextLength?: number\n ): Agent {\n // Build model\n const modelConfig = definition.model ?? globalModel;\n const model = new OpenAIModel({\n modelId: modelConfig?.modelId,\n apiKey: modelConfig?.apiKey,\n baseUrl: modelConfig?.baseUrl,\n maxTokens: definition.maxTokens ?? modelConfig?.maxTokens,\n temperature: definition.temperature ?? modelConfig?.temperature,\n timeout: modelConfig?.timeout,\n });\n\n // Collect tools\n const agentTools: Tool[] = [];\n\n // Add referenced tools\n if (definition.tools && availableTools) {\n for (const toolName of definition.tools) {\n const tool = availableTools.get(toolName);\n if (tool) {\n agentTools.push(tool);\n } else {\n // Try to create from registry directly\n const ToolClass = TOOL_REGISTRY[toolName] ?? this.customTools.get(toolName);\n if (ToolClass) {\n agentTools.push(new ToolClass());\n } else {\n throw new Error(`Tool \"${toolName}\" not found for agent \"${name}\"`);\n }\n }\n }\n }\n\n // Add sub-agents as tools\n if (definition.agents && resolvedAgents) {\n for (const subAgentName of definition.agents) {\n const subAgent = resolvedAgents.get(subAgentName);\n if (!subAgent) {\n throw new Error(`Sub-agent \"${subAgentName}\" not found for agent \"${name}\"`);\n }\n agentTools.push(new AgentTool({\n agent: subAgent,\n name: subAgentName,\n description: definition.description\n ? `Sub-agent: ${subAgentName}`\n : `Delegate tasks to the ${subAgentName} agent`,\n }));\n }\n }\n\n const maxContextLength = definition.maxContextLength ?? globalMaxContextLength;\n\n // Build the agent based on type\n if (definition.type === 'CodeAgent') {\n return new CodeAgent({\n model,\n tools: agentTools,\n maxSteps: definition.maxSteps,\n customInstructions: definition.customInstructions,\n persistent: definition.persistent,\n maxContextLength,\n memoryStrategy: definition.memoryStrategy,\n maxTokens: definition.maxTokens,\n temperature: definition.temperature,\n name,\n });\n } else {\n // Default: ToolUseAgent\n return new ToolUseAgent({\n model,\n tools: agentTools,\n maxSteps: definition.maxSteps,\n customInstructions: definition.customInstructions,\n persistent: definition.persistent,\n maxContextLength,\n memoryStrategy: definition.memoryStrategy,\n maxTokens: definition.maxTokens,\n temperature: definition.temperature,\n name,\n });\n }\n }\n}\n","/**\n * AgentMemory - Tracks agent execution history with context management\n */\n\nimport type {\n MemoryStep,\n SystemPromptStep,\n TaskStep,\n ActionStep,\n FinalAnswerStep,\n ChatMessage,\n TokenUsage,\n MemoryStrategy,\n Model,\n} from '../types.js';\n\nexport interface MemoryConfig {\n maxContextLength?: number;\n memoryStrategy?: MemoryStrategy;\n model?: Model;\n}\n\n// Rough token estimation: ~4 chars per token on average\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\nfunction estimateMessagesTokens(messages: ChatMessage[]): number {\n let total = 0;\n for (const msg of messages) {\n total += estimateTokens(msg.content ?? '');\n if (msg.toolCalls) {\n total += estimateTokens(JSON.stringify(msg.toolCalls));\n }\n total += 4; // overhead per message (role, etc.)\n }\n return total;\n}\n\nexport class AgentMemory {\n /** System prompt step (always first) */\n systemPrompt: SystemPromptStep;\n\n /** All execution steps */\n steps: (TaskStep | ActionStep | FinalAnswerStep)[] = [];\n\n private maxContextLength: number;\n private memoryStrategy: MemoryStrategy;\n private model?: Model;\n\n constructor(systemPrompt: string, config?: MemoryConfig) {\n this.systemPrompt = {\n type: 'system',\n content: systemPrompt,\n timestamp: Date.now(),\n };\n this.maxContextLength = config?.maxContextLength ?? 100000;\n this.memoryStrategy = config?.memoryStrategy ?? 'truncate';\n this.model = config?.model;\n }\n\n /** Reset memory, keeping only the system prompt */\n reset(): void {\n this.steps = [];\n }\n\n /** Add a task step */\n addTask(task: string): TaskStep {\n const step: TaskStep = {\n type: 'task',\n task,\n timestamp: Date.now(),\n };\n this.steps.push(step);\n return step;\n }\n\n /** Create a new action step */\n createActionStep(stepNumber: number): ActionStep {\n const step: ActionStep = {\n type: 'action',\n stepNumber,\n timing: { startTime: Date.now() },\n modelInputMessages: [],\n timestamp: Date.now(),\n };\n this.steps.push(step);\n return step;\n }\n\n /** Add a final answer step */\n addFinalAnswer(answer: unknown): FinalAnswerStep {\n const step: FinalAnswerStep = {\n type: 'final',\n answer,\n timestamp: Date.now(),\n };\n this.steps.push(step);\n return step;\n }\n\n /** Get the last step */\n getLastStep(): MemoryStep | undefined {\n return this.steps[this.steps.length - 1];\n }\n\n /** Get all action steps */\n getActionSteps(): ActionStep[] {\n return this.steps.filter((s): s is ActionStep => s.type === 'action');\n }\n\n /**\n * Convert memory to messages for LLM context.\n * Handles both CodeAgent (observation-based) and ToolUseAgent (tool_call-based) patterns.\n */\n toMessages(): ChatMessage[] {\n const messages: ChatMessage[] = [];\n\n // System prompt\n messages.push({\n role: 'system',\n content: this.systemPrompt.content,\n });\n\n for (const step of this.steps) {\n switch (step.type) {\n case 'task':\n messages.push({\n role: 'user',\n content: `Task: ${step.task}`,\n });\n break;\n\n case 'action':\n // Assistant response with tool calls (ToolUseAgent)\n if (step.toolCalls && step.toolCalls.length > 0) {\n messages.push({\n role: 'assistant',\n content: step.modelOutputMessage?.content ?? null,\n toolCalls: step.toolCalls,\n });\n\n // Add tool results\n if (step.toolResults) {\n for (const result of step.toolResults) {\n messages.push({\n role: 'tool',\n content: result.error\n ? `Error: ${result.error}`\n : typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result, null, 2),\n toolCallId: result.toolCallId,\n });\n }\n }\n } else {\n // CodeAgent pattern: assistant message + observation\n if (step.modelOutputMessage) {\n messages.push({\n role: 'assistant',\n content: step.modelOutputMessage.content,\n });\n }\n\n if (step.observation) {\n messages.push({\n role: 'user',\n content: step.observation,\n });\n }\n\n if (step.error && !step.observation) {\n messages.push({\n role: 'user',\n content: `Error: ${step.error.message}`,\n });\n }\n }\n break;\n\n case 'final':\n break;\n }\n }\n\n return messages;\n }\n\n /**\n * Manage context length - truncate or compact if exceeded.\n */\n async manageContext(): Promise<void> {\n const messages = this.toMessages();\n const tokenCount = estimateMessagesTokens(messages);\n\n if (tokenCount <= this.maxContextLength) {\n return;\n }\n\n if (this.memoryStrategy === 'truncate') {\n this.truncateOlderMessages();\n } else if (this.memoryStrategy === 'compact') {\n await this.compactMessages();\n }\n }\n\n /**\n * Truncate older action steps to fit within context.\n */\n private truncateOlderMessages(): void {\n // Keep system prompt, task, and recent steps\n const actionSteps = this.getActionSteps();\n if (actionSteps.length <= 2) return;\n\n // Remove oldest action steps until we fit\n const targetTokens = this.maxContextLength * 0.75;\n let currentTokens = estimateMessagesTokens(this.toMessages());\n\n while (currentTokens > targetTokens && this.steps.length > 2) {\n // Find first action step and remove it\n const idx = this.steps.findIndex(s => s.type === 'action');\n if (idx === -1) break;\n this.steps.splice(idx, 1);\n currentTokens = estimateMessagesTokens(this.toMessages());\n }\n }\n\n /**\n * Compact older messages into a summary.\n */\n private async compactMessages(): Promise<void> {\n if (!this.model) {\n // Fall back to truncation if no model available\n this.truncateOlderMessages();\n return;\n }\n\n const actionSteps = this.getActionSteps();\n if (actionSteps.length <= 2) return;\n\n // Summarize older steps\n const stepsToSummarize = actionSteps.slice(0, -2);\n const summaryContent = stepsToSummarize.map(step => {\n const parts: string[] = [];\n if (step.modelOutputMessage?.content) {\n parts.push(`Action: ${step.modelOutputMessage.content.slice(0, 200)}`);\n }\n if (step.observation) {\n parts.push(`Observation: ${step.observation.slice(0, 200)}`);\n }\n if (step.toolResults) {\n for (const r of step.toolResults) {\n const resultStr = typeof r.result === 'string' ? r.result : JSON.stringify(r.result);\n parts.push(`Tool ${r.toolName}: ${resultStr.slice(0, 200)}`);\n }\n }\n return parts.join('\\n');\n }).join('\\n---\\n');\n\n try {\n const summaryResponse = await this.model.generate([\n {\n role: 'system',\n content: 'Summarize the following agent execution history concisely, preserving key findings and results. Be brief but complete.',\n },\n {\n role: 'user',\n content: summaryContent,\n },\n ]);\n\n // Remove the summarized steps and replace with a summary task step\n const recentSteps = this.steps.filter(s =>\n s.type === 'task' || s.type === 'final' ||\n (s.type === 'action' && actionSteps.indexOf(s) >= actionSteps.length - 2)\n );\n\n this.steps = [\n {\n type: 'task' as const,\n task: `[Context Summary from previous steps]\\n${summaryResponse.content}`,\n timestamp: Date.now(),\n },\n ...recentSteps,\n ];\n } catch {\n // Fall back to truncation\n this.truncateOlderMessages();\n }\n }\n\n /** Get total token usage across all steps */\n getTotalTokenUsage(): TokenUsage {\n let inputTokens = 0;\n let outputTokens = 0;\n\n for (const step of this.steps) {\n if (step.type === 'action' && step.tokenUsage) {\n inputTokens += step.tokenUsage.inputTokens;\n outputTokens += step.tokenUsage.outputTokens;\n }\n }\n\n return {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n };\n }\n\n /** Get current estimated token count */\n getEstimatedTokenCount(): number {\n return estimateMessagesTokens(this.toMessages());\n }\n\n /** Get a summary of the memory for logging */\n getSummary(): string {\n const actionSteps = this.getActionSteps();\n const lines = [\n `System Prompt: ${this.systemPrompt.content.slice(0, 100)}...`,\n `Total Steps: ${this.steps.length}`,\n `Action Steps: ${actionSteps.length}`,\n ];\n\n const tokenUsage = this.getTotalTokenUsage();\n if (tokenUsage.totalTokens > 0) {\n lines.push(`Total Tokens: ${tokenUsage.totalTokens}`);\n }\n\n return lines.join('\\n');\n }\n\n /** Serialize memory to JSON */\n toJSON(): Record<string, unknown> {\n return {\n systemPrompt: this.systemPrompt,\n steps: this.steps,\n };\n }\n}\n","/**\n * AgentLogger - Color-coded console logging for agent execution\n *\n * Provides formatted output with different colors for:\n * - Headers (cyan)\n * - Reasoning/Thoughts (yellow)\n * - Code blocks (green)\n * - Output/Results (blue)\n * - Errors (red)\n */\n\nimport chalk from 'chalk';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { LogLevel } from '../types.js';\n\n// Log file directory\nconst LOG_DIR = path.join(os.homedir(), '.smol-js/logs');\n\nexport class AgentLogger {\n private level: LogLevel;\n private logFile?: fs.WriteStream;\n private sessionId: string;\n\n constructor(level: LogLevel = LogLevel.INFO) {\n this.level = level;\n this.sessionId = this.generateSessionId();\n\n // Initialize log file if logging is enabled\n if (level > LogLevel.OFF) {\n this.initLogFile();\n }\n }\n\n /**\n * Generate a unique session ID.\n */\n private generateSessionId(): string {\n const now = new Date();\n const timestamp = now.toISOString().replace(/[:.]/g, '-');\n return `session-${timestamp}`;\n }\n\n /**\n * Initialize the log file.\n */\n private initLogFile(): void {\n try {\n // Create log directory if it doesn't exist\n if (!fs.existsSync(LOG_DIR)) {\n fs.mkdirSync(LOG_DIR, { recursive: true });\n }\n\n const logPath = path.join(LOG_DIR, `${this.sessionId}.log`);\n this.logFile = fs.createWriteStream(logPath, { flags: 'a' });\n\n this.writeToFile(`=== Session Started: ${new Date().toISOString()} ===\\n\\n`);\n } catch (error) {\n console.warn('Could not create log file:', (error as Error).message);\n }\n }\n\n /**\n * Write to the log file.\n */\n private writeToFile(content: string): void {\n if (this.logFile) {\n // Strip ANSI codes for file output\n // eslint-disable-next-line no-control-regex\n const cleanContent = content.replace(/\\x1b\\[[0-9;]*m/g, '');\n this.logFile.write(cleanContent);\n }\n }\n\n /**\n * Set the log level.\n */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /**\n * Log a header (task start, step start, etc.)\n */\n header(message: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const line = '═'.repeat(60);\n const output = `\\n${chalk.cyan(line)}\\n${chalk.cyan.bold(message)}\\n${chalk.cyan(line)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n${'═'.repeat(60)}\\n${message}\\n${'═'.repeat(60)}\\n`);\n }\n\n /**\n * Log a subheader.\n */\n subheader(message: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `\\n${chalk.cyan('─'.repeat(40))}\\n${chalk.cyan(message)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n${'─'.repeat(40)}\\n${message}\\n`);\n }\n\n /**\n * Log reasoning/thought from the agent.\n */\n reasoning(content: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.yellow.bold('💭 Reasoning:')}\\n${chalk.yellow(content)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n💭 Reasoning:\\n${content}\\n`);\n }\n\n /**\n * Log code block.\n */\n code(content: string, language: string = 'javascript', level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.green.bold('📝 Code:')}\\n${chalk.green('```' + language)}\\n${chalk.green(content)}\\n${chalk.green('```')}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n📝 Code:\\n\\`\\`\\`${language}\\n${content}\\n\\`\\`\\`\\n`);\n }\n\n /**\n * Log execution output.\n */\n output(content: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.blue.bold('📤 Output:')}\\n${chalk.blue(content)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n📤 Output:\\n${content}\\n`);\n }\n\n /**\n * Log execution logs (print statements).\n */\n logs(content: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level || !content.trim()) return;\n\n const output = `${chalk.gray.bold('📋 Logs:')}\\n${chalk.gray(content)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n📋 Logs:\\n${content}\\n`);\n }\n\n /**\n * Log an error.\n */\n error(message: string, error?: Error, level: LogLevel = LogLevel.ERROR): void {\n if (this.level < level) return;\n\n const errorMessage = error ? `${message}: ${error.message}` : message;\n const output = `${chalk.red.bold('❌ Error:')}\\n${chalk.red(errorMessage)}\\n`;\n\n console.error(output);\n this.writeToFile(`\\n❌ Error:\\n${errorMessage}\\n`);\n\n if (error?.stack && this.level >= LogLevel.DEBUG) {\n console.error(chalk.red.dim(error.stack));\n this.writeToFile(`Stack: ${error.stack}\\n`);\n }\n }\n\n /**\n * Log a warning.\n */\n warn(message: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.yellow.bold('⚠️ Warning:')} ${chalk.yellow(message)}\\n`;\n\n console.warn(output);\n this.writeToFile(`\\n⚠️ Warning: ${message}\\n`);\n }\n\n /**\n * Log general info.\n */\n info(message: string, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.white(message)}`;\n\n console.log(output);\n this.writeToFile(`${message}\\n`);\n }\n\n /**\n * Log debug info.\n */\n debug(message: string): void {\n if (this.level < LogLevel.DEBUG) return;\n\n const output = `${chalk.dim('[DEBUG]')} ${chalk.dim(message)}`;\n\n console.log(output);\n this.writeToFile(`[DEBUG] ${message}\\n`);\n }\n\n /**\n * Log final answer.\n */\n finalAnswer(answer: unknown, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const line = '═'.repeat(60);\n const answerStr = typeof answer === 'string' ? answer : JSON.stringify(answer, null, 2);\n const output = `\\n${chalk.magenta(line)}\\n${chalk.magenta.bold('✅ Final Answer:')}\\n${chalk.magenta(answerStr)}\\n${chalk.magenta(line)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n${'═'.repeat(60)}\\n✅ Final Answer:\\n${answerStr}\\n${'═'.repeat(60)}\\n`);\n }\n\n /**\n * Log step progress.\n */\n stepProgress(current: number, max: number, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.cyan.bold(`\\n🔄 Step ${current}/${max}`)}\\n`;\n\n console.log(output);\n this.writeToFile(`\\n🔄 Step ${current}/${max}\\n`);\n }\n\n /**\n * Log waiting message for code execution delay.\n */\n waiting(seconds: number, level: LogLevel = LogLevel.INFO): void {\n if (this.level < level) return;\n\n const output = `${chalk.yellow(`⏳ Waiting ${seconds}s before code execution (Ctrl+C to abort)...`)}`;\n\n console.log(output);\n this.writeToFile(`⏳ Waiting ${seconds}s before code execution...\\n`);\n }\n\n /**\n * Stream content character by character.\n */\n streamChar(char: string): void {\n if (this.level < LogLevel.INFO) return;\n process.stdout.write(chalk.yellow(char));\n }\n\n /**\n * End streaming (add newline).\n */\n streamEnd(): void {\n if (this.level < LogLevel.INFO) return;\n console.log();\n }\n\n /**\n * Close the log file.\n */\n close(): void {\n if (this.logFile) {\n this.writeToFile(`\\n=== Session Ended: ${new Date().toISOString()} ===\\n`);\n this.logFile.end();\n }\n }\n\n /**\n * Get the log file path.\n */\n getLogPath(): string | undefined {\n return this.logFile ? path.join(LOG_DIR, `${this.sessionId}.log`) : undefined;\n }\n}\n","/**\n * Agent - Abstract base class for all agents\n *\n * Provides the foundation for multi-step agents that follow the ReAct framework.\n * Extend this class to create specific agent implementations.\n */\n\nimport type {\n ActionStep,\n RunResult,\n LogLevel,\n ActionOutput,\n MemoryStrategy,\n} from '../types.js';\nimport { Tool } from '../tools/Tool.js';\nimport { Model } from '../models/Model.js';\nimport { AgentMemory } from '../memory/AgentMemory.js';\nimport { AgentLogger } from '../logging/AgentLogger.js';\nimport { LogLevel as LogLevelEnum } from '../types.js';\n\n// Default global max context length (in tokens, estimated)\nconst DEFAULT_MAX_CONTEXT_LENGTH = 100000;\n\nexport interface AgentConfig {\n /** The LLM model to use for generation */\n model: Model;\n\n /** Tools available to the agent */\n tools?: Tool[];\n\n /** Maximum number of steps before stopping (default: 20) */\n maxSteps?: number;\n\n /** Delay in ms before executing code (default: 5000) */\n codeExecutionDelay?: number;\n\n /** Custom instructions appended to system prompt */\n customInstructions?: string;\n\n /** Log level for output (default: INFO) */\n verboseLevel?: LogLevel;\n\n /** Whether to stream model outputs (default: true) */\n streamOutputs?: boolean;\n\n /** Whether the agent retains memory between run() calls (default: false) */\n persistent?: boolean;\n\n /** Max context length in tokens (default: 100000) */\n maxContextLength?: number;\n\n /** Memory management strategy when context is exceeded (default: 'truncate') */\n memoryStrategy?: MemoryStrategy;\n\n /** Max tokens for generation (passed to model if set) */\n maxTokens?: number;\n\n /** Temperature for generation (passed to model if set) */\n temperature?: number;\n\n /** Agent name for logging */\n name?: string;\n\n /** Callback for orchestration events */\n onEvent?: (event: { type: string; data: unknown }) => void;\n}\n\nexport abstract class Agent {\n /** The LLM model for generation */\n protected model: Model;\n\n /** Available tools mapped by name */\n protected tools: Map<string, Tool> = new Map();\n\n /** Agent memory tracking all steps */\n protected memory!: AgentMemory;\n\n /** Logger for formatted output */\n protected logger: AgentLogger;\n\n /** Configuration options */\n protected config: {\n maxSteps: number;\n codeExecutionDelay: number;\n customInstructions: string;\n verboseLevel: LogLevel;\n streamOutputs: boolean;\n persistent: boolean;\n maxContextLength: number;\n memoryStrategy: MemoryStrategy;\n maxTokens?: number;\n temperature?: number;\n name: string;\n onEvent?: (event: { type: string; data: unknown }) => void;\n };\n\n /** Current step number */\n protected currentStep: number = 0;\n\n /** Whether the agent is currently running */\n protected isRunning: boolean = false;\n\n /** Whether the agent has been initialized at least once */\n private initialized: boolean = false;\n\n constructor(config: AgentConfig) {\n this.model = config.model;\n this.logger = new AgentLogger(config.verboseLevel ?? LogLevelEnum.INFO);\n\n this.config = {\n maxSteps: config.maxSteps ?? 20,\n codeExecutionDelay: config.codeExecutionDelay ?? 5000,\n customInstructions: config.customInstructions ?? '',\n verboseLevel: config.verboseLevel ?? LogLevelEnum.INFO,\n streamOutputs: config.streamOutputs ?? true,\n persistent: config.persistent ?? false,\n maxContextLength: config.maxContextLength ?? DEFAULT_MAX_CONTEXT_LENGTH,\n memoryStrategy: config.memoryStrategy ?? 'truncate',\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n name: config.name ?? 'Agent',\n onEvent: config.onEvent,\n };\n\n // Register tools\n if (config.tools) {\n for (const tool of config.tools) {\n this.tools.set(tool.name, tool);\n }\n }\n }\n\n /**\n * Initialize the system prompt for the agent.\n * Must be implemented by subclasses.\n */\n protected abstract initializeSystemPrompt(): string;\n\n /**\n * Execute a single step in the agent loop.\n * Must be implemented by subclasses.\n */\n protected abstract executeStep(memoryStep: ActionStep): Promise<ActionOutput>;\n\n /**\n * Run the agent on a task.\n */\n async run(task: string, reset: boolean = true): Promise<RunResult> {\n const startTime = Date.now();\n\n // For persistent agents, only reset if explicitly requested or first run\n const shouldReset = !this.config.persistent ? (reset || !this.memory) : (!this.initialized);\n\n if (shouldReset) {\n const systemPrompt = this.initializeSystemPrompt();\n this.memory = new AgentMemory(systemPrompt, {\n maxContextLength: this.config.maxContextLength,\n memoryStrategy: this.config.memoryStrategy,\n model: this.model,\n });\n this.currentStep = 0;\n this.initialized = true;\n }\n\n // Add task to memory\n this.memory.addTask(task);\n\n this.isRunning = true;\n this.emitEvent('agent_start', { task, name: this.config.name });\n this.logger.header(`Starting ${this.config.name}: ${task.slice(0, 80)}${task.length > 80 ? '...' : ''}`);\n\n let finalOutput: unknown = null;\n let isFinalAnswer = false;\n\n try {\n while (this.currentStep < this.config.maxSteps && this.isRunning) {\n this.currentStep++;\n this.logger.stepProgress(this.currentStep, this.config.maxSteps);\n this.emitEvent('agent_step', { step: this.currentStep, maxSteps: this.config.maxSteps });\n\n const memoryStep = this.memory.createActionStep(this.currentStep);\n\n try {\n const actionOutput = await this.executeStep(memoryStep);\n\n memoryStep.timing.endTime = Date.now();\n memoryStep.timing.duration = memoryStep.timing.endTime - memoryStep.timing.startTime;\n memoryStep.actionOutput = actionOutput;\n memoryStep.isFinalAnswer = actionOutput.isFinalAnswer;\n\n if (actionOutput.isFinalAnswer) {\n finalOutput = actionOutput.output;\n isFinalAnswer = true;\n this.logger.finalAnswer(finalOutput);\n break;\n }\n } catch (error) {\n memoryStep.error = error as Error;\n memoryStep.timing.endTime = Date.now();\n memoryStep.timing.duration = memoryStep.timing.endTime - memoryStep.timing.startTime;\n this.logger.error('Step execution failed', error as Error);\n this.emitEvent('agent_error', { error: (error as Error).message, step: this.currentStep });\n }\n\n // Check and manage context length after each step\n await this.memory.manageContext();\n }\n\n if (!isFinalAnswer && this.currentStep >= this.config.maxSteps) {\n this.logger.warn(`Max steps (${this.config.maxSteps}) reached without final answer`);\n finalOutput = await this.provideFinalAnswer(task);\n }\n } finally {\n this.isRunning = false;\n }\n\n const duration = Date.now() - startTime;\n const tokenUsage = this.memory.getTotalTokenUsage();\n\n this.memory.addFinalAnswer(finalOutput);\n this.emitEvent('agent_end', { output: finalOutput, duration, tokenUsage });\n\n this.logger.info(`\\nTotal time: ${(duration / 1000).toFixed(2)}s`);\n this.logger.info(`Total tokens: ${tokenUsage.totalTokens}`);\n\n return {\n output: finalOutput,\n steps: this.memory.steps,\n tokenUsage,\n duration,\n };\n }\n\n /**\n * Generate a final answer when max steps is reached.\n */\n protected async provideFinalAnswer(task: string): Promise<unknown> {\n this.logger.subheader('Generating final answer from accumulated context');\n\n const messages = this.memory.toMessages();\n messages.push({\n role: 'user',\n content: `You have reached the maximum number of steps. Based on your work so far, provide the best answer you can for the original task: \"${task}\". Summarize what you accomplished and provide a final answer.`,\n });\n\n const response = await this.model.generate(messages, {\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n });\n\n return response.content;\n }\n\n /** Emit an orchestration event */\n protected emitEvent(type: string, data: unknown): void {\n if (this.config.onEvent) {\n this.config.onEvent({ type, data });\n }\n }\n\n /** Stop the agent */\n stop(): void {\n this.isRunning = false;\n this.logger.info('Agent stopped by user');\n }\n\n /** Get the current memory */\n getMemory(): AgentMemory {\n return this.memory;\n }\n\n /** Get registered tools */\n getTools(): Map<string, Tool> {\n return this.tools;\n }\n\n /** Add a tool to the agent */\n addTool(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n /** Remove a tool from the agent */\n removeTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n /** Get agent name */\n getName(): string {\n return this.config.name;\n }\n\n /** Sleep for a specified duration */\n protected sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * LocalExecutor - JavaScript code execution engine using Node's vm module\n *\n * Executes JavaScript code chunks in an isolated context with:\n * - State persistence between steps (variables carry forward)\n * - Tool injection (tools available as async functions)\n * - Dynamic imports via CDN (esm.sh)\n * - Print capture and logging\n * - Safety timeouts\n */\n\nimport * as vm from 'vm';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport type { CodeExecutionOutput } from '../types.js';\nimport { Tool as ToolClass } from '../tools/Tool.js';\n\n// Default timeout for code execution (30 seconds)\nconst DEFAULT_TIMEOUT_MS = 30000;\n\n// Maximum length of captured output\nconst MAX_OUTPUT_LENGTH = 50000;\n\n// Package cache directory\nconst PACKAGE_CACHE_DIR = path.join(os.homedir(), '.smol-js', 'packages');\n\nexport interface ExecutorConfig {\n /**\n * Maximum execution time in milliseconds\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Additional authorized imports (npm packages to allow)\n */\n authorizedImports?: string[];\n\n /**\n * Whether to allow fs module access\n * @default true\n */\n allowFs?: boolean;\n\n /**\n * Working directory for fs operations\n */\n workingDirectory?: string;\n}\n\nexport class LocalExecutor {\n private context: vm.Context;\n private state: Record<string, unknown> = {};\n private tools: Map<string, ToolClass> = new Map();\n private config: ExecutorConfig;\n private capturedLogs: string[] = [];\n\n constructor(config: ExecutorConfig = {}) {\n this.config = {\n timeout: DEFAULT_TIMEOUT_MS,\n allowFs: true,\n workingDirectory: process.cwd(),\n ...config,\n };\n\n this.context = this.createContext();\n }\n\n /**\n * Create the VM context with available globals.\n */\n private createContext(): vm.Context {\n // Create a proxy for console to capture logs\n const consoleProxy = {\n log: (...args: unknown[]) => {\n const output = args.map((arg) => this.stringify(arg)).join(' ');\n this.capturedLogs.push(output);\n },\n error: (...args: unknown[]) => {\n const output = args.map((arg) => this.stringify(arg)).join(' ');\n this.capturedLogs.push(`[ERROR] ${output}`);\n },\n warn: (...args: unknown[]) => {\n const output = args.map((arg) => this.stringify(arg)).join(' ');\n this.capturedLogs.push(`[WARN] ${output}`);\n },\n info: (...args: unknown[]) => {\n const output = args.map((arg) => this.stringify(arg)).join(' ');\n this.capturedLogs.push(output);\n },\n debug: (...args: unknown[]) => {\n const output = args.map((arg) => this.stringify(arg)).join(' ');\n this.capturedLogs.push(`[DEBUG] ${output}`);\n },\n };\n\n // Create print function (alias for console.log)\n const print = (...args: unknown[]) => consoleProxy.log(...args);\n\n // Create dynamic import function for npm packages\n const dynamicImport = async (packageName: string): Promise<unknown> => {\n // Check if it's an authorized import\n const authorized = this.config.authorizedImports ?? [];\n const basePackage = packageName.split('/')[0];\n\n if (!authorized.includes(basePackage) && !authorized.includes(packageName)) {\n throw new Error(\n `Import not authorized: ${packageName}. Add it to authorizedImports to allow.`\n );\n }\n\n try {\n // Ensure cache directory exists\n if (!fs.existsSync(PACKAGE_CACHE_DIR)) {\n fs.mkdirSync(PACKAGE_CACHE_DIR, { recursive: true });\n }\n\n // Create a safe filename from package name\n const safeFileName = packageName.replace(/[/@]/g, '_') + '.mjs';\n const cachedPath = path.join(PACKAGE_CACHE_DIR, safeFileName);\n\n // Check if already cached and valid (not a redirect stub)\n let needsFetch = !fs.existsSync(cachedPath);\n if (!needsFetch) {\n const content = fs.readFileSync(cachedPath, 'utf-8');\n // Check if it's a redirect stub that needs resolution\n if (content.includes('export * from \"/') || content.includes(\"export * from '/\")) {\n needsFetch = true;\n fs.unlinkSync(cachedPath); // Remove invalid cache\n }\n }\n\n if (needsFetch) {\n this.capturedLogs.push(`[import] Fetching ${packageName}...`);\n\n // First, get the package info to find the actual bundle URL\n // Use jsdelivr which provides proper ESM bundles\n const jsdelivrUrl = `https://cdn.jsdelivr.net/npm/${packageName}/+esm`;\n\n const response = await fetch(jsdelivrUrl);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n let code = await response.text();\n\n // jsdelivr ESM bundles may have imports from jsdelivr - rewrite them to be fetched too\n // For now, we'll inline simple packages. Complex packages with many deps may need more work.\n\n // Check if there are external imports we need to resolve\n const importMatches = code.matchAll(/from\\s+[\"'](https:\\/\\/cdn\\.jsdelivr\\.net\\/[^\"']+)[\"']/g);\n for (const match of importMatches) {\n const depUrl = match[1];\n const depName = depUrl.split('/npm/')[1]?.split('/')[0] || 'dep';\n const depFileName = depName.replace(/[/@]/g, '_') + '_dep.mjs';\n const depCachedPath = path.join(PACKAGE_CACHE_DIR, depFileName);\n\n if (!fs.existsSync(depCachedPath)) {\n this.capturedLogs.push(`[import] Fetching dependency from ${depUrl}...`);\n const depResponse = await fetch(depUrl);\n if (depResponse.ok) {\n const depCode = await depResponse.text();\n fs.writeFileSync(depCachedPath, depCode, 'utf-8');\n }\n }\n\n // Rewrite import to use local file\n code = code.replace(depUrl, `file://${depCachedPath}`);\n }\n\n // Write to cache\n fs.writeFileSync(cachedPath, code, 'utf-8');\n this.capturedLogs.push(`[import] Cached ${packageName} to ${cachedPath}`);\n } else {\n this.capturedLogs.push(`[import] Using cached ${packageName}`);\n }\n\n // Import from local cache using file:// URL\n const fileUrl = `file://${cachedPath}`;\n const module = await import(fileUrl);\n return module.default ?? module;\n } catch (error) {\n throw new Error(`Failed to import ${packageName}: ${(error as Error).message}`);\n }\n };\n\n // Build context object\n const contextObj: Record<string, unknown> = {\n // Console and print\n console: consoleProxy,\n print,\n\n // Built-in objects\n Object,\n Array,\n String,\n Number,\n Boolean,\n Date,\n Math,\n JSON,\n RegExp,\n Error,\n Map,\n Set,\n WeakMap,\n WeakSet,\n Promise,\n Symbol,\n Proxy,\n Reflect,\n\n // Type checking\n parseInt,\n parseFloat,\n isNaN,\n isFinite,\n typeof: (v: unknown) => typeof v,\n\n // Timers (promisified for async support)\n setTimeout: global.setTimeout,\n clearTimeout: global.clearTimeout,\n setInterval: global.setInterval,\n clearInterval: global.clearInterval,\n\n // Async utilities\n fetch: global.fetch,\n\n // Dynamic import for npm packages\n importPackage: dynamicImport,\n\n // URL handling\n URL,\n URLSearchParams,\n\n // Text encoding\n TextEncoder,\n TextDecoder,\n\n // Buffer (useful for many operations)\n Buffer,\n\n // State reference (variables persist here)\n __state__: this.state,\n\n // Final answer marker\n __final_answer__: null as unknown,\n __is_final_answer__: false,\n };\n\n // Add fs module if allowed\n if (this.config.allowFs) {\n contextObj.fs = {\n readFileSync: (filePath: string, encoding?: BufferEncoding) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), filePath);\n return fs.readFileSync(resolvedPath, encoding ?? 'utf-8');\n },\n writeFileSync: (filePath: string, data: string | Buffer) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), filePath);\n return fs.writeFileSync(resolvedPath, data);\n },\n existsSync: (filePath: string) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), filePath);\n return fs.existsSync(resolvedPath);\n },\n readdirSync: (dirPath: string) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), dirPath);\n return fs.readdirSync(resolvedPath);\n },\n mkdirSync: (dirPath: string, options?: fs.MakeDirectoryOptions) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), dirPath);\n return fs.mkdirSync(resolvedPath, options);\n },\n unlinkSync: (filePath: string) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), filePath);\n return fs.unlinkSync(resolvedPath);\n },\n statSync: (filePath: string) => {\n const resolvedPath = path.resolve(this.config.workingDirectory ?? process.cwd(), filePath);\n return fs.statSync(resolvedPath);\n },\n };\n\n contextObj.path = {\n join: path.join,\n resolve: (...paths: string[]) =>\n path.resolve(this.config.workingDirectory ?? process.cwd(), ...paths),\n dirname: path.dirname,\n basename: path.basename,\n extname: path.extname,\n };\n }\n\n return vm.createContext(contextObj);\n }\n\n /**\n * Add tools to the executor context.\n */\n sendTools(tools: Record<string, ToolClass>): void {\n for (const [name, tool] of Object.entries(tools)) {\n this.tools.set(name, tool);\n\n // Add tool as async function in context\n this.context[name] = async (...args: unknown[]) => {\n // Handle both positional and named arguments\n let callArgs: Record<string, unknown>;\n\n if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null) {\n // Called with named arguments object\n callArgs = args[0] as Record<string, unknown>;\n } else {\n // Called with positional arguments - map to input names\n const inputNames = Object.keys(tool.inputs);\n callArgs = {};\n args.forEach((arg, i) => {\n if (i < inputNames.length) {\n callArgs[inputNames[i]] = arg;\n }\n });\n }\n\n return tool.call(callArgs);\n };\n }\n }\n\n /**\n * Send variables to the executor state.\n */\n sendVariables(variables: Record<string, unknown>): void {\n Object.assign(this.state, variables);\n Object.assign(this.context, variables);\n }\n\n /**\n * Execute JavaScript code and return the result.\n */\n async execute(code: string): Promise<CodeExecutionOutput> {\n // Reset captured logs\n this.capturedLogs = [];\n\n // Reset final answer flag\n this.context.__is_final_answer__ = false;\n this.context.__final_answer__ = null;\n\n // Sync state to context\n Object.assign(this.context, this.state);\n\n // Wrap code to handle async and capture the last expression\n const wrappedCode = this.wrapCode(code);\n\n try {\n // Create and run the script\n const script = new vm.Script(wrappedCode, {\n filename: 'agent-code.js',\n });\n\n // Run with timeout\n const result = await script.runInContext(this.context, {\n timeout: this.config.timeout,\n displayErrors: true,\n });\n\n // Wait for the result if it's a promise\n const output = result instanceof Promise ? await result : result;\n\n // Update state with any new variables from context\n this.updateStateFromContext();\n\n // Check if final_answer was called\n const isFinalAnswer = this.context.__is_final_answer__ as boolean;\n const finalOutput = isFinalAnswer ? this.context.__final_answer__ : output;\n\n // Truncate logs if too long\n const logs = this.capturedLogs.join('\\n').slice(0, MAX_OUTPUT_LENGTH);\n\n return {\n output: finalOutput,\n logs,\n isFinalAnswer,\n };\n } catch (error) {\n // Truncate logs if too long\n const logs = this.capturedLogs.join('\\n').slice(0, MAX_OUTPUT_LENGTH);\n\n return {\n output: null,\n logs,\n isFinalAnswer: false,\n error: error as Error,\n };\n }\n }\n\n /**\n * Wrap code to handle async execution and final_answer calls.\n */\n private wrapCode(code: string): string {\n // Add final_answer function that sets the flag\n const finalAnswerFunc = `\n function final_answer(answer) {\n __is_final_answer__ = true;\n __final_answer__ = answer;\n return answer;\n }\n `;\n\n // Wrap in async IIFE to support await\n // Store result of last expression in __last_result__\n // We use a Function constructor approach to capture the last expression value\n return `\n ${finalAnswerFunc}\n (async () => {\n let __last_result__;\n ${this.instrumentCode(code)}\n return __last_result__;\n })()\n `;\n }\n\n /**\n * Instrument code to capture the last expression value and convert\n * let/const/var declarations to global assignments for state persistence.\n */\n private instrumentCode(code: string): string {\n // Split code into lines and find statements\n const lines = code.trim().split('\\n');\n\n if (lines.length === 0) {\n return code;\n }\n\n // Process the code to capture expression results\n const processedLines = lines.map((line, index) => {\n const trimmed = line.trim();\n\n // Skip empty lines and comments\n if (!trimmed ||\n trimmed.startsWith('//') ||\n trimmed.startsWith('/*') ||\n trimmed.startsWith('*') ||\n trimmed.endsWith('*/')) {\n return line;\n }\n\n // Transform variable declarations to global assignments for persistence\n // This allows variables to persist across script executions\n // Handle multiple declarations on the same line using global replacement\n let transformed = line;\n let hasDeclaration = false;\n\n // Replace all let/const/var declarations with global assignments\n transformed = transformed.replace(\n /\\b(let|const|var)\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=/g,\n (_match, _keyword, varName) => {\n hasDeclaration = true;\n return `${varName} =`;\n }\n );\n\n // Handle declarations without initialization\n transformed = transformed.replace(\n /\\b(let|const|var)\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*(?=[;,]|$)/g,\n (_match, _keyword, varName) => {\n hasDeclaration = true;\n return `${varName} = undefined`;\n }\n );\n\n if (hasDeclaration) {\n return transformed;\n }\n\n // Skip control flow statements for last-result capture\n if (trimmed.startsWith('if') ||\n trimmed.startsWith('else') ||\n trimmed.startsWith('for') ||\n trimmed.startsWith('while') ||\n trimmed.startsWith('do') ||\n trimmed.startsWith('switch') ||\n trimmed.startsWith('case') ||\n trimmed.startsWith('default') ||\n trimmed.startsWith('try') ||\n trimmed.startsWith('catch') ||\n trimmed.startsWith('finally') ||\n trimmed.startsWith('return') ||\n trimmed.startsWith('throw') ||\n trimmed.startsWith('break') ||\n trimmed.startsWith('continue') ||\n trimmed.startsWith('function') ||\n trimmed.startsWith('class') ||\n trimmed.startsWith('import') ||\n trimmed.startsWith('export') ||\n trimmed === '{' ||\n trimmed === '}' ||\n trimmed.endsWith('{') ||\n trimmed.endsWith('}')) {\n return line;\n }\n\n // For the last meaningful line, try to capture the expression value\n if (index === lines.length - 1 || this.isLastMeaningfulLine(lines, index)) {\n // If line doesn't end with semicolon, try to capture it\n if (!trimmed.endsWith(';')) {\n return `__last_result__ = ${line}`;\n } else {\n // Remove semicolon, capture, and add it back\n const withoutSemi = trimmed.slice(0, -1);\n // Check if it looks like an expression (not ending with closing brace)\n if (!withoutSemi.endsWith('}') && !withoutSemi.endsWith(')')) {\n return `__last_result__ = ${withoutSemi};`;\n }\n }\n }\n\n return line;\n });\n\n return processedLines.join('\\n');\n }\n\n /**\n * Check if this is the last meaningful line of code.\n */\n private isLastMeaningfulLine(lines: string[], currentIndex: number): boolean {\n for (let i = currentIndex + 1; i < lines.length; i++) {\n const trimmed = lines[i].trim();\n if (trimmed && !trimmed.startsWith('//') && !trimmed.startsWith('/*')) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Update internal state from context after execution.\n */\n private updateStateFromContext(): void {\n // List of keys to exclude from state (builtins and internals)\n const excludeKeys = new Set([\n 'console',\n 'print',\n 'Object',\n 'Array',\n 'String',\n 'Number',\n 'Boolean',\n 'Date',\n 'Math',\n 'JSON',\n 'RegExp',\n 'Error',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Promise',\n 'Symbol',\n 'Proxy',\n 'Reflect',\n 'parseInt',\n 'parseFloat',\n 'isNaN',\n 'isFinite',\n 'typeof',\n 'setTimeout',\n 'clearTimeout',\n 'setInterval',\n 'clearInterval',\n 'fetch',\n 'importPackage',\n 'URL',\n 'URLSearchParams',\n 'TextEncoder',\n 'TextDecoder',\n 'Buffer',\n '__state__',\n '__final_answer__',\n '__is_final_answer__',\n 'fs',\n 'path',\n 'final_answer',\n // Exclude tools\n ...this.tools.keys(),\n ]);\n\n // Copy non-builtin keys to state\n for (const key of Object.keys(this.context)) {\n if (!excludeKeys.has(key)) {\n this.state[key] = this.context[key];\n }\n }\n }\n\n /**\n * Stringify a value for logging.\n */\n private stringify(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (typeof value === 'string') return value;\n if (typeof value === 'function') return `[Function: ${value.name || 'anonymous'}]`;\n\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n\n /**\n * Reset the executor state.\n */\n reset(): void {\n this.state = {};\n this.capturedLogs = [];\n this.context = this.createContext();\n\n // Re-add tools\n const tools = Object.fromEntries(this.tools);\n this.sendTools(tools);\n }\n\n /**\n * Get the current state.\n */\n getState(): Record<string, unknown> {\n return { ...this.state };\n }\n}\n","/**\n * Tool base class for smol-js\n *\n * Tools are the primary way for agents to interact with the outside world.\n * Extend this class and implement the execute() method to create custom tools.\n */\n\nimport type { ToolInputs, ToolInputType, OpenAIToolDefinition } from '../types.js';\n\nexport abstract class Tool {\n /**\n * Unique identifier for the tool\n */\n abstract readonly name: string;\n\n /**\n * Human-readable description of what the tool does\n */\n abstract readonly description: string;\n\n /**\n * Input parameter schema\n */\n abstract readonly inputs: ToolInputs;\n\n /**\n * Output type description\n */\n abstract readonly outputType: string;\n\n /**\n * Whether the tool has been set up\n */\n protected isSetup: boolean = false;\n\n /**\n * Optional setup method called before first use.\n * Override this for expensive initialization (loading models, etc.)\n */\n async setup(): Promise<void> {\n this.isSetup = true;\n }\n\n /**\n * Execute the tool with the given arguments.\n * Must be implemented by subclasses.\n */\n abstract execute(args: Record<string, unknown>): Promise<unknown>;\n\n /**\n * Call the tool, ensuring setup is complete and validating arguments.\n */\n async call(args: Record<string, unknown>): Promise<unknown> {\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Validate arguments\n this.validateArguments(args);\n\n // Execute and return result\n return this.execute(args);\n }\n\n /**\n * Validate that provided arguments match the input schema.\n */\n protected validateArguments(args: Record<string, unknown>): void {\n const providedKeys = new Set(Object.keys(args));\n\n for (const [key, input] of Object.entries(this.inputs)) {\n // Check required arguments\n if (input.required !== false && !providedKeys.has(key)) {\n throw new Error(`Missing required argument: ${key}`);\n }\n\n // Check type if argument is provided\n if (providedKeys.has(key) && args[key] !== undefined && args[key] !== null) {\n const value = args[key];\n if (!this.checkType(value, input.type)) {\n throw new Error(\n `Argument '${key}' has invalid type. Expected ${input.type}, got ${typeof value}`\n );\n }\n }\n\n providedKeys.delete(key);\n }\n }\n\n /**\n * Check if a value matches the expected type.\n */\n protected checkType(value: unknown, expectedType: ToolInputType): boolean {\n switch (expectedType) {\n case 'string':\n return typeof value === 'string';\n case 'number':\n return typeof value === 'number';\n case 'boolean':\n return typeof value === 'boolean';\n case 'array':\n return Array.isArray(value);\n case 'object':\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n case 'any':\n return true;\n default:\n return false;\n }\n }\n\n /**\n * Generate a code-friendly prompt representation of this tool.\n * Used in the CodeAgent system prompt.\n */\n toCodePrompt(): string {\n const argsSignature = Object.entries(this.inputs)\n .map(([name, input]) => {\n const optional = input.required === false ? '?' : '';\n return `${name}${optional}: ${this.typeToJsType(input.type)}`;\n })\n .join(', ');\n\n const argsDoc = Object.entries(this.inputs)\n .map(([name, input]) => ` * @param ${name} - ${input.description}`)\n .join('\\n');\n\n return `\n/**\n * ${this.description}\n *\n${argsDoc}\n * @returns ${this.outputType}\n */\nasync function ${this.name}(${argsSignature}): Promise<${this.typeToJsType(this.outputType as ToolInputType)}> { ... }\n`.trim();\n }\n\n /**\n * Generate an OpenAI-compatible tool definition for function calling.\n */\n toOpenAITool(): OpenAIToolDefinition {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, input] of Object.entries(this.inputs)) {\n const prop: Record<string, unknown> = {\n type: this.typeToJsonSchemaType(input.type),\n description: input.description,\n };\n\n if (input.enum) {\n prop.enum = input.enum;\n }\n\n if (input.default !== undefined) {\n prop.default = input.default;\n }\n\n properties[key] = prop;\n\n if (input.required !== false) {\n required.push(key);\n }\n }\n\n return {\n type: 'function',\n function: {\n name: this.name,\n description: this.description,\n parameters: {\n type: 'object',\n properties,\n ...(required.length > 0 && { required }),\n },\n },\n };\n }\n\n /**\n * Convert tool input type to JSON Schema type.\n */\n protected typeToJsonSchemaType(type: ToolInputType): string {\n switch (type) {\n case 'string':\n return 'string';\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'array':\n return 'array';\n case 'object':\n return 'object';\n case 'any':\n return 'string';\n default:\n return 'string';\n }\n }\n\n /**\n * Convert tool input type to JS/TS type string.\n */\n protected typeToJsType(type: ToolInputType | string): string {\n switch (type) {\n case 'string':\n return 'string';\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'array':\n return 'any[]';\n case 'object':\n return 'Record<string, any>';\n case 'any':\n return 'any';\n default:\n return type;\n }\n }\n\n /**\n * Serialize the tool to a JSON-compatible object.\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n description: this.description,\n inputs: this.inputs,\n outputType: this.outputType,\n };\n }\n}\n\n/**\n * Helper function to create a tool from a function.\n * This is an alternative to extending the Tool class.\n */\nexport function createTool(config: {\n name: string;\n description: string;\n inputs: ToolInputs;\n outputType: string;\n execute: (args: Record<string, unknown>) => Promise<unknown>;\n}): Tool {\n return new (class extends Tool {\n readonly name = config.name;\n readonly description = config.description;\n readonly inputs = config.inputs;\n readonly outputType = config.outputType;\n\n async execute(args: Record<string, unknown>): Promise<unknown> {\n return config.execute(args);\n }\n })();\n}\n","/**\n * Default tools provided to all agents\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\n\n/**\n * FinalAnswerTool - Used by the agent to return the final answer.\n * This is always available to CodeAgent.\n */\nexport class FinalAnswerTool extends Tool {\n readonly name = 'final_answer';\n readonly description = 'Returns the final answer to the user query. Use this when you have completed the task and have the final result.';\n readonly inputs: ToolInputs = {\n answer: {\n type: 'any',\n description: 'The final answer to return. Can be any type (string, number, object, etc.)',\n required: true,\n },\n };\n readonly outputType = 'any';\n\n async execute(args: Record<string, unknown>): Promise<unknown> {\n return args.answer;\n }\n}\n\n/**\n * UserInputTool - Allows the agent to ask the user for input.\n */\nexport class UserInputTool extends Tool {\n readonly name = 'user_input';\n readonly description = 'Asks the user for additional input or clarification.';\n readonly inputs: ToolInputs = {\n question: {\n type: 'string',\n description: 'The question to ask the user',\n required: true,\n },\n };\n readonly outputType = 'string';\n\n private inputHandler?: (question: string) => Promise<string>;\n\n constructor(inputHandler?: (question: string) => Promise<string>) {\n super();\n this.inputHandler = inputHandler;\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const question = args.question as string;\n\n if (this.inputHandler) {\n return this.inputHandler(question);\n }\n\n // Default: use readline for terminal input\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`\\n[Agent asks]: ${question}\\nYour response: `, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n }\n}\n\n// Export singleton instances\nexport const finalAnswerTool = new FinalAnswerTool();\n","/**\n * System prompts for CodeAgent\n *\n * Adapted from smolagents Python prompts but optimized for JavaScript execution.\n */\n\nexport interface PromptVariables {\n tools: string;\n authorizedImports: string;\n customInstructions?: string;\n}\n\n/**\n * Generate the system prompt for CodeAgent.\n */\nexport function generateSystemPrompt(variables: PromptVariables): string {\n const { tools, authorizedImports, customInstructions } = variables;\n\n return `You are an expert JavaScript developer and problem-solving agent. Your role is to solve tasks by writing and executing JavaScript code step by step.\n\n## How You Work\n\nYou follow a ReAct (Reasoning + Acting) framework:\n1. **Thought**: Analyze the current situation and decide what to do next\n2. **Code**: Write JavaScript code to perform the action\n3. **Observation**: See the result of your code execution\n4. Repeat until you have the final answer\n\n## Available Tools\n\nYou have access to the following tools as async functions:\n\n${tools}\n\n## Available Imports\n\nYou can dynamically import the following npm packages using \\`await importPackage('package-name')\\`:\n${authorizedImports || '(No additional packages authorized)'}\n\n## Built-in Capabilities\n\nThe following are available in your execution environment:\n- \\`console.log()\\` / \\`print()\\` - Output text (captured in logs)\n- \\`fs\\` - File system operations (readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync)\n- \\`path\\` - Path utilities (join, resolve, dirname, basename)\n- \\`fetch()\\` - HTTP requests\n- \\`Buffer\\` - Binary data handling\n- \\`JSON\\` - JSON parsing/stringifying\n- Standard JavaScript globals (Math, Date, Array methods, etc.)\n\n## Response Format\n\nAlways respond with your thought process followed by a code block:\n\nThought: [Your reasoning about what to do]\n\n\\`\\`\\`javascript\n// Your code here\n\\`\\`\\`\n\n## Rules\n\n1. **Always use final_answer()**: When you have the complete answer, call \\`final_answer(yourResult)\\` to return it.\n\n2. **One action per step**: Execute one logical action per code block and one code block per inference step. You will be given additional steps to complete your work if it cannot be done safely in one step. Don't try to do everything at once because you need to make sure that your tools returned valid, useful data before going on to make use of that data. In particular, if you are a Manager agent who is invoking Sub-Agents as tools, do not script the entire workflow in one step, make sure that you get to review the work of your subagents at critical points before going on to the next step.\n\n3. **Handle errors gracefully**: If something fails, explain what went wrong and try a different approach.\n\n4. **Use async/await**: All tool calls and imports are async. Always use await.\n\n5. **Variables persist**: Variables you define in one step are available in the next step.\n\n6. **Be concise**: Write clean, minimal code. Don't over-engineer.\n\n7. **Print for debugging**: Use console.log() to output intermediate results you want to see.\n\n8. **No require()**: Use \\`await importPackage('name')\\` for npm packages instead of require().\n\n9. **Internet Access**: You can use fetch() to get data from the web as needed. However, if you have access to specialized tools for browsing / searching / retrieving information, use those first and fall back to fetch if they don't work\n\n## Examples\n\n### Example 1: Simple calculation\nThought: I need to calculate the sum of squares from 1 to 10.\n\n\\`\\`\\`javascript\nlet sum = 0;\nfor (let i = 1; i <= 10; i++) {\n sum += i * i;\n}\nconsole.log(\"Sum of squares:\", sum);\nfinal_answer(sum);\n\\`\\`\\`\n\n### Example 2: Using a tool\nThought: I need to search the web for current information.\n\n\\`\\`\\`javascript\nconst results = await web_search({ query: \"latest JavaScript features 2024\" });\nconsole.log(\"Search results:\", results);\n\\`\\`\\`\n\n### Example 3: Reading a file\nThought: I need to read the contents of package.json.\n\n\\`\\`\\`javascript\nconst content = fs.readFileSync('package.json', 'utf-8');\nconst pkg = JSON.parse(content);\nconsole.log(\"Package name:\", pkg.name);\nfinal_answer(pkg);\n\\`\\`\\`\n\n### Example 4: Using dynamic imports\nThought: I need to use lodash for array manipulation.\n\n\\`\\`\\`javascript\nconst _ = await importPackage('lodash');\nconst numbers = [1, 2, 3, 4, 5];\nconst chunked = _.chunk(numbers, 2);\nfinal_answer(chunked);\n\\`\\`\\`\n\n### Example 5: Multi-step task\nThought: First, I'll fetch the data from the API.\n\n\\`\\`\\`javascript\nconst response = await fetch('https://api.example.com/data');\nconst data = await response.json();\nconsole.log(\"Fetched items:\", data.length);\n\\`\\`\\`\n\n(Observation: Fetched items: 42)\n\nThought: Now I'll process the data and return the result.\n\n\\`\\`\\`javascript\nconst processed = data.filter(item => item.active).map(item => item.name);\nfinal_answer(processed);\n\\`\\`\\`\n\n${customInstructions ? `\\n## Additional Instructions\\n\\n${customInstructions}` : ''}\n\nNow, let's solve the task step by step. Remember to always call final_answer() when you have the complete answer.`;\n}\n\n/**\n * Prompt for generating a final answer when max steps is reached.\n */\nexport const FINAL_ANSWER_PROMPT = `Based on the steps you've taken so far, provide the best answer you can to the original task.\nIf you couldn't fully complete the task, explain what you accomplished and what remains to be done.\nCall final_answer() with your response.`;\n\n/**\n * Error recovery prompt.\n */\nexport function getErrorRecoveryPrompt(error: string): string {\n return `Your previous code encountered an error:\n\n${error}\n\nPlease analyze the error and try a different approach. Fix the issue and continue working on the task.`;\n}\n","/**\n * CodeAgent - Executes tasks by generating and running JavaScript code\n *\n * This is the main agent implementation for smol-js. It follows the ReAct pattern:\n * 1. Receives a task\n * 2. Generates reasoning and code\n * 3. Executes the code in a sandboxed environment\n * 4. Observes the result and continues or returns final answer\n */\n\nimport { Agent, AgentConfig } from './Agent.js';\nimport { LocalExecutor, ExecutorConfig } from '../executor/LocalExecutor.js';\nimport { FinalAnswerTool } from '../tools/defaultTools.js';\nimport { Tool } from '../tools/Tool.js';\nimport { generateSystemPrompt, getErrorRecoveryPrompt } from '../prompts/codeAgent.js';\nimport type { ActionStep, ActionOutput, ChatMessage } from '../types.js';\n\nexport interface CodeAgentConfig extends AgentConfig {\n /**\n * Additional npm packages that can be imported dynamically\n */\n additionalAuthorizedImports?: string[];\n\n /**\n * Executor configuration\n */\n executorConfig?: ExecutorConfig;\n\n /**\n * Working directory for file operations\n */\n workingDirectory?: string;\n}\n\n// Regex patterns for extracting code from LLM output\nconst CODE_BLOCK_REGEX = /```(?:javascript|js)?\\n([\\s\\S]*?)```/;\nconst THOUGHT_REGEX = /(?:Thought|Reasoning):\\s*([\\s\\S]*?)(?=```|$)/i;\n\nexport class CodeAgent extends Agent {\n /**\n * The JavaScript code executor\n */\n private executor: LocalExecutor;\n\n /**\n * Authorized imports for dynamic npm package loading\n */\n private authorizedImports: string[];\n\n constructor(config: CodeAgentConfig) {\n super(config);\n\n // Set authorized imports\n this.authorizedImports = config.additionalAuthorizedImports ?? [];\n\n // Initialize executor\n this.executor = new LocalExecutor({\n ...config.executorConfig,\n authorizedImports: this.authorizedImports,\n workingDirectory: config.workingDirectory,\n });\n\n // Always add final_answer tool\n if (!this.tools.has('final_answer')) {\n this.tools.set('final_answer', new FinalAnswerTool());\n }\n\n // Send tools to executor\n this.executor.sendTools(Object.fromEntries(this.tools));\n }\n\n /**\n * Initialize the system prompt with tool definitions.\n */\n protected initializeSystemPrompt(): string {\n // Generate tool documentation\n const toolDocs = Array.from(this.tools.values())\n .filter((tool) => tool.name !== 'final_answer') // final_answer is documented separately\n .map((tool) => tool.toCodePrompt())\n .join('\\n\\n');\n\n // Add final_answer documentation\n const finalAnswerDoc = `\n/**\n * Returns the final answer to the user. Call this when you have completed the task.\n * @param answer - The final answer (can be any type)\n */\nfunction final_answer(answer: any): void { ... }\n`.trim();\n\n const allTools = toolDocs ? `${toolDocs}\\n\\n${finalAnswerDoc}` : finalAnswerDoc;\n\n // Format authorized imports\n const importsDoc = this.authorizedImports.length > 0\n ? this.authorizedImports.map((pkg) => `- ${pkg}`).join('\\n')\n : 'None (use built-in capabilities only)';\n\n return generateSystemPrompt({\n tools: allTools,\n authorizedImports: importsDoc,\n customInstructions: this.config.customInstructions,\n });\n }\n\n /**\n * Execute a single step: get LLM response, extract code, execute it.\n */\n protected async executeStep(memoryStep: ActionStep): Promise<ActionOutput> {\n // Get messages for LLM\n const messages = this.memory.toMessages();\n memoryStep.modelInputMessages = [...messages];\n\n // Check if last step had an error - add recovery prompt\n const lastStep = this.memory.getActionSteps().slice(-2)[0]; // Get step before current\n if (lastStep?.error) {\n messages.push({\n role: 'user',\n content: getErrorRecoveryPrompt(lastStep.error.message),\n });\n }\n\n // Generate response from LLM\n const response = await this.generateResponse(messages);\n memoryStep.modelOutputMessage = response;\n memoryStep.tokenUsage = response.tokenUsage;\n\n const content = response.content ?? '';\n\n // Extract thought/reasoning\n const thoughtMatch = content.match(THOUGHT_REGEX);\n if (thoughtMatch) {\n this.logger.reasoning(thoughtMatch[1].trim());\n }\n\n // Extract code block\n const codeMatch = content.match(CODE_BLOCK_REGEX);\n\n if (!codeMatch) {\n // No code block found - this might be just reasoning\n // Feed back to LLM to generate code\n this.logger.warn('No code block found in response');\n memoryStep.observation = 'No code block was found in your response. Please provide JavaScript code in a ```javascript code block.';\n\n return {\n output: null,\n isFinalAnswer: false,\n };\n }\n\n const code = codeMatch[1].trim();\n memoryStep.codeAction = code;\n\n this.logger.code(code);\n\n // Wait before execution (allows user to interrupt)\n if (this.config.codeExecutionDelay > 0) {\n this.logger.waiting(this.config.codeExecutionDelay / 1000);\n await this.sleep(this.config.codeExecutionDelay);\n }\n\n // Execute the code\n this.logger.subheader('Executing code...');\n const result = await this.executor.execute(code);\n\n // Log execution logs\n if (result.logs) {\n this.logger.logs(result.logs);\n }\n\n // Handle execution error\n if (result.error) {\n this.logger.error('Code execution error', result.error);\n\n memoryStep.error = result.error;\n memoryStep.observation = `Error during code execution:\\n${result.error.message}`;\n\n return {\n output: null,\n isFinalAnswer: false,\n };\n }\n\n // Format observation\n const outputStr = this.formatOutput(result.output);\n this.logger.output(outputStr);\n\n memoryStep.observation = this.formatObservation(result.logs, outputStr);\n\n return {\n output: result.output,\n isFinalAnswer: result.isFinalAnswer,\n };\n }\n\n /**\n * Generate response from the LLM, optionally streaming.\n */\n private async generateResponse(messages: ChatMessage[]): Promise<ChatMessage> {\n if (this.config.streamOutputs && this.model.supportsStreaming() && this.model.generateStream) {\n // Stream the response\n this.logger.subheader('Agent thinking...');\n\n let fullContent = '';\n const generator = this.model.generateStream(messages, {\n stopSequences: ['Observation:', 'Observation:\\n'],\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n });\n\n for await (const chunk of generator) {\n this.logger.streamChar(chunk);\n fullContent += chunk;\n }\n\n this.logger.streamEnd();\n\n return {\n role: 'assistant',\n content: fullContent,\n };\n } else {\n // Non-streaming response\n this.logger.subheader('Agent thinking...');\n\n return this.model.generate(messages, {\n stopSequences: ['Observation:', 'Observation:\\n'],\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n });\n }\n }\n\n /**\n * Format output for display.\n */\n private formatOutput(output: unknown): string {\n if (output === undefined || output === null) {\n return '(no output)';\n }\n\n if (typeof output === 'string') {\n return output;\n }\n\n try {\n return JSON.stringify(output, null, 2);\n } catch {\n return String(output);\n }\n }\n\n /**\n * Format the observation to send back to the LLM.\n */\n private formatObservation(logs: string, output: string): string {\n const parts: string[] = [];\n\n if (logs.trim()) {\n parts.push(`Execution logs:\\n${logs}`);\n }\n\n parts.push(`Last output:\\n${output}`);\n\n return `Observation:\\n${parts.join('\\n\\n')}`;\n }\n\n /**\n * Reset the agent and executor state.\n */\n reset(): void {\n this.executor.reset();\n this.currentStep = 0;\n }\n\n /**\n * Get the executor instance.\n */\n getExecutor(): LocalExecutor {\n return this.executor;\n }\n\n /**\n * Override addTool to also register with executor.\n */\n addTool(tool: Tool): void {\n super.addTool(tool);\n this.executor.sendTools({ [tool.name]: tool });\n }\n}\n","/**\n * System prompts for ToolUseAgent\n */\n\nexport interface ToolUsePromptVariables {\n tools: string;\n customInstructions?: string;\n /** Whether this agent has sub-agents (AgentTool instances) */\n hasSubAgents?: boolean;\n /** Whether this agent has file tools (read_file, write_file) */\n hasFileTools?: boolean;\n}\n\n/**\n * Generate the system prompt for ToolUseAgent.\n */\nexport function generateToolUseSystemPrompt(variables: ToolUsePromptVariables): string {\n const { tools, customInstructions, hasSubAgents, hasFileTools } = variables;\n\n // Build content delegation guidelines based on agent capabilities\n let contentGuidelines = '';\n\n if (hasFileTools) {\n contentGuidelines += `\n## Content Output Guidelines\n\nWhen you produce long-form content (reports, articles, analyses, or any output longer than a few paragraphs):\n1. **Save to file**: Use \\`write_file\\` to save the full content to a descriptively-named file (e.g., \\`research_report.md\\`, \\`analysis_results.md\\`).\n2. **Return summary + filename**: In your \\`final_answer\\`, provide a brief summary of what you produced AND the filename where the full content is saved. Example: \"Completed the research report covering X, Y, Z. Full report saved to: research_report.md\"\n\nThis ensures managing agents can access your full output via \\`read_file\\` without it being truncated in message passing.\n`;\n }\n\n if (hasSubAgents) {\n contentGuidelines += `\n## Working with Sub-Agents\n\nWhen you delegate tasks to sub-agents:\n- Sub-agents return a **summary and filename** rather than the full content of long-form outputs.\n- To access the full content a sub-agent produced, use \\`read_file\\` with the filename they provide.\n- **Do NOT re-invoke a sub-agent to retrieve content it already created.** Instead, read the file directly.\n- When composing your own final output from sub-agent results, read their files as needed and synthesize.\n`;\n }\n\n if (hasSubAgents && hasFileTools) {\n contentGuidelines += `\n## When You Are Both a Manager and a Sub-Agent\n\nIf you manage sub-agents AND are yourself delegated tasks by a parent agent:\n- Follow the sub-agent content guidelines: save your own long-form output to a file, return summary + filename.\n- Follow the manager guidelines: read sub-agent output files rather than re-calling them.\n`;\n }\n\n return `You are an expert assistant and problem-solving agent. You solve tasks by reasoning step by step and using the tools available to you.\n\n## How You Work\n\nYou follow a ReAct (Reasoning + Acting) framework:\n1. **Think**: Analyze the current situation and decide what to do next\n2. **Act**: Call one or more tools to perform actions\n3. **Observe**: Review the results of your tool calls\n4. Repeat until you have the final answer\n\n## Available Tools\n\n${tools}\n\n## Rules\n\n1. **Always use final_answer**: When you have the complete answer, call the \\`final_answer\\` tool to return it. This is mandatory - you must always end by calling final_answer.\n\n2. **Think before acting**: Provide your reasoning in the content of your response before making tool calls. This helps track your thought process.\n\n3. **One logical action per step**: Focus on one logical action per step. You may call multiple tools in a single step if they are independent, but avoid chaining dependent operations without reviewing intermediate results.\n\n4. **Handle errors gracefully**: If a tool call fails, analyze the error and try a different approach.\n\n5. **Be concise**: Keep your reasoning brief and focused. Don't over-explain.\n\n6. **Use the right tool**: Choose the most appropriate tool for each action. Don't try to accomplish something a tool can do through other means.\n${contentGuidelines}\n${customInstructions ? `## Additional Instructions\\n\\n${customInstructions}` : ''}\n\nNow, let's solve the task step by step. Think carefully about what tools to use and in what order.`;\n}\n\n/**\n * Format tool descriptions for the system prompt.\n */\nexport function formatToolDescriptions(tools: Array<{ name: string; description: string; inputs: Record<string, { type: string; description: string; required?: boolean }> }>): string {\n return tools.map(tool => {\n const params = Object.entries(tool.inputs)\n .map(([name, input]) => {\n const req = input.required !== false ? ' (required)' : ' (optional)';\n return ` - ${name}${req}: ${input.description}`;\n })\n .join('\\n');\n\n return `### ${tool.name}\\n${tool.description}\\nParameters:\\n${params}`;\n }).join('\\n\\n');\n}\n","/**\n * ToolUseAgent - Executes tasks using standard OpenAI-style tool calls\n *\n * Unlike CodeAgent which generates and executes JavaScript code,\n * ToolUseAgent operates by making tool calls through the LLM's native\n * function calling capabilities, following the ReACT pattern:\n * Think -> Act (tool call) -> Observe (result) -> repeat\n */\n\nimport { Agent, AgentConfig } from './Agent.js';\nimport { FinalAnswerTool } from '../tools/defaultTools.js';\nimport { Tool } from '../tools/Tool.js';\nimport { generateToolUseSystemPrompt, formatToolDescriptions } from '../prompts/toolUseAgent.js';\nimport type { ActionStep, ActionOutput, ToolCall, ToolCallResult } from '../types.js';\n\nexport interface ToolUseAgentConfig extends AgentConfig {\n /** Whether to run independent tool calls in parallel (default: true) */\n parallelToolCalls?: boolean;\n}\n\nexport class ToolUseAgent extends Agent {\n private parallelToolCalls: boolean;\n\n constructor(config: ToolUseAgentConfig) {\n super(config);\n this.parallelToolCalls = config.parallelToolCalls ?? true;\n\n // Always add final_answer tool\n if (!this.tools.has('final_answer')) {\n this.tools.set('final_answer', new FinalAnswerTool());\n }\n }\n\n /**\n * Initialize the system prompt with tool descriptions.\n */\n protected initializeSystemPrompt(): string {\n const toolList = Array.from(this.tools.values());\n const toolDescriptions = formatToolDescriptions(\n toolList.map(t => ({\n name: t.name,\n description: t.description,\n inputs: t.inputs,\n }))\n );\n\n // Detect capabilities for content delegation guidelines\n const toolNames = new Set(Array.from(this.tools.keys()));\n const hasSubAgents = toolList.some(t => t.constructor.name === 'AgentTool');\n const hasFileTools = toolNames.has('read_file') || toolNames.has('write_file') || toolNames.has('read') || toolNames.has('write');\n\n return generateToolUseSystemPrompt({\n tools: toolDescriptions,\n customInstructions: this.config.customInstructions,\n hasSubAgents,\n hasFileTools,\n });\n }\n\n /**\n * Execute a single step: send messages with tool definitions, process tool calls.\n */\n protected async executeStep(memoryStep: ActionStep): Promise<ActionOutput> {\n const messages = this.memory.toMessages();\n memoryStep.modelInputMessages = [...messages];\n\n // Handle error recovery from previous step\n const actionSteps = this.memory.getActionSteps();\n const prevStep = actionSteps.length >= 2 ? actionSteps[actionSteps.length - 2] : undefined;\n if (prevStep?.error) {\n messages.push({\n role: 'user',\n content: `Your previous action encountered an error: ${prevStep.error.message}\\nPlease try a different approach.`,\n });\n }\n\n // Get tool definitions for the API call\n const toolDefinitions = Array.from(this.tools.values()).map(t => t.toOpenAITool());\n\n // Generate response with tool calling\n this.logger.subheader('Agent thinking...');\n const response = await this.model.generate(messages, {\n toolDefinitions,\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n });\n\n memoryStep.modelOutputMessage = response;\n memoryStep.tokenUsage = response.tokenUsage;\n\n // Log reasoning (text content)\n if (response.content && response.content.trim()) {\n this.logger.reasoning(response.content.trim());\n }\n\n // Check if model made tool calls\n if (!response.toolCalls || response.toolCalls.length === 0) {\n // No tool calls - the model just responded with text\n this.logger.warn('No tool calls in response. Prompting model to use tools.');\n memoryStep.observation = 'You must use tools to complete the task. Please call the appropriate tool(s). When you have the final answer, call the final_answer tool.';\n return { output: null, isFinalAnswer: false };\n }\n\n // Process tool calls\n memoryStep.toolCalls = response.toolCalls;\n const toolResults = await this.processToolCalls(response.toolCalls);\n memoryStep.toolResults = toolResults;\n\n // Check if final_answer was called\n for (const result of toolResults) {\n if (result.toolName === 'final_answer') {\n return { output: result.result, isFinalAnswer: true };\n }\n }\n\n // Log tool results as observations\n for (const result of toolResults) {\n if (result.error) {\n this.logger.error(`Tool ${result.toolName} failed: ${result.error}`);\n this.emitEvent('agent_error', { tool: result.toolName, error: result.error });\n } else {\n const resultStr = typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result, null, 2);\n this.logger.output(`[${result.toolName}]: ${resultStr.slice(0, 500)}${resultStr.length > 500 ? '...' : ''}`);\n this.emitEvent('agent_observation', { tool: result.toolName, result: resultStr.slice(0, 500) });\n }\n }\n\n return { output: null, isFinalAnswer: false };\n }\n\n /**\n * Process tool calls from the model response.\n */\n private async processToolCalls(toolCalls: ToolCall[]): Promise<ToolCallResult[]> {\n const results: ToolCallResult[] = [];\n\n // Execute tool calls\n const executeTool = async (tc: ToolCall): Promise<ToolCallResult> => {\n const toolName = tc.function.name;\n const tool = this.tools.get(toolName);\n\n if (!tool) {\n return {\n toolCallId: tc.id,\n toolName,\n result: null,\n error: `Unknown tool: ${toolName}. Available tools: ${Array.from(this.tools.keys()).join(', ')}`,\n };\n }\n\n // Parse arguments\n let args: Record<string, unknown>;\n try {\n args = typeof tc.function.arguments === 'string'\n ? JSON.parse(tc.function.arguments)\n : tc.function.arguments as Record<string, unknown>;\n } catch {\n return {\n toolCallId: tc.id,\n toolName,\n result: null,\n error: `Failed to parse tool arguments: ${tc.function.arguments}`,\n };\n }\n\n this.logger.info(` Calling tool: ${toolName}(${JSON.stringify(args).slice(0, 100)}...)`);\n this.emitEvent('agent_tool_call', { tool: toolName, args });\n\n try {\n const result = await tool.call(args);\n return {\n toolCallId: tc.id,\n toolName,\n result,\n };\n } catch (error) {\n return {\n toolCallId: tc.id,\n toolName,\n result: null,\n error: `Tool execution error: ${(error as Error).message}`,\n };\n }\n };\n\n if (this.parallelToolCalls) {\n const promises = toolCalls.map(tc => executeTool(tc));\n const resolvedResults = await Promise.all(promises);\n results.push(...resolvedResults);\n } else {\n for (const tc of toolCalls) {\n results.push(await executeTool(tc));\n }\n }\n\n return results;\n }\n\n /**\n * Override provideFinalAnswer to use tool calling format.\n */\n protected async provideFinalAnswer(task: string): Promise<unknown> {\n this.logger.subheader('Generating final answer from accumulated context');\n\n const messages = this.memory.toMessages();\n messages.push({\n role: 'user',\n content: `You have reached the maximum number of steps. Based on your work so far, provide the best answer for the task: \"${task}\". Call the final_answer tool with your response.`,\n });\n\n const toolDefinitions = [new FinalAnswerTool().toOpenAITool()];\n const response = await this.model.generate(messages, {\n toolDefinitions,\n maxTokens: this.config.maxTokens,\n temperature: this.config.temperature,\n });\n\n // Try to extract from tool call\n if (response.toolCalls && response.toolCalls.length > 0) {\n const tc = response.toolCalls[0];\n try {\n const args = typeof tc.function.arguments === 'string'\n ? JSON.parse(tc.function.arguments)\n : tc.function.arguments;\n return (args as Record<string, unknown>).answer;\n } catch {\n return response.content;\n }\n }\n\n return response.content;\n }\n\n /**\n * Add a tool, which can also be an Agent instance (auto-wraps with AgentTool).\n */\n addTool(tool: Tool): void {\n super.addTool(tool);\n }\n}\n","/**\n * AgentTool - Wraps a CodeAgent as a Tool for use by other agents\n *\n * This enables nested/hierarchical agent architectures where a \"manager\" agent\n * can delegate tasks to specialized \"worker\" agents.\n *\n * Based on the ManagedAgent pattern from Python smolagents.\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\nimport type { Agent } from '../agents/Agent.js';\n\nexport interface AgentToolConfig {\n /**\n * The agent to wrap as a tool\n */\n agent: Agent;\n\n /**\n * Name for the tool (defaults to agent's name or \"managed_agent\")\n */\n name?: string;\n\n /**\n * Description of what this agent does (used in parent agent's prompt)\n */\n description?: string;\n\n /**\n * Additional context to provide to the agent with each task\n */\n additionalContext?: string;\n\n /**\n * Whether to provide the full result object or just the output\n * @default false\n */\n returnFullResult?: boolean;\n}\n\nexport class AgentTool extends Tool {\n readonly name: string;\n readonly description: string;\n readonly inputs: ToolInputs = {\n task: {\n type: 'string',\n description: 'The task or question to delegate to this agent',\n required: true,\n },\n };\n readonly outputType = 'string';\n\n private agent: Agent;\n private additionalContext?: string;\n private returnFullResult: boolean;\n\n constructor(config: AgentToolConfig) {\n super();\n this.agent = config.agent;\n this.name = config.name ?? 'managed_agent';\n this.additionalContext = config.additionalContext;\n this.returnFullResult = config.returnFullResult ?? false;\n\n // Build description from config or generate default\n this.description = config.description ?? this.generateDescription();\n }\n\n /**\n * Generate a default description based on the agent's configuration\n */\n private generateDescription(): string {\n return `Delegates a task to a specialized agent.\nThis agent can help with complex sub-tasks that require multiple steps.\nPass a clear, specific task description and the agent will work autonomously to solve it.\nReturns the agent's final answer as a string.`;\n }\n\n /**\n * Execute the agent with the given task\n */\n async execute(args: Record<string, unknown>): Promise<unknown> {\n let task = args.task as string;\n\n // Add additional context if provided\n if (this.additionalContext) {\n task = `${this.additionalContext}\\n\\nTask: ${task}`;\n }\n\n // Run the agent\n const result = await this.agent.run(task, true);\n\n // Return full result or just output\n if (this.returnFullResult) {\n return {\n output: result.output,\n steps: result.steps.length,\n duration: result.duration,\n };\n }\n\n // Convert output to string if needed\n const output = result.output;\n if (typeof output === 'string') {\n return output;\n }\n return JSON.stringify(output, null, 2);\n }\n\n /**\n * Override toCodePrompt to provide a cleaner signature for nested agents\n */\n toCodePrompt(): string {\n return `\n/**\n * ${this.description}\n *\n * @param task - The task or question to delegate to this specialized agent\n * @returns The agent's answer as a string\n */\nasync function ${this.name}(task: string): Promise<string> { ... }\n`.trim();\n }\n}\n\n/**\n * Helper function to quickly wrap an agent as a tool\n */\nexport function agentAsTool(\n agent: Agent,\n options?: Omit<AgentToolConfig, 'agent'>\n): AgentTool {\n return new AgentTool({ agent, ...options });\n}\n","/**\n * OpenAI-compatible Model implementation\n *\n * Supports any API that follows the OpenAI chat completions format,\n * including OpenRouter, Azure OpenAI, local servers, etc.\n */\n\nimport OpenAI from 'openai';\nimport { Model } from './Model.js';\nimport type { ChatMessage, GenerateOptions, TokenUsage, MessageRole } from '../types.js';\n\nexport interface OpenAIModelConfig {\n /**\n * Model identifier (e.g., \"gpt-4\", \"anthropic/claude-sonnet-4.5\")\n */\n modelId?: string;\n\n /**\n * API key for authentication\n */\n apiKey?: string;\n\n /**\n * Base URL for the API endpoint\n * @default \"https://openrouter.ai/api/v1\"\n */\n baseUrl?: string;\n\n /**\n * Maximum tokens to generate (omitted from requests by default)\n */\n maxTokens?: number;\n\n /**\n * Temperature for generation (omitted from requests by default)\n */\n temperature?: number;\n\n /**\n * Request timeout in milliseconds\n */\n timeout?: number;\n\n /**\n * Default headers to include in requests\n */\n defaultHeaders?: Record<string, string>;\n}\n\nconst DEFAULT_MODEL_ID = 'anthropic/claude-sonnet-4.5';\nconst DEFAULT_BASE_URL = 'https://openrouter.ai/api/v1';\nconst DEFAULT_TIMEOUT = 120000;\n\nexport class OpenAIModel extends Model {\n readonly modelId: string;\n private client: OpenAI;\n private config: OpenAIModelConfig;\n\n constructor(config: OpenAIModelConfig = {}) {\n super();\n\n this.config = config;\n this.modelId = config.modelId ?? DEFAULT_MODEL_ID;\n\n // Get API key from config or environment\n const apiKey = config.apiKey ?? process.env.OPENAI_API_KEY ?? process.env.OPENROUTER_API_KEY;\n\n if (!apiKey) {\n throw new Error(\n 'API key is required. Set OPENAI_API_KEY or OPENROUTER_API_KEY environment variable, or pass apiKey in config.'\n );\n }\n\n this.client = new OpenAI({\n apiKey,\n baseURL: config.baseUrl ?? DEFAULT_BASE_URL,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n defaultHeaders: config.defaultHeaders,\n });\n }\n\n /**\n * Generate a response from the model (supports tool calling).\n */\n async generate(messages: ChatMessage[], options: GenerateOptions = {}): Promise<ChatMessage> {\n const formattedMessages = this.formatMessages(messages);\n\n const requestParams: Record<string, unknown> = {\n model: this.modelId,\n messages: formattedMessages,\n };\n\n // Only include maxTokens if specified at request or model config level\n const maxTokens = options.maxTokens ?? this.config.maxTokens;\n if (maxTokens !== undefined) {\n requestParams.max_tokens = maxTokens;\n }\n\n // Only include temperature if specified at request or model config level\n const temperature = options.temperature ?? this.config.temperature;\n if (temperature !== undefined) {\n requestParams.temperature = temperature;\n }\n\n if (options.stopSequences) {\n requestParams.stop = options.stopSequences;\n }\n\n // Add tool definitions for function calling\n if (options.toolDefinitions && options.toolDefinitions.length > 0) {\n requestParams.tools = options.toolDefinitions;\n } else if (options.tools && options.tools.length > 0) {\n requestParams.tools = options.tools.map(t => t.toOpenAITool());\n }\n\n const response = await this.client.chat.completions.create({\n ...requestParams,\n model: this.modelId,\n messages: formattedMessages as OpenAI.Chat.ChatCompletionMessageParam[],\n } as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming);\n\n const choice = response.choices[0];\n const message = choice?.message;\n\n if (!message) {\n throw new Error('No response from model');\n }\n\n const tokenUsage: TokenUsage | undefined = response.usage\n ? {\n inputTokens: response.usage.prompt_tokens,\n outputTokens: response.usage.completion_tokens ?? 0,\n totalTokens: response.usage.total_tokens,\n }\n : undefined;\n\n // Map tool_calls from OpenAI format\n const toolCalls = message.tool_calls?.map((tc: OpenAI.Chat.ChatCompletionMessageToolCall) => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n }));\n\n return {\n role: 'assistant' as MessageRole,\n content: message.content ?? '',\n toolCalls,\n tokenUsage,\n };\n }\n\n /**\n * Generate a streaming response from the model.\n */\n async *generateStream(\n messages: ChatMessage[],\n options: GenerateOptions = {}\n ): AsyncGenerator<string, ChatMessage, undefined> {\n const formattedMessages = this.formatMessages(messages);\n\n const requestParams: Record<string, unknown> = {\n model: this.modelId,\n messages: formattedMessages,\n stream: true,\n };\n\n const maxTokens = options.maxTokens ?? this.config.maxTokens;\n if (maxTokens !== undefined) {\n requestParams.max_tokens = maxTokens;\n }\n\n const temperature = options.temperature ?? this.config.temperature;\n if (temperature !== undefined) {\n requestParams.temperature = temperature;\n }\n\n if (options.stopSequences) {\n requestParams.stop = options.stopSequences;\n }\n\n const stream = await this.client.chat.completions.create({\n ...requestParams,\n model: this.modelId,\n messages: formattedMessages as OpenAI.Chat.ChatCompletionMessageParam[],\n stream: true,\n } as OpenAI.Chat.ChatCompletionCreateParamsStreaming);\n\n let fullContent = '';\n\n for await (const chunk of stream as AsyncIterable<OpenAI.Chat.ChatCompletionChunk>) {\n const delta = chunk.choices[0]?.delta;\n if (delta?.content) {\n fullContent += delta.content;\n yield delta.content;\n }\n }\n\n return {\n role: 'assistant' as MessageRole,\n content: fullContent,\n };\n }\n\n /**\n * Format messages for the OpenAI API, including tool call/response messages.\n */\n protected formatMessages(messages: ChatMessage[]): OpenAI.Chat.ChatCompletionMessageParam[] {\n return messages.map((msg) => {\n // Handle tool response messages\n if (msg.role === 'tool' && msg.toolCallId) {\n return {\n role: 'tool' as const,\n content: msg.content ?? '',\n tool_call_id: msg.toolCallId,\n };\n }\n\n // Handle tool responses without toolCallId (legacy format)\n if (msg.role === 'tool') {\n return {\n role: 'user' as const,\n content: msg.content ?? '',\n };\n }\n\n // Handle assistant messages with tool calls\n if (msg.role === 'assistant' && msg.toolCalls && msg.toolCalls.length > 0) {\n return {\n role: 'assistant' as const,\n content: msg.content || null,\n tool_calls: msg.toolCalls.map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.function.name,\n arguments: typeof tc.function.arguments === 'string'\n ? tc.function.arguments\n : JSON.stringify(tc.function.arguments),\n },\n })),\n };\n }\n\n return {\n role: msg.role as 'system' | 'user' | 'assistant',\n content: msg.content ?? '',\n };\n });\n }\n}\n","/**\n * Model base class for smol-js\n *\n * Models are responsible for generating text responses from LLMs.\n * Extend this class to support different LLM providers.\n */\n\nimport type { ChatMessage, GenerateOptions, TokenUsage } from '../types.js';\n\nexport abstract class Model {\n /**\n * Model identifier (e.g., \"gpt-4\", \"claude-3-sonnet\")\n */\n abstract readonly modelId: string;\n\n /**\n * Generate a response from the model.\n */\n abstract generate(\n messages: ChatMessage[],\n options?: GenerateOptions\n ): Promise<ChatMessage>;\n\n /**\n * Optional streaming generation.\n * Yields content chunks and returns the final message.\n */\n generateStream?(\n messages: ChatMessage[],\n options?: GenerateOptions\n ): AsyncGenerator<string, ChatMessage, undefined>;\n\n /**\n * Check if the model supports streaming.\n */\n supportsStreaming(): boolean {\n return typeof this.generateStream === 'function';\n }\n\n /**\n * Extract token usage from a response message.\n */\n protected extractTokenUsage(_response: unknown): TokenUsage | undefined {\n // Override in subclasses to extract token usage from API responses\n return undefined;\n }\n\n /**\n * Convert messages to the format expected by the model's API.\n */\n protected formatMessages(messages: ChatMessage[]): unknown[] {\n // Default implementation - override for specific API formats\n return messages.map((msg) => ({\n role: msg.role,\n content: msg.content,\n ...(msg.name && { name: msg.name }),\n ...(msg.toolCallId && { tool_call_id: msg.toolCallId }),\n }));\n }\n}\n","/**\n * ReadFileTool - Read contents from a file\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport class ReadFileTool extends Tool {\n readonly name = 'read_file';\n readonly description = 'Read the contents of a file at the specified path. Returns the file content as a string.';\n readonly inputs: ToolInputs = {\n path: {\n type: 'string',\n description: 'The file path to read (absolute or relative to working directory)',\n required: true,\n },\n encoding: {\n type: 'string',\n description: 'File encoding (default: utf-8)',\n required: false,\n default: 'utf-8',\n },\n };\n readonly outputType = 'string';\n\n private workingDirectory: string;\n\n constructor(config?: { workingDirectory?: string }) {\n super();\n this.workingDirectory = config?.workingDirectory ?? process.cwd();\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const filePath = args.path as string;\n const encoding = (args.encoding as BufferEncoding) ?? 'utf-8';\n\n const resolvedPath = path.isAbsolute(filePath)\n ? filePath\n : path.resolve(this.workingDirectory, filePath);\n\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`File not found: ${resolvedPath}`);\n }\n\n const stat = fs.statSync(resolvedPath);\n if (stat.isDirectory()) {\n throw new Error(`Path is a directory, not a file: ${resolvedPath}`);\n }\n\n const content = fs.readFileSync(resolvedPath, encoding);\n\n // Truncate very large files\n const maxLength = 100000;\n if (content.length > maxLength) {\n return content.slice(0, maxLength) + `\\n\\n[... truncated, file is ${content.length} characters total]`;\n }\n\n return content;\n }\n}\n","/**\n * WriteFileTool - Write content to a file\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport class WriteFileTool extends Tool {\n readonly name = 'write_file';\n readonly description = 'Write content to a file at the specified path. Creates the file if it does not exist, and creates parent directories as needed. Overwrites existing content by default.';\n readonly inputs: ToolInputs = {\n path: {\n type: 'string',\n description: 'The file path to write to (absolute or relative to working directory)',\n required: true,\n },\n content: {\n type: 'string',\n description: 'The content to write to the file',\n required: true,\n },\n append: {\n type: 'boolean',\n description: 'If true, append to the file instead of overwriting (default: false)',\n required: false,\n default: false,\n },\n };\n readonly outputType = 'string';\n\n private workingDirectory: string;\n\n constructor(config?: { workingDirectory?: string }) {\n super();\n this.workingDirectory = config?.workingDirectory ?? process.cwd();\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const filePath = args.path as string;\n const content = args.content as string;\n const append = (args.append as boolean) ?? false;\n\n const resolvedPath = path.isAbsolute(filePath)\n ? filePath\n : path.resolve(this.workingDirectory, filePath);\n\n // Create parent directories if needed\n const dir = path.dirname(resolvedPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n if (append) {\n fs.appendFileSync(resolvedPath, content, 'utf-8');\n return `Successfully appended ${content.length} characters to ${resolvedPath}`;\n } else {\n fs.writeFileSync(resolvedPath, content, 'utf-8');\n return `Successfully wrote ${content.length} characters to ${resolvedPath}`;\n }\n }\n}\n","/**\n * CurlTool - HTTP requests (GET/POST) using fetch\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\n\nexport class CurlTool extends Tool {\n readonly name = 'curl';\n readonly description = 'Make HTTP requests to any URL. Supports GET and POST methods with custom headers and body. Returns the response body as text.';\n readonly inputs: ToolInputs = {\n url: {\n type: 'string',\n description: 'The URL to request',\n required: true,\n },\n method: {\n type: 'string',\n description: 'HTTP method: GET or POST (default: GET)',\n required: false,\n default: 'GET',\n enum: ['GET', 'POST'],\n },\n headers: {\n type: 'object',\n description: 'Optional HTTP headers as key-value pairs (e.g., {\"Content-Type\": \"application/json\"})',\n required: false,\n },\n body: {\n type: 'string',\n description: 'Request body for POST requests (typically JSON string)',\n required: false,\n },\n };\n readonly outputType = 'string';\n\n private timeout: number;\n\n constructor(config?: { timeout?: number }) {\n super();\n this.timeout = config?.timeout ?? 30000;\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const url = args.url as string;\n const method = ((args.method as string) ?? 'GET').toUpperCase();\n const headers = (args.headers as Record<string, string>) ?? {};\n const body = args.body as string | undefined;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (method === 'POST' && body) {\n fetchOptions.body = body;\n if (!headers['Content-Type'] && !headers['content-type']) {\n (fetchOptions.headers as Record<string, string>)['Content-Type'] = 'application/json';\n }\n }\n\n const response = await fetch(url, fetchOptions);\n const responseText = await response.text();\n\n const statusLine = `HTTP ${response.status} ${response.statusText}`;\n\n // Truncate very large responses\n const maxLength = 50000;\n const truncatedBody = responseText.length > maxLength\n ? responseText.slice(0, maxLength) + `\\n\\n[... truncated, response is ${responseText.length} characters total]`\n : responseText;\n\n return `${statusLine}\\n\\n${truncatedBody}`;\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n throw new Error(`Request timed out after ${this.timeout}ms: ${url}`);\n }\n throw new Error(`HTTP request failed: ${(error as Error).message}`);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n","/**\n * ExaSearchTool - Web search using the Exa.ai API\n *\n * Uses Exa's embeddings-based search for semantically intelligent results.\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\n\nexport interface ExaSearchConfig {\n apiKey?: string;\n}\n\nexport class ExaSearchTool extends Tool {\n readonly name = 'exa_search';\n readonly description = 'Search the web using Exa.ai semantic search. Returns relevant web pages with titles, URLs, and optionally content snippets. Use this for finding information, research, and fact-checking.';\n readonly inputs: ToolInputs = {\n query: {\n type: 'string',\n description: 'The search query. Be specific and descriptive for best results.',\n required: true,\n },\n numResults: {\n type: 'number',\n description: 'Number of results to return (default: 10, max: 30)',\n required: false,\n default: 10,\n },\n type: {\n type: 'string',\n description: 'Search type: \"auto\" (default), \"neural\" (embeddings-based), or \"keyword\"',\n required: false,\n default: 'auto',\n enum: ['auto', 'neural', 'keyword'],\n },\n category: {\n type: 'string',\n description: 'Optional category filter: \"research paper\", \"news\", \"pdf\", \"github\", \"tweet\", \"company\", \"blog\"',\n required: false,\n },\n includeDomains: {\n type: 'array',\n description: 'Only include results from these domains (e.g., [\"arxiv.org\", \"github.com\"])',\n required: false,\n },\n excludeDomains: {\n type: 'array',\n description: 'Exclude results from these domains',\n required: false,\n },\n startPublishedDate: {\n type: 'string',\n description: 'Filter results published after this ISO 8601 date (e.g., \"2024-01-01\")',\n required: false,\n },\n };\n readonly outputType = 'string';\n\n private apiKey: string;\n\n constructor(config?: ExaSearchConfig) {\n super();\n this.apiKey = config?.apiKey ?? process.env.EXA_API_KEY ?? '';\n }\n\n async setup(): Promise<void> {\n if (!this.apiKey) {\n throw new Error('EXA_API_KEY is required. Set it as an environment variable or pass it in the config.');\n }\n this.isSetup = true;\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const query = args.query as string;\n const numResults = Math.min((args.numResults as number) ?? 10, 30);\n const type = (args.type as string) ?? 'auto';\n\n const requestBody: Record<string, unknown> = {\n query,\n numResults,\n type,\n text: { maxCharacters: 1000 },\n };\n\n if (args.category) requestBody.category = args.category;\n if (args.includeDomains) requestBody.includeDomains = args.includeDomains;\n if (args.excludeDomains) requestBody.excludeDomains = args.excludeDomains;\n if (args.startPublishedDate) requestBody.startPublishedDate = args.startPublishedDate;\n\n const response = await fetch('https://api.exa.ai/search', {\n method: 'POST',\n headers: {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Exa search failed (${response.status}): ${errorText}`);\n }\n\n const data = await response.json() as {\n results: Array<{\n title?: string;\n url: string;\n publishedDate?: string;\n author?: string;\n text?: string;\n score?: number;\n }>;\n };\n\n if (!data.results || data.results.length === 0) {\n return 'No results found for the query.';\n }\n\n // Format results for the agent\n const formattedResults = data.results.map((result, i) => {\n const parts = [`[${i + 1}] ${result.title ?? 'Untitled'}`];\n parts.push(` URL: ${result.url}`);\n if (result.publishedDate) parts.push(` Date: ${result.publishedDate}`);\n if (result.author) parts.push(` Author: ${result.author}`);\n if (result.text) {\n const snippet = result.text.slice(0, 300).trim();\n parts.push(` Snippet: ${snippet}${result.text.length > 300 ? '...' : ''}`);\n }\n return parts.join('\\n');\n }).join('\\n\\n');\n\n return `Search results for \"${query}\" (${data.results.length} results):\\n\\n${formattedResults}`;\n }\n}\n","/**\n * ExaGetContentsTool - Get webpage contents using Exa.ai API\n *\n * Fetches and extracts clean text content from web pages.\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\n\nexport interface ExaGetContentsConfig {\n apiKey?: string;\n}\n\nexport class ExaGetContentsTool extends Tool {\n readonly name = 'exa_get_contents';\n readonly description = 'Get the full text content of one or more web pages using Exa.ai. Returns cleaned, readable text extracted from the HTML. Use this to read articles, documentation, or any web page content.';\n readonly inputs: ToolInputs = {\n urls: {\n type: 'array',\n description: 'Array of URLs to fetch content from (max 10)',\n required: true,\n },\n maxCharacters: {\n type: 'number',\n description: 'Maximum characters of content to return per page (default: 10000)',\n required: false,\n default: 10000,\n },\n livecrawl: {\n type: 'string',\n description: 'Crawl strategy: \"fallback\" (use cache, fetch live if unavailable), \"always\" (always fetch live), \"never\" (cache only). Default: \"fallback\"',\n required: false,\n default: 'fallback',\n enum: ['fallback', 'always', 'never'],\n },\n };\n readonly outputType = 'string';\n\n private apiKey: string;\n\n constructor(config?: ExaGetContentsConfig) {\n super();\n this.apiKey = config?.apiKey ?? process.env.EXA_API_KEY ?? '';\n }\n\n async setup(): Promise<void> {\n if (!this.apiKey) {\n throw new Error('EXA_API_KEY is required. Set it as an environment variable or pass it in the config.');\n }\n this.isSetup = true;\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const urls = (args.urls as string[]).slice(0, 10);\n const maxCharacters = (args.maxCharacters as number) ?? 10000;\n const livecrawl = (args.livecrawl as string) ?? 'fallback';\n\n const requestBody = {\n urls,\n text: { maxCharacters },\n livecrawl,\n };\n\n const response = await fetch('https://api.exa.ai/contents', {\n method: 'POST',\n headers: {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Exa get contents failed (${response.status}): ${errorText}`);\n }\n\n const data = await response.json() as {\n results: Array<{\n url: string;\n title?: string;\n author?: string;\n publishedDate?: string;\n text?: string;\n }>;\n };\n\n if (!data.results || data.results.length === 0) {\n return 'No content could be retrieved from the provided URLs.';\n }\n\n const formattedResults = data.results.map((result) => {\n const parts = [`## ${result.title ?? result.url}`];\n parts.push(`URL: ${result.url}`);\n if (result.author) parts.push(`Author: ${result.author}`);\n if (result.publishedDate) parts.push(`Date: ${result.publishedDate}`);\n parts.push('');\n if (result.text) {\n parts.push(result.text);\n } else {\n parts.push('[No text content available]');\n }\n return parts.join('\\n');\n }).join('\\n\\n---\\n\\n');\n\n return formattedResults;\n }\n}\n","/**\n * ExaResearchTool - Deep research on a topic using Exa.ai\n *\n * Performs multi-step research by combining search and content retrieval\n * to produce comprehensive findings on a topic.\n */\n\nimport { Tool } from './Tool.js';\nimport type { ToolInputs } from '../types.js';\n\nexport interface ExaResearchConfig {\n apiKey?: string;\n}\n\nexport class ExaResearchTool extends Tool {\n readonly name = 'exa_research';\n readonly description = 'Perform deep research on a single topic using Exa.ai. Searches for relevant sources, retrieves their content, and finds similar pages for comprehensive coverage. Returns a structured research summary with sources. Use this for thorough research on any topic.';\n readonly inputs: ToolInputs = {\n topic: {\n type: 'string',\n description: 'The research topic or question to investigate',\n required: true,\n },\n numSources: {\n type: 'number',\n description: 'Number of primary sources to retrieve (default: 5, max: 10)',\n required: false,\n default: 5,\n },\n category: {\n type: 'string',\n description: 'Optional category: \"research paper\", \"news\", \"blog\", \"company\"',\n required: false,\n },\n includeDomains: {\n type: 'array',\n description: 'Only include results from these domains',\n required: false,\n },\n startPublishedDate: {\n type: 'string',\n description: 'Only include results published after this date (ISO 8601)',\n required: false,\n },\n };\n readonly outputType = 'string';\n\n private apiKey: string;\n\n constructor(config?: ExaResearchConfig) {\n super();\n this.apiKey = config?.apiKey ?? process.env.EXA_API_KEY ?? '';\n }\n\n async setup(): Promise<void> {\n if (!this.apiKey) {\n throw new Error('EXA_API_KEY is required. Set it as an environment variable or pass it in the config.');\n }\n this.isSetup = true;\n }\n\n async execute(args: Record<string, unknown>): Promise<string> {\n const topic = args.topic as string;\n const numSources = Math.min((args.numSources as number) ?? 5, 10);\n\n // Step 1: Search for primary sources\n const searchBody: Record<string, unknown> = {\n query: topic,\n numResults: numSources,\n type: 'auto',\n text: { maxCharacters: 3000 },\n };\n\n if (args.category) searchBody.category = args.category;\n if (args.includeDomains) searchBody.includeDomains = args.includeDomains;\n if (args.startPublishedDate) searchBody.startPublishedDate = args.startPublishedDate;\n\n const searchResponse = await fetch('https://api.exa.ai/search', {\n method: 'POST',\n headers: {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(searchBody),\n });\n\n if (!searchResponse.ok) {\n const errorText = await searchResponse.text();\n throw new Error(`Exa research search failed (${searchResponse.status}): ${errorText}`);\n }\n\n const searchData = await searchResponse.json() as {\n results: Array<{\n title?: string;\n url: string;\n publishedDate?: string;\n author?: string;\n text?: string;\n score?: number;\n }>;\n };\n\n if (!searchData.results || searchData.results.length === 0) {\n return `No research sources found for topic: \"${topic}\"`;\n }\n\n // Step 2: Find similar pages to top result for broader coverage\n let similarResults: Array<{ title?: string; url: string; text?: string }> = [];\n if (searchData.results.length > 0) {\n try {\n const similarBody = {\n url: searchData.results[0].url,\n numResults: 3,\n text: { maxCharacters: 2000 },\n };\n\n const similarResponse = await fetch('https://api.exa.ai/findSimilar', {\n method: 'POST',\n headers: {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(similarBody),\n });\n\n if (similarResponse.ok) {\n const similarData = await similarResponse.json() as { results: typeof similarResults };\n similarResults = similarData.results ?? [];\n }\n } catch {\n // Non-critical, continue without similar results\n }\n }\n\n // Step 3: Compile research summary\n const allSources = [...searchData.results, ...similarResults];\n const seenUrls = new Set<string>();\n const uniqueSources = allSources.filter(s => {\n if (seenUrls.has(s.url)) return false;\n seenUrls.add(s.url);\n return true;\n });\n\n const sections: string[] = [];\n sections.push(`# Research: ${topic}\\n`);\n sections.push(`Found ${uniqueSources.length} sources.\\n`);\n\n sections.push('## Key Sources\\n');\n for (let i = 0; i < uniqueSources.length; i++) {\n const source = uniqueSources[i];\n sections.push(`### ${i + 1}. ${source.title ?? 'Untitled'}`);\n sections.push(`URL: ${source.url}`);\n if ('publishedDate' in source && source.publishedDate) {\n sections.push(`Date: ${source.publishedDate}`);\n }\n if ('author' in source && source.author) {\n sections.push(`Author: ${source.author}`);\n }\n if (source.text) {\n sections.push(`\\nContent:\\n${source.text.slice(0, 2000)}`);\n }\n sections.push('');\n }\n\n // Compile source list\n sections.push('## Source URLs\\n');\n uniqueSources.forEach((s, i) => {\n sections.push(`${i + 1}. ${s.url}`);\n });\n\n return sections.join('\\n');\n }\n}\n"],"mappings":"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","names":["fs","path","import_chalk","import_chalk","fs","path","chalk","resolve","fs","path","os","module","OpenAI","fs","path","fs","path","YAML","chalk","dotenv","chalk","resolve"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@samrahimi/smol-js",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.5",
|
|
4
4
|
"description": "A TypeScript agentic framework - CodeAgent and ToolUseAgent with YAML orchestration, built-in tools, and Exa.ai integration",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|