@agentic-eng/agent 0.1.0-alpha.0 → 0.1.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agent.ts"],"names":[],"mappings":";;;AAWO,IAAM,QAAN,MAAY;AAAA,EACR,IAAA;AAAA,EACA,WAAA;AAAA,EAET,YAAY,MAAA,EAAqB;AAC/B,IAAA,IAAI,CAAC,OAAO,IAAA,IAAQ,MAAA,CAAO,KAAK,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACnD,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AACnB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAAA,EAC5B;AACF","file":"index.cjs","sourcesContent":["export interface AgentConfig {\n /** Unique name identifying this agent. */\n name: string;\n\n /** Optional description of what this agent does. */\n description?: string;\n}\n\n/**\n * Core Agent class — the fundamental building block of EASA.\n */\nexport class Agent {\n readonly name: string;\n readonly description?: string;\n\n constructor(config: AgentConfig) {\n if (!config.name || config.name.trim().length === 0) {\n throw new Error('Agent name is required and cannot be empty.');\n }\n\n this.name = config.name;\n this.description = config.description;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/events.ts","../src/agent.ts","../src/memory.ts","../src/tool.ts"],"names":["fs","path"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base error class for all EASA framework errors.\n */\nexport class EasaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'EasaError';\n }\n}\n\n/**\n * Thrown when an LLM provider encounters an error.\n */\nexport class ProviderError extends EasaError {\n constructor(\n message: string,\n public readonly cause?: unknown,\n ) {\n super(message);\n this.name = 'ProviderError';\n }\n}\n\n/**\n * Thrown when the Agent is misconfigured (e.g. missing provider).\n */\nexport class AgentConfigError extends EasaError {\n constructor(message: string) {\n super(message);\n this.name = 'AgentConfigError';\n }\n}\n\n/**\n * Thrown when the agent's reasoning loop exceeds the maximum allowed iterations.\n */\nexport class MaxIterationsError extends EasaError {\n constructor(\n public readonly maxIterations: number,\n public readonly iterationsCompleted: number,\n ) {\n super(\n `Agent reasoning loop exceeded maximum of ${maxIterations} iterations ` +\n `(completed ${iterationsCompleted}). The goal could not be achieved.`,\n );\n this.name = 'MaxIterationsError';\n }\n}\n\n/**\n * Thrown when the LLM response cannot be parsed as a valid reasoning JSON.\n */\nexport class ReasoningParseError extends EasaError {\n constructor(\n message: string,\n public readonly rawContent: string,\n ) {\n super(message);\n this.name = 'ReasoningParseError';\n }\n}\n\n/**\n * Thrown when a tool execution fails.\n */\nexport class ToolExecutionError extends EasaError {\n constructor(\n public readonly toolName: string,\n message: string,\n public readonly cause?: unknown,\n ) {\n super(`Tool \"${toolName}\" failed: ${message}`);\n this.name = 'ToolExecutionError';\n }\n}\n","/**\n * All lifecycle event types emitted by the agent.\n * Follows OTEL-like span conventions: start/end pairs for each phase.\n */\nexport type EventType =\n | 'agent.invoke.start'\n | 'agent.invoke.end'\n | 'agent.invoke_stream.start'\n | 'agent.invoke_stream.end'\n | 'agent.iteration.start'\n | 'agent.iteration.end'\n | 'llm.call.start'\n | 'llm.call.end'\n | 'tool.call.start'\n | 'tool.call.end'\n | 'tool.schema.inject'\n | 'tool.not_found'\n | 'memory.store'\n | 'agent.error';\n\n/**\n * Base event structure emitted at every lifecycle point.\n * Designed to be compatible with OTEL span events.\n */\nexport interface AgentEvent {\n /** The event type. */\n type: EventType;\n\n /** ISO 8601 timestamp when the event occurred. */\n timestamp: string;\n\n /** Name of the agent that emitted this event. */\n agentName: string;\n\n /** Event-specific payload. */\n data: Record<string, unknown>;\n}\n\n/**\n * Interface for receiving agent lifecycle events.\n *\n * Consumers implement this to observe what the agent is doing.\n * The default `ConsoleEventEmitter` logs to stdout.\n * A future OTEL implementation would export spans/events to a collector.\n */\nexport interface AgentEventEmitter {\n /**\n * Called for every lifecycle event during agent execution.\n */\n emit(event: AgentEvent): void;\n}\n\n/**\n * Default event emitter that logs events to the console.\n * Useful for development and debugging.\n *\n * @example\n * ```typescript\n * const agent = new Agent({\n * name: 'my-agent',\n * provider: myProvider,\n * emitter: new ConsoleEventEmitter(),\n * });\n * ```\n */\nexport class ConsoleEventEmitter implements AgentEventEmitter {\n private readonly prefix: string;\n\n constructor(options?: { prefix?: string }) {\n this.prefix = options?.prefix ?? '[EASA]';\n }\n\n emit(event: AgentEvent): void {\n const ts = event.timestamp.split('T')[1] ?? event.timestamp;\n const tag = this.formatType(event.type);\n const detail = this.formatData(event);\n\n console.log(`${this.prefix} ${ts} ${tag} ${detail}`);\n }\n\n private formatType(type: EventType): string {\n const icons: Record<string, string> = {\n 'agent.invoke.start': '▶ INVOKE',\n 'agent.invoke.end': '■ INVOKE',\n 'agent.invoke_stream.start': '▶ STREAM',\n 'agent.invoke_stream.end': '■ STREAM',\n 'agent.iteration.start': '↻ ITER',\n 'agent.iteration.end': '✓ ITER',\n 'llm.call.start': '→ LLM',\n 'llm.call.end': '← LLM',\n 'tool.call.start': '⚙ TOOL',\n 'tool.call.end': '⚙ TOOL✓',\n 'tool.schema.inject': '📋 SCHEMA',\n 'tool.not_found': '⚠ TOOL?',\n 'memory.store': '💾 MEMORY',\n 'agent.error': '✗ ERROR',\n };\n return icons[type] ?? type;\n }\n\n private formatData(event: AgentEvent): string {\n const d = event.data;\n switch (event.type) {\n case 'agent.invoke.start':\n return `agent=\"${event.agentName}\" prompt=\"${this.truncate(d['prompt'] as string)}\"`;\n case 'agent.invoke.end':\n return `agent=\"${event.agentName}\" iterations=${d['totalIterations']} completed=${d['completed']}`;\n case 'agent.invoke_stream.start':\n return `agent=\"${event.agentName}\" prompt=\"${this.truncate(d['prompt'] as string)}\"`;\n case 'agent.invoke_stream.end':\n return `agent=\"${event.agentName}\" length=${d['contentLength']}`;\n case 'agent.iteration.start':\n return `iteration=${d['iteration']}/${d['maxIterations']}`;\n case 'agent.iteration.end':\n return `iteration=${d['iteration']} action=\"${d['action']}\"`;\n case 'llm.call.start':\n return `messages=${d['messageCount']}`;\n case 'llm.call.end':\n return `tokens=${d['totalTokens'] ?? 'n/a'}`;\n case 'tool.call.start':\n return `tool=\"${d['toolName']}\"`;\n case 'tool.call.end':\n return `tool=\"${d['toolName']}\" success=${d['success']}`;\n case 'tool.schema.inject':\n return `tool=\"${d['toolName']}\"`;\n case 'tool.not_found':\n return `tool=\"${d['toolName']}\" available=${d['availableTools']}`;\n case 'memory.store':\n return `label=\"${d['label']}\"`;\n case 'agent.error':\n return `error=\"${d['message']}\"`;\n default:\n return JSON.stringify(d);\n }\n }\n\n private truncate(str: string | undefined, max = 80): string {\n if (!str) return '';\n return str.length > max ? str.substring(0, max) + '…' : str;\n }\n}\n\n/**\n * A no-op emitter that discards all events. Used internally when no emitter is configured.\n */\nexport class NoopEventEmitter implements AgentEventEmitter {\n emit(_event: AgentEvent): void {\n // intentionally empty\n }\n}\n","import {\n AgentConfigError,\n MaxIterationsError,\n ProviderError,\n ReasoningParseError,\n} from './errors';\nimport type { AgentEvent, AgentEventEmitter } from './events';\nimport { NoopEventEmitter } from './events';\nimport type { MemoryProvider } from './memory';\nimport type { LLMProvider } from './provider';\nimport type { Tool, ToolRegistry } from './tool';\nimport type {\n ChatChunk,\n ChatOptions,\n ChatResponse,\n InvokeOptions,\n IterationResult,\n LLMReasoningResponse,\n Message,\n ReasoningTrace,\n ToolCallRequest,\n ToolResult,\n} from './types';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_ITERATIONS = 5;\n\n/**\n * Builds the reasoning system prompt, including the compact tool index\n * if tools are available.\n */\nfunction buildReasoningSystemPrompt(toolIndex: string): string {\n const toolSection = toolIndex\n ? `\n\nYou have access to the following tools:\n${toolIndex}\n\nWhen you need to use a tool, set action to \"tool_call\" and provide the tool_call field.\nWhen you set action to \"tool_call\", the system will inject the tool's full input schema\nso you can construct the input accurately in the next step.`\n : '';\n\n const toolCallFormat = toolIndex\n ? `,\n \"tool_call\": null | { \"name\": \"<tool_name>\", \"input\": { ... } }`\n : '';\n\n const toolRules = toolIndex\n ? `\n- If you need to use a tool, set action to \"tool_call\" and specify the tool name and input in tool_call.\n- After a tool executes, you will receive its result and can continue reasoning.`\n : '';\n\n return `You are an AI agent. You MUST respond with valid JSON in the following format and nothing else:\n\n{\n \"action\": \"done\" | \"continue\"${toolIndex ? ' | \"tool_call\"' : ''},\n \"reasoning\": \"<your internal chain-of-thought for this step>\",\n \"content\": \"<the output for the user (final answer when done, intermediate when continue)>\"${toolCallFormat},\n \"memory\": null | { \"label\": \"<short title>\", \"content\": \"<knowledge to remember>\", \"tags\": [\"optional\", \"tags\"] }\n}${toolSection}\n\nRules:\n- If you can answer directly, set action to \"done\" and provide the final answer in content.\n- If you need more thinking, research, or steps, set action to \"continue\" and explain in reasoning what you still need.${toolRules}\n- Only set memory when you discover knowledge worth persisting for future conversations.\n- Always respond with valid JSON. No markdown, no code fences, no extra text.`;\n}\n\n// ---------------------------------------------------------------------------\n// Config & Result types\n// ---------------------------------------------------------------------------\n\nexport interface AgentConfig {\n /** Unique name identifying this agent. */\n name: string;\n\n /** Optional description of what this agent does. */\n description?: string;\n\n /** The LLM provider this agent uses for reasoning. */\n provider: LLMProvider;\n\n /** System prompt that defines the agent's behavior and personality. */\n systemPrompt?: string;\n\n /** Default chat options applied to every LLM call (can be overridden per-invoke). */\n defaultOptions?: ChatOptions;\n\n /** Maximum number of reasoning iterations (default: 5). */\n maxIterations?: number;\n\n /** Optional memory provider for persisting knowledge across invocations. */\n memory?: MemoryProvider;\n\n /** Optional tool registry containing tools the agent can use. */\n tools?: ToolRegistry;\n\n /** Optional event emitter for observability (console logging, OTEL, etc.). */\n emitter?: AgentEventEmitter;\n}\n\n/**\n * The result returned by `agent.invoke()`.\n */\nexport interface InvokeResult {\n /** The final response content from the agent. */\n content: string;\n\n /** Full reasoning trace (all iterations). */\n trace: ReasoningTrace;\n}\n\n/**\n * Core Agent class — the fundamental building block of EASA.\n *\n * An Agent wraps an LLM provider with a reasoning loop that can iterate\n * toward a goal. Simple prompts resolve in one step; complex tasks may\n * take multiple iterations with the LLM deciding when it's done.\n *\n * Tools are supported via the hybrid approach:\n * - **Every call**: compact tool index (name + description only) is sent\n * - **On tool_call**: full schema for the requested tool is injected so the\n * LLM can construct accurate inputs\n * - **After execution**: tool result is fed back as context for the next iteration\n *\n * @example\n * ```typescript\n * const tools = new ToolRegistry();\n * tools.register(calculatorTool, webSearchTool);\n *\n * const agent = new Agent({\n * name: 'assistant',\n * provider: myLLMProvider,\n * systemPrompt: 'You are a helpful assistant.',\n * tools,\n * });\n *\n * const result = await agent.invoke('What is 42 * 17?');\n * console.log(result.content);\n * ```\n */\nexport class Agent {\n readonly name: string;\n readonly description?: string;\n\n private readonly provider: LLMProvider;\n private readonly systemPrompt?: string;\n private readonly defaultOptions?: ChatOptions;\n private readonly maxIterations: number;\n private readonly memory?: MemoryProvider;\n private readonly tools?: ToolRegistry;\n private readonly emitter: AgentEventEmitter;\n private messages: Message[] = [];\n\n constructor(config: AgentConfig) {\n if (!config.name || config.name.trim().length === 0) {\n throw new AgentConfigError('Agent name is required and cannot be empty.');\n }\n\n if (!config.provider) {\n throw new AgentConfigError('Agent requires an LLM provider.');\n }\n\n this.name = config.name;\n this.description = config.description;\n this.provider = config.provider;\n this.systemPrompt = config.systemPrompt;\n this.defaultOptions = config.defaultOptions;\n this.maxIterations = config.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n this.memory = config.memory;\n this.tools = config.tools;\n this.emitter = config.emitter ?? new NoopEventEmitter();\n }\n\n /**\n * Send a prompt to the agent and run the reasoning loop until the agent\n * produces a final answer or exhausts max iterations.\n *\n * The loop handles three actions:\n * - `done` → return final answer\n * - `continue` → feed intermediate output back, next iteration\n * - `tool_call` → inject full tool schema, LLM constructs input, execute tool, feed result back\n */\n async invoke(prompt: string, options?: InvokeOptions): Promise<InvokeResult> {\n this.emit('agent.invoke.start', { prompt });\n this.messages.push({ role: 'user', content: prompt });\n\n const maxIter = options?.maxIterations ?? this.maxIterations;\n const iterations: IterationResult[] = [];\n let pendingToolSchema: string | undefined;\n\n for (let i = 1; i <= maxIter; i++) {\n this.emit('agent.iteration.start', { iteration: i, maxIterations: maxIter });\n\n const messagesToSend = this.buildMessages(pendingToolSchema);\n const mergedOptions = this.mergeOptions(options);\n pendingToolSchema = undefined;\n\n this.emit('llm.call.start', { messageCount: messagesToSend.length });\n\n let rawResponse: ChatResponse;\n try {\n rawResponse = await this.provider.chat(messagesToSend, mergedOptions);\n } catch (error) {\n this.emit('agent.error', { message: 'LLM provider chat call failed.', error: String(error) });\n throw new ProviderError('LLM provider chat call failed.', error);\n }\n\n this.emit('llm.call.end', { totalTokens: rawResponse.usage?.totalTokens });\n\n const parsed = this.parseReasoningResponse(rawResponse.message.content);\n\n const iterationResult: IterationResult = {\n iteration: i,\n response: parsed,\n rawResponse,\n };\n iterations.push(iterationResult);\n\n // Persist memory if the LLM requested it\n if (parsed.memory && this.memory) {\n this.emit('memory.store', { label: parsed.memory.label });\n await this.memory.store(this.name, parsed.memory);\n }\n\n this.emit('agent.iteration.end', { iteration: i, action: parsed.action });\n\n if (parsed.action === 'done') {\n // Final answer — store assistant message and return\n this.messages.push({ role: 'assistant', content: parsed.content });\n\n this.emit('agent.invoke.end', { totalIterations: i, completed: true });\n return {\n content: parsed.content,\n trace: { iterations, completed: true, totalIterations: i },\n };\n }\n\n if (parsed.action === 'tool_call' && parsed.tool_call) {\n const toolCall = parsed.tool_call;\n\n // Check if tool exists\n if (!this.tools || !this.tools.has(toolCall.name)) {\n this.emit('tool.not_found', {\n toolName: toolCall.name,\n availableTools: this.tools?.getCompactIndex() ?? 'none',\n });\n this.messages.push({ role: 'assistant', content: rawResponse.message.content });\n this.messages.push({\n role: 'user',\n content: `Tool \"${toolCall.name}\" is not available. Available tools: ${this.tools?.getCompactIndex() ?? 'none'}. Please choose a different approach.`,\n });\n continue;\n }\n\n // If the LLM provided input, execute the tool directly\n if (toolCall.input && Object.keys(toolCall.input).length > 0) {\n this.emit('tool.call.start', { toolName: toolCall.name, input: toolCall.input });\n const toolResult = await this.executeTool(toolCall);\n this.emit('tool.call.end', { toolName: toolCall.name, success: toolResult.success });\n\n this.messages.push({ role: 'assistant', content: rawResponse.message.content });\n this.messages.push({\n role: 'user',\n content: `Tool \"${toolCall.name}\" result:\\n${JSON.stringify(toolResult, null, 2)}`,\n });\n continue;\n }\n\n // LLM requested a tool but didn't provide input — inject full schema\n this.emit('tool.schema.inject', { toolName: toolCall.name });\n const schema = this.tools.getFullSchema(toolCall.name);\n pendingToolSchema = schema;\n this.messages.push({ role: 'assistant', content: rawResponse.message.content });\n this.messages.push({\n role: 'user',\n content: `Here is the full schema for tool \"${toolCall.name}\":\\n${schema}\\n\\nPlease provide the tool_call with the correct input.`,\n });\n continue;\n }\n\n // Continue — feed the intermediate output back as context for next iteration\n this.messages.push({ role: 'assistant', content: rawResponse.message.content });\n this.messages.push({\n role: 'user',\n content: `Continue. Iteration ${i} of ${maxIter}. Previous reasoning: ${parsed.reasoning}`,\n });\n }\n\n // Exhausted iterations\n const lastIteration = iterations[iterations.length - 1];\n const lastContent = lastIteration?.response.content ?? 'Unable to complete the task.';\n this.messages.push({ role: 'assistant', content: lastContent });\n\n this.emit('agent.invoke.end', { totalIterations: iterations.length, completed: false });\n this.emit('agent.error', { message: `Max iterations (${maxIter}) exceeded.` });\n throw new MaxIterationsError(maxIter, iterations.length);\n }\n\n /**\n * Send a prompt to the agent and receive a streaming response.\n * This is a single-pass stream (no reasoning loop) — useful for\n * conversational responses where iteration is not needed.\n *\n * The assistant's full message is appended to conversation history\n * once the stream completes.\n */\n async *invokeStream(prompt: string, options?: ChatOptions): AsyncIterable<ChatChunk> {\n this.emit('agent.invoke_stream.start', { prompt });\n this.messages.push({ role: 'user', content: prompt });\n\n const messagesToSend = this.buildMessages();\n const mergedOptions = this.mergeOptions(options);\n\n let fullContent = '';\n\n try {\n for await (const chunk of this.provider.chatStream(messagesToSend, mergedOptions)) {\n fullContent += chunk.delta;\n yield chunk;\n }\n } catch (error) {\n this.emit('agent.error', { message: 'LLM provider stream call failed.', error: String(error) });\n throw new ProviderError('LLM provider stream call failed.', error);\n }\n\n this.messages.push({ role: 'assistant', content: fullContent });\n this.emit('agent.invoke_stream.end', { contentLength: fullContent.length });\n }\n\n /**\n * Returns a copy of the current conversation history.\n */\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n /**\n * Clears the conversation history.\n */\n clearHistory(): void {\n this.messages = [];\n }\n\n /**\n * Emits a lifecycle event via the configured emitter.\n */\n private emit(type: AgentEvent['type'], data: Record<string, unknown>): void {\n this.emitter.emit({\n type,\n timestamp: new Date().toISOString(),\n agentName: this.name,\n data,\n });\n }\n\n /**\n * Executes a tool and returns the result. Catches errors gracefully\n * so the agent can recover.\n */\n private async executeTool(toolCall: ToolCallRequest): Promise<ToolResult> {\n const tool = this.tools!.get(toolCall.name) as Tool;\n\n try {\n return await tool.execute(toolCall.input);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n toolName: toolCall.name,\n success: false,\n output: '',\n error: message,\n };\n }\n }\n\n /**\n * Parses the LLM's raw text response into a structured `LLMReasoningResponse`.\n * Attempts to extract JSON from the response, handling common LLM quirks\n * like wrapping in code fences.\n */\n private parseReasoningResponse(raw: string): LLMReasoningResponse {\n const cleaned = raw\n .replace(/^```(?:json)?\\s*/i, '')\n .replace(/\\s*```$/i, '')\n .trim();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(cleaned);\n } catch {\n throw new ReasoningParseError(\n `Failed to parse LLM response as JSON: ${raw.substring(0, 200)}`,\n raw,\n );\n }\n\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('action' in parsed) ||\n !('content' in parsed)\n ) {\n throw new ReasoningParseError(\n 'LLM response JSON is missing required fields (action, content).',\n raw,\n );\n }\n\n const obj = parsed as Record<string, unknown>;\n\n if (\n obj['action'] !== 'done' &&\n obj['action'] !== 'continue' &&\n obj['action'] !== 'tool_call'\n ) {\n throw new ReasoningParseError(\n `Invalid action \"${String(obj['action'])}\". Must be \"done\", \"continue\", or \"tool_call\".`,\n raw,\n );\n }\n\n return {\n action: obj['action'] as 'done' | 'continue' | 'tool_call',\n reasoning: typeof obj['reasoning'] === 'string' ? obj['reasoning'] : '',\n content: typeof obj['content'] === 'string' ? obj['content'] : '',\n tool_call: this.parseToolCall(obj['tool_call']),\n memory: this.parseMemoryEntry(obj['memory']),\n };\n }\n\n /**\n * Parses a tool_call field from the LLM response.\n */\n private parseToolCall(raw: unknown): ToolCallRequest | undefined {\n if (!raw || typeof raw !== 'object') return undefined;\n\n const obj = raw as Record<string, unknown>;\n if (typeof obj['name'] !== 'string') return undefined;\n\n return {\n name: obj['name'],\n input:\n typeof obj['input'] === 'object' && obj['input'] !== null\n ? (obj['input'] as Record<string, unknown>)\n : {},\n };\n }\n\n /**\n * Parses an optional memory entry from the LLM response.\n */\n private parseMemoryEntry(raw: unknown): LLMReasoningResponse['memory'] {\n if (!raw || typeof raw !== 'object') return undefined;\n\n const obj = raw as Record<string, unknown>;\n if (typeof obj['label'] !== 'string' || typeof obj['content'] !== 'string') {\n return undefined;\n }\n\n return {\n label: obj['label'],\n content: obj['content'],\n tags: Array.isArray(obj['tags'])\n ? obj['tags'].filter((t): t is string => typeof t === 'string')\n : undefined,\n };\n }\n\n /**\n * Builds the full message array to send to the provider.\n * Includes: reasoning system prompt (with compact tool index) → custom system prompt → conversation.\n * Optionally appends the full schema for a pending tool call.\n */\n private buildMessages(pendingToolSchema?: string): Message[] {\n const messages: Message[] = [];\n\n // Reasoning framework prompt (includes compact tool index if tools are registered)\n const toolIndex = this.tools?.getCompactIndex() ?? '';\n messages.push({ role: 'system', content: buildReasoningSystemPrompt(toolIndex) });\n\n // Then the user's custom system prompt\n if (this.systemPrompt) {\n messages.push({ role: 'system', content: this.systemPrompt });\n }\n\n messages.push(...this.messages);\n\n // If a tool was requested but needs full schema, append it\n if (pendingToolSchema) {\n messages.push({\n role: 'system',\n content: `Full tool schema for your tool_call:\\n${pendingToolSchema}`,\n });\n }\n\n return messages;\n }\n\n /**\n * Merges per-call options with default options. Per-call options take precedence.\n */\n private mergeOptions(options?: ChatOptions): ChatOptions | undefined {\n if (!this.defaultOptions && !options) return undefined;\n return { ...this.defaultOptions, ...options };\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { MemoryEntry } from './types';\n\n/**\n * Interface for persisting agent knowledge across invocations.\n *\n * Consumers can implement custom backends (database, vector store, etc.)\n * or use the built-in `FlatFileMemoryProvider` for file-based storage.\n */\nexport interface MemoryProvider {\n /**\n * Store a piece of knowledge.\n */\n store(agentName: string, entry: MemoryEntry): Promise<void>;\n\n /**\n * Retrieve all stored knowledge for a given agent.\n */\n retrieve(agentName: string): Promise<MemoryEntry[]>;\n}\n\n/**\n * Flat-file memory provider that persists agent knowledge as KNL DATA blocks.\n *\n * Each agent gets its own `.knl` file in the configured directory.\n * Knowledge entries are stored as KNL DATA blocks with items.\n *\n * @example\n * ```typescript\n * const memory = new FlatFileMemoryProvider('/path/to/memory');\n * const agent = new Agent({\n * name: 'my-agent',\n * provider: myProvider,\n * memory,\n * });\n * ```\n */\nexport class FlatFileMemoryProvider implements MemoryProvider {\n constructor(private readonly directory: string) {}\n\n async store(agentName: string, entry: MemoryEntry): Promise<void> {\n await fs.promises.mkdir(this.directory, { recursive: true });\n\n const filePath = this.getFilePath(agentName);\n const knlBlock = this.toKnlBlock(agentName, entry);\n\n await fs.promises.appendFile(filePath, knlBlock + '\\n', 'utf-8');\n }\n\n async retrieve(agentName: string): Promise<MemoryEntry[]> {\n const filePath = this.getFilePath(agentName);\n\n let content: string;\n try {\n content = await fs.promises.readFile(filePath, 'utf-8');\n } catch {\n return [];\n }\n\n return this.parseKnlBlocks(content);\n }\n\n private getFilePath(agentName: string): string {\n const safeName = agentName.replace(/[^a-zA-Z0-9_-]/g, '_');\n return path.join(this.directory, `${safeName}.memory.knl`);\n }\n\n /**\n * Converts a MemoryEntry into a KNL DATA block.\n *\n * Format:\n * ```\n * <<<\n * KNL[DATA][1.0]:::\n * ID[knl:data:easa.memory:{agentName}:{timestamp}:v1.0]:::\n * NS[easa.memory]:::\n * LABEL[\"{label}\"]:::\n * TAGS[{tags}]:::\n * ITEM[\"{content}\"] [DESC:\"{label}\"]\n * >>>\n * ```\n */\n private toKnlBlock(agentName: string, entry: MemoryEntry): string {\n const timestamp = Date.now();\n const safeName = agentName.replace(/[^a-zA-Z0-9_-]/g, '_');\n const escapedLabel = this.escapeKnl(entry.label);\n const escapedContent = this.escapeKnl(entry.content);\n const tags = entry.tags?.join(',') ?? '';\n\n const lines = [\n '<<<',\n 'KNL[DATA][1.0]:::',\n `ID[knl:data:easa.memory:${safeName}:${timestamp}:v1.0]:::`,\n 'NS[easa.memory]:::',\n `LABEL[\"${escapedLabel}\"]:::`,\n ];\n\n if (tags) {\n lines.push(`TAGS[${tags}]:::`);\n }\n\n lines.push(`ITEM[\"${escapedContent}\"] [DESC:\"${escapedLabel}\"]`);\n lines.push('>>>');\n\n return lines.join('\\n');\n }\n\n /**\n * Parses KNL DATA blocks back into MemoryEntry objects.\n */\n private parseKnlBlocks(content: string): MemoryEntry[] {\n const entries: MemoryEntry[] = [];\n const blockPattern = /<<<([\\s\\S]*?)>>>/g;\n let match: RegExpExecArray | null;\n\n while ((match = blockPattern.exec(content)) !== null) {\n const block = match[1] ?? '';\n\n const labelMatch = /LABEL\\[\"([^\"]*)\"\\]/.exec(block);\n const itemMatch = /ITEM\\[\"([^\"]*)\"\\]/.exec(block);\n const tagsMatch = /TAGS\\[([^\\]]*)\\]/.exec(block);\n\n if (labelMatch?.[1] && itemMatch?.[1]) {\n const entry: MemoryEntry = {\n label: this.unescapeKnl(labelMatch[1]),\n content: this.unescapeKnl(itemMatch[1]),\n };\n\n if (tagsMatch?.[1]) {\n entry.tags = tagsMatch[1].split(',').map((t) => t.trim()).filter(Boolean);\n }\n\n entries.push(entry);\n }\n }\n\n return entries;\n }\n\n private escapeKnl(str: string): string {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n }\n\n private unescapeKnl(str: string): string {\n return str.replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\');\n }\n}\n","import type { ToolDefinition, ToolResult } from './types';\n\n/**\n * Interface that all tools must implement — both custom user tools\n * and MCP-sourced tools are normalized to this shape.\n *\n * @example\n * ```typescript\n * const calculator: Tool = {\n * definition: {\n * name: 'calculator',\n * description: 'Performs basic arithmetic operations.',\n * inputSchema: {\n * type: 'object',\n * properties: {\n * expression: { type: 'string', description: 'Math expression to evaluate' },\n * },\n * required: ['expression'],\n * },\n * },\n * async execute(input) {\n * const result = eval(input.expression as string);\n * return { toolName: 'calculator', success: true, output: String(result) };\n * },\n * };\n * ```\n */\nexport interface Tool {\n /** The tool's metadata: name, description, and input schema. */\n definition: ToolDefinition;\n\n /**\n * Execute the tool with the given input.\n * Must return a ToolResult with success/failure and output.\n */\n execute(input: Record<string, unknown>): Promise<ToolResult>;\n}\n\n/**\n * Manages a collection of tools available to the agent.\n * Supports both custom tools and MCP-sourced tools in a single registry.\n */\nexport class ToolRegistry {\n private readonly tools: Map<string, Tool> = new Map();\n\n /**\n * Register one or more tools.\n */\n register(...tools: Tool[]): void {\n for (const tool of tools) {\n this.tools.set(tool.definition.name, tool);\n }\n }\n\n /**\n * Get a tool by name. Returns undefined if not found.\n */\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Returns all registered tool definitions.\n */\n getDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n /**\n * Returns a compact index of tools: just names and descriptions.\n * This is what gets sent to the LLM on every call (token-efficient).\n */\n getCompactIndex(): string {\n if (this.tools.size === 0) return '';\n\n const lines = Array.from(this.tools.values()).map(\n (t) => `- ${t.definition.name}: ${t.definition.description}`,\n );\n return lines.join('\\n');\n }\n\n /**\n * Returns the full schema for a specific tool (name, description, inputSchema).\n * Used when the LLM requests a tool call — injected into the next iteration\n * so the LLM can construct the input accurately.\n */\n getFullSchema(name: string): string | undefined {\n const tool = this.tools.get(name);\n if (!tool) return undefined;\n\n return JSON.stringify(\n {\n name: tool.definition.name,\n description: tool.definition.description,\n inputSchema: tool.definition.inputSchema,\n },\n null,\n 2,\n );\n }\n\n /**\n * Returns the number of registered tools.\n */\n get size(): number {\n return this.tools.size;\n }\n\n /**\n * Check if a tool with the given name is registered.\n */\n has(name: string): boolean {\n return this.tools.has(name);\n }\n}\n"]}